Coverage Report

Created: 2023-06-07 06:14

/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
    #ifndef _MSC_VER
111
        #warning The SHOW_SECRETS and WOLFSSL_SSLKEYLOGFILE options should only be used for debugging and never in a production environment
112
    #else
113
        #pragma message("Warning: The SHOW_SECRETS and WOLFSSL_SSLKEYLOGFILE options should only be used for debugging and never in a production environment")
114
    #endif
115
#endif
116
117
/* Optional Pre-Master-Secret logging for Wireshark */
118
#if !defined(NO_FILESYSTEM) && defined(WOLFSSL_SSLKEYLOGFILE)
119
#ifndef WOLFSSL_SSLKEYLOGFILE_OUTPUT
120
    #define WOLFSSL_SSLKEYLOGFILE_OUTPUT "sslkeylog.log"
121
#endif
122
#endif
123
124
#ifndef WOLFSSL_NO_TLS12
125
126
#ifdef WOLFSSL_SHA384
127
0
    #define HSHASH_SZ WC_SHA384_DIGEST_SIZE
128
#else
129
    #define HSHASH_SZ FINISHED_SZ
130
#endif
131
132
int BuildTlsHandshakeHash(WOLFSSL* ssl, byte* hash, word32* hashLen)
133
0
{
134
0
    int ret = 0;
135
0
    word32 hashSz = FINISHED_SZ;
136
137
0
    if (ssl == NULL || hash == NULL || hashLen == NULL || *hashLen < HSHASH_SZ)
138
0
        return BAD_FUNC_ARG;
139
140
    /* for constant timing perform these even if error */
141
0
#ifndef NO_OLD_TLS
142
0
    ret |= wc_Md5GetHash(&ssl->hsHashes->hashMd5, hash);
143
0
    ret |= wc_ShaGetHash(&ssl->hsHashes->hashSha, &hash[WC_MD5_DIGEST_SIZE]);
144
0
#endif
145
146
0
    if (IsAtLeastTLSv1_2(ssl)) {
147
0
#ifndef NO_SHA256
148
0
        if (ssl->specs.mac_algorithm <= sha256_mac ||
149
0
            ssl->specs.mac_algorithm == blake2b_mac) {
150
0
            ret |= wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
151
0
            hashSz = WC_SHA256_DIGEST_SIZE;
152
0
        }
153
0
#endif
154
0
#ifdef WOLFSSL_SHA384
155
0
        if (ssl->specs.mac_algorithm == sha384_mac) {
156
0
            ret |= wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
157
0
            hashSz = WC_SHA384_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
0
{
263
0
    ProtocolVersion pv;
264
0
    pv.major = SSLv3_MAJOR;
265
0
    pv.minor = TLSv1_1_MINOR;
266
267
0
    return pv;
268
0
}
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
#ifdef WOLFSSL_SMALL_STACK
379
    byte* key_dig;
380
#else
381
0
    byte  key_dig[MAX_PRF_DIG];
382
0
#endif
383
384
#ifdef WOLFSSL_SMALL_STACK
385
    key_dig = (byte*)XMALLOC(MAX_PRF_DIG, ssl->heap, DYNAMIC_TYPE_DIGEST);
386
    if (key_dig == NULL) {
387
        return MEMORY_E;
388
    }
389
#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
#ifdef WOLFSSL_SMALL_STACK
407
    XFREE(key_dig, ssl->heap, DYNAMIC_TYPE_DIGEST);
408
#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
0
#ifdef HAVE_EXTENDED_MASTER
521
0
    if (ssl->options.haveEMS) {
522
0
        word32 hashSz = HSHASH_SZ;
523
    #ifdef WOLFSSL_SMALL_STACK
524
        byte* handshake_hash = (byte*)XMALLOC(HSHASH_SZ, ssl->heap,
525
                                              DYNAMIC_TYPE_DIGEST);
526
        if (handshake_hash == NULL)
527
            return MEMORY_E;
528
    #else
529
0
        byte handshake_hash[HSHASH_SZ];
530
0
    #endif
531
532
0
        ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
533
0
        if (ret == 0) {
534
0
            ret = _MakeTlsExtendedMasterSecret(
535
0
                ssl->arrays->masterSecret, SECRET_LEN,
536
0
                ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
537
0
                handshake_hash, hashSz,
538
0
                IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
539
0
                ssl->heap, ssl->devId);
540
0
            ForceZero(handshake_hash, hashSz);
541
0
        }
542
543
    #ifdef WOLFSSL_SMALL_STACK
544
        XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_DIGEST);
545
    #elif defined(WOLFSSL_CHECK_MEM_ZERO)
546
        wc_MemZero_Check(handshake_hash, HSHASH_SZ);
547
    #endif
548
0
    }
549
0
    else
550
0
#endif /* HAVE_EXTENDED_MASTER */
551
0
    {
552
553
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
554
        ret = PROTOCOLCB_UNAVAILABLE;
555
        if (ssl->ctx->GenMasterCb) {
556
            void* ctx = wolfSSL_GetGenMasterSecretCtx(ssl);
557
            ret = ssl->ctx->GenMasterCb(ssl, ctx);
558
        }
559
        if (!ssl->ctx->GenMasterCb || ret == PROTOCOLCB_UNAVAILABLE)
560
#endif
561
0
        {
562
0
            ret = _MakeTlsMasterSecret(ssl->arrays->masterSecret,
563
0
                      SECRET_LEN, ssl->arrays->preMasterSecret,
564
0
                      ssl->arrays->preMasterSz, ssl->arrays->clientRandom,
565
0
                      ssl->arrays->serverRandom, IsAtLeastTLSv1_2(ssl),
566
0
                      ssl->specs.mac_algorithm, ssl->heap, ssl->devId);
567
0
        }
568
0
    }
569
0
    if (ret == 0) {
570
    #ifdef SHOW_SECRETS
571
        /* Wireshark Pre-Master-Secret Format:
572
         *  CLIENT_RANDOM <clientrandom> <mastersecret>
573
         */
574
        const char* CLIENT_RANDOM_LABEL = "CLIENT_RANDOM";
575
        int i, pmsPos = 0;
576
        char pmsBuf[13 + 1 + 64 + 1 + 96 + 1 + 1];
577
578
        XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "%s ",
579
            CLIENT_RANDOM_LABEL);
580
        pmsPos += XSTRLEN(CLIENT_RANDOM_LABEL) + 1;
581
        for (i = 0; i < RAN_LEN; i++) {
582
            XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "%02x",
583
                ssl->arrays->clientRandom[i]);
584
            pmsPos += 2;
585
        }
586
        XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, " ");
587
        pmsPos += 1;
588
        for (i = 0; i < SECRET_LEN; i++) {
589
            XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "%02x",
590
                ssl->arrays->masterSecret[i]);
591
            pmsPos += 2;
592
        }
593
        XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "\n");
594
        pmsPos += 1;
595
596
        /* print master secret */
597
        puts(pmsBuf);
598
599
        #if !defined(NO_FILESYSTEM) && defined(WOLFSSL_SSLKEYLOGFILE)
600
        {
601
            FILE* f = XFOPEN(WOLFSSL_SSLKEYLOGFILE_OUTPUT, "a");
602
            if (f != XBADFILE) {
603
                XFWRITE(pmsBuf, 1, pmsPos, f);
604
                XFCLOSE(f);
605
            }
606
        }
607
        #endif
608
    #endif /* SHOW_SECRETS */
609
610
0
        ret = DeriveTlsKeys(ssl);
611
0
    }
612
613
0
    return ret;
614
0
}
615
616
617
/* Used by EAP-TLS and EAP-TTLS to derive keying material from
618
 * the master_secret. */
619
int wolfSSL_make_eap_keys(WOLFSSL* ssl, void* msk, unsigned int len,
620
                                                              const char* label)
621
0
{
622
0
    int   ret;
623
#ifdef WOLFSSL_SMALL_STACK
624
    byte* seed;
625
#else
626
0
    byte  seed[SEED_LEN];
627
0
#endif
628
629
#ifdef WOLFSSL_SMALL_STACK
630
    seed = (byte*)XMALLOC(SEED_LEN, ssl->heap, DYNAMIC_TYPE_SEED);
631
    if (seed == NULL)
632
        return MEMORY_E;
633
#endif
634
635
    /*
636
     * As per RFC-5281, the order of the client and server randoms is reversed
637
     * from that used by the TLS protocol to derive keys.
638
     */
639
0
    XMEMCPY(seed,           ssl->arrays->clientRandom, RAN_LEN);
640
0
    XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
641
642
0
#ifdef WOLFSSL_HAVE_PRF
643
0
    PRIVATE_KEY_UNLOCK();
644
0
    ret = wc_PRF_TLS((byte*)msk, len, ssl->arrays->masterSecret, SECRET_LEN,
645
0
              (const byte *)label, (word32)XSTRLEN(label), seed, SEED_LEN,
646
0
              IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
647
0
              ssl->heap, ssl->devId);
648
0
    PRIVATE_KEY_LOCK();
649
#else
650
    /* Pseudo random function must be enabled in the configuration. */
651
    ret = PRF_MISSING;
652
    WOLFSSL_MSG("Pseudo-random function is not enabled");
653
654
    (void)msk;
655
    (void)len;
656
    (void)label;
657
#endif
658
659
#ifdef WOLFSSL_SMALL_STACK
660
    XFREE(seed, ssl->heap, DYNAMIC_TYPE_SEED);
661
#endif
662
663
0
    return ret;
664
0
}
665
666
int wolfSSL_GetHmacType_ex(CipherSpecs* specs)
667
0
{
668
0
    if (specs == NULL)
669
0
        return BAD_FUNC_ARG;
670
671
0
    switch (specs->mac_algorithm) {
672
0
        #ifndef NO_MD5
673
0
        case md5_mac:
674
0
        {
675
0
            return WC_MD5;
676
0
        }
677
0
        #endif
678
0
        #ifndef NO_SHA256
679
0
        case sha256_mac:
680
0
        {
681
0
            return WC_SHA256;
682
0
        }
683
0
        #endif
684
0
        #ifdef WOLFSSL_SHA384
685
0
        case sha384_mac:
686
0
        {
687
0
            return WC_SHA384;
688
0
        }
689
690
0
        #endif
691
0
        #ifndef NO_SHA
692
0
        case sha_mac:
693
0
        {
694
0
            return WC_SHA;
695
0
        }
696
0
        #endif
697
        #ifdef HAVE_BLAKE2
698
        case blake2b_mac:
699
        {
700
            return BLAKE2B_ID;
701
        }
702
        #endif
703
0
        default:
704
0
        {
705
0
            return WOLFSSL_FATAL_ERROR;
706
0
        }
707
0
    }
708
0
}
709
710
/* return HMAC digest type in wolfSSL format */
711
int wolfSSL_GetHmacType(WOLFSSL* ssl)
712
0
{
713
0
    if (ssl == NULL)
714
0
        return BAD_FUNC_ARG;
715
716
0
    return wolfSSL_GetHmacType_ex(&ssl->specs);
717
0
}
718
719
720
int wolfSSL_SetTlsHmacInner(WOLFSSL* ssl, byte* inner, word32 sz, int content,
721
                           int verify)
722
0
{
723
0
    if (ssl == NULL || inner == NULL)
724
0
        return BAD_FUNC_ARG;
725
726
0
    XMEMSET(inner, 0, WOLFSSL_TLS_HMAC_INNER_SZ);
727
728
0
    WriteSEQ(ssl, verify, inner);
729
0
    inner[SEQ_SZ] = (byte)content;
730
0
    inner[SEQ_SZ + ENUM_LEN]            = ssl->version.major;
731
0
    inner[SEQ_SZ + ENUM_LEN + ENUM_LEN] = ssl->version.minor;
732
0
    c16toa((word16)sz, inner + SEQ_SZ + ENUM_LEN + VERSION_SZ);
733
734
0
    return 0;
735
0
}
736
737
738
#ifndef WOLFSSL_AEAD_ONLY
739
#if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
740
    !defined(HAVE_SELFTEST)
741
742
/* Update the hash in the HMAC.
743
 *
744
 * hmac  HMAC object.
745
 * data  Data to be hashed.
746
 * sz    Size of data to hash.
747
 * returns 0 on success, otherwise failure.
748
 */
749
static int Hmac_HashUpdate(Hmac* hmac, const byte* data, word32 sz)
750
0
{
751
0
    int ret = BAD_FUNC_ARG;
752
753
0
    switch (hmac->macType) {
754
0
    #ifndef NO_SHA
755
0
        case WC_SHA:
756
0
            ret = wc_ShaUpdate(&hmac->hash.sha, data, sz);
757
0
            break;
758
0
    #endif /* !NO_SHA */
759
760
0
    #ifndef NO_SHA256
761
0
        case WC_SHA256:
762
0
            ret = wc_Sha256Update(&hmac->hash.sha256, data, sz);
763
0
            break;
764
0
    #endif /* !NO_SHA256 */
765
766
0
    #ifdef WOLFSSL_SHA384
767
0
        case WC_SHA384:
768
0
            ret = wc_Sha384Update(&hmac->hash.sha384, data, sz);
769
0
            break;
770
0
    #endif /* WOLFSSL_SHA384 */
771
772
0
    #ifdef WOLFSSL_SHA512
773
0
        case WC_SHA512:
774
0
            ret = wc_Sha512Update(&hmac->hash.sha512, data, sz);
775
0
            break;
776
0
    #endif /* WOLFSSL_SHA512 */
777
778
0
        default:
779
0
            break;
780
0
    }
781
782
0
    return ret;
783
0
}
784
785
/* Finalize the hash but don't put the EOC, padding or length in.
786
 *
787
 * hmac  HMAC object.
788
 * hash  Hash result.
789
 * returns 0 on success, otherwise failure.
790
 */
791
static int Hmac_HashFinalRaw(Hmac* hmac, unsigned char* hash)
792
0
{
793
0
    int ret = BAD_FUNC_ARG;
794
795
0
    switch (hmac->macType) {
796
0
    #ifndef NO_SHA
797
0
        case WC_SHA:
798
0
            ret = wc_ShaFinalRaw(&hmac->hash.sha, hash);
799
0
            break;
800
0
    #endif /* !NO_SHA */
801
802
0
    #ifndef NO_SHA256
803
0
        case WC_SHA256:
804
0
            ret = wc_Sha256FinalRaw(&hmac->hash.sha256, hash);
805
0
            break;
806
0
    #endif /* !NO_SHA256 */
807
808
0
    #ifdef WOLFSSL_SHA384
809
0
        case WC_SHA384:
810
0
            ret = wc_Sha384FinalRaw(&hmac->hash.sha384, hash);
811
0
            break;
812
0
    #endif /* WOLFSSL_SHA384 */
813
814
0
    #ifdef WOLFSSL_SHA512
815
0
        case WC_SHA512:
816
0
            ret = wc_Sha512FinalRaw(&hmac->hash.sha512, hash);
817
0
            break;
818
0
    #endif /* WOLFSSL_SHA512 */
819
820
0
        default:
821
0
            break;
822
0
    }
823
824
0
    return ret;
825
0
}
826
827
/* Finalize the HMAC by performing outer hash.
828
 *
829
 * hmac  HMAC object.
830
 * mac   MAC result.
831
 * returns 0 on success, otherwise failure.
832
 */
833
static int Hmac_OuterHash(Hmac* hmac, unsigned char* mac)
834
0
{
835
0
    int ret = BAD_FUNC_ARG;
836
0
    wc_HashAlg hash;
837
0
    enum wc_HashType hashType = (enum wc_HashType)hmac->macType;
838
0
    int digestSz = wc_HashGetDigestSize(hashType);
839
0
    int blockSz = wc_HashGetBlockSize(hashType);
840
841
0
    if ((digestSz >= 0) && (blockSz >= 0)) {
842
0
        ret = wc_HashInit(&hash, hashType);
843
0
    }
844
0
    if (ret == 0) {
845
0
        ret = wc_HashUpdate(&hash, hashType, (byte*)hmac->opad,
846
0
            blockSz);
847
0
        if (ret == 0)
848
0
            ret = wc_HashUpdate(&hash, hashType, (byte*)hmac->innerHash,
849
0
                digestSz);
850
0
        if (ret == 0)
851
0
            ret = wc_HashFinal(&hash, hashType, mac);
852
0
        wc_HashFree(&hash, hashType);
853
0
    }
854
855
0
    return ret;
856
0
}
857
858
/* Calculate the HMAC of the header + message data.
859
 * Constant time implementation using wc_Sha*FinalRaw().
860
 *
861
 * hmac    HMAC object.
862
 * digest  MAC result.
863
 * in      Message data.
864
 * sz      Size of the message data.
865
 * header  Constructed record header with length of handshake data.
866
 * returns 0 on success, otherwise failure.
867
 */
868
static int Hmac_UpdateFinal_CT(Hmac* hmac, byte* digest, const byte* in,
869
                               word32 sz, int macLen, byte* header)
870
0
{
871
0
    byte         lenBytes[8];
872
0
    int          i, j;
873
0
    unsigned int k;
874
0
    int          blockBits, blockMask;
875
0
    int          lastBlockLen, extraLen, eocIndex;
876
0
    int          blocks, safeBlocks, lenBlock, eocBlock;
877
0
    unsigned int maxLen;
878
0
    int          blockSz, padSz;
879
0
    int          ret;
880
0
    word32       realLen;
881
0
    byte         extraBlock;
882
883
0
    switch (hmac->macType) {
884
0
    #ifndef NO_SHA
885
0
        case WC_SHA:
886
0
            blockSz = WC_SHA_BLOCK_SIZE;
887
0
            blockBits = 6;
888
0
            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
889
0
            break;
890
0
    #endif /* !NO_SHA */
891
892
0
    #ifndef NO_SHA256
893
0
        case WC_SHA256:
894
0
            blockSz = WC_SHA256_BLOCK_SIZE;
895
0
            blockBits = 6;
896
0
            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
897
0
            break;
898
0
    #endif /* !NO_SHA256 */
899
900
0
    #ifdef WOLFSSL_SHA384
901
0
        case WC_SHA384:
902
0
            blockSz = WC_SHA384_BLOCK_SIZE;
903
0
            blockBits = 7;
904
0
            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
905
0
            break;
906
0
    #endif /* WOLFSSL_SHA384 */
907
908
0
    #ifdef WOLFSSL_SHA512
909
0
        case WC_SHA512:
910
0
            blockSz = WC_SHA512_BLOCK_SIZE;
911
0
            blockBits = 7;
912
0
            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
913
0
            break;
914
0
    #endif /* WOLFSSL_SHA512 */
915
916
0
        default:
917
0
            return BAD_FUNC_ARG;
918
0
    }
919
0
    blockMask = blockSz - 1;
920
921
    /* Size of data to HMAC if padding length byte is zero. */
922
0
    maxLen = WOLFSSL_TLS_HMAC_INNER_SZ + sz - 1 - macLen;
923
    /* Complete data (including padding) has block for EOC and/or length. */
924
0
    extraBlock = ctSetLTE((maxLen + padSz) & blockMask, padSz);
925
    /* Total number of blocks for data including padding. */
926
0
    blocks = ((maxLen + blockSz - 1) >> blockBits) + extraBlock;
927
    /* Up to last 6 blocks can be hashed safely. */
928
0
    safeBlocks = blocks - 6;
929
930
    /* Length of message data. */
931
0
    realLen = maxLen - in[sz - 1];
932
    /* Number of message bytes in last block. */
933
0
    lastBlockLen = realLen & blockMask;
934
    /* Number of padding bytes in last block. */
935
0
    extraLen = ((blockSz * 2 - padSz - lastBlockLen) & blockMask) + 1;
936
    /* Number of blocks to create for hash. */
937
0
    lenBlock = (realLen + extraLen) >> blockBits;
938
    /* Block containing EOC byte. */
939
0
    eocBlock = realLen >> blockBits;
940
    /* Index of EOC byte in block. */
941
0
    eocIndex = realLen & blockMask;
942
943
    /* Add length of hmac's ipad to total length. */
944
0
    realLen += blockSz;
945
    /* Length as bits - 8 bytes bigendian. */
946
0
    c32toa(realLen >> ((sizeof(word32) * 8) - 3), lenBytes);
947
0
    c32toa(realLen << 3, lenBytes + sizeof(word32));
948
949
0
    ret = Hmac_HashUpdate(hmac, (unsigned char*)hmac->ipad, blockSz);
950
0
    if (ret != 0)
951
0
        return ret;
952
953
0
    XMEMSET(hmac->innerHash, 0, macLen);
954
955
0
    if (safeBlocks > 0) {
956
0
        ret = Hmac_HashUpdate(hmac, header, WOLFSSL_TLS_HMAC_INNER_SZ);
957
0
        if (ret != 0)
958
0
            return ret;
959
0
        ret = Hmac_HashUpdate(hmac, in, safeBlocks * blockSz -
960
0
                                                     WOLFSSL_TLS_HMAC_INNER_SZ);
961
0
        if (ret != 0)
962
0
            return ret;
963
0
    }
964
0
    else
965
0
        safeBlocks = 0;
966
967
0
    XMEMSET(digest, 0, macLen);
968
0
    k = safeBlocks * blockSz;
969
0
    for (i = safeBlocks; i < blocks; i++) {
970
0
        unsigned char hashBlock[WC_MAX_BLOCK_SIZE];
971
0
        unsigned char isEocBlock = ctMaskEq(i, eocBlock);
972
0
        unsigned char isOutBlock = ctMaskEq(i, lenBlock);
973
974
0
        for (j = 0; j < blockSz; j++) {
975
0
            unsigned char atEoc = ctMaskEq(j, eocIndex) & isEocBlock;
976
0
            unsigned char pastEoc = ctMaskGT(j, eocIndex) & isEocBlock;
977
0
            unsigned char b = 0;
978
979
0
            if (k < WOLFSSL_TLS_HMAC_INNER_SZ)
980
0
                b = header[k];
981
0
            else if (k < maxLen)
982
0
                b = in[k - WOLFSSL_TLS_HMAC_INNER_SZ];
983
0
            k++;
984
985
0
            b = ctMaskSel(atEoc, 0x80, b);
986
0
            b &= (unsigned char)~(word32)pastEoc;
987
0
            b &= ((unsigned char)~(word32)isOutBlock) | isEocBlock;
988
989
0
            if (j >= blockSz - 8) {
990
0
                b = ctMaskSel(isOutBlock, lenBytes[j - (blockSz - 8)], b);
991
0
            }
992
993
0
            hashBlock[j] = b;
994
0
        }
995
996
0
        ret = Hmac_HashUpdate(hmac, hashBlock, blockSz);
997
0
        if (ret != 0)
998
0
            return ret;
999
0
        ret = Hmac_HashFinalRaw(hmac, hashBlock);
1000
0
        if (ret != 0)
1001
0
            return ret;
1002
0
        for (j = 0; j < macLen; j++)
1003
0
            ((unsigned char*)hmac->innerHash)[j] |= hashBlock[j] & isOutBlock;
1004
0
    }
1005
1006
0
    ret = Hmac_OuterHash(hmac, digest);
1007
1008
0
    return ret;
1009
0
}
1010
1011
#endif
1012
1013
#if defined(WOLFSSL_NO_HASH_RAW) || defined(HAVE_FIPS) || \
1014
    defined(HAVE_SELFTEST) || defined(HAVE_BLAKE2)
1015
1016
/* Calculate the HMAC of the header + message data.
1017
 * Constant time implementation using normal hashing operations.
1018
 * Update-Final need to be constant time.
1019
 *
1020
 * hmac    HMAC object.
1021
 * digest  MAC result.
1022
 * in      Message data.
1023
 * sz      Size of the message data.
1024
 * header  Constructed record header with length of handshake data.
1025
 * returns 0 on success, otherwise failure.
1026
 */
1027
static int Hmac_UpdateFinal(Hmac* hmac, byte* digest, const byte* in,
1028
                            word32 sz, byte* header)
1029
{
1030
    byte       dummy[WC_MAX_BLOCK_SIZE] = {0};
1031
    int        ret;
1032
    word32     msgSz, blockSz, macSz, padSz, maxSz, realSz;
1033
    word32     offset = 0;
1034
    int        msgBlocks, blocks, blockBits;
1035
    int        i;
1036
1037
    switch (hmac->macType) {
1038
    #ifndef NO_SHA
1039
        case WC_SHA:
1040
            blockSz = WC_SHA_BLOCK_SIZE;
1041
            blockBits = 6;
1042
            macSz = WC_SHA_DIGEST_SIZE;
1043
            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
1044
            break;
1045
    #endif /* !NO_SHA */
1046
1047
    #ifndef NO_SHA256
1048
        case WC_SHA256:
1049
            blockSz = WC_SHA256_BLOCK_SIZE;
1050
            blockBits = 6;
1051
            macSz = WC_SHA256_DIGEST_SIZE;
1052
            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
1053
            break;
1054
    #endif /* !NO_SHA256 */
1055
1056
    #ifdef WOLFSSL_SHA384
1057
        case WC_SHA384:
1058
            blockSz = WC_SHA384_BLOCK_SIZE;
1059
            blockBits = 7;
1060
            macSz = WC_SHA384_DIGEST_SIZE;
1061
            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
1062
            break;
1063
    #endif /* WOLFSSL_SHA384 */
1064
1065
    #ifdef WOLFSSL_SHA512
1066
        case WC_SHA512:
1067
            blockSz = WC_SHA512_BLOCK_SIZE;
1068
            blockBits = 7;
1069
            macSz = WC_SHA512_DIGEST_SIZE;
1070
            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
1071
            break;
1072
    #endif /* WOLFSSL_SHA512 */
1073
1074
    #ifdef HAVE_BLAKE2
1075
        case WC_HASH_TYPE_BLAKE2B:
1076
            blockSz = BLAKE2B_BLOCKBYTES;
1077
            blockBits = 7;
1078
            macSz = BLAKE2B_256;
1079
            padSz = 0;
1080
            break;
1081
    #endif /* HAVE_BLAKE2 */
1082
1083
        default:
1084
            return BAD_FUNC_ARG;
1085
    }
1086
1087
    msgSz = sz - (1 + in[sz - 1] + macSz);
1088
    /* Make negative result 0 */
1089
    msgSz &= ~(0 - (msgSz >> 31));
1090
    realSz = WOLFSSL_TLS_HMAC_INNER_SZ + msgSz;
1091
    maxSz = WOLFSSL_TLS_HMAC_INNER_SZ + (sz - 1) - macSz;
1092
1093
    /* Calculate #blocks processed in HMAC for max and real data. */
1094
    blocks      = maxSz >> blockBits;
1095
    blocks     += ((maxSz + padSz) % blockSz) < padSz;
1096
    msgBlocks   = realSz >> blockBits;
1097
    /* #Extra blocks to process. */
1098
    blocks -= msgBlocks + ((((realSz + padSz) % blockSz) < padSz) ? 1 : 0);
1099
    /* Calculate whole blocks. */
1100
    msgBlocks--;
1101
1102
    ret = wc_HmacUpdate(hmac, header, WOLFSSL_TLS_HMAC_INNER_SZ);
1103
    if (ret == 0) {
1104
        /* Fill the rest of the block with any available data. */
1105
        word32 currSz = ctMaskLT(msgSz, blockSz) & msgSz;
1106
        currSz |= ctMaskGTE(msgSz, blockSz) & blockSz;
1107
        currSz -= WOLFSSL_TLS_HMAC_INNER_SZ;
1108
        currSz &= ~(0 - (currSz >> 31));
1109
        ret = wc_HmacUpdate(hmac, in, currSz);
1110
        offset = currSz;
1111
    }
1112
    if (ret == 0) {
1113
        /* Do the hash operations on a block basis. */
1114
        for (i = 0; i < msgBlocks; i++, offset += blockSz) {
1115
            ret = wc_HmacUpdate(hmac, in + offset, blockSz);
1116
            if (ret != 0)
1117
                break;
1118
        }
1119
    }
1120
    if (ret == 0)
1121
        ret = wc_HmacUpdate(hmac, in + offset, msgSz - offset);
1122
    if (ret == 0)
1123
        ret = wc_HmacFinal(hmac, digest);
1124
    if (ret == 0) {
1125
        /* Do the dummy hash operations. Do at least one. */
1126
        for (i = 0; i < blocks + 1; i++) {
1127
            ret = wc_HmacUpdate(hmac, dummy, blockSz);
1128
            if (ret != 0)
1129
                break;
1130
        }
1131
    }
1132
1133
    return ret;
1134
}
1135
1136
#endif
1137
1138
int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz,
1139
             int content, int verify, int epochOrder)
1140
0
{
1141
0
    Hmac   hmac;
1142
0
    byte   myInner[WOLFSSL_TLS_HMAC_INNER_SZ];
1143
0
    int    ret = 0;
1144
0
    const byte* macSecret = NULL;
1145
0
    word32 hashSz = 0;
1146
1147
0
    if (ssl == NULL)
1148
0
        return BAD_FUNC_ARG;
1149
1150
#ifdef HAVE_TRUNCATED_HMAC
1151
    hashSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
1152
                                        : ssl->specs.hash_size;
1153
#else
1154
0
    hashSz = ssl->specs.hash_size;
1155
0
#endif
1156
1157
#ifdef HAVE_FUZZER
1158
    /* Fuzz "in" buffer with sz to be used in HMAC algorithm */
1159
    if (ssl->fuzzerCb) {
1160
        if (verify && padSz >= 0) {
1161
            ssl->fuzzerCb(ssl, in, sz + hashSz + padSz + 1, FUZZ_HMAC,
1162
                          ssl->fuzzerCtx);
1163
        }
1164
        else {
1165
            ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
1166
        }
1167
    }
1168
#endif
1169
1170
0
    if (!ssl->options.dtls)
1171
0
        wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, verify);
1172
0
    else
1173
0
        wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, epochOrder);
1174
1175
0
    ret = wc_HmacInit(&hmac, ssl->heap, ssl->devId);
1176
0
    if (ret != 0)
1177
0
        return ret;
1178
1179
1180
#ifdef WOLFSSL_DTLS
1181
    if (ssl->options.dtls)
1182
        macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
1183
    else
1184
        macSecret = wolfSSL_GetMacSecret(ssl, verify);
1185
#else
1186
0
    macSecret = wolfSSL_GetMacSecret(ssl, verify);
1187
0
#endif
1188
0
    ret = wc_HmacSetKey(&hmac, wolfSSL_GetHmacType(ssl),
1189
0
                                              macSecret,
1190
0
                                              ssl->specs.hash_size);
1191
1192
0
    if (ret == 0) {
1193
        /* Constant time verification required. */
1194
0
        if (verify && padSz >= 0) {
1195
0
#if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
1196
0
    !defined(HAVE_SELFTEST)
1197
    #ifdef HAVE_BLAKE2
1198
            if (wolfSSL_GetHmacType(ssl) == WC_HASH_TYPE_BLAKE2B) {
1199
                ret = Hmac_UpdateFinal(&hmac, digest, in,
1200
                                              sz + hashSz + padSz + 1, myInner);
1201
            }
1202
            else
1203
    #endif
1204
0
            {
1205
0
                ret = Hmac_UpdateFinal_CT(&hmac, digest, in,
1206
0
                                      sz + hashSz + padSz + 1, hashSz, myInner);
1207
0
            }
1208
#else
1209
            ret = Hmac_UpdateFinal(&hmac, digest, in, sz + hashSz + padSz + 1,
1210
                                                                       myInner);
1211
#endif
1212
0
        }
1213
0
        else {
1214
0
            ret = wc_HmacUpdate(&hmac, myInner, sizeof(myInner));
1215
0
            if (ret == 0)
1216
0
                ret = wc_HmacUpdate(&hmac, in, sz);                /* content */
1217
0
            if (ret == 0)
1218
0
                ret = wc_HmacFinal(&hmac, digest);
1219
0
        }
1220
0
    }
1221
1222
0
    wc_HmacFree(&hmac);
1223
1224
0
    return ret;
1225
0
}
1226
#endif /* WOLFSSL_AEAD_ONLY */
1227
1228
#endif /* !WOLFSSL_NO_TLS12 */
1229
1230
#ifdef HAVE_TLS_EXTENSIONS
1231
1232
/**
1233
 * The TLSX semaphore is used to calculate the size of the extensions to be sent
1234
 * from one peer to another.
1235
 */
1236
1237
/** Supports up to 72 flags. Increase as needed. */
1238
#define SEMAPHORE_SIZE 9
1239
1240
/**
1241
 * Converts the extension type (id) to an index in the semaphore.
1242
 *
1243
 * Official reference for TLS extension types:
1244
 *   http://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xml
1245
 *
1246
 * Motivation:
1247
 *   Previously, we used the extension type itself as the index of that
1248
 *   extension in the semaphore as the extension types were declared
1249
 *   sequentially, but maintain a semaphore as big as the number of available
1250
 *   extensions is no longer an option since the release of renegotiation_info.
1251
 *
1252
 * How to update:
1253
 *   Assign extension types that extrapolate the number of available semaphores
1254
 *   to the first available index going backwards in the semaphore array.
1255
 *   When adding a new extension type that don't extrapolate the number of
1256
 *   available semaphores, check for a possible collision with with a
1257
 *   'remapped' extension type.
1258
 *
1259
 * Update TLSX_Parse for duplicate detection if more added above 62.
1260
 */
1261
static WC_INLINE word16 TLSX_ToSemaphore(word16 type)
1262
0
{
1263
0
    switch (type) {
1264
1265
0
        case TLSX_RENEGOTIATION_INFO: /* 0xFF01 */
1266
0
            return 63;
1267
#ifdef WOLFSSL_QUIC
1268
        case TLSX_KEY_QUIC_TP_PARAMS_DRAFT: /* 0xffa5 */
1269
            return 64;
1270
#endif
1271
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
1272
        case TLSX_ECH: /* 0xfe0d */
1273
            return 65;
1274
#endif
1275
0
        default:
1276
0
            if (type > 62) {
1277
                /* This message SHOULD only happens during the adding of
1278
                   new TLS extensions in which its IANA number overflows
1279
                   the current semaphore's range, or if its number already
1280
                   is assigned to be used by another extension.
1281
                   Use this check value for the new extension and decrement
1282
                   the check value by one. */
1283
0
                WOLFSSL_MSG("### TLSX semaphore collision or overflow detected!");
1284
0
            }
1285
0
    }
1286
1287
0
    return type;
1288
0
}
1289
1290
/** Checks if a specific light (tls extension) is not set in the semaphore. */
1291
#define IS_OFF(semaphore, light) \
1292
0
    (!(((semaphore)[(light) / 8] &  (byte) (0x01 << ((light) % 8)))))
1293
1294
/** Turn on a specific light (tls extension) in the semaphore. */
1295
/* the semaphore marks the extensions already written to the message */
1296
#define TURN_ON(semaphore, light) \
1297
0
    ((semaphore)[(light) / 8] |= (byte) (0x01 << ((light) % 8)))
1298
1299
/** Turn off a specific light (tls extension) in the semaphore. */
1300
#define TURN_OFF(semaphore, light) \
1301
0
    ((semaphore)[(light) / 8] &= (byte) ~(0x01 << ((light) % 8)))
1302
1303
/** Creates a new extension. */
1304
static TLSX* TLSX_New(TLSX_Type type, const void* data, void* heap)
1305
0
{
1306
0
    TLSX* extension = (TLSX*)XMALLOC(sizeof(TLSX), heap, DYNAMIC_TYPE_TLSX);
1307
1308
0
    (void)heap;
1309
1310
0
    if (extension) {
1311
0
        extension->type = type;
1312
0
        extension->data = (void*)data;
1313
0
        extension->resp = 0;
1314
0
        extension->next = NULL;
1315
0
    }
1316
1317
0
    return extension;
1318
0
}
1319
1320
/**
1321
 * Creates a new extension and appends it to the provided list.
1322
 * Checks for duplicate extensions, keeps the newest.
1323
 */
1324
int TLSX_Append(TLSX** list, TLSX_Type type, const void* data, void* heap)
1325
0
{
1326
0
    TLSX* extension = TLSX_New(type, data, heap);
1327
0
    TLSX* cur;
1328
0
    TLSX** prevNext = list;
1329
1330
0
    if (extension == NULL)
1331
0
        return MEMORY_E;
1332
1333
0
    for (cur = *list; cur != NULL;) {
1334
0
        if (cur->type == type) {
1335
0
            *prevNext = cur->next;
1336
0
            cur->next = NULL;
1337
0
            TLSX_FreeAll(cur, heap);
1338
0
            cur = *prevNext;
1339
0
        }
1340
0
        else {
1341
0
            prevNext = &cur->next;
1342
0
            cur = cur->next;
1343
0
        }
1344
0
    }
1345
1346
    /* Append the extension to the list */
1347
0
    *prevNext = extension;
1348
1349
0
    return 0;
1350
0
}
1351
1352
/**
1353
 * Creates a new extension and pushes it to the provided list.
1354
 * Checks for duplicate extensions, keeps the newest.
1355
 */
1356
int TLSX_Push(TLSX** list, TLSX_Type type, const void* data, void* heap)
1357
0
{
1358
0
    TLSX* extension = TLSX_New(type, data, heap);
1359
1360
0
    if (extension == NULL)
1361
0
        return MEMORY_E;
1362
1363
    /* pushes the new extension on the list. */
1364
0
    extension->next = *list;
1365
0
    *list = extension;
1366
1367
    /* remove duplicate extensions, there should be only one of each type. */
1368
0
    do {
1369
0
        if (extension->next && extension->next->type == type) {
1370
0
            TLSX *next = extension->next;
1371
1372
0
            extension->next = next->next;
1373
0
            next->next = NULL;
1374
1375
0
            TLSX_FreeAll(next, heap);
1376
1377
            /* there is no way to occur more than
1378
             * two extensions of the same type.
1379
             */
1380
0
            break;
1381
0
        }
1382
0
    } while ((extension = extension->next));
1383
1384
0
    return 0;
1385
0
}
1386
1387
#ifndef NO_WOLFSSL_CLIENT
1388
1389
int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type);
1390
1391
int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type)
1392
0
{
1393
0
    TLSX *extension = TLSX_Find(ssl->extensions, type);
1394
1395
0
    if (!extension)
1396
0
        extension = TLSX_Find(ssl->ctx->extensions, type);
1397
1398
0
    return extension == NULL;
1399
0
}
1400
1401
int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl);
1402
1403
int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl)
1404
0
{
1405
0
    SendAlert(ssl, alert_fatal, unsupported_extension);
1406
0
    WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
1407
0
    return UNSUPPORTED_EXTENSION;
1408
0
}
1409
1410
#else
1411
1412
#define TLSX_CheckUnsupportedExtension(ssl, type) 0
1413
#define TLSX_HandleUnsupportedExtension(ssl) 0
1414
1415
#endif
1416
1417
#if !defined(NO_WOLFSSL_SERVER) || defined(WOLFSSL_TLS13)
1418
void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type);
1419
/** Mark an extension to be sent back to the client. */
1420
void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type)
1421
0
{
1422
0
    TLSX *extension = TLSX_Find(ssl->extensions, type);
1423
1424
0
    if (extension)
1425
0
        extension->resp = 1;
1426
0
}
1427
#endif
1428
1429
/******************************************************************************/
1430
/* Application-Layer Protocol Negotiation                                     */
1431
/******************************************************************************/
1432
1433
#ifdef HAVE_ALPN
1434
/** Creates a new ALPN object, providing protocol name to use. */
1435
static ALPN* TLSX_ALPN_New(char *protocol_name, word16 protocol_nameSz,
1436
                                                                     void* heap)
1437
{
1438
    ALPN *alpn;
1439
1440
    WOLFSSL_ENTER("TLSX_ALPN_New");
1441
1442
    if (protocol_name == NULL ||
1443
        protocol_nameSz > WOLFSSL_MAX_ALPN_PROTO_NAME_LEN) {
1444
        WOLFSSL_MSG("Invalid arguments");
1445
        return NULL;
1446
    }
1447
1448
    alpn = (ALPN*)XMALLOC(sizeof(ALPN), heap, DYNAMIC_TYPE_TLSX);
1449
    if (alpn == NULL) {
1450
        WOLFSSL_MSG("Memory failure");
1451
        return NULL;
1452
    }
1453
1454
    alpn->next = NULL;
1455
    alpn->negotiated = 0;
1456
    alpn->options = 0;
1457
1458
    alpn->protocol_name = (char*)XMALLOC(protocol_nameSz + 1,
1459
                                         heap, DYNAMIC_TYPE_TLSX);
1460
    if (alpn->protocol_name == NULL) {
1461
        WOLFSSL_MSG("Memory failure");
1462
        XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
1463
        return NULL;
1464
    }
1465
1466
    XMEMCPY(alpn->protocol_name, protocol_name, protocol_nameSz);
1467
    alpn->protocol_name[protocol_nameSz] = 0;
1468
1469
    (void)heap;
1470
1471
    return alpn;
1472
}
1473
1474
/** Releases an ALPN object. */
1475
static void TLSX_ALPN_Free(ALPN *alpn, void* heap)
1476
{
1477
    (void)heap;
1478
1479
    if (alpn == NULL)
1480
        return;
1481
1482
    XFREE(alpn->protocol_name, heap, DYNAMIC_TYPE_TLSX);
1483
    XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
1484
}
1485
1486
/** Releases all ALPN objects in the provided list. */
1487
static void TLSX_ALPN_FreeAll(ALPN *list, void* heap)
1488
{
1489
    ALPN* alpn;
1490
1491
    while ((alpn = list)) {
1492
        list = alpn->next;
1493
        TLSX_ALPN_Free(alpn, heap);
1494
    }
1495
}
1496
1497
/** Tells the buffered size of the ALPN objects in a list. */
1498
static word16 TLSX_ALPN_GetSize(ALPN *list)
1499
{
1500
    ALPN* alpn;
1501
    word16 length = OPAQUE16_LEN; /* list length */
1502
1503
    while ((alpn = list)) {
1504
        list = alpn->next;
1505
1506
        length++; /* protocol name length is on one byte */
1507
        length += (word16)XSTRLEN(alpn->protocol_name);
1508
    }
1509
1510
    return length;
1511
}
1512
1513
/** Writes the ALPN objects of a list in a buffer. */
1514
static word16 TLSX_ALPN_Write(ALPN *list, byte *output)
1515
{
1516
    ALPN* alpn;
1517
    word16 length = 0;
1518
    word16 offset = OPAQUE16_LEN; /* list length offset */
1519
1520
    while ((alpn = list)) {
1521
        list = alpn->next;
1522
1523
        length = (word16)XSTRLEN(alpn->protocol_name);
1524
1525
        /* protocol name length */
1526
        output[offset++] = (byte)length;
1527
1528
        /* protocol name value */
1529
        XMEMCPY(output + offset, alpn->protocol_name, length);
1530
1531
        offset += length;
1532
    }
1533
1534
    /* writing list length */
1535
    c16toa(offset - OPAQUE16_LEN, output);
1536
1537
    return offset;
1538
}
1539
1540
/** Finds a protocol name in the provided ALPN list */
1541
static ALPN* TLSX_ALPN_Find(ALPN *list, char *protocol_name, word16 size)
1542
{
1543
    ALPN *alpn;
1544
1545
    if (list == NULL || protocol_name == NULL)
1546
        return NULL;
1547
1548
    alpn = list;
1549
    while (alpn != NULL && (
1550
           (word16)XSTRLEN(alpn->protocol_name) != size ||
1551
           XSTRNCMP(alpn->protocol_name, protocol_name, size)))
1552
        alpn = alpn->next;
1553
1554
    return alpn;
1555
}
1556
1557
/** Set the ALPN matching client and server requirements */
1558
static int TLSX_SetALPN(TLSX** extensions, const void* data, word16 size,
1559
                                                                     void* heap)
1560
{
1561
    ALPN *alpn;
1562
    int  ret;
1563
1564
    if (extensions == NULL || data == NULL)
1565
        return BAD_FUNC_ARG;
1566
1567
    alpn = TLSX_ALPN_New((char *)data, size, heap);
1568
    if (alpn == NULL) {
1569
        WOLFSSL_MSG("Memory failure");
1570
        return MEMORY_E;
1571
    }
1572
1573
    alpn->negotiated = 1;
1574
1575
    ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL, (void*)alpn,
1576
                                                                          heap);
1577
    if (ret != 0) {
1578
        TLSX_ALPN_Free(alpn, heap);
1579
        return ret;
1580
    }
1581
1582
    return WOLFSSL_SUCCESS;
1583
}
1584
1585
static int ALPN_find_match(WOLFSSL *ssl, TLSX **pextension,
1586
                           const byte **psel, byte *psel_len,
1587
                           const byte *alpn_val, word16 alpn_val_len)
1588
{
1589
    TLSX    *extension;
1590
    ALPN    *alpn, *list;
1591
    const byte *sel = NULL, *s;
1592
    byte sel_len = 0, wlen;
1593
1594
    extension = TLSX_Find(ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
1595
    if (extension == NULL)
1596
        extension = TLSX_Find(ssl->ctx->extensions,
1597
                              TLSX_APPLICATION_LAYER_PROTOCOL);
1598
1599
    /* No ALPN configured here */
1600
    if (extension == NULL || extension->data == NULL) {
1601
        *pextension = NULL;
1602
        *psel = NULL;
1603
        *psel_len = 0;
1604
        return 0;
1605
    }
1606
1607
    list = (ALPN*)extension->data;
1608
    for (s = alpn_val;
1609
         (s - alpn_val) < alpn_val_len;
1610
         s += wlen) {
1611
        wlen = *s++; /* bounds already checked on save */
1612
        alpn = TLSX_ALPN_Find(list, (char*)s, wlen);
1613
        if (alpn != NULL) {
1614
            WOLFSSL_MSG("ALPN protocol match");
1615
            sel = s,
1616
            sel_len = wlen;
1617
            break;
1618
        }
1619
    }
1620
1621
    if (sel == NULL) {
1622
        WOLFSSL_MSG("No ALPN protocol match");
1623
1624
        /* do nothing if no protocol match between client and server and option
1625
         is set to continue (like OpenSSL) */
1626
        if (list->options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) {
1627
            WOLFSSL_MSG("Continue on mismatch");
1628
        }
1629
        else {
1630
            SendAlert(ssl, alert_fatal, no_application_protocol);
1631
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_ALPN_PROTOCOL_NAME_E);
1632
            return UNKNOWN_ALPN_PROTOCOL_NAME_E;
1633
        }
1634
    }
1635
1636
    *pextension = extension;
1637
    *psel = sel;
1638
    *psel_len = sel_len;
1639
    return 0;
1640
}
1641
1642
int ALPN_Select(WOLFSSL *ssl)
1643
{
1644
    TLSX *extension;
1645
    const byte *sel = NULL;
1646
    byte sel_len = 0;
1647
    int r = 0;
1648
1649
    WOLFSSL_ENTER("ALPN_Select");
1650
    if (ssl->alpn_peer_requested == NULL)
1651
        return 0;
1652
1653
#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
1654
    if (ssl->alpnSelect != NULL && ssl->options.side == WOLFSSL_SERVER_END) {
1655
        if (ssl->alpnSelect(ssl, &sel, &sel_len, ssl->alpn_peer_requested,
1656
                            ssl->alpn_peer_requested_length,
1657
                            ssl->alpnSelectArg) == 0) {
1658
            WOLFSSL_MSG("ALPN protocol match");
1659
        }
1660
        else {
1661
            sel = NULL;
1662
            sel_len = 0;
1663
        }
1664
    }
1665
#endif
1666
1667
    if (sel == NULL) {
1668
        r = ALPN_find_match(ssl, &extension, &sel, &sel_len,
1669
                            ssl->alpn_peer_requested,
1670
                            ssl->alpn_peer_requested_length);
1671
        if (r != 0)
1672
            return r;
1673
    }
1674
1675
    if (sel != NULL) {
1676
        /* set the matching negotiated protocol */
1677
        r = TLSX_SetALPN(&ssl->extensions, sel, sel_len, ssl->heap);
1678
        if (r != WOLFSSL_SUCCESS) {
1679
            WOLFSSL_MSG("TLSX_SetALPN failed");
1680
            return BUFFER_ERROR;
1681
        }
1682
        /* reply to ALPN extension sent from peer */
1683
#ifndef NO_WOLFSSL_SERVER
1684
        TLSX_SetResponse(ssl, TLSX_APPLICATION_LAYER_PROTOCOL);
1685
#endif
1686
    }
1687
    return 0;
1688
}
1689
1690
/** Parses a buffer of ALPN extensions and set the first one matching
1691
 * client and server requirements */
1692
static int TLSX_ALPN_ParseAndSet(WOLFSSL *ssl, const byte *input, word16 length,
1693
                                 byte isRequest)
1694
{
1695
    word16  size = 0, offset = 0, wlen;
1696
    int     r = BUFFER_ERROR;
1697
    const byte *s;
1698
1699
    if (OPAQUE16_LEN > length)
1700
        return BUFFER_ERROR;
1701
1702
    ato16(input, &size);
1703
    offset += OPAQUE16_LEN;
1704
1705
    /* validating alpn list length */
1706
    if (size == 0 || length != OPAQUE16_LEN + size)
1707
        return BUFFER_ERROR;
1708
1709
    /* validating length of entries before accepting */
1710
    for (s = input + offset; (s - input) < size; s += wlen) {
1711
        wlen = *s++;
1712
        if (wlen == 0 || (s + wlen - input) > length)
1713
            return BUFFER_ERROR;
1714
    }
1715
1716
    if (isRequest) {
1717
        /* keep the list sent by peer, if this is from a request. We
1718
         * use it later in ALPN_Select() for evaluation. */
1719
        if (ssl->alpn_peer_requested != NULL) {
1720
            XFREE(ssl->alpn_peer_requested, ssl->heap, DYNAMIC_TYPE_ALPN);
1721
            ssl->alpn_peer_requested_length = 0;
1722
        }
1723
        ssl->alpn_peer_requested = (byte *)XMALLOC(size, ssl->heap,
1724
                                                   DYNAMIC_TYPE_ALPN);
1725
        if (ssl->alpn_peer_requested == NULL) {
1726
            return MEMORY_ERROR;
1727
        }
1728
        ssl->alpn_peer_requested_length = size;
1729
        XMEMCPY(ssl->alpn_peer_requested, (char*)input + offset, size);
1730
    }
1731
    else {
1732
        /* a response, we should find the value in our config */
1733
        const byte *sel = NULL;
1734
        byte sel_len = 0;
1735
        TLSX *extension = NULL;
1736
1737
        r = ALPN_find_match(ssl, &extension, &sel, &sel_len, input + offset, size);
1738
        if (r != 0)
1739
            return r;
1740
1741
        if (sel != NULL) {
1742
            /* set the matching negotiated protocol */
1743
            r = TLSX_SetALPN(&ssl->extensions, sel, sel_len, ssl->heap);
1744
            if (r != WOLFSSL_SUCCESS) {
1745
                WOLFSSL_MSG("TLSX_SetALPN failed");
1746
                return BUFFER_ERROR;
1747
            }
1748
        }
1749
        /* If we had nothing configured, the response is unexpected */
1750
        else if (extension == NULL) {
1751
            r = TLSX_HandleUnsupportedExtension(ssl);
1752
            if (r != 0)
1753
                return r;
1754
        }
1755
    }
1756
    return 0;
1757
}
1758
1759
/** Add a protocol name to the list of accepted usable ones */
1760
int TLSX_UseALPN(TLSX** extensions, const void* data, word16 size, byte options,
1761
                                                                     void* heap)
1762
{
1763
    ALPN *alpn;
1764
    TLSX *extension;
1765
    int  ret;
1766
1767
    if (extensions == NULL || data == NULL)
1768
        return BAD_FUNC_ARG;
1769
1770
    alpn = TLSX_ALPN_New((char *)data, size, heap);
1771
    if (alpn == NULL) {
1772
        WOLFSSL_MSG("Memory failure");
1773
        return MEMORY_E;
1774
    }
1775
1776
    /* Set Options of ALPN */
1777
    alpn->options = options;
1778
1779
    extension = TLSX_Find(*extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
1780
    if (extension == NULL) {
1781
        ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL,
1782
                                                             (void*)alpn, heap);
1783
        if (ret != 0) {
1784
            TLSX_ALPN_Free(alpn, heap);
1785
            return ret;
1786
        }
1787
    }
1788
    else {
1789
        /* push new ALPN object to extension data. */
1790
        alpn->next = (ALPN*)extension->data;
1791
        extension->data = (void*)alpn;
1792
    }
1793
1794
    return WOLFSSL_SUCCESS;
1795
}
1796
1797
/** Get the protocol name set by the server */
1798
int TLSX_ALPN_GetRequest(TLSX* extensions, void** data, word16 *dataSz)
1799
{
1800
    TLSX *extension;
1801
    ALPN *alpn;
1802
1803
    if (extensions == NULL || data == NULL || dataSz == NULL)
1804
        return BAD_FUNC_ARG;
1805
1806
    extension = TLSX_Find(extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
1807
    if (extension == NULL) {
1808
        WOLFSSL_MSG("TLS extension not found");
1809
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_ALPN_NOT_FOUND);
1810
        return WOLFSSL_ALPN_NOT_FOUND;
1811
    }
1812
1813
    alpn = (ALPN *)extension->data;
1814
    if (alpn == NULL) {
1815
        WOLFSSL_MSG("ALPN extension not found");
1816
        *data = NULL;
1817
        *dataSz = 0;
1818
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
1819
        return WOLFSSL_FATAL_ERROR;
1820
    }
1821
1822
    if (alpn->negotiated != 1) {
1823
1824
        /* consider as an error */
1825
        if (alpn->options & WOLFSSL_ALPN_FAILED_ON_MISMATCH) {
1826
            WOLFSSL_MSG("No protocol match with peer -> Failed");
1827
            WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
1828
            return WOLFSSL_FATAL_ERROR;
1829
        }
1830
1831
        /* continue without negotiated protocol */
1832
        WOLFSSL_MSG("No protocol match with peer -> Continue");
1833
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_ALPN_NOT_FOUND);
1834
        return WOLFSSL_ALPN_NOT_FOUND;
1835
    }
1836
1837
    if (alpn->next != NULL) {
1838
        WOLFSSL_MSG("Only one protocol name must be accepted");
1839
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
1840
        return WOLFSSL_FATAL_ERROR;
1841
    }
1842
1843
    *data = alpn->protocol_name;
1844
    *dataSz = (word16)XSTRLEN((char*)*data);
1845
1846
    return WOLFSSL_SUCCESS;
1847
}
1848
1849
#define ALPN_FREE_ALL     TLSX_ALPN_FreeAll
1850
#define ALPN_GET_SIZE     TLSX_ALPN_GetSize
1851
#define ALPN_WRITE        TLSX_ALPN_Write
1852
#define ALPN_PARSE        TLSX_ALPN_ParseAndSet
1853
1854
#else /* HAVE_ALPN */
1855
1856
#define ALPN_FREE_ALL(list, heap)
1857
0
#define ALPN_GET_SIZE(list)     0
1858
0
#define ALPN_WRITE(a, b)        0
1859
0
#define ALPN_PARSE(a, b, c, d)  0
1860
1861
#endif /* HAVE_ALPN */
1862
1863
/******************************************************************************/
1864
/* Server Name Indication                                                     */
1865
/******************************************************************************/
1866
1867
#ifdef HAVE_SNI
1868
1869
/** Creates a new SNI object. */
1870
static SNI* TLSX_SNI_New(byte type, const void* data, word16 size, void* heap)
1871
{
1872
    SNI* sni = (SNI*)XMALLOC(sizeof(SNI), heap, DYNAMIC_TYPE_TLSX);
1873
1874
    (void)heap;
1875
1876
    if (sni) {
1877
        sni->type = type;
1878
        sni->next = NULL;
1879
1880
    #ifndef NO_WOLFSSL_SERVER
1881
        sni->options = 0;
1882
        sni->status  = WOLFSSL_SNI_NO_MATCH;
1883
    #endif
1884
1885
        switch (sni->type) {
1886
            case WOLFSSL_SNI_HOST_NAME:
1887
                sni->data.host_name = (char*)XMALLOC(size + 1, heap,
1888
                                                     DYNAMIC_TYPE_TLSX);
1889
                if (sni->data.host_name) {
1890
                    XSTRNCPY(sni->data.host_name, (const char*)data, size);
1891
                    sni->data.host_name[size] = '\0';
1892
                } else {
1893
                    XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
1894
                    sni = NULL;
1895
                }
1896
            break;
1897
1898
            default: /* invalid type */
1899
                XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
1900
                sni = NULL;
1901
        }
1902
    }
1903
1904
    return sni;
1905
}
1906
1907
/** Releases a SNI object. */
1908
static void TLSX_SNI_Free(SNI* sni, void* heap)
1909
{
1910
    if (sni) {
1911
        switch (sni->type) {
1912
            case WOLFSSL_SNI_HOST_NAME:
1913
                XFREE(sni->data.host_name, heap, DYNAMIC_TYPE_TLSX);
1914
            break;
1915
        }
1916
1917
        XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
1918
    }
1919
    (void)heap;
1920
}
1921
1922
/** Releases all SNI objects in the provided list. */
1923
static void TLSX_SNI_FreeAll(SNI* list, void* heap)
1924
{
1925
    SNI* sni;
1926
1927
    while ((sni = list)) {
1928
        list = sni->next;
1929
        TLSX_SNI_Free(sni, heap);
1930
    }
1931
}
1932
1933
/** Tells the buffered size of the SNI objects in a list. */
1934
static word16 TLSX_SNI_GetSize(SNI* list)
1935
{
1936
    SNI* sni;
1937
    word16 length = OPAQUE16_LEN; /* list length */
1938
1939
    while ((sni = list)) {
1940
        list = sni->next;
1941
1942
        length += ENUM_LEN + OPAQUE16_LEN; /* sni type + sni length */
1943
1944
        switch (sni->type) {
1945
            case WOLFSSL_SNI_HOST_NAME:
1946
                length += (word16)XSTRLEN((char*)sni->data.host_name);
1947
            break;
1948
        }
1949
    }
1950
1951
    return length;
1952
}
1953
1954
/** Writes the SNI objects of a list in a buffer. */
1955
static word16 TLSX_SNI_Write(SNI* list, byte* output)
1956
{
1957
    SNI* sni;
1958
    word16 length = 0;
1959
    word16 offset = OPAQUE16_LEN; /* list length offset */
1960
1961
    while ((sni = list)) {
1962
        list = sni->next;
1963
1964
        output[offset++] = sni->type; /* sni type */
1965
1966
        switch (sni->type) {
1967
            case WOLFSSL_SNI_HOST_NAME:
1968
                length = (word16)XSTRLEN((char*)sni->data.host_name);
1969
1970
                c16toa(length, output + offset); /* sni length */
1971
                offset += OPAQUE16_LEN;
1972
1973
                XMEMCPY(output + offset, sni->data.host_name, length);
1974
1975
                offset += length;
1976
            break;
1977
        }
1978
    }
1979
1980
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
1981
1982
    return offset;
1983
}
1984
1985
/** Finds a SNI object in the provided list. */
1986
static SNI* TLSX_SNI_Find(SNI *list, byte type)
1987
{
1988
    SNI* sni = list;
1989
1990
    while (sni && sni->type != type)
1991
        sni = sni->next;
1992
1993
    return sni;
1994
}
1995
1996
#if (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER))
1997
/** Sets the status of a SNI object. */
1998
static void TLSX_SNI_SetStatus(TLSX* extensions, byte type, byte status)
1999
{
2000
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2001
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2002
2003
    if (sni)
2004
        sni->status = status;
2005
}
2006
#endif
2007
2008
/** Gets the status of a SNI object. */
2009
byte TLSX_SNI_Status(TLSX* extensions, byte type)
2010
{
2011
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2012
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2013
2014
    if (sni)
2015
        return sni->status;
2016
2017
    return 0;
2018
}
2019
2020
/** Parses a buffer of SNI extensions. */
2021
static int TLSX_SNI_Parse(WOLFSSL* ssl, const byte* input, word16 length,
2022
                          byte isRequest)
2023
{
2024
#ifndef NO_WOLFSSL_SERVER
2025
    word16 size = 0;
2026
    word16 offset = 0;
2027
    int cacheOnly = 0;
2028
    SNI *sni = NULL;
2029
    byte type;
2030
    byte matched;
2031
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2032
    WOLFSSL_ECH* ech = NULL;
2033
    WOLFSSL_EchConfig* workingConfig;
2034
    TLSX* echX;
2035
#endif
2036
#endif /* !NO_WOLFSSL_SERVER */
2037
    TLSX *extension = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
2038
2039
    if (!extension)
2040
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
2041
2042
    if (!isRequest) {
2043
        #ifndef NO_WOLFSSL_CLIENT
2044
            if (!extension || !extension->data)
2045
                return TLSX_HandleUnsupportedExtension(ssl);
2046
2047
            if (length > 0)
2048
                return BUFFER_ERROR; /* SNI response MUST be empty. */
2049
2050
            /* This call enables wolfSSL_SNI_GetRequest() to be called in the
2051
             * client side to fetch the used SNI. It will only work if the SNI
2052
             * was set at the SSL object level. Right now we only support one
2053
             * name type, WOLFSSL_SNI_HOST_NAME, but in the future, the
2054
             * inclusion of other name types will turn this method inaccurate,
2055
             * as the extension response doesn't contains information of which
2056
             * name was accepted.
2057
             */
2058
            TLSX_SNI_SetStatus(ssl->extensions, WOLFSSL_SNI_HOST_NAME,
2059
                                                        WOLFSSL_SNI_REAL_MATCH);
2060
2061
            return 0;
2062
        #endif
2063
    }
2064
2065
#ifndef NO_WOLFSSL_SERVER
2066
    if (!extension || !extension->data) {
2067
        /* This will keep SNI even though TLSX_UseSNI has not been called.
2068
         * Enable it so that the received sni is available to functions
2069
         * that use a custom callback when SNI is received.
2070
         */
2071
    #ifdef WOLFSSL_ALWAYS_KEEP_SNI
2072
        cacheOnly = 1;
2073
    #endif
2074
        if (ssl->ctx->sniRecvCb) {
2075
            cacheOnly = 1;
2076
        }
2077
2078
        if (cacheOnly) {
2079
            WOLFSSL_MSG("Forcing SSL object to store SNI parameter");
2080
        }
2081
        else {
2082
            /* Skipping, SNI not enabled at server side. */
2083
            return 0;
2084
        }
2085
    }
2086
2087
    if (OPAQUE16_LEN > length)
2088
        return BUFFER_ERROR;
2089
2090
    ato16(input, &size);
2091
    offset += OPAQUE16_LEN;
2092
2093
    /* validating sni list length */
2094
    if (length != OPAQUE16_LEN + size || size == 0)
2095
        return BUFFER_ERROR;
2096
2097
    /* SNI was badly specified and only one type is now recognized and allowed.
2098
     * Only one SNI value per type (RFC6066), so, no loop. */
2099
    type = input[offset++];
2100
    if (type != WOLFSSL_SNI_HOST_NAME)
2101
        return BUFFER_ERROR;
2102
2103
    if (offset + OPAQUE16_LEN > length)
2104
        return BUFFER_ERROR;
2105
    ato16(input + offset, &size);
2106
    offset += OPAQUE16_LEN;
2107
2108
    if (offset + size != length || size == 0)
2109
        return BUFFER_ERROR;
2110
2111
    if (!cacheOnly && !(sni = TLSX_SNI_Find((SNI*)extension->data, type)))
2112
        return 0; /* not using this type of SNI. */
2113
2114
#ifdef WOLFSSL_TLS13
2115
    /* Don't process the second ClientHello SNI extension if there
2116
     * was problems with the first.
2117
     */
2118
    if (!cacheOnly && sni->status != 0)
2119
        return 0;
2120
#endif
2121
    matched = cacheOnly || (XSTRLEN(sni->data.host_name) == size &&
2122
         XSTRNCMP(sni->data.host_name, (const char*)input + offset, size) == 0);
2123
2124
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2125
    echX = TLSX_Find(ssl->extensions, TLSX_ECH);
2126
    if (echX != NULL)
2127
        ech = (WOLFSSL_ECH*)(echX->data);
2128
2129
    if (!matched && ech != NULL) {
2130
        workingConfig = ech->echConfig;
2131
2132
        while (workingConfig != NULL) {
2133
            matched = XSTRLEN(workingConfig->publicName) == size &&
2134
                XSTRNCMP(workingConfig->publicName,
2135
                (const char*)input + offset, size) == 0;
2136
2137
            if (matched)
2138
                break;
2139
2140
            workingConfig = workingConfig->next;
2141
        }
2142
    }
2143
#endif
2144
2145
    if (matched || sni->options & WOLFSSL_SNI_ANSWER_ON_MISMATCH) {
2146
        int matchStat;
2147
        int r = TLSX_UseSNI(&ssl->extensions, type, input + offset, size,
2148
                                                                     ssl->heap);
2149
        if (r != WOLFSSL_SUCCESS)
2150
            return r; /* throws error. */
2151
2152
        if (cacheOnly) {
2153
            WOLFSSL_MSG("Forcing storage of SNI, Fake match");
2154
            matchStat = WOLFSSL_SNI_FORCE_KEEP;
2155
        }
2156
        else if (matched) {
2157
            WOLFSSL_MSG("SNI did match!");
2158
            matchStat = WOLFSSL_SNI_REAL_MATCH;
2159
        }
2160
        else {
2161
            WOLFSSL_MSG("fake SNI match from ANSWER_ON_MISMATCH");
2162
            matchStat = WOLFSSL_SNI_FAKE_MATCH;
2163
        }
2164
2165
        TLSX_SNI_SetStatus(ssl->extensions, type, (byte)matchStat);
2166
2167
        if (!cacheOnly)
2168
            TLSX_SetResponse(ssl, TLSX_SERVER_NAME);
2169
    }
2170
    else if (!(sni->options & WOLFSSL_SNI_CONTINUE_ON_MISMATCH)) {
2171
        SendAlert(ssl, alert_fatal, unrecognized_name);
2172
        WOLFSSL_ERROR_VERBOSE(UNKNOWN_SNI_HOST_NAME_E);
2173
        return UNKNOWN_SNI_HOST_NAME_E;
2174
    }
2175
#else
2176
    (void)input;
2177
#endif /* !NO_WOLFSSL_SERVER */
2178
2179
#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER)
2180
    (void)length;
2181
#endif
2182
2183
    return 0;
2184
}
2185
2186
static int TLSX_SNI_VerifyParse(WOLFSSL* ssl,  byte isRequest)
2187
{
2188
    (void)ssl;
2189
2190
    if (isRequest) {
2191
    #ifndef NO_WOLFSSL_SERVER
2192
        TLSX* ctx_ext = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
2193
        TLSX* ssl_ext = TLSX_Find(ssl->extensions,      TLSX_SERVER_NAME);
2194
        SNI* ctx_sni = ctx_ext ? (SNI*)ctx_ext->data : NULL;
2195
        SNI* ssl_sni = ssl_ext ? (SNI*)ssl_ext->data : NULL;
2196
        SNI* sni = NULL;
2197
2198
        for (; ctx_sni; ctx_sni = ctx_sni->next) {
2199
            if (ctx_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
2200
                sni = TLSX_SNI_Find(ssl_sni, ctx_sni->type);
2201
2202
                if (sni) {
2203
                    if (sni->status != WOLFSSL_SNI_NO_MATCH)
2204
                        continue;
2205
2206
                    /* if ssl level overrides ctx level, it is ok. */
2207
                    if ((sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) == 0)
2208
                        continue;
2209
                }
2210
2211
                SendAlert(ssl, alert_fatal, handshake_failure);
2212
                WOLFSSL_ERROR_VERBOSE(SNI_ABSENT_ERROR);
2213
                return SNI_ABSENT_ERROR;
2214
            }
2215
        }
2216
2217
        for (; ssl_sni; ssl_sni = ssl_sni->next) {
2218
            if (ssl_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
2219
                if (ssl_sni->status != WOLFSSL_SNI_NO_MATCH)
2220
                    continue;
2221
2222
                SendAlert(ssl, alert_fatal, handshake_failure);
2223
                WOLFSSL_ERROR_VERBOSE(SNI_ABSENT_ERROR);
2224
                return SNI_ABSENT_ERROR;
2225
            }
2226
        }
2227
    #endif /* NO_WOLFSSL_SERVER */
2228
    }
2229
2230
    return 0;
2231
}
2232
2233
int TLSX_UseSNI(TLSX** extensions, byte type, const void* data, word16 size,
2234
                                                                     void* heap)
2235
{
2236
    TLSX* extension;
2237
    SNI* sni = NULL;
2238
2239
    if (extensions == NULL || data == NULL)
2240
        return BAD_FUNC_ARG;
2241
2242
    if ((sni = TLSX_SNI_New(type, data, size, heap)) == NULL)
2243
        return MEMORY_E;
2244
2245
    extension = TLSX_Find(*extensions, TLSX_SERVER_NAME);
2246
    if (!extension) {
2247
        int ret = TLSX_Push(extensions, TLSX_SERVER_NAME, (void*)sni, heap);
2248
2249
        if (ret != 0) {
2250
            TLSX_SNI_Free(sni, heap);
2251
            return ret;
2252
        }
2253
    }
2254
    else {
2255
        /* push new SNI object to extension data. */
2256
        sni->next = (SNI*)extension->data;
2257
        extension->data = (void*)sni;
2258
2259
        /* remove duplicate SNI, there should be only one of each type. */
2260
        do {
2261
            if (sni->next && sni->next->type == type) {
2262
                SNI* next = sni->next;
2263
2264
                sni->next = next->next;
2265
                TLSX_SNI_Free(next, heap);
2266
2267
                /* there is no way to occur more than
2268
                 * two SNIs of the same type.
2269
                 */
2270
                break;
2271
            }
2272
        } while ((sni = sni->next));
2273
    }
2274
2275
    return WOLFSSL_SUCCESS;
2276
}
2277
2278
#ifndef NO_WOLFSSL_SERVER
2279
2280
/** Tells the SNI requested by the client. */
2281
word16 TLSX_SNI_GetRequest(TLSX* extensions, byte type, void** data)
2282
{
2283
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2284
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2285
2286
    if (sni && sni->status != WOLFSSL_SNI_NO_MATCH) {
2287
        switch (sni->type) {
2288
            case WOLFSSL_SNI_HOST_NAME:
2289
                if (data) {
2290
                    *data = sni->data.host_name;
2291
                    return (word16)XSTRLEN((char*)*data);
2292
                }
2293
        }
2294
    }
2295
2296
    return 0;
2297
}
2298
2299
/** Sets the options for a SNI object. */
2300
void TLSX_SNI_SetOptions(TLSX* extensions, byte type, byte options)
2301
{
2302
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2303
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2304
2305
    if (sni)
2306
        sni->options = options;
2307
}
2308
2309
/** Retrieves a SNI request from a client hello buffer. */
2310
int TLSX_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
2311
                           byte type, byte* sni, word32* inOutSz)
2312
{
2313
    word32 offset = 0;
2314
    word32 len32 = 0;
2315
    word16 len16 = 0;
2316
2317
    if (helloSz < RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + CLIENT_HELLO_FIRST)
2318
        return INCOMPLETE_DATA;
2319
2320
    /* TLS record header */
2321
    if ((enum ContentType) clientHello[offset++] != handshake) {
2322
2323
        /* checking for SSLv2.0 client hello according to: */
2324
        /* http://tools.ietf.org/html/rfc4346#appendix-E.1 */
2325
        if ((enum HandShakeType) clientHello[++offset] == client_hello) {
2326
            offset += ENUM_LEN + VERSION_SZ; /* skip version */
2327
2328
            ato16(clientHello + offset, &len16);
2329
            offset += OPAQUE16_LEN;
2330
2331
            if (len16 % 3) /* cipher_spec_length must be multiple of 3 */
2332
                return BUFFER_ERROR;
2333
2334
            ato16(clientHello + offset, &len16);
2335
            /* Returning SNI_UNSUPPORTED do not increment offset here */
2336
2337
            if (len16 != 0) /* session_id_length must be 0 */
2338
                return BUFFER_ERROR;
2339
2340
            WOLFSSL_ERROR_VERBOSE(SNI_UNSUPPORTED);
2341
            return SNI_UNSUPPORTED;
2342
        }
2343
2344
        return BUFFER_ERROR;
2345
    }
2346
2347
    if (clientHello[offset++] != SSLv3_MAJOR)
2348
        return BUFFER_ERROR;
2349
2350
    if (clientHello[offset++] < TLSv1_MINOR) {
2351
        WOLFSSL_ERROR_VERBOSE(SNI_UNSUPPORTED);
2352
        return SNI_UNSUPPORTED;
2353
    }
2354
2355
    ato16(clientHello + offset, &len16);
2356
    offset += OPAQUE16_LEN;
2357
2358
    if (offset + len16 > helloSz)
2359
        return INCOMPLETE_DATA;
2360
2361
    /* Handshake header */
2362
    if ((enum HandShakeType) clientHello[offset] != client_hello)
2363
        return BUFFER_ERROR;
2364
2365
    c24to32(clientHello + offset + 1, &len32);
2366
    offset += HANDSHAKE_HEADER_SZ;
2367
2368
    if (offset + len32 > helloSz)
2369
        return BUFFER_ERROR;
2370
2371
    /* client hello */
2372
    offset += VERSION_SZ + RAN_LEN; /* version, random */
2373
2374
    if (helloSz < offset + clientHello[offset])
2375
        return BUFFER_ERROR;
2376
2377
    offset += ENUM_LEN + clientHello[offset]; /* skip session id */
2378
2379
    /* cypher suites */
2380
    if (helloSz < offset + OPAQUE16_LEN)
2381
        return BUFFER_ERROR;
2382
2383
    ato16(clientHello + offset, &len16);
2384
    offset += OPAQUE16_LEN;
2385
2386
    if (helloSz < offset + len16)
2387
        return BUFFER_ERROR;
2388
2389
    offset += len16; /* skip cypher suites */
2390
2391
    /* compression methods */
2392
    if (helloSz < offset + 1)
2393
        return BUFFER_ERROR;
2394
2395
    if (helloSz < offset + clientHello[offset])
2396
        return BUFFER_ERROR;
2397
2398
    offset += ENUM_LEN + clientHello[offset]; /* skip compression methods */
2399
2400
    /* extensions */
2401
    if (helloSz < offset + OPAQUE16_LEN)
2402
        return 0; /* no extensions in client hello. */
2403
2404
    ato16(clientHello + offset, &len16);
2405
    offset += OPAQUE16_LEN;
2406
2407
    if (helloSz < offset + len16)
2408
        return BUFFER_ERROR;
2409
2410
    while (len16 >= OPAQUE16_LEN + OPAQUE16_LEN) {
2411
        word16 extType;
2412
        word16 extLen;
2413
2414
        ato16(clientHello + offset, &extType);
2415
        offset += OPAQUE16_LEN;
2416
2417
        ato16(clientHello + offset, &extLen);
2418
        offset += OPAQUE16_LEN;
2419
2420
        if (helloSz < offset + extLen)
2421
            return BUFFER_ERROR;
2422
2423
        if (extType != TLSX_SERVER_NAME) {
2424
            offset += extLen; /* skip extension */
2425
        } else {
2426
            word16 listLen;
2427
2428
            ato16(clientHello + offset, &listLen);
2429
            offset += OPAQUE16_LEN;
2430
2431
            if (helloSz < offset + listLen)
2432
                return BUFFER_ERROR;
2433
2434
            while (listLen > ENUM_LEN + OPAQUE16_LEN) {
2435
                byte   sniType = clientHello[offset++];
2436
                word16 sniLen;
2437
2438
                ato16(clientHello + offset, &sniLen);
2439
                offset += OPAQUE16_LEN;
2440
2441
                if (helloSz < offset + sniLen)
2442
                    return BUFFER_ERROR;
2443
2444
                if (sniType != type) {
2445
                    offset  += sniLen;
2446
                    listLen -= min(ENUM_LEN + OPAQUE16_LEN + sniLen, listLen);
2447
                    continue;
2448
                }
2449
2450
                *inOutSz = min(sniLen, *inOutSz);
2451
                XMEMCPY(sni, clientHello + offset, *inOutSz);
2452
2453
                return WOLFSSL_SUCCESS;
2454
            }
2455
        }
2456
2457
        len16 -= min(2 * OPAQUE16_LEN + extLen, len16);
2458
    }
2459
2460
    return len16 ? BUFFER_ERROR : 0;
2461
}
2462
2463
#endif
2464
2465
#define SNI_FREE_ALL     TLSX_SNI_FreeAll
2466
#define SNI_GET_SIZE     TLSX_SNI_GetSize
2467
#define SNI_WRITE        TLSX_SNI_Write
2468
#define SNI_PARSE        TLSX_SNI_Parse
2469
#define SNI_VERIFY_PARSE TLSX_SNI_VerifyParse
2470
2471
#else
2472
2473
#define SNI_FREE_ALL(list, heap)
2474
#define SNI_GET_SIZE(list)     0
2475
#define SNI_WRITE(a, b)        0
2476
#define SNI_PARSE(a, b, c, d)  0
2477
0
#define SNI_VERIFY_PARSE(a, b) 0
2478
2479
#endif /* HAVE_SNI */
2480
2481
/******************************************************************************/
2482
/* Trusted CA Key Indication                                                  */
2483
/******************************************************************************/
2484
2485
#ifdef HAVE_TRUSTED_CA
2486
2487
/** Creates a new TCA object. */
2488
static TCA* TLSX_TCA_New(byte type, const byte* id, word16 idSz, void* heap)
2489
{
2490
    TCA* tca = (TCA*)XMALLOC(sizeof(TCA), heap, DYNAMIC_TYPE_TLSX);
2491
2492
    if (tca) {
2493
        XMEMSET(tca, 0, sizeof(TCA));
2494
        tca->type = type;
2495
2496
        switch (type) {
2497
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2498
                break;
2499
2500
            #ifndef NO_SHA
2501
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2502
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2503
                if (idSz == WC_SHA_DIGEST_SIZE &&
2504
                        (tca->id =
2505
                            (byte*)XMALLOC(idSz, heap, DYNAMIC_TYPE_TLSX))) {
2506
                    XMEMCPY(tca->id, id, idSz);
2507
                    tca->idSz = idSz;
2508
                }
2509
                else {
2510
                    XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2511
                    tca = NULL;
2512
                }
2513
                break;
2514
            #endif
2515
2516
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2517
                if (idSz > 0 &&
2518
                        (tca->id =
2519
                            (byte*)XMALLOC(idSz, heap, DYNAMIC_TYPE_TLSX))) {
2520
                    XMEMCPY(tca->id, id, idSz);
2521
                    tca->idSz = idSz;
2522
                }
2523
                else {
2524
                    XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2525
                    tca = NULL;
2526
                }
2527
                break;
2528
2529
            default: /* invalid type */
2530
                XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2531
                tca = NULL;
2532
        }
2533
    }
2534
2535
    (void)heap;
2536
2537
    return tca;
2538
}
2539
2540
/** Releases a TCA object. */
2541
static void TLSX_TCA_Free(TCA* tca, void* heap)
2542
{
2543
    (void)heap;
2544
2545
    if (tca) {
2546
        if (tca->id)
2547
            XFREE(tca->id, heap, DYNAMIC_TYPE_TLSX);
2548
        XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2549
    }
2550
}
2551
2552
/** Releases all TCA objects in the provided list. */
2553
static void TLSX_TCA_FreeAll(TCA* list, void* heap)
2554
{
2555
    TCA* tca;
2556
2557
    while ((tca = list)) {
2558
        list = tca->next;
2559
        TLSX_TCA_Free(tca, heap);
2560
    }
2561
}
2562
2563
/** Tells the buffered size of the TCA objects in a list. */
2564
static word16 TLSX_TCA_GetSize(TCA* list)
2565
{
2566
    TCA* tca;
2567
    word16 length = OPAQUE16_LEN; /* list length */
2568
2569
    while ((tca = list)) {
2570
        list = tca->next;
2571
2572
        length += ENUM_LEN; /* tca type */
2573
2574
        switch (tca->type) {
2575
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2576
                break;
2577
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2578
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2579
                length += tca->idSz;
2580
                break;
2581
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2582
                length += OPAQUE16_LEN + tca->idSz;
2583
                break;
2584
        }
2585
    }
2586
2587
    return length;
2588
}
2589
2590
/** Writes the TCA objects of a list in a buffer. */
2591
static word16 TLSX_TCA_Write(TCA* list, byte* output)
2592
{
2593
    TCA* tca;
2594
    word16 offset = OPAQUE16_LEN; /* list length offset */
2595
2596
    while ((tca = list)) {
2597
        list = tca->next;
2598
2599
        output[offset++] = tca->type; /* tca type */
2600
2601
        switch (tca->type) {
2602
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2603
                break;
2604
            #ifndef NO_SHA
2605
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2606
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2607
                if (tca->id != NULL) {
2608
                    XMEMCPY(output + offset, tca->id, tca->idSz);
2609
                    offset += tca->idSz;
2610
                }
2611
                else {
2612
                    /* ID missing. Set to an empty string. */
2613
                    c16toa(0, output + offset);
2614
                    offset += OPAQUE16_LEN;
2615
                }
2616
                break;
2617
            #endif
2618
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2619
                if (tca->id != NULL) {
2620
                    c16toa(tca->idSz, output + offset); /* tca length */
2621
                    offset += OPAQUE16_LEN;
2622
                    XMEMCPY(output + offset, tca->id, tca->idSz);
2623
                    offset += tca->idSz;
2624
                }
2625
                else {
2626
                    /* ID missing. Set to an empty string. */
2627
                    c16toa(0, output + offset);
2628
                    offset += OPAQUE16_LEN;
2629
                }
2630
                break;
2631
            default:
2632
                /* ID unknown. Set to an empty string. */
2633
                c16toa(0, output + offset);
2634
                offset += OPAQUE16_LEN;
2635
        }
2636
    }
2637
2638
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
2639
2640
    return offset;
2641
}
2642
2643
#ifndef NO_WOLFSSL_SERVER
2644
static TCA* TLSX_TCA_Find(TCA *list, byte type, const byte* id, word16 idSz)
2645
{
2646
    TCA* tca = list;
2647
2648
    while (tca && tca->type != type && type != WOLFSSL_TRUSTED_CA_PRE_AGREED &&
2649
           idSz != tca->idSz && !XMEMCMP(id, tca->id, idSz))
2650
        tca = tca->next;
2651
2652
    return tca;
2653
}
2654
#endif /* NO_WOLFSSL_SERVER */
2655
2656
/** Parses a buffer of TCA extensions. */
2657
static int TLSX_TCA_Parse(WOLFSSL* ssl, const byte* input, word16 length,
2658
                          byte isRequest)
2659
{
2660
#ifndef NO_WOLFSSL_SERVER
2661
    word16 size = 0;
2662
    word16 offset = 0;
2663
#endif
2664
2665
    TLSX *extension = TLSX_Find(ssl->extensions, TLSX_TRUSTED_CA_KEYS);
2666
2667
    if (!extension)
2668
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_TRUSTED_CA_KEYS);
2669
2670
    if (!isRequest) {
2671
        #ifndef NO_WOLFSSL_CLIENT
2672
            if (!extension || !extension->data)
2673
                return TLSX_HandleUnsupportedExtension(ssl);
2674
2675
            if (length > 0)
2676
                return BUFFER_ERROR; /* TCA response MUST be empty. */
2677
2678
            /* Set the flag that we're good for keys */
2679
            TLSX_SetResponse(ssl, TLSX_TRUSTED_CA_KEYS);
2680
2681
            return 0;
2682
        #endif
2683
    }
2684
2685
#ifndef NO_WOLFSSL_SERVER
2686
    if (!extension || !extension->data) {
2687
        /* Skipping, TCA not enabled at server side. */
2688
        return 0;
2689
    }
2690
2691
    if (OPAQUE16_LEN > length)
2692
        return BUFFER_ERROR;
2693
2694
    ato16(input, &size);
2695
    offset += OPAQUE16_LEN;
2696
2697
    /* validating tca list length */
2698
    if (length != OPAQUE16_LEN + size)
2699
        return BUFFER_ERROR;
2700
2701
    for (size = 0; offset < length; offset += size) {
2702
        TCA *tca = NULL;
2703
        byte type;
2704
        const byte* id = NULL;
2705
        word16 idSz = 0;
2706
2707
        if (offset + ENUM_LEN > length)
2708
            return BUFFER_ERROR;
2709
2710
        type = input[offset++];
2711
2712
        switch (type) {
2713
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2714
                break;
2715
            #ifndef NO_SHA
2716
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2717
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2718
                if (offset + WC_SHA_DIGEST_SIZE > length)
2719
                    return BUFFER_ERROR;
2720
                idSz = WC_SHA_DIGEST_SIZE;
2721
                id = input + offset;
2722
                offset += idSz;
2723
                break;
2724
            #endif
2725
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2726
                if (offset + OPAQUE16_LEN > length)
2727
                    return BUFFER_ERROR;
2728
                ato16(input + offset, &idSz);
2729
                offset += OPAQUE16_LEN;
2730
                if ((offset > length) || (idSz > length - offset))
2731
                    return BUFFER_ERROR;
2732
                id = input + offset;
2733
                offset += idSz;
2734
                break;
2735
            default:
2736
                WOLFSSL_ERROR_VERBOSE(TCA_INVALID_ID_TYPE);
2737
                return TCA_INVALID_ID_TYPE;
2738
        }
2739
2740
        /* Find the type/ID in the TCA list. */
2741
        tca = TLSX_TCA_Find((TCA*)extension->data, type, id, idSz);
2742
        if (tca != NULL) {
2743
            /* Found it. Set the response flag and break out of the loop. */
2744
            TLSX_SetResponse(ssl, TLSX_TRUSTED_CA_KEYS);
2745
            break;
2746
        }
2747
    }
2748
#else
2749
    (void)input;
2750
#endif
2751
2752
    return 0;
2753
}
2754
2755
/* Checks to see if the server sent a response for the TCA. */
2756
static int TLSX_TCA_VerifyParse(WOLFSSL* ssl, byte isRequest)
2757
{
2758
    (void)ssl;
2759
2760
    if (!isRequest) {
2761
    #ifndef NO_WOLFSSL_CLIENT
2762
        TLSX* extension = TLSX_Find(ssl->extensions, TLSX_TRUSTED_CA_KEYS);
2763
2764
        if (extension && !extension->resp) {
2765
            SendAlert(ssl, alert_fatal, handshake_failure);
2766
            WOLFSSL_ERROR_VERBOSE(TCA_ABSENT_ERROR);
2767
            return TCA_ABSENT_ERROR;
2768
        }
2769
    #endif /* NO_WOLFSSL_CLIENT */
2770
    }
2771
2772
    return 0;
2773
}
2774
2775
int TLSX_UseTrustedCA(TLSX** extensions, byte type,
2776
                    const byte* id, word16 idSz, void* heap)
2777
{
2778
    TLSX* extension;
2779
    TCA* tca = NULL;
2780
2781
    if (extensions == NULL)
2782
        return BAD_FUNC_ARG;
2783
2784
    if ((tca = TLSX_TCA_New(type, id, idSz, heap)) == NULL)
2785
        return MEMORY_E;
2786
2787
    extension = TLSX_Find(*extensions, TLSX_TRUSTED_CA_KEYS);
2788
    if (!extension) {
2789
        int ret = TLSX_Push(extensions, TLSX_TRUSTED_CA_KEYS, (void*)tca, heap);
2790
2791
        if (ret != 0) {
2792
            TLSX_TCA_Free(tca, heap);
2793
            return ret;
2794
        }
2795
    }
2796
    else {
2797
        /* push new TCA object to extension data. */
2798
        tca->next = (TCA*)extension->data;
2799
        extension->data = (void*)tca;
2800
    }
2801
2802
    return WOLFSSL_SUCCESS;
2803
}
2804
2805
#define TCA_FREE_ALL     TLSX_TCA_FreeAll
2806
#define TCA_GET_SIZE     TLSX_TCA_GetSize
2807
#define TCA_WRITE        TLSX_TCA_Write
2808
#define TCA_PARSE        TLSX_TCA_Parse
2809
#define TCA_VERIFY_PARSE TLSX_TCA_VerifyParse
2810
2811
#else /* HAVE_TRUSTED_CA */
2812
2813
#define TCA_FREE_ALL(list, heap)
2814
0
#define TCA_GET_SIZE(list)     0
2815
0
#define TCA_WRITE(a, b)        0
2816
0
#define TCA_PARSE(a, b, c, d)  0
2817
0
#define TCA_VERIFY_PARSE(a, b) 0
2818
2819
#endif /* HAVE_TRUSTED_CA */
2820
2821
/******************************************************************************/
2822
/* Max Fragment Length Negotiation                                            */
2823
/******************************************************************************/
2824
2825
#ifdef HAVE_MAX_FRAGMENT
2826
2827
static word16 TLSX_MFL_Write(byte* data, byte* output)
2828
{
2829
    output[0] = data[0];
2830
2831
    return ENUM_LEN;
2832
}
2833
2834
static int TLSX_MFL_Parse(WOLFSSL* ssl, const byte* input, word16 length,
2835
                          byte isRequest)
2836
{
2837
    if (length != ENUM_LEN)
2838
        return BUFFER_ERROR;
2839
2840
#ifdef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
2841
    (void) isRequest;
2842
#else
2843
    if (!isRequest)
2844
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_MAX_FRAGMENT_LENGTH))
2845
            return TLSX_HandleUnsupportedExtension(ssl);
2846
#endif
2847
2848
    switch (*input) {
2849
        case WOLFSSL_MFL_2_8 : ssl->max_fragment =  256; break;
2850
        case WOLFSSL_MFL_2_9 : ssl->max_fragment =  512; break;
2851
        case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
2852
        case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
2853
        case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
2854
        case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
2855
2856
        default:
2857
            SendAlert(ssl, alert_fatal, illegal_parameter);
2858
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_MAX_FRAG_LEN_E);
2859
            return UNKNOWN_MAX_FRAG_LEN_E;
2860
    }
2861
2862
#ifndef NO_WOLFSSL_SERVER
2863
    if (isRequest) {
2864
        int ret = TLSX_UseMaxFragment(&ssl->extensions, *input, ssl->heap);
2865
2866
        if (ret != WOLFSSL_SUCCESS)
2867
            return ret; /* throw error */
2868
2869
        TLSX_SetResponse(ssl, TLSX_MAX_FRAGMENT_LENGTH);
2870
    }
2871
#endif
2872
2873
    return 0;
2874
}
2875
2876
int TLSX_UseMaxFragment(TLSX** extensions, byte mfl, void* heap)
2877
{
2878
    byte* data = NULL;
2879
    int ret = 0;
2880
2881
    if (extensions == NULL || mfl < WOLFSSL_MFL_MIN || mfl > WOLFSSL_MFL_MAX)
2882
        return BAD_FUNC_ARG;
2883
2884
    data = (byte*)XMALLOC(ENUM_LEN, heap, DYNAMIC_TYPE_TLSX);
2885
    if (data == NULL)
2886
        return MEMORY_E;
2887
2888
    data[0] = mfl;
2889
2890
    ret = TLSX_Push(extensions, TLSX_MAX_FRAGMENT_LENGTH, data, heap);
2891
    if (ret != 0) {
2892
        XFREE(data, heap, DYNAMIC_TYPE_TLSX);
2893
        return ret;
2894
    }
2895
2896
    return WOLFSSL_SUCCESS;
2897
}
2898
2899
2900
#define MFL_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
2901
#define MFL_GET_SIZE(data) ENUM_LEN
2902
#define MFL_WRITE          TLSX_MFL_Write
2903
#define MFL_PARSE          TLSX_MFL_Parse
2904
2905
#else
2906
2907
#define MFL_FREE_ALL(a, b)
2908
0
#define MFL_GET_SIZE(a)       0
2909
0
#define MFL_WRITE(a, b)       0
2910
0
#define MFL_PARSE(a, b, c, d) 0
2911
2912
#endif /* HAVE_MAX_FRAGMENT */
2913
2914
/******************************************************************************/
2915
/* Truncated HMAC                                                             */
2916
/******************************************************************************/
2917
2918
#ifdef HAVE_TRUNCATED_HMAC
2919
2920
static int TLSX_THM_Parse(WOLFSSL* ssl, const byte* input, word16 length,
2921
                          byte isRequest)
2922
{
2923
    if (length != 0 || input == NULL)
2924
        return BUFFER_ERROR;
2925
2926
    if (!isRequest) {
2927
    #ifndef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
2928
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_TRUNCATED_HMAC))
2929
            return TLSX_HandleUnsupportedExtension(ssl);
2930
    #endif
2931
    }
2932
    else {
2933
        #ifndef NO_WOLFSSL_SERVER
2934
            int ret = TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
2935
2936
            if (ret != WOLFSSL_SUCCESS)
2937
                return ret; /* throw error */
2938
2939
            TLSX_SetResponse(ssl, TLSX_TRUNCATED_HMAC);
2940
        #endif
2941
    }
2942
2943
    ssl->truncated_hmac = 1;
2944
2945
    return 0;
2946
}
2947
2948
int TLSX_UseTruncatedHMAC(TLSX** extensions, void* heap)
2949
{
2950
    int ret = 0;
2951
2952
    if (extensions == NULL)
2953
        return BAD_FUNC_ARG;
2954
2955
    ret = TLSX_Push(extensions, TLSX_TRUNCATED_HMAC, NULL, heap);
2956
    if (ret != 0)
2957
        return ret;
2958
2959
    return WOLFSSL_SUCCESS;
2960
}
2961
2962
#define THM_PARSE TLSX_THM_Parse
2963
2964
#else
2965
2966
0
#define THM_PARSE(a, b, c, d) 0
2967
2968
#endif /* HAVE_TRUNCATED_HMAC */
2969
2970
/******************************************************************************/
2971
/* Certificate Status Request                                                 */
2972
/******************************************************************************/
2973
2974
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST
2975
2976
static void TLSX_CSR_Free(CertificateStatusRequest* csr, void* heap)
2977
{
2978
    switch (csr->status_type) {
2979
        case WOLFSSL_CSR_OCSP:
2980
            FreeOcspRequest(&csr->request.ocsp);
2981
        break;
2982
    }
2983
2984
    XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
2985
    (void)heap;
2986
}
2987
2988
static word16 TLSX_CSR_GetSize(CertificateStatusRequest* csr, byte isRequest)
2989
{
2990
    word16 size = 0;
2991
2992
    /* shut up compiler warnings */
2993
    (void) csr; (void) isRequest;
2994
2995
#ifndef NO_WOLFSSL_CLIENT
2996
    if (isRequest) {
2997
        switch (csr->status_type) {
2998
            case WOLFSSL_CSR_OCSP:
2999
                size += ENUM_LEN + 2 * OPAQUE16_LEN;
3000
3001
                if (csr->request.ocsp.nonceSz)
3002
                    size += OCSP_NONCE_EXT_SZ;
3003
            break;
3004
        }
3005
    }
3006
#endif
3007
#if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
3008
    if (!isRequest && csr->ssl->options.tls1_3)
3009
        return OPAQUE8_LEN + OPAQUE24_LEN + csr->response.length;
3010
#endif
3011
3012
    return size;
3013
}
3014
3015
static word16 TLSX_CSR_Write(CertificateStatusRequest* csr, byte* output,
3016
                                                                 byte isRequest)
3017
{
3018
    /* shut up compiler warnings */
3019
    (void) csr; (void) output; (void) isRequest;
3020
3021
#ifndef NO_WOLFSSL_CLIENT
3022
    if (isRequest) {
3023
        word16 offset = 0;
3024
        word16 length = 0;
3025
3026
        /* type */
3027
        output[offset++] = csr->status_type;
3028
3029
        switch (csr->status_type) {
3030
            case WOLFSSL_CSR_OCSP:
3031
                /* responder id list */
3032
                c16toa(0, output + offset);
3033
                offset += OPAQUE16_LEN;
3034
3035
                /* request extensions */
3036
                if (csr->request.ocsp.nonceSz)
3037
                    length = (word16)EncodeOcspRequestExtensions(
3038
                                                 &csr->request.ocsp,
3039
                                                 output + offset + OPAQUE16_LEN,
3040
                                                 OCSP_NONCE_EXT_SZ);
3041
3042
                c16toa(length, output + offset);
3043
                offset += OPAQUE16_LEN + length;
3044
3045
            break;
3046
        }
3047
3048
        return offset;
3049
    }
3050
#endif
3051
#if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
3052
    if (!isRequest && csr->ssl->options.tls1_3) {
3053
        word16 offset = 0;
3054
        output[offset++] = csr->status_type;
3055
        c32to24(csr->response.length, output + offset);
3056
        offset += OPAQUE24_LEN;
3057
        XMEMCPY(output + offset, csr->response.buffer, csr->response.length);
3058
        offset += csr->response.length;
3059
        return offset;
3060
    }
3061
#endif
3062
3063
    return 0;
3064
}
3065
3066
static int TLSX_CSR_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3067
                          byte isRequest)
3068
{
3069
    int ret;
3070
#if !defined(NO_WOLFSSL_SERVER)
3071
    byte status_type;
3072
    word16 size = 0;
3073
#if defined(WOLFSSL_TLS13)
3074
    DecodedCert* cert;
3075
#endif
3076
#endif
3077
3078
#if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) \
3079
    && defined(WOLFSSL_TLS13)
3080
    OcspRequest* request;
3081
    TLSX* extension;
3082
    CertificateStatusRequest* csr;
3083
#endif
3084
3085
#if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13) \
3086
 || !defined(NO_WOLFSSL_SERVER)
3087
    word32 offset = 0;
3088
#endif
3089
3090
#if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13)
3091
    word32 resp_length = 0;
3092
#endif
3093
3094
    /* shut up compiler warnings */
3095
    (void) ssl; (void) input;
3096
3097
    if (!isRequest) {
3098
#ifndef NO_WOLFSSL_CLIENT
3099
        extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3100
        csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3101
3102
        if (!csr) {
3103
            /* look at context level */
3104
            extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST);
3105
            csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3106
3107
            if (!csr) /* unexpected extension */
3108
                return TLSX_HandleUnsupportedExtension(ssl);
3109
3110
            /* enable extension at ssl level */
3111
            ret = TLSX_UseCertificateStatusRequest(&ssl->extensions,
3112
                                     csr->status_type, csr->options, ssl,
3113
                                     ssl->heap, ssl->devId);
3114
            if (ret != WOLFSSL_SUCCESS)
3115
                return ret;
3116
3117
            switch (csr->status_type) {
3118
                case WOLFSSL_CSR_OCSP:
3119
                    /* propagate nonce */
3120
                    if (csr->request.ocsp.nonceSz) {
3121
                        request =
3122
                            (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
3123
3124
                        if (request) {
3125
                            XMEMCPY(request->nonce, csr->request.ocsp.nonce,
3126
                                                    csr->request.ocsp.nonceSz);
3127
                            request->nonceSz = csr->request.ocsp.nonceSz;
3128
                        }
3129
                    }
3130
                break;
3131
            }
3132
        }
3133
3134
        ssl->status_request = 1;
3135
3136
    #ifdef WOLFSSL_TLS13
3137
        if (ssl->options.tls1_3) {
3138
            /* Get the new extension potentially created above. */
3139
            extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3140
            csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3141
            if (csr == NULL)
3142
                return MEMORY_ERROR;
3143
3144
            ret = 0;
3145
            if (OPAQUE8_LEN + OPAQUE24_LEN > length)
3146
                ret = BUFFER_ERROR;
3147
            if (ret == 0 && input[offset++] != WOLFSSL_CSR_OCSP) {
3148
                ret = BAD_CERTIFICATE_STATUS_ERROR;
3149
                WOLFSSL_ERROR_VERBOSE(ret);
3150
            }
3151
            if (ret == 0) {
3152
                c24to32(input + offset, &resp_length);
3153
                offset += OPAQUE24_LEN;
3154
                if (offset + resp_length != length)
3155
                    ret = BUFFER_ERROR;
3156
            }
3157
            if (ret == 0) {
3158
                csr->response.buffer = (byte*)(input + offset);
3159
                csr->response.length = resp_length;
3160
            }
3161
3162
            return ret;
3163
        }
3164
        else
3165
    #endif
3166
        {
3167
            /* extension_data MUST be empty. */
3168
            return length ? BUFFER_ERROR : 0;
3169
        }
3170
#endif
3171
    }
3172
    else {
3173
#ifndef NO_WOLFSSL_SERVER
3174
        if (length == 0)
3175
            return 0;
3176
3177
        status_type = input[offset++];
3178
3179
        switch (status_type) {
3180
            case WOLFSSL_CSR_OCSP: {
3181
3182
                /* skip responder_id_list */
3183
                if ((int)(length - offset) < OPAQUE16_LEN)
3184
                    return BUFFER_ERROR;
3185
3186
                ato16(input + offset, &size);
3187
                offset += OPAQUE16_LEN + size;
3188
3189
                /* skip request_extensions */
3190
                if ((int)(length - offset) < OPAQUE16_LEN)
3191
                    return BUFFER_ERROR;
3192
3193
                ato16(input + offset, &size);
3194
                offset += OPAQUE16_LEN + size;
3195
3196
                if (offset > length)
3197
                    return BUFFER_ERROR;
3198
3199
                /* is able to send OCSP response? */
3200
                if (SSL_CM(ssl) == NULL || !SSL_CM(ssl)->ocspStaplingEnabled)
3201
                    return 0;
3202
            }
3203
            break;
3204
3205
            /* unknown status type */
3206
            default:
3207
                return 0;
3208
        }
3209
3210
        /* if using status_request and already sending it, skip this one */
3211
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
3212
        if (ssl->status_request_v2)
3213
            return 0;
3214
        #endif
3215
3216
        /* accept the first good status_type and return */
3217
        ret = TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
3218
                                                 0, ssl, ssl->heap, ssl->devId);
3219
        if (ret != WOLFSSL_SUCCESS)
3220
            return ret; /* throw error */
3221
3222
    #if defined(WOLFSSL_TLS13)
3223
        if (ssl->options.tls1_3) {
3224
            if (ssl->buffers.certificate == NULL) {
3225
                WOLFSSL_MSG("Certificate buffer not set!");
3226
                return BUFFER_ERROR;
3227
            }
3228
            cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
3229
                                         DYNAMIC_TYPE_DCERT);
3230
            if (cert == NULL) {
3231
                return MEMORY_E;
3232
            }
3233
            InitDecodedCert(cert, ssl->buffers.certificate->buffer,
3234
                            ssl->buffers.certificate->length, ssl->heap);
3235
            ret = ParseCert(cert, CERT_TYPE, 1, SSL_CM(ssl));
3236
            if (ret != 0 ) {
3237
                XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
3238
                return ret;
3239
            }
3240
            ret = TLSX_CSR_InitRequest(ssl->extensions, cert, ssl->heap);
3241
            if (ret != 0 ) {
3242
                XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
3243
                return ret;
3244
            }
3245
            XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
3246
3247
            extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3248
            csr = extension ?
3249
                (CertificateStatusRequest*)extension->data : NULL;
3250
            if (csr == NULL)
3251
                return MEMORY_ERROR;
3252
3253
            request = &csr->request.ocsp;
3254
            ret = CreateOcspResponse(ssl, &request, &csr->response);
3255
            if (ret != 0)
3256
                return ret;
3257
            if (csr->response.buffer)
3258
                TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
3259
        }
3260
        else
3261
    #endif
3262
            TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
3263
        ssl->status_request = status_type;
3264
#endif
3265
    }
3266
3267
    return 0;
3268
}
3269
3270
int TLSX_CSR_InitRequest(TLSX* extensions, DecodedCert* cert, void* heap)
3271
{
3272
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
3273
    CertificateStatusRequest* csr = extension ?
3274
        (CertificateStatusRequest*)extension->data : NULL;
3275
    int ret = 0;
3276
3277
    if (csr) {
3278
        switch (csr->status_type) {
3279
            case WOLFSSL_CSR_OCSP: {
3280
                byte nonce[MAX_OCSP_NONCE_SZ];
3281
                int  nonceSz = csr->request.ocsp.nonceSz;
3282
3283
                /* preserve nonce */
3284
                XMEMCPY(nonce, csr->request.ocsp.nonce, nonceSz);
3285
3286
                if ((ret = InitOcspRequest(&csr->request.ocsp, cert, 0, heap))
3287
                                                                           != 0)
3288
                    return ret;
3289
3290
                /* restore nonce */
3291
                XMEMCPY(csr->request.ocsp.nonce, nonce, nonceSz);
3292
                csr->request.ocsp.nonceSz = nonceSz;
3293
            }
3294
            break;
3295
        }
3296
    }
3297
3298
    return ret;
3299
}
3300
3301
void* TLSX_CSR_GetRequest(TLSX* extensions)
3302
{
3303
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
3304
    CertificateStatusRequest* csr = extension ?
3305
                              (CertificateStatusRequest*)extension->data : NULL;
3306
3307
    if (csr) {
3308
        switch (csr->status_type) {
3309
            case WOLFSSL_CSR_OCSP:
3310
                return &csr->request.ocsp;
3311
        }
3312
    }
3313
3314
    return NULL;
3315
}
3316
3317
int TLSX_CSR_ForceRequest(WOLFSSL* ssl)
3318
{
3319
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3320
    CertificateStatusRequest* csr = extension ?
3321
                              (CertificateStatusRequest*)extension->data : NULL;
3322
3323
    if (csr) {
3324
        switch (csr->status_type) {
3325
            case WOLFSSL_CSR_OCSP:
3326
                if (SSL_CM(ssl)->ocspEnabled) {
3327
                    csr->request.ocsp.ssl = ssl;
3328
                    return CheckOcspRequest(SSL_CM(ssl)->ocsp,
3329
                                                      &csr->request.ocsp, NULL);
3330
                }
3331
                else {
3332
                    WOLFSSL_ERROR_VERBOSE(OCSP_LOOKUP_FAIL);
3333
                    return OCSP_LOOKUP_FAIL;
3334
                }
3335
        }
3336
    }
3337
3338
    return 0;
3339
}
3340
3341
int TLSX_UseCertificateStatusRequest(TLSX** extensions, byte status_type,
3342
                                         byte options, WOLFSSL* ssl, void* heap,
3343
                                                                      int devId)
3344
{
3345
    CertificateStatusRequest* csr = NULL;
3346
    int ret = 0;
3347
3348
    if (!extensions || status_type != WOLFSSL_CSR_OCSP)
3349
        return BAD_FUNC_ARG;
3350
3351
    csr = (CertificateStatusRequest*)
3352
             XMALLOC(sizeof(CertificateStatusRequest), heap, DYNAMIC_TYPE_TLSX);
3353
    if (!csr)
3354
        return MEMORY_E;
3355
3356
    ForceZero(csr, sizeof(CertificateStatusRequest));
3357
3358
    csr->status_type = status_type;
3359
    csr->options     = options;
3360
    csr->ssl         = ssl;
3361
3362
    switch (csr->status_type) {
3363
        case WOLFSSL_CSR_OCSP:
3364
            if (options & WOLFSSL_CSR_OCSP_USE_NONCE) {
3365
                WC_RNG rng;
3366
3367
            #ifndef HAVE_FIPS
3368
                ret = wc_InitRng_ex(&rng, heap, devId);
3369
            #else
3370
                ret = wc_InitRng(&rng);
3371
                (void)devId;
3372
            #endif
3373
                if (ret == 0) {
3374
                    if (wc_RNG_GenerateBlock(&rng, csr->request.ocsp.nonce,
3375
                                                        MAX_OCSP_NONCE_SZ) == 0)
3376
                        csr->request.ocsp.nonceSz = MAX_OCSP_NONCE_SZ;
3377
3378
                    wc_FreeRng(&rng);
3379
                }
3380
            }
3381
        break;
3382
    }
3383
3384
    if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST, csr, heap)) != 0) {
3385
        XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
3386
        return ret;
3387
    }
3388
3389
    return WOLFSSL_SUCCESS;
3390
}
3391
3392
#define CSR_FREE_ALL TLSX_CSR_Free
3393
#define CSR_GET_SIZE TLSX_CSR_GetSize
3394
#define CSR_WRITE    TLSX_CSR_Write
3395
#define CSR_PARSE    TLSX_CSR_Parse
3396
3397
#else
3398
3399
#define CSR_FREE_ALL(data, heap)
3400
0
#define CSR_GET_SIZE(a, b)    0
3401
0
#define CSR_WRITE(a, b, c)    0
3402
0
#define CSR_PARSE(a, b, c, d) 0
3403
3404
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
3405
3406
/******************************************************************************/
3407
/* Certificate Status Request v2                                              */
3408
/******************************************************************************/
3409
3410
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
3411
3412
static void TLSX_CSR2_FreeAll(CertificateStatusRequestItemV2* csr2, void* heap)
3413
{
3414
    CertificateStatusRequestItemV2* next;
3415
3416
    for (; csr2; csr2 = next) {
3417
        next = csr2->next;
3418
3419
        switch (csr2->status_type) {
3420
            case WOLFSSL_CSR2_OCSP:
3421
            case WOLFSSL_CSR2_OCSP_MULTI:
3422
                while(csr2->requests--)
3423
                    FreeOcspRequest(&csr2->request.ocsp[csr2->requests]);
3424
            break;
3425
        }
3426
3427
        XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
3428
    }
3429
    (void)heap;
3430
}
3431
3432
static word16 TLSX_CSR2_GetSize(CertificateStatusRequestItemV2* csr2,
3433
                                                                 byte isRequest)
3434
{
3435
    word16 size = 0;
3436
3437
    /* shut up compiler warnings */
3438
    (void) csr2; (void) isRequest;
3439
3440
#ifndef NO_WOLFSSL_CLIENT
3441
    if (isRequest) {
3442
        CertificateStatusRequestItemV2* next;
3443
3444
        for (size = OPAQUE16_LEN; csr2; csr2 = next) {
3445
            next = csr2->next;
3446
3447
            switch (csr2->status_type) {
3448
                case WOLFSSL_CSR2_OCSP:
3449
                case WOLFSSL_CSR2_OCSP_MULTI:
3450
                    size += ENUM_LEN + 3 * OPAQUE16_LEN;
3451
3452
                    if (csr2->request.ocsp[0].nonceSz)
3453
                        size += OCSP_NONCE_EXT_SZ;
3454
                break;
3455
            }
3456
        }
3457
    }
3458
#endif
3459
3460
    return size;
3461
}
3462
3463
static word16 TLSX_CSR2_Write(CertificateStatusRequestItemV2* csr2,
3464
                                                   byte* output, byte isRequest)
3465
{
3466
    /* shut up compiler warnings */
3467
    (void) csr2; (void) output; (void) isRequest;
3468
3469
#ifndef NO_WOLFSSL_CLIENT
3470
    if (isRequest) {
3471
        word16 offset;
3472
        word16 length;
3473
3474
        for (offset = OPAQUE16_LEN; csr2 != NULL; csr2 = csr2->next) {
3475
            /* status_type */
3476
            output[offset++] = csr2->status_type;
3477
3478
            /* request */
3479
            switch (csr2->status_type) {
3480
                case WOLFSSL_CSR2_OCSP:
3481
                case WOLFSSL_CSR2_OCSP_MULTI:
3482
                    /* request_length */
3483
                    length = 2 * OPAQUE16_LEN;
3484
3485
                    if (csr2->request.ocsp[0].nonceSz)
3486
                        length += OCSP_NONCE_EXT_SZ;
3487
3488
                    c16toa(length, output + offset);
3489
                    offset += OPAQUE16_LEN;
3490
3491
                    /* responder id list */
3492
                    c16toa(0, output + offset);
3493
                    offset += OPAQUE16_LEN;
3494
3495
                    /* request extensions */
3496
                    length = 0;
3497
3498
                    if (csr2->request.ocsp[0].nonceSz)
3499
                        length = (word16)EncodeOcspRequestExtensions(
3500
                                                 &csr2->request.ocsp[0],
3501
                                                 output + offset + OPAQUE16_LEN,
3502
                                                 OCSP_NONCE_EXT_SZ);
3503
3504
                    c16toa(length, output + offset);
3505
                    offset += OPAQUE16_LEN + length;
3506
                break;
3507
            }
3508
        }
3509
3510
        /* list size */
3511
        c16toa(offset - OPAQUE16_LEN, output);
3512
3513
        return offset;
3514
    }
3515
#endif
3516
3517
    return 0;
3518
}
3519
3520
static int TLSX_CSR2_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3521
                           byte isRequest)
3522
{
3523
    int ret;
3524
3525
    /* shut up compiler warnings */
3526
    (void) ssl; (void) input;
3527
3528
    if (!isRequest) {
3529
#ifndef NO_WOLFSSL_CLIENT
3530
        TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
3531
        CertificateStatusRequestItemV2* csr2 = extension ?
3532
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
3533
3534
        if (!csr2) {
3535
            /* look at context level */
3536
            extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST_V2);
3537
            csr2 = extension ?
3538
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
3539
3540
            if (!csr2) /* unexpected extension */
3541
                return TLSX_HandleUnsupportedExtension(ssl);
3542
3543
            /* enable extension at ssl level */
3544
            for (; csr2; csr2 = csr2->next) {
3545
                ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
3546
                                    csr2->status_type, csr2->options, ssl->heap,
3547
                                                                    ssl->devId);
3548
                if (ret != WOLFSSL_SUCCESS)
3549
                    return ret;
3550
3551
                switch (csr2->status_type) {
3552
                    case WOLFSSL_CSR2_OCSP:
3553
                        /* followed by */
3554
                    case WOLFSSL_CSR2_OCSP_MULTI:
3555
                        /* propagate nonce */
3556
                        if (csr2->request.ocsp[0].nonceSz) {
3557
                            OcspRequest* request =
3558
                             (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
3559
                                                          csr2->status_type, 0);
3560
3561
                            if (request) {
3562
                                XMEMCPY(request->nonce,
3563
                                        csr2->request.ocsp[0].nonce,
3564
                                        csr2->request.ocsp[0].nonceSz);
3565
3566
                                request->nonceSz =
3567
                                                  csr2->request.ocsp[0].nonceSz;
3568
                            }
3569
                        }
3570
                    break;
3571
                }
3572
            }
3573
        }
3574
3575
        ssl->status_request_v2 = 1;
3576
3577
        return length ? BUFFER_ERROR : 0; /* extension_data MUST be empty. */
3578
#endif
3579
    }
3580
    else {
3581
#ifndef NO_WOLFSSL_SERVER
3582
        byte   status_type;
3583
        word16 request_length;
3584
        word16 offset = 0;
3585
        word16 size = 0;
3586
3587
        /* list size */
3588
        if (offset + OPAQUE16_LEN >= length) {
3589
            return BUFFER_E;
3590
        }
3591
3592
        ato16(input + offset, &request_length);
3593
        offset += OPAQUE16_LEN;
3594
3595
        if (length - OPAQUE16_LEN != request_length)
3596
            return BUFFER_ERROR;
3597
3598
        while (length > offset) {
3599
            if ((int)(length - offset) < ENUM_LEN + OPAQUE16_LEN)
3600
                return BUFFER_ERROR;
3601
3602
            status_type = input[offset++];
3603
3604
            ato16(input + offset, &request_length);
3605
            offset += OPAQUE16_LEN;
3606
3607
            if (length - offset < request_length)
3608
                return BUFFER_ERROR;
3609
3610
            switch (status_type) {
3611
                case WOLFSSL_CSR2_OCSP:
3612
                case WOLFSSL_CSR2_OCSP_MULTI:
3613
                    /* skip responder_id_list */
3614
                    if ((int)(length - offset) < OPAQUE16_LEN)
3615
                        return BUFFER_ERROR;
3616
3617
                    ato16(input + offset, &size);
3618
                    if (length - offset < size)
3619
                        return BUFFER_ERROR;
3620
3621
                    offset += OPAQUE16_LEN + size;
3622
                    /* skip request_extensions */
3623
                    if ((int)(length - offset) < OPAQUE16_LEN)
3624
                        return BUFFER_ERROR;
3625
3626
                    ato16(input + offset, &size);
3627
                    if (length - offset < size)
3628
                        return BUFFER_ERROR;
3629
3630
                    offset += OPAQUE16_LEN + size;
3631
                    if (offset > length)
3632
                        return BUFFER_ERROR;
3633
3634
                    /* is able to send OCSP response? */
3635
                    if (SSL_CM(ssl) == NULL
3636
                    || !SSL_CM(ssl)->ocspStaplingEnabled)
3637
                        continue;
3638
                break;
3639
3640
                default:
3641
                    /* unknown status type, skipping! */
3642
                    offset += request_length;
3643
                    continue;
3644
            }
3645
3646
            /* if using status_request and already sending it, remove it
3647
             * and prefer to use the v2 version */
3648
            #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
3649
            if (ssl->status_request) {
3650
                ssl->status_request = 0;
3651
                TLSX_Remove(&ssl->extensions, TLSX_STATUS_REQUEST, ssl->heap);
3652
            }
3653
            #endif
3654
3655
            /* TLS 1.3 servers MUST NOT act upon presence or information in
3656
             * this extension (RFC 8448 Section 4.4.2.1).
3657
             */
3658
            if (!IsAtLeastTLSv1_3(ssl->version)) {
3659
                /* accept the first good status_type and return */
3660
                ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
3661
                                         status_type, 0, ssl->heap, ssl->devId);
3662
                if (ret != WOLFSSL_SUCCESS)
3663
                    return ret; /* throw error */
3664
3665
                TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST_V2);
3666
                ssl->status_request_v2 = status_type;
3667
            }
3668
3669
            return 0;
3670
        }
3671
#endif
3672
    }
3673
3674
    return 0;
3675
}
3676
3677
int TLSX_CSR2_InitRequests(TLSX* extensions, DecodedCert* cert, byte isPeer,
3678
                                                                     void* heap)
3679
{
3680
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
3681
    CertificateStatusRequestItemV2* csr2 = extension ?
3682
        (CertificateStatusRequestItemV2*)extension->data : NULL;
3683
    int ret = 0;
3684
3685
    for (; csr2; csr2 = csr2->next) {
3686
        switch (csr2->status_type) {
3687
            case WOLFSSL_CSR2_OCSP:
3688
                if (!isPeer || csr2->requests != 0)
3689
                    break;
3690
3691
                FALL_THROUGH; /* followed by */
3692
3693
            case WOLFSSL_CSR2_OCSP_MULTI: {
3694
                if (csr2->requests < 1 + MAX_CHAIN_DEPTH) {
3695
                    byte nonce[MAX_OCSP_NONCE_SZ];
3696
                    int  nonceSz = csr2->request.ocsp[0].nonceSz;
3697
3698
                    /* preserve nonce, replicating nonce of ocsp[0] */
3699
                    XMEMCPY(nonce, csr2->request.ocsp[0].nonce, nonceSz);
3700
3701
                    if ((ret = InitOcspRequest(
3702
                                      &csr2->request.ocsp[csr2->requests], cert,
3703
                                                                 0, heap)) != 0)
3704
                        return ret;
3705
3706
                    /* restore nonce */
3707
                    XMEMCPY(csr2->request.ocsp[csr2->requests].nonce,
3708
                                                                nonce, nonceSz);
3709
                    csr2->request.ocsp[csr2->requests].nonceSz = nonceSz;
3710
                    csr2->requests++;
3711
                }
3712
            }
3713
            break;
3714
        }
3715
    }
3716
3717
    (void)cert;
3718
    return ret;
3719
}
3720
3721
void* TLSX_CSR2_GetRequest(TLSX* extensions, byte status_type, byte idx)
3722
{
3723
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
3724
    CertificateStatusRequestItemV2* csr2 = extension ?
3725
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
3726
3727
    for (; csr2; csr2 = csr2->next) {
3728
        if (csr2->status_type == status_type) {
3729
            switch (csr2->status_type) {
3730
                case WOLFSSL_CSR2_OCSP:
3731
                    /* followed by */
3732
3733
                case WOLFSSL_CSR2_OCSP_MULTI:
3734
                    /* requests are initialized in the reverse order */
3735
                    return idx < csr2->requests
3736
                         ? &csr2->request.ocsp[csr2->requests - idx - 1]
3737
                         : NULL;
3738
            }
3739
        }
3740
    }
3741
3742
    return NULL;
3743
}
3744
3745
int TLSX_CSR2_ForceRequest(WOLFSSL* ssl)
3746
{
3747
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
3748
    CertificateStatusRequestItemV2* csr2 = extension ?
3749
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
3750
3751
    /* forces only the first one */
3752
    if (csr2) {
3753
        switch (csr2->status_type) {
3754
            case WOLFSSL_CSR2_OCSP:
3755
                /* followed by */
3756
3757
            case WOLFSSL_CSR2_OCSP_MULTI:
3758
                if (SSL_CM(ssl)->ocspEnabled) {
3759
                    csr2->request.ocsp[0].ssl = ssl;
3760
                    return CheckOcspRequest(SSL_CM(ssl)->ocsp,
3761
                                                  &csr2->request.ocsp[0], NULL);
3762
                }
3763
                else {
3764
                    WOLFSSL_ERROR_VERBOSE(OCSP_LOOKUP_FAIL);
3765
                    return OCSP_LOOKUP_FAIL;
3766
                }
3767
        }
3768
    }
3769
3770
    return 0;
3771
}
3772
3773
int TLSX_UseCertificateStatusRequestV2(TLSX** extensions, byte status_type,
3774
                                           byte options, void* heap, int devId)
3775
{
3776
    TLSX* extension = NULL;
3777
    CertificateStatusRequestItemV2* csr2 = NULL;
3778
    int ret = 0;
3779
3780
    if (!extensions)
3781
        return BAD_FUNC_ARG;
3782
3783
    if (status_type != WOLFSSL_CSR2_OCSP
3784
    &&  status_type != WOLFSSL_CSR2_OCSP_MULTI)
3785
        return BAD_FUNC_ARG;
3786
3787
    csr2 = (CertificateStatusRequestItemV2*)
3788
       XMALLOC(sizeof(CertificateStatusRequestItemV2), heap, DYNAMIC_TYPE_TLSX);
3789
    if (!csr2)
3790
        return MEMORY_E;
3791
3792
    ForceZero(csr2, sizeof(CertificateStatusRequestItemV2));
3793
3794
    csr2->status_type = status_type;
3795
    csr2->options     = options;
3796
    csr2->next        = NULL;
3797
3798
    switch (csr2->status_type) {
3799
        case WOLFSSL_CSR2_OCSP:
3800
        case WOLFSSL_CSR2_OCSP_MULTI:
3801
            if (options & WOLFSSL_CSR2_OCSP_USE_NONCE) {
3802
                WC_RNG rng;
3803
3804
            #ifndef HAVE_FIPS
3805
                ret = wc_InitRng_ex(&rng, heap, devId);
3806
            #else
3807
                ret = wc_InitRng(&rng);
3808
                (void)devId;
3809
            #endif
3810
                if (ret == 0) {
3811
                    if (wc_RNG_GenerateBlock(&rng, csr2->request.ocsp[0].nonce,
3812
                                                        MAX_OCSP_NONCE_SZ) == 0)
3813
                        csr2->request.ocsp[0].nonceSz = MAX_OCSP_NONCE_SZ;
3814
3815
                    wc_FreeRng(&rng);
3816
                }
3817
            }
3818
        break;
3819
    }
3820
3821
    /* append new item */
3822
    if ((extension = TLSX_Find(*extensions, TLSX_STATUS_REQUEST_V2))) {
3823
        CertificateStatusRequestItemV2* last =
3824
                               (CertificateStatusRequestItemV2*)extension->data;
3825
3826
        for (; last->next; last = last->next);
3827
3828
        last->next = csr2;
3829
    }
3830
    else if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST_V2, csr2,heap))) {
3831
        XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
3832
        return ret;
3833
    }
3834
3835
    return WOLFSSL_SUCCESS;
3836
}
3837
3838
#define CSR2_FREE_ALL TLSX_CSR2_FreeAll
3839
#define CSR2_GET_SIZE TLSX_CSR2_GetSize
3840
#define CSR2_WRITE    TLSX_CSR2_Write
3841
#define CSR2_PARSE    TLSX_CSR2_Parse
3842
3843
#else
3844
3845
#define CSR2_FREE_ALL(data, heap)
3846
0
#define CSR2_GET_SIZE(a, b)    0
3847
0
#define CSR2_WRITE(a, b, c)    0
3848
0
#define CSR2_PARSE(a, b, c, d) 0
3849
3850
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
3851
3852
/******************************************************************************/
3853
/* Supported Elliptic Curves                                                  */
3854
/******************************************************************************/
3855
3856
#ifdef HAVE_SUPPORTED_CURVES
3857
3858
#if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448) \
3859
                       && !defined(HAVE_FFDHE) && !defined(HAVE_PQC)
3860
#error Elliptic Curves Extension requires Elliptic Curve Cryptography or liboqs groups. \
3861
       Use --enable-ecc and/or --enable-liboqs in the configure script or \
3862
       define HAVE_ECC. Alternatively use FFDHE for DH ciphersuites.
3863
#endif
3864
3865
static int TLSX_SupportedCurve_New(SupportedCurve** curve, word16 name,
3866
                                                                     void* heap)
3867
0
{
3868
0
    if (curve == NULL)
3869
0
        return BAD_FUNC_ARG;
3870
3871
0
    (void)heap;
3872
3873
0
    *curve = (SupportedCurve*)XMALLOC(sizeof(SupportedCurve), heap,
3874
0
                                                             DYNAMIC_TYPE_TLSX);
3875
0
    if (*curve == NULL)
3876
0
        return MEMORY_E;
3877
3878
0
    (*curve)->name = name;
3879
0
    (*curve)->next = NULL;
3880
3881
0
    return 0;
3882
0
}
3883
3884
static int TLSX_PointFormat_New(PointFormat** point, byte format, void* heap)
3885
0
{
3886
0
    if (point == NULL)
3887
0
        return BAD_FUNC_ARG;
3888
3889
0
    (void)heap;
3890
3891
0
    *point = (PointFormat*)XMALLOC(sizeof(PointFormat), heap,
3892
0
                                                             DYNAMIC_TYPE_TLSX);
3893
0
    if (*point == NULL)
3894
0
        return MEMORY_E;
3895
3896
0
    (*point)->format = format;
3897
0
    (*point)->next = NULL;
3898
3899
0
    return 0;
3900
0
}
3901
3902
static void TLSX_SupportedCurve_FreeAll(SupportedCurve* list, void* heap)
3903
0
{
3904
0
    SupportedCurve* curve;
3905
3906
0
    while ((curve = list)) {
3907
0
        list = curve->next;
3908
0
        XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
3909
0
    }
3910
0
    (void)heap;
3911
0
}
3912
3913
static void TLSX_PointFormat_FreeAll(PointFormat* list, void* heap)
3914
0
{
3915
0
    PointFormat* point;
3916
3917
0
    while ((point = list)) {
3918
0
        list = point->next;
3919
0
        XFREE(point, heap, DYNAMIC_TYPE_TLSX);
3920
0
    }
3921
0
    (void)heap;
3922
0
}
3923
3924
static int TLSX_SupportedCurve_Append(SupportedCurve* list, word16 name,
3925
                                                                     void* heap)
3926
0
{
3927
0
    int ret = BAD_FUNC_ARG;
3928
3929
0
    while (list) {
3930
0
        if (list->name == name) {
3931
0
            ret = 0; /* curve already in use */
3932
0
            break;
3933
0
        }
3934
3935
0
        if (list->next == NULL) {
3936
0
            ret = TLSX_SupportedCurve_New(&list->next, name, heap);
3937
0
            break;
3938
0
        }
3939
3940
0
        list = list->next;
3941
0
    }
3942
3943
0
    return ret;
3944
0
}
3945
3946
static int TLSX_PointFormat_Append(PointFormat* list, byte format, void* heap)
3947
0
{
3948
0
    int ret = BAD_FUNC_ARG;
3949
3950
0
    while (list) {
3951
0
        if (list->format == format) {
3952
0
            ret = 0; /* format already in use */
3953
0
            break;
3954
0
        }
3955
3956
0
        if (list->next == NULL) {
3957
0
            ret = TLSX_PointFormat_New(&list->next, format, heap);
3958
0
            break;
3959
0
        }
3960
3961
0
        list = list->next;
3962
0
    }
3963
3964
0
    return ret;
3965
0
}
3966
3967
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
3968
3969
#if defined(HAVE_FFDHE) && (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
3970
                                                         defined(HAVE_CURVE448))
3971
static void TLSX_SupportedCurve_ValidateRequest(const WOLFSSL* ssl,
3972
                                                const byte* semaphore)
3973
0
{
3974
    /* If all pre-defined parameter types for key exchange are supported then
3975
     * always send SupportedGroups extension.
3976
     */
3977
0
    (void)ssl;
3978
0
    (void)semaphore;
3979
0
}
3980
#else
3981
static void TLSX_SupportedCurve_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
3982
{
3983
    word16 i;
3984
    const Suites* suites = WOLFSSL_SUITES(ssl);
3985
3986
    for (i = 0; i < suites->suiteSz; i += 2) {
3987
        if (suites->suites[i] == TLS13_BYTE)
3988
            return;
3989
        if ((suites->suites[i] == ECC_BYTE) ||
3990
            (suites->suites[i] == ECDHE_PSK_BYTE) ||
3991
            (suites->suites[i] == CHACHA_BYTE)) {
3992
        #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
3993
                                                          defined(HAVE_CURVE448)
3994
            return;
3995
        #endif
3996
        }
3997
        #ifdef HAVE_FFDHE
3998
        else {
3999
            return;
4000
        }
4001
        #endif
4002
    }
4003
4004
    /* turns semaphore on to avoid sending this extension. */
4005
    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
4006
}
4007
#endif
4008
4009
/* Only send PointFormats if TLSv13, ECC or CHACHA cipher suite present.
4010
 */
4011
static void TLSX_PointFormat_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
4012
0
{
4013
0
#ifdef HAVE_FFDHE
4014
0
    (void)ssl;
4015
0
    (void)semaphore;
4016
#else
4017
    word16 i;
4018
    const Suites* suites = WOLFSSL_SUITES(ssl);
4019
4020
    if (suites == NULL)
4021
        return;
4022
4023
    for (i = 0; i < suites->suiteSz; i += 2) {
4024
        if (suites->suites[i] == TLS13_BYTE)
4025
            return;
4026
        if ((suites->suites[i] == ECC_BYTE) ||
4027
            (suites->suites[i] == ECDHE_PSK_BYTE) ||
4028
            (suites->suites[i] == CHACHA_BYTE)) {
4029
        #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4030
                                                          defined(HAVE_CURVE448)
4031
            return;
4032
        #endif
4033
        }
4034
    }
4035
   /* turns semaphore on to avoid sending this extension. */
4036
   TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
4037
#endif
4038
0
}
4039
4040
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
4041
4042
#ifndef NO_WOLFSSL_SERVER
4043
4044
static void TLSX_PointFormat_ValidateResponse(WOLFSSL* ssl, byte* semaphore)
4045
0
{
4046
0
#if defined(HAVE_FFDHE) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4047
0
                                                          defined(HAVE_CURVE448)
4048
0
    (void)semaphore;
4049
0
#endif
4050
4051
0
    if (ssl->options.cipherSuite0 == TLS13_BYTE)
4052
0
        return;
4053
0
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
4054
0
    if (ssl->options.cipherSuite0 == ECC_BYTE ||
4055
0
        ssl->options.cipherSuite0 == ECDHE_PSK_BYTE ||
4056
0
        ssl->options.cipherSuite0 == CHACHA_BYTE) {
4057
0
        return;
4058
0
    }
4059
0
#endif
4060
4061
    /* turns semaphore on to avoid sending this extension. */
4062
0
    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
4063
0
}
4064
4065
#endif /* !NO_WOLFSSL_SERVER */
4066
4067
#ifndef NO_WOLFSSL_CLIENT
4068
4069
static word16 TLSX_SupportedCurve_GetSize(SupportedCurve* list)
4070
0
{
4071
0
    SupportedCurve* curve;
4072
0
    word16 length = OPAQUE16_LEN; /* list length */
4073
4074
0
    while ((curve = list)) {
4075
0
        list = curve->next;
4076
0
        length += OPAQUE16_LEN; /* curve length */
4077
0
    }
4078
4079
0
    return length;
4080
0
}
4081
4082
#endif
4083
4084
static word16 TLSX_PointFormat_GetSize(PointFormat* list)
4085
0
{
4086
0
    PointFormat* point;
4087
0
    word16 length = ENUM_LEN; /* list length */
4088
4089
0
    while ((point = list)) {
4090
0
        list = point->next;
4091
0
        length += ENUM_LEN; /* format length */
4092
0
    }
4093
4094
0
    return length;
4095
0
}
4096
4097
#ifndef NO_WOLFSSL_CLIENT
4098
4099
static word16 TLSX_SupportedCurve_Write(SupportedCurve* list, byte* output)
4100
0
{
4101
0
    word16 offset = OPAQUE16_LEN;
4102
4103
0
    while (list) {
4104
0
        c16toa(list->name, output + offset);
4105
0
        offset += OPAQUE16_LEN;
4106
0
        list = list->next;
4107
0
    }
4108
4109
0
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
4110
4111
0
    return offset;
4112
0
}
4113
4114
#endif
4115
4116
static word16 TLSX_PointFormat_Write(PointFormat* list, byte* output)
4117
0
{
4118
0
    word16 offset = ENUM_LEN;
4119
4120
0
    while (list) {
4121
0
        output[offset++] = list->format;
4122
0
        list = list->next;
4123
0
    }
4124
4125
0
    output[0] = (byte)(offset - ENUM_LEN);
4126
4127
0
    return offset;
4128
0
}
4129
4130
#if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
4131
                                         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
4132
4133
int TLSX_SupportedCurve_Parse(const WOLFSSL* ssl, const byte* input,
4134
                              word16 length, byte isRequest, TLSX** extensions)
4135
0
{
4136
0
    word16 offset;
4137
0
    word16 name;
4138
0
    int ret;
4139
4140
0
    if(!isRequest && !IsAtLeastTLSv1_3(ssl->version)) {
4141
#ifdef WOLFSSL_ALLOW_SERVER_SC_EXT
4142
        return 0;
4143
#else
4144
0
        return BUFFER_ERROR; /* servers doesn't send this extension. */
4145
0
#endif
4146
0
    }
4147
4148
0
    if (OPAQUE16_LEN > length || length % OPAQUE16_LEN)
4149
0
        return BUFFER_ERROR;
4150
4151
0
    ato16(input, &offset);
4152
4153
    /* validating curve list length */
4154
0
    if (length != OPAQUE16_LEN + offset)
4155
0
        return BUFFER_ERROR;
4156
4157
0
    offset = OPAQUE16_LEN;
4158
0
    if (offset == length)
4159
0
        return 0;
4160
4161
0
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
4162
0
    if (!isRequest) {
4163
0
        TLSX* extension;
4164
0
        SupportedCurve* curve;
4165
4166
0
        extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
4167
0
        if (extension != NULL) {
4168
            /* Replace client list with server list of supported groups. */
4169
0
            curve = (SupportedCurve*)extension->data;
4170
0
            extension->data = NULL;
4171
0
            TLSX_SupportedCurve_FreeAll(curve, ssl->heap);
4172
4173
0
            ato16(input + offset, &name);
4174
0
            offset += OPAQUE16_LEN;
4175
4176
0
            ret = TLSX_SupportedCurve_New(&curve, name, ssl->heap);
4177
0
            if (ret != 0)
4178
0
                return ret; /* throw error */
4179
0
            extension->data = (void*)curve;
4180
0
        }
4181
0
    }
4182
0
#endif
4183
4184
0
    for (; offset < length; offset += OPAQUE16_LEN) {
4185
0
        ato16(input + offset, &name);
4186
4187
0
        ret = TLSX_UseSupportedCurve(extensions, name, ssl->heap);
4188
        /* If it is BAD_FUNC_ARG then it is a group we do not support, but
4189
         * that is fine. */
4190
0
        if (ret != WOLFSSL_SUCCESS && ret != BAD_FUNC_ARG) {
4191
0
            return ret;
4192
0
        }
4193
0
    }
4194
4195
0
    return 0;
4196
0
}
4197
4198
#endif
4199
4200
#if !defined(NO_WOLFSSL_SERVER)
4201
4202
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
4203
4204
/* Checks the priority of the groups on the server and set the supported groups
4205
 * response if there is a group not advertised by the client that is preferred.
4206
 *
4207
 * ssl  SSL/TLS object.
4208
 * returns 0 on success, otherwise an error.
4209
 */
4210
int TLSX_SupportedCurve_CheckPriority(WOLFSSL* ssl)
4211
0
{
4212
0
    int ret;
4213
0
    TLSX* extension;
4214
0
    TLSX* priority = NULL;
4215
0
    TLSX* ext = NULL;
4216
0
    word16 name;
4217
0
    SupportedCurve* curve;
4218
4219
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
4220
    /* May be doing PSK with no key exchange. */
4221
0
    if (extension == NULL)
4222
0
        return 0;
4223
4224
0
    ret = TLSX_PopulateSupportedGroups(ssl, &priority);
4225
0
    if (ret != WOLFSSL_SUCCESS) {
4226
0
        TLSX_FreeAll(priority, ssl->heap);
4227
0
        return ret;
4228
0
    }
4229
4230
0
    ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
4231
0
    if (ext == NULL) {
4232
0
        WOLFSSL_MSG("Could not find supported groups extension");
4233
0
        TLSX_FreeAll(priority, ssl->heap);
4234
0
        return 0;
4235
0
    }
4236
4237
0
    curve = (SupportedCurve*)ext->data;
4238
0
    name = curve->name;
4239
4240
0
    curve = (SupportedCurve*)extension->data;
4241
0
    while (curve != NULL) {
4242
0
        if (curve->name == name)
4243
0
            break;
4244
0
        curve = curve->next;
4245
0
    }
4246
4247
0
    if (curve == NULL) {
4248
        /* Couldn't find the preferred group in client list. */
4249
0
        extension->resp = 1;
4250
4251
        /* Send server list back and free client list. */
4252
0
        curve = (SupportedCurve*)extension->data;
4253
0
        extension->data = ext->data;
4254
0
        ext->data = curve;
4255
0
    }
4256
4257
0
    TLSX_FreeAll(priority, ssl->heap);
4258
4259
0
    return 0;
4260
0
}
4261
4262
#endif /* WOLFSSL_TLS13 && !WOLFSSL_NO_SERVER_GROUPS_EXT */
4263
4264
#if defined(HAVE_FFDHE) && !defined(WOLFSSL_NO_TLS12)
4265
#ifdef HAVE_PUBLIC_FFDHE
4266
static int tlsx_ffdhe_find_group(WOLFSSL* ssl, SupportedCurve* clientGroup,
4267
    SupportedCurve* serverGroup)
4268
0
{
4269
0
    int ret = 0;
4270
0
    SupportedCurve* group;
4271
0
    const DhParams* params = NULL;
4272
4273
0
    for (; serverGroup != NULL; serverGroup = serverGroup->next) {
4274
0
        if (!WOLFSSL_NAMED_GROUP_IS_FFHDE(serverGroup->name))
4275
0
            continue;
4276
4277
0
        for (group = clientGroup; group != NULL; group = group->next) {
4278
0
            if (serverGroup->name != group->name)
4279
0
                continue;
4280
4281
0
            switch (serverGroup->name) {
4282
0
            #ifdef HAVE_FFDHE_2048
4283
0
                case WOLFSSL_FFDHE_2048:
4284
0
                    params = wc_Dh_ffdhe2048_Get();
4285
0
                    break;
4286
0
            #endif
4287
            #ifdef HAVE_FFDHE_3072
4288
                case WOLFSSL_FFDHE_3072:
4289
                    params = wc_Dh_ffdhe3072_Get();
4290
                    break;
4291
            #endif
4292
            #ifdef HAVE_FFDHE_4096
4293
                case WOLFSSL_FFDHE_4096:
4294
                    params = wc_Dh_ffdhe4096_Get();
4295
                    break;
4296
            #endif
4297
            #ifdef HAVE_FFDHE_6144
4298
                case WOLFSSL_FFDHE_6144:
4299
                    params = wc_Dh_ffdhe6144_Get();
4300
                    break;
4301
            #endif
4302
            #ifdef HAVE_FFDHE_8192
4303
                case WOLFSSL_FFDHE_8192:
4304
                    params = wc_Dh_ffdhe8192_Get();
4305
                    break;
4306
            #endif
4307
0
                default:
4308
0
                    break;
4309
0
            }
4310
0
            if (params == NULL) {
4311
0
                ret = BAD_FUNC_ARG;
4312
0
                break;
4313
0
            }
4314
0
            if (params->p_len >= ssl->options.minDhKeySz &&
4315
0
                                     params->p_len <= ssl->options.maxDhKeySz) {
4316
0
                break;
4317
0
            }
4318
0
        }
4319
4320
0
        if (ret != 0)
4321
0
            break;
4322
0
        if ((group != NULL) && (serverGroup->name == group->name))
4323
0
            break;
4324
0
    }
4325
4326
0
    if ((ret == 0) && (serverGroup != NULL) && (params != NULL)) {
4327
0
        ssl->buffers.serverDH_P.buffer = (unsigned char *)params->p;
4328
0
        ssl->buffers.serverDH_P.length = params->p_len;
4329
0
        ssl->buffers.serverDH_G.buffer = (unsigned char *)params->g;
4330
0
        ssl->buffers.serverDH_G.length = params->g_len;
4331
4332
0
        ssl->namedGroup = serverGroup->name;
4333
0
    #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
4334
0
        !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
4335
0
        ssl->options.dhDoKeyTest = 0;
4336
0
    #endif
4337
0
        ssl->options.haveDH = 1;
4338
0
    }
4339
4340
0
    return ret;
4341
0
}
4342
#else
4343
static int tlsx_ffdhe_find_group(WOLFSSL* ssl, SupportedCurve* clientGroup,
4344
    SupportedCurve* serverGroup)
4345
{
4346
    int ret = 0;
4347
    SupportedCurve* group;
4348
    word32 p_len;
4349
4350
    for (; serverGroup != NULL; serverGroup = serverGroup->next) {
4351
        if (!WOLFSSL_NAMED_GROUP_IS_FFHDE(serverGroup->name))
4352
            continue;
4353
4354
        for (group = clientGroup; group != NULL; group = group->next) {
4355
            if (serverGroup->name != group->name)
4356
                continue;
4357
4358
            wc_DhGetNamedKeyParamSize(serverGroup->name, &p_len, NULL, NULL);
4359
            if (p_len == 0) {
4360
                ret = BAD_FUNC_ARG;
4361
                break;
4362
            }
4363
            if (p_len >= ssl->options.minDhKeySz &&
4364
                                             p_len <= ssl->options.maxDhKeySz) {
4365
                break;
4366
            }
4367
        }
4368
4369
        if (ret != 0)
4370
            break;
4371
        if ((group != NULL) && (serverGroup->name == group->name))
4372
            break;
4373
    }
4374
4375
    if ((ret == 0) && (serverGroup != NULL)) {
4376
        word32 pSz, gSz;
4377
4378
        ssl->buffers.serverDH_P.buffer = NULL;
4379
        ssl->buffers.serverDH_G.buffer = NULL;
4380
        ret = wc_DhGetNamedKeyParamSize(serverGroup->name, &pSz, &gSz, NULL);
4381
        if (ret == 0) {
4382
            ssl->buffers.serverDH_P.buffer =
4383
                (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
4384
            if (ssl->buffers.serverDH_P.buffer == NULL)
4385
                ret = MEMORY_E;
4386
            else
4387
                ssl->buffers.serverDH_P.length = pSz;
4388
        }
4389
        if (ret == 0) {
4390
            ssl->buffers.serverDH_G.buffer =
4391
                (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
4392
            if (ssl->buffers.serverDH_G.buffer == NULL) {
4393
                ret = MEMORY_E;
4394
            } else
4395
                ssl->buffers.serverDH_G.length = gSz;
4396
        }
4397
        if (ret == 0) {
4398
            ret = wc_DhCopyNamedKey(serverGroup->name,
4399
                              ssl->buffers.serverDH_P.buffer, &pSz,
4400
                              ssl->buffers.serverDH_G.buffer, &gSz,
4401
                              NULL, NULL);
4402
        }
4403
        if (ret == 0) {
4404
            ssl->buffers.weOwnDH = 1;
4405
4406
            ssl->namedGroup = serverGroup->name;
4407
        #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
4408
            !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
4409
            ssl->options.dhDoKeyTest = 0;
4410
        #endif
4411
            ssl->options.haveDH = 1;
4412
        }
4413
        else {
4414
            if (ssl->buffers.serverDH_P.buffer != NULL) {
4415
                XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
4416
                    DYNAMIC_TYPE_PUBLIC_KEY);
4417
                ssl->buffers.serverDH_P.length = 0;
4418
                ssl->buffers.serverDH_P.buffer = NULL;
4419
            }
4420
            if (ssl->buffers.serverDH_G.buffer != NULL) {
4421
                XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
4422
                    DYNAMIC_TYPE_PUBLIC_KEY);
4423
                ssl->buffers.serverDH_G.length = 0;
4424
                ssl->buffers.serverDH_G.buffer = NULL;
4425
            }
4426
        }
4427
    }
4428
4429
    return ret;
4430
}
4431
#endif
4432
4433
/* Set the highest priority common FFDHE group on the server as compared to
4434
 * client extensions.
4435
 *
4436
 * ssl    SSL/TLS object.
4437
 * returns 0 on success, otherwise an error.
4438
 */
4439
int TLSX_SupportedFFDHE_Set(WOLFSSL* ssl)
4440
0
{
4441
0
    int ret;
4442
0
    TLSX* priority = NULL;
4443
0
    TLSX* ext = NULL;
4444
0
    TLSX* extension;
4445
0
    SupportedCurve* clientGroup;
4446
0
    SupportedCurve* group;
4447
0
    int found = 0;
4448
4449
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
4450
    /* May be doing PSK with no key exchange. */
4451
0
    if (extension == NULL)
4452
0
        return 0;
4453
0
    clientGroup = (SupportedCurve*)extension->data;
4454
0
    for (group = clientGroup; group != NULL; group = group->next) {
4455
0
        if (WOLFSSL_NAMED_GROUP_IS_FFHDE(group->name)) {
4456
0
            found = 1;
4457
0
            break;
4458
0
        }
4459
0
    }
4460
0
    if (!found)
4461
0
        return 0;
4462
4463
0
    if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
4464
0
        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
4465
0
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
4466
0
    }
4467
0
    if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
4468
0
        XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
4469
0
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
4470
0
    }
4471
0
    ssl->buffers.serverDH_P.buffer = NULL;
4472
0
    ssl->buffers.serverDH_G.buffer = NULL;
4473
0
    ssl->buffers.weOwnDH = 0;
4474
0
    ssl->options.haveDH = 0;
4475
4476
0
    ret = TLSX_PopulateSupportedGroups(ssl, &priority);
4477
0
    if (ret == WOLFSSL_SUCCESS) {
4478
0
        SupportedCurve* serverGroup;
4479
4480
0
        ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
4481
0
        serverGroup = (SupportedCurve*)ext->data;
4482
4483
0
        ret = tlsx_ffdhe_find_group(ssl, clientGroup, serverGroup);
4484
0
    }
4485
4486
0
    TLSX_FreeAll(priority, ssl->heap);
4487
4488
0
    return ret;
4489
0
}
4490
#endif /* HAVE_FFDHE && !WOLFSSL_NO_TLS12 */
4491
4492
#endif /* !NO_WOLFSSL_SERVER */
4493
4494
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
4495
/* Return the preferred group.
4496
 *
4497
 * ssl             SSL/TLS object.
4498
 * checkSupported  Whether to check for the first supported group.
4499
 * returns BAD_FUNC_ARG if no group found, otherwise the group.
4500
 */
4501
int TLSX_SupportedCurve_Preferred(WOLFSSL* ssl, int checkSupported)
4502
0
{
4503
0
    TLSX* extension;
4504
0
    SupportedCurve* curve;
4505
4506
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
4507
0
    if (extension == NULL)
4508
0
        return BAD_FUNC_ARG;
4509
4510
0
    curve = (SupportedCurve*)extension->data;
4511
0
    while (curve != NULL) {
4512
0
        if (!checkSupported || TLSX_KeyShare_IsSupported(curve->name))
4513
0
            return curve->name;
4514
0
        curve = curve->next;
4515
0
    }
4516
4517
0
    return BAD_FUNC_ARG;
4518
0
}
4519
4520
#endif /* HAVE_SUPPORTED_CURVES */
4521
4522
#ifndef NO_WOLFSSL_SERVER
4523
4524
static int TLSX_PointFormat_Parse(WOLFSSL* ssl, const byte* input,
4525
                                  word16 length, byte isRequest)
4526
0
{
4527
0
    int ret;
4528
4529
    /* validating formats list length */
4530
0
    if (ENUM_LEN > length || length != (word16)ENUM_LEN + input[0])
4531
0
        return BUFFER_ERROR;
4532
4533
0
    if (isRequest) {
4534
        /* adding uncompressed point format to response */
4535
0
        ret = TLSX_UsePointFormat(&ssl->extensions, WOLFSSL_EC_PF_UNCOMPRESSED,
4536
0
                                                                     ssl->heap);
4537
0
        if (ret != WOLFSSL_SUCCESS)
4538
0
            return ret; /* throw error */
4539
4540
0
        TLSX_SetResponse(ssl, TLSX_EC_POINT_FORMATS);
4541
0
    }
4542
4543
0
    return 0;
4544
0
}
4545
4546
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
4547
int TLSX_ValidateSupportedCurves(const WOLFSSL* ssl, byte first, byte second,
4548
0
                                 word32* ecdhCurveOID) {
4549
0
    TLSX*           extension = NULL;
4550
0
    SupportedCurve* curve     = NULL;
4551
0
    word32          oid       = 0;
4552
0
    word32          defOid    = 0;
4553
0
    word32          defSz     = 80; /* Maximum known curve size is 66. */
4554
0
    word32          nextOid   = 0;
4555
0
    word32          nextSz    = 80; /* Maximum known curve size is 66. */
4556
0
    word32          currOid   = ssl->ecdhCurveOID;
4557
0
    int             ephmSuite = 0;
4558
0
    word16          octets    = 0; /* according to 'ecc_set_type ecc_sets[];' */
4559
0
    int             key       = 0; /* validate key       */
4560
4561
0
    (void)oid;
4562
4563
0
    if (first == CHACHA_BYTE) {
4564
0
        switch (second) {
4565
0
            case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
4566
0
            case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256:
4567
0
            case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
4568
0
            case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
4569
0
                return 1; /* no suite restriction */
4570
0
            case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
4571
0
            case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
4572
0
            case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
4573
0
                break;
4574
0
        }
4575
0
    }
4576
0
    if (first == ECC_BYTE || first == ECDHE_PSK_BYTE || first == CHACHA_BYTE)
4577
0
        extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
4578
0
    if (!extension)
4579
0
        return 1; /* no suite restriction */
4580
4581
0
    for (curve = (SupportedCurve*)extension->data;
4582
0
         curve && !key;
4583
0
         curve = curve->next) {
4584
4585
    #ifdef OPENSSL_EXTRA
4586
        /* skip if name is not in supported ECC range
4587
         * or disabled by user */
4588
        if (curve->name > WOLFSSL_ECC_MAX ||
4589
            wolfSSL_curve_is_disabled(ssl, curve->name))
4590
            continue;
4591
    #endif
4592
4593
        /* find supported curve */
4594
0
        switch (curve->name) {
4595
0
#ifdef HAVE_ECC
4596
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
4597
        #ifndef NO_ECC_SECP
4598
            case WOLFSSL_ECC_SECP160R1:
4599
                oid = ECC_SECP160R1_OID;
4600
                octets = 20;
4601
                break;
4602
        #endif /* !NO_ECC_SECP */
4603
        #ifdef HAVE_ECC_SECPR2
4604
            case WOLFSSL_ECC_SECP160R2:
4605
                oid = ECC_SECP160R2_OID;
4606
                octets = 20;
4607
                break;
4608
        #endif /* HAVE_ECC_SECPR2 */
4609
        #ifdef HAVE_ECC_KOBLITZ
4610
            case WOLFSSL_ECC_SECP160K1:
4611
                oid = ECC_SECP160K1_OID;
4612
                octets = 20;
4613
                break;
4614
        #endif /* HAVE_ECC_KOBLITZ */
4615
        #endif
4616
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
4617
        #ifndef NO_ECC_SECP
4618
            case WOLFSSL_ECC_SECP192R1:
4619
                oid = ECC_SECP192R1_OID;
4620
                octets = 24;
4621
                break;
4622
        #endif /* !NO_ECC_SECP */
4623
        #ifdef HAVE_ECC_KOBLITZ
4624
            case WOLFSSL_ECC_SECP192K1:
4625
                oid = ECC_SECP192K1_OID;
4626
                octets = 24;
4627
                break;
4628
        #endif /* HAVE_ECC_KOBLITZ */
4629
    #endif
4630
0
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
4631
0
        #ifndef NO_ECC_SECP
4632
0
            case WOLFSSL_ECC_SECP224R1:
4633
0
                oid = ECC_SECP224R1_OID;
4634
0
                octets = 28;
4635
0
                break;
4636
0
        #endif /* !NO_ECC_SECP */
4637
        #ifdef HAVE_ECC_KOBLITZ
4638
            case WOLFSSL_ECC_SECP224K1:
4639
                oid = ECC_SECP224K1_OID;
4640
                octets = 28;
4641
                break;
4642
        #endif /* HAVE_ECC_KOBLITZ */
4643
0
    #endif
4644
0
    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
4645
0
        #ifndef NO_ECC_SECP
4646
0
            case WOLFSSL_ECC_SECP256R1:
4647
0
                oid = ECC_SECP256R1_OID;
4648
0
                octets = 32;
4649
0
                break;
4650
0
        #endif /* !NO_ECC_SECP */
4651
0
    #endif /* !NO_ECC256 || HAVE_ALL_CURVES */
4652
0
#endif
4653
        #if (defined(HAVE_CURVE25519) || defined(HAVE_ED25519)) && ECC_MIN_KEY_SZ <= 256
4654
            case WOLFSSL_ECC_X25519:
4655
                oid = ECC_X25519_OID;
4656
                octets = 32;
4657
                break;
4658
        #endif /* HAVE_CURVE25519 */
4659
0
#ifdef HAVE_ECC
4660
0
    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
4661
        #ifdef HAVE_ECC_KOBLITZ
4662
            case WOLFSSL_ECC_SECP256K1:
4663
                oid = ECC_SECP256K1_OID;
4664
                octets = 32;
4665
                break;
4666
        #endif /* HAVE_ECC_KOBLITZ */
4667
        #ifdef HAVE_ECC_BRAINPOOL
4668
            case WOLFSSL_ECC_BRAINPOOLP256R1:
4669
                oid = ECC_BRAINPOOLP256R1_OID;
4670
                octets = 32;
4671
                break;
4672
        #endif /* HAVE_ECC_BRAINPOOL */
4673
0
    #endif
4674
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
4675
0
        #ifndef NO_ECC_SECP
4676
0
            case WOLFSSL_ECC_SECP384R1:
4677
0
                oid = ECC_SECP384R1_OID;
4678
0
                octets = 48;
4679
0
                break;
4680
0
        #endif /* !NO_ECC_SECP */
4681
        #ifdef HAVE_ECC_BRAINPOOL
4682
            case WOLFSSL_ECC_BRAINPOOLP384R1:
4683
                oid = ECC_BRAINPOOLP384R1_OID;
4684
                octets = 48;
4685
                break;
4686
        #endif /* HAVE_ECC_BRAINPOOL */
4687
0
    #endif
4688
0
#endif
4689
        #if (defined(HAVE_CURVE448) || defined(HAVE_ED448)) && ECC_MIN_KEY_SZ <= 448
4690
            case WOLFSSL_ECC_X448:
4691
                oid = ECC_X448_OID;
4692
                octets = 57;
4693
                break;
4694
        #endif /* HAVE_CURVE448 */
4695
0
#ifdef HAVE_ECC
4696
0
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
4697
        #ifdef HAVE_ECC_BRAINPOOL
4698
            case WOLFSSL_ECC_BRAINPOOLP512R1:
4699
                oid = ECC_BRAINPOOLP512R1_OID;
4700
                octets = 64;
4701
                break;
4702
        #endif /* HAVE_ECC_BRAINPOOL */
4703
0
    #endif
4704
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
4705
0
        #ifndef NO_ECC_SECP
4706
0
            case WOLFSSL_ECC_SECP521R1:
4707
0
                oid = ECC_SECP521R1_OID;
4708
0
                octets = 66;
4709
0
                break;
4710
0
        #endif /* !NO_ECC_SECP */
4711
0
    #endif
4712
0
#endif
4713
0
            default: continue; /* unsupported curve */
4714
0
        }
4715
4716
0
    #ifdef HAVE_ECC
4717
        /* Set default Oid */
4718
0
        if (defOid == 0 && ssl->eccTempKeySz <= octets && defSz > octets) {
4719
0
            defOid = oid;
4720
0
            defSz = octets;
4721
0
        }
4722
4723
        /* The eccTempKeySz is the preferred ephemeral key size */
4724
0
        if (currOid == 0 && ssl->eccTempKeySz == octets)
4725
0
            currOid = oid;
4726
0
        if ((nextOid == 0 || nextSz > octets) && ssl->eccTempKeySz <= octets) {
4727
0
            nextOid = oid;
4728
0
            nextSz  = octets;
4729
0
        }
4730
    #else
4731
        if (defOid == 0 && defSz > octets) {
4732
            defOid = oid;
4733
            defSz = octets;
4734
        }
4735
4736
        if (currOid == 0)
4737
            currOid = oid;
4738
        if (nextOid == 0 || nextSz > octets) {
4739
            nextOid = oid;
4740
            nextSz  = octets;
4741
        }
4742
    #endif
4743
4744
0
        if (first == ECC_BYTE) {
4745
0
            switch (second) {
4746
0
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
4747
                /* ECDHE_ECDSA */
4748
0
                case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
4749
0
                case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
4750
0
                case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
4751
0
                case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
4752
0
                case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
4753
0
                case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
4754
0
                case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
4755
0
                case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
4756
0
                case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
4757
0
                case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
4758
0
                    key |= ssl->ecdhCurveOID == oid;
4759
0
                    ephmSuite = 1;
4760
0
                break;
4761
4762
    #ifdef WOLFSSL_STATIC_DH
4763
                /* ECDH_ECDSA */
4764
                case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
4765
                case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
4766
                case TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
4767
                case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
4768
                case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
4769
                case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
4770
                case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
4771
                case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
4772
                    if (oid == ECC_X25519_OID && defOid == oid) {
4773
                        defOid = 0;
4774
                        defSz = 80;
4775
                    }
4776
                    if (oid == ECC_X448_OID && defOid == oid) {
4777
                        defOid = 0;
4778
                        defSz = 80;
4779
                    }
4780
                    key |= ssl->pkCurveOID == oid;
4781
                break;
4782
    #endif /* WOLFSSL_STATIC_DH */
4783
0
#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
4784
0
#ifndef NO_RSA
4785
                /* ECDHE_RSA */
4786
0
                case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
4787
0
                case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
4788
0
                case TLS_ECDHE_RSA_WITH_RC4_128_SHA:
4789
0
                case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
4790
0
                case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
4791
0
                case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
4792
0
                case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
4793
0
                case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
4794
0
                    key |= ssl->ecdhCurveOID == oid;
4795
0
                    ephmSuite = 1;
4796
0
                break;
4797
4798
    #if defined(HAVE_ECC) && defined(WOLFSSL_STATIC_DH)
4799
                /* ECDH_RSA */
4800
                case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
4801
                case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
4802
                case TLS_ECDH_RSA_WITH_RC4_128_SHA:
4803
                case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
4804
                case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
4805
                case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
4806
                case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
4807
                case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
4808
                    if (oid == ECC_X25519_OID && defOid == oid) {
4809
                        defOid = 0;
4810
                        defSz = 80;
4811
                    }
4812
                    if (oid == ECC_X448_OID && defOid == oid) {
4813
                        defOid = 0;
4814
                        defSz = 80;
4815
                    }
4816
                    key |= ssl->pkCurveOID == oid;
4817
                break;
4818
    #endif /* HAVE_ECC && WOLFSSL_STATIC_DH */
4819
0
#endif
4820
0
                default:
4821
0
                    if (oid == ECC_X25519_OID && defOid == oid) {
4822
0
                        defOid = 0;
4823
0
                        defSz = 80;
4824
0
                    }
4825
0
                    if (oid == ECC_X448_OID && defOid == oid) {
4826
0
                        defOid = 0;
4827
0
                        defSz = 80;
4828
0
                    }
4829
0
                    key = 1;
4830
0
                break;
4831
0
            }
4832
0
        }
4833
4834
        /* ChaCha20-Poly1305 ECC cipher suites */
4835
0
        if (first == CHACHA_BYTE) {
4836
0
            switch (second) {
4837
0
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
4838
                /* ECDHE_ECDSA */
4839
0
                case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
4840
0
                case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
4841
0
                    key |= ssl->ecdhCurveOID == oid;
4842
0
                    ephmSuite = 1;
4843
0
                break;
4844
0
#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
4845
0
#ifndef NO_RSA
4846
                /* ECDHE_RSA */
4847
0
                case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
4848
0
                case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
4849
0
                    key |= ssl->ecdhCurveOID == oid;
4850
0
                    ephmSuite = 1;
4851
0
                break;
4852
0
#endif
4853
0
                default:
4854
0
                    key = 1;
4855
0
                break;
4856
0
            }
4857
0
        }
4858
0
    }
4859
4860
0
    *ecdhCurveOID = ssl->ecdhCurveOID;
4861
    /* Choose the default if it is at the required strength. */
4862
0
#ifdef HAVE_ECC
4863
0
    if (*ecdhCurveOID == 0 && defSz == ssl->eccTempKeySz)
4864
#else
4865
    if (*ecdhCurveOID == 0)
4866
#endif
4867
0
    {
4868
0
        key = 1;
4869
0
        *ecdhCurveOID = defOid;
4870
0
    }
4871
    /* Choose any curve at the required strength. */
4872
0
    if (*ecdhCurveOID == 0) {
4873
0
        key = 1;
4874
0
        *ecdhCurveOID = currOid;
4875
0
    }
4876
    /* Choose the default if it is at the next highest strength. */
4877
0
    if (*ecdhCurveOID == 0 && defSz == nextSz)
4878
0
        *ecdhCurveOID = defOid;
4879
    /* Choose any curve at the next highest strength. */
4880
0
    if (*ecdhCurveOID == 0)
4881
0
        *ecdhCurveOID = nextOid;
4882
    /* No curve and ephemeral ECC suite requires a matching curve. */
4883
0
    if (*ecdhCurveOID == 0 && ephmSuite)
4884
0
        key = 0;
4885
4886
0
    return key;
4887
0
}
4888
#endif
4889
4890
#endif /* NO_WOLFSSL_SERVER */
4891
4892
4893
int TLSX_SupportedCurve_Copy(TLSX* src, TLSX** dst, void* heap)
4894
0
{
4895
0
    TLSX* extension;
4896
0
    int ret;
4897
4898
0
    extension = TLSX_Find(src, TLSX_SUPPORTED_GROUPS);
4899
0
    if (extension != NULL) {
4900
0
        SupportedCurve* curve;
4901
0
        for (curve = (SupportedCurve*)extension->data; curve != NULL;
4902
0
                curve = curve->next) {
4903
0
            ret = TLSX_UseSupportedCurve(dst, curve->name, heap);
4904
0
            if (ret != WOLFSSL_SUCCESS)
4905
0
                return MEMORY_E;
4906
0
        }
4907
0
    }
4908
4909
0
    return 0;
4910
0
}
4911
4912
int TLSX_UseSupportedCurve(TLSX** extensions, word16 name, void* heap)
4913
0
{
4914
0
    TLSX* extension = NULL;
4915
0
    SupportedCurve* curve = NULL;
4916
0
    int ret;
4917
4918
0
    if (extensions == NULL) {
4919
0
        return BAD_FUNC_ARG;
4920
0
    }
4921
4922
0
#ifdef WOLFSSL_TLS13
4923
0
    if (! TLSX_KeyShare_IsSupported(name)) {
4924
0
        return BAD_FUNC_ARG;
4925
0
    }
4926
0
#endif
4927
4928
0
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
4929
4930
0
    if (!extension) {
4931
0
        ret = TLSX_SupportedCurve_New(&curve, name, heap);
4932
0
        if (ret != 0)
4933
0
            return ret;
4934
4935
0
        ret = TLSX_Push(extensions, TLSX_SUPPORTED_GROUPS, curve, heap);
4936
0
        if (ret != 0) {
4937
0
            XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
4938
0
            return ret;
4939
0
        }
4940
0
    }
4941
0
    else {
4942
0
        ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data, name,
4943
0
                                                                          heap);
4944
0
        if (ret != 0)
4945
0
            return ret;
4946
0
    }
4947
4948
0
    return WOLFSSL_SUCCESS;
4949
0
}
4950
4951
int TLSX_UsePointFormat(TLSX** extensions, byte format, void* heap)
4952
0
{
4953
0
    TLSX* extension = NULL;
4954
0
    PointFormat* point = NULL;
4955
0
    int ret = 0;
4956
4957
0
    if (extensions == NULL)
4958
0
        return BAD_FUNC_ARG;
4959
4960
0
    extension = TLSX_Find(*extensions, TLSX_EC_POINT_FORMATS);
4961
4962
0
    if (!extension) {
4963
0
        ret = TLSX_PointFormat_New(&point, format, heap);
4964
0
        if (ret != 0)
4965
0
            return ret;
4966
4967
0
        ret = TLSX_Push(extensions, TLSX_EC_POINT_FORMATS, point, heap);
4968
0
        if (ret != 0) {
4969
0
            XFREE(point, heap, DYNAMIC_TYPE_TLSX);
4970
0
            return ret;
4971
0
        }
4972
0
    }
4973
0
    else {
4974
0
        ret = TLSX_PointFormat_Append((PointFormat*)extension->data, format,
4975
0
                                                                          heap);
4976
0
        if (ret != 0)
4977
0
            return ret;
4978
0
    }
4979
4980
0
    return WOLFSSL_SUCCESS;
4981
0
}
4982
4983
0
#define EC_FREE_ALL         TLSX_SupportedCurve_FreeAll
4984
0
#define EC_VALIDATE_REQUEST TLSX_SupportedCurve_ValidateRequest
4985
4986
#ifndef NO_WOLFSSL_CLIENT
4987
0
#define EC_GET_SIZE TLSX_SupportedCurve_GetSize
4988
0
#define EC_WRITE    TLSX_SupportedCurve_Write
4989
#else
4990
#define EC_GET_SIZE(list)         0
4991
#define EC_WRITE(a, b)            0
4992
#endif
4993
4994
#if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
4995
                                         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
4996
0
#define EC_PARSE TLSX_SupportedCurve_Parse
4997
#else
4998
#define EC_PARSE(a, b, c, d, e)   0
4999
#endif
5000
5001
0
#define PF_FREE_ALL          TLSX_PointFormat_FreeAll
5002
0
#define PF_VALIDATE_REQUEST  TLSX_PointFormat_ValidateRequest
5003
0
#define PF_VALIDATE_RESPONSE TLSX_PointFormat_ValidateResponse
5004
5005
0
#define PF_GET_SIZE TLSX_PointFormat_GetSize
5006
0
#define PF_WRITE    TLSX_PointFormat_Write
5007
5008
#ifndef NO_WOLFSSL_SERVER
5009
0
#define PF_PARSE TLSX_PointFormat_Parse
5010
#else
5011
#define PF_PARSE(a, b, c, d)      0
5012
#endif
5013
5014
#else
5015
5016
#define EC_FREE_ALL(list, heap)
5017
#define EC_GET_SIZE(list)         0
5018
#define EC_WRITE(a, b)            0
5019
#define EC_PARSE(a, b, c, d, e)   0
5020
#define EC_VALIDATE_REQUEST(a, b)
5021
5022
#define PF_FREE_ALL(list, heap)
5023
#define PF_GET_SIZE(list)         0
5024
#define PF_WRITE(a, b)            0
5025
#define PF_PARSE(a, b, c, d)      0
5026
#define PF_VALIDATE_REQUEST(a, b)
5027
#define PF_VALIDATE_RESPONSE(a, b)
5028
5029
#endif /* HAVE_SUPPORTED_CURVES */
5030
5031
/******************************************************************************/
5032
/* Renegotiation Indication                                                   */
5033
/******************************************************************************/
5034
5035
#if defined(HAVE_SECURE_RENEGOTIATION) \
5036
 || defined(HAVE_SERVER_RENEGOTIATION_INFO)
5037
5038
static byte TLSX_SecureRenegotiation_GetSize(SecureRenegotiation* data,
5039
                                                                  int isRequest)
5040
0
{
5041
0
    byte length = OPAQUE8_LEN; /* empty info length */
5042
5043
    /* data will be NULL for HAVE_SERVER_RENEGOTIATION_INFO only */
5044
0
    if (data && data->enabled && data->verifySet) {
5045
        /* client sends client_verify_data only */
5046
0
        length += TLS_FINISHED_SZ;
5047
5048
        /* server also sends server_verify_data */
5049
0
        if (!isRequest)
5050
0
            length += TLS_FINISHED_SZ;
5051
0
    }
5052
5053
0
    return length;
5054
0
}
5055
5056
static word16 TLSX_SecureRenegotiation_Write(SecureRenegotiation* data,
5057
                                                    byte* output, int isRequest)
5058
0
{
5059
0
    word16 offset = OPAQUE8_LEN; /* RenegotiationInfo length */
5060
0
    if (data && data->enabled && data->verifySet) {
5061
        /* client sends client_verify_data only */
5062
0
        XMEMCPY(output + offset, data->client_verify_data, TLS_FINISHED_SZ);
5063
0
        offset += TLS_FINISHED_SZ;
5064
5065
        /* server also sends server_verify_data */
5066
0
        if (!isRequest) {
5067
0
            XMEMCPY(output + offset, data->server_verify_data, TLS_FINISHED_SZ);
5068
0
            offset += TLS_FINISHED_SZ;
5069
0
        }
5070
0
    }
5071
5072
0
    output[0] = (byte)(offset - 1);  /* info length - self */
5073
5074
0
    return offset;
5075
0
}
5076
5077
static int TLSX_SecureRenegotiation_Parse(WOLFSSL* ssl, const byte* input,
5078
                                          word16 length, byte isRequest)
5079
0
{
5080
0
    int ret = SECURE_RENEGOTIATION_E;
5081
5082
0
    if (length >= OPAQUE8_LEN) {
5083
0
        if (isRequest) {
5084
0
        #ifndef NO_WOLFSSL_SERVER
5085
0
            if (ssl->secure_renegotiation == NULL) {
5086
0
                ret = wolfSSL_UseSecureRenegotiation(ssl);
5087
0
                if (ret == WOLFSSL_SUCCESS)
5088
0
                    ret = 0;
5089
0
            }
5090
0
            if (ret != 0 && ret != SECURE_RENEGOTIATION_E) {
5091
0
            }
5092
0
            else if (ssl->secure_renegotiation == NULL) {
5093
0
            }
5094
0
            else if (!ssl->secure_renegotiation->enabled) {
5095
0
                if (*input == 0) {
5096
0
                    input++; /* get past size */
5097
5098
0
                    ssl->secure_renegotiation->enabled = 1;
5099
0
                    TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
5100
0
                    ret = 0;
5101
0
                }
5102
0
                else {
5103
                    /* already in error state */
5104
0
                    WOLFSSL_MSG("SCR client verify data present");
5105
0
                }
5106
0
            }
5107
0
            else if (*input == TLS_FINISHED_SZ) {
5108
0
                if (length < TLS_FINISHED_SZ + 1) {
5109
0
                    WOLFSSL_MSG("SCR malformed buffer");
5110
0
                    ret = BUFFER_E;
5111
0
                }
5112
0
                else {
5113
0
                    input++; /* get past size */
5114
5115
                    /* validate client verify data */
5116
0
                    if (XMEMCMP(input,
5117
0
                            ssl->secure_renegotiation->client_verify_data,
5118
0
                            TLS_FINISHED_SZ) == 0) {
5119
0
                        WOLFSSL_MSG("SCR client verify data match");
5120
0
                        TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
5121
0
                        ret = 0;  /* verified */
5122
0
                    }
5123
0
                    else {
5124
                        /* already in error state */
5125
0
                        WOLFSSL_MSG("SCR client verify data Failure");
5126
0
                    }
5127
0
                }
5128
0
            }
5129
0
        #endif
5130
0
        }
5131
0
        else if (ssl->secure_renegotiation != NULL) {
5132
0
        #ifndef NO_WOLFSSL_CLIENT
5133
0
            if (!ssl->secure_renegotiation->enabled) {
5134
0
                if (*input == 0) {
5135
0
                    ssl->secure_renegotiation->enabled = 1;
5136
0
                    ret = 0;
5137
0
                }
5138
0
            }
5139
0
            else if (*input == 2 * TLS_FINISHED_SZ &&
5140
0
                     length == 2 * TLS_FINISHED_SZ + OPAQUE8_LEN) {
5141
0
                input++;  /* get past size */
5142
5143
                /* validate client and server verify data */
5144
0
                if (XMEMCMP(input,
5145
0
                            ssl->secure_renegotiation->client_verify_data,
5146
0
                            TLS_FINISHED_SZ) == 0 &&
5147
0
                    XMEMCMP(input + TLS_FINISHED_SZ,
5148
0
                            ssl->secure_renegotiation->server_verify_data,
5149
0
                            TLS_FINISHED_SZ) == 0) {
5150
0
                    WOLFSSL_MSG("SCR client and server verify data match");
5151
0
                    ret = 0;  /* verified */
5152
0
                }
5153
0
                else {
5154
                    /* already in error state */
5155
0
                    WOLFSSL_MSG("SCR client and server verify data Failure");
5156
0
                }
5157
0
            }
5158
0
        #endif
5159
0
        }
5160
0
    }
5161
5162
0
    if (ret != 0) {
5163
0
        WOLFSSL_ERROR_VERBOSE(ret);
5164
0
        SendAlert(ssl, alert_fatal, handshake_failure);
5165
0
    }
5166
5167
0
    return ret;
5168
0
}
5169
5170
int TLSX_UseSecureRenegotiation(TLSX** extensions, void* heap)
5171
0
{
5172
0
    int ret = 0;
5173
0
    SecureRenegotiation* data;
5174
5175
0
    data = (SecureRenegotiation*)XMALLOC(sizeof(SecureRenegotiation), heap,
5176
0
                                                             DYNAMIC_TYPE_TLSX);
5177
0
    if (data == NULL)
5178
0
        return MEMORY_E;
5179
5180
0
    XMEMSET(data, 0, sizeof(SecureRenegotiation));
5181
5182
0
    ret = TLSX_Push(extensions, TLSX_RENEGOTIATION_INFO, data, heap);
5183
0
    if (ret != 0) {
5184
0
        XFREE(data, heap, DYNAMIC_TYPE_TLSX);
5185
0
        return ret;
5186
0
    }
5187
5188
0
    return WOLFSSL_SUCCESS;
5189
0
}
5190
5191
#ifdef HAVE_SERVER_RENEGOTIATION_INFO
5192
5193
int TLSX_AddEmptyRenegotiationInfo(TLSX** extensions, void* heap)
5194
0
{
5195
0
    int ret;
5196
5197
    /* send empty renegotiation_info extension */
5198
0
    TLSX* ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
5199
0
    if (ext == NULL) {
5200
0
        ret = TLSX_UseSecureRenegotiation(extensions, heap);
5201
0
        if (ret != WOLFSSL_SUCCESS)
5202
0
            return ret;
5203
5204
0
        ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
5205
0
    }
5206
0
    if (ext)
5207
0
        ext->resp = 1;
5208
5209
0
    return WOLFSSL_SUCCESS;
5210
0
}
5211
5212
#endif /* HAVE_SERVER_RENEGOTIATION_INFO */
5213
5214
5215
0
#define SCR_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
5216
0
#define SCR_GET_SIZE       TLSX_SecureRenegotiation_GetSize
5217
0
#define SCR_WRITE          TLSX_SecureRenegotiation_Write
5218
0
#define SCR_PARSE          TLSX_SecureRenegotiation_Parse
5219
5220
#else
5221
5222
#define SCR_FREE_ALL(a, heap)
5223
#define SCR_GET_SIZE(a, b)    0
5224
#define SCR_WRITE(a, b, c)    0
5225
#define SCR_PARSE(a, b, c, d) 0
5226
5227
#endif /* HAVE_SECURE_RENEGOTIATION || HAVE_SERVER_RENEGOTIATION_INFO */
5228
5229
/******************************************************************************/
5230
/* Session Tickets                                                            */
5231
/******************************************************************************/
5232
5233
#ifdef HAVE_SESSION_TICKET
5234
5235
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
5236
static void TLSX_SessionTicket_ValidateRequest(WOLFSSL* ssl)
5237
{
5238
    TLSX*          extension = TLSX_Find(ssl->extensions, TLSX_SESSION_TICKET);
5239
    SessionTicket* ticket    = extension ?
5240
                                         (SessionTicket*)extension->data : NULL;
5241
5242
    if (ticket) {
5243
        /* TODO validate ticket timeout here! */
5244
        if (ticket->lifetime == 0xfffffff) {
5245
            /* send empty ticket on timeout */
5246
            TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
5247
        }
5248
    }
5249
}
5250
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
5251
5252
5253
static word16 TLSX_SessionTicket_GetSize(SessionTicket* ticket, int isRequest)
5254
{
5255
    (void)isRequest;
5256
    return ticket ? ticket->size : 0;
5257
}
5258
5259
static word16 TLSX_SessionTicket_Write(SessionTicket* ticket, byte* output,
5260
                                       int isRequest)
5261
{
5262
    word16 offset = 0; /* empty ticket */
5263
5264
    if (isRequest && ticket) {
5265
        XMEMCPY(output + offset, ticket->data, ticket->size);
5266
        offset += ticket->size;
5267
    }
5268
5269
    return offset;
5270
}
5271
5272
5273
static int TLSX_SessionTicket_Parse(WOLFSSL* ssl, const byte* input,
5274
                                    word16 length, byte isRequest)
5275
{
5276
    int ret = 0;
5277
5278
    (void) input; /* avoid unused parameter if NO_WOLFSSL_SERVER defined */
5279
5280
    if (!isRequest) {
5281
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET))
5282
            return TLSX_HandleUnsupportedExtension(ssl);
5283
5284
        if (length != 0)
5285
            return BUFFER_ERROR;
5286
5287
#ifndef NO_WOLFSSL_CLIENT
5288
        ssl->expect_session_ticket = 1;
5289
#endif
5290
    }
5291
#ifndef NO_WOLFSSL_SERVER
5292
    else {
5293
        /* server side */
5294
        if (ssl->ctx->ticketEncCb == NULL) {
5295
            WOLFSSL_MSG("Client sent session ticket, server has no callback");
5296
            return 0;
5297
        }
5298
5299
        if (length > SESSION_TICKET_LEN) {
5300
            ret = BAD_TICKET_MSG_SZ;
5301
            WOLFSSL_ERROR_VERBOSE(ret);
5302
        } else if (IsAtLeastTLSv1_3(ssl->version)) {
5303
            WOLFSSL_MSG("Process client ticket rejected, TLS 1.3 no support");
5304
            ssl->options.rejectTicket = 1;
5305
            ret = 0;  /* not fatal */
5306
        } else if (ssl->options.noTicketTls12) {
5307
            /* ignore ticket request */
5308
        } else if (length == 0) {
5309
            /* blank ticket */
5310
            ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
5311
            if (ret == WOLFSSL_SUCCESS) {
5312
                ret = 0;
5313
                /* send blank ticket */
5314
                TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
5315
                ssl->options.createTicket = 1;  /* will send ticket msg */
5316
                ssl->options.useTicket    = 1;
5317
                ssl->options.resuming     = 0;  /* no standard resumption */
5318
                ssl->arrays->sessionIDSz  = 0;  /* no echo on blank ticket */
5319
            }
5320
        } else {
5321
            /* got actual ticket from client */
5322
            ret = DoClientTicket(ssl, input, length);
5323
            if (ret == WOLFSSL_TICKET_RET_OK) {    /* use ticket to resume */
5324
                WOLFSSL_MSG("Using existing client ticket");
5325
                ssl->options.useTicket    = 1;
5326
                ssl->options.resuming     = 1;
5327
                /* SERVER: ticket is peer auth. */
5328
                ssl->options.peerAuthGood = 1;
5329
            } else if (ret == WOLFSSL_TICKET_RET_CREATE) {
5330
                WOLFSSL_MSG("Using existing client ticket, creating new one");
5331
                ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
5332
                if (ret == WOLFSSL_SUCCESS) {
5333
                    ret = 0;
5334
                    TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
5335
                                                    /* send blank ticket */
5336
                    ssl->options.createTicket = 1;  /* will send ticket msg */
5337
                    ssl->options.useTicket    = 1;
5338
                    ssl->options.resuming     = 1;
5339
                    /* SERVER: ticket is peer auth. */
5340
                    ssl->options.peerAuthGood = 1;
5341
                }
5342
            } else if (ret == WOLFSSL_TICKET_RET_REJECT) {
5343
                WOLFSSL_MSG("Process client ticket rejected, not using");
5344
                ssl->options.rejectTicket = 1;
5345
                ret = 0;  /* not fatal */
5346
            } else if (ret == VERSION_ERROR) {
5347
                WOLFSSL_MSG("Process client ticket rejected, bad TLS version");
5348
                ssl->options.rejectTicket = 1;
5349
                ret = 0;  /* not fatal */
5350
            } else if (ret == WOLFSSL_TICKET_RET_FATAL) {
5351
                WOLFSSL_MSG("Process client ticket fatal error, not using");
5352
            } else if (ret < 0) {
5353
                WOLFSSL_MSG("Process client ticket unknown error, not using");
5354
            }
5355
        }
5356
    }
5357
#endif /* NO_WOLFSSL_SERVER */
5358
5359
#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER)
5360
    (void)ssl;
5361
#endif
5362
5363
    return ret;
5364
}
5365
5366
WOLFSSL_LOCAL SessionTicket* TLSX_SessionTicket_Create(word32 lifetime,
5367
                                            byte* data, word16 size, void* heap)
5368
{
5369
    SessionTicket* ticket = (SessionTicket*)XMALLOC(sizeof(SessionTicket),
5370
                                                       heap, DYNAMIC_TYPE_TLSX);
5371
    if (ticket) {
5372
        ticket->data = (byte*)XMALLOC(size, heap, DYNAMIC_TYPE_TLSX);
5373
        if (ticket->data == NULL) {
5374
            XFREE(ticket, heap, DYNAMIC_TYPE_TLSX);
5375
            return NULL;
5376
        }
5377
5378
        XMEMCPY(ticket->data, data, size);
5379
        ticket->size     = size;
5380
        ticket->lifetime = lifetime;
5381
    }
5382
5383
    (void)heap;
5384
5385
    return ticket;
5386
}
5387
WOLFSSL_LOCAL void TLSX_SessionTicket_Free(SessionTicket* ticket, void* heap)
5388
{
5389
    if (ticket) {
5390
        XFREE(ticket->data, heap, DYNAMIC_TYPE_TLSX);
5391
        XFREE(ticket,       heap, DYNAMIC_TYPE_TLSX);
5392
    }
5393
5394
    (void)heap;
5395
}
5396
5397
int TLSX_UseSessionTicket(TLSX** extensions, SessionTicket* ticket, void* heap)
5398
{
5399
    int ret = 0;
5400
5401
    if (extensions == NULL)
5402
        return BAD_FUNC_ARG;
5403
5404
    /* If the ticket is NULL, the client will request a new ticket from the
5405
       server. Otherwise, the client will use it in the next client hello. */
5406
    if ((ret = TLSX_Push(extensions, TLSX_SESSION_TICKET, (void*)ticket, heap))
5407
                                                                           != 0)
5408
        return ret;
5409
5410
    return WOLFSSL_SUCCESS;
5411
}
5412
5413
#define WOLF_STK_VALIDATE_REQUEST TLSX_SessionTicket_ValidateRequest
5414
#define WOLF_STK_GET_SIZE         TLSX_SessionTicket_GetSize
5415
#define WOLF_STK_WRITE            TLSX_SessionTicket_Write
5416
#define WOLF_STK_PARSE            TLSX_SessionTicket_Parse
5417
#define WOLF_STK_FREE(stk, heap)  TLSX_SessionTicket_Free((SessionTicket*)(stk),(heap))
5418
5419
#else
5420
5421
#define WOLF_STK_FREE(a, b)
5422
#define WOLF_STK_VALIDATE_REQUEST(a)
5423
0
#define WOLF_STK_GET_SIZE(a, b)      0
5424
0
#define WOLF_STK_WRITE(a, b, c)      0
5425
0
#define WOLF_STK_PARSE(a, b, c, d)   0
5426
5427
#endif /* HAVE_SESSION_TICKET */
5428
5429
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
5430
/******************************************************************************/
5431
/* Encrypt-then-MAC                                                           */
5432
/******************************************************************************/
5433
5434
#ifndef WOLFSSL_NO_TLS12
5435
static int TLSX_EncryptThenMac_Use(WOLFSSL* ssl);
5436
5437
/**
5438
 * Get the size of the Encrypt-Then-MAC extension.
5439
 *
5440
 * msgType  Type of message to put extension into.
5441
 * pSz      Size of extension data.
5442
 * return SANITY_MSG_E when the message is not allowed to have extension and
5443
 *        0 otherwise.
5444
 */
5445
static int TLSX_EncryptThenMac_GetSize(byte msgType, word16* pSz)
5446
0
{
5447
0
    (void)pSz;
5448
5449
0
    if (msgType != client_hello && msgType != server_hello) {
5450
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
5451
0
        return SANITY_MSG_E;
5452
0
    }
5453
5454
    /* Empty extension */
5455
5456
0
    return 0;
5457
0
}
5458
5459
/**
5460
 * Write the Encrypt-Then-MAC extension.
5461
 *
5462
 * data     Unused
5463
 * output   Extension data buffer. Unused.
5464
 * msgType  Type of message to put extension into.
5465
 * pSz      Size of extension data.
5466
 * return SANITY_MSG_E when the message is not allowed to have extension and
5467
 *        0 otherwise.
5468
 */
5469
static int TLSX_EncryptThenMac_Write(void* data, byte* output, byte msgType,
5470
                                     word16* pSz)
5471
0
{
5472
0
    (void)data;
5473
0
    (void)output;
5474
0
    (void)pSz;
5475
5476
0
    if (msgType != client_hello && msgType != server_hello) {
5477
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
5478
0
        return SANITY_MSG_E;
5479
0
    }
5480
5481
    /* Empty extension */
5482
5483
0
    return 0;
5484
0
}
5485
5486
/**
5487
 * Parse the Encrypt-Then-MAC extension.
5488
 *
5489
 * ssl      SSL object
5490
 * input    Extension data buffer.
5491
 * length   Length of this extension's data.
5492
 * msgType  Type of message to extension appeared in.
5493
 * return SANITY_MSG_E when the message is not allowed to have extension,
5494
 *        BUFFER_ERROR when the extension's data is invalid,
5495
 *        MEMORY_E when unable to allocate memory and
5496
 *        0 otherwise.
5497
 */
5498
static int TLSX_EncryptThenMac_Parse(WOLFSSL* ssl, const byte* input,
5499
                                     word16 length, byte msgType)
5500
0
{
5501
0
    int ret;
5502
5503
0
    (void)input;
5504
5505
0
    if (msgType != client_hello && msgType != server_hello) {
5506
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
5507
0
        return SANITY_MSG_E;
5508
0
    }
5509
5510
    /* Empty extension */
5511
0
    if (length != 0)
5512
0
        return BUFFER_ERROR;
5513
5514
0
    if (msgType == client_hello) {
5515
        /* Check the user hasn't disallowed use of Encrypt-Then-Mac. */
5516
0
        if (!ssl->options.disallowEncThenMac) {
5517
0
            ssl->options.encThenMac = 1;
5518
            /* Set the extension reply. */
5519
0
            ret = TLSX_EncryptThenMac_Use(ssl);
5520
0
            if (ret != 0)
5521
0
                return ret;
5522
0
        }
5523
0
        return 0;
5524
0
    }
5525
5526
    /* Server Hello */
5527
0
    if (ssl->options.disallowEncThenMac) {
5528
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
5529
0
        return SANITY_MSG_E;
5530
0
    }
5531
5532
0
    ssl->options.encThenMac = 1;
5533
0
    return 0;
5534
5535
0
}
5536
5537
/**
5538
 * Add the Encrypt-Then-MAC extension to list.
5539
 *
5540
 * ssl      SSL object
5541
 * return MEMORY_E when unable to allocate memory and 0 otherwise.
5542
 */
5543
static int TLSX_EncryptThenMac_Use(WOLFSSL* ssl)
5544
0
{
5545
0
    int   ret = 0;
5546
0
    TLSX* extension;
5547
5548
    /* Find the Encrypt-Then-Mac extension if it exists. */
5549
0
    extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
5550
0
    if (extension == NULL) {
5551
        /* Push new Encrypt-Then-Mac extension. */
5552
0
        ret = TLSX_Push(&ssl->extensions, TLSX_ENCRYPT_THEN_MAC, NULL,
5553
0
            ssl->heap);
5554
0
        if (ret != 0)
5555
0
            return ret;
5556
0
    }
5557
5558
0
    return 0;
5559
0
}
5560
5561
/**
5562
 * Set the Encrypt-Then-MAC extension as one to respond too.
5563
 *
5564
 * ssl      SSL object
5565
 * return EXT_MISSING when EncryptThenMac extension not in list.
5566
 */
5567
int TLSX_EncryptThenMac_Respond(WOLFSSL* ssl)
5568
0
{
5569
0
    TLSX* extension;
5570
5571
0
    extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
5572
0
    if (extension == NULL)
5573
0
        return EXT_MISSING;
5574
0
    extension->resp = 1;
5575
5576
0
    return 0;
5577
0
}
5578
5579
0
#define ETM_GET_SIZE  TLSX_EncryptThenMac_GetSize
5580
0
#define ETM_WRITE     TLSX_EncryptThenMac_Write
5581
0
#define ETM_PARSE     TLSX_EncryptThenMac_Parse
5582
5583
#else
5584
5585
#define ETM_GET_SIZE(a, b)    0
5586
#define ETM_WRITE(a, b, c, d) 0
5587
#define ETM_PARSE(a, b, c, d) 0
5588
5589
#endif /* !WOLFSSL_NO_TLS12 */
5590
5591
#endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
5592
5593
5594
#ifdef WOLFSSL_SRTP
5595
5596
/******************************************************************************/
5597
/* DTLS SRTP (Secure Real-time Transport Protocol)                            */
5598
/******************************************************************************/
5599
5600
/* Only support single SRTP profile */
5601
typedef struct TlsxSrtp {
5602
    word16 profileCount;
5603
    word16 ids; /* selected bits */
5604
} TlsxSrtp;
5605
5606
static int TLSX_UseSRTP_GetSize(TlsxSrtp *srtp)
5607
{
5608
    /*   SRTP Profile Len (2)
5609
     *      SRTP Profiles (2)
5610
     *   MKI (master key id) Length */
5611
    return (OPAQUE16_LEN + (srtp->profileCount * OPAQUE16_LEN) + 1);
5612
}
5613
5614
static TlsxSrtp* TLSX_UseSRTP_New(word16 ids, void* heap)
5615
{
5616
    TlsxSrtp* srtp;
5617
    int i;
5618
5619
    srtp = (TlsxSrtp*)XMALLOC(sizeof(TlsxSrtp), heap, DYNAMIC_TYPE_TLSX);
5620
    if (srtp == NULL) {
5621
        WOLFSSL_MSG("TLSX SRTP Memory failure");
5622
        return NULL;
5623
    }
5624
5625
    /* count and test each bit set */
5626
    srtp->profileCount = 0;
5627
    for (i=0; i<16; i++) {
5628
        if (ids & (1 << i)) {
5629
            srtp->profileCount++;
5630
        }
5631
    }
5632
    srtp->ids = ids;
5633
5634
    return srtp;
5635
}
5636
5637
static void TLSX_UseSRTP_Free(TlsxSrtp *srtp, void* heap)
5638
{
5639
    if (srtp != NULL) {
5640
        XFREE(srtp, heap, DYNAMIC_TYPE_TLSX);
5641
    }
5642
    (void)heap;
5643
}
5644
5645
static int TLSX_UseSRTP_Parse(WOLFSSL* ssl, const byte* input, word16 length,
5646
    byte isRequest)
5647
{
5648
    int ret = BAD_FUNC_ARG;
5649
    word16 profile_len = 0;
5650
    word16 profile_value = 0;
5651
    word16 offset = 0;
5652
#ifndef NO_WOLFSSL_SERVER
5653
    int i;
5654
    TlsxSrtp* srtp = NULL;
5655
#endif
5656
5657
    if (length < OPAQUE16_LEN) {
5658
        return BUFFER_ERROR;
5659
    }
5660
5661
    /* reset selected DTLS SRTP profile ID */
5662
    ssl->dtlsSrtpId = 0;
5663
5664
    /* total length, not include itself */
5665
    ato16(input, &profile_len);
5666
    offset += OPAQUE16_LEN;
5667
5668
    if (!isRequest) {
5669
#ifndef NO_WOLFSSL_CLIENT
5670
        if (length < offset + OPAQUE16_LEN)
5671
            return BUFFER_ERROR;
5672
5673
        ato16(input + offset, &profile_value);
5674
5675
        /* check that the profile received was in the ones we support */
5676
        if (profile_value < 16 &&
5677
                               (ssl->dtlsSrtpProfiles & (1 << profile_value))) {
5678
            ssl->dtlsSrtpId = profile_value;
5679
            ret = 0; /* success */
5680
        }
5681
#endif
5682
    }
5683
#ifndef NO_WOLFSSL_SERVER
5684
    else {
5685
        /* parse remainder one profile at a time, looking for match in CTX */
5686
        ret = 0;
5687
        for (i=offset; i<length; i+=OPAQUE16_LEN) {
5688
            ato16(input+i, &profile_value);
5689
            /* find first match */
5690
            if (profile_value < 16 &&
5691
                                 ssl->dtlsSrtpProfiles & (1 << profile_value)) {
5692
                ssl->dtlsSrtpId = profile_value;
5693
5694
                /* make sure we respond with selected SRTP id selected */
5695
                srtp = TLSX_UseSRTP_New((1 << profile_value), ssl->heap);
5696
                if (srtp != NULL) {
5697
                    ret = TLSX_Push(&ssl->extensions, TLSX_USE_SRTP,
5698
                        (void*)srtp, ssl->heap);
5699
                    if (ret == 0) {
5700
                        TLSX_SetResponse(ssl, TLSX_USE_SRTP);
5701
                        /* successfully set extension */
5702
                    }
5703
                }
5704
                else {
5705
                    ret = MEMORY_E;
5706
                }
5707
                break;
5708
            }
5709
        }
5710
    }
5711
5712
    if (ret == 0 && ssl->dtlsSrtpId == 0) {
5713
        WOLFSSL_MSG("TLSX_UseSRTP_Parse profile not found!");
5714
        /* not fatal */
5715
    }
5716
    else if (ret != 0) {
5717
        ssl->dtlsSrtpId = 0;
5718
        TLSX_UseSRTP_Free(srtp, ssl->heap);
5719
    }
5720
#endif
5721
    (void)profile_len;
5722
5723
    return ret;
5724
}
5725
5726
static word16 TLSX_UseSRTP_Write(TlsxSrtp* srtp, byte* output)
5727
{
5728
    word16 offset = 0;
5729
    int i, j;
5730
5731
    c16toa(srtp->profileCount * 2, output + offset);
5732
    offset += OPAQUE16_LEN;
5733
    j = 0;
5734
    for (i = 0; i < srtp->profileCount; i++) {
5735
        for (; j < 16; j++) {
5736
            if (srtp->ids & (1 << j)) {
5737
                c16toa(j, output + offset);
5738
                offset += OPAQUE16_LEN;
5739
            }
5740
        }
5741
    }
5742
    output[offset++] = 0x00; /* MKI Length */
5743
5744
    return offset;
5745
}
5746
5747
static int TLSX_UseSRTP(TLSX** extensions, word16 profiles, void* heap)
5748
{
5749
    int ret = 0;
5750
    TLSX* extension;
5751
5752
    if (extensions == NULL) {
5753
        return BAD_FUNC_ARG;
5754
    }
5755
5756
    extension = TLSX_Find(*extensions, TLSX_USE_SRTP);
5757
    if (extension == NULL) {
5758
        TlsxSrtp* srtp = TLSX_UseSRTP_New(profiles, heap);
5759
        if (srtp == NULL) {
5760
            return MEMORY_E;
5761
        }
5762
5763
        ret = TLSX_Push(extensions, TLSX_USE_SRTP, (void*)srtp, heap);
5764
        if (ret != 0) {
5765
            TLSX_UseSRTP_Free(srtp, heap);
5766
        }
5767
    }
5768
5769
    return ret;
5770
}
5771
5772
#ifndef NO_WOLFSSL_SERVER
5773
    #define SRTP_FREE     TLSX_UseSRTP_Free
5774
    #define SRTP_PARSE    TLSX_UseSRTP_Parse
5775
    #define SRTP_WRITE    TLSX_UseSRTP_Write
5776
    #define SRTP_GET_SIZE TLSX_UseSRTP_GetSize
5777
#else
5778
    #define SRTP_FREE(a, b)
5779
    #define SRTP_PARSE(a, b, c, d)      0
5780
    #define SRTP_WRITE(a, b)            0
5781
    #define SRTP_GET_SIZE(a)            0
5782
#endif
5783
5784
#endif /* WOLFSSL_SRTP */
5785
5786
5787
/******************************************************************************/
5788
/* Supported Versions                                                         */
5789
/******************************************************************************/
5790
5791
#ifdef WOLFSSL_TLS13
5792
static WC_INLINE int versionIsGreater(byte isDtls, byte a, byte b)
5793
0
{
5794
0
    (void)isDtls;
5795
5796
#ifdef WOLFSSL_DTLS
5797
    /* DTLS version increases backwards (-1,-2,-3,etc) */
5798
    if (isDtls)
5799
        return a < b;
5800
#endif /* WOLFSSL_DTLS */
5801
5802
0
    return a > b;
5803
0
}
5804
5805
static WC_INLINE int versionIsLesser(byte isDtls, byte a, byte b)
5806
0
{
5807
0
    (void)isDtls;
5808
5809
#ifdef WOLFSSL_DTLS
5810
    /* DTLS version increases backwards (-1,-2,-3,etc) */
5811
    if (isDtls)
5812
        return a > b;
5813
#endif /* WOLFSSL_DTLS */
5814
5815
0
    return a < b;
5816
0
}
5817
5818
static WC_INLINE int versionIsAtLeast(byte isDtls, byte a, byte b)
5819
0
{
5820
0
    (void)isDtls;
5821
5822
#ifdef WOLFSSL_DTLS
5823
    /* DTLS version increases backwards (-1,-2,-3,etc) */
5824
    if (isDtls)
5825
        return a <= b;
5826
#endif /* WOLFSSL_DTLS */
5827
5828
0
    return a >= b;
5829
0
}
5830
5831
static WC_INLINE int versionIsLessEqual(byte isDtls, byte a, byte b)
5832
0
{
5833
0
    (void)isDtls;
5834
5835
#ifdef WOLFSSL_DTLS
5836
    /* DTLS version increases backwards (-1,-2,-3,etc) */
5837
    if (isDtls)
5838
        return a >= b;
5839
#endif /* WOLFSSL_DTLS */
5840
5841
0
    return a <= b;
5842
0
}
5843
5844
/* Return the size of the SupportedVersions extension's data.
5845
 *
5846
 * data       The SSL/TLS object.
5847
 * msgType The type of the message this extension is being written into.
5848
 * returns the length of data that will be in the extension.
5849
 */
5850
static int TLSX_SupportedVersions_GetSize(void* data, byte msgType, word16* pSz)
5851
0
{
5852
0
    WOLFSSL* ssl = (WOLFSSL*)data;
5853
0
    byte tls13Minor, tls12Minor, tls11Minor, isDtls;
5854
5855
0
    isDtls = !!ssl->options.dtls;
5856
0
    tls13Minor = (byte)(isDtls ? DTLSv1_3_MINOR : TLSv1_3_MINOR);
5857
0
    tls12Minor = (byte)(isDtls ? DTLSv1_2_MINOR : TLSv1_2_MINOR);
5858
0
    tls11Minor = (byte)(isDtls ? DTLS_MINOR : TLSv1_1_MINOR);
5859
5860
    /* unused on some configuration */
5861
0
    (void)tls12Minor;
5862
0
    (void)tls13Minor;
5863
0
    (void)tls11Minor;
5864
5865
0
    if (msgType == client_hello) {
5866
        /* TLS v1.2 and TLS v1.3  */
5867
0
        int cnt = 0;
5868
5869
0
        if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls13Minor)
5870
        #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
5871
            defined(WOLFSSL_WPAS_SMALL)
5872
            && (ssl->options.mask & SSL_OP_NO_TLSv1_3) == 0
5873
        #endif
5874
0
        ) {
5875
0
            cnt++;
5876
0
        }
5877
5878
0
        if (ssl->options.downgrade) {
5879
0
    #ifndef WOLFSSL_NO_TLS12
5880
0
            if (versionIsLessEqual(
5881
0
                    isDtls, ssl->options.minDowngrade, tls12Minor)
5882
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) ||                       \
5883
    defined(WOLFSSL_WPAS_SMALL)
5884
                && (ssl->options.mask & SSL_OP_NO_TLSv1_2) == 0
5885
#endif
5886
0
            ) {
5887
0
                cnt++;
5888
0
            }
5889
0
#endif
5890
0
    #ifndef NO_OLD_TLS
5891
0
            if (versionIsLessEqual(
5892
0
                    isDtls, ssl->options.minDowngrade, tls11Minor)
5893
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
5894
                defined(WOLFSSL_WPAS_SMALL)
5895
                && (ssl->options.mask & SSL_OP_NO_TLSv1_1) == 0
5896
            #endif
5897
0
            ) {
5898
0
                cnt++;
5899
0
            }
5900
        #ifdef WOLFSSL_ALLOW_TLSV10
5901
            if (!ssl->options.dtls && (ssl->options.minDowngrade <= TLSv1_MINOR)
5902
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
5903
                defined(WOLFSSL_WPAS_SMALL)
5904
                && (ssl->options.mask & SSL_OP_NO_TLSv1) == 0
5905
            #endif
5906
            ) {
5907
                cnt++;
5908
            }
5909
        #endif
5910
0
    #endif
5911
0
        }
5912
5913
0
        *pSz += (word16)(OPAQUE8_LEN + cnt * OPAQUE16_LEN);
5914
0
    }
5915
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
5916
0
        *pSz += OPAQUE16_LEN;
5917
0
    }
5918
0
    else {
5919
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
5920
0
        return SANITY_MSG_E;
5921
0
    }
5922
5923
0
    return 0;
5924
0
}
5925
5926
/* Writes the SupportedVersions extension into the buffer.
5927
 *
5928
 * data    The SSL/TLS object.
5929
 * output  The buffer to write the extension into.
5930
 * msgType The type of the message this extension is being written into.
5931
 * returns the length of data that was written.
5932
 */
5933
static int TLSX_SupportedVersions_Write(void* data, byte* output,
5934
                                        byte msgType, word16* pSz)
5935
0
{
5936
0
    WOLFSSL* ssl = (WOLFSSL*)data;
5937
0
    byte tls13minor, tls12minor, tls11minor, isDtls = 0;
5938
5939
0
    tls13minor = (byte)TLSv1_3_MINOR;
5940
0
    tls12minor = (byte)TLSv1_2_MINOR;
5941
0
    tls11minor = (byte)TLSv1_1_MINOR;
5942
5943
    /* unused in some configuration */
5944
0
    (void)tls11minor;
5945
0
    (void)tls12minor;
5946
5947
#ifdef WOLFSSL_DTLS13
5948
    if (ssl->options.dtls) {
5949
        tls13minor = (byte)DTLSv1_3_MINOR;
5950
        tls12minor = (byte)DTLSv1_2_MINOR;
5951
        tls11minor = (byte)DTLS_MINOR;
5952
        isDtls = 1;
5953
    }
5954
#endif /* WOLFSSL_DTLS13 */
5955
5956
0
    if (msgType == client_hello) {
5957
0
        byte major = ssl->ctx->method->version.major;
5958
5959
0
        byte* cnt = output++;
5960
0
        *cnt = 0;
5961
5962
0
        if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls13minor)
5963
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) ||                       \
5964
    defined(WOLFSSL_WPAS_SMALL)
5965
            && (ssl->options.mask & SSL_OP_NO_TLSv1_3) == 0
5966
#endif
5967
0
        ) {
5968
0
            *cnt += OPAQUE16_LEN;
5969
        #ifdef WOLFSSL_TLS13_DRAFT
5970
            /* The TLS draft major number. */
5971
            *(output++) = TLS_DRAFT_MAJOR;
5972
            /* Version of draft supported. */
5973
            *(output++) = TLS_DRAFT_MINOR;
5974
        #else
5975
0
            *(output++) = major;
5976
0
            *(output++) = tls13minor;
5977
0
        #endif
5978
0
        }
5979
5980
0
        if (ssl->options.downgrade) {
5981
0
        #ifndef WOLFSSL_NO_TLS12
5982
0
            if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls12minor)
5983
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
5984
                defined(WOLFSSL_WPAS_SMALL)
5985
                && (ssl->options.mask & SSL_OP_NO_TLSv1_2) == 0
5986
            #endif
5987
0
            ) {
5988
0
                *cnt += OPAQUE16_LEN;
5989
0
                *(output++) = major;
5990
0
                *(output++) = tls12minor;
5991
0
            }
5992
0
        #endif
5993
5994
0
    #ifndef NO_OLD_TLS
5995
0
            if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls11minor)
5996
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
5997
                defined(WOLFSSL_WPAS_SMALL)
5998
                && (ssl->options.mask & SSL_OP_NO_TLSv1_1) == 0
5999
            #endif
6000
0
            ) {
6001
0
                *cnt += OPAQUE16_LEN;
6002
0
                *(output++) = major;
6003
0
                *(output++) = tls11minor;
6004
0
            }
6005
        #ifdef WOLFSSL_ALLOW_TLSV10
6006
            if (!ssl->options.dtls && (ssl->options.minDowngrade <= TLSv1_MINOR)
6007
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6008
                defined(WOLFSSL_WPAS_SMALL)
6009
                && (ssl->options.mask & SSL_OP_NO_TLSv1) == 0
6010
            #endif
6011
            ) {
6012
                *cnt += OPAQUE16_LEN;
6013
                *(output++) = major;
6014
                *(output++) = (byte)TLSv1_MINOR;
6015
            }
6016
        #endif
6017
0
    #endif
6018
0
        }
6019
6020
0
        *pSz += (word16)(OPAQUE8_LEN + *cnt);
6021
0
    }
6022
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
6023
0
        output[0] = ssl->version.major;
6024
0
        output[1] = ssl->version.minor;
6025
6026
0
        *pSz += OPAQUE16_LEN;
6027
0
    }
6028
0
    else {
6029
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6030
0
        return SANITY_MSG_E;
6031
0
    }
6032
6033
0
    return 0;
6034
0
}
6035
6036
/* Parse the SupportedVersions extension.
6037
 *
6038
 * ssl     The SSL/TLS object.
6039
 * input   The buffer with the extension data.
6040
 * length  The length of the extension data.
6041
 * msgType The type of the message this extension is being parsed from.
6042
 * pv      The output ProtocolVersion for the negotiated version
6043
 * opts    The output options structure. Can be NULL.
6044
 * exts    The output extensions list. Can be NULL.
6045
 * returns 0 on success, otherwise failure.
6046
 */
6047
int TLSX_SupportedVersions_Parse(const WOLFSSL* ssl, const byte* input,
6048
        word16 length, byte msgType, ProtocolVersion* pv, Options* opts,
6049
        TLSX** exts)
6050
0
{
6051
    /* The client's greatest minor version that we support */
6052
0
    byte clientGreatestMinor = SSLv3_MINOR;
6053
0
    int ret;
6054
0
    byte major, minor;
6055
0
    byte tls13minor, tls12minor;
6056
0
    byte isDtls;
6057
6058
0
    tls13minor = TLSv1_3_MINOR;
6059
0
    tls12minor = TLSv1_2_MINOR;
6060
0
    isDtls = ssl->options.dtls == 1;
6061
6062
#ifdef WOLFSSL_DTLS13
6063
    if (ssl->options.dtls) {
6064
        tls13minor = DTLSv1_3_MINOR;
6065
        tls12minor = DTLSv1_2_MINOR;
6066
        clientGreatestMinor = DTLS_MINOR;
6067
    }
6068
#endif /* WOLFSSL_DTLS13 */
6069
6070
0
    if (msgType == client_hello) {
6071
0
        int i;
6072
0
        int len;
6073
0
        int set = 0;
6074
6075
        /* Must contain a length and at least one version. */
6076
0
        if (length < OPAQUE8_LEN + OPAQUE16_LEN || (length & 1) != 1)
6077
0
            return BUFFER_ERROR;
6078
6079
0
        len = *input;
6080
6081
        /* Protocol version array must fill rest of data. */
6082
0
        if (length != (word16)OPAQUE8_LEN + len)
6083
0
            return BUFFER_ERROR;
6084
6085
0
        input++;
6086
6087
        /* Find first match. */
6088
0
        for (i = 0; i < len; i += OPAQUE16_LEN) {
6089
0
            major = input[i];
6090
0
            minor = input[i + OPAQUE8_LEN];
6091
6092
#ifdef WOLFSSL_TLS13_DRAFT
6093
            if (major == TLS_DRAFT_MAJOR && minor == TLS_DRAFT_MINOR) {
6094
                major = SSLv3_MAJOR;
6095
                minor = TLSv1_3_MINOR;
6096
            }
6097
#else
6098
0
            if (major == TLS_DRAFT_MAJOR)
6099
0
                continue;
6100
0
#endif
6101
6102
0
            if (major != ssl->ctx->method->version.major)
6103
0
                continue;
6104
6105
            /* No upgrade allowed. */
6106
0
            if (versionIsGreater(isDtls, minor, ssl->version.minor))
6107
0
                continue;
6108
6109
            /* Check downgrade. */
6110
0
            if (versionIsLesser(isDtls, minor, ssl->version.minor)) {
6111
0
                if (!ssl->options.downgrade)
6112
0
                    continue;
6113
6114
0
                if (versionIsLesser(isDtls, minor, ssl->options.minDowngrade))
6115
0
                    continue;
6116
0
            }
6117
0
            if (versionIsGreater(isDtls, minor, clientGreatestMinor))
6118
0
                clientGreatestMinor = minor;
6119
6120
0
            set = 1;
6121
0
        }
6122
0
        if (!set) {
6123
            /* No common supported version was negotiated */
6124
0
            SendAlert((WOLFSSL*)ssl, alert_fatal,
6125
0
                      wolfssl_alert_protocol_version);
6126
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
6127
0
            return VERSION_ERROR;
6128
0
        }
6129
0
        pv->minor = clientGreatestMinor;
6130
0
        if (versionIsAtLeast(isDtls, clientGreatestMinor, tls13minor)) {
6131
0
            if (opts != NULL)
6132
0
                opts->tls1_3 = 1;
6133
6134
            /* TLS v1.3 requires supported version extension */
6135
0
            if (exts != NULL &&
6136
0
                    TLSX_Find(*exts, TLSX_SUPPORTED_VERSIONS) == NULL) {
6137
0
                ret = TLSX_Push(exts,
6138
0
                          TLSX_SUPPORTED_VERSIONS, ssl, ssl->heap);
6139
0
                if (ret != 0) {
6140
0
                    return ret;
6141
0
                }
6142
                /* *exts should be pointing to the TLSX_SUPPORTED_VERSIONS
6143
                 * ext in the list since it was pushed. */
6144
0
                (*exts)->resp = 1;
6145
0
            }
6146
0
        }
6147
6148
0
    }
6149
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
6150
        /* Must contain one version. */
6151
0
        if (length != OPAQUE16_LEN)
6152
0
            return BUFFER_ERROR;
6153
6154
0
        major = input[0];
6155
0
        minor = input[OPAQUE8_LEN];
6156
6157
0
        if (major != ssl->ctx->method->version.major) {
6158
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
6159
0
            return VERSION_ERROR;
6160
0
        }
6161
6162
        /* Can't downgrade with this extension below TLS v1.3. */
6163
0
        if (versionIsLesser(isDtls, minor, tls13minor)) {
6164
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
6165
0
            return VERSION_ERROR;
6166
0
        }
6167
6168
        /* Version is TLS v1.2 to handle downgrading from TLS v1.3+. */
6169
0
        if (ssl->options.downgrade && ssl->version.minor == tls12minor) {
6170
            /* Set minor version back to TLS v1.3+ */
6171
0
            pv->minor = ssl->ctx->method->version.minor;
6172
0
        }
6173
6174
        /* No upgrade allowed. */
6175
0
        if (versionIsLesser(isDtls, ssl->version.minor, minor)) {
6176
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
6177
0
            return VERSION_ERROR;
6178
0
        }
6179
6180
        /* Check downgrade. */
6181
0
        if (versionIsGreater(isDtls, ssl->version.minor, minor)) {
6182
0
            if (!ssl->options.downgrade) {
6183
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
6184
0
                return VERSION_ERROR;
6185
0
            }
6186
6187
0
            if (versionIsLesser(
6188
0
                    isDtls, minor, ssl->options.minDowngrade)) {
6189
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
6190
0
                return VERSION_ERROR;
6191
0
            }
6192
6193
            /* Downgrade the version. */
6194
0
            pv->minor = minor;
6195
0
        }
6196
0
    }
6197
0
    else {
6198
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6199
0
        return SANITY_MSG_E;
6200
0
    }
6201
6202
0
    return 0;
6203
0
}
6204
6205
/* Sets a new SupportedVersions extension into the extension list.
6206
 *
6207
 * extensions  The list of extensions.
6208
 * data        The extensions specific data.
6209
 * heap        The heap used for allocation.
6210
 * returns 0 on success, otherwise failure.
6211
 */
6212
static int TLSX_SetSupportedVersions(TLSX** extensions, const void* data,
6213
                                     void* heap)
6214
0
{
6215
0
    if (extensions == NULL || data == NULL)
6216
0
        return BAD_FUNC_ARG;
6217
6218
0
    return TLSX_Push(extensions, TLSX_SUPPORTED_VERSIONS, data, heap);
6219
0
}
6220
6221
0
#define SV_GET_SIZE  TLSX_SupportedVersions_GetSize
6222
0
#define SV_WRITE     TLSX_SupportedVersions_Write
6223
0
#define SV_PARSE     TLSX_SupportedVersions_Parse
6224
6225
#else
6226
6227
#define SV_GET_SIZE(a, b, c) 0
6228
#define SV_WRITE(a, b, c, d) 0
6229
#define SV_PARSE(a, b, c, d, e, f, g) 0
6230
6231
#endif /* WOLFSSL_TLS13 */
6232
6233
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
6234
6235
/******************************************************************************/
6236
/* Cookie                                                                     */
6237
/******************************************************************************/
6238
6239
/* Free the cookie data.
6240
 *
6241
 * cookie  Cookie data.
6242
 * heap    The heap used for allocation.
6243
 */
6244
static void TLSX_Cookie_FreeAll(Cookie* cookie, void* heap)
6245
{
6246
    (void)heap;
6247
6248
    if (cookie != NULL)
6249
        XFREE(cookie, heap, DYNAMIC_TYPE_TLSX);
6250
}
6251
6252
/* Get the size of the encoded Cookie extension.
6253
 * In messages: ClientHello and HelloRetryRequest.
6254
 *
6255
 * cookie   The cookie to write.
6256
 * msgType  The type of the message this extension is being written into.
6257
 * returns the number of bytes of the encoded Cookie extension.
6258
 */
6259
static int TLSX_Cookie_GetSize(Cookie* cookie, byte msgType, word16* pSz)
6260
{
6261
    if (msgType == client_hello || msgType == hello_retry_request) {
6262
        *pSz += OPAQUE16_LEN + cookie->len;
6263
    }
6264
    else {
6265
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6266
        return SANITY_MSG_E;
6267
    }
6268
    return 0;
6269
}
6270
6271
/* Writes the Cookie extension into the output buffer.
6272
 * Assumes that the the output buffer is big enough to hold data.
6273
 * In messages: ClientHello and HelloRetryRequest.
6274
 *
6275
 * cookie   The cookie to write.
6276
 * output   The buffer to write into.
6277
 * msgType  The type of the message this extension is being written into.
6278
 * returns the number of bytes written into the buffer.
6279
 */
6280
static int TLSX_Cookie_Write(Cookie* cookie, byte* output, byte msgType,
6281
                             word16* pSz)
6282
{
6283
    if (msgType == client_hello || msgType == hello_retry_request) {
6284
        c16toa(cookie->len, output);
6285
        output += OPAQUE16_LEN;
6286
        XMEMCPY(output, cookie->data, cookie->len);
6287
        *pSz += OPAQUE16_LEN + cookie->len;
6288
    }
6289
    else {
6290
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6291
        return SANITY_MSG_E;
6292
    }
6293
    return 0;
6294
}
6295
6296
/* Parse the Cookie extension.
6297
 * In messages: ClientHello and HelloRetryRequest.
6298
 *
6299
 * ssl      The SSL/TLS object.
6300
 * input    The extension data.
6301
 * length   The length of the extension data.
6302
 * msgType  The type of the message this extension is being parsed from.
6303
 * returns 0 on success and other values indicate failure.
6304
 */
6305
static int TLSX_Cookie_Parse(WOLFSSL* ssl, const byte* input, word16 length,
6306
                             byte msgType)
6307
{
6308
    word16  len;
6309
    word16  idx = 0;
6310
    TLSX*   extension;
6311
    Cookie* cookie;
6312
6313
    if (msgType != client_hello && msgType != hello_retry_request) {
6314
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6315
        return SANITY_MSG_E;
6316
    }
6317
6318
    /* Message contains length and Cookie which must be at least one byte
6319
     * in length.
6320
     */
6321
    if (length < OPAQUE16_LEN + 1)
6322
        return BUFFER_E;
6323
    ato16(input + idx, &len);
6324
    idx += OPAQUE16_LEN;
6325
    if (length - idx != len)
6326
        return BUFFER_E;
6327
6328
    if (msgType == hello_retry_request)
6329
        return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 0,
6330
                               &ssl->extensions);
6331
6332
    /* client_hello */
6333
    extension = TLSX_Find(ssl->extensions, TLSX_COOKIE);
6334
    if (extension == NULL) {
6335
#ifdef WOLFSSL_DTLS13
6336
        if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version))
6337
            /* Allow a cookie extension with DTLS 1.3 because it is possible
6338
             * that a different SSL instance sent the cookie but we are now
6339
             * receiving it. */
6340
            return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 0,
6341
                                   &ssl->extensions);
6342
        else
6343
#endif
6344
        {
6345
            WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
6346
            return HRR_COOKIE_ERROR;
6347
        }
6348
    }
6349
6350
    cookie = (Cookie*)extension->data;
6351
    if (cookie->len != len || XMEMCMP(cookie->data, input + idx, len) != 0) {
6352
        WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
6353
        return HRR_COOKIE_ERROR;
6354
    }
6355
6356
    /* Request seen. */
6357
    extension->resp = 0;
6358
6359
    return 0;
6360
}
6361
6362
/* Use the data to create a new Cookie object in the extensions.
6363
 *
6364
 * ssl    SSL/TLS object.
6365
 * data   Cookie data.
6366
 * len    Length of cookie data in bytes.
6367
 * mac    MAC data.
6368
 * macSz  Length of MAC data in bytes.
6369
 * resp   Indicates the extension will go into a response (HelloRetryRequest).
6370
 * returns 0 on success and other values indicate failure.
6371
 */
6372
int TLSX_Cookie_Use(const WOLFSSL* ssl, const byte* data, word16 len, byte* mac,
6373
                    byte macSz, int resp, TLSX** exts)
6374
{
6375
    int     ret = 0;
6376
    TLSX*   extension;
6377
    Cookie* cookie;
6378
6379
    /* Find the cookie extension if it exists. */
6380
    extension = TLSX_Find(*exts, TLSX_COOKIE);
6381
    if (extension == NULL) {
6382
        /* Push new cookie extension. */
6383
        ret = TLSX_Push(exts, TLSX_COOKIE, NULL, ssl->heap);
6384
        if (ret != 0)
6385
            return ret;
6386
6387
        extension = TLSX_Find(*exts, TLSX_COOKIE);
6388
        if (extension == NULL)
6389
            return MEMORY_E;
6390
    }
6391
6392
    cookie = (Cookie*)XMALLOC(sizeof(Cookie) + len + macSz, ssl->heap,
6393
                              DYNAMIC_TYPE_TLSX);
6394
    if (cookie == NULL)
6395
        return MEMORY_E;
6396
6397
    cookie->len = len + macSz;
6398
    XMEMCPY(cookie->data, data, len);
6399
    if (mac != NULL)
6400
        XMEMCPY(cookie->data + len, mac, macSz);
6401
6402
    if (extension->data != NULL)
6403
        XFREE(extension->data, ssl->heap, DYNAMIC_TYPE_TLSX);
6404
6405
    extension->data = (void*)cookie;
6406
    extension->resp = (byte)resp;
6407
6408
    return 0;
6409
}
6410
6411
#define CKE_FREE_ALL  TLSX_Cookie_FreeAll
6412
#define CKE_GET_SIZE  TLSX_Cookie_GetSize
6413
#define CKE_WRITE     TLSX_Cookie_Write
6414
#define CKE_PARSE     TLSX_Cookie_Parse
6415
6416
#else
6417
6418
#define CKE_FREE_ALL(a, b)    0
6419
#define CKE_GET_SIZE(a, b, c) 0
6420
#define CKE_WRITE(a, b, c, d) 0
6421
#define CKE_PARSE(a, b, c, d) 0
6422
6423
#endif
6424
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
6425
/******************************************************************************/
6426
/* Signature Algorithms                                                       */
6427
/******************************************************************************/
6428
6429
/* Return the size of the SignatureAlgorithms extension's data.
6430
 *
6431
 * data  Unused
6432
 * returns the length of data that will be in the extension.
6433
 */
6434
6435
static word16 TLSX_SignatureAlgorithms_GetSize(void* data)
6436
0
{
6437
0
    SignatureAlgorithms* sa = (SignatureAlgorithms*)data;
6438
6439
0
    if (sa->hashSigAlgoSz == 0)
6440
0
        return OPAQUE16_LEN + WOLFSSL_SUITES(sa->ssl)->hashSigAlgoSz;
6441
0
    else
6442
0
        return OPAQUE16_LEN + sa->hashSigAlgoSz;
6443
0
}
6444
6445
/* Creates a bit string of supported hash algorithms with RSA PSS.
6446
 * The bit string is used when determining which signature algorithm to use
6447
 * when creating the CertificateVerify message.
6448
 * Note: Valid data has an even length as each signature algorithm is two bytes.
6449
 *
6450
 * ssl     The SSL/TLS object.
6451
 * input   The buffer with the list of supported signature algorithms.
6452
 * length  The length of the list in bytes.
6453
 * returns 0 on success, BUFFER_ERROR when the length is not even.
6454
 */
6455
static int TLSX_SignatureAlgorithms_MapPss(WOLFSSL *ssl, const byte* input,
6456
                                           word16 length)
6457
0
{
6458
0
    word16 i;
6459
6460
0
    if ((length & 1) == 1)
6461
0
        return BUFFER_ERROR;
6462
6463
0
    ssl->pssAlgo = 0;
6464
0
    for (i = 0; i < length; i += 2) {
6465
0
        if (input[i] == rsa_pss_sa_algo && input[i + 1] <= sha512_mac)
6466
0
            ssl->pssAlgo |= 1 << input[i + 1];
6467
0
    #ifdef WOLFSSL_TLS13
6468
0
        if (input[i] == rsa_pss_sa_algo && input[i + 1] >= pss_sha256 &&
6469
0
                                                   input[i + 1] <= pss_sha512) {
6470
0
            ssl->pssAlgo |= 1 << input[i + 1];
6471
0
        }
6472
0
    #endif
6473
0
    }
6474
6475
0
    return 0;
6476
0
}
6477
6478
/* Writes the SignatureAlgorithms extension into the buffer.
6479
 *
6480
 * data    Unused
6481
 * output  The buffer to write the extension into.
6482
 * returns the length of data that was written.
6483
 */
6484
static word16 TLSX_SignatureAlgorithms_Write(void* data, byte* output)
6485
0
{
6486
0
    SignatureAlgorithms* sa = (SignatureAlgorithms*)data;
6487
0
    const Suites* suites = WOLFSSL_SUITES(sa->ssl);
6488
0
    word16 hashSigAlgoSz;
6489
6490
0
    if (sa->hashSigAlgoSz == 0) {
6491
0
        c16toa(suites->hashSigAlgoSz, output);
6492
0
        XMEMCPY(output + OPAQUE16_LEN, suites->hashSigAlgo,
6493
0
                suites->hashSigAlgoSz);
6494
0
        hashSigAlgoSz = suites->hashSigAlgoSz;
6495
0
    }
6496
0
    else {
6497
0
        c16toa(sa->hashSigAlgoSz, output);
6498
0
        XMEMCPY(output + OPAQUE16_LEN, sa->hashSigAlgo,
6499
0
                sa->hashSigAlgoSz);
6500
0
        hashSigAlgoSz = sa->hashSigAlgoSz;
6501
0
    }
6502
6503
0
#ifndef NO_RSA
6504
0
    TLSX_SignatureAlgorithms_MapPss(sa->ssl, output + OPAQUE16_LEN,
6505
0
            hashSigAlgoSz);
6506
0
#endif
6507
6508
0
    return OPAQUE16_LEN + hashSigAlgoSz;
6509
0
}
6510
6511
/* Parse the SignatureAlgorithms extension.
6512
 *
6513
 * ssl     The SSL/TLS object.
6514
 * input   The buffer with the extension data.
6515
 * length  The length of the extension data.
6516
 * returns 0 on success, otherwise failure.
6517
 */
6518
static int TLSX_SignatureAlgorithms_Parse(WOLFSSL *ssl, const byte* input,
6519
                                  word16 length, byte isRequest, Suites* suites)
6520
0
{
6521
0
    word16 len;
6522
6523
0
    if (!isRequest)
6524
0
        return BUFFER_ERROR;
6525
6526
    /* Must contain a length and at least algorithm. */
6527
0
    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
6528
0
        return BUFFER_ERROR;
6529
6530
0
    ato16(input, &len);
6531
0
    input += OPAQUE16_LEN;
6532
6533
    /* Algorithm array must fill rest of data. */
6534
0
    if (length != OPAQUE16_LEN + len)
6535
0
        return BUFFER_ERROR;
6536
6537
    /* Sig Algo list size must be even. */
6538
0
    if (suites->hashSigAlgoSz % 2 != 0)
6539
0
        return BUFFER_ERROR;
6540
6541
    /* truncate hashSigAlgo list if too long */
6542
0
    suites->hashSigAlgoSz = len;
6543
0
    if (suites->hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
6544
0
        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
6545
0
        suites->hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
6546
0
    }
6547
0
    XMEMCPY(suites->hashSigAlgo, input, suites->hashSigAlgoSz);
6548
6549
0
    return TLSX_SignatureAlgorithms_MapPss(ssl, input, len);
6550
0
}
6551
6552
/* Sets a new SignatureAlgorithms extension into the extension list.
6553
 *
6554
 * extensions  The list of extensions.
6555
 * data        The extensions specific data.
6556
 * heap        The heap used for allocation.
6557
 * returns 0 on success, otherwise failure.
6558
 */
6559
static int TLSX_SetSignatureAlgorithms(TLSX** extensions, WOLFSSL* ssl,
6560
                                       void* heap)
6561
0
{
6562
0
    SignatureAlgorithms* sa;
6563
0
    int ret;
6564
6565
0
    if (extensions == NULL)
6566
0
        return BAD_FUNC_ARG;
6567
6568
    /* Already present */
6569
0
    if (TLSX_Find(*extensions, TLSX_SIGNATURE_ALGORITHMS) != NULL)
6570
0
        return 0;
6571
6572
0
    sa = TLSX_SignatureAlgorithms_New(ssl, 0, heap);
6573
0
    if (sa == NULL)
6574
0
        return MEMORY_ERROR;
6575
6576
0
    ret = TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS, sa, heap);
6577
0
    if (ret != 0)
6578
0
        TLSX_SignatureAlgorithms_FreeAll(sa, heap);
6579
0
    return ret;
6580
0
}
6581
6582
SignatureAlgorithms* TLSX_SignatureAlgorithms_New(WOLFSSL* ssl,
6583
        word16 hashSigAlgoSz, void* heap)
6584
0
{
6585
0
    SignatureAlgorithms* sa;
6586
0
    (void)heap;
6587
6588
0
    sa = (SignatureAlgorithms*)XMALLOC(sizeof(*sa) + hashSigAlgoSz, heap,
6589
0
                                       DYNAMIC_TYPE_TLSX);
6590
0
    if (sa != NULL) {
6591
0
        XMEMSET(sa, 0, sizeof(*sa) + hashSigAlgoSz);
6592
0
        sa->ssl = ssl;
6593
0
        sa->hashSigAlgoSz = hashSigAlgoSz;
6594
0
    }
6595
0
    return sa;
6596
0
}
6597
6598
void TLSX_SignatureAlgorithms_FreeAll(SignatureAlgorithms* sa,
6599
                                             void* heap)
6600
0
{
6601
0
    XFREE(sa, heap, DYNAMIC_TYPE_TLSX);
6602
0
    (void)heap;
6603
0
}
6604
6605
0
#define SA_GET_SIZE  TLSX_SignatureAlgorithms_GetSize
6606
0
#define SA_WRITE     TLSX_SignatureAlgorithms_Write
6607
0
#define SA_PARSE     TLSX_SignatureAlgorithms_Parse
6608
0
#define SA_FREE_ALL  TLSX_SignatureAlgorithms_FreeAll
6609
#endif
6610
/******************************************************************************/
6611
/* Signature Algorithms Certificate                                           */
6612
/******************************************************************************/
6613
6614
#if defined(WOLFSSL_TLS13) && !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
6615
/* Return the size of the SignatureAlgorithms extension's data.
6616
 *
6617
 * data  Unused
6618
 * returns the length of data that will be in the extension.
6619
 */
6620
static word16 TLSX_SignatureAlgorithmsCert_GetSize(void* data)
6621
0
{
6622
0
    WOLFSSL* ssl = (WOLFSSL*)data;
6623
6624
0
    return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
6625
0
}
6626
6627
/* Writes the SignatureAlgorithmsCert extension into the buffer.
6628
 *
6629
 * data    Unused
6630
 * output  The buffer to write the extension into.
6631
 * returns the length of data that was written.
6632
 */
6633
static word16 TLSX_SignatureAlgorithmsCert_Write(void* data, byte* output)
6634
0
{
6635
0
    WOLFSSL* ssl = (WOLFSSL*)data;
6636
6637
0
    c16toa(ssl->certHashSigAlgoSz, output);
6638
0
    XMEMCPY(output + OPAQUE16_LEN, ssl->certHashSigAlgo,
6639
0
            ssl->certHashSigAlgoSz);
6640
6641
0
    return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
6642
0
}
6643
6644
/* Parse the SignatureAlgorithmsCert extension.
6645
 *
6646
 * ssl     The SSL/TLS object.
6647
 * input   The buffer with the extension data.
6648
 * length  The length of the extension data.
6649
 * returns 0 on success, otherwise failure.
6650
 */
6651
static int TLSX_SignatureAlgorithmsCert_Parse(WOLFSSL *ssl, const byte* input,
6652
                                              word16 length, byte isRequest)
6653
0
{
6654
0
    word16 len;
6655
6656
0
    if (!isRequest)
6657
0
        return BUFFER_ERROR;
6658
6659
    /* Must contain a length and at least algorithm. */
6660
0
    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
6661
0
        return BUFFER_ERROR;
6662
6663
0
    ato16(input, &len);
6664
0
    input += OPAQUE16_LEN;
6665
6666
    /* Algorithm array must fill rest of data. */
6667
0
    if (length != OPAQUE16_LEN + len)
6668
0
        return BUFFER_ERROR;
6669
6670
    /* truncate hashSigAlgo list if too long */
6671
0
    ssl->certHashSigAlgoSz = len;
6672
0
    if (ssl->certHashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
6673
0
        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
6674
0
        ssl->certHashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
6675
0
    }
6676
0
    XMEMCPY(ssl->certHashSigAlgo, input, ssl->certHashSigAlgoSz);
6677
6678
0
    return 0;
6679
0
}
6680
6681
/* Sets a new SignatureAlgorithmsCert extension into the extension list.
6682
 *
6683
 * extensions  The list of extensions.
6684
 * data        The extensions specific data.
6685
 * heap        The heap used for allocation.
6686
 * returns 0 on success, otherwise failure.
6687
 */
6688
static int TLSX_SetSignatureAlgorithmsCert(TLSX** extensions,
6689
        const WOLFSSL* data, void* heap)
6690
0
{
6691
0
    if (extensions == NULL)
6692
0
        return BAD_FUNC_ARG;
6693
6694
0
    return TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS_CERT, data, heap);
6695
0
}
6696
6697
0
#define SAC_GET_SIZE  TLSX_SignatureAlgorithmsCert_GetSize
6698
0
#define SAC_WRITE     TLSX_SignatureAlgorithmsCert_Write
6699
0
#define SAC_PARSE     TLSX_SignatureAlgorithmsCert_Parse
6700
#endif /* WOLFSSL_TLS13 */
6701
6702
6703
/******************************************************************************/
6704
/* Key Share                                                                  */
6705
/******************************************************************************/
6706
6707
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
6708
/* Create a key share entry using named Diffie-Hellman parameters group.
6709
 * Generates a key pair.
6710
 *
6711
 * ssl   The SSL/TLS object.
6712
 * kse   The key share entry object.
6713
 * returns 0 on success, otherwise failure.
6714
 */
6715
static int TLSX_KeyShare_GenDhKey(WOLFSSL *ssl, KeyShareEntry* kse)
6716
0
{
6717
0
    int ret = 0;
6718
0
#if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
6719
0
    word32 pSz = 0, pvtSz = 0;
6720
0
    DhKey* dhKey = (DhKey*)kse->key;
6721
6722
    /* Pick the parameters from the named group. */
6723
0
#ifdef HAVE_PUBLIC_FFDHE
6724
0
    const DhParams* params = NULL;
6725
0
    switch (kse->group) {
6726
0
    #ifdef HAVE_FFDHE_2048
6727
0
        case WOLFSSL_FFDHE_2048:
6728
0
            params = wc_Dh_ffdhe2048_Get();
6729
0
            pvtSz = 29;
6730
0
            break;
6731
0
    #endif
6732
    #ifdef HAVE_FFDHE_3072
6733
        case WOLFSSL_FFDHE_3072:
6734
            params = wc_Dh_ffdhe3072_Get();
6735
            pvtSz = 34;
6736
            break;
6737
    #endif
6738
    #ifdef HAVE_FFDHE_4096
6739
        case WOLFSSL_FFDHE_4096:
6740
            params = wc_Dh_ffdhe4096_Get();
6741
            pvtSz = 39;
6742
            break;
6743
    #endif
6744
    #ifdef HAVE_FFDHE_6144
6745
        case WOLFSSL_FFDHE_6144:
6746
            params = wc_Dh_ffdhe6144_Get();
6747
            pvtSz = 46;
6748
            break;
6749
    #endif
6750
    #ifdef HAVE_FFDHE_8192
6751
        case WOLFSSL_FFDHE_8192:
6752
            params = wc_Dh_ffdhe8192_Get();
6753
            pvtSz = 52;
6754
            break;
6755
    #endif
6756
0
        default:
6757
0
            break;
6758
0
    }
6759
0
    if (params == NULL)
6760
0
        return BAD_FUNC_ARG;
6761
0
    pSz = params->p_len;
6762
#else
6763
    pvtSz = wc_DhGetNamedKeyMinSize(kse->group);
6764
    if (pvtSz == 0) {
6765
        return BAD_FUNC_ARG;
6766
    }
6767
    ret = wc_DhGetNamedKeyParamSize(kse->group, &pSz, NULL, NULL);
6768
    if (ret != 0) {
6769
        return BAD_FUNC_ARG;
6770
    }
6771
#endif
6772
6773
    /* Trigger Key Generation */
6774
0
    if (kse->pubKey == NULL || kse->privKey == NULL) {
6775
0
        if (kse->key == NULL) {
6776
0
            kse->key = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap,
6777
0
                DYNAMIC_TYPE_DH);
6778
0
            if (kse->key == NULL)
6779
0
                return MEMORY_E;
6780
6781
            /* Setup Key */
6782
0
            ret = wc_InitDhKey_ex((DhKey*)kse->key, ssl->heap, ssl->devId);
6783
0
            if (ret == 0) {
6784
0
                dhKey = (DhKey*)kse->key;
6785
0
            #ifdef HAVE_PUBLIC_FFDHE
6786
0
                ret = wc_DhSetKey(dhKey, params->p, params->p_len, params->g,
6787
0
                                                                 params->g_len);
6788
            #else
6789
                ret = wc_DhSetNamedKey(dhKey, kse->group);
6790
            #endif
6791
0
            }
6792
0
        }
6793
6794
        /* Allocate space for the private and public key */
6795
0
        if (ret == 0 && kse->pubKey == NULL) {
6796
0
            kse->pubKey = (byte*)XMALLOC(pSz, ssl->heap,
6797
0
                DYNAMIC_TYPE_PUBLIC_KEY);
6798
0
            if (kse->pubKey == NULL)
6799
0
                ret = MEMORY_E;
6800
0
        }
6801
6802
0
        if (ret == 0 && kse->privKey == NULL) {
6803
0
            kse->privKey = (byte*)XMALLOC(pvtSz, ssl->heap,
6804
0
                DYNAMIC_TYPE_PRIVATE_KEY);
6805
0
            if (kse->privKey == NULL)
6806
0
                ret = MEMORY_E;
6807
0
        }
6808
6809
0
        if (ret == 0) {
6810
        #if defined(WOLFSSL_STATIC_EPHEMERAL) && defined(WOLFSSL_DH_EXTRA)
6811
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_DH, kse->key);
6812
            kse->pubKeyLen = pSz;
6813
            kse->keyLen = pvtSz;
6814
            if (ret == 0) {
6815
                ret = wc_DhExportKeyPair(dhKey,
6816
                    (byte*)kse->privKey, &kse->keyLen, /* private */
6817
                    kse->pubKey, &kse->pubKeyLen /* public */
6818
                );
6819
            }
6820
            else
6821
        #endif
6822
0
            {
6823
                /* Generate a new key pair */
6824
                /* For async this is called once and when event is done, the
6825
                 *   provided buffers will be populated.
6826
                 * Final processing is zero pad below. */
6827
0
                kse->pubKeyLen = pSz;
6828
0
                kse->keyLen = pvtSz;
6829
0
                ret = DhGenKeyPair(ssl, dhKey,
6830
0
                    (byte*)kse->privKey, &kse->keyLen, /* private */
6831
0
                    kse->pubKey, &kse->pubKeyLen /* public */
6832
0
                );
6833
            #ifdef WOLFSSL_ASYNC_CRYPT
6834
                if (ret == WC_PENDING_E) {
6835
                    return ret;
6836
                }
6837
            #endif
6838
0
            }
6839
0
        }
6840
0
    }
6841
6842
0
    if (ret == 0) {
6843
0
        if (pSz != kse->pubKeyLen) {
6844
            /* Zero pad the front of the public key to match prime "p" size */
6845
0
            XMEMMOVE(kse->pubKey + pSz - kse->pubKeyLen, kse->pubKey,
6846
0
                kse->pubKeyLen);
6847
0
            XMEMSET(kse->pubKey, 0, pSz - kse->pubKeyLen);
6848
0
            kse->pubKeyLen = pSz;
6849
0
        }
6850
6851
0
        if (pvtSz != kse->keyLen) {
6852
            /* Zero pad the front of the private key */
6853
0
            XMEMMOVE(kse->privKey + pvtSz - kse->keyLen, kse->privKey,
6854
0
                kse->keyLen);
6855
0
            XMEMSET(kse->privKey, 0, pvtSz - kse->keyLen);
6856
0
            kse->keyLen = pvtSz;
6857
0
        }
6858
6859
    #ifdef WOLFSSL_DEBUG_TLS
6860
        WOLFSSL_MSG("Public DH Key");
6861
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
6862
    #endif
6863
0
    }
6864
6865
    /* Always release the DH key to free up memory.
6866
     * The DhKey will be setup again in TLSX_KeyShare_ProcessDh */
6867
0
    if (dhKey != NULL)
6868
0
        wc_FreeDhKey(dhKey);
6869
0
    if (kse->key != NULL) {
6870
0
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_DH);
6871
0
        kse->key = NULL;
6872
0
    }
6873
6874
0
    if (ret != 0) {
6875
        /* Cleanup on error, otherwise data owned by key share entry */
6876
0
        if (kse->privKey != NULL) {
6877
0
            XFREE(kse->privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
6878
0
            kse->privKey = NULL;
6879
0
        }
6880
0
        if (kse->pubKey != NULL) {
6881
0
            XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
6882
0
            kse->pubKey = NULL;
6883
0
        }
6884
0
    }
6885
#else
6886
    (void)ssl;
6887
    (void)kse;
6888
6889
    ret = NOT_COMPILED_IN;
6890
    WOLFSSL_ERROR_VERBOSE(ret);
6891
#endif
6892
6893
0
    return ret;
6894
0
}
6895
6896
/* Create a key share entry using X25519 parameters group.
6897
 * Generates a key pair.
6898
 *
6899
 * ssl   The SSL/TLS object.
6900
 * kse   The key share entry object.
6901
 * returns 0 on success, otherwise failure.
6902
 */
6903
static int TLSX_KeyShare_GenX25519Key(WOLFSSL *ssl, KeyShareEntry* kse)
6904
0
{
6905
0
    int ret = 0;
6906
#ifdef HAVE_CURVE25519
6907
    curve25519_key* key = (curve25519_key*)kse->key;
6908
6909
    if (kse->key == NULL) {
6910
        /* Allocate a Curve25519 key to hold private key. */
6911
        kse->key = (curve25519_key*)XMALLOC(sizeof(curve25519_key), ssl->heap,
6912
                                                      DYNAMIC_TYPE_PRIVATE_KEY);
6913
        if (kse->key == NULL) {
6914
            WOLFSSL_MSG("GenX25519Key memory error");
6915
            return MEMORY_E;
6916
        }
6917
6918
        /* Make an Curve25519 key. */
6919
        ret = wc_curve25519_init_ex((curve25519_key*)kse->key, ssl->heap,
6920
            INVALID_DEVID);
6921
        if (ret == 0) {
6922
            /* setting "key" means okay to call wc_curve25519_free */
6923
            key = (curve25519_key*)kse->key;
6924
6925
        #ifdef WOLFSSL_STATIC_EPHEMERAL
6926
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_CURVE25519, kse->key);
6927
            if (ret != 0)
6928
        #endif
6929
            {
6930
                ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
6931
            }
6932
        }
6933
    }
6934
6935
    if (ret == 0 && kse->pubKey == NULL) {
6936
        /* Allocate space for the public key. */
6937
        kse->pubKey = (byte*)XMALLOC(CURVE25519_KEYSIZE, ssl->heap,
6938
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
6939
        if (kse->pubKey == NULL) {
6940
            WOLFSSL_MSG("GenX25519Key pub memory error");
6941
            ret = MEMORY_E;
6942
        }
6943
    }
6944
6945
    if (ret == 0) {
6946
        /* Export Curve25519 public key. */
6947
        kse->pubKeyLen = CURVE25519_KEYSIZE;
6948
        if (wc_curve25519_export_public_ex(key, kse->pubKey, &kse->pubKeyLen,
6949
                                                  EC25519_LITTLE_ENDIAN) != 0) {
6950
            ret = ECC_EXPORT_ERROR;
6951
            WOLFSSL_ERROR_VERBOSE(ret);
6952
        }
6953
        kse->pubKeyLen = CURVE25519_KEYSIZE; /* always CURVE25519_KEYSIZE */
6954
    }
6955
6956
#ifdef WOLFSSL_DEBUG_TLS
6957
    if (ret == 0) {
6958
        WOLFSSL_MSG("Public Curve25519 Key");
6959
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
6960
    }
6961
#endif
6962
6963
    if (ret != 0) {
6964
        /* Data owned by key share entry otherwise. */
6965
        if (kse->pubKey != NULL) {
6966
            XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
6967
            kse->pubKey = NULL;
6968
        }
6969
        if (key != NULL)
6970
            wc_curve25519_free(key);
6971
        if (kse->key != NULL) {
6972
            XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
6973
            kse->key = NULL;
6974
        }
6975
    }
6976
#else
6977
0
    (void)ssl;
6978
0
    (void)kse;
6979
6980
0
    ret = NOT_COMPILED_IN;
6981
0
    WOLFSSL_ERROR_VERBOSE(ret);
6982
0
#endif /* HAVE_CURVE25519 */
6983
6984
0
    return ret;
6985
0
}
6986
6987
/* Create a key share entry using X448 parameters group.
6988
 * Generates a key pair.
6989
 *
6990
 * ssl   The SSL/TLS object.
6991
 * kse   The key share entry object.
6992
 * returns 0 on success, otherwise failure.
6993
 */
6994
static int TLSX_KeyShare_GenX448Key(WOLFSSL *ssl, KeyShareEntry* kse)
6995
0
{
6996
0
    int ret = 0;
6997
#ifdef HAVE_CURVE448
6998
    curve448_key* key = (curve448_key*)kse->key;
6999
7000
    if (kse->key == NULL) {
7001
        /* Allocate a Curve448 key to hold private key. */
7002
        kse->key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
7003
                                                      DYNAMIC_TYPE_PRIVATE_KEY);
7004
        if (kse->key == NULL) {
7005
            WOLFSSL_MSG("GenX448Key memory error");
7006
            return MEMORY_E;
7007
        }
7008
7009
        /* Make an Curve448 key. */
7010
        ret = wc_curve448_init((curve448_key*)kse->key);
7011
        if (ret == 0) {
7012
            key = (curve448_key*)kse->key;
7013
7014
            #ifdef WOLFSSL_STATIC_EPHEMERAL
7015
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_CURVE448, kse->key);
7016
            if (ret != 0)
7017
        #endif
7018
            {
7019
                ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
7020
            }
7021
        }
7022
    }
7023
7024
    if (ret == 0 && kse->pubKey == NULL) {
7025
        /* Allocate space for the public key. */
7026
        kse->pubKey = (byte*)XMALLOC(CURVE448_KEY_SIZE, ssl->heap,
7027
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
7028
        if (kse->pubKey == NULL) {
7029
            WOLFSSL_MSG("GenX448Key pub memory error");
7030
            ret = MEMORY_E;
7031
        }
7032
    }
7033
7034
    if (ret == 0) {
7035
        /* Export Curve448 public key. */
7036
        kse->pubKeyLen = CURVE448_KEY_SIZE;
7037
        if (wc_curve448_export_public_ex(key, kse->pubKey, &kse->pubKeyLen,
7038
                                                    EC448_LITTLE_ENDIAN) != 0) {
7039
            ret = ECC_EXPORT_ERROR;
7040
        }
7041
        kse->pubKeyLen = CURVE448_KEY_SIZE; /* always CURVE448_KEY_SIZE */
7042
    }
7043
7044
#ifdef WOLFSSL_DEBUG_TLS
7045
    if (ret == 0) {
7046
        WOLFSSL_MSG("Public Curve448 Key");
7047
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
7048
    }
7049
#endif
7050
7051
    if (ret != 0) {
7052
        /* Data owned by key share entry otherwise. */
7053
        if (kse->pubKey != NULL) {
7054
            XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
7055
            kse->pubKey = NULL;
7056
        }
7057
        if (key != NULL)
7058
            wc_curve448_free(key);
7059
        if (kse->key != NULL) {
7060
            XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
7061
            kse->key = NULL;
7062
        }
7063
    }
7064
#else
7065
0
    (void)ssl;
7066
0
    (void)kse;
7067
7068
0
    ret = NOT_COMPILED_IN;
7069
0
    WOLFSSL_ERROR_VERBOSE(ret);
7070
0
#endif /* HAVE_CURVE448 */
7071
7072
0
    return ret;
7073
0
}
7074
7075
/* Create a key share entry using named elliptic curve parameters group.
7076
 * Generates a key pair.
7077
 *
7078
 * ssl   The SSL/TLS object.
7079
 * kse   The key share entry object.
7080
 * returns 0 on success, otherwise failure.
7081
 */
7082
static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse)
7083
0
{
7084
0
    int ret = 0;
7085
0
#if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
7086
0
    word32 keySize = 0;
7087
0
    word16 curveId = (word16) ECC_CURVE_INVALID;
7088
0
    ecc_key* eccKey = (ecc_key*)kse->key;
7089
7090
    /* TODO: [TLS13] The key sizes should come from wolfcrypt. */
7091
    /* Translate named group to a curve id. */
7092
0
    switch (kse->group) {
7093
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
7094
0
        #ifndef NO_ECC_SECP
7095
0
        case WOLFSSL_ECC_SECP256R1:
7096
0
            curveId = ECC_SECP256R1;
7097
0
            keySize = 32;
7098
0
            break;
7099
0
        #endif /* !NO_ECC_SECP */
7100
0
    #endif
7101
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
7102
0
        #ifndef NO_ECC_SECP
7103
0
        case WOLFSSL_ECC_SECP384R1:
7104
0
            curveId = ECC_SECP384R1;
7105
0
            keySize = 48;
7106
0
            break;
7107
0
        #endif /* !NO_ECC_SECP */
7108
0
    #endif
7109
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
7110
0
        #ifndef NO_ECC_SECP
7111
0
        case WOLFSSL_ECC_SECP521R1:
7112
0
            curveId = ECC_SECP521R1;
7113
0
            keySize = 66;
7114
0
            break;
7115
0
        #endif /* !NO_ECC_SECP */
7116
0
    #endif
7117
0
        default:
7118
0
            WOLFSSL_ERROR_VERBOSE(BAD_FUNC_ARG);
7119
0
            return BAD_FUNC_ARG;
7120
0
    }
7121
7122
0
    if (kse->key == NULL) {
7123
0
        kse->keyLen = keySize;
7124
0
        kse->pubKeyLen = keySize * 2 + 1;
7125
7126
    #if defined(WOLFSSL_RENESAS_TSIP_TLS)
7127
        ret = tsip_Tls13GenEccKeyPair(ssl, kse);
7128
        if (ret != CRYPTOCB_UNAVAILABLE) {
7129
            return ret;
7130
        }
7131
    #endif
7132
        /* Allocate an ECC key to hold private key. */
7133
0
        kse->key = (byte*)XMALLOC(sizeof(ecc_key), ssl->heap, DYNAMIC_TYPE_ECC);
7134
0
        if (kse->key == NULL) {
7135
0
            WOLFSSL_MSG("EccTempKey Memory error");
7136
0
            return MEMORY_E;
7137
0
        }
7138
7139
        /* Make an ECC key */
7140
0
        ret = wc_ecc_init_ex((ecc_key*)kse->key, ssl->heap, ssl->devId);
7141
0
        if (ret == 0) {
7142
            /* setting eccKey means okay to call wc_ecc_free */
7143
0
            eccKey = (ecc_key*)kse->key;
7144
7145
        #ifdef WOLFSSL_STATIC_EPHEMERAL
7146
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_ECDH, kse->key);
7147
            if (ret != 0)
7148
        #endif
7149
0
            {
7150
                /* set curve info for EccMakeKey "peer" info */
7151
0
                ret = wc_ecc_set_curve(eccKey, kse->keyLen, curveId);
7152
0
                if (ret == 0) {
7153
                    /* Generate ephemeral ECC key */
7154
                    /* For async this is called once and when event is done, the
7155
                    *   provided buffers in key be populated.
7156
                    * Final processing is x963 key export below. */
7157
0
                    ret = EccMakeKey(ssl, eccKey, eccKey);
7158
0
                }
7159
            #ifdef WOLFSSL_ASYNC_CRYPT
7160
                if (ret == WC_PENDING_E)
7161
                    return ret;
7162
            #endif
7163
0
            }
7164
0
        }
7165
0
    }
7166
7167
0
    if (ret == 0 && kse->pubKey == NULL) {
7168
        /* Allocate space for the public key */
7169
0
        kse->pubKey = (byte*)XMALLOC(kse->pubKeyLen, ssl->heap,
7170
0
            DYNAMIC_TYPE_PUBLIC_KEY);
7171
0
        if (kse->pubKey == NULL) {
7172
0
            WOLFSSL_MSG("Key data Memory error");
7173
0
            ret = MEMORY_E;
7174
0
        }
7175
0
    }
7176
7177
0
    if (ret == 0) {
7178
0
        XMEMSET(kse->pubKey, 0, kse->pubKeyLen);
7179
7180
        /* Export public key. */
7181
0
        PRIVATE_KEY_UNLOCK();
7182
0
        if (wc_ecc_export_x963(eccKey, kse->pubKey, &kse->pubKeyLen) != 0) {
7183
0
            ret = ECC_EXPORT_ERROR;
7184
0
            WOLFSSL_ERROR_VERBOSE(ret);
7185
0
        }
7186
0
        PRIVATE_KEY_LOCK();
7187
0
    }
7188
#ifdef WOLFSSL_DEBUG_TLS
7189
    if (ret == 0) {
7190
        WOLFSSL_MSG("Public ECC Key");
7191
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
7192
    }
7193
#endif
7194
7195
0
    if (ret != 0) {
7196
        /* Cleanup on error, otherwise data owned by key share entry */
7197
0
        if (kse->pubKey != NULL) {
7198
0
            XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
7199
0
            kse->pubKey = NULL;
7200
0
        }
7201
0
        if (eccKey != NULL)
7202
0
            wc_ecc_free(eccKey);
7203
0
        if (kse->key != NULL) {
7204
0
            XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
7205
0
            kse->key = NULL;
7206
0
        }
7207
0
    }
7208
#else
7209
    (void)ssl;
7210
    (void)kse;
7211
7212
    ret = NOT_COMPILED_IN;
7213
    WOLFSSL_ERROR_VERBOSE(ret);
7214
#endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT */
7215
7216
0
    return ret;
7217
0
}
7218
7219
#ifdef HAVE_PQC
7220
static int kyber_id2type(int id, int *type)
7221
{
7222
    int ret = 0;
7223
7224
    switch (id) {
7225
    #ifdef WOLFSSL_KYBER512
7226
        case WOLFSSL_KYBER_LEVEL1:
7227
            *type = KYBER512;
7228
            break;
7229
    #endif
7230
    #ifdef WOLFSSL_KYBER768
7231
        case WOLFSSL_KYBER_LEVEL3:
7232
            *type = KYBER768;
7233
            break;
7234
    #endif
7235
    #ifdef WOLFSSL_KYBER1024
7236
        case WOLFSSL_KYBER_LEVEL5:
7237
            *type = KYBER1024;
7238
            break;
7239
    #endif
7240
        default:
7241
            ret = NOT_COMPILED_IN;
7242
            break;
7243
    }
7244
7245
    return ret;
7246
}
7247
7248
typedef struct PqcHybridMapping {
7249
    int hybrid;
7250
    int ecc;
7251
    int pqc;
7252
} PqcHybridMapping;
7253
7254
static const PqcHybridMapping pqc_hybrid_mapping[] = {
7255
    {.hybrid = WOLFSSL_P256_KYBER_LEVEL1,     .ecc = WOLFSSL_ECC_SECP256R1,
7256
     .pqc = WOLFSSL_KYBER_LEVEL1},
7257
    {.hybrid = WOLFSSL_P384_KYBER_LEVEL3,     .ecc = WOLFSSL_ECC_SECP384R1,
7258
     .pqc = WOLFSSL_KYBER_LEVEL3},
7259
    {.hybrid = WOLFSSL_P521_KYBER_LEVEL5,     .ecc = WOLFSSL_ECC_SECP521R1,
7260
     .pqc = WOLFSSL_KYBER_LEVEL5},
7261
    {.hybrid = 0, .ecc = 0, .pqc = 0}
7262
};
7263
7264
/* This will map an ecc-pqs hybrid group into its ecc group and pqc kem group.
7265
 * If it cannot find a mapping then *pqc is set to group. ecc is optional. */
7266
static void findEccPqc(int *ecc, int *pqc, int group)
7267
{
7268
    int i;
7269
    if (pqc == NULL) {
7270
        return;
7271
    }
7272
7273
    *pqc = 0;
7274
    if (ecc != NULL) {
7275
        *ecc = 0;
7276
    }
7277
7278
    for (i = 0; pqc_hybrid_mapping[i].hybrid != 0; i++) {
7279
        if (pqc_hybrid_mapping[i].hybrid == group) {
7280
            *pqc = pqc_hybrid_mapping[i].pqc;
7281
            if (ecc != NULL) {
7282
                *ecc = pqc_hybrid_mapping[i].ecc;
7283
            }
7284
            break;
7285
        }
7286
    }
7287
7288
    if (*pqc == 0) {
7289
        /* It is not a hybrid, so maybe its simple. */
7290
        *pqc = group;
7291
    }
7292
}
7293
7294
/* Create a key share entry using liboqs parameters group.
7295
 * Generates a key pair.
7296
 *
7297
 * ssl   The SSL/TLS object.
7298
 * kse   The key share entry object.
7299
 * returns 0 on success, otherwise failure.
7300
 */
7301
static int TLSX_KeyShare_GenPqcKey(WOLFSSL *ssl, KeyShareEntry* kse)
7302
{
7303
    int ret = 0;
7304
    int type = 0;
7305
    KyberKey kem[1];
7306
    byte* pubKey = NULL;
7307
    byte* privKey = NULL;
7308
    KeyShareEntry *ecc_kse = NULL;
7309
    int oqs_group = 0;
7310
    int ecc_group = 0;
7311
    word32 privSz = 0;
7312
    word32 pubSz = 0;
7313
7314
    findEccPqc(&ecc_group, &oqs_group, kse->group);
7315
    ret = kyber_id2type(oqs_group, &type);
7316
    if (ret == NOT_COMPILED_IN) {
7317
        WOLFSSL_MSG("Invalid Kyber algorithm specified.");
7318
        ret = BAD_FUNC_ARG;
7319
    }
7320
7321
    if (ret == 0) {
7322
        ret = wc_KyberKey_Init(type, kem, ssl->heap, ssl->devId);
7323
        if (ret != 0) {
7324
            WOLFSSL_MSG("Failed to initialize Kyber Key.");
7325
        }
7326
    }
7327
7328
    if (ret == 0) {
7329
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
7330
                   DYNAMIC_TYPE_TLSX);
7331
        if (ecc_kse == NULL) {
7332
            WOLFSSL_MSG("ecc_kse memory allocation failure");
7333
            ret = MEMORY_ERROR;
7334
        }
7335
    }
7336
7337
    if (ret == 0) {
7338
        XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
7339
7340
        ret = wc_KyberKey_PrivateKeySize(kem, &privSz);
7341
    }
7342
    if (ret == 0) {
7343
        ret = wc_KyberKey_PublicKeySize(kem, &pubSz);
7344
    }
7345
7346
    if (ret == 0 && ecc_group != 0) {
7347
        ecc_kse->group = ecc_group;
7348
        ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse);
7349
        /* If fail, no error message,  TLSX_KeyShare_GenEccKey will do it. */
7350
    }
7351
7352
    if (ret == 0) {
7353
        pubKey = (byte*)XMALLOC(ecc_kse->pubKeyLen + pubSz, ssl->heap,
7354
                                DYNAMIC_TYPE_PUBLIC_KEY);
7355
        if (pubKey == NULL) {
7356
            WOLFSSL_MSG("pubkey memory allocation failure");
7357
            ret = MEMORY_ERROR;
7358
        }
7359
    }
7360
7361
    if (ret == 0) {
7362
        privKey = (byte*)XMALLOC(privSz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
7363
        if (privKey == NULL) {
7364
            WOLFSSL_MSG("privkey memory allocation failure");
7365
            ret = MEMORY_ERROR;
7366
        }
7367
    }
7368
7369
    if (ret == 0) {
7370
        ret = wc_KyberKey_MakeKey(kem, ssl->rng);
7371
        if (ret != 0) {
7372
            WOLFSSL_MSG("Kyber keygen failure");
7373
        }
7374
    }
7375
    if (ret == 0) {
7376
        ret = wc_KyberKey_EncodePublicKey(kem, pubKey + ecc_kse->pubKeyLen,
7377
            pubSz);
7378
    }
7379
    if (ret == 0) {
7380
        ret = wc_KyberKey_EncodePrivateKey(kem, privKey, privSz);
7381
    }
7382
    if (ret == 0) {
7383
        XMEMCPY(pubKey, ecc_kse->pubKey, ecc_kse->pubKeyLen);
7384
        kse->pubKey = pubKey;
7385
        kse->pubKeyLen = ecc_kse->pubKeyLen + pubSz;
7386
        pubKey = NULL;
7387
7388
        /* Note we are saving the OQS private key and ECC private key
7389
         * separately. That's because the ECC private key is not simply a
7390
         * buffer. Its is an ecc_key struct.
7391
         */
7392
        kse->privKey = privKey;
7393
        privKey = NULL;
7394
7395
        kse->key = ecc_kse->key;
7396
        ecc_kse->key = NULL;
7397
    }
7398
7399
#ifdef WOLFSSL_DEBUG_TLS
7400
    WOLFSSL_MSG("Public Kyber Key");
7401
    WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen );
7402
#endif
7403
7404
    wc_KyberKey_Free(kem);
7405
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
7406
    if (pubKey != NULL)
7407
        XFREE(pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
7408
    if (privKey != NULL)
7409
        XFREE(privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
7410
7411
    return ret;
7412
}
7413
#endif /* HAVE_PQC */
7414
7415
/* Generate a secret/key using the key share entry.
7416
 *
7417
 * ssl  The SSL/TLS object.
7418
 * kse  The key share entry holding peer data.
7419
 */
7420
int TLSX_KeyShare_GenKey(WOLFSSL *ssl, KeyShareEntry *kse)
7421
0
{
7422
0
    int ret;
7423
    /* Named FFDHE groups have a bit set to identify them. */
7424
0
    if (WOLFSSL_NAMED_GROUP_IS_FFHDE(kse->group))
7425
0
        ret = TLSX_KeyShare_GenDhKey(ssl, kse);
7426
0
    else if (kse->group == WOLFSSL_ECC_X25519)
7427
0
        ret = TLSX_KeyShare_GenX25519Key(ssl, kse);
7428
0
    else if (kse->group == WOLFSSL_ECC_X448)
7429
0
        ret = TLSX_KeyShare_GenX448Key(ssl, kse);
7430
#ifdef HAVE_PQC
7431
    else if (WOLFSSL_NAMED_GROUP_IS_PQC(kse->group))
7432
        ret = TLSX_KeyShare_GenPqcKey(ssl, kse);
7433
#endif
7434
0
    else
7435
0
        ret = TLSX_KeyShare_GenEccKey(ssl, kse);
7436
#ifdef WOLFSSL_ASYNC_CRYPT
7437
    kse->lastRet = ret;
7438
#endif
7439
0
    return ret;
7440
0
}
7441
7442
/* Free the key share dynamic data.
7443
 *
7444
 * list  The linked list of key share entry objects.
7445
 * heap  The heap used for allocation.
7446
 */
7447
static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap)
7448
0
{
7449
0
    KeyShareEntry* current;
7450
7451
0
    while ((current = list) != NULL) {
7452
0
        list = current->next;
7453
0
        if (WOLFSSL_NAMED_GROUP_IS_FFHDE(current->group)) {
7454
0
#ifndef NO_DH
7455
0
            wc_FreeDhKey((DhKey*)current->key);
7456
0
#endif
7457
0
        }
7458
0
        else if (current->group == WOLFSSL_ECC_X25519) {
7459
#ifdef HAVE_CURVE25519
7460
            wc_curve25519_free((curve25519_key*)current->key);
7461
#endif
7462
0
        }
7463
0
        else if (current->group == WOLFSSL_ECC_X448) {
7464
#ifdef HAVE_CURVE448
7465
            wc_curve448_free((curve448_key*)current->key);
7466
#endif
7467
0
        }
7468
#ifdef HAVE_PQC
7469
        else if (WOLFSSL_NAMED_GROUP_IS_PQC(current->group) &&
7470
                 current->key != NULL) {
7471
            ForceZero((byte*)current->key, current->keyLen);
7472
        }
7473
#endif
7474
0
        else {
7475
0
#ifdef HAVE_ECC
7476
0
            wc_ecc_free((ecc_key*)current->key);
7477
0
#endif
7478
0
        }
7479
0
        XFREE(current->key, heap, DYNAMIC_TYPE_PRIVATE_KEY);
7480
0
    #if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
7481
0
        XFREE(current->privKey, heap, DYNAMIC_TYPE_PRIVATE_KEY);
7482
0
    #endif
7483
0
        XFREE(current->pubKey, heap, DYNAMIC_TYPE_PUBLIC_KEY);
7484
0
        XFREE(current->ke, heap, DYNAMIC_TYPE_PUBLIC_KEY);
7485
0
        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
7486
0
    }
7487
7488
0
    (void)heap;
7489
0
}
7490
7491
/* Get the size of the encoded key share extension.
7492
 *
7493
 * list     The linked list of key share extensions.
7494
 * msgType  The type of the message this extension is being written into.
7495
 * returns the number of bytes of the encoded key share extension.
7496
 */
7497
static word16 TLSX_KeyShare_GetSize(KeyShareEntry* list, byte msgType)
7498
0
{
7499
0
    word16         len = 0;
7500
0
    byte           isRequest = (msgType == client_hello);
7501
0
    KeyShareEntry* current;
7502
7503
    /* The named group the server wants to use. */
7504
0
    if (msgType == hello_retry_request)
7505
0
        return OPAQUE16_LEN;
7506
7507
    /* List of key exchange groups. */
7508
0
    if (isRequest)
7509
0
        len += OPAQUE16_LEN;
7510
0
    while ((current = list) != NULL) {
7511
0
        list = current->next;
7512
7513
0
        if (!isRequest && current->pubKey == NULL)
7514
0
            continue;
7515
7516
0
        len += (word16)(KE_GROUP_LEN + OPAQUE16_LEN + current->pubKeyLen);
7517
0
    }
7518
7519
0
    return len;
7520
0
}
7521
7522
/* Writes the key share extension into the output buffer.
7523
 * Assumes that the the output buffer is big enough to hold data.
7524
 *
7525
 * list     The linked list of key share entries.
7526
 * output   The buffer to write into.
7527
 * msgType  The type of the message this extension is being written into.
7528
 * returns the number of bytes written into the buffer.
7529
 */
7530
static word16 TLSX_KeyShare_Write(KeyShareEntry* list, byte* output,
7531
                                  byte msgType)
7532
0
{
7533
0
    word16         i = 0;
7534
0
    byte           isRequest = (msgType == client_hello);
7535
0
    KeyShareEntry* current;
7536
7537
0
    if (msgType == hello_retry_request) {
7538
0
        c16toa(list->group, output);
7539
0
        return OPAQUE16_LEN;
7540
0
    }
7541
7542
    /* ClientHello has a list but ServerHello is only the chosen. */
7543
0
    if (isRequest)
7544
0
        i += OPAQUE16_LEN;
7545
7546
    /* Write out all in the list. */
7547
0
    while ((current = list) != NULL) {
7548
0
        list = current->next;
7549
7550
0
        if (!isRequest && current->pubKey == NULL)
7551
0
            continue;
7552
7553
0
        c16toa(current->group, &output[i]);
7554
0
        i += KE_GROUP_LEN;
7555
0
        c16toa((word16)(current->pubKeyLen), &output[i]);
7556
0
        i += OPAQUE16_LEN;
7557
0
        XMEMCPY(&output[i], current->pubKey, current->pubKeyLen);
7558
0
        i += (word16)current->pubKeyLen;
7559
0
    }
7560
    /* Write the length of the list if required. */
7561
0
    if (isRequest)
7562
0
        c16toa(i - OPAQUE16_LEN, output);
7563
7564
0
    return i;
7565
0
}
7566
7567
/* Process the DH key share extension on the client side.
7568
 *
7569
 * ssl            The SSL/TLS object.
7570
 * keyShareEntry  The key share entry object to use to calculate shared secret.
7571
 * returns 0 on success and other values indicate failure.
7572
 */
7573
static int TLSX_KeyShare_ProcessDh(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
7574
0
{
7575
0
    int ret = 0;
7576
0
#if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
7577
0
    word32 pSz = 0;
7578
0
    DhKey* dhKey = (DhKey*)keyShareEntry->key;
7579
7580
0
#ifdef HAVE_PUBLIC_FFDHE
7581
0
    const DhParams* params = NULL;
7582
0
    switch (keyShareEntry->group) {
7583
0
    #ifdef HAVE_FFDHE_2048
7584
0
        case WOLFSSL_FFDHE_2048:
7585
0
            params = wc_Dh_ffdhe2048_Get();
7586
0
            break;
7587
0
    #endif
7588
    #ifdef HAVE_FFDHE_3072
7589
        case WOLFSSL_FFDHE_3072:
7590
            params = wc_Dh_ffdhe3072_Get();
7591
            break;
7592
    #endif
7593
    #ifdef HAVE_FFDHE_4096
7594
        case WOLFSSL_FFDHE_4096:
7595
            params = wc_Dh_ffdhe4096_Get();
7596
            break;
7597
    #endif
7598
    #ifdef HAVE_FFDHE_6144
7599
        case WOLFSSL_FFDHE_6144:
7600
            params = wc_Dh_ffdhe6144_Get();
7601
            break;
7602
    #endif
7603
    #ifdef HAVE_FFDHE_8192
7604
        case WOLFSSL_FFDHE_8192:
7605
            params = wc_Dh_ffdhe8192_Get();
7606
            break;
7607
    #endif
7608
0
        default:
7609
0
            break;
7610
0
    }
7611
0
    if (params == NULL) {
7612
0
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
7613
0
        return PEER_KEY_ERROR;
7614
0
    }
7615
0
    pSz = params->p_len;
7616
#else
7617
    ret = wc_DhGetNamedKeyParamSize(keyShareEntry->group, &pSz, NULL, NULL);
7618
    if (ret != 0 || pSz == 0) {
7619
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
7620
        return PEER_KEY_ERROR;
7621
    }
7622
#endif
7623
7624
    /* if DhKey is not setup, do it now */
7625
0
    if (keyShareEntry->key == NULL) {
7626
0
        keyShareEntry->key = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap,
7627
0
            DYNAMIC_TYPE_DH);
7628
0
        if (keyShareEntry->key == NULL)
7629
0
            return MEMORY_E;
7630
7631
        /* Setup Key */
7632
0
        ret = wc_InitDhKey_ex((DhKey*)keyShareEntry->key, ssl->heap, ssl->devId);
7633
0
        if (ret == 0) {
7634
0
            dhKey = (DhKey*)keyShareEntry->key;
7635
        /* Set key */
7636
0
        #ifdef HAVE_PUBLIC_FFDHE
7637
0
            ret = wc_DhSetKey(dhKey, params->p, params->p_len, params->g,
7638
0
                                                                params->g_len);
7639
        #else
7640
            ret = wc_DhSetNamedKey(dhKey, keyShareEntry->group);
7641
        #endif
7642
0
        }
7643
0
    }
7644
7645
0
    if (ret == 0
7646
    #ifdef WOLFSSL_ASYNC_CRYPT
7647
        && keyShareEntry->lastRet == 0 /* don't enter here if WC_PENDING_E */
7648
    #endif
7649
0
    ) {
7650
    #ifdef WOLFSSL_DEBUG_TLS
7651
        WOLFSSL_MSG("Peer DH Key");
7652
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
7653
    #endif
7654
7655
0
        ssl->options.dhKeySz = (word16)pSz;
7656
7657
        /* Derive secret from private key and peer's public key. */
7658
0
        ret = DhAgree(ssl, dhKey,
7659
0
            (const byte*)keyShareEntry->privKey, keyShareEntry->keyLen, /* our private */
7660
0
            keyShareEntry->ke, keyShareEntry->keLen,                    /* peer's public key */
7661
0
            ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,    /* secret */
7662
0
            NULL, 0
7663
0
        );
7664
    #ifdef WOLFSSL_ASYNC_CRYPT
7665
        if (ret == WC_PENDING_E) {
7666
            return ret;
7667
        }
7668
    #endif
7669
0
    }
7670
7671
    /* RFC 8446 Section 7.4.1:
7672
     *     ... left-padded with zeros up to the size of the prime. ...
7673
     */
7674
0
    if (ret == 0 && (word32)ssl->options.dhKeySz > ssl->arrays->preMasterSz) {
7675
0
        word32 diff = (word32)ssl->options.dhKeySz - ssl->arrays->preMasterSz;
7676
0
        XMEMMOVE(ssl->arrays->preMasterSecret + diff,
7677
0
                        ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
7678
0
        XMEMSET(ssl->arrays->preMasterSecret, 0, diff);
7679
0
        ssl->arrays->preMasterSz = ssl->options.dhKeySz;
7680
0
    }
7681
7682
    /* done with key share, release resources */
7683
0
    if (dhKey)
7684
0
        wc_FreeDhKey(dhKey);
7685
0
    if (keyShareEntry->key) {
7686
0
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_DH);
7687
0
        keyShareEntry->key = NULL;
7688
0
    }
7689
0
    if (keyShareEntry->privKey != NULL) {
7690
0
        XFREE(keyShareEntry->privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
7691
0
        keyShareEntry->privKey = NULL;
7692
0
    }
7693
0
    if (keyShareEntry->pubKey != NULL) {
7694
0
        XFREE(keyShareEntry->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
7695
0
        keyShareEntry->pubKey = NULL;
7696
0
    }
7697
0
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
7698
0
    keyShareEntry->ke = NULL;
7699
#else
7700
    (void)ssl;
7701
    (void)keyShareEntry;
7702
    ret = PEER_KEY_ERROR;
7703
    WOLFSSL_ERROR_VERBOSE(ret);
7704
#endif
7705
0
    return ret;
7706
0
}
7707
7708
/* Process the X25519 key share extension on the client side.
7709
 *
7710
 * ssl            The SSL/TLS object.
7711
 * keyShareEntry  The key share entry object to use to calculate shared secret.
7712
 * returns 0 on success and other values indicate failure.
7713
 */
7714
static int TLSX_KeyShare_ProcessX25519(WOLFSSL* ssl,
7715
                                       KeyShareEntry* keyShareEntry)
7716
0
{
7717
0
    int ret;
7718
7719
#ifdef HAVE_CURVE25519
7720
    curve25519_key* key = (curve25519_key*)keyShareEntry->key;
7721
    curve25519_key* peerX25519Key;
7722
7723
#ifdef HAVE_ECC
7724
    if (ssl->peerEccKey != NULL) {
7725
        wc_ecc_free(ssl->peerEccKey);
7726
        ssl->peerEccKey = NULL;
7727
        ssl->peerEccKeyPresent = 0;
7728
    }
7729
#endif
7730
7731
    peerX25519Key = (curve25519_key*)XMALLOC(sizeof(curve25519_key), ssl->heap,
7732
                                                             DYNAMIC_TYPE_TLSX);
7733
    if (peerX25519Key == NULL) {
7734
        WOLFSSL_MSG("PeerEccKey Memory error");
7735
        return MEMORY_ERROR;
7736
    }
7737
    ret = wc_curve25519_init(peerX25519Key);
7738
    if (ret != 0) {
7739
        XFREE(peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
7740
        return ret;
7741
    }
7742
#ifdef WOLFSSL_DEBUG_TLS
7743
    WOLFSSL_MSG("Peer Curve25519 Key");
7744
    WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
7745
#endif
7746
7747
    if (wc_curve25519_check_public(keyShareEntry->ke, keyShareEntry->keLen,
7748
                                                  EC25519_LITTLE_ENDIAN) != 0) {
7749
        ret = ECC_PEERKEY_ERROR;
7750
        WOLFSSL_ERROR_VERBOSE(ret);
7751
    }
7752
7753
    if (ret == 0) {
7754
        if (wc_curve25519_import_public_ex(keyShareEntry->ke,
7755
                                            keyShareEntry->keLen, peerX25519Key,
7756
                                            EC25519_LITTLE_ENDIAN) != 0) {
7757
            ret = ECC_PEERKEY_ERROR;
7758
            WOLFSSL_ERROR_VERBOSE(ret);
7759
        }
7760
    }
7761
7762
    if (ret == 0) {
7763
        ssl->ecdhCurveOID = ECC_X25519_OID;
7764
7765
        ret = wc_curve25519_shared_secret_ex(key, peerX25519Key,
7766
                                                   ssl->arrays->preMasterSecret,
7767
                                                   &ssl->arrays->preMasterSz,
7768
                                                   EC25519_LITTLE_ENDIAN);
7769
    }
7770
7771
    wc_curve25519_free(peerX25519Key);
7772
    XFREE(peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
7773
    wc_curve25519_free((curve25519_key*)keyShareEntry->key);
7774
    if (keyShareEntry->key != NULL) {
7775
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
7776
        keyShareEntry->key = NULL;
7777
    }
7778
#else
7779
0
    (void)ssl;
7780
0
    (void)keyShareEntry;
7781
7782
0
    ret = PEER_KEY_ERROR;
7783
0
    WOLFSSL_ERROR_VERBOSE(ret);
7784
0
#endif /* HAVE_CURVE25519 */
7785
7786
0
    return ret;
7787
0
}
7788
7789
/* Process the X448 key share extension on the client side.
7790
 *
7791
 * ssl            The SSL/TLS object.
7792
 * keyShareEntry  The key share entry object to use to calculate shared secret.
7793
 * returns 0 on success and other values indicate failure.
7794
 */
7795
static int TLSX_KeyShare_ProcessX448(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
7796
0
{
7797
0
    int ret;
7798
7799
#ifdef HAVE_CURVE448
7800
    curve448_key* key = (curve448_key*)keyShareEntry->key;
7801
    curve448_key* peerX448Key;
7802
7803
#ifdef HAVE_ECC
7804
    if (ssl->peerEccKey != NULL) {
7805
        wc_ecc_free(ssl->peerEccKey);
7806
        ssl->peerEccKey = NULL;
7807
        ssl->peerEccKeyPresent = 0;
7808
    }
7809
#endif
7810
7811
    peerX448Key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
7812
                                                             DYNAMIC_TYPE_TLSX);
7813
    if (peerX448Key == NULL) {
7814
        WOLFSSL_MSG("PeerEccKey Memory error");
7815
        return MEMORY_ERROR;
7816
    }
7817
    ret = wc_curve448_init(peerX448Key);
7818
    if (ret != 0) {
7819
        XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_TLSX);
7820
        return ret;
7821
    }
7822
#ifdef WOLFSSL_DEBUG_TLS
7823
    WOLFSSL_MSG("Peer Curve448 Key");
7824
    WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
7825
#endif
7826
7827
    if (wc_curve448_check_public(keyShareEntry->ke, keyShareEntry->keLen,
7828
                                                    EC448_LITTLE_ENDIAN) != 0) {
7829
        ret = ECC_PEERKEY_ERROR;
7830
        WOLFSSL_ERROR_VERBOSE(ret);
7831
    }
7832
7833
    if (ret == 0) {
7834
        if (wc_curve448_import_public_ex(keyShareEntry->ke,
7835
                                              keyShareEntry->keLen, peerX448Key,
7836
                                              EC448_LITTLE_ENDIAN) != 0) {
7837
            ret = ECC_PEERKEY_ERROR;
7838
            WOLFSSL_ERROR_VERBOSE(ret);
7839
        }
7840
    }
7841
7842
    if (ret == 0) {
7843
        ssl->ecdhCurveOID = ECC_X448_OID;
7844
7845
        ret = wc_curve448_shared_secret_ex(key, peerX448Key,
7846
                                                   ssl->arrays->preMasterSecret,
7847
                                                   &ssl->arrays->preMasterSz,
7848
                                                   EC448_LITTLE_ENDIAN);
7849
    }
7850
7851
    wc_curve448_free(peerX448Key);
7852
    XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_TLSX);
7853
    wc_curve448_free((curve448_key*)keyShareEntry->key);
7854
    if (keyShareEntry->key != NULL) {
7855
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
7856
        keyShareEntry->key = NULL;
7857
    }
7858
#else
7859
0
    (void)ssl;
7860
0
    (void)keyShareEntry;
7861
7862
0
    ret = PEER_KEY_ERROR;
7863
0
    WOLFSSL_ERROR_VERBOSE(ret);
7864
0
#endif /* HAVE_CURVE448 */
7865
7866
0
    return ret;
7867
0
}
7868
7869
/* Process the ECC key share extension on the client side.
7870
 *
7871
 * ssl            The SSL/TLS object.
7872
 * keyShareEntry  The key share entry object to use to calculate shared secret.
7873
 * returns 0 on success and other values indicate failure.
7874
 */
7875
static int TLSX_KeyShare_ProcessEcc(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
7876
0
{
7877
0
    int ret = 0;
7878
0
#ifdef HAVE_ECC
7879
0
    int curveId = ECC_CURVE_INVALID;
7880
0
    ecc_key* eccKey = (ecc_key*)keyShareEntry->key;
7881
7882
    /* find supported curve */
7883
0
    switch (keyShareEntry->group) {
7884
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
7885
0
        #ifndef NO_ECC_SECP
7886
0
        case WOLFSSL_ECC_SECP256R1:
7887
0
            curveId = ECC_SECP256R1;
7888
0
            break;
7889
0
        #endif /* !NO_ECC_SECP */
7890
0
    #endif
7891
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
7892
0
        #ifndef NO_ECC_SECP
7893
0
        case WOLFSSL_ECC_SECP384R1:
7894
0
            curveId = ECC_SECP384R1;
7895
0
            break;
7896
0
        #endif /* !NO_ECC_SECP */
7897
0
    #endif
7898
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
7899
0
        #ifndef NO_ECC_SECP
7900
0
        case WOLFSSL_ECC_SECP521R1:
7901
0
            curveId = ECC_SECP521R1;
7902
0
            break;
7903
0
        #endif /* !NO_ECC_SECP */
7904
0
    #endif
7905
    #if defined(HAVE_X448) && ECC_MIN_KEY_SZ <= 448
7906
        case WOLFSSL_ECC_X448:
7907
            curveId = ECC_X448;
7908
            break;
7909
    #endif
7910
0
        default:
7911
            /* unsupported curve */
7912
0
            WOLFSSL_ERROR_VERBOSE(ECC_PEERKEY_ERROR);
7913
0
            return ECC_PEERKEY_ERROR;
7914
0
    }
7915
7916
#ifdef WOLFSSL_ASYNC_CRYPT
7917
    if (keyShareEntry->lastRet == 0) /* don't enter here if WC_PENDING_E */
7918
#endif
7919
0
    {
7920
    #ifdef WOLFSSL_DEBUG_TLS
7921
        WOLFSSL_MSG("Peer ECC Key");
7922
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
7923
    #endif
7924
7925
0
        if (ssl->peerEccKey != NULL) {
7926
0
            wc_ecc_free(ssl->peerEccKey);
7927
0
            XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
7928
0
            ssl->peerEccKeyPresent = 0;
7929
0
        }
7930
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
7931
        ret = tsip_Tls13GenSharedSecret(ssl, keyShareEntry);
7932
        if (ret != CRYPTOCB_UNAVAILABLE) {
7933
            return ret;
7934
        }
7935
        ret = 0;
7936
#endif
7937
7938
0
        ssl->peerEccKey = (ecc_key*)XMALLOC(sizeof(ecc_key), ssl->heap,
7939
0
                                            DYNAMIC_TYPE_ECC);
7940
0
        if (ssl->peerEccKey == NULL) {
7941
0
            WOLFSSL_MSG("PeerEccKey Memory error");
7942
0
            ret = MEMORY_ERROR;
7943
0
        }
7944
7945
0
        if (ret == 0) {
7946
0
            ret = wc_ecc_init_ex(ssl->peerEccKey, ssl->heap, ssl->devId);
7947
0
        }
7948
7949
        /* Point is validated by import function. */
7950
0
        if (ret == 0) {
7951
0
            ret = wc_ecc_import_x963_ex(keyShareEntry->ke, keyShareEntry->keLen,
7952
0
                                ssl->peerEccKey, curveId);
7953
0
            if (ret != 0) {
7954
0
                ret = ECC_PEERKEY_ERROR;
7955
0
                WOLFSSL_ERROR_VERBOSE(ret);
7956
0
            }
7957
0
        }
7958
7959
0
        if (ret == 0) {
7960
0
            ssl->ecdhCurveOID = ssl->peerEccKey->dp->oidSum;
7961
0
            ssl->peerEccKeyPresent = 1;
7962
0
        }
7963
0
    }
7964
7965
0
    if (ret == 0 && eccKey == NULL)
7966
0
        ret = BAD_FUNC_ARG;
7967
0
    if (ret == 0) {
7968
0
        ret = EccSharedSecret(ssl, eccKey, ssl->peerEccKey,
7969
0
            keyShareEntry->ke, &keyShareEntry->keLen,
7970
0
            ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,
7971
0
            ssl->options.side
7972
0
        );
7973
    #ifdef WOLFSSL_ASYNC_CRYPT
7974
        if (ret == WC_PENDING_E)
7975
            return ret;
7976
    #endif
7977
0
    }
7978
7979
    /* done with key share, release resources */
7980
0
    if (ssl->peerEccKey != NULL
7981
    #ifdef HAVE_PK_CALLBACKS
7982
        && ssl->ctx->EccSharedSecretCb == NULL
7983
    #endif
7984
0
    ) {
7985
0
        wc_ecc_free(ssl->peerEccKey);
7986
0
        XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
7987
0
        ssl->peerEccKey = NULL;
7988
0
        ssl->peerEccKeyPresent = 0;
7989
0
    }
7990
0
    if (keyShareEntry->key) {
7991
0
        wc_ecc_free((ecc_key*)keyShareEntry->key);
7992
0
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_ECC);
7993
0
        keyShareEntry->key = NULL;
7994
0
    }
7995
0
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
7996
0
    keyShareEntry->ke = NULL;
7997
#else
7998
    (void)ssl;
7999
    (void)keyShareEntry;
8000
8001
    ret = PEER_KEY_ERROR;
8002
    WOLFSSL_ERROR_VERBOSE(ret);
8003
#endif /* HAVE_ECC */
8004
8005
0
    return ret;
8006
0
}
8007
8008
#ifdef HAVE_PQC
8009
/* Process the Kyber key share extension on the client side.
8010
 *
8011
 * ssl            The SSL/TLS object.
8012
 * keyShareEntry  The key share entry object to use to calculate shared secret.
8013
 * returns 0 on success and other values indicate failure.
8014
 */
8015
static int TLSX_KeyShare_ProcessPqc(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
8016
{
8017
    int      ret = 0;
8018
    int      type;
8019
    KyberKey kem[1];
8020
    byte*    sharedSecret = NULL;
8021
    word32   sharedSecretLen = 0;
8022
    int      oqs_group = 0;
8023
    int      ecc_group = 0;
8024
    ecc_key  eccpubkey;
8025
    word32   outlen = 0;
8026
    word32   privSz = 0;
8027
    word32   ctSz = 0;
8028
    word32   ssSz = 0;
8029
8030
    if (keyShareEntry->ke == NULL) {
8031
        WOLFSSL_MSG("Invalid OQS algorithm specified.");
8032
        return BAD_FUNC_ARG;
8033
    }
8034
8035
    if (ssl->options.side == WOLFSSL_SERVER_END) {
8036
        /* I am the server, the shared secret has already been generated and
8037
         * is in keyShareEntry->ke; copy it to the pre-master secret
8038
         * pre-allocated buffer. */
8039
        if (keyShareEntry->keLen > ENCRYPT_LEN) {
8040
            WOLFSSL_MSG("shared secret is too long.");
8041
            return LENGTH_ERROR;
8042
        }
8043
8044
        XMEMCPY(ssl->arrays->preMasterSecret, keyShareEntry->ke,
8045
                keyShareEntry->keLen);
8046
        ssl->arrays->preMasterSz = keyShareEntry->keLen;
8047
        XFREE(keyShareEntry->ke, sl->heap, DYNAMIC_TYPE_SECRET)
8048
        keyShareEntry->ke = NULL;
8049
        keyShareEntry->keLen = 0;
8050
        return 0;
8051
    }
8052
8053
    /* I am the client, the ciphertext is in keyShareEntry->ke */
8054
    findEccPqc(&ecc_group, &oqs_group, keyShareEntry->group);
8055
8056
    ret = kyber_id2type(oqs_group, &type);
8057
    if (ret != 0) {
8058
        WOLFSSL_MSG("Invalid OQS algorithm specified.");
8059
        ret = BAD_FUNC_ARG;
8060
    }
8061
    if (ret == 0) {
8062
        ret = wc_KyberKey_Init(type, kem, ssl->heap, INVALID_DEVID);
8063
        if (ret != 0) {
8064
            WOLFSSL_MSG("Error creating Kyber KEM");
8065
        }
8066
    }
8067
8068
    if (ret == 0) {
8069
        ret = wc_KyberKey_SharedSecretSize(kem, &ssSz);
8070
    }
8071
    if (ret == 0) {
8072
        sharedSecretLen = ssSz;
8073
        switch (ecc_group) {
8074
        case WOLFSSL_ECC_SECP256R1:
8075
            sharedSecretLen += 32;
8076
            outlen = 32;
8077
            break;
8078
        case WOLFSSL_ECC_SECP384R1:
8079
            sharedSecretLen += 48;
8080
            outlen = 48;
8081
            break;
8082
        case WOLFSSL_ECC_SECP521R1:
8083
            sharedSecretLen += 66;
8084
            outlen = 66;
8085
            break;
8086
        default:
8087
            break;
8088
        }
8089
8090
        ret = wc_ecc_init_ex(&eccpubkey, ssl->heap, ssl->devId);
8091
        if (ret != 0) {
8092
            WOLFSSL_MSG("Memory allocation error.");
8093
            ret = MEMORY_E;
8094
        }
8095
    }
8096
    if (ret == 0) {
8097
        sharedSecret = (byte*)XMALLOC(sharedSecretLen, ssl->heap,
8098
                                      DYNAMIC_TYPE_TLSX);
8099
        if (sharedSecret == NULL) {
8100
            WOLFSSL_MSG("Memory allocation error.");
8101
            ret = MEMORY_E;
8102
        }
8103
    }
8104
    if (ret == 0) {
8105
        ret = wc_KyberKey_CipherTextSize(kem, &ctSz);
8106
    }
8107
    if (ret == 0) {
8108
        ret = wc_KyberKey_PrivateKeySize(kem, &privSz);
8109
    }
8110
    if (ret == 0) {
8111
        ret = wc_KyberKey_DecodePrivateKey(kem, keyShareEntry->privKey, privSz);
8112
    }
8113
    if (ret == 0) {
8114
        ret = wc_KyberKey_Decapsulate(kem, sharedSecret + outlen,
8115
            keyShareEntry->ke + keyShareEntry->keLen - ctSz, ctSz);
8116
        if (ret != 0) {
8117
            WOLFSSL_MSG("wc_KyberKey decapsulation failure.");
8118
            ret = BAD_FUNC_ARG;
8119
        }
8120
    }
8121
8122
    if (ecc_group != 0) {
8123
        if (ret == 0) {
8124
            /* Point is validated by import function. */
8125
            ret = wc_ecc_import_x963(keyShareEntry->ke,
8126
                                     keyShareEntry->keLen - ctSz,
8127
                                     &eccpubkey);
8128
            if (ret != 0) {
8129
                WOLFSSL_MSG("ECC Public key import error.");
8130
            }
8131
        }
8132
8133
#if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \
8134
    (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2))) && \
8135
    !defined(HAVE_SELFTEST)
8136
        if (ret == 0) {
8137
            ret = wc_ecc_set_rng(keyShareEntry->key, ssl->rng);
8138
            if (ret != 0) {
8139
                WOLFSSL_MSG("Failure to set the ECC private key RNG.");
8140
            }
8141
        }
8142
#endif
8143
8144
        if (ret == 0) {
8145
            PRIVATE_KEY_UNLOCK();
8146
            ret = wc_ecc_shared_secret(keyShareEntry->key, &eccpubkey,
8147
                sharedSecret, &outlen);
8148
            PRIVATE_KEY_LOCK();
8149
            if (outlen != sharedSecretLen - ssSz) {
8150
                WOLFSSL_MSG("ECC shared secret derivation error.");
8151
                ret = BAD_FUNC_ARG;
8152
            }
8153
        }
8154
    }
8155
    if ((ret == 0) && (sharedSecretLen > ENCRYPT_LEN)) {
8156
        WOLFSSL_MSG("shared secret is too long.");
8157
        ret = LENGTH_ERROR;
8158
    }
8159
8160
    if (ret == 0) {
8161
         /* Copy the shared secret to the  pre-master secret pre-allocated
8162
          * buffer. */
8163
        XMEMCPY(ssl->arrays->preMasterSecret, sharedSecret, sharedSecretLen);
8164
        ssl->arrays->preMasterSz = (word32) sharedSecretLen;
8165
    }
8166
8167
    if (sharedSecret != NULL) {
8168
        XFREE(sharedSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
8169
    }
8170
8171
    wc_ecc_free(&eccpubkey);
8172
    wc_KyberKey_Free(kem);
8173
    return ret;
8174
}
8175
#endif /* HAVE_PQC */
8176
8177
/* Process the key share extension on the client side.
8178
 *
8179
 * ssl            The SSL/TLS object.
8180
 * keyShareEntry  The key share entry object to use to calculate shared secret.
8181
 * returns 0 on success and other values indicate failure.
8182
 */
8183
static int TLSX_KeyShare_Process(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
8184
0
{
8185
0
    int ret;
8186
8187
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
8188
    ssl->session->namedGroup = keyShareEntry->group;
8189
#endif
8190
    /* reset the pre master secret size */
8191
0
    if (ssl->arrays->preMasterSz == 0)
8192
0
        ssl->arrays->preMasterSz = ENCRYPT_LEN;
8193
8194
    /* Use Key Share Data from server. */
8195
0
    if (WOLFSSL_NAMED_GROUP_IS_FFHDE(keyShareEntry->group))
8196
0
        ret = TLSX_KeyShare_ProcessDh(ssl, keyShareEntry);
8197
0
    else if (keyShareEntry->group == WOLFSSL_ECC_X25519)
8198
0
        ret = TLSX_KeyShare_ProcessX25519(ssl, keyShareEntry);
8199
0
    else if (keyShareEntry->group == WOLFSSL_ECC_X448)
8200
0
        ret = TLSX_KeyShare_ProcessX448(ssl, keyShareEntry);
8201
#ifdef HAVE_PQC
8202
    else if (WOLFSSL_NAMED_GROUP_IS_PQC(keyShareEntry->group))
8203
        ret = TLSX_KeyShare_ProcessPqc(ssl, keyShareEntry);
8204
#endif
8205
0
    else
8206
0
        ret = TLSX_KeyShare_ProcessEcc(ssl, keyShareEntry);
8207
8208
#ifdef WOLFSSL_DEBUG_TLS
8209
    if (ret == 0) {
8210
        WOLFSSL_MSG("KE Secret");
8211
        WOLFSSL_BUFFER(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
8212
    }
8213
#endif
8214
#ifdef WOLFSSL_ASYNC_CRYPT
8215
    keyShareEntry->lastRet = ret;
8216
#endif
8217
8218
0
    return ret;
8219
0
}
8220
8221
/* Parse an entry of the KeyShare extension.
8222
 *
8223
 * ssl     The SSL/TLS object.
8224
 * input   The extension data.
8225
 * length  The length of the extension data.
8226
 * kse     The new key share entry object.
8227
 * returns a positive number to indicate amount of data parsed and a negative
8228
 * number on error.
8229
 */
8230
static int TLSX_KeyShareEntry_Parse(const WOLFSSL* ssl, const byte* input,
8231
            word16 length, KeyShareEntry **kse, TLSX** extensions)
8232
0
{
8233
0
    int    ret;
8234
0
    word16 group;
8235
0
    word16 keLen;
8236
0
    int    offset = 0;
8237
0
    byte*  ke;
8238
8239
0
    if (length < OPAQUE16_LEN + OPAQUE16_LEN)
8240
0
        return BUFFER_ERROR;
8241
    /* Named group */
8242
0
    ato16(&input[offset], &group);
8243
0
    offset += OPAQUE16_LEN;
8244
    /* Key exchange data - public key. */
8245
0
    ato16(&input[offset], &keLen);
8246
0
    offset += OPAQUE16_LEN;
8247
0
    if (keLen == 0)
8248
0
        return INVALID_PARAMETER;
8249
0
    if (keLen > length - offset)
8250
0
        return BUFFER_ERROR;
8251
8252
#ifdef HAVE_PQC
8253
    if (WOLFSSL_NAMED_GROUP_IS_PQC(group) &&
8254
        ssl->options.side == WOLFSSL_SERVER_END) {
8255
        /* For KEMs, the public key is not stored. Casting away const because
8256
         * we know for KEMs, it will be read-only.*/
8257
        ke = (byte *)&input[offset];
8258
    } else
8259
#endif
8260
0
    {
8261
        /* Store a copy in the key share object. */
8262
0
        ke = (byte*)XMALLOC(keLen, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8263
0
        if (ke == NULL)
8264
0
            return MEMORY_E;
8265
0
        XMEMCPY(ke, &input[offset], keLen);
8266
0
    }
8267
8268
    /* Populate a key share object in the extension. */
8269
0
    ret = TLSX_KeyShare_Use(ssl, group, keLen, ke, kse, extensions);
8270
0
    if (ret != 0) {
8271
0
        if (ke != &input[offset]) {
8272
0
            XFREE(ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8273
0
        }
8274
0
        return ret;
8275
0
    }
8276
8277
    /* Total length of the parsed data. */
8278
0
    return offset + keLen;
8279
0
}
8280
8281
/* Searches the groups sent for the specified named group.
8282
 *
8283
 * ssl    SSL/TLS object.
8284
 * name   Group name to match.
8285
 * returns 1 when the extension has the group name and 0 otherwise.
8286
 */
8287
static int TLSX_KeyShare_Find(WOLFSSL* ssl, word16 group)
8288
0
{
8289
0
    TLSX*          extension;
8290
0
    KeyShareEntry* list;
8291
8292
0
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
8293
0
    if (extension == NULL) {
8294
0
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_KEY_SHARE);
8295
0
        if (extension == NULL)
8296
0
            return 0;
8297
0
    }
8298
8299
0
    list = (KeyShareEntry*)extension->data;
8300
0
    while (list != NULL) {
8301
0
        if (list->group == group)
8302
0
            return 1;
8303
0
        list = list->next;
8304
0
    }
8305
8306
0
    return 0;
8307
0
}
8308
8309
8310
/* Searches the supported groups extension for the specified named group.
8311
 *
8312
 * ssl   The SSL/TLS object.
8313
 * name  The group name to match.
8314
 * returns 1 when the extension has the group name and 0 otherwise.
8315
 */
8316
static int TLSX_SupportedGroups_Find(const WOLFSSL* ssl, word16 name,
8317
                                     TLSX* extensions)
8318
0
{
8319
0
#ifdef HAVE_SUPPORTED_CURVES
8320
0
    TLSX*          extension;
8321
0
    SupportedCurve* curve = NULL;
8322
8323
0
    if ((extension = TLSX_Find(extensions,
8324
0
                                              TLSX_SUPPORTED_GROUPS)) == NULL) {
8325
0
        if ((extension = TLSX_Find(ssl->ctx->extensions,
8326
0
                                              TLSX_SUPPORTED_GROUPS)) == NULL) {
8327
0
            return 0;
8328
0
        }
8329
0
    }
8330
8331
0
    for (curve = (SupportedCurve*)extension->data; curve; curve = curve->next) {
8332
0
        if (curve->name == name)
8333
0
            return 1;
8334
0
    }
8335
0
#endif
8336
8337
0
    (void)ssl;
8338
0
    (void)name;
8339
8340
0
    return 0;
8341
0
}
8342
8343
int TLSX_KeyShare_Parse_ClientHello(const WOLFSSL* ssl,
8344
        const byte* input, word16 length, TLSX** extensions)
8345
0
{
8346
0
    int ret;
8347
0
    int    offset = 0;
8348
0
    word16 len;
8349
0
    TLSX*  extension;
8350
8351
    /* Add a KeyShare extension if it doesn't exist even if peer sent no
8352
     * entries. The presence of this extension signals that the peer can be
8353
     * negotiated with. */
8354
0
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
8355
0
    if (extension == NULL) {
8356
        /* Push new KeyShare extension. */
8357
0
        ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
8358
0
        if (ret != 0)
8359
0
            return ret;
8360
0
    }
8361
8362
0
    if (length < OPAQUE16_LEN)
8363
0
        return BUFFER_ERROR;
8364
8365
    /* ClientHello contains zero or more key share entries. */
8366
0
    ato16(input, &len);
8367
0
    if (len != length - OPAQUE16_LEN)
8368
0
        return BUFFER_ERROR;
8369
0
    offset += OPAQUE16_LEN;
8370
8371
0
    while (offset < (int)length) {
8372
0
        ret = TLSX_KeyShareEntry_Parse(ssl, &input[offset],
8373
0
                length - (word16)offset, NULL, extensions);
8374
0
        if (ret < 0)
8375
0
            return ret;
8376
8377
0
        offset += ret;
8378
0
    }
8379
8380
0
    return 0;
8381
0
}
8382
8383
/* Parse the KeyShare extension.
8384
 * Different formats in different messages.
8385
 *
8386
 * ssl      The SSL/TLS object.
8387
 * input    The extension data.
8388
 * length   The length of the extension data.
8389
 * msgType  The type of the message this extension is being parsed from.
8390
 * returns 0 on success and other values indicate failure.
8391
 */
8392
int TLSX_KeyShare_Parse(WOLFSSL* ssl, const byte* input, word16 length,
8393
                               byte msgType)
8394
0
{
8395
0
    int ret;
8396
0
    KeyShareEntry *keyShareEntry = NULL;
8397
0
    word16 group;
8398
8399
0
    if (msgType == client_hello) {
8400
0
        ret = TLSX_KeyShare_Parse_ClientHello(ssl, input, length,
8401
0
                                              &ssl->extensions);
8402
0
    }
8403
0
    else if (msgType == server_hello) {
8404
0
        int len;
8405
8406
0
        if (length < OPAQUE16_LEN)
8407
0
            return BUFFER_ERROR;
8408
8409
        /* The data is the named group the server wants to use. */
8410
0
        ato16(input, &group);
8411
8412
        /* Check the selected group was supported by ClientHello extensions. */
8413
0
        if (!TLSX_SupportedGroups_Find(ssl, group, ssl->extensions)) {
8414
0
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
8415
0
            return BAD_KEY_SHARE_DATA;
8416
0
        }
8417
8418
        /* Check if the group was sent. */
8419
0
        if (!TLSX_KeyShare_Find(ssl, group)) {
8420
0
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
8421
0
            return BAD_KEY_SHARE_DATA;
8422
0
        }
8423
8424
        /* ServerHello contains one key share entry. */
8425
0
        len = TLSX_KeyShareEntry_Parse(ssl, input, length, &keyShareEntry,
8426
0
                &ssl->extensions);
8427
0
        if (len != (int)length)
8428
0
            return BUFFER_ERROR;
8429
8430
        /* Not in list sent if there isn't a private key. */
8431
0
        if (keyShareEntry == NULL || (keyShareEntry->key == NULL
8432
0
        #if !defined(NO_DH) || defined(HAVE_PQC)
8433
0
            && keyShareEntry->privKey == NULL
8434
0
        #endif
8435
0
        )) {
8436
0
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
8437
0
            return BAD_KEY_SHARE_DATA;
8438
0
        }
8439
8440
        /* Process the entry to calculate the secret. */
8441
0
        ret = TLSX_KeyShare_Process(ssl, keyShareEntry);
8442
0
        if (ret == 0)
8443
0
            ssl->session->namedGroup = ssl->namedGroup = group;
8444
0
    }
8445
0
    else if (msgType == hello_retry_request) {
8446
0
        if (length != OPAQUE16_LEN)
8447
0
            return BUFFER_ERROR;
8448
8449
        /* The data is the named group the server wants to use. */
8450
0
        ato16(input, &group);
8451
8452
    #ifdef WOLFSSL_ASYNC_CRYPT
8453
        /* only perform find and clear TLSX if not returning from async */
8454
        if (ssl->error != WC_PENDING_E)
8455
    #endif
8456
0
        {
8457
            /* Check the selected group was supported by ClientHello extensions. */
8458
0
            if (!TLSX_SupportedGroups_Find(ssl, group, ssl->extensions)) {
8459
0
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
8460
0
                return BAD_KEY_SHARE_DATA;
8461
0
            }
8462
8463
            /* Check if the group was sent. */
8464
0
            if (TLSX_KeyShare_Find(ssl, group)) {
8465
0
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
8466
0
                return BAD_KEY_SHARE_DATA;
8467
0
            }
8468
8469
            /* Clear out unusable key shares. */
8470
0
            ret = TLSX_KeyShare_Empty(ssl);
8471
0
            if (ret != 0)
8472
0
                return ret;
8473
0
        }
8474
8475
#ifdef HAVE_PQC
8476
        /* For post-quantum groups, do this in TLSX_PopulateExtensions(). */
8477
        if (!WOLFSSL_NAMED_GROUP_IS_PQC(group))
8478
#endif
8479
0
            ret = TLSX_KeyShare_Use(ssl, group, 0, NULL, NULL, &ssl->extensions);
8480
8481
0
        if (ret == 0)
8482
0
            ssl->session->namedGroup = ssl->namedGroup = group;
8483
0
    }
8484
0
    else {
8485
        /* Not a message type that is allowed to have this extension. */
8486
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
8487
0
        return SANITY_MSG_E;
8488
0
    }
8489
8490
0
    return ret;
8491
0
}
8492
8493
/* Create a new key share entry and put it into the list.
8494
 *
8495
 * list           The linked list of key share entries.
8496
 * group          The named group.
8497
 * heap           The memory to allocate with.
8498
 * keyShareEntry  The new key share entry object.
8499
 * returns 0 on success and other values indicate failure.
8500
 */
8501
static int TLSX_KeyShare_New(KeyShareEntry** list, int group, void *heap,
8502
                             KeyShareEntry** keyShareEntry)
8503
0
{
8504
0
    KeyShareEntry* kse;
8505
0
    KeyShareEntry** next;
8506
8507
0
    kse = (KeyShareEntry*)XMALLOC(sizeof(KeyShareEntry), heap,
8508
0
                                  DYNAMIC_TYPE_TLSX);
8509
0
    if (kse == NULL)
8510
0
        return MEMORY_E;
8511
8512
0
    XMEMSET(kse, 0, sizeof(*kse));
8513
0
    kse->group = (word16)group;
8514
8515
    /* Add it to the back and maintain the links. */
8516
0
    while (*list != NULL) {
8517
        /* Assign to temporary to work around compiler bug found by customer. */
8518
0
        next = &((*list)->next);
8519
0
        list = next;
8520
0
    }
8521
0
    *list = kse;
8522
0
    *keyShareEntry = kse;
8523
8524
0
    (void)heap;
8525
8526
0
    return 0;
8527
0
}
8528
8529
#ifdef HAVE_PQC
8530
static int server_generate_pqc_ciphertext(WOLFSSL* ssl,
8531
    KeyShareEntry* keyShareEntry, byte* data, word16 len)
8532
{
8533
    /* I am the server. The data parameter is the client's public key. I need
8534
     * to generate the public information (AKA ciphertext) and shared secret
8535
     * here. Note the "public information" is equivalent to a the public key in
8536
     * key exchange parlance. That's why it is being assigned to pubKey.
8537
     */
8538
    int type;
8539
    KyberKey kem[1];
8540
    byte* sharedSecret = NULL;
8541
    byte* ciphertext = NULL;
8542
    int ret = 0;
8543
    int oqs_group = 0;
8544
    int ecc_group = 0;
8545
    KeyShareEntry *ecc_kse = NULL;
8546
    ecc_key eccpubkey;
8547
    word32 outlen = 0;
8548
    word32 pubSz = 0;
8549
    word32 ctSz = 0;
8550
    word32 ssSz = 0;
8551
8552
    findEccPqc(&ecc_group, &oqs_group, keyShareEntry->group);
8553
    ret = kyber_id2type(oqs_group, &type);
8554
    if (ret != 0) {
8555
        WOLFSSL_MSG("Invalid Kyber algorithm specified.");
8556
        ret = BAD_FUNC_ARG;
8557
    }
8558
8559
    if (ret == 0) {
8560
        ret = wc_ecc_init_ex(&eccpubkey, ssl->heap, ssl->devId);
8561
        if (ret != 0) {
8562
            WOLFSSL_MSG("Could not do ECC public key initialization.");
8563
            ret = MEMORY_E;
8564
        }
8565
    }
8566
    if (ret == 0) {
8567
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
8568
            DYNAMIC_TYPE_TLSX);
8569
        if (ecc_kse == NULL) {
8570
            WOLFSSL_MSG("ecc_kse memory allocation failure");
8571
            ret = MEMORY_ERROR;
8572
        }
8573
    }
8574
8575
    if (ret == 0) {
8576
        XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
8577
    }
8578
8579
    if (ret == 0 && ecc_group != 0) {
8580
        ecc_kse->group = ecc_group;
8581
        ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse);
8582
        if (ret != 0) {
8583
            /* No message, TLSX_KeyShare_GenEccKey() will do it. */
8584
            return ret;
8585
        }
8586
        ret = 0;
8587
    }
8588
8589
    if (ret == 0) {
8590
        ret = wc_KyberKey_Init(type, kem, ssl->heap, INVALID_DEVID);
8591
        if (ret != 0) {
8592
            WOLFSSL_MSG("Error creating Kyber KEM");
8593
        }
8594
    }
8595
    if (ret == 0) {
8596
        ret = wc_KyberKey_PublicKeySize(kem, &pubSz);
8597
    }
8598
    if (ret == 0) {
8599
        ret = wc_KyberKey_CipherTextSize(kem, &ctSz);
8600
    }
8601
    if (ret == 0) {
8602
        ret = wc_KyberKey_SharedSecretSize(kem, &ssSz);
8603
    }
8604
8605
    if (ret == 0 && len != pubSz + ecc_kse->pubKeyLen) {
8606
        WOLFSSL_MSG("Invalid public key.");
8607
        ret = BAD_FUNC_ARG;
8608
    }
8609
8610
    if (ret == 0) {
8611
        sharedSecret = (byte*)XMALLOC(ecc_kse->keyLen + ssSz, ssl->heap,
8612
            DYNAMIC_TYPE_TLSX);
8613
        ciphertext = (byte*)XMALLOC(ecc_kse->pubKeyLen + ctSz, ssl->heap,
8614
            DYNAMIC_TYPE_TLSX);
8615
8616
        if (sharedSecret == NULL || ciphertext == NULL) {
8617
            WOLFSSL_MSG("Ciphertext/shared secret memory allocation failure.");
8618
            ret = MEMORY_E;
8619
        }
8620
    }
8621
8622
    if (ecc_group != 0) {
8623
        if (ret == 0) {
8624
            /* Point is validated by import function. */
8625
            ret = wc_ecc_import_x963(data, len - pubSz, &eccpubkey);
8626
            if (ret != 0) {
8627
                WOLFSSL_MSG("Bad ECC public key.");
8628
            }
8629
        }
8630
8631
#if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \
8632
    (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2))) && \
8633
    !defined(HAVE_SELFTEST)
8634
        if (ret == 0) {
8635
            ret = wc_ecc_set_rng(ecc_kse->key, ssl->rng);
8636
        }
8637
#endif
8638
8639
        if (ret == 0) {
8640
            outlen = ecc_kse->keyLen;
8641
            PRIVATE_KEY_UNLOCK();
8642
            ret = wc_ecc_shared_secret(ecc_kse->key, &eccpubkey,
8643
                                       sharedSecret,
8644
                                       &outlen);
8645
            PRIVATE_KEY_LOCK();
8646
            if (outlen != ecc_kse->keyLen) {
8647
                WOLFSSL_MSG("Data length mismatch.");
8648
                ret = BAD_FUNC_ARG;
8649
            }
8650
        }
8651
    }
8652
8653
    if (ret == 0) {
8654
        ret = wc_KyberKey_DecodePublicKey(kem, data + ecc_kse->pubKeyLen,
8655
            pubSz);
8656
    }
8657
    if (ret == 0) {
8658
        ret = wc_KyberKey_Encapsulate(kem, ciphertext + ecc_kse->pubKeyLen,
8659
            sharedSecret + outlen, ssl->rng);
8660
        if (ret != 0) {
8661
            WOLFSSL_MSG("wc_KyberKey encapsulation failure.");
8662
        }
8663
    }
8664
8665
    if (ret == 0) {
8666
        if (keyShareEntry->ke != NULL) {
8667
            XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8668
        }
8669
8670
        keyShareEntry->ke = sharedSecret;
8671
        keyShareEntry->keLen = outlen + ssSz;
8672
        sharedSecret = NULL;
8673
8674
        XMEMCPY(ciphertext, ecc_kse->pubKey, ecc_kse->pubKeyLen);
8675
        keyShareEntry->pubKey = ciphertext;
8676
        keyShareEntry->pubKeyLen = (word32)(ecc_kse->pubKeyLen + ctSz);
8677
        ciphertext = NULL;
8678
    }
8679
8680
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
8681
    if (sharedSecret != NULL)
8682
        XFREE(sharedSecret, ssl->heap, DYNAMIC_TYPE_TLSX);
8683
    if (ciphertext != NULL)
8684
        XFREE(ciphertext, ssl->heap, DYNAMIC_TYPE_TLSX);
8685
    wc_ecc_free(&eccpubkey);
8686
    wc_KyberKey_Free(kem);
8687
    return ret;
8688
}
8689
#endif /* HAVE_PQC */
8690
8691
/* Use the data to create a new key share object in the extensions.
8692
 *
8693
 * ssl    The SSL/TLS object.
8694
 * group  The named group.
8695
 * len    The length of the public key data.
8696
 * data   The public key data.
8697
 * kse    The new key share entry object.
8698
 * returns 0 on success and other values indicate failure.
8699
 */
8700
int TLSX_KeyShare_Use(const WOLFSSL* ssl, word16 group, word16 len, byte* data,
8701
                      KeyShareEntry **kse, TLSX** extensions)
8702
0
{
8703
0
    int            ret = 0;
8704
0
    TLSX*          extension;
8705
0
    KeyShareEntry* keyShareEntry = NULL;
8706
8707
    /* Find the KeyShare extension if it exists. */
8708
0
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
8709
0
    if (extension == NULL) {
8710
        /* Push new KeyShare extension. */
8711
0
        ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
8712
0
        if (ret != 0)
8713
0
            return ret;
8714
8715
0
        extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
8716
0
        if (extension == NULL)
8717
0
            return MEMORY_E;
8718
0
    }
8719
0
    extension->resp = 0;
8720
8721
    /* Try to find the key share entry with this group. */
8722
0
    keyShareEntry = (KeyShareEntry*)extension->data;
8723
0
    while (keyShareEntry != NULL) {
8724
0
        if (keyShareEntry->group == group)
8725
0
            break;
8726
0
        keyShareEntry = keyShareEntry->next;
8727
0
    }
8728
8729
    /* Create a new key share entry if not found. */
8730
0
    if (keyShareEntry == NULL) {
8731
0
        ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, group,
8732
0
                                ssl->heap, &keyShareEntry);
8733
0
        if (ret != 0)
8734
0
            return ret;
8735
0
    }
8736
8737
8738
#ifdef HAVE_PQC
8739
    if (WOLFSSL_NAMED_GROUP_IS_PQC(group) &&
8740
        ssl->options.side == WOLFSSL_SERVER_END) {
8741
        ret = server_generate_pqc_ciphertext((WOLFSSL*)ssl, keyShareEntry, data,
8742
                                             len);
8743
        if (ret != 0)
8744
            return ret;
8745
    }
8746
    else
8747
#endif
8748
0
    if (data != NULL) {
8749
0
        if (keyShareEntry->ke != NULL) {
8750
0
            XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8751
0
        }
8752
0
        keyShareEntry->ke = data;
8753
0
        keyShareEntry->keLen = len;
8754
0
    }
8755
0
    else {
8756
        /* Generate a key pair. Casting to non-const since changes inside are
8757
         * minimal but would require an extensive redesign to refactor. Also
8758
         * this path shouldn't be taken when parsing a ClientHello in stateless
8759
         * mode. */
8760
0
        ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, keyShareEntry);
8761
0
        if (ret != 0)
8762
0
            return ret;
8763
0
    }
8764
8765
0
    if (kse != NULL)
8766
0
        *kse = keyShareEntry;
8767
8768
0
    return 0;
8769
0
}
8770
8771
/* Set an empty Key Share extension.
8772
 *
8773
 * ssl  The SSL/TLS object.
8774
 * returns 0 on success and other values indicate failure.
8775
 */
8776
int TLSX_KeyShare_Empty(WOLFSSL* ssl)
8777
0
{
8778
0
    int   ret = 0;
8779
0
    TLSX* extension;
8780
8781
    /* Find the KeyShare extension if it exists. */
8782
0
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
8783
0
    if (extension == NULL) {
8784
        /* Push new KeyShare extension. */
8785
0
        ret = TLSX_Push(&ssl->extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
8786
0
    }
8787
0
    else if (extension->data != NULL) {
8788
0
        TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
8789
0
        extension->data = NULL;
8790
0
    }
8791
8792
0
    return ret;
8793
0
}
8794
8795
/* Returns whether this group is supported.
8796
 *
8797
 * namedGroup  The named group to check.
8798
 * returns 1 when supported or 0 otherwise.
8799
 */
8800
static int TLSX_KeyShare_IsSupported(int namedGroup)
8801
0
{
8802
0
    switch (namedGroup) {
8803
0
    #ifdef HAVE_FFDHE_2048
8804
0
        case WOLFSSL_FFDHE_2048:
8805
0
            break;
8806
0
    #endif
8807
    #ifdef HAVE_FFDHE_3072
8808
        case WOLFSSL_FFDHE_3072:
8809
            break;
8810
    #endif
8811
    #ifdef HAVE_FFDHE_4096
8812
        case WOLFSSL_FFDHE_4096:
8813
            break;
8814
    #endif
8815
    #ifdef HAVE_FFDHE_6144
8816
        case WOLFSSL_FFDHE_6144:
8817
            break;
8818
    #endif
8819
    #ifdef HAVE_FFDHE_8192
8820
        case WOLFSSL_FFDHE_8192:
8821
            break;
8822
    #endif
8823
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
8824
        #ifdef HAVE_ECC_KOBLITZ
8825
        case WOLFSSL_ECC_SECP256K1:
8826
            break;
8827
        #endif
8828
0
        #ifndef NO_ECC_SECP
8829
0
        case WOLFSSL_ECC_SECP256R1:
8830
0
            break;
8831
0
        #endif /* !NO_ECC_SECP */
8832
        #ifdef HAVE_ECC_BRAINPOOL
8833
        case WOLFSSL_ECC_BRAINPOOLP256R1:
8834
            break;
8835
        #endif
8836
0
    #endif
8837
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
8838
        case WOLFSSL_ECC_X25519:
8839
            break;
8840
    #endif
8841
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
8842
        case WOLFSSL_ECC_X448:
8843
            break;
8844
    #endif
8845
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
8846
0
        #ifndef NO_ECC_SECP
8847
0
        case WOLFSSL_ECC_SECP384R1:
8848
0
            break;
8849
0
        #endif /* !NO_ECC_SECP */
8850
        #ifdef HAVE_ECC_BRAINPOOL
8851
        case WOLFSSL_ECC_BRAINPOOLP384R1:
8852
            break;
8853
        #endif
8854
0
    #endif
8855
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
8856
0
        #ifndef NO_ECC_SECP
8857
0
        case WOLFSSL_ECC_SECP521R1:
8858
0
            break;
8859
0
        #endif /* !NO_ECC_SECP */
8860
0
    #endif
8861
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
8862
        #ifdef HAVE_ECC_KOBLITZ
8863
        case WOLFSSL_ECC_SECP160K1:
8864
            break;
8865
        #endif
8866
        #ifndef NO_ECC_SECP
8867
        case WOLFSSL_ECC_SECP160R1:
8868
            break;
8869
        #endif
8870
        #ifdef HAVE_ECC_SECPR2
8871
        case WOLFSSL_ECC_SECP160R2:
8872
            break;
8873
        #endif
8874
    #endif
8875
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
8876
        #ifdef HAVE_ECC_KOBLITZ
8877
        case WOLFSSL_ECC_SECP192K1:
8878
            break;
8879
        #endif
8880
        #ifndef NO_ECC_SECP
8881
        case WOLFSSL_ECC_SECP192R1:
8882
            break;
8883
        #endif
8884
    #endif
8885
0
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
8886
        #ifdef HAVE_ECC_KOBLITZ
8887
        case WOLFSSL_ECC_SECP224K1:
8888
            break;
8889
        #endif
8890
0
        #ifndef NO_ECC_SECP
8891
0
        case WOLFSSL_ECC_SECP224R1:
8892
0
            break;
8893
0
        #endif
8894
0
    #endif
8895
0
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
8896
        #ifdef HAVE_ECC_BRAINPOOL
8897
        case WOLFSSL_ECC_BRAINPOOLP512R1:
8898
            break;
8899
        #endif
8900
0
    #endif
8901
    #ifdef HAVE_PQC
8902
    #ifdef WOLFSSL_WC_KYBER
8903
        #ifdef WOLFSSL_KYBER512
8904
            case WOLFSSL_KYBER_LEVEL1:
8905
        #endif
8906
        #ifdef WOLFSSL_KYBER768
8907
            case WOLFSSL_KYBER_LEVEL3:
8908
        #endif
8909
        #ifdef WOLFSSL_KYBER1024
8910
            case WOLFSSL_KYBER_LEVEL5:
8911
        #endif
8912
                break;
8913
    #elif defined(HAVE_LIBOQS)
8914
        case WOLFSSL_KYBER_LEVEL1:
8915
        case WOLFSSL_KYBER_LEVEL3:
8916
        case WOLFSSL_KYBER_LEVEL5:
8917
        case WOLFSSL_P256_KYBER_LEVEL1:
8918
        case WOLFSSL_P384_KYBER_LEVEL3:
8919
        case WOLFSSL_P521_KYBER_LEVEL5:
8920
        {
8921
            int ret;
8922
            int id;
8923
            findEccPqc(NULL, &namedGroup, namedGroup);
8924
            ret = kyber_id2type(namedGroup, &id);
8925
            if (ret == NOT_COMPILED_IN) {
8926
                return 0;
8927
            }
8928
8929
            if (! ext_kyber_enabled(id)) {
8930
                return 0;
8931
            }
8932
            break;
8933
        }
8934
    #elif defined(HAVE_PQM4)
8935
        case WOLFSSL_KYBER_LEVEL1:
8936
            break;
8937
    #endif
8938
    #endif /* HAVE_PQC */
8939
0
        default:
8940
0
            return 0;
8941
0
    }
8942
8943
0
    return 1;
8944
0
}
8945
8946
8947
static const word16 preferredGroup[] = {
8948
#if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
8949
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 256
8950
    WOLFSSL_ECC_SECP256R1,
8951
#endif
8952
#if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
8953
    WOLFSSL_ECC_X25519,
8954
#endif
8955
#if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
8956
    WOLFSSL_ECC_X448,
8957
#endif
8958
#if defined(HAVE_ECC) && (!defined(NO_ECC384) || \
8959
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 384
8960
    WOLFSSL_ECC_SECP384R1,
8961
#endif
8962
#if defined(HAVE_ECC) && (!defined(NO_ECC521) || \
8963
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 521
8964
    WOLFSSL_ECC_SECP521R1,
8965
#endif
8966
#if defined(HAVE_FFDHE_2048)
8967
    WOLFSSL_FFDHE_2048,
8968
#endif
8969
#if defined(HAVE_FFDHE_3072)
8970
    WOLFSSL_FFDHE_3072,
8971
#endif
8972
#if defined(HAVE_FFDHE_4096)
8973
    WOLFSSL_FFDHE_4096,
8974
#endif
8975
#if defined(HAVE_FFDHE_6144)
8976
    WOLFSSL_FFDHE_6144,
8977
#endif
8978
#if defined(HAVE_FFDHE_8192)
8979
    WOLFSSL_FFDHE_8192,
8980
#endif
8981
#ifdef WOLFSSL_WC_KYBER
8982
    #ifdef WOLFSSL_KYBER512
8983
    WOLFSSL_KYBER_LEVEL1,
8984
    #endif
8985
    #ifdef WOLFSSL_KYBER768
8986
    WOLFSSL_KYBER_LEVEL3,
8987
    #endif
8988
    #ifdef WOLFSSL_KYBER1024
8989
    WOLFSSL_KYBER_LEVEL5,
8990
    #endif
8991
#elif defined(HAVE_LIBOQS)
8992
    /* These require a runtime call to TLSX_KeyShare_IsSupported to use */
8993
    WOLFSSL_KYBER_LEVEL1,
8994
    WOLFSSL_KYBER_LEVEL3,
8995
    WOLFSSL_KYBER_LEVEL5,
8996
    WOLFSSL_P256_KYBER_LEVEL1,
8997
    WOLFSSL_P384_KYBER_LEVEL3,
8998
    WOLFSSL_P521_KYBER_LEVEL5,
8999
#elif defined(HAVE_PQM4)
9000
    WOLFSSL_KYBER_LEVEL1,
9001
#endif
9002
    WOLFSSL_NAMED_GROUP_INVALID
9003
};
9004
9005
#define PREFERRED_GROUP_SZ \
9006
0
    ((sizeof(preferredGroup)/sizeof(*preferredGroup)) - 1)
9007
                                            /* -1 for the invalid group */
9008
9009
/* Examines the application specified group ranking and returns the rank of the
9010
 * group.
9011
 * If no group ranking set then all groups are rank 0 (highest).
9012
 *
9013
 * ssl    The SSL/TLS object.
9014
 * group  The group to check ranking for.
9015
 * returns ranking from 0 to MAX_GROUP_COUNT-1 or -1 when group not in list.
9016
 */
9017
static int TLSX_KeyShare_GroupRank(const WOLFSSL* ssl, int group)
9018
0
{
9019
0
    byte i;
9020
0
    const word16* groups;
9021
0
    byte numGroups;
9022
9023
0
    if (ssl->numGroups == 0) {
9024
0
        groups = preferredGroup;
9025
0
        numGroups = PREFERRED_GROUP_SZ;
9026
0
    }
9027
0
    else {
9028
0
        groups = ssl->group;
9029
0
        numGroups = ssl->numGroups;
9030
0
    }
9031
9032
#ifdef HAVE_LIBOQS
9033
      if (!TLSX_KeyShare_IsSupported(group))
9034
          return -1;
9035
#endif
9036
9037
0
    for (i = 0; i < numGroups; i++)
9038
0
        if (groups[i] == (word16)group)
9039
0
            return i;
9040
9041
0
    return -1;
9042
0
}
9043
9044
/* Set a key share that is supported by the client into extensions.
9045
 *
9046
 * ssl  The SSL/TLS object.
9047
 * returns BAD_KEY_SHARE_DATA if no supported group has a key share,
9048
 * 0 if a supported group has a key share and other values indicate an error.
9049
 */
9050
int TLSX_KeyShare_SetSupported(const WOLFSSL* ssl, TLSX** extensions)
9051
0
{
9052
0
    int             ret;
9053
0
#ifdef HAVE_SUPPORTED_CURVES
9054
0
    TLSX*           extension;
9055
0
    SupportedCurve* curve = NULL;
9056
0
    SupportedCurve* preferredCurve = NULL;
9057
0
    KeyShareEntry*  kse = NULL;
9058
0
    int             preferredRank = WOLFSSL_MAX_GROUP_COUNT;
9059
0
    int             rank;
9060
9061
0
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
9062
0
    if (extension != NULL)
9063
0
        curve = (SupportedCurve*)extension->data;
9064
    /* Use server's preference order. */
9065
0
    for (; curve != NULL; curve = curve->next) {
9066
0
        if (!TLSX_KeyShare_IsSupported(curve->name))
9067
0
            continue;
9068
0
        if (wolfSSL_curve_is_disabled(ssl, curve->name))
9069
0
            continue;
9070
9071
0
        rank = TLSX_KeyShare_GroupRank(ssl, curve->name);
9072
0
        if (rank == -1)
9073
0
            continue;
9074
0
        if (rank < preferredRank) {
9075
0
            preferredCurve = curve;
9076
0
            preferredRank = rank;
9077
0
        }
9078
0
    }
9079
0
    curve = preferredCurve;
9080
9081
0
    if (curve == NULL) {
9082
0
        WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
9083
0
        return BAD_KEY_SHARE_DATA;
9084
0
    }
9085
9086
    #ifdef WOLFSSL_ASYNC_CRYPT
9087
    /* Check the old key share data list. */
9088
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
9089
    if (extension != NULL) {
9090
        kse = (KeyShareEntry*)extension->data;
9091
        /* We should not be computing keys if we are only going to advertise
9092
         * our choice here. */
9093
        if (kse != NULL && kse->lastRet == WC_PENDING_E) {
9094
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
9095
            return BAD_KEY_SHARE_DATA;
9096
        }
9097
    }
9098
    #endif
9099
9100
    /* Push new KeyShare extension. This will also free the old one */
9101
0
    ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
9102
0
    if (ret != 0)
9103
0
        return ret;
9104
    /* Extension got pushed to head */
9105
0
    extension = *extensions;
9106
    /* Push the selected curve */
9107
0
    ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, curve->name,
9108
0
                            ssl->heap, &kse);
9109
0
    if (ret != 0)
9110
0
        return ret;
9111
    /* Set extension to be in response. */
9112
0
    extension->resp = 1;
9113
#else
9114
9115
    (void)ssl;
9116
9117
    WOLFSSL_ERROR_VERBOSE(NOT_COMPILED_IN);
9118
    ret = NOT_COMPILED_IN;
9119
#endif
9120
9121
0
    return ret;
9122
0
}
9123
9124
/* Server side KSE processing */
9125
int TLSX_KeyShare_Choose(const WOLFSSL *ssl, TLSX* extensions,
9126
                         KeyShareEntry** kse, byte* searched)
9127
0
{
9128
0
    TLSX*          extension;
9129
0
    KeyShareEntry* clientKSE = NULL;
9130
0
    KeyShareEntry* list = NULL;
9131
0
    KeyShareEntry* preferredKSE = NULL;
9132
0
    int preferredRank = WOLFSSL_MAX_GROUP_COUNT;
9133
0
    int rank;
9134
9135
0
    if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END)
9136
0
        return BAD_FUNC_ARG;
9137
9138
0
    *searched = 0;
9139
9140
    /* Find the KeyShare extension if it exists. */
9141
0
    extension = TLSX_Find(extensions, TLSX_KEY_SHARE);
9142
0
    if (extension != NULL)
9143
0
        list = (KeyShareEntry*)extension->data;
9144
9145
0
    if (extension && extension->resp == 1) {
9146
        /* Outside of the async case this path should not be taken. */
9147
0
        int ret = INCOMPLETE_DATA;
9148
    #ifdef WOLFSSL_ASYNC_CRYPT
9149
        /* in async case make sure key generation is finalized */
9150
        KeyShareEntry* serverKSE = (KeyShareEntry*)extension->data;
9151
        if (serverKSE && serverKSE->lastRet == WC_PENDING_E) {
9152
            if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE)
9153
                *searched = 1;
9154
            ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE);
9155
        }
9156
    #endif
9157
0
        return ret;
9158
0
    }
9159
9160
    /* Use server's preference order. */
9161
0
    for (clientKSE = list; clientKSE != NULL; clientKSE = clientKSE->next) {
9162
0
        if (clientKSE->ke == NULL)
9163
0
            continue;
9164
9165
        /* Check consistency now - extensions in any order. */
9166
0
        if (!TLSX_SupportedGroups_Find(ssl, clientKSE->group, extensions))
9167
0
            continue;
9168
9169
0
        if (!WOLFSSL_NAMED_GROUP_IS_FFHDE(clientKSE->group)) {
9170
            /* Check max value supported. */
9171
0
            if (clientKSE->group > WOLFSSL_ECC_MAX) {
9172
#ifdef HAVE_PQC
9173
                if (!WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group))
9174
#endif
9175
0
                    continue;
9176
0
            }
9177
0
            if (wolfSSL_curve_is_disabled(ssl, clientKSE->group))
9178
0
                continue;
9179
0
        }
9180
0
        if (!TLSX_KeyShare_IsSupported(clientKSE->group))
9181
0
            continue;
9182
9183
0
        rank = TLSX_KeyShare_GroupRank(ssl, clientKSE->group);
9184
0
        if (rank == -1)
9185
0
            continue;
9186
0
        if (rank < preferredRank) {
9187
0
            preferredKSE = clientKSE;
9188
0
            preferredRank = rank;
9189
0
        }
9190
0
    }
9191
0
    *kse = preferredKSE;
9192
0
    *searched = 1;
9193
0
    return 0;
9194
0
}
9195
9196
/* Server side KSE processing */
9197
int TLSX_KeyShare_Setup(WOLFSSL *ssl, KeyShareEntry* clientKSE)
9198
0
{
9199
0
    int            ret;
9200
0
    TLSX*          extension;
9201
0
    KeyShareEntry* serverKSE;
9202
0
    KeyShareEntry* list = NULL;
9203
9204
0
    if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END)
9205
0
        return BAD_FUNC_ARG;
9206
9207
0
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
9208
0
    if (extension == NULL)
9209
0
        return BAD_STATE_E;
9210
9211
0
    if (clientKSE == NULL) {
9212
#ifdef WOLFSSL_ASYNC_CRYPT
9213
        /* Not necessarily an error. The key may have already been setup. */
9214
        if (extension != NULL && extension->resp == 1) {
9215
            serverKSE = (KeyShareEntry*)extension->data;
9216
            if (serverKSE != NULL) {
9217
                /* in async case make sure key generation is finalized */
9218
                if (serverKSE->lastRet == WC_PENDING_E)
9219
                    return TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE);
9220
                else if (serverKSE->lastRet == 0)
9221
                    return 0;
9222
            }
9223
        }
9224
#endif
9225
0
        return BAD_FUNC_ARG;
9226
0
    }
9227
9228
    /* Generate a new key pair except in the case of OQS KEM because we
9229
     * are going to encapsulate and that does not require us to generate a
9230
     * key pair.
9231
     */
9232
0
    ret = TLSX_KeyShare_New(&list, clientKSE->group, ssl->heap, &serverKSE);
9233
0
    if (ret != 0)
9234
0
        return ret;
9235
9236
0
    if (clientKSE->key == NULL) {
9237
#ifdef HAVE_PQC
9238
        if (WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)) {
9239
            /* Going to need the public key (AKA ciphertext). */
9240
            serverKSE->pubKey = clientKSE->pubKey;
9241
            clientKSE->pubKey = NULL;
9242
            serverKSE->pubKeyLen = clientKSE->pubKeyLen;
9243
            clientKSE->pubKeyLen = 0;
9244
        }
9245
        else
9246
#endif
9247
0
        {
9248
0
            ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
9249
0
        }
9250
9251
        /* for async do setup of serverKSE below, but return WC_PENDING_E */
9252
0
        if (ret != 0
9253
        #ifdef WOLFSSL_ASYNC_CRYPT
9254
            && ret != WC_PENDING_E
9255
        #endif
9256
0
        ) {
9257
0
            TLSX_KeyShare_FreeAll(list, ssl->heap);
9258
0
            return ret;
9259
0
        }
9260
0
    }
9261
0
    else {
9262
        /* transfer buffers to serverKSE */
9263
0
        serverKSE->key = clientKSE->key;
9264
0
        clientKSE->key = NULL;
9265
0
        serverKSE->keyLen = clientKSE->keyLen;
9266
0
        serverKSE->pubKey = clientKSE->pubKey;
9267
0
        clientKSE->pubKey = NULL;
9268
0
        serverKSE->pubKeyLen = clientKSE->pubKeyLen;
9269
0
    #ifndef NO_DH
9270
0
        serverKSE->privKey = clientKSE->privKey;
9271
0
        clientKSE->privKey = NULL;
9272
0
    #endif
9273
0
    }
9274
0
    serverKSE->ke = clientKSE->ke;
9275
0
    serverKSE->keLen = clientKSE->keLen;
9276
0
    clientKSE->ke = NULL;
9277
0
    clientKSE->keLen = 0;
9278
9279
0
    TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
9280
0
    extension->data = (void *)serverKSE;
9281
9282
0
    extension->resp = 1;
9283
0
    return ret;
9284
0
}
9285
9286
/* Ensure there is a key pair that can be used for key exchange.
9287
 *
9288
 * ssl  The SSL/TLS object.
9289
 * doHelloRetry If set to non-zero will do hello_retry
9290
 * returns 0 on success and other values indicate failure.
9291
 */
9292
int TLSX_KeyShare_Establish(WOLFSSL *ssl, int* doHelloRetry)
9293
0
{
9294
0
    int            ret;
9295
0
    KeyShareEntry* clientKSE = NULL;
9296
0
    byte           searched = 0;
9297
9298
0
    *doHelloRetry = 0;
9299
9300
0
    ret = TLSX_KeyShare_Choose(ssl, ssl->extensions, &clientKSE, &searched);
9301
0
    if (ret != 0 || !searched)
9302
0
        return ret;
9303
9304
    /* No supported group found - send HelloRetryRequest. */
9305
0
    if (clientKSE == NULL) {
9306
        /* Set KEY_SHARE_ERROR to indicate HelloRetryRequest required. */
9307
0
        *doHelloRetry = 1;
9308
0
        return TLSX_KeyShare_SetSupported(ssl, &ssl->extensions);
9309
0
    }
9310
9311
0
    return TLSX_KeyShare_Setup(ssl, clientKSE);
9312
0
}
9313
9314
/* Derive the shared secret of the key exchange.
9315
 *
9316
 * ssl  The SSL/TLS object.
9317
 * returns 0 on success and other values indicate failure.
9318
 */
9319
int TLSX_KeyShare_DeriveSecret(WOLFSSL *ssl)
9320
0
{
9321
0
    int            ret;
9322
0
    TLSX*          extension;
9323
0
    KeyShareEntry* list = NULL;
9324
9325
#ifdef WOLFSSL_ASYNC_CRYPT
9326
    ret = wolfSSL_AsyncPop(ssl, NULL);
9327
    /* Check for error */
9328
    if (ret != WC_NOT_PENDING_E && ret < 0) {
9329
        return ret;
9330
    }
9331
#endif
9332
9333
    /* Find the KeyShare extension if it exists. */
9334
0
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
9335
0
    if (extension != NULL)
9336
0
        list = (KeyShareEntry*)extension->data;
9337
9338
0
    if (list == NULL)
9339
0
        return KEY_SHARE_ERROR;
9340
9341
    /* Calculate secret. */
9342
0
    ret = TLSX_KeyShare_Process(ssl, list);
9343
9344
0
    return ret;
9345
0
}
9346
9347
0
#define KS_FREE_ALL  TLSX_KeyShare_FreeAll
9348
0
#define KS_GET_SIZE  TLSX_KeyShare_GetSize
9349
0
#define KS_WRITE     TLSX_KeyShare_Write
9350
0
#define KS_PARSE     TLSX_KeyShare_Parse
9351
9352
#else
9353
9354
#define KS_FREE_ALL(a, b)
9355
#define KS_GET_SIZE(a, b)    0
9356
#define KS_WRITE(a, b, c)    0
9357
#define KS_PARSE(a, b, c, d) 0
9358
9359
#endif /* WOLFSSL_TLS13 */
9360
9361
/******************************************************************************/
9362
/* Pre-Shared Key                                                             */
9363
/******************************************************************************/
9364
9365
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
9366
/* Free the pre-shared key dynamic data.
9367
 *
9368
 * list  The linked list of key share entry objects.
9369
 * heap  The heap used for allocation.
9370
 */
9371
static void TLSX_PreSharedKey_FreeAll(PreSharedKey* list, void* heap)
9372
{
9373
    PreSharedKey* current;
9374
9375
    while ((current = list) != NULL) {
9376
        list = current->next;
9377
        XFREE(current->identity, heap, DYNAMIC_TYPE_TLSX);
9378
        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
9379
    }
9380
9381
    (void)heap;
9382
}
9383
9384
/* Get the size of the encoded pre shared key extension.
9385
 *
9386
 * list     The linked list of pre-shared key extensions.
9387
 * msgType  The type of the message this extension is being written into.
9388
 * returns the number of bytes of the encoded pre-shared key extension or
9389
 * SANITY_MSG_E to indicate invalid message type.
9390
 */
9391
static int TLSX_PreSharedKey_GetSize(PreSharedKey* list, byte msgType,
9392
                                     word16* pSz)
9393
{
9394
    if (msgType == client_hello) {
9395
        /* Length of identities + Length of binders. */
9396
        word16 len = OPAQUE16_LEN + OPAQUE16_LEN;
9397
        while (list != NULL) {
9398
            /* Each entry has: identity, ticket age and binder. */
9399
            len += OPAQUE16_LEN + list->identityLen + OPAQUE32_LEN +
9400
                   OPAQUE8_LEN + (word16)list->binderLen;
9401
            list = list->next;
9402
        }
9403
        *pSz += len;
9404
        return 0;
9405
    }
9406
9407
    if (msgType == server_hello) {
9408
        *pSz += OPAQUE16_LEN;
9409
        return 0;
9410
    }
9411
9412
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
9413
    return SANITY_MSG_E;
9414
}
9415
9416
/* The number of bytes to be written for the binders.
9417
 *
9418
 * list     The linked list of pre-shared key extensions.
9419
 * msgType  The type of the message this extension is being written into.
9420
 * returns the number of bytes of the encoded pre-shared key extension or
9421
 * SANITY_MSG_E to indicate invalid message type.
9422
 */
9423
int TLSX_PreSharedKey_GetSizeBinders(PreSharedKey* list, byte msgType,
9424
                                     word16* pSz)
9425
{
9426
    word16 len;
9427
9428
    if (msgType != client_hello) {
9429
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
9430
        return SANITY_MSG_E;
9431
    }
9432
9433
    /* Length of all binders. */
9434
    len = OPAQUE16_LEN;
9435
    while (list != NULL) {
9436
        len += OPAQUE8_LEN + (word16)list->binderLen;
9437
        list = list->next;
9438
    }
9439
9440
    *pSz = len;
9441
    return 0;
9442
}
9443
9444
/* Writes the pre-shared key extension into the output buffer - binders only.
9445
 * Assumes that the the output buffer is big enough to hold data.
9446
 *
9447
 * list     The linked list of key share entries.
9448
 * output   The buffer to write into.
9449
 * msgType  The type of the message this extension is being written into.
9450
 * returns the number of bytes written into the buffer.
9451
 */
9452
int TLSX_PreSharedKey_WriteBinders(PreSharedKey* list, byte* output,
9453
                                   byte msgType, word16* pSz)
9454
{
9455
    PreSharedKey* current = list;
9456
    word16 idx = 0;
9457
    word16 lenIdx;
9458
    word16 len;
9459
9460
    if (msgType != client_hello) {
9461
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
9462
        return SANITY_MSG_E;
9463
    }
9464
9465
    /* Skip length of all binders. */
9466
    lenIdx = idx;
9467
    idx += OPAQUE16_LEN;
9468
    while (current != NULL) {
9469
        /* Binder data length. */
9470
        output[idx++] = (byte)current->binderLen;
9471
        /* Binder data. */
9472
        XMEMCPY(output + idx, current->binder, current->binderLen);
9473
        idx += (word16)current->binderLen;
9474
9475
        current = current->next;
9476
    }
9477
    /* Length of the binders. */
9478
    len = idx - lenIdx - OPAQUE16_LEN;
9479
    c16toa(len, output + lenIdx);
9480
9481
    *pSz = idx;
9482
    return 0;
9483
}
9484
9485
9486
/* Writes the pre-shared key extension into the output buffer.
9487
 * Assumes that the the output buffer is big enough to hold data.
9488
 *
9489
 * list     The linked list of key share entries.
9490
 * output   The buffer to write into.
9491
 * msgType  The type of the message this extension is being written into.
9492
 * returns the number of bytes written into the buffer.
9493
 */
9494
static int TLSX_PreSharedKey_Write(PreSharedKey* list, byte* output,
9495
                                   byte msgType, word16* pSz)
9496
{
9497
    if (msgType == client_hello) {
9498
        PreSharedKey* current = list;
9499
        word16 idx = 0;
9500
        word16 lenIdx;
9501
        word16 len;
9502
        int ret;
9503
9504
        /* Write identites only. Binders after HMACing over this. */
9505
        lenIdx = idx;
9506
        idx += OPAQUE16_LEN;
9507
        while (current != NULL) {
9508
            /* Identity length */
9509
            c16toa(current->identityLen, output + idx);
9510
            idx += OPAQUE16_LEN;
9511
            /* Identity data */
9512
            XMEMCPY(output + idx, current->identity, current->identityLen);
9513
            idx += current->identityLen;
9514
9515
            /* Obfuscated ticket age. */
9516
            c32toa(current->ticketAge, output + idx);
9517
            idx += OPAQUE32_LEN;
9518
9519
            current = current->next;
9520
        }
9521
        /* Length of the identites. */
9522
        len = idx - lenIdx - OPAQUE16_LEN;
9523
        c16toa(len, output + lenIdx);
9524
9525
        /* Don't include binders here.
9526
         * The binders are based on the hash of all the ClientHello data up to
9527
         * and include the identities written above.
9528
         */
9529
        ret = TLSX_PreSharedKey_GetSizeBinders(list, msgType, &len);
9530
        if (ret < 0)
9531
            return ret;
9532
        *pSz += idx + len;
9533
    }
9534
    else if (msgType == server_hello) {
9535
        word16 i;
9536
9537
        /* Find the index of the chosen identity. */
9538
        for (i=0; list != NULL && !list->chosen; i++)
9539
            list = list->next;
9540
        if (list == NULL) {
9541
            WOLFSSL_ERROR_VERBOSE(BUILD_MSG_ERROR);
9542
            return BUILD_MSG_ERROR;
9543
        }
9544
9545
        /* The index of the identity chosen by the server from the list supplied
9546
         * by the client.
9547
         */
9548
        c16toa(i, output);
9549
        *pSz += OPAQUE16_LEN;
9550
    }
9551
    else {
9552
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
9553
        return SANITY_MSG_E;
9554
    }
9555
9556
    return 0;
9557
}
9558
9559
int TLSX_PreSharedKey_Parse_ClientHello(TLSX** extensions, const byte* input,
9560
                                        word16 length, void* heap)
9561
{
9562
9563
    int    ret;
9564
    word16 len;
9565
    word16 idx = 0;
9566
    TLSX*         extension;
9567
    PreSharedKey* list;
9568
9569
    TLSX_Remove(extensions, TLSX_PRE_SHARED_KEY, heap);
9570
9571
    /* Length of identities and of binders. */
9572
    if ((int)(length - idx) < OPAQUE16_LEN + OPAQUE16_LEN)
9573
        return BUFFER_E;
9574
9575
    /* Length of identities. */
9576
    ato16(input + idx, &len);
9577
    idx += OPAQUE16_LEN;
9578
    if (len < MIN_PSK_ID_LEN || length - idx < len)
9579
        return BUFFER_E;
9580
9581
    /* Create a pre-shared key object for each identity. */
9582
    while (len > 0) {
9583
        const byte* identity;
9584
        word16      identityLen;
9585
        word32      age;
9586
9587
        if (len < OPAQUE16_LEN)
9588
            return BUFFER_E;
9589
9590
        /* Length of identity. */
9591
        ato16(input + idx, &identityLen);
9592
        idx += OPAQUE16_LEN;
9593
        if (len < OPAQUE16_LEN + identityLen + OPAQUE32_LEN ||
9594
                identityLen > MAX_PSK_ID_LEN)
9595
            return BUFFER_E;
9596
        /* Cache identity pointer. */
9597
        identity = input + idx;
9598
        idx += identityLen;
9599
        /* Ticket age. */
9600
        ato32(input + idx, &age);
9601
        idx += OPAQUE32_LEN;
9602
9603
        ret = TLSX_PreSharedKey_Use(extensions, identity, identityLen, age, no_mac,
9604
                                    0, 0, 1, NULL, heap);
9605
        if (ret != 0)
9606
            return ret;
9607
9608
        /* Done with this identity. */
9609
        len -= OPAQUE16_LEN + identityLen + OPAQUE32_LEN;
9610
    }
9611
9612
    /* Find the list of identities sent to server. */
9613
    extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
9614
    if (extension == NULL)
9615
        return PSK_KEY_ERROR;
9616
    list = (PreSharedKey*)extension->data;
9617
9618
    /* Length of binders. */
9619
    if (idx + OPAQUE16_LEN > length)
9620
        return BUFFER_E;
9621
    ato16(input + idx, &len);
9622
    idx += OPAQUE16_LEN;
9623
    if (len < MIN_PSK_BINDERS_LEN || length - idx < len)
9624
        return BUFFER_E;
9625
9626
    /* Set binder for each identity. */
9627
    while (list != NULL && len > 0) {
9628
        /* Length of binder */
9629
        list->binderLen = input[idx++];
9630
        if (list->binderLen < WC_SHA256_DIGEST_SIZE ||
9631
                list->binderLen > WC_MAX_DIGEST_SIZE)
9632
            return BUFFER_E;
9633
        if (len < OPAQUE8_LEN + list->binderLen)
9634
            return BUFFER_E;
9635
9636
        /* Copy binder into static buffer. */
9637
        XMEMCPY(list->binder, input + idx, list->binderLen);
9638
        idx += (word16)list->binderLen;
9639
9640
        /* Done with binder entry. */
9641
        len -= OPAQUE8_LEN + (word16)list->binderLen;
9642
9643
        /* Next identity. */
9644
        list = list->next;
9645
    }
9646
    if (list != NULL || len != 0)
9647
        return BUFFER_E;
9648
9649
    return 0;
9650
9651
}
9652
9653
/* Parse the pre-shared key extension.
9654
 * Different formats in different messages.
9655
 *
9656
 * ssl      The SSL/TLS object.
9657
 * input    The extension data.
9658
 * length   The length of the extension data.
9659
 * msgType  The type of the message this extension is being parsed from.
9660
 * returns 0 on success and other values indicate failure.
9661
 */
9662
static int TLSX_PreSharedKey_Parse(WOLFSSL* ssl, const byte* input,
9663
                                   word16 length, byte msgType)
9664
{
9665
9666
    if (msgType == client_hello) {
9667
        return TLSX_PreSharedKey_Parse_ClientHello(&ssl->extensions, input,
9668
                                                   length, ssl->heap);
9669
    }
9670
9671
    if (msgType == server_hello) {
9672
        word16 idx;
9673
        PreSharedKey* list;
9674
        TLSX*         extension;
9675
9676
        /* Index of identity chosen by server. */
9677
        if (length != OPAQUE16_LEN)
9678
            return BUFFER_E;
9679
        ato16(input, &idx);
9680
9681
    #ifdef WOLFSSL_EARLY_DATA
9682
        ssl->options.pskIdIndex = idx + 1;
9683
    #endif
9684
9685
        /* Find the list of identities sent to server. */
9686
        extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
9687
        if (extension == NULL)
9688
            return PSK_KEY_ERROR;
9689
        list = (PreSharedKey*)extension->data;
9690
9691
        /* Mark the identity as chosen. */
9692
        for (; list != NULL && idx > 0; idx--)
9693
            list = list->next;
9694
        if (list == NULL) {
9695
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
9696
            return PSK_KEY_ERROR;
9697
        }
9698
        list->chosen = 1;
9699
9700
    #ifdef HAVE_SESSION_TICKET
9701
        if (list->resumption) {
9702
           /* Check that the session's details are the same as the server's. */
9703
           if (ssl->options.cipherSuite0  != ssl->session->cipherSuite0       ||
9704
               ssl->options.cipherSuite   != ssl->session->cipherSuite        ||
9705
               ssl->session->version.major != ssl->ctx->method->version.major ||
9706
               ssl->session->version.minor != ssl->ctx->method->version.minor) {
9707
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
9708
               return PSK_KEY_ERROR;
9709
           }
9710
        }
9711
    #endif
9712
9713
        return 0;
9714
    }
9715
9716
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
9717
    return SANITY_MSG_E;
9718
}
9719
9720
/* Create a new pre-shared key and put it into the list.
9721
 *
9722
 * list          The linked list of pre-shared key.
9723
 * identity      The identity.
9724
 * len           The length of the identity data.
9725
 * heap          The memory to allocate with.
9726
 * preSharedKey  The new pre-shared key object.
9727
 * returns 0 on success and other values indicate failure.
9728
 */
9729
static int TLSX_PreSharedKey_New(PreSharedKey** list, const byte* identity,
9730
                                 word16 len, void *heap,
9731
                                 PreSharedKey** preSharedKey)
9732
{
9733
    PreSharedKey* psk;
9734
    PreSharedKey** next;
9735
9736
    psk = (PreSharedKey*)XMALLOC(sizeof(PreSharedKey), heap, DYNAMIC_TYPE_TLSX);
9737
    if (psk == NULL)
9738
        return MEMORY_E;
9739
    XMEMSET(psk, 0, sizeof(*psk));
9740
9741
    /* Make a copy of the identity data. */
9742
    psk->identity = (byte*)XMALLOC(len + NULL_TERM_LEN, heap,
9743
                                   DYNAMIC_TYPE_TLSX);
9744
    if (psk->identity == NULL) {
9745
        XFREE(psk, heap, DYNAMIC_TYPE_TLSX);
9746
        return MEMORY_E;
9747
    }
9748
    XMEMCPY(psk->identity, identity, len);
9749
    psk->identityLen = len;
9750
    /* Use a NULL terminator in case it is a C string */
9751
    psk->identity[psk->identityLen] = '\0';
9752
9753
    /* Add it to the end and maintain the links. */
9754
    while (*list != NULL) {
9755
        /* Assign to temporary to work around compiler bug found by customer. */
9756
        next = &((*list)->next);
9757
        list = next;
9758
    }
9759
    *list = psk;
9760
    *preSharedKey = psk;
9761
9762
    (void)heap;
9763
9764
    return 0;
9765
}
9766
9767
static WC_INLINE byte GetHmacLength(int hmac)
9768
{
9769
    switch (hmac) {
9770
    #ifndef NO_SHA256
9771
        case sha256_mac:
9772
            return WC_SHA256_DIGEST_SIZE;
9773
    #endif
9774
    #ifdef WOLFSSL_SHA384
9775
        case sha384_mac:
9776
            return WC_SHA384_DIGEST_SIZE;
9777
    #endif
9778
    #ifdef WOLFSSL_SHA512
9779
        case sha512_mac:
9780
            return WC_SHA512_DIGEST_SIZE;
9781
    #endif
9782
    }
9783
    return 0;
9784
}
9785
9786
/* Use the data to create a new pre-shared key object in the extensions.
9787
 *
9788
 * ssl           The SSL/TLS object.
9789
 * identity      The identity.
9790
 * len           The length of the identity data.
9791
 * age           The age of the identity.
9792
 * hmac          The HMAC algorithm.
9793
 * ciphersuite0  The first byte of the ciphersuite to use.
9794
 * ciphersuite   The second byte of the ciphersuite to use.
9795
 * resumption    The PSK is for resumption of a session.
9796
 * preSharedKey  The new pre-shared key object.
9797
 * returns 0 on success and other values indicate failure.
9798
 */
9799
int TLSX_PreSharedKey_Use(TLSX** extensions, const byte* identity, word16 len,
9800
                          word32 age, byte hmac, byte cipherSuite0,
9801
                          byte cipherSuite, byte resumption,
9802
                          PreSharedKey **preSharedKey, void* heap)
9803
{
9804
    int           ret = 0;
9805
    TLSX*         extension;
9806
    PreSharedKey* psk = NULL;
9807
9808
    /* Find the pre-shared key extension if it exists. */
9809
    extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
9810
    if (extension == NULL) {
9811
        /* Push new pre-shared key extension. */
9812
        ret = TLSX_Push(extensions, TLSX_PRE_SHARED_KEY, NULL, heap);
9813
        if (ret != 0)
9814
            return ret;
9815
9816
        extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
9817
        if (extension == NULL)
9818
            return MEMORY_E;
9819
    }
9820
9821
    /* Try to find the pre-shared key with this identity. */
9822
    psk = (PreSharedKey*)extension->data;
9823
    while (psk != NULL) {
9824
        if ((psk->identityLen == len) &&
9825
               (XMEMCMP(psk->identity, identity, len) == 0)) {
9826
            break;
9827
        }
9828
        psk = psk->next;
9829
    }
9830
9831
    /* Create a new pre-shared key object if not found. */
9832
    if (psk == NULL) {
9833
        ret = TLSX_PreSharedKey_New((PreSharedKey**)&extension->data, identity,
9834
                                    len, heap, &psk);
9835
        if (ret != 0)
9836
            return ret;
9837
    }
9838
9839
    /* Update/set age and HMAC algorithm. */
9840
    psk->ticketAge    = age;
9841
    psk->hmac         = hmac;
9842
    psk->cipherSuite0 = cipherSuite0;
9843
    psk->cipherSuite  = cipherSuite;
9844
    psk->resumption   = resumption;
9845
    psk->binderLen    = GetHmacLength(psk->hmac);
9846
9847
    if (preSharedKey != NULL)
9848
        *preSharedKey = psk;
9849
9850
    return 0;
9851
}
9852
9853
#define PSK_FREE_ALL  TLSX_PreSharedKey_FreeAll
9854
#define PSK_GET_SIZE  TLSX_PreSharedKey_GetSize
9855
#define PSK_WRITE     TLSX_PreSharedKey_Write
9856
#define PSK_PARSE     TLSX_PreSharedKey_Parse
9857
9858
#else
9859
9860
#define PSK_FREE_ALL(a, b)
9861
#define PSK_GET_SIZE(a, b, c) 0
9862
#define PSK_WRITE(a, b, c, d) 0
9863
#define PSK_PARSE(a, b, c, d) 0
9864
9865
#endif
9866
9867
/******************************************************************************/
9868
/* PSK Key Exchange Modes                                                     */
9869
/******************************************************************************/
9870
9871
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
9872
/* Get the size of the encoded PSK KE modes extension.
9873
 * Only in ClientHello.
9874
 *
9875
 * modes    The PSK KE mode bit string.
9876
 * msgType  The type of the message this extension is being written into.
9877
 * returns the number of bytes of the encoded PSK KE mode extension.
9878
 */
9879
static int TLSX_PskKeModes_GetSize(byte modes, byte msgType, word16* pSz)
9880
{
9881
    if (msgType == client_hello) {
9882
        /* Format: Len | Modes* */
9883
        word16 len = OPAQUE8_LEN;
9884
        /* Check whether each possible mode is to be written. */
9885
        if (modes & (1 << PSK_KE))
9886
            len += OPAQUE8_LEN;
9887
        if (modes & (1 << PSK_DHE_KE))
9888
            len += OPAQUE8_LEN;
9889
        *pSz += len;
9890
        return 0;
9891
    }
9892
9893
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
9894
    return SANITY_MSG_E;
9895
}
9896
9897
/* Writes the PSK KE modes extension into the output buffer.
9898
 * Assumes that the the output buffer is big enough to hold data.
9899
 * Only in ClientHello.
9900
 *
9901
 * modes    The PSK KE mode bit string.
9902
 * output   The buffer to write into.
9903
 * msgType  The type of the message this extension is being written into.
9904
 * returns the number of bytes written into the buffer.
9905
 */
9906
static int TLSX_PskKeModes_Write(byte modes, byte* output, byte msgType,
9907
                                 word16* pSz)
9908
{
9909
    if (msgType == client_hello) {
9910
        /* Format: Len | Modes* */
9911
        word16 idx = OPAQUE8_LEN;
9912
9913
        /* Write out each possible mode. */
9914
        if (modes & (1 << PSK_KE))
9915
            output[idx++] = PSK_KE;
9916
        if (modes & (1 << PSK_DHE_KE))
9917
            output[idx++] = PSK_DHE_KE;
9918
        /* Write out length of mode list. */
9919
        output[0] = (byte)(idx - OPAQUE8_LEN);
9920
9921
        *pSz += idx;
9922
        return 0;
9923
    }
9924
9925
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
9926
    return SANITY_MSG_E;
9927
}
9928
9929
int TLSX_PskKeyModes_Parse_Modes(const byte* input, word16 length, byte msgType,
9930
                                byte* modes)
9931
{
9932
    if (msgType == client_hello) {
9933
        /* Format: Len | Modes* */
9934
        int   idx = 0;
9935
        word16 len;
9936
        *modes = 0;
9937
9938
        /* Ensure length byte exists. */
9939
        if (length < OPAQUE8_LEN)
9940
            return BUFFER_E;
9941
9942
        /* Get length of mode list and ensure that is the only data. */
9943
        len = input[0];
9944
        if (length - OPAQUE8_LEN != len)
9945
            return BUFFER_E;
9946
9947
        idx = OPAQUE8_LEN;
9948
        /* Set a bit for each recognized modes. */
9949
        while (len > 0) {
9950
            /* Ignore unrecognized modes.  */
9951
            if (input[idx] <= PSK_DHE_KE)
9952
               *modes |= 1 << input[idx];
9953
            idx++;
9954
            len--;
9955
        }
9956
        return 0;
9957
    }
9958
9959
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
9960
    return SANITY_MSG_E;
9961
}
9962
9963
/* Parse the PSK KE modes extension.
9964
 * Only in ClientHello.
9965
 *
9966
 * ssl      The SSL/TLS object.
9967
 * input    The extension data.
9968
 * length   The length of the extension data.
9969
 * msgType  The type of the message this extension is being parsed from.
9970
 * returns 0 on success and other values indicate failure.
9971
 */
9972
static int TLSX_PskKeModes_Parse(WOLFSSL* ssl, const byte* input, word16 length,
9973
                                 byte msgType)
9974
{
9975
    int    ret;
9976
    byte modes;
9977
9978
    ret = TLSX_PskKeyModes_Parse_Modes(input, length, msgType, &modes);
9979
    if (ret == 0)
9980
        ret = TLSX_PskKeyModes_Use(ssl, modes);
9981
9982
    WOLFSSL_ERROR_VERBOSE(ret);
9983
    return ret;
9984
}
9985
9986
/* Use the data to create a new PSK Key Exchange Modes object in the extensions.
9987
 *
9988
 * ssl    The SSL/TLS object.
9989
 * modes  The PSK key exchange modes.
9990
 * returns 0 on success and other values indicate failure.
9991
 */
9992
int TLSX_PskKeyModes_Use(WOLFSSL* ssl, byte modes)
9993
{
9994
    int           ret = 0;
9995
    TLSX*         extension;
9996
9997
    /* Find the PSK key exchange modes extension if it exists. */
9998
    extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
9999
    if (extension == NULL) {
10000
        /* Push new PSK key exchange modes extension. */
10001
        ret = TLSX_Push(&ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES, NULL,
10002
            ssl->heap);
10003
        if (ret != 0)
10004
            return ret;
10005
10006
        extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
10007
        if (extension == NULL)
10008
            return MEMORY_E;
10009
    }
10010
10011
    extension->val = modes;
10012
10013
    return 0;
10014
}
10015
10016
#define PKM_GET_SIZE  TLSX_PskKeModes_GetSize
10017
#define PKM_WRITE     TLSX_PskKeModes_Write
10018
#define PKM_PARSE     TLSX_PskKeModes_Parse
10019
10020
#else
10021
10022
#define PKM_GET_SIZE(a, b, c) 0
10023
#define PKM_WRITE(a, b, c, d) 0
10024
#define PKM_PARSE(a, b, c, d) 0
10025
10026
#endif
10027
10028
/******************************************************************************/
10029
/* Post-Handshake Authentication                                              */
10030
/******************************************************************************/
10031
10032
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
10033
/* Get the size of the encoded Post-Handshake Authentication extension.
10034
 * Only in ClientHello.
10035
 *
10036
 * msgType  The type of the message this extension is being written into.
10037
 * returns the number of bytes of the encoded Post-Handshake Authentication
10038
 * extension.
10039
 */
10040
static int TLSX_PostHandAuth_GetSize(byte msgType, word16* pSz)
10041
{
10042
    if (msgType == client_hello) {
10043
        *pSz += 0;
10044
        return 0;
10045
    }
10046
10047
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10048
    return SANITY_MSG_E;
10049
}
10050
10051
/* Writes the Post-Handshake Authentication extension into the output buffer.
10052
 * Assumes that the the output buffer is big enough to hold data.
10053
 * Only in ClientHello.
10054
 *
10055
 * output   The buffer to write into.
10056
 * msgType  The type of the message this extension is being written into.
10057
 * returns the number of bytes written into the buffer.
10058
 */
10059
static int TLSX_PostHandAuth_Write(byte* output, byte msgType, word16* pSz)
10060
{
10061
    (void)output;
10062
10063
    if (msgType == client_hello) {
10064
        *pSz += 0;
10065
        return 0;
10066
    }
10067
10068
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10069
    return SANITY_MSG_E;
10070
}
10071
10072
/* Parse the Post-Handshake Authentication extension.
10073
 * Only in ClientHello.
10074
 *
10075
 * ssl      The SSL/TLS object.
10076
 * input    The extension data.
10077
 * length   The length of the extension data.
10078
 * msgType  The type of the message this extension is being parsed from.
10079
 * returns 0 on success and other values indicate failure.
10080
 */
10081
static int TLSX_PostHandAuth_Parse(WOLFSSL* ssl, const byte* input,
10082
                                   word16 length, byte msgType)
10083
{
10084
    (void)input;
10085
10086
    if (msgType == client_hello) {
10087
        /* Ensure extension is empty. */
10088
        if (length != 0)
10089
            return BUFFER_E;
10090
10091
        ssl->options.postHandshakeAuth = 1;
10092
        return 0;
10093
    }
10094
10095
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10096
    return SANITY_MSG_E;
10097
}
10098
10099
/* Create a new Post-handshake authentication object in the extensions.
10100
 *
10101
 * ssl    The SSL/TLS object.
10102
 * returns 0 on success and other values indicate failure.
10103
 */
10104
static int TLSX_PostHandAuth_Use(WOLFSSL* ssl)
10105
{
10106
    int   ret = 0;
10107
    TLSX* extension;
10108
10109
    /* Find the PSK key exchange modes extension if it exists. */
10110
    extension = TLSX_Find(ssl->extensions, TLSX_POST_HANDSHAKE_AUTH);
10111
    if (extension == NULL) {
10112
        /* Push new Post-handshake Authentication extension. */
10113
        ret = TLSX_Push(&ssl->extensions, TLSX_POST_HANDSHAKE_AUTH, NULL,
10114
            ssl->heap);
10115
        if (ret != 0)
10116
            return ret;
10117
    }
10118
10119
    return 0;
10120
}
10121
10122
#define PHA_GET_SIZE  TLSX_PostHandAuth_GetSize
10123
#define PHA_WRITE     TLSX_PostHandAuth_Write
10124
#define PHA_PARSE     TLSX_PostHandAuth_Parse
10125
10126
#else
10127
10128
#define PHA_GET_SIZE(a, b)    0
10129
#define PHA_WRITE(a, b, c)    0
10130
#define PHA_PARSE(a, b, c, d) 0
10131
10132
#endif
10133
10134
/******************************************************************************/
10135
/* Early Data Indication                                                      */
10136
/******************************************************************************/
10137
10138
#ifdef WOLFSSL_EARLY_DATA
10139
/* Get the size of the encoded Early Data Indication extension.
10140
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
10141
 *
10142
 * msgType  The type of the message this extension is being written into.
10143
 * returns the number of bytes of the encoded Early Data Indication extension.
10144
 */
10145
static int TLSX_EarlyData_GetSize(byte msgType, word16* pSz)
10146
{
10147
    int ret = 0;
10148
10149
    if (msgType == client_hello || msgType == encrypted_extensions)
10150
        *pSz += 0;
10151
    else if (msgType == session_ticket)
10152
        *pSz += OPAQUE32_LEN;
10153
    else {
10154
        ret = SANITY_MSG_E;
10155
        WOLFSSL_ERROR_VERBOSE(ret);
10156
    }
10157
10158
    return ret;
10159
}
10160
10161
/* Writes the Early Data Indicator extension into the output buffer.
10162
 * Assumes that the the output buffer is big enough to hold data.
10163
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
10164
 *
10165
 * maxSz    The maximum early data size.
10166
 * output   The buffer to write into.
10167
 * msgType  The type of the message this extension is being written into.
10168
 * returns the number of bytes written into the buffer.
10169
 */
10170
static int TLSX_EarlyData_Write(word32 maxSz, byte* output, byte msgType,
10171
                                word16* pSz)
10172
{
10173
    if (msgType == client_hello || msgType == encrypted_extensions)
10174
        return 0;
10175
    else if (msgType == session_ticket) {
10176
        c32toa(maxSz, output);
10177
        *pSz += OPAQUE32_LEN;
10178
        return 0;
10179
    }
10180
10181
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10182
    return SANITY_MSG_E;
10183
}
10184
10185
/* Parse the Early Data Indicator extension.
10186
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
10187
 *
10188
 * ssl      The SSL/TLS object.
10189
 * input    The extension data.
10190
 * length   The length of the extension data.
10191
 * msgType  The type of the message this extension is being parsed from.
10192
 * returns 0 on success and other values indicate failure.
10193
 */
10194
static int TLSX_EarlyData_Parse(WOLFSSL* ssl, const byte* input, word16 length,
10195
                                 byte msgType)
10196
{
10197
    WOLFSSL_ENTER("TLSX_EarlyData_Parse");
10198
    if (msgType == client_hello) {
10199
        if (length != 0)
10200
            return BUFFER_E;
10201
10202
        if (ssl->earlyData == expecting_early_data) {
10203
10204
            if (ssl->options.maxEarlyDataSz != 0)
10205
                ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED;
10206
            else
10207
                ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_REJECTED;
10208
10209
            return TLSX_EarlyData_Use(ssl, 0, 0);
10210
        }
10211
        ssl->earlyData = early_data_ext;
10212
10213
        return 0;
10214
    }
10215
    if (msgType == encrypted_extensions) {
10216
        if (length != 0)
10217
            return BUFFER_E;
10218
10219
        /* Ensure the index of PSK identity chosen by server is 0.
10220
         * Index is plus one to handle 'not set' value of 0.
10221
         */
10222
        if (ssl->options.pskIdIndex != 1) {
10223
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
10224
            return PSK_KEY_ERROR;
10225
        }
10226
10227
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
10228
            /* the extension from server comes in */
10229
            ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED;
10230
        }
10231
10232
        return TLSX_EarlyData_Use(ssl, 1, 1);
10233
    }
10234
    if (msgType == session_ticket) {
10235
        word32 maxSz;
10236
10237
        if (length != OPAQUE32_LEN)
10238
            return BUFFER_E;
10239
        ato32(input, &maxSz);
10240
10241
        ssl->session->maxEarlyDataSz = maxSz;
10242
        return 0;
10243
    }
10244
10245
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10246
    return SANITY_MSG_E;
10247
}
10248
10249
/* Use the data to create a new Early Data object in the extensions.
10250
 *
10251
 * ssl    The SSL/TLS object.
10252
 * maxSz  The maximum early data size.
10253
 * is_response   if this extension is part of a response
10254
 * returns 0 on success and other values indicate failure.
10255
 */
10256
int TLSX_EarlyData_Use(WOLFSSL* ssl, word32 maxSz, int is_response)
10257
{
10258
    int   ret = 0;
10259
    TLSX* extension;
10260
10261
    /* Find the early data extension if it exists. */
10262
    extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
10263
    if (extension == NULL) {
10264
        /* Push new early data extension. */
10265
        ret = TLSX_Push(&ssl->extensions, TLSX_EARLY_DATA, NULL, ssl->heap);
10266
        if (ret != 0)
10267
            return ret;
10268
10269
        extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
10270
        if (extension == NULL)
10271
            return MEMORY_E;
10272
    }
10273
10274
    extension->resp = is_response;
10275
    /* In QUIC, earlydata size is either 0 or 0xffffffff.
10276
     * Override any size between, possibly left from our initial value */
10277
    extension->val  = (WOLFSSL_IS_QUIC(ssl) && is_response && maxSz > 0) ?
10278
                       WOLFSSL_MAX_32BIT : maxSz;
10279
10280
    return 0;
10281
}
10282
10283
#define EDI_GET_SIZE  TLSX_EarlyData_GetSize
10284
#define EDI_WRITE     TLSX_EarlyData_Write
10285
#define EDI_PARSE     TLSX_EarlyData_Parse
10286
10287
#else
10288
10289
#define EDI_GET_SIZE(a, b)    0
10290
#define EDI_WRITE(a, b, c, d) 0
10291
#define EDI_PARSE(a, b, c, d) 0
10292
10293
#endif
10294
10295
/******************************************************************************/
10296
/* QUIC transport parameter extension                                         */
10297
/******************************************************************************/
10298
#ifdef WOLFSSL_QUIC
10299
10300
static word16 TLSX_QuicTP_GetSize(TLSX* extension)
10301
{
10302
    const QuicTransportParam *tp = (QuicTransportParam*)extension->data;
10303
10304
    return tp ? tp->len : 0;
10305
}
10306
10307
int TLSX_QuicTP_Use(WOLFSSL* ssl, TLSX_Type ext_type, int is_response)
10308
{
10309
    int ret = 0;
10310
    TLSX* extension;
10311
10312
    WOLFSSL_ENTER("TLSX_QuicTP_Use");
10313
    if (ssl->quic.transport_local == NULL) {
10314
        /* RFC9000, ch 7.3: "An endpoint MUST treat the absence of [...]
10315
         *     from either endpoint [...] as a connection error of type
10316
         *     TRANSPORT_PARAMETER_ERROR."
10317
         */
10318
        ret = QUIC_TP_MISSING_E;
10319
        goto cleanup;
10320
    }
10321
10322
    extension = TLSX_Find(ssl->extensions, ext_type);
10323
    if (extension == NULL) {
10324
        ret = TLSX_Push(&ssl->extensions, ext_type, NULL, ssl->heap);
10325
        if (ret != 0)
10326
            goto cleanup;
10327
10328
        extension = TLSX_Find(ssl->extensions, ext_type);
10329
        if (extension == NULL) {
10330
            ret = MEMORY_E;
10331
            goto cleanup;
10332
        }
10333
    }
10334
    if (extension->data) {
10335
        QuicTransportParam_free((QuicTransportParam*)extension->data, ssl->heap);
10336
        extension->data = NULL;
10337
    }
10338
    extension->resp = is_response;
10339
    extension->data = (void*)QuicTransportParam_dup(ssl->quic.transport_local, ssl->heap);
10340
    if (!extension->data) {
10341
        ret = MEMORY_E;
10342
        goto cleanup;
10343
    }
10344
10345
cleanup:
10346
    WOLFSSL_LEAVE("TLSX_QuicTP_Use", ret);
10347
    return ret;
10348
}
10349
10350
static word16 TLSX_QuicTP_Write(QuicTransportParam *tp, byte* output)
10351
{
10352
    word16 len = 0;
10353
10354
    WOLFSSL_ENTER("TLSX_QuicTP_Write");
10355
    if (tp && tp->len) {
10356
        XMEMCPY(output, tp->data, tp->len);
10357
        len = tp->len;
10358
    }
10359
    WOLFSSL_LEAVE("TLSX_QuicTP_Write", len);
10360
    return len;
10361
}
10362
10363
static int TLSX_QuicTP_Parse(WOLFSSL *ssl, const byte *input, size_t len, int ext_type, int msgType)
10364
{
10365
    const QuicTransportParam *tp, **ptp;
10366
10367
    (void)msgType;
10368
    tp = QuicTransportParam_new(input, len, ssl->heap);
10369
    if (!tp) {
10370
        return MEMORY_E;
10371
    }
10372
    ptp = (ext_type == TLSX_KEY_QUIC_TP_PARAMS_DRAFT) ?
10373
        &ssl->quic.transport_peer_draft : &ssl->quic.transport_peer;
10374
    if (*ptp) {
10375
        QTP_FREE(*ptp, ssl->heap);
10376
    }
10377
    *ptp = tp;
10378
    return 0;
10379
}
10380
10381
#define QTP_GET_SIZE    TLSX_QuicTP_GetSize
10382
#define QTP_USE         TLSX_QuicTP_Use
10383
#define QTP_WRITE       TLSX_QuicTP_Write
10384
#define QTP_PARSE       TLSX_QuicTP_Parse
10385
10386
#endif /* WOLFSSL_QUIC */
10387
10388
#if defined(WOLFSSL_DTLS_CID)
10389
#define CID_GET_SIZE  TLSX_ConnectionID_GetSize
10390
#define CID_WRITE  TLSX_ConnectionID_Write
10391
#define CID_PARSE  TLSX_ConnectionID_Parse
10392
#define CID_FREE  TLSX_ConnectionID_Free
10393
#else
10394
#define CID_GET_SIZE(a) 0
10395
#define CID_WRITE(a, b) 0
10396
#define CID_PARSE(a, b, c, d) 0
10397
#define CID_FREE(a, b) 0
10398
#endif /* defined(WOLFSSL_DTLS_CID) */
10399
10400
/******************************************************************************/
10401
/* TLS Extensions Framework                                                   */
10402
/******************************************************************************/
10403
10404
/** Finds an extension in the provided list. */
10405
TLSX* TLSX_Find(TLSX* list, TLSX_Type type)
10406
0
{
10407
0
    TLSX* extension = list;
10408
10409
0
    while (extension && extension->type != type)
10410
0
        extension = extension->next;
10411
10412
0
    return extension;
10413
0
}
10414
10415
/** Remove an extension. */
10416
void TLSX_Remove(TLSX** list, TLSX_Type type, void* heap)
10417
0
{
10418
0
    TLSX* extension;
10419
0
    TLSX** next;
10420
10421
0
    if (list == NULL)
10422
0
        return;
10423
10424
0
    extension = *list;
10425
0
    next = list;
10426
10427
0
    while (extension && extension->type != type) {
10428
0
        next = &extension->next;
10429
0
        extension = extension->next;
10430
0
    }
10431
10432
0
    if (extension) {
10433
0
        *next = extension->next;
10434
0
        extension->next = NULL;
10435
0
        TLSX_FreeAll(extension, heap);
10436
0
    }
10437
0
}
10438
10439
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
10440
#define GREASE_ECH_SIZE 160
10441
#define MAX_PUBLIC_NAME_SZ 256
10442
#define TLS_INFO_CONST_STRING "tls ech"
10443
#define TLS_INFO_CONST_STRING_SZ 7
10444
10445
/* return status after setting up ech to write a grease ech */
10446
static int TLSX_GreaseECH_Use(TLSX** extensions, void* heap, WC_RNG* rng)
10447
{
10448
    int ret = 0;
10449
    WOLFSSL_ECH* ech;
10450
10451
    if (extensions == NULL)
10452
        return BAD_FUNC_ARG;
10453
10454
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
10455
        DYNAMIC_TYPE_TMP_BUFFER);
10456
10457
    if (ech == NULL)
10458
        return MEMORY_E;
10459
10460
    ForceZero(ech, sizeof(WOLFSSL_ECH));
10461
10462
    ech->state = ECH_WRITE_GREASE;
10463
10464
    /* 0 for outer */
10465
    ech->type = ECH_TYPE_OUTER;
10466
    /* kemId */
10467
    ech->kemId = DHKEM_X25519_HKDF_SHA256;
10468
    /* cipherSuite kdf */
10469
    ech->cipherSuite.kdfId = HKDF_SHA256;
10470
    /* cipherSuite aead */
10471
    ech->cipherSuite.aeadId = HPKE_AES_128_GCM;
10472
10473
    /* random configId */
10474
    ret = wc_RNG_GenerateByte(rng, &(ech->configId));
10475
10476
    /* curve25519 encLen */
10477
    ech->encLen = DHKEM_X25519_ENC_LEN;
10478
10479
    if (ret == 0)
10480
        ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
10481
10482
    if (ret != 0) {
10483
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
10484
    }
10485
10486
    return ret;
10487
}
10488
10489
/* return status after setting up ech to write real ech */
10490
static int TLSX_ECH_Use(WOLFSSL_EchConfig* echConfig, TLSX** extensions,
10491
    void* heap, WC_RNG* rng)
10492
{
10493
    int ret = 0;
10494
    int suiteIndex;
10495
    WOLFSSL_ECH* ech;
10496
10497
    if (extensions == NULL)
10498
        return BAD_FUNC_ARG;
10499
10500
    /* find a supported cipher suite */
10501
    suiteIndex = EchConfigGetSupportedCipherSuite(echConfig);
10502
10503
    if (suiteIndex < 0)
10504
        return suiteIndex;
10505
10506
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
10507
        DYNAMIC_TYPE_TMP_BUFFER);
10508
10509
    if (ech == NULL)
10510
        return MEMORY_E;
10511
10512
    ForceZero(ech, sizeof(WOLFSSL_ECH));
10513
10514
    ech->state = ECH_WRITE_REAL;
10515
10516
    ech->echConfig = echConfig;
10517
10518
    /* 0 for outer */
10519
    ech->type = ECH_TYPE_OUTER;
10520
    /* kemId */
10521
    ech->kemId = echConfig->kemId;
10522
10523
    /* cipherSuite kdf */
10524
    ech->cipherSuite.kdfId = echConfig->cipherSuites[suiteIndex].kdfId;
10525
    /* cipherSuite aead */
10526
    ech->cipherSuite.aeadId = echConfig->cipherSuites[suiteIndex].aeadId;
10527
    /* configId */
10528
    ech->configId = echConfig->configId;
10529
10530
    /* encLen */
10531
    switch (echConfig->kemId)
10532
    {
10533
        case DHKEM_P256_HKDF_SHA256:
10534
            ech->encLen = DHKEM_P256_ENC_LEN;
10535
            break;
10536
        case DHKEM_P384_HKDF_SHA384:
10537
            ech->encLen = DHKEM_P384_ENC_LEN;
10538
            break;
10539
        case DHKEM_P521_HKDF_SHA512:
10540
            ech->encLen = DHKEM_P521_ENC_LEN;
10541
            break;
10542
        case DHKEM_X25519_HKDF_SHA256:
10543
            ech->encLen = DHKEM_X25519_ENC_LEN;
10544
            break;
10545
        case DHKEM_X448_HKDF_SHA512:
10546
            ech->encLen = DHKEM_X448_ENC_LEN;
10547
            break;
10548
    }
10549
10550
    /* setup hpke */
10551
    ech->hpke = (Hpke*)XMALLOC(sizeof(Hpke), heap, DYNAMIC_TYPE_TMP_BUFFER);
10552
10553
    if (ech->hpke == NULL) {
10554
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
10555
        return MEMORY_E;
10556
    }
10557
10558
    ret = wc_HpkeInit(ech->hpke, ech->kemId, ech->cipherSuite.kdfId,
10559
        ech->cipherSuite.aeadId, heap);
10560
10561
    /* setup the ephemeralKey */
10562
    if (ret == 0)
10563
        ret = wc_HpkeGenerateKeyPair(ech->hpke, &ech->ephemeralKey, rng);
10564
10565
    if (ret == 0)
10566
        ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
10567
10568
    if (ret != 0) {
10569
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
10570
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
10571
    }
10572
10573
    return ret;
10574
}
10575
10576
/* return status after setting up ech to read and decrypt */
10577
static int TLSX_ServerECH_Use(TLSX** extensions, void* heap,
10578
    WOLFSSL_EchConfig* configs)
10579
{
10580
    int ret;
10581
    WOLFSSL_ECH* ech;
10582
    TLSX* echX;
10583
10584
    if (extensions == NULL)
10585
        return BAD_FUNC_ARG;
10586
10587
    /* if we already have ech don't override it */
10588
    echX = TLSX_Find(*extensions, TLSX_ECH);
10589
    if (echX != NULL)
10590
        return 0;
10591
10592
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
10593
        DYNAMIC_TYPE_TMP_BUFFER);
10594
10595
    if (ech == NULL)
10596
        return MEMORY_E;
10597
10598
    ForceZero(ech, sizeof(WOLFSSL_ECH));
10599
10600
    ech->state = ECH_WRITE_NONE;
10601
10602
    /* 0 for outer */
10603
    ech->type = ECH_TYPE_OUTER;
10604
10605
    ech->echConfig = configs;
10606
10607
    /* setup the rest of the settings when we receive ech from the client */
10608
    ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
10609
10610
    if (ret != 0)
10611
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
10612
10613
    return ret;
10614
}
10615
10616
/* return length after writing the ech */
10617
static int TLSX_ECH_Write(WOLFSSL_ECH* ech, byte* writeBuf, word16* offset)
10618
{
10619
    int ret = 0;
10620
    int rngRet = -1;
10621
    word32 configsLen = 0;
10622
    void* ephemeralKey = NULL;
10623
    byte* writeBuf_p = writeBuf;
10624
#ifdef WOLFSSL_SMALL_STACK
10625
    Hpke* hpke = NULL;
10626
    WC_RNG* rng = NULL;
10627
#else
10628
    Hpke hpke[1];
10629
    WC_RNG rng[1];
10630
#endif
10631
10632
    WOLFSSL_MSG("TLSX_ECH_Write");
10633
10634
    if (ech->state == ECH_WRITE_NONE || ech->state == ECH_PARSED_INTERNAL)
10635
        return 0;
10636
10637
    if (ech->state == ECH_WRITE_RETRY_CONFIGS) {
10638
        /* get size then write */
10639
        ret = GetEchConfigsEx(ech->echConfig, NULL, &configsLen);
10640
10641
        if (ret != LENGTH_ONLY_E)
10642
            return ret;
10643
10644
        ret = GetEchConfigsEx(ech->echConfig, writeBuf, &configsLen);
10645
10646
        if (ret != WOLFSSL_SUCCESS)
10647
            return ret;
10648
10649
        *offset += configsLen;
10650
10651
        return 0;
10652
    }
10653
10654
#ifdef WOLFSSL_SMALL_STACK
10655
    hpke = (Hpke*)XMALLOC(sizeof(Hpke), NULL, DYNAMIC_TYPE_TMP_BUFFER);
10656
10657
    if (hpke == NULL)
10658
        return MEMORY_E;
10659
10660
    rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
10661
10662
    if (rng == NULL) {
10663
        XFREE(hpke, NULL, DYNAMIC_TYPE_RNG);
10664
        return MEMORY_E;
10665
    }
10666
#endif
10667
10668
    /* type */
10669
    *writeBuf_p = ech->type;
10670
    writeBuf_p += sizeof(ech->type);
10671
10672
    /* outer has body, inner does not */
10673
    if (ech->type == ECH_TYPE_OUTER) {
10674
        /* kdfId */
10675
        c16toa(ech->cipherSuite.kdfId, writeBuf_p);
10676
        writeBuf_p += sizeof(ech->cipherSuite.kdfId);
10677
10678
        /* aeadId */
10679
        c16toa(ech->cipherSuite.aeadId, writeBuf_p);
10680
        writeBuf_p += sizeof(ech->cipherSuite.aeadId);
10681
10682
        /* configId */
10683
        *writeBuf_p = ech->configId;
10684
        writeBuf_p += sizeof(ech->configId);
10685
10686
        /* encLen */
10687
        c16toa(ech->encLen, writeBuf_p);
10688
        writeBuf_p += 2;
10689
10690
        if (ech->state == ECH_WRITE_GREASE) {
10691
            /* hpke init */
10692
            ret = wc_HpkeInit(hpke, ech->kemId, ech->cipherSuite.kdfId,
10693
                ech->cipherSuite.aeadId, NULL);
10694
10695
            if (ret == 0)
10696
                rngRet = ret = wc_InitRng(rng);
10697
10698
            /* create the ephemeralKey */
10699
            if (ret == 0)
10700
                ret = wc_HpkeGenerateKeyPair(hpke, &ephemeralKey, rng);
10701
10702
            /* enc */
10703
            if (ret == 0) {
10704
                ret = wc_HpkeSerializePublicKey(hpke, ephemeralKey, writeBuf_p,
10705
                    &ech->encLen);
10706
                writeBuf_p += ech->encLen;
10707
            }
10708
10709
            if (ret == 0) {
10710
                /* innerClientHelloLen */
10711
                c16toa(GREASE_ECH_SIZE + ((writeBuf_p + 2 - writeBuf) % 32),
10712
                    writeBuf_p);
10713
                writeBuf_p += 2;
10714
10715
                /* innerClientHello */
10716
                ret = wc_RNG_GenerateBlock(rng, writeBuf_p, GREASE_ECH_SIZE +
10717
                    ((writeBuf_p - writeBuf) % 32));
10718
                writeBuf_p += GREASE_ECH_SIZE + ((writeBuf_p - writeBuf) % 32);
10719
            }
10720
10721
            if (rngRet == 0)
10722
                wc_FreeRng(rng);
10723
10724
            if (ephemeralKey != NULL)
10725
                wc_HpkeFreeKey(hpke, hpke->kem, ephemeralKey, hpke->heap);
10726
        }
10727
        else {
10728
            /* write enc to writeBuf_p */
10729
            ret = wc_HpkeSerializePublicKey(ech->hpke, ech->ephemeralKey,
10730
                writeBuf_p, &ech->encLen);
10731
            writeBuf_p += ech->encLen;
10732
10733
            /* innerClientHelloLen */
10734
            c16toa(ech->innerClientHelloLen, writeBuf_p);
10735
            writeBuf_p += 2;
10736
10737
            /* set payload offset for when we finalize */
10738
            ech->outerClientPayload = writeBuf_p;
10739
10740
            /* write zeros for payload */
10741
            XMEMSET(writeBuf_p, 0, ech->innerClientHelloLen);
10742
            writeBuf_p += ech->innerClientHelloLen;
10743
        }
10744
    }
10745
10746
#ifdef WOLFSSL_SMALL_STACK
10747
    XFREE(hpke, NULL, DYNAMIC_TYPE_TMP_BUFFER);
10748
    XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
10749
#endif
10750
10751
    if (ret == 0)
10752
        *offset += (writeBuf_p - writeBuf);
10753
10754
    return ret;
10755
}
10756
10757
/* return the size needed for the ech extension */
10758
static int TLSX_ECH_GetSize(WOLFSSL_ECH* ech)
10759
{
10760
    int ret;
10761
    word32 size;
10762
10763
    if (ech->state == ECH_WRITE_GREASE) {
10764
        size = sizeof(ech->type) + sizeof(ech->cipherSuite) +
10765
            sizeof(ech->configId) + sizeof(word16) + ech->encLen +
10766
            sizeof(word16);
10767
10768
        size += GREASE_ECH_SIZE + (size % 32);
10769
    }
10770
    else if (ech->state == ECH_WRITE_NONE ||
10771
        ech->state == ECH_PARSED_INTERNAL) {
10772
        size = 0;
10773
    }
10774
    else if (ech->state == ECH_WRITE_RETRY_CONFIGS) {
10775
        /* get the size of the raw configs */
10776
        ret = GetEchConfigsEx(ech->echConfig, NULL, &size);
10777
10778
        if (ret != LENGTH_ONLY_E)
10779
            return ret;
10780
    }
10781
    else if (ech->type == ECH_TYPE_INNER)
10782
    {
10783
        size = sizeof(ech->type);
10784
    }
10785
    else
10786
    {
10787
        size = sizeof(ech->type) + sizeof(ech->cipherSuite) +
10788
            sizeof(ech->configId) + sizeof(word16) + ech->encLen +
10789
            sizeof(word16) + ech->innerClientHelloLen;
10790
    }
10791
10792
    return (int)size;
10793
}
10794
10795
/* return status after attempting to open the hpke encrypted ech extension, if
10796
 * successful the inner client hello will be stored in
10797
 * ech->innerClientHelloLen */
10798
static int TLSX_ExtractEch(WOLFSSL_ECH* ech, WOLFSSL_EchConfig* echConfig,
10799
    byte* aad, word32 aadLen, void* heap)
10800
{
10801
    int ret = 0;
10802
    int expectedEncLen;
10803
    int i;
10804
    word32 rawConfigLen = 0;
10805
    byte* info = NULL;
10806
    word32 infoLen = 0;
10807
10808
    if (ech == NULL || echConfig == NULL || aad == NULL)
10809
        return BAD_FUNC_ARG;
10810
10811
    /* verify the kem and key len */
10812
    switch (echConfig->kemId)
10813
    {
10814
        case DHKEM_P256_HKDF_SHA256:
10815
            expectedEncLen = DHKEM_P256_ENC_LEN;
10816
            break;
10817
        case DHKEM_P384_HKDF_SHA384:
10818
            expectedEncLen = DHKEM_P384_ENC_LEN;
10819
            break;
10820
        case DHKEM_P521_HKDF_SHA512:
10821
            expectedEncLen = DHKEM_P521_ENC_LEN;
10822
            break;
10823
        case DHKEM_X25519_HKDF_SHA256:
10824
            expectedEncLen = DHKEM_X25519_ENC_LEN;
10825
            break;
10826
        case DHKEM_X448_HKDF_SHA512:
10827
            expectedEncLen = DHKEM_X448_ENC_LEN;
10828
            break;
10829
        default:
10830
            expectedEncLen = 0;
10831
            break;
10832
    }
10833
10834
    if (expectedEncLen != ech->encLen)
10835
        return BAD_FUNC_ARG;
10836
10837
    /* verify the cipher suite */
10838
    for (i = 0; i < echConfig->numCipherSuites; i++) {
10839
        if (echConfig->cipherSuites[i].kdfId == ech->cipherSuite.kdfId &&
10840
            echConfig->cipherSuites[i].aeadId == ech->cipherSuite.aeadId) {
10841
            break;
10842
        }
10843
    }
10844
10845
    if (i >= echConfig->numCipherSuites) {
10846
        return BAD_FUNC_ARG;
10847
    }
10848
10849
    ech->hpke = (Hpke*)XMALLOC(sizeof(Hpke), heap, DYNAMIC_TYPE_TMP_BUFFER);
10850
10851
    if (ech->hpke == NULL)
10852
        return MEMORY_E;
10853
10854
    ret = wc_HpkeInit(ech->hpke, echConfig->kemId, ech->cipherSuite.kdfId,
10855
        ech->cipherSuite.aeadId, heap);
10856
10857
    /* get the rawConfigLen */
10858
    if (ret == 0)
10859
        ret = GetEchConfig(echConfig, NULL, &rawConfigLen);
10860
10861
    if (ret == LENGTH_ONLY_E)
10862
        ret = 0;
10863
10864
    /* create info */
10865
    if (ret == 0) {
10866
        infoLen = TLS_INFO_CONST_STRING_SZ + 1 + rawConfigLen;
10867
        info = (byte*)XMALLOC(infoLen, heap, DYNAMIC_TYPE_TMP_BUFFER);
10868
10869
        if (info == NULL)
10870
            ret = MEMORY_E;
10871
        else {
10872
            XMEMCPY(info, (byte*)TLS_INFO_CONST_STRING,
10873
                TLS_INFO_CONST_STRING_SZ + 1);
10874
            ret = GetEchConfig(echConfig, info +
10875
                TLS_INFO_CONST_STRING_SZ + 1, &rawConfigLen);
10876
        }
10877
    }
10878
10879
    /* decrypt the ech payload */
10880
    if (ret == 0)
10881
        ret = wc_HpkeOpenBase(ech->hpke, echConfig->receiverPrivkey, ech->enc,
10882
            ech->encLen, info, infoLen, aad, aadLen, ech->outerClientPayload,
10883
            ech->innerClientHelloLen,
10884
            ech->innerClientHello + HANDSHAKE_HEADER_SZ);
10885
10886
    if (ret != 0) {
10887
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
10888
        ech->hpke = NULL;
10889
    }
10890
10891
    if (info != NULL)
10892
        XFREE(info, heap, DYNAMIC_TYPE_TMP_BUFFER);
10893
10894
    return ret;
10895
}
10896
10897
/* parse the ech extension, if internal update ech->state and return, if
10898
 * external attempt to extract the inner client_hello, return the status */
10899
static int TLSX_ECH_Parse(WOLFSSL* ssl, const byte* readBuf, word16 size,
10900
    byte msgType)
10901
{
10902
    int ret = 0;
10903
    int i;
10904
    TLSX* echX;
10905
    WOLFSSL_ECH* ech;
10906
    WOLFSSL_EchConfig* echConfig;
10907
    byte* aadCopy;
10908
    byte* readBuf_p = (byte*)readBuf;
10909
10910
    WOLFSSL_MSG("TLSX_ECH_Parse");
10911
10912
    if (size == 0)
10913
        return BAD_FUNC_ARG;
10914
10915
    if (msgType == encrypted_extensions) {
10916
        ret = wolfSSL_SetEchConfigs(ssl, readBuf, size);
10917
10918
        if (ret == WOLFSSL_SUCCESS)
10919
            ret = 0;
10920
    }
10921
    else if (msgType == client_hello && ssl->ctx->echConfigs != NULL) {
10922
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
10923
10924
        if (echX == NULL)
10925
            return BAD_FUNC_ARG;
10926
10927
        ech = (WOLFSSL_ECH*)echX->data;
10928
10929
        /* read the ech parameters before the payload */
10930
        ech->type = *readBuf_p;
10931
        readBuf_p++;
10932
10933
        if (ech->type == ECH_TYPE_INNER) {
10934
            ech->state = ECH_PARSED_INTERNAL;
10935
            return 0;
10936
        }
10937
10938
        /* technically the payload would only be 1 byte at this length */
10939
        if (size < 11 + ech->encLen)
10940
            return BAD_FUNC_ARG;
10941
10942
        ato16(readBuf_p, &ech->cipherSuite.kdfId);
10943
        readBuf_p += 2;
10944
10945
        ato16(readBuf_p, &ech->cipherSuite.aeadId);
10946
        readBuf_p += 2;
10947
10948
        ech->configId = *readBuf_p;
10949
        readBuf_p++;
10950
10951
        ato16(readBuf_p, &ech->encLen);
10952
        readBuf_p += 2;
10953
10954
        if (ech->encLen > HPKE_Npk_MAX)
10955
            return BAD_FUNC_ARG;
10956
10957
        XMEMCPY(ech->enc, readBuf_p, ech->encLen);
10958
        readBuf_p += ech->encLen;
10959
10960
        ato16(readBuf_p, &ech->innerClientHelloLen);
10961
        ech->innerClientHelloLen -= AES_BLOCK_SIZE;
10962
        readBuf_p += 2;
10963
10964
        ech->outerClientPayload = readBuf_p;
10965
10966
        /* make a copy of the aad */
10967
        aadCopy = (byte*)XMALLOC(ech->aadLen, ssl->heap,
10968
            DYNAMIC_TYPE_TMP_BUFFER);
10969
10970
        if (aadCopy == NULL)
10971
            return MEMORY_E;
10972
10973
        XMEMCPY(aadCopy, ech->aad, ech->aadLen);
10974
10975
        /* set the ech payload of the copy to zeros */
10976
        XMEMSET(aadCopy + (readBuf_p - ech->aad), 0,
10977
            ech->innerClientHelloLen + AES_BLOCK_SIZE);
10978
10979
        /* allocate the inner payload buffer */
10980
        ech->innerClientHello =
10981
            (byte*)XMALLOC(ech->innerClientHelloLen + HANDSHAKE_HEADER_SZ,
10982
            ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
10983
10984
        if (ech->innerClientHello == NULL) {
10985
            XFREE(aadCopy, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
10986
            return MEMORY_E;
10987
        }
10988
10989
        /* first check if the config id matches */
10990
        echConfig = ssl->ctx->echConfigs;
10991
10992
        while (echConfig != NULL) {
10993
            /* decrypt with this config */
10994
            if (echConfig->configId == ech->configId) {
10995
                ret = TLSX_ExtractEch(ech, echConfig, aadCopy, ech->aadLen,
10996
                    ssl->heap);
10997
                break;
10998
            }
10999
11000
            echConfig = echConfig->next;
11001
        }
11002
11003
        /* try to decrypt with all configs */
11004
        if (echConfig == NULL || ret != 0) {
11005
            echConfig = ssl->ctx->echConfigs;
11006
11007
            while (echConfig != NULL) {
11008
                ret = TLSX_ExtractEch(ech, echConfig, aadCopy, ech->aadLen,
11009
                    ssl->heap);
11010
11011
                if (ret== 0)
11012
                    break;
11013
11014
                echConfig = echConfig->next;
11015
            }
11016
        }
11017
11018
        /* if we failed to extract */
11019
        if (ret != 0) {
11020
            XFREE(ech->innerClientHello, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
11021
            ech->innerClientHello = NULL;
11022
            ech->state = ECH_WRITE_RETRY_CONFIGS;
11023
        }
11024
        else {
11025
            i = 0;
11026
11027
            /* decrement until before the padding */
11028
            while (ech->innerClientHello[ech->innerClientHelloLen +
11029
                HANDSHAKE_HEADER_SZ - i - 1] != ECH_TYPE_INNER) {
11030
                i++;
11031
            }
11032
11033
            /* subtract the length of the padding from the length */
11034
            ech->innerClientHelloLen -= i;
11035
        }
11036
11037
        XFREE(aadCopy, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
11038
11039
        return 0;
11040
    }
11041
11042
    return ret;
11043
}
11044
11045
/* free the ech struct and the dynamic buffer it uses */
11046
static void TLSX_ECH_Free(WOLFSSL_ECH* ech, void* heap)
11047
{
11048
    if (ech->innerClientHello != NULL)
11049
        XFREE(ech->innerClientHello, heap, DYNAMIC_TYPE_TMP_BUFFER);
11050
    if (ech->ephemeralKey != NULL)
11051
        wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, ech->ephemeralKey,
11052
            ech->hpke->heap);
11053
    if (ech->hpke != NULL)
11054
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
11055
11056
    XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
11057
    (void)heap;
11058
}
11059
11060
/* encrypt the client hello and store it in ech->outerClientPayload, return
11061
 * status */
11062
int TLSX_FinalizeEch(WOLFSSL_ECH* ech, byte* aad, word32 aadLen)
11063
{
11064
    int ret;
11065
    void* receiverPubkey = NULL;
11066
    byte* info;
11067
    int infoLen;
11068
    byte* aadCopy;
11069
11070
    /* import the server public key */
11071
    ret = wc_HpkeDeserializePublicKey(ech->hpke, &receiverPubkey,
11072
        ech->echConfig->receiverPubkey, ech->encLen);
11073
11074
    if (ret == 0) {
11075
        /* create info */
11076
        infoLen = TLS_INFO_CONST_STRING_SZ + 1 + ech->echConfig->rawLen;
11077
        info = (byte*)XMALLOC(infoLen, ech->hpke->heap,
11078
            DYNAMIC_TYPE_TMP_BUFFER);
11079
        if (info == NULL)
11080
            ret = MEMORY_E;
11081
11082
        if (ret == 0) {
11083
            /* puts the null byte in for me */
11084
            XMEMCPY(info, (byte*)TLS_INFO_CONST_STRING, TLS_INFO_CONST_STRING_SZ
11085
                + 1);
11086
            XMEMCPY(info + TLS_INFO_CONST_STRING_SZ + 1, ech->echConfig->raw,
11087
                ech->echConfig->rawLen);
11088
11089
            /* make a copy of the aad since we overwrite it */
11090
            aadCopy = (byte*)XMALLOC(aadLen, ech->hpke->heap,
11091
                DYNAMIC_TYPE_TMP_BUFFER);
11092
            if (aadCopy == NULL) {
11093
                XFREE(info, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
11094
                ret = MEMORY_E;
11095
            }
11096
        }
11097
11098
        if (ret == 0) {
11099
            XMEMCPY(aadCopy, aad, aadLen);
11100
11101
            /* seal the payload */
11102
            ret = wc_HpkeSealBase(ech->hpke, ech->ephemeralKey, receiverPubkey,
11103
                info, infoLen, aadCopy, aadLen, ech->innerClientHello,
11104
                ech->innerClientHelloLen - ech->hpke->Nt,
11105
                ech->outerClientPayload);
11106
11107
            XFREE(info, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
11108
            XFREE(aadCopy, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
11109
        }
11110
    }
11111
11112
    if (receiverPubkey != NULL)
11113
        wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, receiverPubkey,
11114
            ech->hpke->heap);
11115
11116
    return ret;
11117
}
11118
11119
#define GREASE_ECH_USE TLSX_GreaseECH_Use
11120
#define ECH_USE TLSX_ECH_Use
11121
#define SERVER_ECH_USE TLSX_ServerECH_Use
11122
#define ECH_WRITE TLSX_ECH_Write
11123
#define ECH_GET_SIZE TLSX_ECH_GetSize
11124
#define ECH_PARSE TLSX_ECH_Parse
11125
#define ECH_FREE TLSX_ECH_Free
11126
11127
#endif
11128
11129
/** Releases all extensions in the provided list. */
11130
void TLSX_FreeAll(TLSX* list, void* heap)
11131
0
{
11132
0
    TLSX* extension;
11133
11134
0
    while ((extension = list)) {
11135
0
        list = extension->next;
11136
11137
0
        switch (extension->type) {
11138
11139
#ifdef HAVE_SNI
11140
            case TLSX_SERVER_NAME:
11141
                SNI_FREE_ALL((SNI*)extension->data, heap);
11142
                break;
11143
#endif
11144
11145
0
            case TLSX_TRUSTED_CA_KEYS:
11146
0
                TCA_FREE_ALL((TCA*)extension->data, heap);
11147
0
                break;
11148
11149
0
            case TLSX_MAX_FRAGMENT_LENGTH:
11150
0
                MFL_FREE_ALL(extension->data, heap);
11151
0
                break;
11152
11153
0
            case TLSX_EXTENDED_MASTER_SECRET:
11154
0
            case TLSX_TRUNCATED_HMAC:
11155
                /* Nothing to do. */
11156
0
                break;
11157
11158
0
            case TLSX_SUPPORTED_GROUPS:
11159
0
                EC_FREE_ALL((SupportedCurve*)extension->data, heap);
11160
0
                break;
11161
11162
0
            case TLSX_EC_POINT_FORMATS:
11163
0
                PF_FREE_ALL((PointFormat*)extension->data, heap);
11164
0
                break;
11165
11166
0
            case TLSX_STATUS_REQUEST:
11167
0
                CSR_FREE_ALL((CertificateStatusRequest*)extension->data, heap);
11168
0
                break;
11169
11170
0
            case TLSX_STATUS_REQUEST_V2:
11171
0
                CSR2_FREE_ALL((CertificateStatusRequestItemV2*)extension->data,
11172
0
                        heap);
11173
0
                break;
11174
11175
0
            case TLSX_RENEGOTIATION_INFO:
11176
0
                SCR_FREE_ALL(extension->data, heap);
11177
0
                break;
11178
11179
0
            case TLSX_SESSION_TICKET:
11180
0
                WOLF_STK_FREE(extension->data, heap);
11181
0
                break;
11182
11183
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
11184
0
                ALPN_FREE_ALL((ALPN*)extension->data, heap);
11185
0
                break;
11186
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
11187
0
            case TLSX_SIGNATURE_ALGORITHMS:
11188
0
                SA_FREE_ALL((SignatureAlgorithms*)extension->data, heap);
11189
0
                break;
11190
0
#endif
11191
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
11192
0
            case TLSX_ENCRYPT_THEN_MAC:
11193
0
                break;
11194
0
#endif
11195
0
#ifdef WOLFSSL_TLS13
11196
0
            case TLSX_SUPPORTED_VERSIONS:
11197
0
                break;
11198
11199
    #ifdef WOLFSSL_SEND_HRR_COOKIE
11200
            case TLSX_COOKIE:
11201
                CKE_FREE_ALL((Cookie*)extension->data, heap);
11202
                break;
11203
    #endif
11204
11205
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
11206
            case TLSX_PRE_SHARED_KEY:
11207
                PSK_FREE_ALL((PreSharedKey*)extension->data, heap);
11208
                break;
11209
11210
            case TLSX_PSK_KEY_EXCHANGE_MODES:
11211
                break;
11212
    #endif
11213
11214
    #ifdef WOLFSSL_EARLY_DATA
11215
            case TLSX_EARLY_DATA:
11216
                break;
11217
    #endif
11218
11219
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
11220
            case TLSX_POST_HANDSHAKE_AUTH:
11221
                break;
11222
    #endif
11223
11224
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
11225
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
11226
0
                break;
11227
0
    #endif
11228
11229
0
            case TLSX_KEY_SHARE:
11230
0
                KS_FREE_ALL((KeyShareEntry*)extension->data, heap);
11231
0
                break;
11232
0
#endif
11233
#ifdef WOLFSSL_SRTP
11234
            case TLSX_USE_SRTP:
11235
                SRTP_FREE((TlsxSrtp*)extension->data, heap);
11236
                break;
11237
#endif
11238
11239
    #ifdef WOLFSSL_QUIC
11240
            case TLSX_KEY_QUIC_TP_PARAMS:
11241
                FALL_THROUGH;
11242
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
11243
                QTP_FREE((QuicTransportParam*)extension->data, heap);
11244
                break;
11245
    #endif
11246
11247
#ifdef WOLFSSL_DTLS_CID
11248
        case TLSX_CONNECTION_ID:
11249
            CID_FREE((byte*)extension->data, heap);
11250
            break;
11251
#endif /* WOLFSSL_DTLS_CID */
11252
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
11253
        case TLSX_ECH:
11254
            ECH_FREE((WOLFSSL_ECH*)extension->data, heap);
11255
            break;
11256
#endif
11257
0
            default:
11258
0
                break;
11259
0
        }
11260
11261
0
        XFREE(extension, heap, DYNAMIC_TYPE_TLSX);
11262
0
    }
11263
11264
0
    (void)heap;
11265
0
}
11266
11267
/** Checks if the tls extensions are supported based on the protocol version. */
11268
0
int TLSX_SupportExtensions(WOLFSSL* ssl) {
11269
0
    return ssl && (IsTLS(ssl) || ssl->version.major == DTLS_MAJOR);
11270
0
}
11271
11272
/** Tells the buffered size of the extensions in a list. */
11273
static int TLSX_GetSize(TLSX* list, byte* semaphore, byte msgType,
11274
                        word16* pLength)
11275
0
{
11276
0
    int    ret = 0;
11277
0
    TLSX*  extension;
11278
0
    word16 length = 0;
11279
0
    byte   isRequest = (msgType == client_hello ||
11280
0
                        msgType == certificate_request);
11281
11282
0
    while ((extension = list)) {
11283
0
        list = extension->next;
11284
11285
        /* only extensions marked as response are sent back to the client. */
11286
0
        if (!isRequest && !extension->resp)
11287
0
            continue; /* skip! */
11288
11289
        /* ssl level extensions are expected to override ctx level ones. */
11290
0
        if (!IS_OFF(semaphore, TLSX_ToSemaphore(extension->type)))
11291
0
            continue; /* skip! */
11292
11293
        /* extension type + extension data length. */
11294
0
        length += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
11295
11296
0
        switch (extension->type) {
11297
11298
#ifdef HAVE_SNI
11299
            case TLSX_SERVER_NAME:
11300
                /* SNI only sends the name on the request. */
11301
                if (isRequest)
11302
                    length += SNI_GET_SIZE((SNI*)extension->data);
11303
                break;
11304
#endif
11305
11306
0
            case TLSX_TRUSTED_CA_KEYS:
11307
                /* TCA only sends the list on the request. */
11308
0
                if (isRequest)
11309
0
                    length += TCA_GET_SIZE((TCA*)extension->data);
11310
0
                break;
11311
11312
0
            case TLSX_MAX_FRAGMENT_LENGTH:
11313
0
                length += MFL_GET_SIZE(extension->data);
11314
0
                break;
11315
11316
0
            case TLSX_EXTENDED_MASTER_SECRET:
11317
0
            case TLSX_TRUNCATED_HMAC:
11318
                /* always empty. */
11319
0
                break;
11320
11321
0
            case TLSX_SUPPORTED_GROUPS:
11322
0
                length += EC_GET_SIZE((SupportedCurve*)extension->data);
11323
0
                break;
11324
11325
0
            case TLSX_EC_POINT_FORMATS:
11326
0
                length += PF_GET_SIZE((PointFormat*)extension->data);
11327
0
                break;
11328
11329
0
            case TLSX_STATUS_REQUEST:
11330
0
                length += CSR_GET_SIZE(
11331
0
                         (CertificateStatusRequest*)extension->data, isRequest);
11332
0
                break;
11333
11334
0
            case TLSX_STATUS_REQUEST_V2:
11335
0
                length += CSR2_GET_SIZE(
11336
0
                        (CertificateStatusRequestItemV2*)extension->data,
11337
0
                        isRequest);
11338
0
                break;
11339
11340
0
            case TLSX_RENEGOTIATION_INFO:
11341
0
                length += SCR_GET_SIZE((SecureRenegotiation*)extension->data,
11342
0
                        isRequest);
11343
0
                break;
11344
11345
0
            case TLSX_SESSION_TICKET:
11346
0
                length += WOLF_STK_GET_SIZE((SessionTicket*)extension->data,
11347
0
                        isRequest);
11348
0
                break;
11349
11350
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
11351
0
                length += ALPN_GET_SIZE((ALPN*)extension->data);
11352
0
                break;
11353
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
11354
0
            case TLSX_SIGNATURE_ALGORITHMS:
11355
0
                length += SA_GET_SIZE(extension->data);
11356
0
                break;
11357
0
#endif
11358
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
11359
0
            case TLSX_ENCRYPT_THEN_MAC:
11360
0
                ret = ETM_GET_SIZE(msgType, &length);
11361
0
                break;
11362
0
#endif /* HAVE_ENCRYPT_THEN_MAC */
11363
0
#ifdef WOLFSSL_TLS13
11364
0
            case TLSX_SUPPORTED_VERSIONS:
11365
0
                ret = SV_GET_SIZE(extension->data, msgType, &length);
11366
0
                break;
11367
11368
    #ifdef WOLFSSL_SEND_HRR_COOKIE
11369
            case TLSX_COOKIE:
11370
                ret = CKE_GET_SIZE((Cookie*)extension->data, msgType, &length);
11371
                break;
11372
    #endif
11373
11374
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
11375
            case TLSX_PRE_SHARED_KEY:
11376
                ret = PSK_GET_SIZE((PreSharedKey*)extension->data, msgType,
11377
                                                                       &length);
11378
                break;
11379
11380
            case TLSX_PSK_KEY_EXCHANGE_MODES:
11381
                ret = PKM_GET_SIZE((byte)extension->val, msgType, &length);
11382
                break;
11383
    #endif
11384
11385
    #ifdef WOLFSSL_EARLY_DATA
11386
            case TLSX_EARLY_DATA:
11387
                ret = EDI_GET_SIZE(msgType, &length);
11388
                break;
11389
    #endif
11390
11391
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
11392
            case TLSX_POST_HANDSHAKE_AUTH:
11393
                ret = PHA_GET_SIZE(msgType, &length);
11394
                break;
11395
    #endif
11396
11397
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
11398
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
11399
0
                length += SAC_GET_SIZE(extension->data);
11400
0
                break;
11401
0
    #endif
11402
11403
0
            case TLSX_KEY_SHARE:
11404
0
                length += KS_GET_SIZE((KeyShareEntry*)extension->data, msgType);
11405
0
                break;
11406
0
#endif
11407
#ifdef WOLFSSL_SRTP
11408
            case TLSX_USE_SRTP:
11409
                length += SRTP_GET_SIZE((TlsxSrtp*)extension->data);
11410
                break;
11411
#endif
11412
11413
#ifdef WOLFSSL_QUIC
11414
            case TLSX_KEY_QUIC_TP_PARAMS:
11415
                FALL_THROUGH; /* followed by */
11416
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
11417
                length += QTP_GET_SIZE(extension);
11418
                break;
11419
#endif
11420
#ifdef WOLFSSL_DTLS_CID
11421
            case TLSX_CONNECTION_ID:
11422
                length += CID_GET_SIZE((byte*)extension->data);
11423
                break;
11424
#endif /* WOLFSSL_DTLS_CID */
11425
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
11426
            case TLSX_ECH:
11427
                length += ECH_GET_SIZE((WOLFSSL_ECH*)extension->data);
11428
                break;
11429
#endif
11430
0
            default:
11431
0
                break;
11432
0
        }
11433
11434
        /* marks the extension as processed so ctx level */
11435
        /* extensions don't overlap with ssl level ones. */
11436
0
        TURN_ON(semaphore, TLSX_ToSemaphore(extension->type));
11437
0
    }
11438
11439
0
    *pLength += length;
11440
11441
0
    return ret;
11442
0
}
11443
11444
/** Writes the extensions of a list in a buffer. */
11445
static int TLSX_Write(TLSX* list, byte* output, byte* semaphore,
11446
                         byte msgType, word16* pOffset)
11447
0
{
11448
0
    int    ret = 0;
11449
0
    TLSX*  extension;
11450
0
    word16 offset = 0;
11451
0
    word16 length_offset = 0;
11452
0
    byte   isRequest = (msgType == client_hello ||
11453
0
                        msgType == certificate_request);
11454
11455
0
    while ((extension = list)) {
11456
0
        list = extension->next;
11457
11458
        /* only extensions marked as response are written in a response. */
11459
0
        if (!isRequest && !extension->resp)
11460
0
            continue; /* skip! */
11461
11462
        /* ssl level extensions are expected to override ctx level ones. */
11463
0
        if (!IS_OFF(semaphore, TLSX_ToSemaphore(extension->type)))
11464
0
            continue; /* skip! */
11465
11466
        /* writes extension type. */
11467
0
        c16toa(extension->type, output + offset);
11468
0
        offset += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
11469
0
        length_offset = offset;
11470
11471
        /* extension data should be written internally. */
11472
0
        switch (extension->type) {
11473
#ifdef HAVE_SNI
11474
            case TLSX_SERVER_NAME:
11475
                if (isRequest) {
11476
                    WOLFSSL_MSG("SNI extension to write");
11477
                    offset += SNI_WRITE((SNI*)extension->data, output + offset);
11478
                }
11479
                break;
11480
#endif
11481
11482
0
            case TLSX_TRUSTED_CA_KEYS:
11483
0
                WOLFSSL_MSG("Trusted CA Indication extension to write");
11484
0
                if (isRequest) {
11485
0
                    offset += TCA_WRITE((TCA*)extension->data, output + offset);
11486
0
                }
11487
0
                break;
11488
11489
0
            case TLSX_MAX_FRAGMENT_LENGTH:
11490
0
                WOLFSSL_MSG("Max Fragment Length extension to write");
11491
0
                offset += MFL_WRITE((byte*)extension->data, output + offset);
11492
0
                break;
11493
11494
0
            case TLSX_EXTENDED_MASTER_SECRET:
11495
0
                WOLFSSL_MSG("Extended Master Secret");
11496
                /* always empty. */
11497
0
                break;
11498
11499
0
            case TLSX_TRUNCATED_HMAC:
11500
0
                WOLFSSL_MSG("Truncated HMAC extension to write");
11501
                /* always empty. */
11502
0
                break;
11503
11504
0
            case TLSX_SUPPORTED_GROUPS:
11505
0
                WOLFSSL_MSG("Supported Groups extension to write");
11506
0
                offset += EC_WRITE((SupportedCurve*)extension->data,
11507
0
                                    output + offset);
11508
0
                break;
11509
11510
0
            case TLSX_EC_POINT_FORMATS:
11511
0
                WOLFSSL_MSG("Point Formats extension to write");
11512
0
                offset += PF_WRITE((PointFormat*)extension->data,
11513
0
                                    output + offset);
11514
0
                break;
11515
11516
0
            case TLSX_STATUS_REQUEST:
11517
0
                WOLFSSL_MSG("Certificate Status Request extension to write");
11518
0
                offset += CSR_WRITE((CertificateStatusRequest*)extension->data,
11519
0
                        output + offset, isRequest);
11520
0
                break;
11521
11522
0
            case TLSX_STATUS_REQUEST_V2:
11523
0
                WOLFSSL_MSG("Certificate Status Request v2 extension to write");
11524
0
                offset += CSR2_WRITE(
11525
0
                        (CertificateStatusRequestItemV2*)extension->data,
11526
0
                        output + offset, isRequest);
11527
0
                break;
11528
11529
0
            case TLSX_RENEGOTIATION_INFO:
11530
0
                WOLFSSL_MSG("Secure Renegotiation extension to write");
11531
0
                offset += SCR_WRITE((SecureRenegotiation*)extension->data,
11532
0
                        output + offset, isRequest);
11533
0
                break;
11534
11535
0
            case TLSX_SESSION_TICKET:
11536
0
                WOLFSSL_MSG("Session Ticket extension to write");
11537
0
                offset += WOLF_STK_WRITE((SessionTicket*)extension->data,
11538
0
                        output + offset, isRequest);
11539
0
                break;
11540
11541
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
11542
0
                WOLFSSL_MSG("ALPN extension to write");
11543
0
                offset += ALPN_WRITE((ALPN*)extension->data, output + offset);
11544
0
                break;
11545
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
11546
0
            case TLSX_SIGNATURE_ALGORITHMS:
11547
0
                WOLFSSL_MSG("Signature Algorithms extension to write");
11548
0
                offset += SA_WRITE(extension->data, output + offset);
11549
0
                break;
11550
0
#endif
11551
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
11552
0
            case TLSX_ENCRYPT_THEN_MAC:
11553
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension to write");
11554
0
                ret = ETM_WRITE(extension->data, output, msgType, &offset);
11555
0
                break;
11556
0
#endif /* HAVE_ENCRYPT_THEN_MAC */
11557
0
#ifdef WOLFSSL_TLS13
11558
0
            case TLSX_SUPPORTED_VERSIONS:
11559
0
                WOLFSSL_MSG("Supported Versions extension to write");
11560
0
                ret = SV_WRITE(extension->data, output + offset, msgType, &offset);
11561
0
                break;
11562
11563
    #ifdef WOLFSSL_SEND_HRR_COOKIE
11564
            case TLSX_COOKIE:
11565
                WOLFSSL_MSG("Cookie extension to write");
11566
                ret = CKE_WRITE((Cookie*)extension->data, output + offset,
11567
                                msgType, &offset);
11568
                break;
11569
    #endif
11570
11571
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
11572
            case TLSX_PRE_SHARED_KEY:
11573
                WOLFSSL_MSG("Pre-Shared Key extension to write");
11574
                ret = PSK_WRITE((PreSharedKey*)extension->data, output + offset,
11575
                                                              msgType, &offset);
11576
                break;
11577
11578
            case TLSX_PSK_KEY_EXCHANGE_MODES:
11579
                WOLFSSL_MSG("PSK Key Exchange Modes extension to write");
11580
                ret = PKM_WRITE((byte)extension->val, output + offset, msgType,
11581
                                                                       &offset);
11582
                break;
11583
    #endif
11584
11585
    #ifdef WOLFSSL_EARLY_DATA
11586
            case TLSX_EARLY_DATA:
11587
                WOLFSSL_MSG("Early Data extension to write");
11588
                ret = EDI_WRITE(extension->val, output + offset, msgType,
11589
                                                                       &offset);
11590
                break;
11591
    #endif
11592
11593
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
11594
            case TLSX_POST_HANDSHAKE_AUTH:
11595
                WOLFSSL_MSG("Post-Handshake Authentication extension to write");
11596
                ret = PHA_WRITE(output + offset, msgType, &offset);
11597
                break;
11598
    #endif
11599
11600
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
11601
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
11602
0
                WOLFSSL_MSG("Signature Algorithms extension to write");
11603
0
                offset += SAC_WRITE(extension->data, output + offset);
11604
0
                break;
11605
0
    #endif
11606
11607
0
            case TLSX_KEY_SHARE:
11608
0
                WOLFSSL_MSG("Key Share extension to write");
11609
0
                offset += KS_WRITE((KeyShareEntry*)extension->data,
11610
0
                                                      output + offset, msgType);
11611
0
                break;
11612
0
#endif
11613
#ifdef WOLFSSL_SRTP
11614
            case TLSX_USE_SRTP:
11615
                offset += SRTP_WRITE((TlsxSrtp*)extension->data, output+offset);
11616
                break;
11617
#endif
11618
#ifdef WOLFSSL_QUIC
11619
            case TLSX_KEY_QUIC_TP_PARAMS:
11620
                FALL_THROUGH;
11621
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
11622
                WOLFSSL_MSG("QUIC transport parameter to write");
11623
                offset += QTP_WRITE((QuicTransportParam*)extension->data,
11624
                                    output + offset);
11625
                break;
11626
#endif
11627
#ifdef WOLFSSL_DTLS_CID
11628
            case TLSX_CONNECTION_ID:
11629
                offset += CID_WRITE((byte*)extension->data, output+offset);
11630
                break;
11631
11632
#endif /* WOLFSSL_DTLS_CID */
11633
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
11634
            case TLSX_ECH:
11635
                ret = ECH_WRITE((WOLFSSL_ECH*)extension->data,
11636
                    output + offset, &offset);
11637
                break;
11638
#endif
11639
0
            default:
11640
0
                break;
11641
0
        }
11642
11643
        /* writes extension data length. */
11644
0
        c16toa(offset - length_offset, output + length_offset - OPAQUE16_LEN);
11645
11646
        /* marks the extension as processed so ctx level */
11647
        /* extensions don't overlap with ssl level ones. */
11648
0
        TURN_ON(semaphore, TLSX_ToSemaphore(extension->type));
11649
11650
        /* if we encountered an error propagate it */
11651
0
        if (ret != 0)
11652
0
            break;
11653
0
    }
11654
11655
0
    *pOffset += offset;
11656
11657
0
    return ret;
11658
0
}
11659
11660
#ifdef HAVE_SUPPORTED_CURVES
11661
11662
/* Populates the default supported groups / curves */
11663
static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions)
11664
0
{
11665
0
    int ret = WOLFSSL_SUCCESS;
11666
0
#ifdef WOLFSSL_TLS13
11667
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
11668
    if (ssl->options.resuming && ssl->session->namedGroup != 0) {
11669
        return TLSX_UseSupportedCurve(extensions, ssl->session->namedGroup,
11670
                                                                     ssl->heap);
11671
    }
11672
#endif
11673
11674
0
    if (ssl->numGroups != 0) {
11675
0
        int i;
11676
0
        for (i = 0; i < ssl->numGroups; i++) {
11677
0
            ret = TLSX_UseSupportedCurve(extensions, ssl->group[i], ssl->heap);
11678
0
            if (ret != WOLFSSL_SUCCESS)
11679
0
                return ret;
11680
0
        }
11681
0
        return WOLFSSL_SUCCESS;
11682
0
    }
11683
0
#endif /* WOLFSSL_TLS13 */
11684
11685
0
#if defined(HAVE_ECC)
11686
        /* list in order by strength, since not all servers choose by strength */
11687
0
        #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
11688
0
            #ifndef NO_ECC_SECP
11689
0
                ret = TLSX_UseSupportedCurve(extensions,
11690
0
                                              WOLFSSL_ECC_SECP521R1, ssl->heap);
11691
0
                if (ret != WOLFSSL_SUCCESS) return ret;
11692
0
            #endif
11693
0
        #endif
11694
0
        #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
11695
            #ifdef HAVE_ECC_BRAINPOOL
11696
                ret = TLSX_UseSupportedCurve(extensions,
11697
                                        WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap);
11698
                if (ret != WOLFSSL_SUCCESS) return ret;
11699
            #endif
11700
0
        #endif
11701
0
        #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
11702
0
            #ifndef NO_ECC_SECP
11703
0
                ret = TLSX_UseSupportedCurve(extensions,
11704
0
                                              WOLFSSL_ECC_SECP384R1, ssl->heap);
11705
0
                if (ret != WOLFSSL_SUCCESS) return ret;
11706
0
            #endif
11707
            #ifdef HAVE_ECC_BRAINPOOL
11708
                ret = TLSX_UseSupportedCurve(extensions,
11709
                                        WOLFSSL_ECC_BRAINPOOLP384R1, ssl->heap);
11710
                if (ret != WOLFSSL_SUCCESS) return ret;
11711
            #endif
11712
0
        #endif
11713
0
#endif /* HAVE_ECC */
11714
11715
0
        #ifndef HAVE_FIPS
11716
            #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
11717
                ret = TLSX_UseSupportedCurve(extensions,
11718
                                                   WOLFSSL_ECC_X448, ssl->heap);
11719
                if (ret != WOLFSSL_SUCCESS) return ret;
11720
            #endif
11721
0
        #endif /* HAVE_FIPS */
11722
11723
0
#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
11724
0
        #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
11725
0
            #ifndef NO_ECC_SECP
11726
0
                ret = TLSX_UseSupportedCurve(extensions,
11727
0
                                              WOLFSSL_ECC_SECP256R1, ssl->heap);
11728
0
                if (ret != WOLFSSL_SUCCESS) return ret;
11729
0
            #endif
11730
            #ifdef HAVE_ECC_KOBLITZ
11731
                ret = TLSX_UseSupportedCurve(extensions,
11732
                                              WOLFSSL_ECC_SECP256K1, ssl->heap);
11733
                if (ret != WOLFSSL_SUCCESS) return ret;
11734
            #endif
11735
            #ifdef HAVE_ECC_BRAINPOOL
11736
                ret = TLSX_UseSupportedCurve(extensions,
11737
                                        WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap);
11738
                if (ret != WOLFSSL_SUCCESS) return ret;
11739
            #endif
11740
0
        #endif
11741
0
#endif /* HAVE_ECC */
11742
11743
0
        #ifndef HAVE_FIPS
11744
            #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
11745
                ret = TLSX_UseSupportedCurve(extensions,
11746
                                                 WOLFSSL_ECC_X25519, ssl->heap);
11747
                if (ret != WOLFSSL_SUCCESS) return ret;
11748
            #endif
11749
0
        #endif /* HAVE_FIPS */
11750
11751
0
#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
11752
0
        #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
11753
0
            #ifndef NO_ECC_SECP
11754
0
                ret = TLSX_UseSupportedCurve(extensions,
11755
0
                                              WOLFSSL_ECC_SECP224R1, ssl->heap);
11756
0
                if (ret != WOLFSSL_SUCCESS) return ret;
11757
0
            #endif
11758
            #ifdef HAVE_ECC_KOBLITZ
11759
                ret = TLSX_UseSupportedCurve(extensions,
11760
                                              WOLFSSL_ECC_SECP224K1, ssl->heap);
11761
                if (ret != WOLFSSL_SUCCESS) return ret;
11762
            #endif
11763
0
        #endif
11764
11765
0
    #ifndef HAVE_FIPS
11766
        #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
11767
            #ifndef NO_ECC_SECP
11768
                ret = TLSX_UseSupportedCurve(extensions,
11769
                                              WOLFSSL_ECC_SECP192R1, ssl->heap);
11770
                if (ret != WOLFSSL_SUCCESS) return ret;
11771
            #endif
11772
            #ifdef HAVE_ECC_KOBLITZ
11773
                ret = TLSX_UseSupportedCurve(extensions,
11774
                                              WOLFSSL_ECC_SECP192K1, ssl->heap);
11775
                if (ret != WOLFSSL_SUCCESS) return ret;
11776
            #endif
11777
        #endif
11778
        #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
11779
            #ifndef NO_ECC_SECP
11780
                ret = TLSX_UseSupportedCurve(extensions,
11781
                                              WOLFSSL_ECC_SECP160R1, ssl->heap);
11782
                if (ret != WOLFSSL_SUCCESS) return ret;
11783
            #endif
11784
            #ifdef HAVE_ECC_SECPR2
11785
                ret = TLSX_UseSupportedCurve(extensions,
11786
                                              WOLFSSL_ECC_SECP160R2, ssl->heap);
11787
                if (ret != WOLFSSL_SUCCESS) return ret;
11788
            #endif
11789
            #ifdef HAVE_ECC_KOBLITZ
11790
                ret = TLSX_UseSupportedCurve(extensions,
11791
                                              WOLFSSL_ECC_SECP160K1, ssl->heap);
11792
                if (ret != WOLFSSL_SUCCESS) return ret;
11793
            #endif
11794
        #endif
11795
0
    #endif /* HAVE_FIPS */
11796
0
#endif /* HAVE_ECC */
11797
11798
0
#ifndef NO_DH
11799
            /* Add FFDHE supported groups. */
11800
        #ifdef HAVE_FFDHE_8192
11801
            if (8192/8 >= ssl->options.minDhKeySz &&
11802
                                            8192/8 <= ssl->options.maxDhKeySz) {
11803
                ret = TLSX_UseSupportedCurve(extensions,
11804
                                             WOLFSSL_FFDHE_8192, ssl->heap);
11805
                if (ret != WOLFSSL_SUCCESS)
11806
                    return ret;
11807
            }
11808
        #endif
11809
        #ifdef HAVE_FFDHE_6144
11810
            if (6144/8 >= ssl->options.minDhKeySz &&
11811
                                            6144/8 <= ssl->options.maxDhKeySz) {
11812
                ret = TLSX_UseSupportedCurve(extensions,
11813
                                             WOLFSSL_FFDHE_6144, ssl->heap);
11814
                if (ret != WOLFSSL_SUCCESS)
11815
                    return ret;
11816
            }
11817
        #endif
11818
        #ifdef HAVE_FFDHE_4096
11819
            if (4096/8 >= ssl->options.minDhKeySz &&
11820
                                            4096/8 <= ssl->options.maxDhKeySz) {
11821
                ret = TLSX_UseSupportedCurve(extensions,
11822
                                             WOLFSSL_FFDHE_4096, ssl->heap);
11823
                if (ret != WOLFSSL_SUCCESS)
11824
                    return ret;
11825
            }
11826
        #endif
11827
        #ifdef HAVE_FFDHE_3072
11828
            if (3072/8 >= ssl->options.minDhKeySz &&
11829
                                            3072/8 <= ssl->options.maxDhKeySz) {
11830
                ret = TLSX_UseSupportedCurve(extensions,
11831
                                             WOLFSSL_FFDHE_3072, ssl->heap);
11832
                if (ret != WOLFSSL_SUCCESS)
11833
                    return ret;
11834
            }
11835
        #endif
11836
0
        #ifdef HAVE_FFDHE_2048
11837
0
            if (2048/8 >= ssl->options.minDhKeySz &&
11838
0
                                            2048/8 <= ssl->options.maxDhKeySz) {
11839
0
                ret = TLSX_UseSupportedCurve(extensions,
11840
0
                                             WOLFSSL_FFDHE_2048, ssl->heap);
11841
0
                if (ret != WOLFSSL_SUCCESS)
11842
0
                    return ret;
11843
0
            }
11844
0
        #endif
11845
0
#endif
11846
11847
#ifdef HAVE_PQC
11848
#ifdef WOLFSSL_WC_KYBER
11849
#ifdef WOLFSSL_KYBER512
11850
    if (ret == WOLFSSL_SUCCESS)
11851
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1,
11852
                                     ssl->heap);
11853
#endif
11854
#ifdef WOLFSSL_KYBER768
11855
    if (ret == WOLFSSL_SUCCESS)
11856
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL3,
11857
                                     ssl->heap);
11858
#endif
11859
#ifdef WOLFSSL_KYBER768
11860
    if (ret == WOLFSSL_SUCCESS)
11861
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL5,
11862
                                     ssl->heap);
11863
#endif
11864
#elif defined(HAVE_LIBOQS)
11865
    ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1, ssl->heap);
11866
    if (ret == WOLFSSL_SUCCESS)
11867
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL3,
11868
                                     ssl->heap);
11869
    if (ret == WOLFSSL_SUCCESS)
11870
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL5,
11871
                                     ssl->heap);
11872
    if (ret == WOLFSSL_SUCCESS)
11873
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL1,
11874
                                     ssl->heap);
11875
    if (ret == WOLFSSL_SUCCESS)
11876
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_KYBER_LEVEL3,
11877
                                     ssl->heap);
11878
    if (ret == WOLFSSL_SUCCESS)
11879
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P521_KYBER_LEVEL5,
11880
                                     ssl->heap);
11881
#elif defined(HAVE_PQM4)
11882
    ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1, ssl->heap);
11883
#endif /* HAVE_LIBOQS */
11884
#endif /* HAVE_PQC */
11885
11886
0
    (void)ssl;
11887
0
    (void)extensions;
11888
11889
0
    return ret;
11890
0
}
11891
11892
#endif /* HAVE_SUPPORTED_CURVES */
11893
11894
int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
11895
0
{
11896
0
    int ret = 0;
11897
0
    byte* public_key      = NULL;
11898
0
    word16 public_key_len = 0;
11899
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
11900
    int usingPSK = 0;
11901
#endif
11902
0
#if defined(HAVE_SUPPORTED_CURVES) && defined(WOLFSSL_TLS13)
11903
0
    TLSX* extension = NULL;
11904
0
    word16 namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
11905
0
#endif
11906
11907
    /* server will add extension depending on what is parsed from client */
11908
0
    if (!isServer) {
11909
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
11910
0
        if (!ssl->options.disallowEncThenMac) {
11911
0
            ret = TLSX_EncryptThenMac_Use(ssl);
11912
0
            if (ret != 0)
11913
0
                return ret;
11914
0
        }
11915
0
#endif
11916
11917
0
#if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
11918
0
                       defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES)
11919
0
        if (!ssl->options.userCurves && !ssl->ctx->userCurves) {
11920
0
            if (TLSX_Find(ssl->ctx->extensions,
11921
0
                                               TLSX_SUPPORTED_GROUPS) == NULL) {
11922
0
                ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
11923
0
                if (ret != WOLFSSL_SUCCESS)
11924
0
                    return ret;
11925
0
            }
11926
0
        }
11927
0
        if ((!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade) &&
11928
0
               TLSX_Find(ssl->ctx->extensions, TLSX_EC_POINT_FORMATS) == NULL &&
11929
0
               TLSX_Find(ssl->extensions, TLSX_EC_POINT_FORMATS) == NULL) {
11930
0
             ret = TLSX_UsePointFormat(&ssl->extensions,
11931
0
                                         WOLFSSL_EC_PF_UNCOMPRESSED, ssl->heap);
11932
0
             if (ret != WOLFSSL_SUCCESS)
11933
0
                 return ret;
11934
0
        }
11935
0
#endif /* (HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */
11936
11937
#ifdef WOLFSSL_SRTP
11938
        if (ssl->options.dtls && ssl->dtlsSrtpProfiles != 0) {
11939
            WOLFSSL_MSG("Adding DTLS SRTP extension");
11940
            if ((ret = TLSX_UseSRTP(&ssl->extensions, ssl->dtlsSrtpProfiles,
11941
                                                                ssl->heap)) != 0) {
11942
                return ret;
11943
            }
11944
        }
11945
#endif
11946
0
    } /* is not server */
11947
11948
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
11949
0
    WOLFSSL_MSG("Adding signature algorithms extension");
11950
0
    if ((ret = TLSX_SetSignatureAlgorithms(&ssl->extensions, ssl, ssl->heap))
11951
0
                                                                         != 0) {
11952
0
            return ret;
11953
0
    }
11954
#else
11955
    ret = 0;
11956
#endif
11957
0
#ifdef WOLFSSL_TLS13
11958
0
        if (!isServer && IsAtLeastTLSv1_3(ssl->version)) {
11959
            /* Add mandatory TLS v1.3 extension: supported version */
11960
0
            WOLFSSL_MSG("Adding supported versions extension");
11961
0
            if ((ret = TLSX_SetSupportedVersions(&ssl->extensions, ssl,
11962
0
                                                             ssl->heap)) != 0) {
11963
0
                return ret;
11964
0
            }
11965
11966
    #if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && \
11967
                       !defined(HAVE_CURVE448) && defined(HAVE_SUPPORTED_CURVES)
11968
        if (TLSX_Find(ssl->ctx->extensions, TLSX_SUPPORTED_GROUPS) == NULL) {
11969
            /* Put in DH groups for TLS 1.3 only. */
11970
            ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
11971
            if (ret != WOLFSSL_SUCCESS)
11972
                return ret;
11973
        /* ret value will be overwritten in !NO_PSK case */
11974
        #ifdef NO_PSK
11975
            ret = 0;
11976
        #endif
11977
        }
11978
    #endif /* !(HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */
11979
11980
0
        #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
11981
0
            if (ssl->certHashSigAlgoSz > 0) {
11982
0
                WOLFSSL_MSG("Adding signature algorithms cert extension");
11983
0
                if ((ret = TLSX_SetSignatureAlgorithmsCert(&ssl->extensions,
11984
0
                                                        ssl, ssl->heap)) != 0) {
11985
0
                    return ret;
11986
0
                }
11987
0
            }
11988
0
        #endif
11989
11990
0
        #if defined(HAVE_SUPPORTED_CURVES)
11991
0
            extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
11992
0
            if (extension == NULL) {
11993
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
11994
                if (ssl->options.resuming && ssl->session->namedGroup != 0)
11995
                    namedGroup = ssl->session->namedGroup;
11996
                else
11997
            #endif
11998
0
                if (ssl->numGroups > 0) {
11999
0
                    int set = 0;
12000
0
                    int i, j;
12001
12002
                    /* try to find the highest element in ssl->group[]
12003
                     * that is contained in preferredGroup[].
12004
                     */
12005
0
                    namedGroup = preferredGroup[0];
12006
0
                    for (i = 0; i < ssl->numGroups && !set; i++) {
12007
0
                        for (j = 0; preferredGroup[j] != WOLFSSL_NAMED_GROUP_INVALID; j++) {
12008
0
                            if (preferredGroup[j] == ssl->group[i]
12009
#ifdef HAVE_LIBOQS
12010
                                && TLSX_KeyShare_IsSupported(preferredGroup[j])
12011
#endif
12012
0
                                                                ) {
12013
0
                                namedGroup = ssl->group[i];
12014
0
                                set = 1;
12015
0
                                break;
12016
0
                            }
12017
0
                        }
12018
0
                    }
12019
0
                    if (!set)
12020
0
                        namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
12021
0
                }
12022
0
                else {
12023
                    /* Choose the most preferred group. */
12024
0
                    namedGroup = preferredGroup[0];
12025
#ifdef HAVE_LIBOQS
12026
                    if (!TLSX_KeyShare_IsSupported(namedGroup)) {
12027
                        int i = 1;
12028
                        for (;preferredGroup[i] != WOLFSSL_NAMED_GROUP_INVALID;
12029
                              i++) {
12030
                            if (TLSX_KeyShare_IsSupported(preferredGroup[i]))
12031
                                break;
12032
                        }
12033
                        namedGroup = preferredGroup[i];
12034
                    }
12035
#endif
12036
0
                }
12037
0
            }
12038
0
            else {
12039
0
                KeyShareEntry* kse = (KeyShareEntry*)extension->data;
12040
0
                if (kse)
12041
0
                    namedGroup = kse->group;
12042
0
            }
12043
0
            if (namedGroup != WOLFSSL_NAMED_GROUP_INVALID) {
12044
#ifdef HAVE_PQC
12045
                /* For KEMs, the key share has already been generated, but not
12046
                 * if we are resuming. */
12047
                if (!WOLFSSL_NAMED_GROUP_IS_PQC(namedGroup)
12048
#ifdef HAVE_SESSION_TICKET
12049
                    || ssl->options.resuming
12050
#endif /* HAVE_SESSION_TICKET */
12051
                   )
12052
#endif /* HAVE_PQC */
12053
0
                {
12054
0
                    ret = TLSX_KeyShare_Use(ssl, namedGroup, 0, NULL, NULL,
12055
0
                            &ssl->extensions);
12056
0
                }
12057
0
                if (ret != 0)
12058
0
                    return ret;
12059
0
            }
12060
0
        #endif /* HAVE_SUPPORTED_CURVES */
12061
12062
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12063
            TLSX_Remove(&ssl->extensions, TLSX_PRE_SHARED_KEY, ssl->heap);
12064
        #endif
12065
        #if defined(HAVE_SESSION_TICKET)
12066
            if (ssl->options.resuming && ssl->session->ticketLen > 0) {
12067
                WOLFSSL_SESSION* sess = ssl->session;
12068
            #ifdef WOLFSSL_32BIT_MILLI_TIME
12069
                word32 now, milli;
12070
            #else
12071
                word64 now, milli;
12072
            #endif
12073
12074
                if (sess->ticketLen > MAX_PSK_ID_LEN) {
12075
                    WOLFSSL_MSG("Session ticket length for PSK ext is too large");
12076
                    return BUFFER_ERROR;
12077
                }
12078
12079
                /* Determine the MAC algorithm for the cipher suite used. */
12080
                ssl->options.cipherSuite0 = sess->cipherSuite0;
12081
                ssl->options.cipherSuite  = sess->cipherSuite;
12082
                ret = SetCipherSpecs(ssl);
12083
                if (ret != 0)
12084
                    return ret;
12085
                now = TimeNowInMilliseconds();
12086
                if (now == 0)
12087
                    return GETTIME_ERROR;
12088
            #ifdef WOLFSSL_32BIT_MILLI_TIME
12089
                if (now < sess->ticketSeen)
12090
                    milli = (0xFFFFFFFFU - sess->ticketSeen) + 1 + now;
12091
                else
12092
                    milli = now - sess->ticketSeen;
12093
                milli += sess->ticketAdd;
12094
12095
                /* Pre-shared key is mandatory extension for resumption. */
12096
                ret = TLSX_PreSharedKey_Use(&ssl->extensions, sess->ticket,
12097
                    sess->ticketLen, milli, ssl->specs.mac_algorithm,
12098
                    ssl->options.cipherSuite0, ssl->options.cipherSuite, 1,
12099
                    NULL, ssl->heap);
12100
            #else
12101
                milli = now - sess->ticketSeen + sess->ticketAdd;
12102
12103
                /* Pre-shared key is mandatory extension for resumption. */
12104
                ret = TLSX_PreSharedKey_Use(&ssl->extensions, sess->ticket,
12105
                    sess->ticketLen, (word32)milli, ssl->specs.mac_algorithm,
12106
                    ssl->options.cipherSuite0, ssl->options.cipherSuite, 1,
12107
                    NULL, ssl->heap);
12108
            #endif
12109
                if (ret != 0)
12110
                    return ret;
12111
12112
                usingPSK = 1;
12113
            }
12114
        #endif
12115
    #ifndef NO_PSK
12116
        #ifndef WOLFSSL_PSK_ONE_ID
12117
            if (ssl->options.client_psk_cs_cb != NULL) {
12118
                int i;
12119
                const Suites* suites = WOLFSSL_SUITES(ssl);
12120
                for (i = 0; i < suites->suiteSz; i += 2) {
12121
                    byte cipherSuite0 = suites->suites[i + 0];
12122
                    byte cipherSuite = suites->suites[i + 1];
12123
                    unsigned int keySz;
12124
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
12125
                    int cnt = 0;
12126
                #endif
12127
12128
                #ifdef HAVE_NULL_CIPHER
12129
                    if (cipherSuite0 == ECC_BYTE ||
12130
                        cipherSuite0 == ECDHE_PSK_BYTE) {
12131
                        if (cipherSuite != TLS_SHA256_SHA256 &&
12132
                                             cipherSuite != TLS_SHA384_SHA384) {
12133
                            continue;
12134
                        }
12135
                    }
12136
                    else
12137
                #endif
12138
                    if (cipherSuite0 != TLS13_BYTE)
12139
                        continue;
12140
12141
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
12142
                    do {
12143
                        ssl->arrays->client_identity[0] = cnt;
12144
                #endif
12145
12146
                        ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
12147
                        keySz = ssl->options.client_psk_cs_cb(
12148
                            ssl, ssl->arrays->server_hint,
12149
                            ssl->arrays->client_identity, MAX_PSK_ID_LEN,
12150
                            ssl->arrays->psk_key, MAX_PSK_KEY_LEN,
12151
                            GetCipherNameInternal(cipherSuite0, cipherSuite));
12152
                        if (keySz > 0) {
12153
                            ssl->arrays->psk_keySz = keySz;
12154
                            ret = TLSX_PreSharedKey_Use(&ssl->extensions,
12155
                                (byte*)ssl->arrays->client_identity,
12156
                                (word16)XSTRLEN(ssl->arrays->client_identity),
12157
                                0, SuiteMac(WOLFSSL_SUITES(ssl)->suites + i),
12158
                                cipherSuite0, cipherSuite, 0, NULL, ssl->heap);
12159
                            if (ret != 0)
12160
                                return ret;
12161
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
12162
                            cnt++;
12163
                #endif
12164
                        }
12165
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
12166
                    }
12167
                    while (keySz > 0);
12168
                #endif
12169
                }
12170
12171
                usingPSK = 1;
12172
            }
12173
            else
12174
        #endif
12175
            if (ssl->options.client_psk_cb != NULL ||
12176
                                     ssl->options.client_psk_tls13_cb != NULL) {
12177
                /* Default ciphersuite. */
12178
                byte cipherSuite0 = TLS13_BYTE;
12179
                byte cipherSuite = WOLFSSL_DEF_PSK_CIPHER;
12180
                int cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE;
12181
                const char* cipherName = NULL;
12182
12183
                if (ssl->options.client_psk_tls13_cb != NULL) {
12184
                    ssl->arrays->psk_keySz = ssl->options.client_psk_tls13_cb(
12185
                        ssl, ssl->arrays->server_hint,
12186
                        ssl->arrays->client_identity, MAX_PSK_ID_LEN,
12187
                        ssl->arrays->psk_key, MAX_PSK_KEY_LEN, &cipherName);
12188
                    if (GetCipherSuiteFromName(cipherName, &cipherSuite0,
12189
                                        &cipherSuite, &cipherSuiteFlags) != 0) {
12190
                        return PSK_KEY_ERROR;
12191
                    }
12192
                }
12193
                else {
12194
                    ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
12195
                        ssl->arrays->server_hint, ssl->arrays->client_identity,
12196
                        MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
12197
                }
12198
        #if defined(OPENSSL_EXTRA)
12199
                /* OpenSSL treats 0 as a PSK key length of 0
12200
                 * and meaning no PSK available.
12201
                 */
12202
                if (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
12203
                    return PSK_KEY_ERROR;
12204
                }
12205
                if (ssl->arrays->psk_keySz > 0) {
12206
        #else
12207
                if (ssl->arrays->psk_keySz == 0 ||
12208
                                     ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
12209
                    return PSK_KEY_ERROR;
12210
                }
12211
        #endif
12212
                ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
12213
12214
                ssl->options.cipherSuite0 = cipherSuite0;
12215
                ssl->options.cipherSuite  = cipherSuite;
12216
                (void)cipherSuiteFlags;
12217
                ret = SetCipherSpecs(ssl);
12218
                if (ret != 0)
12219
                    return ret;
12220
12221
                ret = TLSX_PreSharedKey_Use(&ssl->extensions,
12222
                                  (byte*)ssl->arrays->client_identity,
12223
                                  (word16)XSTRLEN(ssl->arrays->client_identity),
12224
                                  0, ssl->specs.mac_algorithm,
12225
                                  cipherSuite0, cipherSuite, 0,
12226
                                  NULL, ssl->heap);
12227
                if (ret != 0)
12228
                    return ret;
12229
12230
                usingPSK = 1;
12231
        #if defined(OPENSSL_EXTRA)
12232
                }
12233
        #endif
12234
            }
12235
    #endif /* !NO_PSK */
12236
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12237
12238
            /* Some servers do not generate session tickets unless
12239
             * the extension is seen in a non-resume client hello.
12240
             * We used to send it only if we were otherwise using PSK.
12241
             * Now always send it. Define NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
12242
             * to revert to the old behaviour. */
12243
            #ifdef NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
12244
            if (usingPSK)
12245
            #endif
12246
            {
12247
                byte modes = 0;
12248
12249
                (void)usingPSK;
12250
                /* Pre-shared key modes: mandatory extension for resumption. */
12251
            #ifdef HAVE_SUPPORTED_CURVES
12252
                if (!ssl->options.onlyPskDheKe)
12253
            #endif
12254
                {
12255
                    modes = 1 << PSK_KE;
12256
                }
12257
            #if !defined(NO_DH) || defined(HAVE_ECC) || \
12258
                              defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
12259
                if (!ssl->options.noPskDheKe) {
12260
                    modes |= 1 << PSK_DHE_KE;
12261
                }
12262
            #endif
12263
                ret = TLSX_PskKeyModes_Use(ssl, modes);
12264
                if (ret != 0)
12265
                    return ret;
12266
            }
12267
        #endif
12268
        #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
12269
            if (!isServer && ssl->options.postHandshakeAuth) {
12270
                ret = TLSX_PostHandAuth_Use(ssl);
12271
                if (ret != 0)
12272
                    return ret;
12273
            }
12274
        #endif
12275
#if defined(HAVE_ECH)
12276
            /* GREASE ECH */
12277
            if (ssl->echConfigs == NULL) {
12278
                ret = GREASE_ECH_USE(&(ssl->extensions), ssl->heap, ssl->rng);
12279
            }
12280
            else if (ssl->echConfigs != NULL) {
12281
                ret = ECH_USE(ssl->echConfigs, &(ssl->extensions), ssl->heap,
12282
                    ssl->rng);
12283
            }
12284
#endif
12285
0
        }
12286
#if defined(HAVE_ECH)
12287
        else if (IsAtLeastTLSv1_3(ssl->version)) {
12288
            if (ssl->ctx->echConfigs != NULL) {
12289
                ret = SERVER_ECH_USE(&(ssl->extensions), ssl->heap,
12290
                    ssl->ctx->echConfigs);
12291
12292
                if (ret == 0)
12293
                    TLSX_SetResponse(ssl, TLSX_ECH);
12294
            }
12295
        }
12296
#endif
12297
12298
0
#endif
12299
12300
0
    (void)isServer;
12301
0
    (void)public_key;
12302
0
    (void)public_key_len;
12303
0
    (void)ssl;
12304
12305
0
    return ret;
12306
0
}
12307
12308
12309
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
12310
12311
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
12312
/* because the size of ech depends on the size of other extensions we need to
12313
 * get the size with ech special and process ech last, return status */
12314
static int TLSX_GetSizeWithEch(WOLFSSL* ssl, byte* semaphore, byte msgType,
12315
    word16* pLength)
12316
{
12317
    int ret = 0;
12318
    TLSX* echX = NULL;
12319
    TLSX* serverNameX = NULL;
12320
    TLSX** extensions = NULL;
12321
#ifdef WOLFSSL_SMALL_STACK
12322
    char* tmpServerName = NULL;
12323
#else
12324
    char tmpServerName[MAX_PUBLIC_NAME_SZ];
12325
#endif
12326
12327
    /* calculate the rest of the extensions length with inner ech */
12328
    if (ssl->extensions)
12329
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
12330
12331
    if (echX == NULL && ssl->ctx && ssl->ctx->extensions)
12332
        echX = TLSX_Find(ssl->ctx->extensions, TLSX_ECH);
12333
12334
    /* if type is outer change sni to public name */
12335
    if (echX != NULL && ((WOLFSSL_ECH*)echX->data)->type == ECH_TYPE_OUTER) {
12336
        if (ssl->extensions) {
12337
            serverNameX = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
12338
12339
            if (serverNameX != NULL)
12340
                extensions = &ssl->extensions;
12341
        }
12342
12343
        if (serverNameX == NULL && ssl->ctx && ssl->ctx->extensions) {
12344
            serverNameX = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
12345
            extensions = &ssl->ctx->extensions;
12346
        }
12347
12348
        /* store the inner server name */
12349
        if (serverNameX != NULL) {
12350
            char* hostName = ((SNI*)serverNameX->data)->data.host_name;
12351
            word32 hostNameSz = (word32)XSTRLEN(hostName) + 1;
12352
12353
        #ifdef WOLFSSL_SMALL_STACK
12354
            tmpServerName = (char*)XMALLOC(hostNameSz, ssl->heap,
12355
                DYNAMIC_TYPE_TMP_BUFFER);
12356
            if (tmpServerName == NULL)
12357
                return MEMORY_E;
12358
        #else
12359
            /* truncate if too long */
12360
            if (hostNameSz > MAX_PUBLIC_NAME_SZ)
12361
                hostNameSz = MAX_PUBLIC_NAME_SZ;
12362
        #endif
12363
12364
            XMEMCPY(tmpServerName, hostName, hostNameSz);
12365
        }
12366
12367
        /* remove the inner server name */
12368
        TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
12369
12370
        ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME,
12371
            ((WOLFSSL_ECH*)echX->data)->echConfig->publicName,
12372
            XSTRLEN(((WOLFSSL_ECH*)echX->data)->echConfig->publicName),
12373
            ssl->heap);
12374
12375
        /* set the public name as the server name */
12376
        if (ret == WOLFSSL_SUCCESS)
12377
            ret = 0;
12378
    }
12379
12380
    if (ret == 0 && ssl->extensions)
12381
        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, pLength);
12382
12383
    if (ret == 0 && ssl->ctx && ssl->ctx->extensions)
12384
        ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType, pLength);
12385
12386
    if (serverNameX != NULL) {
12387
        /* remove the public name SNI */
12388
        TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
12389
12390
        ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME,
12391
            tmpServerName, XSTRLEN(tmpServerName), ssl->heap);
12392
12393
        /* restore the inner server name */
12394
        if (ret == WOLFSSL_SUCCESS)
12395
            ret = 0;
12396
    }
12397
12398
#ifdef WOLFSSL_SMALL_STACK
12399
    XFREE(tmpServerName, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
12400
#endif
12401
12402
    return ret;
12403
}
12404
#endif
12405
12406
/** Tells the buffered size of extensions to be sent into the client hello. */
12407
int TLSX_GetRequestSize(WOLFSSL* ssl, byte msgType, word16* pLength)
12408
0
{
12409
0
    int ret = 0;
12410
0
    word16 length = 0;
12411
0
    byte semaphore[SEMAPHORE_SIZE] = {0};
12412
12413
0
    if (!TLSX_SupportExtensions(ssl))
12414
0
        return 0;
12415
0
    if (msgType == client_hello) {
12416
0
        EC_VALIDATE_REQUEST(ssl, semaphore);
12417
0
        PF_VALIDATE_REQUEST(ssl, semaphore);
12418
0
        WOLF_STK_VALIDATE_REQUEST(ssl);
12419
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
12420
0
        if (WOLFSSL_SUITES(ssl)->hashSigAlgoSz == 0)
12421
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
12422
0
#endif
12423
0
#if defined(WOLFSSL_TLS13)
12424
0
        if (!IsAtLeastTLSv1_2(ssl))
12425
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
12426
0
    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
12427
0
        if (!IsAtLeastTLSv1_3(ssl->version)) {
12428
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
12429
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12430
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
12431
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
12432
        #endif
12433
        #ifdef WOLFSSL_EARLY_DATA
12434
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
12435
        #endif
12436
        #ifdef WOLFSSL_SEND_HRR_COOKIE
12437
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
12438
        #endif
12439
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
12440
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
12441
        #endif
12442
0
        }
12443
0
    #endif
12444
0
#endif /* WOLFSSL_TLS13 */
12445
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
12446
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
12447
        if (!SSL_CM(ssl)->ocspStaplingEnabled) {
12448
            /* mark already sent, so it won't send it */
12449
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
12450
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
12451
        }
12452
    #endif
12453
0
    }
12454
12455
0
#ifdef WOLFSSL_TLS13
12456
0
    #ifndef NO_CERTS
12457
0
    else if (msgType == certificate_request) {
12458
        /* Don't send out any extension except those that are turned off. */
12459
0
        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
12460
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
12461
0
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
12462
0
#endif
12463
        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
12464
         *       TLSX_CERTIFICATE_AUTHORITIES, OID_FILTERS
12465
         *       TLSX_STATUS_REQUEST
12466
         */
12467
0
    }
12468
0
    #endif
12469
#if defined(HAVE_ECH)
12470
    if (ssl->options.useEch == 1 && msgType == client_hello) {
12471
        ret = TLSX_GetSizeWithEch(ssl, semaphore, msgType, &length);
12472
        if (ret != 0)
12473
            return ret;
12474
    }
12475
    else
12476
#endif /* HAVE_ECH */
12477
0
#endif /* WOLFSSL_TLS13 */
12478
0
    {
12479
0
        if (ssl->extensions) {
12480
0
            ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
12481
0
            if (ret != 0)
12482
0
                return ret;
12483
0
        }
12484
0
        if (ssl->ctx && ssl->ctx->extensions) {
12485
0
            ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType,
12486
0
                &length);
12487
0
            if (ret != 0)
12488
0
                return ret;
12489
0
        }
12490
0
    }
12491
12492
0
#ifdef HAVE_EXTENDED_MASTER
12493
0
    if (msgType == client_hello && ssl->options.haveEMS &&
12494
0
                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
12495
0
        length += HELLO_EXT_SZ;
12496
0
    }
12497
0
#endif
12498
12499
0
    if (length)
12500
0
        length += OPAQUE16_LEN; /* for total length storage. */
12501
12502
0
    *pLength += length;
12503
12504
0
    return ret;
12505
0
}
12506
12507
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
12508
/* return status after writing the extensions with ech written last */
12509
static int TLSX_WriteWithEch(WOLFSSL* ssl, byte* output, byte* semaphore,
12510
    byte msgType, word16* pOffset)
12511
{
12512
    int ret = 0;
12513
    TLSX* echX = NULL;
12514
    TLSX* serverNameX = NULL;
12515
    TLSX** extensions = NULL;
12516
#ifdef WOLFSSL_SMALL_STACK
12517
    char* tmpServerName = NULL;
12518
#else
12519
    char tmpServerName[MAX_PUBLIC_NAME_SZ];
12520
#endif
12521
12522
    /* get the echX from either extensions or ctx */
12523
    if (ssl->extensions)
12524
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
12525
12526
    if (echX == NULL && ssl->ctx && ssl->ctx->extensions) {
12527
        /* if not NULL the semaphore will stop it from being counted */
12528
        if (echX == NULL)
12529
            echX = TLSX_Find(ssl->ctx->extensions, TLSX_ECH);
12530
    }
12531
12532
    /* if type is outer change sni to public name */
12533
    if (echX != NULL && ((WOLFSSL_ECH*)echX->data)->type == ECH_TYPE_OUTER) {
12534
        if (ssl->extensions) {
12535
            serverNameX = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
12536
12537
            if (serverNameX != NULL)
12538
                extensions = &ssl->extensions;
12539
        }
12540
12541
        if (serverNameX == NULL && ssl->ctx && ssl->ctx->extensions) {
12542
            serverNameX = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
12543
            extensions = &ssl->ctx->extensions;
12544
        }
12545
12546
        /* store the inner server name */
12547
        if (serverNameX != NULL) {
12548
            char* hostName = ((SNI*)serverNameX->data)->data.host_name;
12549
            word32 hostNameSz = (word32)XSTRLEN(hostName) + 1;
12550
12551
        #ifdef WOLFSSL_SMALL_STACK
12552
            tmpServerName = (char*)XMALLOC(hostNameSz, ssl->heap,
12553
                DYNAMIC_TYPE_TMP_BUFFER);
12554
            if (tmpServerName == NULL)
12555
                return MEMORY_E;
12556
        #else
12557
            /* truncate if too long */
12558
            if (hostNameSz > MAX_PUBLIC_NAME_SZ)
12559
                hostNameSz = MAX_PUBLIC_NAME_SZ;
12560
        #endif
12561
12562
            XMEMCPY(tmpServerName, hostName, hostNameSz);
12563
        }
12564
12565
        /* remove the inner server name */
12566
        TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
12567
12568
        ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME,
12569
            ((WOLFSSL_ECH*)echX->data)->echConfig->publicName,
12570
            XSTRLEN(((WOLFSSL_ECH*)echX->data)->echConfig->publicName),
12571
            ssl->heap);
12572
12573
        /* set the public name as the server name */
12574
        if (ret == WOLFSSL_SUCCESS)
12575
            ret = 0;
12576
    }
12577
12578
    if (echX != NULL) {
12579
        /* turn ech on so it doesn't write, then write it last */
12580
        TURN_ON(semaphore, TLSX_ToSemaphore(echX->type));
12581
    }
12582
12583
    if (ret == 0 && ssl->extensions) {
12584
        ret = TLSX_Write(ssl->extensions, output + *pOffset, semaphore,
12585
            msgType, pOffset);
12586
    }
12587
12588
    if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
12589
        ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset, semaphore,
12590
            msgType, pOffset);
12591
    }
12592
12593
    if (echX != NULL) {
12594
        /* turn off and write it last */
12595
        TURN_OFF(semaphore, TLSX_ToSemaphore(echX->type));
12596
    }
12597
12598
    if (ret == 0 && ssl->extensions) {
12599
        ret = TLSX_Write(ssl->extensions, output + *pOffset, semaphore,
12600
            msgType, pOffset);
12601
    }
12602
12603
    if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
12604
        ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset, semaphore,
12605
            msgType, pOffset);
12606
    }
12607
12608
    if (serverNameX != NULL) {
12609
        /* remove the public name SNI */
12610
        TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
12611
12612
        ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME, tmpServerName,
12613
            XSTRLEN(tmpServerName), ssl->heap);
12614
12615
        /* restore the inner server name */
12616
        if (ret == WOLFSSL_SUCCESS)
12617
            ret = 0;
12618
    }
12619
12620
#ifdef WOLFSSL_SMALL_STACK
12621
    XFREE(tmpServerName, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
12622
#endif
12623
12624
    return ret;
12625
}
12626
#endif
12627
12628
/** Writes the extensions to be sent into the client hello. */
12629
int TLSX_WriteRequest(WOLFSSL* ssl, byte* output, byte msgType, word16* pOffset)
12630
0
{
12631
0
    int ret = 0;
12632
0
    word16 offset = 0;
12633
0
    byte semaphore[SEMAPHORE_SIZE] = {0};
12634
12635
0
    if (!TLSX_SupportExtensions(ssl) || output == NULL)
12636
0
        return 0;
12637
12638
0
    offset += OPAQUE16_LEN; /* extensions length */
12639
12640
0
    if (msgType == client_hello) {
12641
0
        EC_VALIDATE_REQUEST(ssl, semaphore);
12642
0
        PF_VALIDATE_REQUEST(ssl, semaphore);
12643
0
        WOLF_STK_VALIDATE_REQUEST(ssl);
12644
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
12645
0
        if (WOLFSSL_SUITES(ssl)->hashSigAlgoSz == 0)
12646
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
12647
0
#endif
12648
0
#ifdef WOLFSSL_TLS13
12649
0
        if (!IsAtLeastTLSv1_2(ssl)) {
12650
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
12651
0
        }
12652
0
    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
12653
0
        if (!IsAtLeastTLSv1_3(ssl->version)) {
12654
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
12655
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12656
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
12657
        #endif
12658
        #ifdef WOLFSSL_EARLY_DATA
12659
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
12660
        #endif
12661
        #ifdef WOLFSSL_SEND_HRR_COOKIE
12662
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
12663
        #endif
12664
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
12665
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
12666
        #endif
12667
0
        }
12668
0
    #endif
12669
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12670
        /* Must write Pre-shared Key extension at the end in TLS v1.3.
12671
         * Must not write out Pre-shared Key extension in earlier versions of
12672
         * protocol.
12673
         */
12674
        TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
12675
    #endif
12676
0
#endif /* WOLFSSL_TLS13 */
12677
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
12678
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
12679
         /* mark already sent, so it won't send it */
12680
        if (!SSL_CM(ssl)->ocspStaplingEnabled) {
12681
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
12682
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
12683
        }
12684
    #endif
12685
0
    }
12686
0
#ifdef WOLFSSL_TLS13
12687
0
    #ifndef NO_CERTS
12688
0
    else if (msgType == certificate_request) {
12689
        /* Don't send out any extension except those that are turned off. */
12690
0
        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
12691
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
12692
0
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
12693
0
#endif
12694
        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
12695
         *       TLSX_CERTIFICATE_AUTHORITIES, TLSX_OID_FILTERS
12696
         *       TLSX_STATUS_REQUEST
12697
         */
12698
0
    }
12699
0
    #endif
12700
0
#endif
12701
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
12702
    if (ssl->options.useEch == 1 && msgType == client_hello) {
12703
        ret = TLSX_WriteWithEch(ssl, output, semaphore,
12704
                         msgType, &offset);
12705
        if (ret != 0)
12706
            return ret;
12707
    }
12708
    else
12709
#endif
12710
0
    {
12711
0
        if (ssl->extensions) {
12712
0
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
12713
0
                             msgType, &offset);
12714
0
            if (ret != 0)
12715
0
                return ret;
12716
0
        }
12717
0
        if (ssl->ctx && ssl->ctx->extensions) {
12718
0
            ret = TLSX_Write(ssl->ctx->extensions, output + offset, semaphore,
12719
0
                             msgType, &offset);
12720
0
            if (ret != 0)
12721
0
                return ret;
12722
0
        }
12723
0
    }
12724
12725
0
#ifdef HAVE_EXTENDED_MASTER
12726
0
    if (msgType == client_hello && ssl->options.haveEMS &&
12727
0
                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
12728
0
        WOLFSSL_MSG("EMS extension to write");
12729
0
        c16toa(HELLO_EXT_EXTMS, output + offset);
12730
0
        offset += HELLO_EXT_TYPE_SZ;
12731
0
        c16toa(0, output + offset);
12732
0
        offset += HELLO_EXT_SZ_SZ;
12733
0
    }
12734
0
#endif
12735
12736
0
#ifdef WOLFSSL_TLS13
12737
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12738
    if (msgType == client_hello && IsAtLeastTLSv1_3(ssl->version)) {
12739
        /* Write out what we can of Pre-shared key extension.  */
12740
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
12741
        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
12742
                         client_hello, &offset);
12743
        if (ret != 0)
12744
            return ret;
12745
    }
12746
    #endif
12747
0
#endif
12748
12749
0
    if (offset > OPAQUE16_LEN || msgType != client_hello)
12750
0
        c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
12751
12752
0
     *pOffset += offset;
12753
12754
0
    return ret;
12755
0
}
12756
12757
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
12758
12759
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_SERVER)
12760
12761
/** Tells the buffered size of extensions to be sent into the server hello. */
12762
int TLSX_GetResponseSize(WOLFSSL* ssl, byte msgType, word16* pLength)
12763
0
{
12764
0
    int ret = 0;
12765
0
    word16 length = 0;
12766
0
    byte semaphore[SEMAPHORE_SIZE] = {0};
12767
12768
0
    switch (msgType) {
12769
0
#ifndef NO_WOLFSSL_SERVER
12770
0
        case server_hello:
12771
0
            PF_VALIDATE_RESPONSE(ssl, semaphore);
12772
0
        #ifdef WOLFSSL_TLS13
12773
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
12774
0
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
12775
0
                    TURN_OFF(semaphore,
12776
0
                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
12777
0
                #if defined(HAVE_SUPPORTED_CURVES)
12778
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12779
                    if (!ssl->options.noPskDheKe)
12780
                #endif
12781
0
                    {
12782
                        /* Expect KeyShare extension in ServerHello. */
12783
0
                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
12784
0
                    }
12785
0
                #endif
12786
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12787
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
12788
                #endif
12789
                #ifdef WOLFSSL_DTLS_CID
12790
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
12791
                #endif
12792
0
                }
12793
0
            #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
12794
0
                else {
12795
0
                #ifdef HAVE_SUPPORTED_CURVES
12796
0
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
12797
0
                #endif
12798
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12799
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
12800
                #endif
12801
0
                }
12802
0
            #endif
12803
0
        #endif /* WOLFSSL_TLS13 */
12804
0
            break;
12805
12806
0
    #ifdef WOLFSSL_TLS13
12807
0
        case hello_retry_request:
12808
0
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
12809
0
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
12810
0
        #ifdef HAVE_SUPPORTED_CURVES
12811
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12812
            if (!ssl->options.noPskDheKe)
12813
        #endif
12814
0
            {
12815
                /* Expect KeyShare extension in HelloRetryRequest. */
12816
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
12817
0
            }
12818
0
        #endif
12819
        #ifdef WOLFSSL_SEND_HRR_COOKIE
12820
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
12821
        #endif
12822
0
            break;
12823
0
    #endif
12824
12825
0
    #ifdef WOLFSSL_TLS13
12826
0
        case encrypted_extensions:
12827
            /* Send out all extension except those that are turned on. */
12828
0
        #ifdef HAVE_ECC
12829
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
12830
0
        #endif
12831
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
12832
        #ifdef HAVE_SESSION_TICKET
12833
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
12834
        #endif
12835
0
        #ifdef HAVE_SUPPORTED_CURVES
12836
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
12837
0
        #endif
12838
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12839
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
12840
        #endif
12841
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
12842
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
12843
        #endif
12844
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
12845
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
12846
        #endif
12847
0
        #if defined(HAVE_SERVER_RENEGOTIATION_INFO)
12848
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
12849
0
        #endif
12850
        #ifdef WOLFSSL_DTLS_CID
12851
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
12852
        #endif /* WOLFSSL_DTLS_CID */
12853
0
            break;
12854
12855
        #ifdef WOLFSSL_EARLY_DATA
12856
        case session_ticket:
12857
            if (ssl->options.tls1_3) {
12858
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
12859
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
12860
            }
12861
            break;
12862
        #endif
12863
0
    #endif
12864
0
#endif
12865
12866
0
#ifdef WOLFSSL_TLS13
12867
0
    #ifndef NO_CERTS
12868
0
        case certificate:
12869
            /* Don't send out any extension except those that are turned off. */
12870
0
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
12871
0
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
12872
            /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
12873
             *       TLSX_SERVER_CERTIFICATE_TYPE
12874
             */
12875
0
            break;
12876
0
    #endif
12877
0
#endif
12878
0
    }
12879
12880
0
#ifdef HAVE_EXTENDED_MASTER
12881
0
    if (ssl->options.haveEMS && msgType == server_hello &&
12882
0
                                              !IsAtLeastTLSv1_3(ssl->version)) {
12883
0
        length += HELLO_EXT_SZ;
12884
0
    }
12885
0
#endif
12886
12887
0
    if (TLSX_SupportExtensions(ssl)) {
12888
0
        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
12889
0
        if (ret != 0)
12890
0
            return ret;
12891
0
    }
12892
12893
    /* All the response data is set at the ssl object only, so no ctx here. */
12894
12895
0
    if (length || msgType != server_hello)
12896
0
        length += OPAQUE16_LEN; /* for total length storage. */
12897
12898
0
    *pLength += length;
12899
12900
0
    return ret;
12901
0
}
12902
12903
/** Writes the server hello extensions into a buffer. */
12904
int TLSX_WriteResponse(WOLFSSL *ssl, byte* output, byte msgType, word16* pOffset)
12905
0
{
12906
0
    int ret = 0;
12907
0
    word16 offset = 0;
12908
12909
0
    if (TLSX_SupportExtensions(ssl) && output) {
12910
0
        byte semaphore[SEMAPHORE_SIZE] = {0};
12911
12912
0
        switch (msgType) {
12913
0
#ifndef NO_WOLFSSL_SERVER
12914
0
            case server_hello:
12915
0
                PF_VALIDATE_RESPONSE(ssl, semaphore);
12916
0
    #ifdef WOLFSSL_TLS13
12917
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
12918
0
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
12919
0
                    TURN_OFF(semaphore,
12920
0
                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
12921
0
            #ifdef HAVE_SUPPORTED_CURVES
12922
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12923
                    if (!ssl->options.noPskDheKe)
12924
                #endif
12925
0
                    {
12926
                        /* Write out KeyShare in ServerHello. */
12927
0
                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
12928
0
                    }
12929
0
            #endif
12930
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12931
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
12932
            #endif
12933
            #ifdef WOLFSSL_DTLS_CID
12934
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
12935
            #endif /* WOLFSSL_DTLS_CID */
12936
0
                }
12937
0
        #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
12938
0
                else {
12939
0
            #ifdef HAVE_SUPPORTED_CURVES
12940
0
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
12941
0
            #endif
12942
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12943
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
12944
            #endif
12945
0
                }
12946
0
        #endif
12947
0
    #endif
12948
0
                break;
12949
12950
0
    #ifdef WOLFSSL_TLS13
12951
0
            case hello_retry_request:
12952
0
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
12953
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
12954
0
        #ifdef HAVE_SUPPORTED_CURVES
12955
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12956
                if (!ssl->options.noPskDheKe)
12957
            #endif
12958
0
                {
12959
                    /* Write out KeyShare in HelloRetryRequest. */
12960
0
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
12961
0
                }
12962
0
        #endif
12963
                /* Cookie is written below as last extension. */
12964
0
                break;
12965
0
    #endif
12966
12967
0
    #ifdef WOLFSSL_TLS13
12968
0
            case encrypted_extensions:
12969
                /* Send out all extension except those that are turned on. */
12970
0
        #ifdef HAVE_ECC
12971
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
12972
0
        #endif
12973
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
12974
        #ifdef HAVE_SESSION_TICKET
12975
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
12976
        #endif
12977
0
        #ifdef HAVE_SUPPORTED_CURVES
12978
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
12979
0
        #endif
12980
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12981
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
12982
        #endif
12983
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
12984
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
12985
        #endif
12986
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
12987
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
12988
        #endif
12989
0
        #if defined(HAVE_SERVER_RENEGOTIATION_INFO)
12990
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
12991
0
        #endif
12992
        #ifdef WOLFSSL_DTLS_CID
12993
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
12994
        #endif /* WOLFSSL_DTLS_CID */
12995
0
                break;
12996
12997
        #ifdef WOLFSSL_EARLY_DATA
12998
            case session_ticket:
12999
                if (ssl->options.tls1_3) {
13000
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
13001
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
13002
                }
13003
                break;
13004
        #endif
13005
0
    #endif
13006
0
#endif
13007
13008
0
    #ifdef WOLFSSL_TLS13
13009
0
        #ifndef NO_CERTS
13010
0
            case certificate:
13011
                /* Don't send out any extension except those that are turned
13012
                 * off. */
13013
0
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
13014
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
13015
                /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
13016
                 *       TLSX_SERVER_CERTIFICATE_TYPE
13017
                 */
13018
0
                break;
13019
0
        #endif
13020
0
    #endif
13021
13022
0
            default:
13023
0
                break;
13024
0
        }
13025
13026
0
        offset += OPAQUE16_LEN; /* extensions length */
13027
13028
0
        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
13029
0
                         msgType, &offset);
13030
0
        if (ret != 0)
13031
0
            return ret;
13032
13033
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
13034
        if (msgType == hello_retry_request) {
13035
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
13036
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
13037
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
13038
                             msgType, &offset);
13039
            if (ret != 0)
13040
                return ret;
13041
        }
13042
#endif
13043
13044
0
#ifdef HAVE_EXTENDED_MASTER
13045
0
        if (ssl->options.haveEMS && msgType == server_hello &&
13046
0
                                              !IsAtLeastTLSv1_3(ssl->version)) {
13047
0
            WOLFSSL_MSG("EMS extension to write");
13048
0
            c16toa(HELLO_EXT_EXTMS, output + offset);
13049
0
            offset += HELLO_EXT_TYPE_SZ;
13050
0
            c16toa(0, output + offset);
13051
0
            offset += HELLO_EXT_SZ_SZ;
13052
0
        }
13053
0
#endif
13054
13055
0
        if (offset > OPAQUE16_LEN || msgType != server_hello)
13056
0
            c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
13057
0
    }
13058
13059
0
    if (pOffset)
13060
0
        *pOffset += offset;
13061
13062
0
    return ret;
13063
0
}
13064
13065
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_SERVER */
13066
13067
#ifdef WOLFSSL_TLS13
13068
int TLSX_ParseVersion(WOLFSSL* ssl, const byte* input, word16 length,
13069
                      byte msgType, int* found)
13070
0
{
13071
0
    int ret = 0;
13072
0
    int offset = 0;
13073
13074
0
    *found = 0;
13075
0
    while (offset < (int)length) {
13076
0
        word16 type;
13077
0
        word16 size;
13078
13079
0
        if (offset + (2 * OPAQUE16_LEN) > length) {
13080
0
            ret = BUFFER_ERROR;
13081
0
            break;
13082
0
        }
13083
13084
0
        ato16(input + offset, &type);
13085
0
        offset += HELLO_EXT_TYPE_SZ;
13086
13087
0
        ato16(input + offset, &size);
13088
0
        offset += OPAQUE16_LEN;
13089
13090
0
        if (offset + size > length) {
13091
0
            ret = BUFFER_ERROR;
13092
0
            break;
13093
0
        }
13094
13095
0
        if (type == TLSX_SUPPORTED_VERSIONS) {
13096
0
            *found = 1;
13097
13098
0
            WOLFSSL_MSG("Supported Versions extension received");
13099
13100
0
            ret = SV_PARSE(ssl, input + offset, size, msgType, &ssl->version,
13101
0
                           &ssl->options, &ssl->extensions);
13102
0
            break;
13103
0
        }
13104
13105
0
        offset += size;
13106
0
    }
13107
13108
0
    return ret;
13109
0
}
13110
#endif
13111
13112
/** Parses a buffer of TLS extensions. */
13113
int TLSX_Parse(WOLFSSL* ssl, const byte* input, word16 length, byte msgType,
13114
                                                                 Suites *suites)
13115
0
{
13116
0
    int ret = 0;
13117
0
    word16 offset = 0;
13118
0
    byte isRequest = (msgType == client_hello ||
13119
0
                      msgType == certificate_request);
13120
13121
0
#ifdef HAVE_EXTENDED_MASTER
13122
0
    byte pendingEMS = 0;
13123
0
#endif
13124
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
13125
    int pskDone = 0;
13126
#endif
13127
0
    byte seenType[SEMAPHORE_SIZE];  /* Seen known extensions. */
13128
13129
0
    if (!ssl || !input || (isRequest && !suites))
13130
0
        return BAD_FUNC_ARG;
13131
13132
    /* No known extensions seen yet. */
13133
0
    XMEMSET(seenType, 0, sizeof(seenType));
13134
13135
0
    while (ret == 0 && offset < length) {
13136
0
        word16 type;
13137
0
        word16 size;
13138
13139
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
13140
        if (msgType == client_hello && pskDone) {
13141
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
13142
            return PSK_KEY_ERROR;
13143
        }
13144
#endif
13145
13146
0
        if (length - offset < HELLO_EXT_TYPE_SZ + OPAQUE16_LEN)
13147
0
            return BUFFER_ERROR;
13148
13149
0
        ato16(input + offset, &type);
13150
0
        offset += HELLO_EXT_TYPE_SZ;
13151
13152
0
        ato16(input + offset, &size);
13153
0
        offset += OPAQUE16_LEN;
13154
13155
        /* Check we have a bit for extension type. */
13156
0
        if ((type <= 62) || (type == TLSX_RENEGOTIATION_INFO)
13157
        #ifdef WOLFSSL_QUIC
13158
            || (type == TLSX_KEY_QUIC_TP_PARAMS_DRAFT)
13159
        #endif
13160
0
            )
13161
0
        {
13162
            /* Detect duplicate recognized extensions. */
13163
0
            if (IS_OFF(seenType, TLSX_ToSemaphore(type))) {
13164
0
                TURN_ON(seenType, TLSX_ToSemaphore(type));
13165
0
            }
13166
0
            else {
13167
0
                return DUPLICATE_TLS_EXT_E;
13168
0
            }
13169
0
        }
13170
13171
0
        if (length - offset < size)
13172
0
            return BUFFER_ERROR;
13173
13174
0
        switch (type) {
13175
#ifdef HAVE_SNI
13176
            case TLSX_SERVER_NAME:
13177
                WOLFSSL_MSG("SNI extension received");
13178
            #ifdef WOLFSSL_DEBUG_TLS
13179
                WOLFSSL_BUFFER(input + offset, size);
13180
            #endif
13181
13182
#ifdef WOLFSSL_TLS13
13183
                if (IsAtLeastTLSv1_3(ssl->version)) {
13184
                    if (msgType != client_hello &&
13185
                        msgType != encrypted_extensions)
13186
                        return EXT_NOT_ALLOWED;
13187
                }
13188
                else
13189
#endif
13190
                {
13191
                    if (msgType != client_hello &&
13192
                        msgType != server_hello)
13193
                        return EXT_NOT_ALLOWED;
13194
                }
13195
                ret = SNI_PARSE(ssl, input + offset, size, isRequest);
13196
                break;
13197
#endif
13198
13199
0
            case TLSX_TRUSTED_CA_KEYS:
13200
0
                WOLFSSL_MSG("Trusted CA extension received");
13201
            #ifdef WOLFSSL_DEBUG_TLS
13202
                WOLFSSL_BUFFER(input + offset, size);
13203
            #endif
13204
13205
0
#ifdef WOLFSSL_TLS13
13206
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
13207
0
                    if (msgType != client_hello &&
13208
0
                        msgType != encrypted_extensions)
13209
0
                        return EXT_NOT_ALLOWED;
13210
0
                }
13211
0
                else
13212
0
#endif
13213
0
                {
13214
0
                    if (msgType != client_hello)
13215
0
                        return EXT_NOT_ALLOWED;
13216
0
                }
13217
0
                ret = TCA_PARSE(ssl, input + offset, size, isRequest);
13218
0
                break;
13219
13220
0
            case TLSX_MAX_FRAGMENT_LENGTH:
13221
0
                WOLFSSL_MSG("Max Fragment Length extension received");
13222
            #ifdef WOLFSSL_DEBUG_TLS
13223
                WOLFSSL_BUFFER(input + offset, size);
13224
            #endif
13225
13226
0
#ifdef WOLFSSL_TLS13
13227
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
13228
0
                    if (msgType != client_hello &&
13229
0
                        msgType != encrypted_extensions) {
13230
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
13231
0
                        return EXT_NOT_ALLOWED;
13232
0
                    }
13233
0
                }
13234
0
                else
13235
0
#endif
13236
0
                {
13237
0
                    if (msgType != client_hello &&
13238
0
                        msgType != server_hello) {
13239
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
13240
0
                        return EXT_NOT_ALLOWED;
13241
0
                    }
13242
0
                }
13243
0
                ret = MFL_PARSE(ssl, input + offset, size, isRequest);
13244
0
                break;
13245
13246
0
            case TLSX_TRUNCATED_HMAC:
13247
0
                WOLFSSL_MSG("Truncated HMAC extension received");
13248
            #ifdef WOLFSSL_DEBUG_TLS
13249
                WOLFSSL_BUFFER(input + offset, size);
13250
            #endif
13251
13252
0
#ifdef WOLFSSL_TLS13
13253
0
                if (IsAtLeastTLSv1_3(ssl->version))
13254
0
                    break;
13255
0
#endif
13256
0
                if (msgType != client_hello)
13257
0
                    return EXT_NOT_ALLOWED;
13258
0
                ret = THM_PARSE(ssl, input + offset, size, isRequest);
13259
0
                break;
13260
13261
0
            case TLSX_SUPPORTED_GROUPS:
13262
0
                WOLFSSL_MSG("Supported Groups extension received");
13263
            #ifdef WOLFSSL_DEBUG_TLS
13264
                WOLFSSL_BUFFER(input + offset, size);
13265
            #endif
13266
13267
0
#ifdef WOLFSSL_TLS13
13268
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
13269
0
                    if (msgType != client_hello &&
13270
0
                        msgType != encrypted_extensions) {
13271
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
13272
0
                        return EXT_NOT_ALLOWED;
13273
0
                    }
13274
0
                }
13275
0
                else
13276
0
#endif
13277
0
                {
13278
0
                    if (msgType != client_hello) {
13279
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
13280
0
                        return EXT_NOT_ALLOWED;
13281
0
                    }
13282
0
                }
13283
0
                ret = EC_PARSE(ssl, input + offset, size, isRequest,
13284
0
                        &ssl->extensions);
13285
0
                break;
13286
13287
0
            case TLSX_EC_POINT_FORMATS:
13288
0
                WOLFSSL_MSG("Point Formats extension received");
13289
            #ifdef WOLFSSL_DEBUG_TLS
13290
                WOLFSSL_BUFFER(input + offset, size);
13291
            #endif
13292
13293
0
#ifdef WOLFSSL_TLS13
13294
0
                if (IsAtLeastTLSv1_3(ssl->version))
13295
0
                    break;
13296
0
#endif
13297
0
                if (msgType != client_hello &&
13298
0
                    msgType != server_hello) {
13299
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
13300
0
                    return EXT_NOT_ALLOWED;
13301
0
                }
13302
13303
0
                ret = PF_PARSE(ssl, input + offset, size, isRequest);
13304
0
                break;
13305
13306
0
            case TLSX_STATUS_REQUEST:
13307
0
                WOLFSSL_MSG("Certificate Status Request extension received");
13308
            #ifdef WOLFSSL_DEBUG_TLS
13309
                WOLFSSL_BUFFER(input + offset, size);
13310
            #endif
13311
13312
0
#ifdef WOLFSSL_TLS13
13313
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
13314
0
                    if (msgType != client_hello &&
13315
0
                        msgType != certificate_request &&
13316
0
                        msgType != certificate)
13317
0
                        return EXT_NOT_ALLOWED;
13318
0
                }
13319
0
                else
13320
0
 #endif
13321
0
                {
13322
0
                    if (msgType != client_hello &&
13323
0
                        msgType != server_hello)
13324
0
                        return EXT_NOT_ALLOWED;
13325
0
                }
13326
0
                ret = CSR_PARSE(ssl, input + offset, size, isRequest);
13327
0
                break;
13328
13329
0
            case TLSX_STATUS_REQUEST_V2:
13330
0
                WOLFSSL_MSG("Certificate Status Request v2 extension received");
13331
            #ifdef WOLFSSL_DEBUG_TLS
13332
                WOLFSSL_BUFFER(input + offset, size);
13333
            #endif
13334
13335
#if defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
13336
                if (IsAtLeastTLSv1_3(ssl->version)) {
13337
                    if (msgType != client_hello &&
13338
                        msgType != certificate_request &&
13339
                        msgType != certificate)
13340
                        return EXT_NOT_ALLOWED;
13341
                }
13342
                else
13343
#endif
13344
0
                {
13345
0
                    if (msgType != client_hello &&
13346
0
                        msgType != server_hello)
13347
0
                        return EXT_NOT_ALLOWED;
13348
0
                }
13349
0
                ret = CSR2_PARSE(ssl, input + offset, size, isRequest);
13350
0
                break;
13351
13352
0
#ifdef HAVE_EXTENDED_MASTER
13353
0
            case HELLO_EXT_EXTMS:
13354
0
                WOLFSSL_MSG("Extended Master Secret extension received");
13355
            #ifdef WOLFSSL_DEBUG_TLS
13356
                WOLFSSL_BUFFER(input + offset, size);
13357
            #endif
13358
13359
0
#if defined(WOLFSSL_TLS13)
13360
0
                if (IsAtLeastTLSv1_3(ssl->version))
13361
0
                    break;
13362
0
#endif
13363
0
                if (msgType != client_hello &&
13364
0
                    msgType != server_hello)
13365
0
                    return EXT_NOT_ALLOWED;
13366
0
                if (size != 0)
13367
0
                    return BUFFER_ERROR;
13368
13369
0
#ifndef NO_WOLFSSL_SERVER
13370
0
                if (isRequest)
13371
0
                    ssl->options.haveEMS = 1;
13372
0
#endif
13373
0
                pendingEMS = 1;
13374
0
                break;
13375
0
#endif
13376
13377
0
            case TLSX_RENEGOTIATION_INFO:
13378
0
                WOLFSSL_MSG("Secure Renegotiation extension received");
13379
            #ifdef WOLFSSL_DEBUG_TLS
13380
                WOLFSSL_BUFFER(input + offset, size);
13381
            #endif
13382
13383
0
#ifdef WOLFSSL_TLS13
13384
0
                if (IsAtLeastTLSv1_3(ssl->version))
13385
0
                    break;
13386
0
#endif
13387
0
                if (msgType != client_hello &&
13388
0
                    msgType != server_hello)
13389
0
                    return EXT_NOT_ALLOWED;
13390
0
                ret = SCR_PARSE(ssl, input + offset, size, isRequest);
13391
0
                break;
13392
13393
0
            case TLSX_SESSION_TICKET:
13394
0
                WOLFSSL_MSG("Session Ticket extension received");
13395
            #ifdef WOLFSSL_DEBUG_TLS
13396
                WOLFSSL_BUFFER(input + offset, size);
13397
            #endif
13398
13399
#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
13400
                if (IsAtLeastTLSv1_3(ssl->version)) {
13401
                    if (msgType != client_hello)
13402
                        return EXT_NOT_ALLOWED;
13403
                }
13404
                else
13405
#endif
13406
0
                {
13407
0
                    if (msgType != client_hello &&
13408
0
                        msgType != server_hello)
13409
0
                        return EXT_NOT_ALLOWED;
13410
0
                }
13411
0
                ret = WOLF_STK_PARSE(ssl, input + offset, size, isRequest);
13412
0
                break;
13413
13414
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
13415
0
                WOLFSSL_MSG("ALPN extension received");
13416
13417
            #ifdef WOLFSSL_DEBUG_TLS
13418
                WOLFSSL_BUFFER(input + offset, size);
13419
            #endif
13420
13421
#if defined(WOLFSSL_TLS13) && defined(HAVE_ALPN)
13422
                if (IsAtLeastTLSv1_3(ssl->version)) {
13423
                    if (msgType != client_hello &&
13424
                        msgType != encrypted_extensions)
13425
                        return EXT_NOT_ALLOWED;
13426
                }
13427
                else
13428
#endif
13429
0
                {
13430
0
                    if (msgType != client_hello &&
13431
0
                        msgType != server_hello)
13432
0
                        return EXT_NOT_ALLOWED;
13433
0
                }
13434
0
                ret = ALPN_PARSE(ssl, input + offset, size, isRequest);
13435
0
                break;
13436
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
13437
0
            case TLSX_SIGNATURE_ALGORITHMS:
13438
0
                WOLFSSL_MSG("Signature Algorithms extension received");
13439
            #ifdef WOLFSSL_DEBUG_TLS
13440
                WOLFSSL_BUFFER(input + offset, size);
13441
            #endif
13442
13443
0
                if (!IsAtLeastTLSv1_2(ssl))
13444
0
                    break;
13445
0
            #ifdef WOLFSSL_TLS13
13446
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
13447
0
                    if (msgType != client_hello &&
13448
0
                        msgType != certificate_request)
13449
0
                        return EXT_NOT_ALLOWED;
13450
0
                }
13451
0
                else
13452
0
            #endif
13453
0
                {
13454
0
                    if (msgType != client_hello)
13455
0
                        return EXT_NOT_ALLOWED;
13456
0
                }
13457
0
                ret = SA_PARSE(ssl, input + offset, size, isRequest, suites);
13458
0
                break;
13459
0
#endif
13460
13461
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
13462
0
            case TLSX_ENCRYPT_THEN_MAC:
13463
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension received");
13464
13465
                /* Ignore for TLS 1.3+ */
13466
0
                if (IsAtLeastTLSv1_3(ssl->version))
13467
0
                    break;
13468
0
                if (msgType != client_hello &&
13469
0
                    msgType != server_hello)
13470
0
                    return EXT_NOT_ALLOWED;
13471
13472
0
                ret = ETM_PARSE(ssl, input + offset, size, msgType);
13473
0
                break;
13474
0
#endif /* HAVE_ENCRYPT_THEN_MAC */
13475
13476
0
#ifdef WOLFSSL_TLS13
13477
0
            case TLSX_SUPPORTED_VERSIONS:
13478
0
                WOLFSSL_MSG("Skipping Supported Versions - already processed");
13479
            #ifdef WOLFSSL_DEBUG_TLS
13480
                WOLFSSL_BUFFER(input + offset, size);
13481
            #endif
13482
0
                if (msgType != client_hello &&
13483
0
                    msgType != server_hello &&
13484
0
                    msgType != hello_retry_request)
13485
0
                    return EXT_NOT_ALLOWED;
13486
13487
0
                break;
13488
13489
    #ifdef WOLFSSL_SEND_HRR_COOKIE
13490
            case TLSX_COOKIE:
13491
                WOLFSSL_MSG("Cookie extension received");
13492
            #ifdef WOLFSSL_DEBUG_TLS
13493
                WOLFSSL_BUFFER(input + offset, size);
13494
            #endif
13495
13496
                if (!IsAtLeastTLSv1_3(ssl->version))
13497
                    break;
13498
13499
                if (msgType != client_hello &&
13500
                    msgType != hello_retry_request) {
13501
                    return EXT_NOT_ALLOWED;
13502
                }
13503
13504
                ret = CKE_PARSE(ssl, input + offset, size, msgType);
13505
                break;
13506
    #endif
13507
13508
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13509
            case TLSX_PRE_SHARED_KEY:
13510
                WOLFSSL_MSG("Pre-Shared Key extension received");
13511
            #ifdef WOLFSSL_DEBUG_TLS
13512
                WOLFSSL_BUFFER(input + offset, size);
13513
            #endif
13514
13515
                if (!IsAtLeastTLSv1_3(ssl->version))
13516
                    break;
13517
13518
                if (msgType != client_hello &&
13519
                    msgType != server_hello) {
13520
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
13521
                    return EXT_NOT_ALLOWED;
13522
                }
13523
13524
                ret = PSK_PARSE(ssl, input + offset, size, msgType);
13525
                pskDone = 1;
13526
                break;
13527
13528
            case TLSX_PSK_KEY_EXCHANGE_MODES:
13529
                WOLFSSL_MSG("PSK Key Exchange Modes extension received");
13530
            #ifdef WOLFSSL_DEBUG_TLS
13531
                WOLFSSL_BUFFER(input + offset, size);
13532
            #endif
13533
13534
                if (!IsAtLeastTLSv1_3(ssl->version))
13535
                    break;
13536
13537
                if (msgType != client_hello) {
13538
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
13539
                    return EXT_NOT_ALLOWED;
13540
                }
13541
13542
                ret = PKM_PARSE(ssl, input + offset, size, msgType);
13543
                break;
13544
    #endif
13545
13546
    #ifdef WOLFSSL_EARLY_DATA
13547
            case TLSX_EARLY_DATA:
13548
                WOLFSSL_MSG("Early Data extension received");
13549
            #ifdef WOLFSSL_DEBUG_TLS
13550
                WOLFSSL_BUFFER(input + offset, size);
13551
            #endif
13552
13553
                if (!IsAtLeastTLSv1_3(ssl->version))
13554
                    break;
13555
13556
                if (msgType != client_hello && msgType != session_ticket &&
13557
                    msgType != encrypted_extensions) {
13558
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
13559
                    return EXT_NOT_ALLOWED;
13560
                }
13561
                ret = EDI_PARSE(ssl, input + offset, size, msgType);
13562
                break;
13563
    #endif
13564
13565
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
13566
            case TLSX_POST_HANDSHAKE_AUTH:
13567
                WOLFSSL_MSG("Post Handshake Authentication extension received");
13568
            #ifdef WOLFSSL_DEBUG_TLS
13569
                WOLFSSL_BUFFER(input + offset, size);
13570
            #endif
13571
13572
                if (!IsAtLeastTLSv1_3(ssl->version))
13573
                    break;
13574
13575
                if (msgType != client_hello) {
13576
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
13577
                    return EXT_NOT_ALLOWED;
13578
                }
13579
13580
                ret = PHA_PARSE(ssl, input + offset, size, msgType);
13581
                break;
13582
    #endif
13583
13584
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
13585
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
13586
0
                WOLFSSL_MSG("Signature Algorithms extension received");
13587
            #ifdef WOLFSSL_DEBUG_TLS
13588
                WOLFSSL_BUFFER(input + offset, size);
13589
            #endif
13590
13591
0
                if (!IsAtLeastTLSv1_3(ssl->version))
13592
0
                    break;
13593
13594
0
                if (msgType != client_hello &&
13595
0
                        msgType != certificate_request) {
13596
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
13597
0
                    return EXT_NOT_ALLOWED;
13598
0
                }
13599
13600
0
                ret = SAC_PARSE(ssl, input + offset, size, isRequest);
13601
0
                break;
13602
0
    #endif
13603
13604
0
            case TLSX_KEY_SHARE:
13605
0
                WOLFSSL_MSG("Key Share extension received");
13606
            #ifdef WOLFSSL_DEBUG_TLS
13607
                WOLFSSL_BUFFER(input + offset, size);
13608
            #endif
13609
13610
0
    #ifdef HAVE_SUPPORTED_CURVES
13611
0
                if (!IsAtLeastTLSv1_3(ssl->version))
13612
0
                    break;
13613
13614
0
                if (msgType != client_hello && msgType != server_hello &&
13615
0
                        msgType != hello_retry_request) {
13616
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
13617
0
                    return EXT_NOT_ALLOWED;
13618
0
                }
13619
0
    #endif
13620
13621
0
                ret = KS_PARSE(ssl, input + offset, size, msgType);
13622
0
                break;
13623
0
#endif
13624
#ifdef WOLFSSL_SRTP
13625
            case TLSX_USE_SRTP:
13626
                WOLFSSL_MSG("Use SRTP extension received");
13627
                ret = SRTP_PARSE(ssl, input + offset, size, isRequest);
13628
                break;
13629
#endif
13630
#ifdef WOLFSSL_QUIC
13631
            case TLSX_KEY_QUIC_TP_PARAMS:
13632
                FALL_THROUGH;
13633
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
13634
                WOLFSSL_MSG("QUIC transport parameter received");
13635
            #ifdef WOLFSSL_DEBUG_TLS
13636
                WOLFSSL_BUFFER(input + offset, size);
13637
            #endif
13638
13639
                if (IsAtLeastTLSv1_3(ssl->version) &&
13640
                        msgType != client_hello &&
13641
                        msgType != server_hello &&
13642
                        msgType != encrypted_extensions) {
13643
                    return EXT_NOT_ALLOWED;
13644
                }
13645
                else if (!IsAtLeastTLSv1_3(ssl->version) &&
13646
                         msgType == encrypted_extensions) {
13647
                    return EXT_NOT_ALLOWED;
13648
                }
13649
                else if (WOLFSSL_IS_QUIC(ssl)) {
13650
                    ret = QTP_PARSE(ssl, input + offset, size, type, msgType);
13651
                }
13652
                else {
13653
                    WOLFSSL_MSG("QUIC transport param TLS extension type, but no QUIC");
13654
                    return EXT_NOT_ALLOWED; /* be safe, this should not happen */
13655
                }
13656
                break;
13657
#endif /* WOLFSSL_QUIC */
13658
#if defined(WOLFSSL_DTLS_CID)
13659
            case TLSX_CONNECTION_ID:
13660
                /* connection ID not supported in DTLSv1.2 */
13661
                if (!IsAtLeastTLSv1_3(ssl->version))
13662
                    break;
13663
13664
                if (msgType != client_hello && msgType != server_hello)
13665
                    return EXT_NOT_ALLOWED;
13666
13667
                WOLFSSL_MSG("ConnectionID extension received");
13668
                ret = CID_PARSE(ssl, input + offset, size, isRequest);
13669
                break;
13670
13671
#endif /* defined(WOLFSSL_DTLS_CID) */
13672
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
13673
            case TLSX_ECH:
13674
                ret = ECH_PARSE(ssl, input + offset, size, msgType);
13675
                break;
13676
#endif
13677
0
            default:
13678
0
                WOLFSSL_MSG("Unknown TLS extension type");
13679
0
        }
13680
13681
        /* offset should be updated here! */
13682
0
        offset += size;
13683
0
    }
13684
13685
0
#ifdef HAVE_EXTENDED_MASTER
13686
0
    if (IsAtLeastTLSv1_3(ssl->version) && msgType == hello_retry_request) {
13687
        /* Don't change EMS status until server_hello received.
13688
         * Second ClientHello must have same extensions.
13689
         */
13690
0
    }
13691
0
    else if (!isRequest && ssl->options.haveEMS && !pendingEMS)
13692
0
        ssl->options.haveEMS = 0;
13693
0
#endif
13694
13695
0
    if (ret == 0)
13696
0
        ret = SNI_VERIFY_PARSE(ssl, isRequest);
13697
0
    if (ret == 0)
13698
0
        ret = TCA_VERIFY_PARSE(ssl, isRequest);
13699
13700
0
    return ret;
13701
0
}
13702
13703
/* undefining semaphore macros */
13704
#undef IS_OFF
13705
#undef TURN_ON
13706
#undef SEMAPHORE_SIZE
13707
13708
#endif /* HAVE_TLS_EXTENSIONS */
13709
13710
#ifndef NO_WOLFSSL_CLIENT
13711
13712
    WOLFSSL_METHOD* wolfTLS_client_method(void)
13713
0
    {
13714
0
        return wolfTLS_client_method_ex(NULL);
13715
0
    }
13716
    WOLFSSL_METHOD* wolfTLS_client_method_ex(void* heap)
13717
0
    {
13718
0
        WOLFSSL_METHOD* method =
13719
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
13720
0
                                                     heap, DYNAMIC_TYPE_METHOD);
13721
0
        (void)heap;
13722
0
        WOLFSSL_ENTER("TLS_client_method_ex");
13723
0
        if (method) {
13724
0
        #if defined(WOLFSSL_TLS13)
13725
0
            InitSSL_Method(method, MakeTLSv1_3());
13726
        #elif !defined(WOLFSSL_NO_TLS12)
13727
            InitSSL_Method(method, MakeTLSv1_2());
13728
        #elif !defined(NO_OLD_TLS)
13729
            InitSSL_Method(method, MakeTLSv1_1());
13730
        #elif defined(WOLFSSL_ALLOW_TLSV10)
13731
            InitSSL_Method(method, MakeTLSv1());
13732
        #else
13733
            #error No TLS version enabled!
13734
        #endif
13735
13736
0
            method->downgrade = 1;
13737
0
            method->side      = WOLFSSL_CLIENT_END;
13738
0
        }
13739
0
        return method;
13740
0
    }
13741
13742
#ifndef NO_OLD_TLS
13743
    #ifdef WOLFSSL_ALLOW_TLSV10
13744
    WOLFSSL_METHOD* wolfTLSv1_client_method(void)
13745
    {
13746
        return wolfTLSv1_client_method_ex(NULL);
13747
    }
13748
    WOLFSSL_METHOD* wolfTLSv1_client_method_ex(void* heap)
13749
    {
13750
        WOLFSSL_METHOD* method =
13751
                             (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
13752
                                                     heap, DYNAMIC_TYPE_METHOD);
13753
        (void)heap;
13754
        WOLFSSL_ENTER("TLSv1_client_method_ex");
13755
        if (method)
13756
            InitSSL_Method(method, MakeTLSv1());
13757
        return method;
13758
    }
13759
    #endif /* WOLFSSL_ALLOW_TLSV10 */
13760
13761
    WOLFSSL_METHOD* wolfTLSv1_1_client_method(void)
13762
0
    {
13763
0
        return wolfTLSv1_1_client_method_ex(NULL);
13764
0
    }
13765
    WOLFSSL_METHOD* wolfTLSv1_1_client_method_ex(void* heap)
13766
0
    {
13767
0
        WOLFSSL_METHOD* method =
13768
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
13769
0
                                                     heap, DYNAMIC_TYPE_METHOD);
13770
0
        (void)heap;
13771
0
        WOLFSSL_ENTER("TLSv1_1_client_method_ex");
13772
0
        if (method)
13773
0
            InitSSL_Method(method, MakeTLSv1_1());
13774
0
        return method;
13775
0
    }
13776
#endif /* !NO_OLD_TLS */
13777
13778
#ifndef WOLFSSL_NO_TLS12
13779
    WOLFSSL_ABI
13780
    WOLFSSL_METHOD* wolfTLSv1_2_client_method(void)
13781
0
    {
13782
0
        return wolfTLSv1_2_client_method_ex(NULL);
13783
0
    }
13784
    WOLFSSL_METHOD* wolfTLSv1_2_client_method_ex(void* heap)
13785
0
    {
13786
0
        WOLFSSL_METHOD* method =
13787
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
13788
0
                                                     heap, DYNAMIC_TYPE_METHOD);
13789
0
        (void)heap;
13790
0
        WOLFSSL_ENTER("TLSv1_2_client_method_ex");
13791
0
        if (method)
13792
0
            InitSSL_Method(method, MakeTLSv1_2());
13793
0
        return method;
13794
0
    }
13795
#endif /* WOLFSSL_NO_TLS12 */
13796
13797
#ifdef WOLFSSL_TLS13
13798
    /* The TLS v1.3 client method data.
13799
     *
13800
     * returns the method data for a TLS v1.3 client.
13801
     */
13802
    WOLFSSL_ABI
13803
    WOLFSSL_METHOD* wolfTLSv1_3_client_method(void)
13804
0
    {
13805
0
        return wolfTLSv1_3_client_method_ex(NULL);
13806
0
    }
13807
13808
    /* The TLS v1.3 client method data.
13809
     *
13810
     * heap  The heap used for allocation.
13811
     * returns the method data for a TLS v1.3 client.
13812
     */
13813
    WOLFSSL_METHOD* wolfTLSv1_3_client_method_ex(void* heap)
13814
0
    {
13815
0
        WOLFSSL_METHOD* method = (WOLFSSL_METHOD*)
13816
0
                                 XMALLOC(sizeof(WOLFSSL_METHOD), heap,
13817
0
                                         DYNAMIC_TYPE_METHOD);
13818
0
        (void)heap;
13819
0
        WOLFSSL_ENTER("TLSv1_3_client_method_ex");
13820
0
        if (method)
13821
0
            InitSSL_Method(method, MakeTLSv1_3());
13822
0
        return method;
13823
0
    }
13824
#endif /* WOLFSSL_TLS13 */
13825
13826
#ifdef WOLFSSL_DTLS
13827
13828
    WOLFSSL_METHOD* wolfDTLS_client_method(void)
13829
    {
13830
        return wolfDTLS_client_method_ex(NULL);
13831
    }
13832
    WOLFSSL_METHOD* wolfDTLS_client_method_ex(void* heap)
13833
    {
13834
        WOLFSSL_METHOD* method =
13835
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
13836
                                                     heap, DYNAMIC_TYPE_METHOD);
13837
        (void)heap;
13838
        WOLFSSL_ENTER("DTLS_client_method_ex");
13839
        if (method) {
13840
        #if defined(WOLFSSL_DTLS13)
13841
            InitSSL_Method(method, MakeDTLSv1_3());
13842
        #elif !defined(WOLFSSL_NO_TLS12)
13843
            InitSSL_Method(method, MakeDTLSv1_2());
13844
        #elif !defined(NO_OLD_TLS)
13845
            InitSSL_Method(method, MakeDTLSv1());
13846
        #else
13847
            #error No DTLS version enabled!
13848
        #endif
13849
13850
            method->downgrade = 1;
13851
            method->side      = WOLFSSL_CLIENT_END;
13852
        }
13853
        return method;
13854
    }
13855
13856
    #ifndef NO_OLD_TLS
13857
    WOLFSSL_METHOD* wolfDTLSv1_client_method(void)
13858
    {
13859
        return wolfDTLSv1_client_method_ex(NULL);
13860
    }
13861
    WOLFSSL_METHOD* wolfDTLSv1_client_method_ex(void* heap)
13862
    {
13863
        WOLFSSL_METHOD* method =
13864
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
13865
                                                 heap, DYNAMIC_TYPE_METHOD);
13866
        (void)heap;
13867
        WOLFSSL_ENTER("DTLSv1_client_method_ex");
13868
        if (method)
13869
            InitSSL_Method(method, MakeDTLSv1());
13870
        return method;
13871
    }
13872
    #endif  /* NO_OLD_TLS */
13873
13874
    #ifndef WOLFSSL_NO_TLS12
13875
    WOLFSSL_METHOD* wolfDTLSv1_2_client_method(void)
13876
    {
13877
        return wolfDTLSv1_2_client_method_ex(NULL);
13878
    }
13879
    WOLFSSL_METHOD* wolfDTLSv1_2_client_method_ex(void* heap)
13880
    {
13881
        WOLFSSL_METHOD* method =
13882
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
13883
                                                 heap, DYNAMIC_TYPE_METHOD);
13884
        (void)heap;
13885
        WOLFSSL_ENTER("DTLSv1_2_client_method_ex");
13886
        if (method)
13887
            InitSSL_Method(method, MakeDTLSv1_2());
13888
        (void)heap;
13889
        return method;
13890
    }
13891
    #endif /* !WOLFSSL_NO_TLS12 */
13892
#endif /* WOLFSSL_DTLS */
13893
13894
#endif /* NO_WOLFSSL_CLIENT */
13895
13896
13897
/* EITHER SIDE METHODS */
13898
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
13899
    #ifndef NO_OLD_TLS
13900
    #ifdef WOLFSSL_ALLOW_TLSV10
13901
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
13902
     *
13903
     * Returns a pointer to a WOLFSSL_METHOD struct
13904
     */
13905
    WOLFSSL_METHOD* wolfTLSv1_method(void)
13906
    {
13907
        return wolfTLSv1_method_ex(NULL);
13908
    }
13909
    WOLFSSL_METHOD* wolfTLSv1_method_ex(void* heap)
13910
    {
13911
        WOLFSSL_METHOD* m;
13912
        WOLFSSL_ENTER("TLSv1_method");
13913
    #ifndef NO_WOLFSSL_CLIENT
13914
        m = wolfTLSv1_client_method_ex(heap);
13915
    #else
13916
        m = wolfTLSv1_server_method_ex(heap);
13917
    #endif
13918
        if (m != NULL) {
13919
            m->side = WOLFSSL_NEITHER_END;
13920
        }
13921
13922
        return m;
13923
    }
13924
    #endif /* WOLFSSL_ALLOW_TLSV10 */
13925
13926
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
13927
     *
13928
     * Returns a pointer to a WOLFSSL_METHOD struct
13929
     */
13930
    WOLFSSL_METHOD* wolfTLSv1_1_method(void)
13931
    {
13932
        return wolfTLSv1_1_method_ex(NULL);
13933
    }
13934
    WOLFSSL_METHOD* wolfTLSv1_1_method_ex(void* heap)
13935
    {
13936
        WOLFSSL_METHOD* m;
13937
        WOLFSSL_ENTER("TLSv1_1_method");
13938
    #ifndef NO_WOLFSSL_CLIENT
13939
        m = wolfTLSv1_1_client_method_ex(heap);
13940
    #else
13941
        m = wolfTLSv1_1_server_method_ex(heap);
13942
    #endif
13943
        if (m != NULL) {
13944
            m->side = WOLFSSL_NEITHER_END;
13945
        }
13946
        return m;
13947
    }
13948
    #endif /* !NO_OLD_TLS */
13949
13950
    #ifndef WOLFSSL_NO_TLS12
13951
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
13952
     *
13953
     * Returns a pointer to a WOLFSSL_METHOD struct
13954
     */
13955
    WOLFSSL_METHOD* wolfTLSv1_2_method(void)
13956
    {
13957
        return wolfTLSv1_2_method_ex(NULL);
13958
    }
13959
    WOLFSSL_METHOD* wolfTLSv1_2_method_ex(void* heap)
13960
    {
13961
        WOLFSSL_METHOD* m;
13962
        WOLFSSL_ENTER("TLSv1_2_method");
13963
    #ifndef NO_WOLFSSL_CLIENT
13964
        m = wolfTLSv1_2_client_method_ex(heap);
13965
    #else
13966
        m = wolfTLSv1_2_server_method_ex(heap);
13967
    #endif
13968
        if (m != NULL) {
13969
            m->side = WOLFSSL_NEITHER_END;
13970
        }
13971
        return m;
13972
    }
13973
    #endif /* !WOLFSSL_NO_TLS12 */
13974
13975
    #ifdef WOLFSSL_TLS13
13976
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
13977
     *
13978
     * Returns a pointer to a WOLFSSL_METHOD struct
13979
     */
13980
    WOLFSSL_METHOD* wolfTLSv1_3_method(void)
13981
    {
13982
        return wolfTLSv1_3_method_ex(NULL);
13983
    }
13984
    WOLFSSL_METHOD* wolfTLSv1_3_method_ex(void* heap)
13985
    {
13986
        WOLFSSL_METHOD* m;
13987
        WOLFSSL_ENTER("TLSv1_3_method");
13988
    #ifndef NO_WOLFSSL_CLIENT
13989
        m = wolfTLSv1_3_client_method_ex(heap);
13990
    #else
13991
        m = wolfTLSv1_3_server_method_ex(heap);
13992
    #endif
13993
        if (m != NULL) {
13994
            m->side = WOLFSSL_NEITHER_END;
13995
        }
13996
        return m;
13997
    }
13998
    #endif /* WOLFSSL_TLS13 */
13999
14000
#ifdef WOLFSSL_DTLS
14001
    WOLFSSL_METHOD* wolfDTLS_method(void)
14002
    {
14003
        return wolfDTLS_method_ex(NULL);
14004
    }
14005
    WOLFSSL_METHOD* wolfDTLS_method_ex(void* heap)
14006
    {
14007
        WOLFSSL_METHOD* m;
14008
        WOLFSSL_ENTER("DTLS_method_ex");
14009
    #ifndef NO_WOLFSSL_CLIENT
14010
        m = wolfDTLS_client_method_ex(heap);
14011
    #else
14012
        m = wolfDTLS_server_method_ex(heap);
14013
    #endif
14014
        if (m != NULL) {
14015
            m->side = WOLFSSL_NEITHER_END;
14016
        }
14017
        return m;
14018
    }
14019
14020
    #ifndef NO_OLD_TLS
14021
    WOLFSSL_METHOD* wolfDTLSv1_method(void)
14022
    {
14023
        return wolfDTLSv1_method_ex(NULL);
14024
    }
14025
    WOLFSSL_METHOD* wolfDTLSv1_method_ex(void* heap)
14026
    {
14027
        WOLFSSL_METHOD* m;
14028
        WOLFSSL_ENTER("DTLSv1_method_ex");
14029
    #ifndef NO_WOLFSSL_CLIENT
14030
        m = wolfDTLSv1_client_method_ex(heap);
14031
    #else
14032
        m = wolfDTLSv1_server_method_ex(heap);
14033
    #endif
14034
        if (m != NULL) {
14035
            m->side = WOLFSSL_NEITHER_END;
14036
        }
14037
        return m;
14038
    }
14039
    #endif /* !NO_OLD_TLS */
14040
    #ifndef WOLFSSL_NO_TLS12
14041
    WOLFSSL_METHOD* wolfDTLSv1_2_method(void)
14042
    {
14043
        return wolfDTLSv1_2_method_ex(NULL);
14044
    }
14045
    WOLFSSL_METHOD* wolfDTLSv1_2_method_ex(void* heap)
14046
    {
14047
        WOLFSSL_METHOD* m;
14048
        WOLFSSL_ENTER("DTLSv1_2_method");
14049
    #ifndef NO_WOLFSSL_CLIENT
14050
        m = wolfDTLSv1_2_client_method_ex(heap);
14051
    #else
14052
        m = wolfDTLSv1_2_server_method_ex(heap);
14053
    #endif
14054
        if (m != NULL) {
14055
            m->side = WOLFSSL_NEITHER_END;
14056
        }
14057
        return m;
14058
    }
14059
    #endif /* !WOLFSSL_NO_TLS12 */
14060
#endif /* WOLFSSL_DTLS */
14061
#endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
14062
14063
14064
#ifndef NO_WOLFSSL_SERVER
14065
14066
    WOLFSSL_METHOD* wolfTLS_server_method(void)
14067
0
    {
14068
0
        return wolfTLS_server_method_ex(NULL);
14069
0
    }
14070
14071
    WOLFSSL_METHOD* wolfTLS_server_method_ex(void* heap)
14072
0
    {
14073
0
        WOLFSSL_METHOD* method =
14074
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
14075
0
                                                     heap, DYNAMIC_TYPE_METHOD);
14076
0
        (void)heap;
14077
0
        WOLFSSL_ENTER("TLS_server_method_ex");
14078
0
        if (method) {
14079
0
        #if defined(WOLFSSL_TLS13)
14080
0
            InitSSL_Method(method, MakeTLSv1_3());
14081
        #elif !defined(WOLFSSL_NO_TLS12)
14082
            InitSSL_Method(method, MakeTLSv1_2());
14083
        #elif !defined(NO_OLD_TLS)
14084
            InitSSL_Method(method, MakeTLSv1_1());
14085
        #elif defined(WOLFSSL_ALLOW_TLSV10)
14086
            InitSSL_Method(method, MakeTLSv1());
14087
        #else
14088
            #error No TLS version enabled!
14089
        #endif
14090
14091
0
            method->downgrade = 1;
14092
0
            method->side      = WOLFSSL_SERVER_END;
14093
0
        }
14094
0
        return method;
14095
0
    }
14096
14097
#ifndef NO_OLD_TLS
14098
    #ifdef WOLFSSL_ALLOW_TLSV10
14099
    WOLFSSL_METHOD* wolfTLSv1_server_method(void)
14100
    {
14101
        return wolfTLSv1_server_method_ex(NULL);
14102
    }
14103
    WOLFSSL_METHOD* wolfTLSv1_server_method_ex(void* heap)
14104
    {
14105
        WOLFSSL_METHOD* method =
14106
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
14107
                                                     heap, DYNAMIC_TYPE_METHOD);
14108
        (void)heap;
14109
        WOLFSSL_ENTER("TLSv1_server_method_ex");
14110
        if (method) {
14111
            InitSSL_Method(method, MakeTLSv1());
14112
            method->side = WOLFSSL_SERVER_END;
14113
        }
14114
        return method;
14115
    }
14116
    #endif /* WOLFSSL_ALLOW_TLSV10 */
14117
14118
    WOLFSSL_METHOD* wolfTLSv1_1_server_method(void)
14119
0
    {
14120
0
        return wolfTLSv1_1_server_method_ex(NULL);
14121
0
    }
14122
    WOLFSSL_METHOD* wolfTLSv1_1_server_method_ex(void* heap)
14123
0
    {
14124
0
        WOLFSSL_METHOD* method =
14125
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
14126
0
                                                     heap, DYNAMIC_TYPE_METHOD);
14127
0
        (void)heap;
14128
0
        WOLFSSL_ENTER("TLSv1_1_server_method_ex");
14129
0
        if (method) {
14130
0
            InitSSL_Method(method, MakeTLSv1_1());
14131
0
            method->side = WOLFSSL_SERVER_END;
14132
0
        }
14133
0
        return method;
14134
0
    }
14135
#endif /* !NO_OLD_TLS */
14136
14137
14138
#ifndef WOLFSSL_NO_TLS12
14139
    WOLFSSL_ABI
14140
    WOLFSSL_METHOD* wolfTLSv1_2_server_method(void)
14141
0
    {
14142
0
        return wolfTLSv1_2_server_method_ex(NULL);
14143
0
    }
14144
    WOLFSSL_METHOD* wolfTLSv1_2_server_method_ex(void* heap)
14145
0
    {
14146
0
        WOLFSSL_METHOD* method =
14147
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
14148
0
                                                     heap, DYNAMIC_TYPE_METHOD);
14149
0
        (void)heap;
14150
0
        WOLFSSL_ENTER("TLSv1_2_server_method_ex");
14151
0
        if (method) {
14152
0
            InitSSL_Method(method, MakeTLSv1_2());
14153
0
            method->side = WOLFSSL_SERVER_END;
14154
0
        }
14155
0
        return method;
14156
0
    }
14157
#endif /* !WOLFSSL_NO_TLS12 */
14158
14159
#ifdef WOLFSSL_TLS13
14160
    /* The TLS v1.3 server method data.
14161
     *
14162
     * returns the method data for a TLS v1.3 server.
14163
     */
14164
    WOLFSSL_ABI
14165
    WOLFSSL_METHOD* wolfTLSv1_3_server_method(void)
14166
0
    {
14167
0
        return wolfTLSv1_3_server_method_ex(NULL);
14168
0
    }
14169
14170
    /* The TLS v1.3 server method data.
14171
     *
14172
     * heap  The heap used for allocation.
14173
     * returns the method data for a TLS v1.3 server.
14174
     */
14175
    WOLFSSL_METHOD* wolfTLSv1_3_server_method_ex(void* heap)
14176
0
    {
14177
0
        WOLFSSL_METHOD* method =
14178
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
14179
0
                                                     heap, DYNAMIC_TYPE_METHOD);
14180
0
        (void)heap;
14181
0
        WOLFSSL_ENTER("TLSv1_3_server_method_ex");
14182
0
        if (method) {
14183
0
            InitSSL_Method(method, MakeTLSv1_3());
14184
0
            method->side = WOLFSSL_SERVER_END;
14185
0
        }
14186
0
        return method;
14187
0
    }
14188
#endif /* WOLFSSL_TLS13 */
14189
14190
#ifdef WOLFSSL_DTLS
14191
    WOLFSSL_METHOD* wolfDTLS_server_method(void)
14192
    {
14193
        return wolfDTLS_server_method_ex(NULL);
14194
    }
14195
    WOLFSSL_METHOD* wolfDTLS_server_method_ex(void* heap)
14196
    {
14197
        WOLFSSL_METHOD* method =
14198
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
14199
                                                     heap, DYNAMIC_TYPE_METHOD);
14200
        (void)heap;
14201
        WOLFSSL_ENTER("DTLS_server_method_ex");
14202
        if (method) {
14203
        #if defined(WOLFSSL_DTLS13)
14204
            InitSSL_Method(method, MakeDTLSv1_3());
14205
        #elif !defined(WOLFSSL_NO_TLS12)
14206
            InitSSL_Method(method, MakeDTLSv1_2());
14207
        #elif !defined(NO_OLD_TLS)
14208
            InitSSL_Method(method, MakeDTLSv1());
14209
        #else
14210
            #error No DTLS version enabled!
14211
        #endif
14212
14213
            method->downgrade = 1;
14214
            method->side      = WOLFSSL_SERVER_END;
14215
        }
14216
        return method;
14217
    }
14218
14219
    #ifndef NO_OLD_TLS
14220
    WOLFSSL_METHOD* wolfDTLSv1_server_method(void)
14221
    {
14222
        return wolfDTLSv1_server_method_ex(NULL);
14223
    }
14224
    WOLFSSL_METHOD* wolfDTLSv1_server_method_ex(void* heap)
14225
    {
14226
        WOLFSSL_METHOD* method =
14227
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
14228
                                                 heap, DYNAMIC_TYPE_METHOD);
14229
        (void)heap;
14230
        WOLFSSL_ENTER("DTLSv1_server_method_ex");
14231
        if (method) {
14232
            InitSSL_Method(method, MakeDTLSv1());
14233
            method->side = WOLFSSL_SERVER_END;
14234
        }
14235
        return method;
14236
    }
14237
    #endif /* !NO_OLD_TLS */
14238
14239
    #ifndef WOLFSSL_NO_TLS12
14240
    WOLFSSL_METHOD* wolfDTLSv1_2_server_method(void)
14241
    {
14242
        return wolfDTLSv1_2_server_method_ex(NULL);
14243
    }
14244
    WOLFSSL_METHOD* wolfDTLSv1_2_server_method_ex(void* heap)
14245
    {
14246
        WOLFSSL_METHOD* method =
14247
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
14248
                                                 heap, DYNAMIC_TYPE_METHOD);
14249
        WOLFSSL_ENTER("DTLSv1_2_server_method_ex");
14250
        (void)heap;
14251
        if (method) {
14252
            InitSSL_Method(method, MakeDTLSv1_2());
14253
            method->side = WOLFSSL_SERVER_END;
14254
        }
14255
        (void)heap;
14256
        return method;
14257
    }
14258
    #endif /* !WOLFSSL_NO_TLS12 */
14259
#endif /* WOLFSSL_DTLS */
14260
14261
#endif /* NO_WOLFSSL_SERVER */
14262
14263
#endif /* NO_TLS */
14264
#endif /* WOLFCRYPT_ONLY */