Coverage Report

Created: 2026-05-18 06:53

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wolfssl-openssl-api/src/tls13.c
Line
Count
Source
1
/* tls13.c
2
 *
3
 * Copyright (C) 2006-2026 wolfSSL Inc.
4
 *
5
 * This file is part of wolfSSL.
6
 *
7
 * wolfSSL is free software; you can redistribute it and/or modify
8
 * it under the terms of the GNU General Public License as published by
9
 * the Free Software Foundation; either version 3 of the License, or
10
 * (at your option) any later version.
11
 *
12
 * wolfSSL is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU General Public License
18
 * along with this program; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
20
 */
21
22
#include <wolfssl/wolfcrypt/libwolfssl_sources.h>
23
24
/*
25
 * TLS 1.3-Specific Build Options:
26
 * (See tls.c for generic TLS options: extensions, curves, callbacks, etc.)
27
 *
28
 * Protocol:
29
 * WOLFSSL_TLS13:            Enable TLS 1.3 protocol               default: on
30
 * WOLFSSL_TLS13_DRAFT:      Enable TLS 1.3 draft version support  default: off
31
 * WOLFSSL_QUIC:             Enable QUIC protocol support (TLS 1.3) default: off
32
 * WOLFSSL_DTLS13_NO_HRR_ON_RESUME: Skip HRR on DTLS 1.3 resume   default: off
33
 * WOLFSSL_DTLS_CH_FRAG:     Enable DTLS 1.3 ClientHello frag     default: off
34
 *
35
 * Handshake:
36
 * WOLFSSL_TLS13_MIDDLEBOX_COMPAT: Enable middlebox compatibility  default: on
37
 *                            Sends ChangeCipherSpec and includes session id
38
 * WOLFSSL_SEND_HRR_COOKIE:  Send cookie in HelloRetryRequest     default: off
39
 *                            for stateless ClientHello tracking
40
 * WOLFSSL_EARLY_DATA:       Allow 0-RTT early data                default: off
41
 * WOLFSSL_EARLY_DATA_GROUP: Group early data with ClientHello     default: off
42
 * WOLFSSL_POST_HANDSHAKE_AUTH: Post-handshake client auth         default: off
43
 * WOLFSSL_TLS13_TICKET_BEFORE_FINISHED: Send NewSessionTicket     default: off
44
 *                            before client Finished message
45
 * WOLFSSL_NO_CLIENT_AUTH:   Disable TLS 1.3 client authentication default: off
46
 * WOLFSSL_NO_CLIENT_CERT_ERROR: Require client certificate        default: off
47
 * WOLFSSL_CERT_SETUP_CB:    Certificate setup callback            default: off
48
 * WOLFSSL_ALLOW_BAD_TLS_LEGACY_VERSION: Allow bad legacy version  default: off
49
 *
50
 * Security:
51
 * WOLFSSL_BLIND_PRIVATE_KEY: Blind private key during signing     default: off
52
 * WOLFSSL_CHECK_SIG_FAULTS: Verify signature after ECC signing    default: off
53
 *                            to detect fault injection attacks
54
 * WOLFSSL_CIPHER_TEXT_CHECK: Verify ciphertext integrity          default: off
55
 *
56
 * TLS 1.3 PSK:
57
 * WOLFSSL_PSK_ONE_ID:       Single PSK identity per connect       default: off
58
 * WOLFSSL_PSK_MULTI_ID_PER_CS: Multiple PSK IDs per cipher suite default: off
59
 * WOLFSSL_PRIORITIZE_PSK:   Prioritize PSK over ciphersuite order default: off
60
 * WOLFSSL_PSK_ID_PROTECTION: Enable PSK identity protection       default: off
61
 *
62
 * TLS 1.3 Session Tickets:
63
 * WOLFSSL_TICKET_HAVE_ID:   Session tickets include ID            default: off
64
 *                            Forced on when WOLFSSL_EARLY_DATA is set.
65
 * WOLFSSL_TICKET_NONCE_MALLOC: Dynamically allocate ticket nonce  default: off
66
 *
67
 * TLS 1.3 Key Exchange:
68
 * HAVE_KEYING_MATERIAL:     Export keying material (RFC 8446 7.5) default: off
69
 * WOLFSSL_HAVE_TLS_UNIQUE:  Enable tls-unique channel binding     default: off
70
 *
71
 * TLS 1.3 Hash/Signature:
72
 * WOLFSSL_TLS13_SHA512:     Allow SHA-512 in TLS 1.3 handshake   default: off
73
 *                            (no ciphersuite requires it currently)
74
 * WOLFSSL_ERROR_CODE_OPENSSL: Use OpenSSL-compatible error codes  default: off
75
 * WOLFSSL_SSLKEYLOGFILE_OUTPUT: Set key log output file path      default: off
76
 * WOLFSSL_RW_THREADED:      Enable read/write threading support   default: off
77
 * WOLFSSL_ASYNC_IO:         Enable async I/O operations           default: off
78
 * WOLFSSL_NONBLOCK_OCSP:    Non-blocking OCSP processing          default: off
79
 * WOLFSSL_TLS_OCSP_MULTI:   Multiple OCSP responses               default: off
80
 * WOLFSSL_WOLFSENTRY_HOOKS: wolfSentry integration hooks          default: off
81
 */
82
83
#if !defined(NO_TLS) && defined(WOLFSSL_TLS13)
84
85
/* 0-RTT anti-replay eviction needs the session cache. */
86
#if defined(WOLFSSL_EARLY_DATA) && defined(HAVE_SESSION_TICKET) && \
87
    defined(NO_SESSION_CACHE) && !defined(NO_WOLFSSL_SERVER) && \
88
    !defined(WOLFSSL_EARLY_DATA_NO_ANTI_REPLAY)
89
#error "WOLFSSL_EARLY_DATA with tickets requires !NO_SESSION_CACHE, or " \
90
       "define WOLFSSL_EARLY_DATA_NO_ANTI_REPLAY to opt out."
91
#endif
92
93
#ifndef WOLFCRYPT_ONLY
94
95
#ifdef HAVE_ERRNO_H
96
    #include <errno.h>
97
#endif
98
99
#if defined(__MACH__) || defined(__FreeBSD__) || \
100
    defined(__INCLUDE_NUTTX_CONFIG_H) || defined(WOLFSSL_RIOT_OS)
101
#include <sys/time.h>
102
#endif /* __MACH__ || __FreeBSD__ ||
103
          __INCLUDE_NUTTX_CONFIG_H || WOLFSSL_RIOT_OS */
104
105
106
#include <wolfssl/internal.h>
107
#include <wolfssl/error-ssl.h>
108
#include <wolfssl/wolfcrypt/asn.h>
109
#include <wolfssl/wolfcrypt/dh.h>
110
#include <wolfssl/wolfcrypt/kdf.h>
111
#include <wolfssl/wolfcrypt/signature.h>
112
#ifdef NO_INLINE
113
    #include <wolfssl/wolfcrypt/misc.h>
114
#else
115
    #define WOLFSSL_MISC_INCLUDED
116
    #include <wolfcrypt/src/misc.c>
117
#endif
118
119
#ifdef __sun
120
    #include <sys/filio.h>
121
#endif
122
123
#ifndef TRUE
124
    #define TRUE  1
125
#endif
126
#ifndef FALSE
127
    #define FALSE 0
128
#endif
129
130
#ifndef HAVE_AEAD
131
    #if !defined(_MSC_VER) && !defined(__TASKING__)
132
        #error "The build option HAVE_AEAD is required for TLS 1.3"
133
    #else
134
        #pragma \
135
        message("error: The build option HAVE_AEAD is required for TLS 1.3")
136
    #endif
137
#endif
138
139
#ifndef HAVE_HKDF
140
    #if !defined(_MSC_VER) && !defined(__TASKING__)
141
        #error "The build option HAVE_HKDF is required for TLS 1.3"
142
    #else
143
        #pragma message("error: The build option HAVE_HKDF is required for TLS 1.3")
144
    #endif
145
#endif
146
147
#ifndef HAVE_TLS_EXTENSIONS
148
    #if !defined(_MSC_VER) && !defined(__TASKING__)
149
        #error "The build option HAVE_TLS_EXTENSIONS is required for TLS 1.3"
150
    #else
151
        #pragma message("error: The build option HAVE_TLS_EXTENSIONS is required for TLS 1.3")
152
    #endif
153
#endif
154
155
156
/* Set ret to error value and jump to label.
157
 *
158
 * err     The error value to set.
159
 * eLabel  The label to jump to.
160
 */
161
0
#define ERROR_OUT(err, eLabel) { ret = (err); goto eLabel; }
162
163
/* Size of the TLS v1.3 label use when deriving keys. */
164
0
#define TLS13_PROTOCOL_LABEL_SZ    6
165
/* The protocol label for TLS v1.3. */
166
static const byte tls13ProtocolLabel[TLS13_PROTOCOL_LABEL_SZ + 1] = "tls13 ";
167
168
#ifdef WOLFSSL_DTLS13
169
#define DTLS13_PROTOCOL_LABEL_SZ    6
170
static const byte dtls13ProtocolLabel[DTLS13_PROTOCOL_LABEL_SZ + 1] = "dtls13";
171
#endif /* WOLFSSL_DTLS13 */
172
173
#if defined(HAVE_ECH)
174
#define ECH_ACCEPT_CONFIRMATION_LABEL_SZ 23
175
#define ECH_HRR_ACCEPT_CONFIRMATION_LABEL_SZ 27
176
static const byte
177
    echAcceptConfirmationLabel[ECH_ACCEPT_CONFIRMATION_LABEL_SZ + 1] =
178
    "ech accept confirmation";
179
static const byte
180
    echHrrAcceptConfirmationLabel[ECH_HRR_ACCEPT_CONFIRMATION_LABEL_SZ + 1] =
181
    "hrr ech accept confirmation";
182
#endif
183
184
#ifndef NO_CERTS
185
#if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
186
    defined(HAVE_ED448) || defined(HAVE_FALCON) || defined(HAVE_DILITHIUM)
187
188
static WC_INLINE int GetMsgHash(WOLFSSL* ssl, byte* hash);
189
190
#endif
191
#endif
192
193
/* Expand data using HMAC, salt and label and info.
194
 * TLS v1.3 defines this function. Use callback if available. */
195
static int Tls13HKDFExpandLabel(WOLFSSL* ssl, byte* okm, word32 okmLen,
196
                                const byte* prk, word32 prkLen,
197
                                const byte* protocol, word32 protocolLen,
198
                                const byte* label, word32 labelLen,
199
                                const byte* info, word32 infoLen,
200
                                int digest)
201
3.15k
{
202
3.15k
    int ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN);
203
204
#if defined(HAVE_PK_CALLBACKS)
205
    if (ssl->ctx && ssl->ctx->HKDFExpandLabelCb) {
206
        ret = ssl->ctx->HKDFExpandLabelCb(okm, okmLen, prk, prkLen,
207
                                          protocol, protocolLen,
208
                                          label, labelLen,
209
                                          info, infoLen, digest,
210
                                          WOLFSSL_CLIENT_END /* ignored */);
211
    }
212
213
    if (ret != WC_NO_ERR_TRACE(NOT_COMPILED_IN))
214
        return ret;
215
#endif
216
3.15k
    (void)ssl;
217
3.15k
    PRIVATE_KEY_UNLOCK();
218
3.15k
#if !defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(6,0))
219
3.15k
    ret = wc_Tls13_HKDF_Expand_Label_ex(okm, okmLen, prk, prkLen,
220
3.15k
                                     protocol, protocolLen,
221
3.15k
                                     label, labelLen,
222
3.15k
                                     info, infoLen, digest,
223
3.15k
                                     ssl->heap, ssl->devId);
224
#else
225
    ret = wc_Tls13_HKDF_Expand_Label(okm, okmLen, prk, prkLen,
226
                                     protocol, protocolLen,
227
                                     label, labelLen,
228
                                     info, infoLen, digest);
229
#endif
230
3.15k
    PRIVATE_KEY_LOCK();
231
3.15k
    return ret;
232
3.15k
}
233
234
/* Same as above, but pass in the side we are expanding for:
235
 * side: either WOLFSSL_CLIENT_END or WOLFSSL_SERVER_END.
236
 */
237
static int Tls13HKDFExpandKeyLabel(WOLFSSL* ssl, byte* okm, word32 okmLen,
238
                                   const byte* prk, word32 prkLen,
239
                                   const byte* protocol, word32 protocolLen,
240
                                   const byte* label, word32 labelLen,
241
                                   const byte* info, word32 infoLen,
242
                                   int digest, int side)
243
4.44k
{
244
4.44k
    int ret;
245
#if defined(HAVE_PK_CALLBACKS)
246
    ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN);
247
    if (ssl->ctx && ssl->ctx->HKDFExpandLabelCb) {
248
        ret = ssl->ctx->HKDFExpandLabelCb(okm, okmLen, prk, prkLen,
249
                                         protocol, protocolLen,
250
                                         label, labelLen,
251
                                         info, infoLen,
252
                                         digest, side);
253
    }
254
    if (ret != WC_NO_ERR_TRACE(NOT_COMPILED_IN))
255
        return ret;
256
#endif
257
258
4.44k
#if !defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(6,0))
259
4.44k
    ret = wc_Tls13_HKDF_Expand_Label_ex(okm, okmLen, prk, prkLen,
260
4.44k
                                      protocol, protocolLen,
261
4.44k
                                      label, labelLen,
262
4.44k
                                      info, infoLen, digest,
263
4.44k
                                      ssl->heap, ssl->devId);
264
265
#elif defined(HAVE_FIPS) && defined(wc_Tls13_HKDF_Expand_Label)
266
    ret = wc_Tls13_HKDF_Expand_Label_fips(okm, okmLen, prk, prkLen,
267
                                      protocol, protocolLen,
268
                                      label, labelLen,
269
                                      info, infoLen, digest);
270
#else
271
    ret = wc_Tls13_HKDF_Expand_Label(okm, okmLen, prk, prkLen,
272
                                      protocol, protocolLen,
273
                                      label, labelLen,
274
                                      info, infoLen, digest);
275
#endif
276
4.44k
    (void)ssl;
277
4.44k
    (void)side;
278
4.44k
    return ret;
279
4.44k
}
280
281
282
/* Derive a key from a message.
283
 *
284
 * ssl        The SSL/TLS object.
285
 * output     The buffer to hold the derived key.
286
 * outputLen  The length of the derived key.
287
 * secret     The secret used to derive the key (HMAC secret).
288
 * label      The label used to distinguish the context.
289
 * labelLen   The length of the label.
290
 * msg        The message data to derive key from.
291
 * msgLen     The length of the message data to derive key from.
292
 * hashAlgo   The hash algorithm to use in the HMAC.
293
 * returns 0 on success, otherwise failure.
294
 */
295
static int DeriveKeyMsg(WOLFSSL* ssl, byte* output, int outputLen,
296
                        const byte* secret, const byte* label, word32 labelLen,
297
                        byte* msg, int msgLen, int hashAlgo)
298
{
299
    byte        hash[WC_MAX_DIGEST_SIZE];
300
    Digest      digest;
301
    word32      hashSz = 0;
302
    const byte* protocol;
303
    word32      protocolLen;
304
    int         digestAlg = -1;
305
    int         ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
306
307
    switch (hashAlgo) {
308
#ifndef NO_SHA256
309
        case sha256_mac:
310
            ret = wc_InitSha256_ex(&digest.sha256, ssl->heap, ssl->devId);
311
            if (ret == 0) {
312
                    ret = wc_Sha256Update(&digest.sha256, msg, (word32)msgLen);
313
                if (ret == 0)
314
                    ret = wc_Sha256Final(&digest.sha256, hash);
315
                wc_Sha256Free(&digest.sha256);
316
            }
317
            hashSz = WC_SHA256_DIGEST_SIZE;
318
            digestAlg = WC_SHA256;
319
            break;
320
#endif
321
#ifdef WOLFSSL_SHA384
322
        case sha384_mac:
323
            ret = wc_InitSha384_ex(&digest.sha384, ssl->heap, ssl->devId);
324
            if (ret == 0) {
325
                ret = wc_Sha384Update(&digest.sha384, msg, (word32)msgLen);
326
                if (ret == 0)
327
                    ret = wc_Sha384Final(&digest.sha384, hash);
328
                wc_Sha384Free(&digest.sha384);
329
            }
330
            hashSz = WC_SHA384_DIGEST_SIZE;
331
            digestAlg = WC_SHA384;
332
            break;
333
#endif
334
#ifdef WOLFSSL_TLS13_SHA512
335
        case sha512_mac:
336
            ret = wc_InitSha512_ex(&digest.sha512, ssl->heap, ssl->devId);
337
            if (ret == 0) {
338
                ret = wc_Sha512Update(&digest.sha512, msg, (word32)msgLen);
339
                if (ret == 0)
340
                    ret = wc_Sha512Final(&digest.sha512, hash);
341
                wc_Sha512Free(&digest.sha512);
342
            }
343
            hashSz = WC_SHA512_DIGEST_SIZE;
344
            digestAlg = WC_SHA512;
345
            break;
346
#endif
347
#ifdef WOLFSSL_SM3
348
        case sm3_mac:
349
            ret = wc_InitSm3(&digest.sm3, ssl->heap, ssl->devId);
350
            if (ret == 0) {
351
                ret = wc_Sm3Update(&digest.sm3, msg, (word32)msgLen);
352
                if (ret == 0)
353
                    ret = wc_Sm3Final(&digest.sm3, hash);
354
                wc_Sm3Free(&digest.sm3);
355
            }
356
            hashSz = WC_SM3_DIGEST_SIZE;
357
            digestAlg = WC_SM3;
358
            break;
359
#endif
360
        default:
361
            ret = BAD_FUNC_ARG;
362
            digestAlg = -1;
363
            break;
364
    }
365
366
    if (digestAlg < 0)
367
        return HASH_TYPE_E;
368
369
    if (ret != 0)
370
        return ret;
371
372
    switch (ssl->version.minor) {
373
        case TLSv1_3_MINOR:
374
            protocol = tls13ProtocolLabel;
375
            protocolLen = TLS13_PROTOCOL_LABEL_SZ;
376
            break;
377
#ifdef WOLFSSL_DTLS13
378
        case DTLSv1_3_MINOR:
379
            if (!ssl->options.dtls)
380
                return VERSION_ERROR;
381
382
            protocol = dtls13ProtocolLabel;
383
            protocolLen = DTLS13_PROTOCOL_LABEL_SZ;
384
            break;
385
#endif /* WOLFSSL_DTLS13 */
386
        default:
387
            return VERSION_ERROR;
388
    }
389
    if (outputLen == -1)
390
        outputLen = (int)hashSz;
391
392
    ret = Tls13HKDFExpandLabel(ssl, output, (word32)outputLen, secret, hashSz,
393
                               protocol, protocolLen, label, labelLen,
394
                               hash, hashSz, digestAlg);
395
    return ret;
396
}
397
398
/* Derive a key.
399
 *
400
 * ssl          The SSL/TLS object.
401
 * output       The buffer to hold the derived key.
402
 * outputLen    The length of the derived key.
403
 * secret       The secret used to derive the key (HMAC secret).
404
 * label        The label used to distinguish the context.
405
 * labelLen     The length of the label.
406
 * hashAlgo     The hash algorithm to use in the HMAC.
407
 * includeMsgs  Whether to include a hash of the handshake messages so far.
408
 * side         The side that we are deriving the secret for.
409
 * returns 0 on success, otherwise failure.
410
 */
411
int Tls13DeriveKey(WOLFSSL* ssl, byte* output, int outputLen,
412
                   const byte* secret, const byte* label, word32 labelLen,
413
                   int hashAlgo, int includeMsgs, int side)
414
0
{
415
0
    int         ret = 0;
416
0
    byte        hash[WC_MAX_DIGEST_SIZE];
417
0
    word32      hashSz = 0;
418
0
    word32      hashOutSz = 0;
419
0
    const byte* protocol;
420
0
    word32      protocolLen;
421
0
    int         digestAlg = 0;
422
423
424
0
    switch (hashAlgo) {
425
0
    #ifndef NO_SHA256
426
0
        case sha256_mac:
427
0
            hashSz    = WC_SHA256_DIGEST_SIZE;
428
0
            digestAlg = WC_SHA256;
429
0
            if (includeMsgs)
430
0
                ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
431
0
            break;
432
0
    #endif
433
434
0
    #ifdef WOLFSSL_SHA384
435
0
        case sha384_mac:
436
0
            hashSz    = WC_SHA384_DIGEST_SIZE;
437
0
            digestAlg = WC_SHA384;
438
0
            if (includeMsgs)
439
0
                ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
440
0
            break;
441
0
    #endif
442
443
    #ifdef WOLFSSL_TLS13_SHA512
444
        case sha512_mac:
445
            hashSz    = WC_SHA512_DIGEST_SIZE;
446
            digestAlg = WC_SHA512;
447
            if (includeMsgs)
448
                ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512, hash);
449
            break;
450
    #endif
451
452
0
    #ifdef WOLFSSL_SM3
453
0
        case sm3_mac:
454
0
            hashSz    = WC_SM3_DIGEST_SIZE;
455
0
            digestAlg = WC_SM3;
456
0
            if (includeMsgs)
457
0
                ret = wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash);
458
0
            break;
459
0
    #endif
460
461
0
        default:
462
0
            ret = HASH_TYPE_E;
463
0
            break;
464
0
    }
465
0
    if (ret != 0)
466
0
        return ret;
467
468
0
    protocol = tls13ProtocolLabel;
469
0
    protocolLen = TLS13_PROTOCOL_LABEL_SZ;
470
471
#ifdef WOLFSSL_DTLS13
472
    if (ssl->options.dtls) {
473
         protocol = dtls13ProtocolLabel;
474
         protocolLen = DTLS13_PROTOCOL_LABEL_SZ;
475
    }
476
#endif /* WOLFSSL_DTLS13 */
477
478
0
    if (outputLen == -1) {
479
0
        outputLen = (int)hashSz;
480
0
    }
481
0
    if (includeMsgs) {
482
0
        hashOutSz = hashSz;
483
0
    }
484
0
    else {
485
        /* Appease static analyzers by making sure hash is cleared, since it is
486
         * passed into expand key label where older wc_Tls13_HKDF_Expand_Label
487
         * will unconditionally try to call a memcpy on it, however length will
488
         * always be 0. */
489
0
        XMEMSET(hash, 0, sizeof(hash));
490
0
        hashOutSz = 0;
491
0
    }
492
493
0
    PRIVATE_KEY_UNLOCK();
494
0
    ret = Tls13HKDFExpandKeyLabel(ssl, output, (word32)outputLen, secret, hashSz,
495
0
                                  protocol, protocolLen, label, labelLen,
496
0
                                  hash, hashOutSz, digestAlg, side);
497
0
    PRIVATE_KEY_LOCK();
498
499
#ifdef WOLFSSL_CHECK_MEM_ZERO
500
    wc_MemZero_Add("TLS 1.3 derived key", output, outputLen);
501
#endif
502
0
    return ret;
503
0
}
504
505
/* Convert TLS mac ID to a hash algorithm ID
506
 *
507
 * mac Mac ID to convert
508
 * returns hash ID on success, or the NONE type.
509
 */
510
static WC_INLINE int mac2hash(int mac)
511
{
512
    int hash;
513
    switch (mac) {
514
        #ifndef NO_SHA256
515
        case sha256_mac:
516
            hash = WC_SHA256;
517
            break;
518
        #endif
519
520
        #ifdef WOLFSSL_SHA384
521
        case sha384_mac:
522
            hash = WC_SHA384;
523
            break;
524
        #endif
525
526
        #ifdef WOLFSSL_TLS13_SHA512
527
        case sha512_mac:
528
            hash = WC_SHA512;
529
            break;
530
        #endif
531
532
        #ifdef WOLFSSL_SM3
533
        case sm3_mac:
534
            hash = WC_SM3;
535
            break;
536
        #endif
537
538
    default:
539
        hash = WC_HASH_TYPE_NONE;
540
    }
541
    return hash;
542
}
543
544
#ifndef NO_PSK
545
/* The length of the binder key label. */
546
#define BINDER_KEY_LABEL_SZ         10
547
/* The binder key label. */
548
static const byte binderKeyLabel[BINDER_KEY_LABEL_SZ + 1] =
549
    "ext binder";
550
551
/* Derive the binder key.
552
 *
553
 * ssl  The SSL/TLS object.
554
 * key  The derived key.
555
 * returns 0 on success, otherwise failure.
556
 */
557
static int DeriveBinderKey(WOLFSSL* ssl, byte* key)
558
{
559
    WOLFSSL_MSG("Derive Binder Key");
560
    if (ssl == NULL || ssl->arrays == NULL) {
561
        return BAD_FUNC_ARG;
562
    }
563
    return DeriveKeyMsg(ssl, key, -1, ssl->arrays->secret,
564
                        binderKeyLabel, BINDER_KEY_LABEL_SZ,
565
                        NULL, 0, ssl->specs.mac_algorithm);
566
}
567
#endif /* !NO_PSK */
568
569
#if defined(HAVE_SESSION_TICKET) && \
570
    (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER))
571
/* The length of the binder key resume label. */
572
0
#define BINDER_KEY_RESUME_LABEL_SZ  10
573
/* The binder key resume label. */
574
static const byte binderKeyResumeLabel[BINDER_KEY_RESUME_LABEL_SZ + 1] =
575
    "res binder";
576
577
/* Derive the binder resumption key.
578
 *
579
 * ssl  The SSL/TLS object.
580
 * key  The derived key.
581
 * returns 0 on success, otherwise failure.
582
 */
583
static int DeriveBinderKeyResume(WOLFSSL* ssl, byte* key)
584
0
{
585
0
    WOLFSSL_MSG("Derive Binder Key - Resumption");
586
0
    if (ssl == NULL || ssl->arrays == NULL) {
587
0
        return BAD_FUNC_ARG;
588
0
    }
589
0
    return DeriveKeyMsg(ssl, key, -1, ssl->arrays->secret,
590
0
                        binderKeyResumeLabel, BINDER_KEY_RESUME_LABEL_SZ,
591
0
                        NULL, 0, ssl->specs.mac_algorithm);
592
0
}
593
#endif /* HAVE_SESSION_TICKET && (!NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER) */
594
595
#ifdef WOLFSSL_EARLY_DATA
596
597
/* The length of the early traffic label. */
598
#define EARLY_TRAFFIC_LABEL_SZ      11
599
/* The early traffic label. */
600
static const byte earlyTrafficLabel[EARLY_TRAFFIC_LABEL_SZ + 1] =
601
    "c e traffic";
602
603
/* Derive the early traffic key.
604
 *
605
 * ssl  The SSL/TLS object.
606
 * key  The derived key.
607
 * side The side that we are deriving the secret for.
608
 * returns 0 on success, otherwise failure.
609
 */
610
static int DeriveEarlyTrafficSecret(WOLFSSL* ssl, byte* key, int side)
611
{
612
    int ret;
613
    WOLFSSL_MSG("Derive Early Traffic Secret");
614
    if (ssl == NULL || ssl->arrays == NULL) {
615
        return BAD_FUNC_ARG;
616
    }
617
618
#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
619
    /* If this is called from a sniffer session with keylog file support,
620
     * obtain the appropriate secret from the callback */
621
    if (ssl->snifferSecretCb != NULL) {
622
        return ssl->snifferSecretCb(ssl->arrays->clientRandom,
623
                                    SNIFFER_SECRET_CLIENT_EARLY_TRAFFIC_SECRET,
624
                                    key);
625
    }
626
#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
627
628
    ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->secret,
629
                    earlyTrafficLabel, EARLY_TRAFFIC_LABEL_SZ,
630
                    ssl->specs.mac_algorithm, 1, side);
631
#ifdef HAVE_SECRET_CALLBACK
632
    if (ret == 0 && ssl->tls13SecretCb != NULL) {
633
        ret = ssl->tls13SecretCb(ssl, CLIENT_EARLY_TRAFFIC_SECRET, key,
634
                                 ssl->specs.hash_size, ssl->tls13SecretCtx);
635
        if (ret != 0) {
636
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
637
            return TLS13_SECRET_CB_E;
638
        }
639
    }
640
#ifdef OPENSSL_EXTRA
641
    if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
642
        ret = ssl->tls13KeyLogCb(ssl, CLIENT_EARLY_TRAFFIC_SECRET, key,
643
                                ssl->specs.hash_size, NULL);
644
        if (ret != 0) {
645
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
646
            return TLS13_SECRET_CB_E;
647
        }
648
    }
649
#endif /* OPENSSL_EXTRA */
650
#endif /* HAVE_SECRET_CALLBACK */
651
    return ret;
652
}
653
654
#endif
655
656
/* The length of the client handshake label. */
657
117
#define CLIENT_HANDSHAKE_LABEL_SZ   12
658
/* The client handshake label. */
659
static const byte clientHandshakeLabel[CLIENT_HANDSHAKE_LABEL_SZ + 1] =
660
    "c hs traffic";
661
662
/* Derive the client handshake key.
663
 *
664
 * ssl  The SSL/TLS object.
665
 * key  The derived key.
666
 * returns 0 on success, otherwise failure.
667
 */
668
static int DeriveClientHandshakeSecret(WOLFSSL* ssl, byte* key)
669
117
{
670
117
    int ret;
671
117
    WOLFSSL_MSG("Derive Client Handshake Secret");
672
117
    if (ssl == NULL || ssl->arrays == NULL) {
673
0
        return BAD_FUNC_ARG;
674
0
    }
675
676
#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
677
    /* If this is called from a sniffer session with keylog file support,
678
     * obtain the appropriate secret from the callback */
679
    if (ssl->snifferSecretCb != NULL) {
680
        return ssl->snifferSecretCb(ssl->arrays->clientRandom,
681
                               SNIFFER_SECRET_CLIENT_HANDSHAKE_TRAFFIC_SECRET,
682
                               key);
683
    }
684
#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
685
686
117
    ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->preMasterSecret,
687
117
                    clientHandshakeLabel, CLIENT_HANDSHAKE_LABEL_SZ,
688
117
                    ssl->specs.mac_algorithm, 1, WOLFSSL_CLIENT_END);
689
#ifdef HAVE_SECRET_CALLBACK
690
    if (ret == 0 && ssl->tls13SecretCb != NULL) {
691
        ret = ssl->tls13SecretCb(ssl, CLIENT_HANDSHAKE_TRAFFIC_SECRET, key,
692
                                 ssl->specs.hash_size, ssl->tls13SecretCtx);
693
        if (ret != 0) {
694
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
695
            return TLS13_SECRET_CB_E;
696
        }
697
    }
698
#ifdef OPENSSL_EXTRA
699
    if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
700
        ret = ssl->tls13KeyLogCb(ssl, CLIENT_HANDSHAKE_TRAFFIC_SECRET, key,
701
                                ssl->specs.hash_size, NULL);
702
        if (ret != 0) {
703
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
704
            return TLS13_SECRET_CB_E;
705
        }
706
    }
707
#endif /* OPENSSL_EXTRA */
708
#endif /* HAVE_SECRET_CALLBACK */
709
117
    return ret;
710
117
}
711
712
/* The length of the server handshake label. */
713
117
#define SERVER_HANDSHAKE_LABEL_SZ   12
714
/* The server handshake label. */
715
static const byte serverHandshakeLabel[SERVER_HANDSHAKE_LABEL_SZ + 1] =
716
    "s hs traffic";
717
718
/* Derive the server handshake key.
719
 *
720
 * ssl  The SSL/TLS object.
721
 * key  The derived key.
722
 * returns 0 on success, otherwise failure.
723
 */
724
static int DeriveServerHandshakeSecret(WOLFSSL* ssl, byte* key)
725
117
{
726
117
    int ret;
727
117
    WOLFSSL_MSG("Derive Server Handshake Secret");
728
117
    if (ssl == NULL || ssl->arrays == NULL) {
729
0
        return BAD_FUNC_ARG;
730
0
    }
731
732
#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
733
    /* If this is called from a sniffer session with keylog file support,
734
     * obtain the appropriate secret from the callback */
735
    if (ssl->snifferSecretCb != NULL) {
736
        return ssl->snifferSecretCb(ssl->arrays->clientRandom,
737
                                SNIFFER_SECRET_SERVER_HANDSHAKE_TRAFFIC_SECRET,
738
                                key);
739
    }
740
#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
741
742
117
    ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->preMasterSecret,
743
117
                    serverHandshakeLabel, SERVER_HANDSHAKE_LABEL_SZ,
744
117
                    ssl->specs.mac_algorithm, 1, WOLFSSL_SERVER_END);
745
746
#ifdef HAVE_SECRET_CALLBACK
747
    if (ret == 0 && ssl->tls13SecretCb != NULL) {
748
        ret = ssl->tls13SecretCb(ssl, SERVER_HANDSHAKE_TRAFFIC_SECRET, key,
749
                                 ssl->specs.hash_size, ssl->tls13SecretCtx);
750
        if (ret != 0) {
751
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
752
            return TLS13_SECRET_CB_E;
753
        }
754
    }
755
#ifdef OPENSSL_EXTRA
756
    if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
757
        ret = ssl->tls13KeyLogCb(ssl, SERVER_HANDSHAKE_TRAFFIC_SECRET, key,
758
                                ssl->specs.hash_size, NULL);
759
        if (ret != 0) {
760
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
761
            return TLS13_SECRET_CB_E;
762
        }
763
    }
764
#endif /* OPENSSL_EXTRA */
765
#endif /* HAVE_SECRET_CALLBACK */
766
117
    return ret;
767
117
}
768
769
/* The length of the client application traffic label. */
770
113
#define CLIENT_APP_LABEL_SZ         12
771
/* The client application traffic label. */
772
static const byte clientAppLabel[CLIENT_APP_LABEL_SZ + 1] =
773
    "c ap traffic";
774
775
/* Derive the client application traffic key.
776
 *
777
 * ssl  The SSL/TLS object.
778
 * key  The derived key.
779
 * returns 0 on success, otherwise failure.
780
 */
781
static int DeriveClientTrafficSecret(WOLFSSL* ssl, byte* key)
782
113
{
783
113
    int ret;
784
113
    WOLFSSL_MSG("Derive Client Traffic Secret");
785
113
    if (ssl == NULL || ssl->arrays == NULL) {
786
0
        return BAD_FUNC_ARG;
787
0
    }
788
789
#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
790
    /* If this is called from a sniffer session with keylog file support,
791
     * obtain the appropriate secret from the callback */
792
    if (ssl->snifferSecretCb != NULL) {
793
        return ssl->snifferSecretCb(ssl->arrays->clientRandom,
794
                                    SNIFFER_SECRET_CLIENT_TRAFFIC_SECRET,
795
                                    key);
796
    }
797
#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
798
799
113
    ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->masterSecret,
800
113
                    clientAppLabel, CLIENT_APP_LABEL_SZ,
801
113
                    ssl->specs.mac_algorithm, 1, WOLFSSL_CLIENT_END);
802
803
#ifdef HAVE_SECRET_CALLBACK
804
    if (ret == 0 && ssl->tls13SecretCb != NULL) {
805
        ret = ssl->tls13SecretCb(ssl, CLIENT_TRAFFIC_SECRET, key,
806
                                 ssl->specs.hash_size, ssl->tls13SecretCtx);
807
        if (ret != 0) {
808
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
809
            return TLS13_SECRET_CB_E;
810
        }
811
    }
812
#ifdef OPENSSL_EXTRA
813
    if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
814
        ret = ssl->tls13KeyLogCb(ssl, CLIENT_TRAFFIC_SECRET, key,
815
                                ssl->specs.hash_size, NULL);
816
        if (ret != 0) {
817
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
818
            return TLS13_SECRET_CB_E;
819
        }
820
    }
821
#endif /* OPENSSL_EXTRA */
822
#endif /* HAVE_SECRET_CALLBACK */
823
113
    return ret;
824
113
}
825
826
/* The length of the server application traffic label. */
827
113
#define SERVER_APP_LABEL_SZ         12
828
/* The  server application traffic label. */
829
static const byte serverAppLabel[SERVER_APP_LABEL_SZ + 1] =
830
    "s ap traffic";
831
832
/* Derive the server application traffic key.
833
 *
834
 * ssl  The SSL/TLS object.
835
 * key  The derived key.
836
 * returns 0 on success, otherwise failure.
837
 */
838
static int DeriveServerTrafficSecret(WOLFSSL* ssl, byte* key)
839
113
{
840
113
    int ret;
841
113
    WOLFSSL_MSG("Derive Server Traffic Secret");
842
113
    if (ssl == NULL || ssl->arrays == NULL) {
843
0
        return BAD_FUNC_ARG;
844
0
    }
845
846
#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
847
    /* If this is called from a sniffer session with keylog file support,
848
     * obtain the appropriate secret from the callback */
849
    if (ssl->snifferSecretCb != NULL) {
850
        return ssl->snifferSecretCb(ssl->arrays->clientRandom,
851
                                    SNIFFER_SECRET_SERVER_TRAFFIC_SECRET,
852
                                    key);
853
    }
854
#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
855
856
113
    ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->masterSecret,
857
113
                    serverAppLabel, SERVER_APP_LABEL_SZ,
858
113
                    ssl->specs.mac_algorithm, 1, WOLFSSL_SERVER_END);
859
860
#ifdef HAVE_SECRET_CALLBACK
861
    if (ret == 0 && ssl->tls13SecretCb != NULL) {
862
        ret = ssl->tls13SecretCb(ssl, SERVER_TRAFFIC_SECRET, key,
863
                                 ssl->specs.hash_size, ssl->tls13SecretCtx);
864
        if (ret != 0) {
865
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
866
            return TLS13_SECRET_CB_E;
867
        }
868
    }
869
#ifdef OPENSSL_EXTRA
870
    if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
871
        ret = ssl->tls13KeyLogCb(ssl, SERVER_TRAFFIC_SECRET, key,
872
                                ssl->specs.hash_size, NULL);
873
        if (ret != 0) {
874
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
875
            return TLS13_SECRET_CB_E;
876
        }
877
    }
878
#endif /* OPENSSL_EXTRA */
879
#endif /* HAVE_SECRET_CALLBACK */
880
113
    return ret;
881
113
}
882
883
#ifdef HAVE_KEYING_MATERIAL
884
/* The length of the exporter master secret label. */
885
#define EXPORTER_MASTER_LABEL_SZ    10
886
/* The exporter master secret label. */
887
static const byte exporterMasterLabel[EXPORTER_MASTER_LABEL_SZ + 1] =
888
    "exp master";
889
890
/* Derive the exporter secret.
891
 *
892
 * ssl  The SSL/TLS object.
893
 * key  The derived key.
894
 * returns 0 on success, otherwise failure.
895
 */
896
static int DeriveExporterSecret(WOLFSSL* ssl, byte* key)
897
{
898
    int ret;
899
    WOLFSSL_ENTER("Derive Exporter Secret");
900
    if (ssl == NULL || ssl->arrays == NULL) {
901
        return BAD_FUNC_ARG;
902
    }
903
    ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->masterSecret,
904
                        exporterMasterLabel, EXPORTER_MASTER_LABEL_SZ,
905
                        ssl->specs.mac_algorithm, 1, 0 /* Unused */);
906
#ifdef HAVE_SECRET_CALLBACK
907
    if (ret == 0 && ssl->tls13SecretCb != NULL) {
908
        ret = ssl->tls13SecretCb(ssl, EXPORTER_SECRET, key,
909
                                 ssl->specs.hash_size, ssl->tls13SecretCtx);
910
        if (ret != 0) {
911
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
912
            return TLS13_SECRET_CB_E;
913
        }
914
    }
915
#ifdef OPENSSL_EXTRA
916
    if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
917
        ret = ssl->tls13KeyLogCb(ssl, EXPORTER_SECRET, key,
918
                                ssl->specs.hash_size, NULL);
919
        if (ret != 0) {
920
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
921
            return TLS13_SECRET_CB_E;
922
        }
923
    }
924
#endif /* OPENSSL_EXTRA */
925
#endif /* HAVE_SECRET_CALLBACK */
926
    return ret;
927
}
928
929
/* The length of the exporter label. */
930
#define EXPORTER_LABEL_SZ    8
931
/* The exporter label. */
932
static const byte exporterLabel[EXPORTER_LABEL_SZ + 1] =
933
    "exporter";
934
/* Hash("") */
935
#ifndef NO_SHA256
936
static const byte emptySHA256Hash[] = {
937
    0xE3, 0xB0, 0xC4, 0x42, 0x98, 0xFC, 0x1C, 0x14, 0x9A, 0xFB, 0xF4, 0xC8,
938
    0x99, 0x6F, 0xB9, 0x24, 0x27, 0xAE, 0x41, 0xE4, 0x64, 0x9B, 0x93, 0x4C,
939
    0xA4, 0x95, 0x99, 0x1B, 0x78, 0x52, 0xB8, 0x55
940
};
941
#endif
942
#ifdef WOLFSSL_SHA384
943
static const byte emptySHA384Hash[] = {
944
    0x38, 0xB0, 0x60, 0xA7, 0x51, 0xAC, 0x96, 0x38, 0x4C, 0xD9, 0x32, 0x7E,
945
    0xB1, 0xB1, 0xE3, 0x6A, 0x21, 0xFD, 0xB7, 0x11, 0x14, 0xBE, 0x07, 0x43,
946
    0x4C, 0x0C, 0xC7, 0xBF, 0x63, 0xF6, 0xE1, 0xDA, 0x27, 0x4E, 0xDE, 0xBF,
947
    0xE7, 0x6F, 0x65, 0xFB, 0xD5, 0x1A, 0xD2, 0xF1, 0x48, 0x98, 0xB9, 0x5B
948
};
949
#endif
950
#ifdef WOLFSSL_TLS13_SHA512
951
static const byte emptySHA512Hash[] = {
952
    0xCF, 0x83, 0xE1, 0x35, 0x7E, 0xEF, 0xB8, 0xBD, 0xF1, 0x54, 0x28, 0x50,
953
    0xD6, 0x6D, 0x80, 0x07, 0xD6, 0x20, 0xE4, 0x05, 0x0B, 0x57, 0x15, 0xDC,
954
    0x83, 0xF4, 0xA9, 0x21, 0xD3, 0x6C, 0xE9, 0xCE, 0x47, 0xD0, 0xD1, 0x3C,
955
    0x5D, 0x85, 0xF2, 0xB0, 0xFF, 0x83, 0x18, 0xD2, 0x87, 0x7E, 0xEC, 0x2F,
956
    0x63, 0xB9, 0x31, 0xBD, 0x47, 0x41, 0x7A, 0x81, 0xA5, 0x38, 0x32, 0x7A,
957
    0xF9, 0x27, 0xDA, 0x3E
958
};
959
#endif
960
#ifdef WOLFSSL_SM3
961
static const byte emptySM3Hash[] = {
962
    0x1A, 0xB2, 0x1D, 0x83, 0x55, 0xCF, 0xA1, 0x7F, 0x8E, 0x61, 0x19, 0x48,
963
    0x31, 0xE8, 0x1A, 0x8F, 0x22, 0xBE, 0xC8, 0xC7, 0x28, 0xFE, 0xFB, 0x74,
964
    0x7E, 0xD0, 0x35, 0xEB, 0x50, 0x82, 0xAA, 0x2B
965
};
966
#endif
967
/**
968
 * Implement section 7.5 of RFC 8446
969
 * @return  0 on success
970
 *         <0 on failure
971
 */
972
int Tls13_Exporter(WOLFSSL* ssl, unsigned char *out, size_t outLen,
973
        const char *label, size_t labelLen,
974
        const unsigned char *context, size_t contextLen)
975
{
976
    int                 ret;
977
    enum wc_HashType    hashType = WC_HASH_TYPE_NONE;
978
    word32              hashLen = 0;
979
    byte                hashOut[WC_MAX_DIGEST_SIZE];
980
    const byte*         emptyHash = NULL;
981
    byte                firstExpand[WC_MAX_DIGEST_SIZE];
982
    const byte*         protocol = tls13ProtocolLabel;
983
    word32              protocolLen = TLS13_PROTOCOL_LABEL_SZ;
984
985
    if (ssl->options.dtls && ssl->version.minor != DTLSv1_3_MINOR)
986
        return VERSION_ERROR;
987
988
    if (!ssl->options.dtls && ssl->version.minor != TLSv1_3_MINOR)
989
        return VERSION_ERROR;
990
991
#ifdef WOLFSSL_DTLS13
992
    if (ssl->options.dtls) {
993
        protocol = dtls13ProtocolLabel;
994
        protocolLen = DTLS13_PROTOCOL_LABEL_SZ;
995
    }
996
#endif /* WOLFSSL_DTLS13 */
997
998
    /* Sanity check contextLen to prevent truncation when cast to word32. */
999
    if (contextLen > WOLFSSL_MAX_32BIT)
1000
        return BAD_FUNC_ARG;
1001
    /* RFC 8446 HkdfLabel encodes the output length as a uint16, so requested
1002
     * lengths > 65535 cannot be represented and must be rejected. */
1003
    if (outLen > WOLFSSL_MAX_16BIT)
1004
        return BAD_FUNC_ARG;
1005
    /* RFC 8446 HkdfLabel encodes the label length in a single byte, so
1006
     * anything > 255 cannot be represented and must be rejected.
1007
     * The protocol length is included in the label. */
1008
    if ((labelLen +  protocolLen) > WOLFSSL_MAX_8BIT)
1009
        return BAD_FUNC_ARG;
1010
1011
    switch (ssl->specs.mac_algorithm) {
1012
        #ifndef NO_SHA256
1013
        case sha256_mac:
1014
            hashType  = WC_HASH_TYPE_SHA256;
1015
            hashLen   = WC_SHA256_DIGEST_SIZE;
1016
            emptyHash = emptySHA256Hash;
1017
            break;
1018
        #endif
1019
1020
        #ifdef WOLFSSL_SHA384
1021
        case sha384_mac:
1022
            hashType  = WC_HASH_TYPE_SHA384;
1023
            hashLen   = WC_SHA384_DIGEST_SIZE;
1024
            emptyHash = emptySHA384Hash;
1025
            break;
1026
        #endif
1027
1028
        #ifdef WOLFSSL_TLS13_SHA512
1029
        case sha512_mac:
1030
            hashType  = WC_HASH_TYPE_SHA512;
1031
            hashLen   = WC_SHA512_DIGEST_SIZE;
1032
            emptyHash = emptySHA512Hash;
1033
            break;
1034
        #endif
1035
1036
        #ifdef WOLFSSL_SM3
1037
        case sm3_mac:
1038
            hashType  = WC_HASH_TYPE_SM3;
1039
            hashLen   = WC_SM3_DIGEST_SIZE;
1040
            emptyHash = emptySM3Hash;
1041
            break;
1042
        #endif
1043
1044
        default:
1045
            return BAD_FUNC_ARG;
1046
    }
1047
1048
    /* Derive-Secret(Secret, label, "") */
1049
    ret = Tls13HKDFExpandLabel(ssl, firstExpand, hashLen,
1050
            ssl->arrays->exporterSecret, hashLen,
1051
            protocol, protocolLen, (byte*)label, (word32)labelLen,
1052
            emptyHash, hashLen, (int)hashType);
1053
    if (ret != 0)
1054
        return ret;
1055
1056
    /* Hash(context_value) */
1057
    ret = wc_Hash(hashType, context, (word32)contextLen, hashOut, WC_MAX_DIGEST_SIZE);
1058
    if (ret != 0)
1059
        return ret;
1060
1061
    ret = Tls13HKDFExpandLabel(ssl, out, (word32)outLen, firstExpand, hashLen,
1062
            protocol, protocolLen, exporterLabel, EXPORTER_LABEL_SZ,
1063
            hashOut, hashLen, (int)hashType);
1064
1065
    return ret;
1066
}
1067
#endif
1068
1069
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
1070
/* The length of the resumption master secret label. */
1071
0
#define RESUME_MASTER_LABEL_SZ      10
1072
/* The resumption master secret label. */
1073
static const byte resumeMasterLabel[RESUME_MASTER_LABEL_SZ + 1] =
1074
    "res master";
1075
1076
/* Derive the resumption secret.
1077
 *
1078
 * ssl  The SSL/TLS object.
1079
 * key  The derived key.
1080
 * returns 0 on success, otherwise failure.
1081
 */
1082
int DeriveResumptionSecret(WOLFSSL* ssl, byte* key)
1083
0
{
1084
0
    byte* masterSecret;
1085
1086
0
    WOLFSSL_MSG("Derive Resumption Secret");
1087
0
    if (ssl == NULL) {
1088
0
        return BAD_FUNC_ARG;
1089
0
    }
1090
0
    if (ssl->arrays != NULL) {
1091
0
        masterSecret = ssl->arrays->masterSecret;
1092
0
    }
1093
0
    else {
1094
0
        masterSecret = ssl->session->masterSecret;
1095
0
    }
1096
0
    return Tls13DeriveKey(ssl, key, -1, masterSecret, resumeMasterLabel,
1097
0
                     RESUME_MASTER_LABEL_SZ, ssl->specs.mac_algorithm, 1,
1098
0
                     0 /* Unused */);
1099
0
}
1100
#endif
1101
1102
/* Length of the finished label. */
1103
3.15k
#define FINISHED_LABEL_SZ           8
1104
/* Finished label for generating finished key. */
1105
static const byte finishedLabel[FINISHED_LABEL_SZ+1] = "finished";
1106
/* Derive the finished secret.
1107
 *
1108
 * ssl     The SSL/TLS object.
1109
 * key     The key to use with the HMAC.
1110
 * secret  The derived secret.
1111
 * side    The side that we are deriving the secret for.
1112
 * returns 0 on success, otherwise failure.
1113
 */
1114
static int DeriveFinishedSecret(WOLFSSL* ssl, byte* key, byte* secret,
1115
                                int side)
1116
3.15k
{
1117
3.15k
    WOLFSSL_MSG("Derive Finished Secret");
1118
3.15k
    return Tls13DeriveKey(ssl, secret, -1, key, finishedLabel,
1119
3.15k
                          FINISHED_LABEL_SZ,  ssl->specs.mac_algorithm, 0,
1120
3.15k
                          side);
1121
3.15k
}
1122
1123
/* The length of the application traffic label. */
1124
0
#define APP_TRAFFIC_LABEL_SZ        11
1125
/* The application traffic label. */
1126
static const byte appTrafficLabel[APP_TRAFFIC_LABEL_SZ + 1] =
1127
    "traffic upd";
1128
1129
/* Update the traffic secret.
1130
 *
1131
 * ssl     The SSL/TLS object.
1132
 * secret  The previous secret and derived secret.
1133
 * side    The side that we are deriving the secret for.
1134
 * returns 0 on success, otherwise failure.
1135
 */
1136
static int DeriveTrafficSecret(WOLFSSL* ssl, byte* secret, int side)
1137
0
{
1138
0
    WOLFSSL_MSG("Derive New Application Traffic Secret");
1139
0
    return Tls13DeriveKey(ssl, secret, -1, secret,
1140
0
                     appTrafficLabel, APP_TRAFFIC_LABEL_SZ,
1141
0
                     ssl->specs.mac_algorithm, 0, side);
1142
0
}
1143
1144
1145
static int Tls13_HKDF_Extract(WOLFSSL *ssl, byte* prk, const byte* salt,
1146
                              int saltLen, byte* ikm, int ikmLen, int digest)
1147
3.36k
{
1148
3.36k
    int ret;
1149
#ifdef HAVE_PK_CALLBACKS
1150
    void *cb_ctx = ssl->HkdfExtractCtx;
1151
    CallbackHKDFExtract cb = ssl->ctx->HkdfExtractCb;
1152
    if (cb != NULL) {
1153
        ret = cb(prk, salt, (word32)saltLen, ikm, (word32)ikmLen, digest, cb_ctx);
1154
    }
1155
    else
1156
#endif
1157
3.36k
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
1158
3.36k
    if ((int)ssl->arrays->psk_keySz < 0) {
1159
0
        ret = PSK_KEY_ERROR;
1160
0
    }
1161
3.36k
    else
1162
3.36k
#endif
1163
3.36k
    {
1164
3.36k
    #if !defined(HAVE_FIPS) || \
1165
3.36k
        (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(6,0))
1166
3.36k
        ret = wc_Tls13_HKDF_Extract_ex(prk, salt, (word32)saltLen, ikm, (word32)ikmLen, digest,
1167
3.36k
            ssl->heap, ssl->devId);
1168
    #else
1169
        ret = wc_Tls13_HKDF_Extract(prk, salt, saltLen, ikm, ikmLen, digest);
1170
        (void)ssl;
1171
    #endif
1172
3.36k
    }
1173
3.36k
    return ret;
1174
3.36k
}
1175
1176
/* Derive the early secret using HKDF Extract.
1177
 *
1178
 * ssl  The SSL/TLS object.
1179
 */
1180
int DeriveEarlySecret(WOLFSSL* ssl)
1181
3.13k
{
1182
3.13k
    int ret;
1183
1184
3.13k
    WOLFSSL_MSG("Derive Early Secret");
1185
3.13k
    if (ssl == NULL || ssl->arrays == NULL) {
1186
0
        return BAD_FUNC_ARG;
1187
0
    }
1188
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
1189
    ret = tsip_Tls13DeriveEarlySecret(ssl);
1190
    if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
1191
        return ret;
1192
#endif
1193
3.13k
    PRIVATE_KEY_UNLOCK();
1194
3.13k
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
1195
3.13k
    ret = Tls13_HKDF_Extract(ssl, ssl->arrays->secret, NULL, 0,
1196
3.13k
            ssl->arrays->psk_key, (int)ssl->arrays->psk_keySz,
1197
3.13k
            mac2hash(ssl->specs.mac_algorithm));
1198
#else
1199
    ret = Tls13_HKDF_Extract(ssl, ssl->arrays->secret, NULL, 0,
1200
            ssl->arrays->masterSecret, 0, mac2hash(ssl->specs.mac_algorithm));
1201
#endif
1202
3.13k
    PRIVATE_KEY_LOCK();
1203
3.13k
    return ret;
1204
3.13k
}
1205
1206
/* The length of the derived label. */
1207
117
#define DERIVED_LABEL_SZ        7
1208
/* The derived label. */
1209
static const byte derivedLabel[DERIVED_LABEL_SZ + 1] =
1210
    "derived";
1211
1212
/* Derive the handshake secret using HKDF Extract.
1213
 *
1214
 * ssl  The SSL/TLS object.
1215
 */
1216
int DeriveHandshakeSecret(WOLFSSL* ssl)
1217
117
{
1218
117
    byte key[WC_MAX_DIGEST_SIZE];
1219
117
    int ret;
1220
117
    WOLFSSL_MSG("Derive Handshake Secret");
1221
117
    if (ssl == NULL || ssl->arrays == NULL) {
1222
0
        return BAD_FUNC_ARG;
1223
0
    }
1224
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
1225
    ret = tsip_Tls13DeriveHandshakeSecret(ssl);
1226
    if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
1227
        return ret;
1228
#endif
1229
1230
    /* Derive-Secret(., "derived", "") per RFC 8446 Section 7.1.
1231
     * Empty hash (NULL, 0) is required by the TLS 1.3 key schedule. */
1232
117
    ret = DeriveKeyMsg(ssl, key, -1, ssl->arrays->secret,
1233
117
                        derivedLabel, DERIVED_LABEL_SZ,
1234
117
                        NULL, 0, ssl->specs.mac_algorithm);
1235
117
    if (ret == 0) {
1236
117
        PRIVATE_KEY_UNLOCK();
1237
117
        ret = Tls13_HKDF_Extract(ssl, ssl->arrays->preMasterSecret,
1238
117
                key, ssl->specs.hash_size,
1239
117
                ssl->arrays->preMasterSecret, (int)ssl->arrays->preMasterSz,
1240
117
                mac2hash(ssl->specs.mac_algorithm));
1241
117
        PRIVATE_KEY_LOCK();
1242
117
    }
1243
1244
#ifdef WOLFSSL_CHECK_MEM_ZERO
1245
    wc_MemZero_Add("DeriveHandshakeSecret key", key, WC_MAX_DIGEST_SIZE);
1246
#endif
1247
117
    ForceZero(key, sizeof(key));
1248
#ifdef WOLFSSL_CHECK_MEM_ZERO
1249
    wc_MemZero_Check(key, sizeof(key));
1250
#endif
1251
117
    return ret;
1252
117
}
1253
1254
/* Derive the master secret using HKDF Extract.
1255
 *
1256
 * ssl  The SSL/TLS object.
1257
 */
1258
int DeriveMasterSecret(WOLFSSL* ssl)
1259
{
1260
    byte key[WC_MAX_DIGEST_SIZE];
1261
    int ret;
1262
    WOLFSSL_MSG("Derive Master Secret");
1263
    if (ssl == NULL || ssl->arrays == NULL) {
1264
        return BAD_FUNC_ARG;
1265
    }
1266
1267
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
1268
    ret = tsip_Tls13DeriveMasterSecret(ssl);
1269
    if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
1270
        return ret;
1271
#endif
1272
1273
    /* Derive-Secret(., "derived", "") per RFC 8446 Section 7.1.
1274
     * Empty hash (NULL, 0) is required by the TLS 1.3 key schedule. */
1275
    ret = DeriveKeyMsg(ssl, key, -1, ssl->arrays->preMasterSecret,
1276
                        derivedLabel, DERIVED_LABEL_SZ,
1277
                        NULL, 0, ssl->specs.mac_algorithm);
1278
    if (ret == 0) {
1279
        PRIVATE_KEY_UNLOCK();
1280
        ret = Tls13_HKDF_Extract(ssl, ssl->arrays->masterSecret,
1281
                                 key, ssl->specs.hash_size,
1282
                                 ssl->arrays->masterSecret, 0,
1283
                                 mac2hash(ssl->specs.mac_algorithm));
1284
        PRIVATE_KEY_LOCK();
1285
    }
1286
1287
#ifdef WOLFSSL_CHECK_MEM_ZERO
1288
    wc_MemZero_Add("DeriveMasterSecret key", key, WC_MAX_DIGEST_SIZE);
1289
#endif
1290
    ForceZero(key, sizeof(key));
1291
#ifdef WOLFSSL_CHECK_MEM_ZERO
1292
    wc_MemZero_Check(key, sizeof(key));
1293
#endif
1294
1295
#ifdef HAVE_KEYING_MATERIAL
1296
    if (ret != 0)
1297
        return ret;
1298
    /* Calculate exporter secret only when saving arrays */
1299
    if (ssl->options.saveArrays)
1300
        ret = DeriveExporterSecret(ssl, ssl->arrays->exporterSecret);
1301
#endif
1302
1303
    return ret;
1304
}
1305
1306
#if defined(HAVE_SESSION_TICKET)
1307
/* Length of the resumption label. */
1308
0
#define RESUMPTION_LABEL_SZ         10
1309
/* Resumption label for generating PSK associated with the ticket. */
1310
static const byte resumptionLabel[RESUMPTION_LABEL_SZ+1] = "resumption";
1311
1312
/* Derive the PSK associated with the ticket.
1313
 *
1314
 * ssl       The SSL/TLS object.
1315
 * nonce     The nonce to derive with.
1316
 * nonceLen  The length of the nonce to derive with.
1317
 * secret    The derived secret.
1318
 * returns 0 on success, otherwise failure.
1319
 */
1320
int DeriveResumptionPSK(WOLFSSL* ssl, byte* nonce, byte nonceLen, byte* secret)
1321
0
{
1322
0
    int         digestAlg;
1323
    /* Only one protocol version defined at this time. */
1324
0
    const byte* protocol    = tls13ProtocolLabel;
1325
0
    word32      protocolLen = TLS13_PROTOCOL_LABEL_SZ;
1326
0
    int         ret;
1327
1328
0
    WOLFSSL_MSG("Derive Resumption PSK");
1329
1330
#ifdef WOLFSSL_DTLS13
1331
    if (ssl->options.dtls) {
1332
        protocol = dtls13ProtocolLabel;
1333
        protocolLen = DTLS13_PROTOCOL_LABEL_SZ;
1334
    }
1335
#endif /* WOLFSSL_DTLS13 */
1336
1337
0
    switch (ssl->specs.mac_algorithm) {
1338
0
        #ifndef NO_SHA256
1339
0
        case sha256_mac:
1340
0
            digestAlg = WC_SHA256;
1341
0
            break;
1342
0
        #endif
1343
1344
0
        #ifdef WOLFSSL_SHA384
1345
0
        case sha384_mac:
1346
0
            digestAlg = WC_SHA384;
1347
0
            break;
1348
0
        #endif
1349
1350
        #ifdef WOLFSSL_TLS13_SHA512
1351
        case sha512_mac:
1352
            digestAlg = WC_SHA512;
1353
            break;
1354
        #endif
1355
1356
0
        #ifdef WOLFSSL_SM3
1357
0
        case sm3_mac:
1358
0
            digestAlg = WC_SM3;
1359
0
            break;
1360
0
        #endif
1361
1362
0
        default:
1363
0
            return BAD_FUNC_ARG;
1364
0
    }
1365
1366
#if defined(WOLFSSL_TICKET_NONCE_MALLOC) &&                                    \
1367
    (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
1368
    PRIVATE_KEY_UNLOCK();
1369
    ret = wc_Tls13_HKDF_Expand_Label_Alloc(secret, ssl->specs.hash_size,
1370
        ssl->session->masterSecret, ssl->specs.hash_size, protocol, protocolLen,
1371
        resumptionLabel, RESUMPTION_LABEL_SZ, nonce, nonceLen, digestAlg,
1372
        ssl->heap);
1373
    PRIVATE_KEY_LOCK();
1374
#else
1375
0
    ret = Tls13HKDFExpandLabel(ssl, secret, ssl->specs.hash_size,
1376
0
                               ssl->session->masterSecret, ssl->specs.hash_size,
1377
0
                               protocol, protocolLen, resumptionLabel,
1378
0
                               RESUMPTION_LABEL_SZ, nonce, nonceLen, digestAlg);
1379
0
#endif /* !defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3) */
1380
0
    return ret;
1381
0
}
1382
#endif /* HAVE_SESSION_TICKET */
1383
1384
1385
/* Calculate the HMAC of message data to this point.
1386
 *
1387
 * ssl   The SSL/TLS object.
1388
 * key   The HMAC key.
1389
 * hash  The hash result - verify data.
1390
 * returns length of verify data generated.
1391
 */
1392
static int BuildTls13HandshakeHmac(WOLFSSL* ssl, byte* key, byte* hash,
1393
    word32* pHashSz)
1394
0
{
1395
0
    WC_DECLARE_VAR(verifyHmac, Hmac, 1, 0);
1396
0
    int  hashType = WC_SHA256;
1397
0
    int  hashSz = WC_SHA256_DIGEST_SIZE;
1398
0
    int  ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
1399
1400
0
    if (ssl == NULL || key == NULL || hash == NULL) {
1401
0
        return BAD_FUNC_ARG;
1402
0
    }
1403
1404
    /* Get the hash of the previous handshake messages. */
1405
0
    switch (ssl->specs.mac_algorithm) {
1406
0
    #ifndef NO_SHA256
1407
0
        case sha256_mac:
1408
0
            hashType = WC_SHA256;
1409
0
            hashSz = WC_SHA256_DIGEST_SIZE;
1410
0
            ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
1411
0
            break;
1412
0
    #endif /* !NO_SHA256 */
1413
0
    #ifdef WOLFSSL_SHA384
1414
0
        case sha384_mac:
1415
0
            hashType = WC_SHA384;
1416
0
            hashSz = WC_SHA384_DIGEST_SIZE;
1417
0
            ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
1418
0
            break;
1419
0
    #endif /* WOLFSSL_SHA384 */
1420
    #ifdef WOLFSSL_TLS13_SHA512
1421
        case sha512_mac:
1422
            hashType = WC_SHA512;
1423
            hashSz = WC_SHA512_DIGEST_SIZE;
1424
            ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512, hash);
1425
            break;
1426
    #endif /* WOLFSSL_TLS13_SHA512 */
1427
0
    #ifdef WOLFSSL_SM3
1428
0
        case sm3_mac:
1429
0
            hashType = WC_SM3;
1430
0
            hashSz = WC_SM3_DIGEST_SIZE;
1431
0
            ret = wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash);
1432
0
            break;
1433
0
    #endif /* WOLFSSL_SM3 */
1434
0
        default:
1435
0
            ret = BAD_FUNC_ARG;
1436
0
            break;
1437
0
    }
1438
0
    if (ret != 0)
1439
0
        return ret;
1440
1441
#ifdef WOLFSSL_DEBUG_TLS
1442
    WOLFSSL_MSG("  Key");
1443
    WOLFSSL_BUFFER(key, ssl->specs.hash_size);
1444
    WOLFSSL_MSG("  Msg Hash");
1445
    WOLFSSL_BUFFER(hash, hashSz);
1446
#endif
1447
1448
0
    WC_ALLOC_VAR_EX(verifyHmac, Hmac, 1, NULL, DYNAMIC_TYPE_HMAC,
1449
0
        return MEMORY_E);
1450
1451
    /* Calculate the verify data. */
1452
0
    ret = wc_HmacInit(verifyHmac, ssl->heap, ssl->devId);
1453
0
    if (ret == 0) {
1454
0
        ret = wc_HmacSetKey(verifyHmac, hashType, key, ssl->specs.hash_size);
1455
0
        if (ret == 0)
1456
0
            ret = wc_HmacUpdate(verifyHmac, hash, (word32)hashSz);
1457
0
        if (ret == 0)
1458
0
            ret = wc_HmacFinal(verifyHmac, hash);
1459
0
        wc_HmacFree(verifyHmac);
1460
0
    }
1461
1462
0
    WC_FREE_VAR_EX(verifyHmac, NULL, DYNAMIC_TYPE_HMAC);
1463
1464
#ifdef WOLFSSL_DEBUG_TLS
1465
    WOLFSSL_MSG("  Hash");
1466
    WOLFSSL_BUFFER(hash, hashSz);
1467
#endif
1468
1469
0
    if (pHashSz)
1470
0
        *pHashSz = (word32)hashSz;
1471
1472
0
    return ret;
1473
0
}
1474
1475
/* The length of the label to use when deriving keys. */
1476
0
#define WRITE_KEY_LABEL_SZ     3
1477
/* The length of the label to use when deriving IVs. */
1478
0
#define WRITE_IV_LABEL_SZ      2
1479
/* The label to use when deriving keys. */
1480
static const byte writeKeyLabel[WRITE_KEY_LABEL_SZ+1] = "key";
1481
/* The label to use when deriving IVs. */
1482
static const byte writeIVLabel[WRITE_IV_LABEL_SZ+1]   = "iv";
1483
1484
/* Derive the keys and IVs for TLS v1.3.
1485
 *
1486
 * ssl      The SSL/TLS object.
1487
 * secret   early_data_key when deriving the key and IV for encrypting early
1488
 *          data application data and end_of_early_data messages.
1489
 *          handshake_key when deriving keys and IVs for encrypting handshake
1490
 *          messages.
1491
 *          traffic_key when deriving first keys and IVs for encrypting
1492
 *          traffic messages.
1493
 *          update_traffic_key when deriving next keys and IVs for encrypting
1494
 *          traffic messages.
1495
 *          no_key when deriving keys and IVs from existing secrets without
1496
 *          re-deriving the secrets. Used during early data transitions.
1497
 * side     ENCRYPT_SIDE_ONLY when only encryption secret needs to be derived.
1498
 *          DECRYPT_SIDE_ONLY when only decryption secret needs to be derived.
1499
 *          ENCRYPT_AND_DECRYPT_SIDE when both secret needs to be derived.
1500
 * store    1 indicates to derive the keys and IVs from derived secret and
1501
 *          store ready for provisioning.
1502
 * returns 0 on success, otherwise failure.
1503
 */
1504
int DeriveTls13Keys(WOLFSSL* ssl, int secret, int side, int store)
1505
0
{
1506
0
    int   ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); /* Assume failure */
1507
0
    int   i = 0;
1508
0
    WC_DECLARE_VAR(key_dig, byte, MAX_PRF_DIG, 0);
1509
0
    int   provision;
1510
1511
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
1512
    ret = tsip_Tls13DeriveKeys(ssl, secret, side);
1513
    if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
1514
        return ret;
1515
    }
1516
    ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); /* Assume failure */
1517
#endif
1518
1519
0
    WC_ALLOC_VAR_EX(key_dig, byte, MAX_PRF_DIG, ssl->heap,
1520
0
        DYNAMIC_TYPE_DIGEST, return MEMORY_E);
1521
1522
0
    if (side == ENCRYPT_AND_DECRYPT_SIDE) {
1523
0
        provision = PROVISION_CLIENT_SERVER;
1524
0
    }
1525
0
    else {
1526
0
        provision = ((ssl->options.side != WOLFSSL_CLIENT_END) ^
1527
0
                     (side == ENCRYPT_SIDE_ONLY)) ? PROVISION_CLIENT :
1528
0
                                                    PROVISION_SERVER;
1529
0
    }
1530
1531
    /* Derive the appropriate secret to use in the HKDF. */
1532
0
    switch (secret) {
1533
#ifdef WOLFSSL_EARLY_DATA
1534
        case early_data_key:
1535
            ret = DeriveEarlyTrafficSecret(ssl, ssl->clientSecret,
1536
                                           WOLFSSL_CLIENT_END);
1537
            if (ret != 0)
1538
                goto end;
1539
            break;
1540
#endif
1541
1542
0
        case handshake_key:
1543
0
            if (provision & PROVISION_CLIENT) {
1544
0
                ret = DeriveClientHandshakeSecret(ssl,
1545
0
                                                  ssl->clientSecret);
1546
0
                if (ret != 0)
1547
0
                    goto end;
1548
0
            }
1549
0
            if (provision & PROVISION_SERVER) {
1550
0
                ret = DeriveServerHandshakeSecret(ssl,
1551
0
                                                  ssl->serverSecret);
1552
0
                if (ret != 0)
1553
0
                    goto end;
1554
0
            }
1555
0
            break;
1556
1557
0
        case traffic_key:
1558
0
            if (provision & PROVISION_CLIENT) {
1559
0
                ret = DeriveClientTrafficSecret(ssl, ssl->clientSecret);
1560
0
                if (ret != 0)
1561
0
                    goto end;
1562
0
            }
1563
0
            if (provision & PROVISION_SERVER) {
1564
0
                ret = DeriveServerTrafficSecret(ssl, ssl->serverSecret);
1565
0
                if (ret != 0)
1566
0
                    goto end;
1567
0
            }
1568
0
            break;
1569
1570
0
        case update_traffic_key:
1571
0
            if (provision & PROVISION_CLIENT) {
1572
0
                ret = DeriveTrafficSecret(ssl, ssl->clientSecret,
1573
0
                                          WOLFSSL_CLIENT_END);
1574
0
                if (ret != 0)
1575
0
                    goto end;
1576
0
            }
1577
0
            if (provision & PROVISION_SERVER) {
1578
0
                ret = DeriveTrafficSecret(ssl, ssl->serverSecret,
1579
0
                                          WOLFSSL_SERVER_END);
1580
0
                if (ret != 0)
1581
0
                    goto end;
1582
0
            }
1583
0
            break;
1584
1585
0
        case no_key:
1586
            /* Called with early data to derive keys from existing secrets
1587
             * without re-deriving the secrets themselves. */
1588
0
            ret = 0;
1589
0
            break;
1590
1591
0
        default:
1592
0
            ret = BAD_FUNC_ARG;
1593
0
            break;
1594
0
    }
1595
1596
#ifdef WOLFSSL_QUIC
1597
    if (WOLFSSL_IS_QUIC(ssl)) {
1598
        ret = wolfSSL_quic_forward_secrets(ssl, secret, side);
1599
        if (ret != 0)
1600
            goto end;
1601
    }
1602
#endif /* WOLFSSL_QUIC */
1603
1604
0
    if (!store)
1605
0
        goto end;
1606
1607
    /* Key data = client key | server key | client IV | server IV */
1608
1609
0
    if (provision & PROVISION_CLIENT) {
1610
        /* Derive the client key.  */
1611
0
        WOLFSSL_MSG("Derive Client Key");
1612
0
        ret = Tls13DeriveKey(ssl, &key_dig[i], ssl->specs.key_size,
1613
0
                        ssl->clientSecret, writeKeyLabel,
1614
0
                        WRITE_KEY_LABEL_SZ, ssl->specs.mac_algorithm, 0,
1615
0
                        WOLFSSL_CLIENT_END);
1616
0
        if (ret != 0)
1617
0
            goto end;
1618
0
        i += ssl->specs.key_size;
1619
0
    }
1620
1621
0
    if (provision & PROVISION_SERVER) {
1622
        /* Derive the server key.  */
1623
0
        WOLFSSL_MSG("Derive Server Key");
1624
0
        ret = Tls13DeriveKey(ssl, &key_dig[i], ssl->specs.key_size,
1625
0
                        ssl->serverSecret, writeKeyLabel,
1626
0
                        WRITE_KEY_LABEL_SZ, ssl->specs.mac_algorithm, 0,
1627
0
                        WOLFSSL_SERVER_END);
1628
0
        if (ret != 0)
1629
0
            goto end;
1630
0
        i += ssl->specs.key_size;
1631
0
    }
1632
1633
0
    if (provision & PROVISION_CLIENT) {
1634
        /* Derive the client IV.  */
1635
0
        WOLFSSL_MSG("Derive Client IV");
1636
0
        ret = Tls13DeriveKey(ssl, &key_dig[i], ssl->specs.iv_size,
1637
0
                        ssl->clientSecret, writeIVLabel,
1638
0
                        WRITE_IV_LABEL_SZ, ssl->specs.mac_algorithm, 0,
1639
0
                        WOLFSSL_CLIENT_END);
1640
0
        if (ret != 0)
1641
0
            goto end;
1642
0
        i += ssl->specs.iv_size;
1643
0
    }
1644
1645
0
    if (provision & PROVISION_SERVER) {
1646
        /* Derive the server IV.  */
1647
0
        WOLFSSL_MSG("Derive Server IV");
1648
0
        ret = Tls13DeriveKey(ssl, &key_dig[i], ssl->specs.iv_size,
1649
0
                        ssl->serverSecret, writeIVLabel,
1650
0
                        WRITE_IV_LABEL_SZ, ssl->specs.mac_algorithm, 0,
1651
0
                        WOLFSSL_SERVER_END);
1652
0
        if (ret != 0)
1653
0
            goto end;
1654
0
        i += ssl->specs.iv_size;
1655
0
    }
1656
1657
    /* Store keys and IVs but don't activate them. */
1658
0
    ret = StoreKeys(ssl, key_dig, provision);
1659
1660
#ifdef WOLFSSL_DTLS13
1661
    if (ret != 0)
1662
      goto end;
1663
1664
    if (ssl->options.dtls) {
1665
        w64wrapper epochNumber;
1666
        ret = Dtls13DeriveSnKeys(ssl, provision);
1667
        if (ret != 0)
1668
            goto end;
1669
1670
        switch (secret) {
1671
            case early_data_key:
1672
                epochNumber = w64From32(0, DTLS13_EPOCH_EARLYDATA);
1673
                break;
1674
            case handshake_key:
1675
                epochNumber = w64From32(0, DTLS13_EPOCH_HANDSHAKE);
1676
                break;
1677
            case traffic_key:
1678
            case no_key:
1679
                epochNumber = w64From32(0, DTLS13_EPOCH_TRAFFIC0);
1680
                break;
1681
            case update_traffic_key:
1682
                if (side == ENCRYPT_SIDE_ONLY) {
1683
                    epochNumber = ssl->dtls13Epoch;
1684
                }
1685
                else if (side == DECRYPT_SIDE_ONLY) {
1686
                    epochNumber = ssl->dtls13PeerEpoch;
1687
                }
1688
                else {
1689
                    ret = BAD_STATE_E;
1690
                    goto end;
1691
                }
1692
                w64Increment(&epochNumber);
1693
                break;
1694
            default:
1695
                ret = BAD_STATE_E;
1696
                goto end;
1697
        }
1698
        ret = Dtls13NewEpoch(ssl, epochNumber, side);
1699
        if (ret != 0)
1700
            goto end;
1701
    }
1702
1703
#endif /* WOLFSSL_DTLS13 */
1704
1705
0
end:
1706
0
    ForceZero(key_dig, (word32)i);
1707
0
#ifdef WOLFSSL_SMALL_STACK
1708
0
    XFREE(key_dig, ssl->heap, DYNAMIC_TYPE_DIGEST);
1709
#elif defined(WOLFSSL_CHECK_MEM_ZERO)
1710
    wc_MemZero_Check(key_dig, MAX_PRF_DIG);
1711
#endif
1712
1713
0
    if (ret != 0) {
1714
0
        WOLFSSL_ERROR_VERBOSE(ret);
1715
0
    }
1716
1717
0
    return ret;
1718
0
}
1719
1720
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) || defined(WOLFSSL_DTLS13)
1721
#ifdef WOLFSSL_32BIT_MILLI_TIME
1722
#ifndef NO_ASN_TIME
1723
#if defined(USER_TICKS)
1724
#if 0
1725
    word32 TimeNowInMilliseconds(void)
1726
    {
1727
        /*
1728
        write your own clock tick function if don't want gettimeofday()
1729
        needs millisecond accuracy but doesn't have to correlated to EPOCH
1730
        */
1731
    }
1732
#endif
1733
1734
#elif defined(TIME_OVERRIDES)
1735
#if !defined(NO_ASN) && !defined(NO_ASN_TIME)
1736
    word32 TimeNowInMilliseconds(void)
1737
    {
1738
        return (word32) wc_Time(0) * 1000;
1739
    }
1740
#else
1741
    #ifndef HAVE_TIME_T_TYPE
1742
        typedef long time_t;
1743
    #endif
1744
    extern time_t XTIME(time_t * timer);
1745
1746
    /* The time in milliseconds.
1747
     * Used for tickets to represent difference between when first seen and when
1748
     * sending.
1749
     *
1750
     * returns the time in milliseconds as a 32-bit value.
1751
     */
1752
    word32 TimeNowInMilliseconds(void)
1753
    {
1754
        return (word32) XTIME(0) * 1000;
1755
    }
1756
#endif
1757
1758
#elif defined(XTIME_MS)
1759
    word32 TimeNowInMilliseconds(void)
1760
    {
1761
        return (word32)XTIME_MS(0);
1762
    }
1763
1764
#elif defined(USE_WINDOWS_API)
1765
    /* The time in milliseconds.
1766
     * Used for tickets to represent difference between when first seen and when
1767
     * sending.
1768
     *
1769
     * returns the time in milliseconds as a 32-bit value.
1770
     */
1771
    word32 TimeNowInMilliseconds(void)
1772
    {
1773
        static int           init = 0;
1774
        static LARGE_INTEGER freq;
1775
        LARGE_INTEGER        count;
1776
1777
        if (!init) {
1778
            QueryPerformanceFrequency(&freq);
1779
            init = 1;
1780
        }
1781
1782
        QueryPerformanceCounter(&count);
1783
1784
        return (word32)(count.QuadPart / (freq.QuadPart / 1000));
1785
    }
1786
1787
#elif defined(HAVE_RTP_SYS)
1788
    #include "rtptime.h"
1789
1790
    /* The time in milliseconds.
1791
     * Used for tickets to represent difference between when first seen and when
1792
     * sending.
1793
     *
1794
     * returns the time in milliseconds as a 32-bit value.
1795
     */
1796
    word32 TimeNowInMilliseconds(void)
1797
    {
1798
        return (word32)rtp_get_system_sec() * 1000;
1799
    }
1800
#elif defined(WOLFSSL_DEOS)
1801
    word32 TimeNowInMilliseconds(void)
1802
    {
1803
        const word32 systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
1804
        word32 *systemTickPtr = systemTickPointer();
1805
1806
        return (word32) (*systemTickPtr/systemTickTimeInHz) * 1000;
1807
    }
1808
#elif defined(MICRIUM)
1809
    /* The time in milliseconds.
1810
     * Used for tickets to represent difference between when first seen and when
1811
     * sending.
1812
     *
1813
     * returns the time in milliseconds as a 32-bit value.
1814
     */
1815
    word32 TimeNowInMilliseconds(void)
1816
    {
1817
        OS_TICK ticks = 0;
1818
        OS_ERR  err;
1819
1820
        ticks = OSTimeGet(&err);
1821
1822
        return (word32) (ticks / OSCfg_TickRate_Hz) * 1000;
1823
    }
1824
#elif defined(MICROCHIP_TCPIP_V5)
1825
    /* The time in milliseconds.
1826
     * Used for tickets to represent difference between when first seen and when
1827
     * sending.
1828
     *
1829
     * returns the time in milliseconds as a 32-bit value.
1830
     */
1831
    word32 TimeNowInMilliseconds(void)
1832
    {
1833
        return (word32) (TickGet() / (TICKS_PER_SECOND / 1000));
1834
    }
1835
#elif defined(MICROCHIP_TCPIP)
1836
    #if defined(MICROCHIP_MPLAB_HARMONY)
1837
        #include <system/tmr/sys_tmr.h>
1838
1839
    /* The time in milliseconds.
1840
     * Used for tickets to represent difference between when first seen and when
1841
     * sending.
1842
     *
1843
     * returns the time in milliseconds as a 32-bit value.
1844
     */
1845
    word32 TimeNowInMilliseconds(void)
1846
    {
1847
        return (word32)(SYS_TMR_TickCountGet() /
1848
                        (SYS_TMR_TickCounterFrequencyGet() / 1000));
1849
    }
1850
    #else
1851
    /* The time in milliseconds.
1852
     * Used for tickets to represent difference between when first seen and when
1853
     * sending.
1854
     *
1855
     * returns the time in milliseconds as a 32-bit value.
1856
     */
1857
    word32 TimeNowInMilliseconds(void)
1858
    {
1859
        return (word32)(SYS_TICK_Get() / (SYS_TICK_TicksPerSecondGet() / 1000));
1860
    }
1861
1862
    #endif
1863
1864
#elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
1865
    /* The time in milliseconds.
1866
     * Used for tickets to represent difference between when first seen and when
1867
     * sending.
1868
     *
1869
     * returns the time in milliseconds as a 32-bit value.
1870
     */
1871
    word32 TimeNowInMilliseconds(void)
1872
    {
1873
        TIME_STRUCT mqxTime;
1874
1875
        _time_get_elapsed(&mqxTime);
1876
1877
        return (word32) mqxTime.SECONDS * 1000;
1878
    }
1879
#elif defined(FREESCALE_FREE_RTOS) || defined(FREESCALE_KSDK_FREERTOS)
1880
    #include "include/task.h"
1881
1882
    /* The time in milliseconds.
1883
     * Used for tickets to represent difference between when first seen and when
1884
     * sending.
1885
     *
1886
     * returns the time in milliseconds as a 32-bit value.
1887
     */
1888
    word32 TimeNowInMilliseconds(void)
1889
    {
1890
        return (unsigned int)(((float)xTaskGetTickCount()) /
1891
                              (configTICK_RATE_HZ / 1000));
1892
    }
1893
#elif defined(FREESCALE_KSDK_BM)
1894
    #include "lwip/sys.h" /* lwIP */
1895
1896
    /* The time in milliseconds.
1897
     * Used for tickets to represent difference between when first seen and when
1898
     * sending.
1899
     *
1900
     * returns the time in milliseconds as a 32-bit value.
1901
     */
1902
    word32 TimeNowInMilliseconds(void)
1903
    {
1904
        return sys_now();
1905
    }
1906
1907
#elif defined(WOLFSSL_CMSIS_RTOS) || defined(WOLFSSL_CMSIS_RTOSv2)
1908
1909
    word32 TimeNowInMilliseconds(void)
1910
    {
1911
        return (word32)osKernelGetTickCount();
1912
    }
1913
1914
#elif defined(WOLFSSL_TIRTOS)
1915
    /* The time in milliseconds.
1916
     * Used for tickets to represent difference between when first seen and when
1917
     * sending.
1918
     *
1919
     * returns the time in milliseconds as a 32-bit value.
1920
     */
1921
    word32 TimeNowInMilliseconds(void)
1922
    {
1923
        return (word32) Seconds_get() * 1000;
1924
    }
1925
#elif defined(WOLFSSL_UTASKER)
1926
    /* The time in milliseconds.
1927
     * Used for tickets to represent difference between when first seen and when
1928
     * sending.
1929
     *
1930
     * returns the time in milliseconds as a 32-bit value.
1931
     */
1932
    word32 TimeNowInMilliseconds(void)
1933
    {
1934
        return (word32)(uTaskerSystemTick / (TICK_RESOLUTION / 1000));
1935
    }
1936
#elif defined(WOLFSSL_LINUXKM)
1937
    word32 TimeNowInMilliseconds(void)
1938
    {
1939
        s64 t;
1940
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)
1941
        struct timespec ts;
1942
        getnstimeofday(&ts);
1943
        t = ts.tv_sec * (s64)1000;
1944
        t += ts.tv_nsec / (s64)1000000;
1945
#else
1946
        struct timespec64 ts;
1947
#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0)
1948
        ts = current_kernel_time64();
1949
#else
1950
        ktime_get_coarse_real_ts64(&ts);
1951
#endif
1952
        t = ts.tv_sec * 1000L;
1953
        t += ts.tv_nsec / 1000000L;
1954
#endif
1955
        return (word32)t;
1956
    }
1957
#elif defined(WOLFSSL_QNX_CAAM)
1958
    word32 TimeNowInMilliseconds(void)
1959
    {
1960
        struct timespec now;
1961
        clock_gettime(CLOCK_REALTIME, &now);
1962
        return (word32)(now.tv_sec * 1000 + now.tv_nsec / 1000000);
1963
    }
1964
#elif defined(FUSION_RTOS)
1965
    /* The time in milliseconds.
1966
     * Used for tickets to represent difference between when first seen and when
1967
     * sending.
1968
     *
1969
     * returns the time in milliseconds as a 32-bit value.
1970
     */
1971
    word32 TimeNowInMilliseconds(void)
1972
    {
1973
        struct timeval now;
1974
        if (FCL_GETTIMEOFDAY(&now, 0) < 0)
1975
            return 0;
1976
1977
        /* Convert to milliseconds number. */
1978
        return (word32)(now.tv_sec * 1000 + now.tv_usec / 1000);
1979
    }
1980
#elif defined(WOLFSSL_ZEPHYR)
1981
    word32 TimeNowInMilliseconds(void)
1982
    {
1983
        int64_t t;
1984
    #if defined(CONFIG_ARCH_POSIX)
1985
        k_cpu_idle();
1986
    #endif
1987
        t = k_uptime_get(); /* returns current uptime in milliseconds */
1988
        return (word32)t;
1989
    }
1990
#elif defined(FREERTOS)
1991
    word32 TimeNowInMilliseconds(void)
1992
    {
1993
        return (word32)((uint64_t)(xTaskGetTickCount() * 1000) /
1994
            configTICK_RATE_HZ);
1995
    }
1996
#else
1997
    /* The time in milliseconds.
1998
     * Used for tickets to represent difference between when first seen and when
1999
     * sending.
2000
     *
2001
     * returns the time in milliseconds as a 32-bit value.
2002
     */
2003
    word32 TimeNowInMilliseconds(void)
2004
    {
2005
        struct timeval now;
2006
2007
        if (gettimeofday(&now, 0) < 0)
2008
            return 0;
2009
2010
        /* Convert to milliseconds number. */
2011
        return (word32)(now.tv_sec * 1000 + now.tv_usec / 1000);
2012
    }
2013
#endif
2014
#else
2015
    /* user must supply time in milliseconds function:
2016
     *   word32 TimeNowInMilliseconds(void);
2017
     * The response is milliseconds elapsed
2018
     */
2019
#endif /* !NO_ASN_TIME */
2020
#else
2021
#ifndef NO_ASN_TIME
2022
#if defined(USER_TICKS)
2023
#if 0
2024
    sword64 TimeNowInMilliseconds(void)
2025
    {
2026
        /*
2027
        write your own clock tick function if don't want gettimeofday()
2028
        needs millisecond accuracy but doesn't have to correlated to EPOCH
2029
        */
2030
    }
2031
#endif
2032
2033
#elif defined(TIME_OVERRIDES)
2034
#if !defined(NO_ASN) && !defined(NO_ASN_TIME)
2035
    sword64 TimeNowInMilliseconds(void)
2036
    {
2037
        return (sword64) wc_Time(0) * 1000;
2038
    }
2039
#else
2040
    #ifndef HAVE_TIME_T_TYPE
2041
        typedef long time_t;
2042
    #endif
2043
    extern time_t XTIME(time_t * timer);
2044
2045
    /* The time in milliseconds.
2046
     * Used for tickets to represent difference between when first seen and when
2047
     * sending.
2048
     *
2049
     * returns the time in milliseconds as a 32-bit value.
2050
     */
2051
    sword64 TimeNowInMilliseconds(void)
2052
    {
2053
        return (sword64) XTIME(0) * 1000;
2054
    }
2055
#endif
2056
2057
#elif defined(XTIME_MS)
2058
    sword64 TimeNowInMilliseconds(void)
2059
    {
2060
        return (sword64)XTIME_MS(0);
2061
    }
2062
2063
#elif defined(USE_WINDOWS_API)
2064
    /* The time in milliseconds.
2065
     * Used for tickets to represent difference between when first seen and when
2066
     * sending.
2067
     *
2068
     * returns the time in milliseconds as a 64-bit value.
2069
     */
2070
    sword64 TimeNowInMilliseconds(void)
2071
    {
2072
        static int           init = 0;
2073
        static LARGE_INTEGER freq;
2074
        LARGE_INTEGER        count;
2075
2076
        if (!init) {
2077
            QueryPerformanceFrequency(&freq);
2078
            init = 1;
2079
        }
2080
2081
        QueryPerformanceCounter(&count);
2082
2083
        return (sword64)(count.QuadPart / (freq.QuadPart / 1000));
2084
    }
2085
2086
#elif defined(HAVE_RTP_SYS)
2087
    #include "rtptime.h"
2088
2089
    /* The time in milliseconds.
2090
     * Used for tickets to represent difference between when first seen and when
2091
     * sending.
2092
     *
2093
     * returns the time in milliseconds as a 64-bit value.
2094
     */
2095
    sword64 TimeNowInMilliseconds(void)
2096
    {
2097
        return (sword64)rtp_get_system_sec() * 1000;
2098
    }
2099
#elif defined(WOLFSSL_DEOS)
2100
    sword64 TimeNowInMilliseconds(void)
2101
    {
2102
        const word32 systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
2103
        word32 *systemTickPtr = systemTickPointer();
2104
2105
        return (sword64) (*systemTickPtr/systemTickTimeInHz) * 1000;
2106
    }
2107
#elif defined(MICRIUM)
2108
    /* The time in milliseconds.
2109
     * Used for tickets to represent difference between when first seen and when
2110
     * sending.
2111
     *
2112
     * returns the time in milliseconds as a 64-bit value.
2113
     */
2114
    sword64 TimeNowInMilliseconds(void)
2115
    {
2116
        OS_TICK ticks = 0;
2117
        OS_ERR  err;
2118
2119
        ticks = OSTimeGet(&err);
2120
2121
        return (sword64) (ticks / OSCfg_TickRate_Hz) * 1000;
2122
    }
2123
#elif defined(MICROCHIP_TCPIP_V5)
2124
    /* The time in milliseconds.
2125
     * Used for tickets to represent difference between when first seen and when
2126
     * sending.
2127
     *
2128
     * returns the time in milliseconds as a 64-bit value.
2129
     */
2130
    sword64 TimeNowInMilliseconds(void)
2131
    {
2132
        return (sword64) (TickGet() / (TICKS_PER_SECOND / 1000));
2133
    }
2134
#elif defined(MICROCHIP_TCPIP)
2135
    #if defined(MICROCHIP_MPLAB_HARMONY)
2136
        #include <system/tmr/sys_tmr.h>
2137
2138
    /* The time in milliseconds.
2139
     * Used for tickets to represent difference between when first seen and when
2140
     * sending.
2141
     *
2142
     * returns the time in milliseconds as a 64-bit value.
2143
     */
2144
    sword64 TimeNowInMilliseconds(void)
2145
    {
2146
        return (sword64)SYS_TMR_TickCountGet() /
2147
                        (SYS_TMR_TickCounterFrequencyGet() / 1000);
2148
    }
2149
    #else
2150
    /* The time in milliseconds.
2151
     * Used for tickets to represent difference between when first seen and when
2152
     * sending.
2153
     *
2154
     * returns the time in milliseconds as a 64-bit value.
2155
     */
2156
    sword64 TimeNowInMilliseconds(void)
2157
    {
2158
        return (sword64)SYS_TICK_Get() / (SYS_TICK_TicksPerSecondGet() / 1000);
2159
    }
2160
2161
    #endif
2162
2163
#elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
2164
    /* The time in milliseconds.
2165
     * Used for tickets to represent difference between when first seen and when
2166
     * sending.
2167
     *
2168
     * returns the time in milliseconds as a 64-bit value.
2169
     */
2170
    sword64 TimeNowInMilliseconds(void)
2171
    {
2172
        TIME_STRUCT mqxTime;
2173
2174
        _time_get_elapsed(&mqxTime);
2175
2176
        return (sword64) mqxTime.SECONDS * 1000;
2177
    }
2178
#elif defined(FREESCALE_FREE_RTOS) || defined(FREESCALE_KSDK_FREERTOS)
2179
    #include "include/task.h"
2180
2181
    /* The time in milliseconds.
2182
     * Used for tickets to represent difference between when first seen and when
2183
     * sending.
2184
     *
2185
     * returns the time in milliseconds as a 64-bit value.
2186
     */
2187
    sword64 TimeNowInMilliseconds(void)
2188
    {
2189
        return (sword64)xTaskGetTickCount() / (configTICK_RATE_HZ / 1000);
2190
    }
2191
#elif defined(FREESCALE_KSDK_BM)
2192
    #include "lwip/sys.h" /* lwIP */
2193
2194
    /* The time in milliseconds.
2195
     * Used for tickets to represent difference between when first seen and when
2196
     * sending.
2197
     *
2198
     * returns the time in milliseconds as a 64-bit value.
2199
     */
2200
    sword64 TimeNowInMilliseconds(void)
2201
    {
2202
        return sys_now();
2203
    }
2204
2205
#elif defined(WOLFSSL_CMSIS_RTOS) || defined(WOLFSSL_CMSIS_RTOSv2)
2206
2207
    sword64 TimeNowInMilliseconds(void)
2208
    {
2209
        return (sword64)osKernelGetTickCount();
2210
    }
2211
2212
#elif defined(WOLFSSL_TIRTOS)
2213
    /* The time in milliseconds.
2214
     * Used for tickets to represent difference between when first seen and when
2215
     * sending.
2216
     *
2217
     * returns the time in milliseconds as a 64-bit value.
2218
     */
2219
    sword64 TimeNowInMilliseconds(void)
2220
    {
2221
        return (sword64) Seconds_get() * 1000;
2222
    }
2223
#elif defined(WOLFSSL_UTASKER)
2224
    /* The time in milliseconds.
2225
     * Used for tickets to represent difference between when first seen and when
2226
     * sending.
2227
     *
2228
     * returns the time in milliseconds as a 64-bit value.
2229
     */
2230
    sword64 TimeNowInMilliseconds(void)
2231
    {
2232
        return (sword64)(uTaskerSystemTick / (TICK_RESOLUTION / 1000));
2233
    }
2234
#elif defined(WOLFSSL_LINUXKM)
2235
    sword64 TimeNowInMilliseconds(void)
2236
    {
2237
        s64 t;
2238
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)
2239
        struct timespec ts;
2240
        getnstimeofday(&ts);
2241
        t = ts.tv_sec * (s64)1000;
2242
        t += ts.tv_nsec / (s64)1000000;
2243
#else
2244
        struct timespec64 ts;
2245
#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0)
2246
        ts = current_kernel_time64();
2247
#else
2248
        ktime_get_coarse_real_ts64(&ts);
2249
#endif
2250
        t = ts.tv_sec * 1000L;
2251
        t += ts.tv_nsec / 1000000L;
2252
#endif
2253
        return (sword64)t;
2254
    }
2255
#elif defined(WOLFSSL_QNX_CAAM)
2256
    sword64 TimeNowInMilliseconds(void)
2257
    {
2258
        struct timespec now;
2259
        clock_gettime(CLOCK_REALTIME, &now);
2260
        return (sword64)(now.tv_sec * 1000 + now.tv_nsec / 1000000);
2261
    }
2262
#elif defined(FUSION_RTOS)
2263
    /* The time in milliseconds.
2264
     * Used for tickets to represent difference between when first seen and when
2265
     * sending.
2266
     *
2267
     * returns the time in milliseconds as a 64-bit value.
2268
     */
2269
    sword64 TimeNowInMilliseconds(void)
2270
    {
2271
        struct timeval now;
2272
        if (FCL_GETTIMEOFDAY(&now, 0) < 0)
2273
            return 0;
2274
2275
        /* Convert to milliseconds number. */
2276
        return (sword64)now.tv_sec * 1000 + now.tv_usec / 1000;
2277
    }
2278
#elif defined(WOLFSSL_ZEPHYR)
2279
    sword64 TimeNowInMilliseconds(void)
2280
    {
2281
        int64_t t;
2282
    #if defined(CONFIG_ARCH_POSIX)
2283
        k_cpu_idle();
2284
    #endif
2285
        t = k_uptime_get(); /* returns current uptime in milliseconds */
2286
        return (sword64)t;
2287
    }
2288
#elif defined(FREERTOS)
2289
    sword64 TimeNowInMilliseconds(void)
2290
    {
2291
        return (sword64)((uint64_t)(xTaskGetTickCount() * 1000) /
2292
            configTICK_RATE_HZ);
2293
    }
2294
#else
2295
    /* The time in milliseconds.
2296
     * Used for tickets to represent difference between when first seen and when
2297
     * sending.
2298
     *
2299
     * returns the time in milliseconds as a 64-bit value.
2300
     */
2301
    sword64 TimeNowInMilliseconds(void)
2302
224
    {
2303
224
        struct timeval now;
2304
2305
224
        if (gettimeofday(&now, 0) < 0)
2306
0
            return 0;
2307
2308
        /* Convert to milliseconds number. */
2309
224
        return (sword64)now.tv_sec * 1000 + now.tv_usec / 1000;
2310
224
    }
2311
#endif
2312
#else
2313
    /* user must supply time in milliseconds function:
2314
     *   sword64 TimeNowInMilliseconds(void);
2315
     * The response is milliseconds elapsed
2316
     */
2317
#endif /* !NO_ASN_TIME */
2318
#endif /* WOLFSSL_32BIT_MILLI_TIME */
2319
#endif /* HAVE_SESSION_TICKET || !NO_PSK || WOLFSSL_DTLS13 */
2320
2321
/* Add record layer header to message.
2322
 *
2323
 * output  The buffer to write the record layer header into.
2324
 * length  The length of the record data.
2325
 * type    The type of record message.
2326
 * ssl     The SSL/TLS object.
2327
 */
2328
static void AddTls13RecordHeader(byte* output, word32 length, byte type,
2329
                                 WOLFSSL* ssl)
2330
2.09k
{
2331
2.09k
    RecordLayerHeader* rl;
2332
2333
2.09k
    rl = (RecordLayerHeader*)output;
2334
2.09k
    rl->type    = type;
2335
2.09k
    rl->pvMajor = ssl->version.major;
2336
    /* NOTE: May be TLSv1_MINOR when sending first ClientHello. */
2337
2.09k
    rl->pvMinor = TLSv1_2_MINOR;
2338
2.09k
    c16toa((word16)length, rl->length);
2339
2.09k
}
2340
2341
/* Add handshake header to message.
2342
 *
2343
 * output      The buffer to write the handshake header into.
2344
 * length      The length of the handshake data.
2345
 * fragOffset  The offset of the fragment data. (DTLS)
2346
 * fragLength  The length of the fragment data. (DTLS)
2347
 * type        The type of handshake message.
2348
 * ssl         The SSL/TLS object. (DTLS)
2349
 */
2350
static void AddTls13HandShakeHeader(byte* output, word32 length,
2351
                                    word32 fragOffset, word32 fragLength,
2352
                                    byte type, WOLFSSL* ssl)
2353
{
2354
    HandShakeHeader* hs;
2355
    (void)fragOffset;
2356
    (void)fragLength;
2357
    (void)ssl;
2358
2359
#ifdef WOLFSSL_DTLS13
2360
    /* message_hash type is used for a synthetic message that replaces the first
2361
       ClientHello in the hash transcript when using HelloRetryRequest. It will
2362
       never be transmitted and, as the DTLS-only fields must not be considered
2363
       when computing the hash transcript, we can avoid to use the DTLS
2364
       handshake header. */
2365
    if (ssl->options.dtls && type != message_hash) {
2366
        Dtls13HandshakeAddHeader(ssl, output, (enum HandShakeType)type, length);
2367
        return;
2368
    }
2369
#endif /* WOLFSSL_DTLS13 */
2370
2371
    /* handshake header */
2372
    hs = (HandShakeHeader*)output;
2373
    hs->type = type;
2374
    c32to24(length, hs->length);
2375
}
2376
2377
2378
/* Add both record layer and handshake header to message.
2379
 *
2380
 * output      The buffer to write the headers into.
2381
 * length      The length of the handshake data.
2382
 * type        The type of record layer message.
2383
 * ssl         The SSL/TLS object. (DTLS)
2384
 */
2385
static void AddTls13Headers(byte* output, word32 length, byte type,
2386
                            WOLFSSL* ssl)
2387
{
2388
    word32 lengthAdj = HANDSHAKE_HEADER_SZ;
2389
    word32 outputAdj = RECORD_HEADER_SZ;
2390
2391
#ifdef WOLFSSL_DTLS13
2392
    if (ssl->options.dtls) {
2393
        Dtls13AddHeaders(output, length, (enum HandShakeType)type, ssl);
2394
        return;
2395
    }
2396
#endif /* WOLFSSL_DTLS13 */
2397
2398
    AddTls13RecordHeader(output, length + lengthAdj, handshake, ssl);
2399
    AddTls13HandShakeHeader(output + outputAdj, length, 0, length, type, ssl);
2400
}
2401
2402
#if (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) \
2403
    && !defined(NO_CERTS)
2404
/* Add both record layer and fragment handshake header to message.
2405
 *
2406
 * output      The buffer to write the headers into.
2407
 * fragOffset  The offset of the fragment data. (DTLS)
2408
 * fragLength  The length of the fragment data. (DTLS)
2409
 * length      The length of the handshake data.
2410
 * type        The type of record layer message.
2411
 * ssl         The SSL/TLS object. (DTLS)
2412
 */
2413
static void AddTls13FragHeaders(byte* output, word32 fragSz, word32 fragOffset,
2414
                                word32 length, byte type, WOLFSSL* ssl)
2415
{
2416
    word32 lengthAdj = HANDSHAKE_HEADER_SZ;
2417
    word32 outputAdj = RECORD_HEADER_SZ;
2418
    (void)fragSz;
2419
2420
#ifdef WOLFSSL_DTLS13
2421
    /* we ignore fragmentation fields here because fragmentation logic for
2422
       DTLS1.3 is inside dtls13_handshake_send(). */
2423
    if (ssl->options.dtls) {
2424
        Dtls13AddHeaders(output, length, (enum HandShakeType)type, ssl);
2425
        return;
2426
    }
2427
#endif /* WOLFSSL_DTLS13 */
2428
2429
    AddTls13RecordHeader(output, fragSz + lengthAdj, handshake, ssl);
2430
    AddTls13HandShakeHeader(output + outputAdj, length, fragOffset, fragSz,
2431
                            type, ssl);
2432
}
2433
#endif /* (!NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER) && !NO_CERTS */
2434
2435
/* Write the sequence number into the buffer.
2436
 * No DTLS v1.3 support.
2437
 *
2438
 * ssl          The SSL/TLS object.
2439
 * verifyOrder  Which set of sequence numbers to use.
2440
 * out          The buffer to write into.
2441
 */
2442
static WC_INLINE void WriteSEQTls13(WOLFSSL* ssl, int verifyOrder, byte* out)
2443
609
{
2444
609
    word32 seq[2] = {0, 0};
2445
2446
609
    if (ssl->options.dtls) {
2447
#ifdef WOLFSSL_DTLS13
2448
        Dtls13GetSeq(ssl, verifyOrder, seq, 1);
2449
#endif /* WOLFSSL_DTLS13 */
2450
0
    }
2451
609
    else if (verifyOrder == PEER_ORDER) {
2452
45
        seq[0] = ssl->keys.peer_sequence_number_hi;
2453
45
        seq[1] = ssl->keys.peer_sequence_number_lo++;
2454
        /* handle rollover */
2455
45
        if (seq[1] > ssl->keys.peer_sequence_number_lo)
2456
0
            ssl->keys.peer_sequence_number_hi++;
2457
45
    }
2458
564
    else {
2459
564
        seq[0] = ssl->keys.sequence_number_hi;
2460
564
        seq[1] = ssl->keys.sequence_number_lo++;
2461
        /* handle rollover */
2462
564
        if (seq[1] > ssl->keys.sequence_number_lo)
2463
0
            ssl->keys.sequence_number_hi++;
2464
564
    }
2465
#ifdef WOLFSSL_DEBUG_TLS
2466
    WOLFSSL_MSG_EX("TLS 1.3 Write Sequence %d %d", seq[0], seq[1]);
2467
#endif
2468
2469
609
    c32toa(seq[0], out);
2470
609
    c32toa(seq[1], out + OPAQUE32_LEN);
2471
609
}
2472
2473
/* Build the nonce for TLS v1.3 encryption and decryption.
2474
 *
2475
 * ssl    The SSL/TLS object.
2476
 * nonce  The nonce data to use when encrypting or decrypting.
2477
 * iv     The derived IV.
2478
 * order  The side on which the message is to be or was sent.
2479
 */
2480
static WC_INLINE void BuildTls13Nonce(WOLFSSL* ssl, byte* nonce, const byte* iv,
2481
                                   int ivSz, int order)
2482
609
{
2483
609
    int seq_offset;
2484
    /* Ensure minimum nonce size for standard AEAD ciphers */
2485
609
    if (ivSz < AEAD_NONCE_SZ)
2486
0
        ivSz = AEAD_NONCE_SZ;
2487
609
    seq_offset = ivSz - SEQ_SZ;
2488
    /* The nonce is the IV with the sequence XORed into the last bytes. */
2489
609
    WriteSEQTls13(ssl, order, nonce + seq_offset);
2490
609
    XMEMCPY(nonce, iv, seq_offset);
2491
609
    xorbuf(nonce + seq_offset, iv + seq_offset, SEQ_SZ);
2492
609
}
2493
2494
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
2495
/* Encrypt with ChaCha20 and create authentication tag with Poly1305.
2496
 *
2497
 * ssl     The SSL/TLS object.
2498
 * output  The buffer to write encrypted data and authentication tag into.
2499
 *         May be the same pointer as input.
2500
 * input   The data to encrypt.
2501
 * sz      The number of bytes to encrypt.
2502
 * nonce   The nonce to use with ChaCha20.
2503
 * aad     The additional authentication data.
2504
 * aadSz   The size of the addition authentication data.
2505
 * tag     The authentication tag buffer.
2506
 * returns 0 on success, otherwise failure.
2507
 */
2508
static int ChaCha20Poly1305_Encrypt(WOLFSSL* ssl, byte* output,
2509
                                    const byte* input, word16 sz, byte* nonce,
2510
                                    const byte* aad, word16 aadSz, byte* tag)
2511
143
{
2512
143
    int    ret    = 0;
2513
143
    byte   poly[CHACHA20_256_KEY_SIZE];
2514
2515
    /* Poly1305 key is 256 bits of zero encrypted with ChaCha20. */
2516
143
    XMEMSET(poly, 0, sizeof(poly));
2517
2518
    /* Set the nonce for ChaCha and get Poly1305 key. */
2519
143
    ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 0);
2520
143
    if (ret != 0)
2521
0
        return ret;
2522
    /* Create Poly1305 key using ChaCha20 keystream. */
2523
143
    ret = wc_Chacha_Process(ssl->encrypt.chacha, poly, poly, sizeof(poly));
2524
143
    if (ret != 0)
2525
0
        return ret;
2526
#ifdef WOLFSSL_CHECK_MEM_ZERO
2527
    wc_MemZero_Add("ChaCha20Poly1305_Encrypt poly", poly, sizeof(poly));
2528
#endif
2529
143
    ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 1);
2530
143
    if (ret != 0)
2531
0
        return ret;
2532
    /* Encrypt the plain text. */
2533
143
    ret = wc_Chacha_Process(ssl->encrypt.chacha, output, input, sz);
2534
143
    if (ret != 0) {
2535
0
        ForceZero(poly, sizeof(poly));
2536
    #ifdef WOLFSSL_CHECK_MEM_ZERO
2537
        wc_MemZero_Check(poly, sizeof(poly));
2538
    #endif
2539
0
        return ret;
2540
0
    }
2541
2542
    /* Set key for Poly1305. */
2543
143
    ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly, sizeof(poly));
2544
143
    ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
2545
#ifdef WOLFSSL_CHECK_MEM_ZERO
2546
    wc_MemZero_Check(poly, sizeof(poly));
2547
#endif
2548
143
    if (ret != 0)
2549
0
        return ret;
2550
    /* Add authentication code of encrypted data to end. */
2551
143
    ret = wc_Poly1305_MAC(ssl->auth.poly1305, aad, aadSz, output, sz, tag,
2552
143
                                                              POLY1305_AUTH_SZ);
2553
2554
143
    return ret;
2555
143
}
2556
#endif
2557
2558
#ifdef HAVE_NULL_CIPHER
2559
/* Create authentication tag and copy data over input.
2560
 *
2561
 * ssl     The SSL/TLS object.
2562
 * output  The buffer to copy data into.
2563
 *         May be the same pointer as input.
2564
 * input   The data.
2565
 * sz      The number of bytes of data.
2566
 * nonce   The nonce to use with authentication.
2567
 * aad     The additional authentication data.
2568
 * aadSz   The size of the addition authentication data.
2569
 * tag     The authentication tag buffer.
2570
 * returns 0 on success, otherwise failure.
2571
 */
2572
static int Tls13IntegrityOnly_Encrypt(WOLFSSL* ssl, byte* output,
2573
                                      const byte* input, word16 sz,
2574
                                      const byte* nonce,
2575
                                      const byte* aad, word16 aadSz, byte* tag)
2576
{
2577
    int ret;
2578
2579
    /* HMAC: nonce | aad | input  */
2580
    ret = wc_HmacUpdate(ssl->encrypt.hmac, nonce, ssl->specs.iv_size);
2581
    if (ret == 0)
2582
        ret = wc_HmacUpdate(ssl->encrypt.hmac, aad, aadSz);
2583
    if (ret == 0)
2584
        ret = wc_HmacUpdate(ssl->encrypt.hmac, input, sz);
2585
    if (ret == 0)
2586
        ret = wc_HmacFinal(ssl->encrypt.hmac, tag);
2587
    /* Copy the input to output if not the same buffer */
2588
    if (ret == 0 && output != input)
2589
        XMEMCPY(output, input, sz);
2590
    return ret;
2591
}
2592
#endif
2593
2594
/* Encrypt data for TLS v1.3.
2595
 *
2596
 * ssl     The SSL/TLS object.
2597
 * output  The buffer to write encrypted data and authentication tag into.
2598
 *         May be the same pointer as input.
2599
 * input   The record header and data to encrypt.
2600
 * sz      The number of bytes to encrypt.
2601
 * aad     The additional authentication data.
2602
 * aadSz   The size of the addition authentication data.
2603
 * asyncOkay If non-zero can return WC_PENDING_E, otherwise blocks on crypto
2604
 * returns 0 on success, otherwise failure.
2605
 */
2606
static int EncryptTls13(WOLFSSL* ssl, byte* output, const byte* input,
2607
                        word16 sz, const byte* aad, word16 aadSz, int asyncOkay)
2608
{
2609
    int    ret    = 0;
2610
    word16 dataSz;
2611
    word16 macSz  = ssl->specs.aead_mac_size;
2612
    word32 nonceSz = 0;
2613
#ifdef WOLFSSL_ASYNC_CRYPT
2614
    WC_ASYNC_DEV* asyncDev = NULL;
2615
    word32 event_flags = WC_ASYNC_FLAG_CALL_AGAIN;
2616
#endif
2617
2618
    WOLFSSL_ENTER("EncryptTls13");
2619
    if (sz < ssl->specs.aead_mac_size)
2620
        return BUFFER_E;
2621
    dataSz = sz - ssl->specs.aead_mac_size;
2622
2623
    (void)output;
2624
    (void)input;
2625
    (void)sz;
2626
    (void)dataSz;
2627
    (void)macSz;
2628
    (void)asyncOkay;
2629
    (void)nonceSz;
2630
2631
#ifdef WOLFSSL_ASYNC_CRYPT
2632
    if (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E)) {
2633
        ssl->error = 0; /* clear async */
2634
    }
2635
#endif
2636
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
2637
    ret = tsip_Tls13AesEncrypt(ssl, output, input, dataSz);
2638
    if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
2639
        if (ret > 0) {
2640
            ret = 0; /* tsip_Tls13AesEncrypt returns output size */
2641
        }
2642
        return ret;
2643
    }
2644
    ret = 0;
2645
#endif /* WOLFSSL_RENESAS_TSIP_TLS */
2646
2647
    switch (ssl->encrypt.state) {
2648
        case CIPHER_STATE_BEGIN:
2649
        {
2650
        #ifdef WOLFSSL_DEBUG_TLS
2651
            WOLFSSL_MSG("Data to encrypt");
2652
            WOLFSSL_BUFFER(input, dataSz);
2653
            WOLFSSL_MSG("Additional Authentication Data");
2654
            WOLFSSL_BUFFER(aad, aadSz);
2655
        #endif
2656
2657
        #ifdef WOLFSSL_CIPHER_TEXT_CHECK
2658
            if (ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null &&
2659
                    dataSz >= sizeof(ssl->encrypt.sanityCheck)) {
2660
                XMEMCPY(ssl->encrypt.sanityCheck, input,
2661
                    sizeof(ssl->encrypt.sanityCheck));
2662
            }
2663
        #endif
2664
2665
        #ifdef CIPHER_NONCE
2666
            if (ssl->encrypt.nonce == NULL) {
2667
                ssl->encrypt.nonce = (byte*)XMALLOC(AEAD_MAX_IMP_SZ,
2668
                                                ssl->heap, DYNAMIC_TYPE_CIPHER);
2669
            #ifdef WOLFSSL_CHECK_MEM_ZERO
2670
                if (ssl->encrypt.nonce != NULL) {
2671
                    wc_MemZero_Add("EncryptTls13 nonce", ssl->encrypt.nonce,
2672
                        ssl->specs.iv_size);
2673
                }
2674
            #endif
2675
            }
2676
            if (ssl->encrypt.nonce == NULL)
2677
                return MEMORY_E;
2678
2679
            BuildTls13Nonce(ssl, ssl->encrypt.nonce, ssl->keys.aead_enc_imp_IV,
2680
                            ssl->specs.iv_size, CUR_ORDER);
2681
        #endif
2682
2683
            /* Advance state and proceed */
2684
            ssl->encrypt.state = CIPHER_STATE_DO;
2685
        }
2686
        FALL_THROUGH;
2687
2688
        case CIPHER_STATE_DO:
2689
        {
2690
            switch (ssl->specs.bulk_cipher_algorithm) {
2691
            #ifdef BUILD_AESGCM
2692
                case wolfssl_aes_gcm:
2693
                #ifdef WOLFSSL_ASYNC_CRYPT
2694
                    /* initialize event */
2695
                    asyncDev = &ssl->encrypt.aes->asyncDev;
2696
                    ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
2697
                    if (ret != 0)
2698
                        break;
2699
                #endif
2700
2701
                    nonceSz = AESGCM_NONCE_SZ;
2702
2703
                #if defined(HAVE_PK_CALLBACKS)
2704
                    ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN);
2705
                    if (ssl->ctx && ssl->ctx->PerformTlsRecordProcessingCb) {
2706
                        ret = ssl->ctx->PerformTlsRecordProcessingCb(ssl, 1,
2707
                                  output, input, dataSz,
2708
                                  ssl->encrypt.nonce, nonceSz,
2709
                                  output + dataSz, macSz,
2710
                                  aad, aadSz);
2711
                    }
2712
                    if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN))
2713
                #endif
2714
                    {
2715
2716
                #if ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
2717
                    (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
2718
                        ret = wc_AesGcmEncrypt(ssl->encrypt.aes, output, input,
2719
                            dataSz, ssl->encrypt.nonce, nonceSz,
2720
                            output + dataSz, macSz, aad, aadSz);
2721
                #else
2722
                        ret = wc_AesGcmSetExtIV(ssl->encrypt.aes,
2723
                                ssl->encrypt.nonce, nonceSz);
2724
                        if (ret == 0) {
2725
                            ret = wc_AesGcmEncrypt_ex(ssl->encrypt.aes, output,
2726
                                    input, dataSz, ssl->encrypt.nonce, nonceSz,
2727
                                    output + dataSz, macSz, aad, aadSz);
2728
                        }
2729
                #endif
2730
                    }
2731
                    break;
2732
            #endif
2733
2734
            #ifdef HAVE_AESCCM
2735
                case wolfssl_aes_ccm:
2736
                #ifdef WOLFSSL_ASYNC_CRYPT
2737
                    /* initialize event */
2738
                    asyncDev = &ssl->encrypt.aes->asyncDev;
2739
                    ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
2740
                    if (ret != 0)
2741
                        break;
2742
                #endif
2743
2744
                    nonceSz = AESCCM_NONCE_SZ;
2745
                #if defined(HAVE_PK_CALLBACKS)
2746
                    ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN);
2747
                    if (ssl->ctx && ssl->ctx->PerformTlsRecordProcessingCb) {
2748
                        ret = ssl->ctx->PerformTlsRecordProcessingCb(ssl, 1,
2749
                                  output, input, dataSz,
2750
                                  ssl->encrypt.nonce, nonceSz,
2751
                                  output + dataSz, macSz,
2752
                                  aad, aadSz);
2753
                    }
2754
                    if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN))
2755
                #endif
2756
                    {
2757
                #if ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
2758
                    (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
2759
                        ret = wc_AesCcmEncrypt(ssl->encrypt.aes, output, input,
2760
                            dataSz, ssl->encrypt.nonce, nonceSz,
2761
                            output + dataSz, macSz, aad, aadSz);
2762
                #else
2763
                        ret = wc_AesCcmSetNonce(ssl->encrypt.aes,
2764
                                ssl->encrypt.nonce, nonceSz);
2765
                        if (ret == 0) {
2766
                            ret = wc_AesCcmEncrypt_ex(ssl->encrypt.aes, output,
2767
                                    input, dataSz, ssl->encrypt.nonce, nonceSz,
2768
                                    output + dataSz, macSz, aad, aadSz);
2769
                        }
2770
                #endif
2771
                    }
2772
                    break;
2773
            #endif
2774
2775
            #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
2776
                case wolfssl_chacha:
2777
                    ret = ChaCha20Poly1305_Encrypt(ssl, output, input, dataSz,
2778
                        ssl->encrypt.nonce, aad, aadSz, output + dataSz);
2779
                    break;
2780
            #endif
2781
2782
            #ifdef WOLFSSL_SM4_GCM
2783
                case wolfssl_sm4_gcm:
2784
                    nonceSz = SM4_GCM_NONCE_SZ;
2785
                    ret = wc_Sm4GcmEncrypt(ssl->encrypt.sm4, output, input,
2786
                        dataSz, ssl->encrypt.nonce, nonceSz, output + dataSz,
2787
                        macSz, aad, aadSz);
2788
                    break;
2789
            #endif
2790
2791
            #ifdef WOLFSSL_SM4_CCM
2792
                case wolfssl_sm4_ccm:
2793
                    nonceSz = SM4_CCM_NONCE_SZ;
2794
                    ret = wc_Sm4CcmEncrypt(ssl->encrypt.sm4, output, input,
2795
                        dataSz, ssl->encrypt.nonce, nonceSz, output + dataSz,
2796
                        macSz, aad, aadSz);
2797
                    break;
2798
            #endif
2799
2800
            #ifdef HAVE_NULL_CIPHER
2801
                case wolfssl_cipher_null:
2802
                    ret = Tls13IntegrityOnly_Encrypt(ssl, output, input, dataSz,
2803
                        ssl->encrypt.nonce, aad, aadSz, output + dataSz);
2804
                    break;
2805
            #endif
2806
2807
                default:
2808
                    WOLFSSL_MSG("wolfSSL Encrypt programming error");
2809
                    return ENCRYPT_ERROR;
2810
            }
2811
2812
            /* Advance state */
2813
            ssl->encrypt.state = CIPHER_STATE_END;
2814
2815
        #ifdef WOLFSSL_ASYNC_CRYPT
2816
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
2817
                /* if async is not okay, then block */
2818
                if (!asyncOkay) {
2819
                    ret = wc_AsyncWait(ret, asyncDev, event_flags);
2820
                }
2821
                else {
2822
                    /* If pending, then leave and return will resume below */
2823
                    return wolfSSL_AsyncPush(ssl, asyncDev);
2824
                }
2825
            }
2826
        #endif
2827
        }
2828
        FALL_THROUGH;
2829
2830
        case CIPHER_STATE_END:
2831
        {
2832
        #ifdef WOLFSSL_DEBUG_TLS
2833
            #ifdef CIPHER_NONCE
2834
                WOLFSSL_MSG("Nonce");
2835
                WOLFSSL_BUFFER(ssl->encrypt.nonce, ssl->specs.iv_size);
2836
            #endif
2837
                WOLFSSL_MSG("Encrypted data");
2838
                WOLFSSL_BUFFER(output, dataSz);
2839
                WOLFSSL_MSG("Authentication Tag");
2840
                WOLFSSL_BUFFER(output + dataSz, macSz);
2841
        #endif
2842
2843
        #ifdef WOLFSSL_CIPHER_TEXT_CHECK
2844
            if (ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null &&
2845
                    dataSz >= sizeof(ssl->encrypt.sanityCheck) &&
2846
                XMEMCMP(output, ssl->encrypt.sanityCheck,
2847
                    sizeof(ssl->encrypt.sanityCheck)) == 0) {
2848
2849
                WOLFSSL_MSG("EncryptTls13 sanity check failed! Glitch?");
2850
                return ENCRYPT_ERROR;
2851
            }
2852
            ForceZero(ssl->encrypt.sanityCheck,
2853
                sizeof(ssl->encrypt.sanityCheck));
2854
        #endif
2855
        #ifdef WOLFSSL_CHECK_MEM_ZERO
2856
            if ((ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) &&
2857
                    (output != input) && (ret == 0)) {
2858
                wc_MemZero_Add("TLS 1.3 Encrypt plaintext", input, sz);
2859
            }
2860
        #endif
2861
2862
        #ifdef CIPHER_NONCE
2863
            ForceZero(ssl->encrypt.nonce, ssl->specs.iv_size);
2864
        #endif
2865
2866
            break;
2867
        }
2868
2869
        default:
2870
            break;
2871
    }
2872
2873
2874
    /* Reset state */
2875
    ssl->encrypt.state = CIPHER_STATE_BEGIN;
2876
2877
    return ret;
2878
}
2879
2880
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
2881
/* Decrypt with ChaCha20 and check authentication tag with Poly1305.
2882
 *
2883
 * ssl     The SSL/TLS object.
2884
 * output  The buffer to write decrypted data into.
2885
 *         May be the same pointer as input.
2886
 * input   The data to decrypt.
2887
 * sz      The number of bytes to decrypt.
2888
 * nonce   The nonce to use with ChaCha20.
2889
 * aad     The additional authentication data.
2890
 * aadSz   The size of the addition authentication data.
2891
 * tagIn   The authentication tag data from packet.
2892
 * returns 0 on success, otherwise failure.
2893
 */
2894
static int ChaCha20Poly1305_Decrypt(WOLFSSL* ssl, byte* output,
2895
                                    const byte* input, word16 sz, byte* nonce,
2896
                                    const byte* aad, word16 aadSz,
2897
                                    const byte* tagIn)
2898
11
{
2899
11
    int ret;
2900
11
    byte tag[POLY1305_AUTH_SZ];
2901
11
    byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for mac */
2902
2903
    /* Poly1305 key is 256 bits of zero encrypted with ChaCha20. */
2904
11
    XMEMSET(poly, 0, sizeof(poly));
2905
2906
    /* Set nonce and get Poly1305 key. */
2907
11
    ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 0);
2908
11
    if (ret != 0)
2909
0
        return ret;
2910
    /* Use ChaCha20 keystream to get Poly1305 key for tag. */
2911
11
    ret = wc_Chacha_Process(ssl->decrypt.chacha, poly, poly, sizeof(poly));
2912
11
    if (ret != 0)
2913
0
        return ret;
2914
#ifdef WOLFSSL_CHECK_MEM_ZERO
2915
    wc_MemZero_Add("ChaCha20Poly1305_Decrypt poly", poly, sizeof(poly));
2916
#endif
2917
11
    ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 1);
2918
11
    if (ret != 0) {
2919
0
        ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
2920
    #ifdef WOLFSSL_CHECK_MEM_ZERO
2921
        wc_MemZero_Check(poly, sizeof(poly));
2922
    #endif
2923
0
        return ret;
2924
0
    }
2925
2926
    /* Set key for Poly1305. */
2927
11
    ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly, sizeof(poly));
2928
11
    ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
2929
#ifdef WOLFSSL_CHECK_MEM_ZERO
2930
    wc_MemZero_Check(poly, sizeof(poly));
2931
#endif
2932
11
    if (ret != 0)
2933
0
        return ret;
2934
    /* Generate authentication tag for encrypted data. */
2935
11
    if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, aad, aadSz, input, sz, tag,
2936
11
                                                           sizeof(tag))) != 0) {
2937
0
        return ret;
2938
0
    }
2939
2940
    /* Check tag sent along with packet. */
2941
11
    if (ConstantCompare(tagIn, tag, POLY1305_AUTH_SZ) != 0) {
2942
11
        WOLFSSL_MSG("MAC did not match");
2943
11
        return VERIFY_MAC_ERROR;
2944
11
    }
2945
2946
    /* If the tag was good decrypt message. */
2947
0
    ret = wc_Chacha_Process(ssl->decrypt.chacha, output, input, sz);
2948
2949
0
    return ret;
2950
11
}
2951
#endif
2952
2953
#ifdef HAVE_NULL_CIPHER
2954
/* Check HMAC tag and copy over input.
2955
 *
2956
 * ssl     The SSL/TLS object.
2957
 * output  The buffer to copy data into.
2958
 *         May be the same pointer as input.
2959
 * input   The data.
2960
 * sz      The number of bytes of data.
2961
 * nonce   The nonce to use with authentication.
2962
 * aad     The additional authentication data.
2963
 * aadSz   The size of the addition authentication data.
2964
 * tagIn   The authentication tag data from packet.
2965
 * returns 0 on success, otherwise failure.
2966
 */
2967
static int Tls13IntegrityOnly_Decrypt(WOLFSSL* ssl, byte* output,
2968
                                      const byte* input, word16 sz,
2969
                                      const byte* nonce,
2970
                                      const byte* aad, word16 aadSz,
2971
                                      const byte* tagIn)
2972
{
2973
    int ret;
2974
    byte hmac[WC_MAX_DIGEST_SIZE];
2975
2976
    /* HMAC: nonce | aad | input  */
2977
    ret = wc_HmacUpdate(ssl->decrypt.hmac, nonce, ssl->specs.iv_size);
2978
    if (ret == 0)
2979
        ret = wc_HmacUpdate(ssl->decrypt.hmac, aad, aadSz);
2980
    if (ret == 0)
2981
        ret = wc_HmacUpdate(ssl->decrypt.hmac, input, sz);
2982
    if (ret == 0)
2983
        ret = wc_HmacFinal(ssl->decrypt.hmac, hmac);
2984
    /* Check authentication tag matches */
2985
    if (ret == 0 && ConstantCompare(tagIn, hmac, ssl->specs.hash_size) != 0)
2986
        ret = DECRYPT_ERROR;
2987
    /* Copy the input to output if not the same buffer */
2988
    if (ret == 0 && output != input)
2989
        XMEMCPY(output, input, sz);
2990
    ForceZero(hmac, sizeof(hmac));
2991
    return ret;
2992
}
2993
#endif
2994
2995
/* Decrypt data for TLS v1.3.
2996
 *
2997
 * ssl     The SSL/TLS object.
2998
 * output  The buffer to write decrypted data into.
2999
 *         May be the same pointer as input.
3000
 * input   The data to decrypt and authentication tag.
3001
 * sz      The length of the encrypted data plus authentication tag.
3002
 * aad     The additional authentication data.
3003
 * aadSz   The size of the addition authentication data.
3004
 * returns 0 on success, otherwise failure.
3005
 */
3006
int DecryptTls13(WOLFSSL* ssl, byte* output, const byte* input, word16 sz,
3007
                 const byte* aad, word16 aadSz)
3008
0
{
3009
0
    int    ret    = 0;
3010
0
    word16 dataSz;
3011
0
    word16 macSz  = ssl->specs.aead_mac_size;
3012
0
    word32 nonceSz = 0;
3013
3014
0
    WOLFSSL_ENTER("DecryptTls13");
3015
0
    if (sz < ssl->specs.aead_mac_size) {
3016
0
        return BAD_FUNC_ARG;
3017
0
    }
3018
0
    dataSz = sz - ssl->specs.aead_mac_size;
3019
3020
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
3021
    ret = tsip_Tls13AesDecrypt(ssl, output, input, sz);
3022
3023
    if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
3024
        #ifndef WOLFSSL_EARLY_DATA
3025
        if (ret < 0) {
3026
            ret = VERIFY_MAC_ERROR;
3027
            WOLFSSL_ERROR_VERBOSE(ret);
3028
        }
3029
        #endif
3030
        return ret;
3031
    }
3032
#endif
3033
3034
#ifdef WOLFSSL_ASYNC_CRYPT
3035
    ret = wolfSSL_AsyncPop(ssl, &ssl->decrypt.state);
3036
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
3037
        /* check for still pending */
3038
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
3039
            return ret;
3040
3041
        ssl->error = 0; /* clear async */
3042
3043
        /* let failures through so CIPHER_STATE_END logic is run */
3044
    }
3045
    else
3046
#endif
3047
0
    {
3048
        /* Reset state */
3049
0
        ret = 0;
3050
0
        ssl->decrypt.state = CIPHER_STATE_BEGIN;
3051
0
    }
3052
3053
0
    (void)output;
3054
0
    (void)input;
3055
0
    (void)sz;
3056
0
    (void)dataSz;
3057
0
    (void)macSz;
3058
0
    (void)nonceSz;
3059
3060
0
    switch (ssl->decrypt.state) {
3061
0
        case CIPHER_STATE_BEGIN:
3062
0
        {
3063
        #ifdef WOLFSSL_DEBUG_TLS
3064
            WOLFSSL_MSG("Data to decrypt");
3065
            WOLFSSL_BUFFER(input, dataSz);
3066
            WOLFSSL_MSG("Additional Authentication Data");
3067
            WOLFSSL_BUFFER(aad, aadSz);
3068
            WOLFSSL_MSG("Authentication tag");
3069
            WOLFSSL_BUFFER(input + dataSz, macSz);
3070
        #endif
3071
3072
0
        #ifdef CIPHER_NONCE
3073
0
            if (ssl->decrypt.nonce == NULL) {
3074
0
                ssl->decrypt.nonce = (byte*)XMALLOC(AEAD_MAX_IMP_SZ,
3075
0
                                                ssl->heap, DYNAMIC_TYPE_CIPHER);
3076
            #ifdef WOLFSSL_CHECK_MEM_ZERO
3077
                if (ssl->decrypt.nonce != NULL) {
3078
                    wc_MemZero_Add("DecryptTls13 nonce", ssl->decrypt.nonce,
3079
                        ssl->specs.iv_size);
3080
                }
3081
            #endif
3082
0
            }
3083
0
            if (ssl->decrypt.nonce == NULL)
3084
0
                return MEMORY_E;
3085
3086
0
            BuildTls13Nonce(ssl, ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
3087
0
                            ssl->specs.iv_size, PEER_ORDER);
3088
0
        #endif
3089
3090
            /* Advance state and proceed */
3091
0
            ssl->decrypt.state = CIPHER_STATE_DO;
3092
0
        }
3093
0
        FALL_THROUGH;
3094
3095
0
        case CIPHER_STATE_DO:
3096
0
        {
3097
0
            switch (ssl->specs.bulk_cipher_algorithm) {
3098
0
            #ifdef BUILD_AESGCM
3099
0
                case wolfssl_aes_gcm:
3100
                #ifdef WOLFSSL_ASYNC_CRYPT
3101
                    /* initialize event */
3102
                    ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
3103
                        WC_ASYNC_FLAG_NONE);
3104
                    if (ret != 0)
3105
                        break;
3106
                #endif
3107
3108
0
                    nonceSz = AESGCM_NONCE_SZ;
3109
3110
                #if defined(HAVE_PK_CALLBACKS)
3111
                    ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN);
3112
                    if (ssl->ctx && ssl->ctx->PerformTlsRecordProcessingCb) {
3113
                        ret = ssl->ctx->PerformTlsRecordProcessingCb(ssl, 0,
3114
                                  output, input, dataSz,
3115
                                  ssl->decrypt.nonce, nonceSz,
3116
                                  (byte *)(input + dataSz), macSz,
3117
                                  aad, aadSz);
3118
                    }
3119
                    if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN))
3120
                #endif
3121
0
                    {
3122
3123
0
                        ret = wc_AesGcmDecrypt(ssl->decrypt.aes, output, input,
3124
0
                            dataSz, ssl->decrypt.nonce, nonceSz,
3125
0
                            input + dataSz, macSz, aad, aadSz);
3126
3127
                #ifdef WOLFSSL_ASYNC_CRYPT
3128
                        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
3129
                            ret = wolfSSL_AsyncPush(ssl,
3130
                                &ssl->decrypt.aes->asyncDev);
3131
                        }
3132
                #endif
3133
3134
0
                    }
3135
0
                    break;
3136
0
            #endif
3137
3138
0
            #ifdef HAVE_AESCCM
3139
0
                case wolfssl_aes_ccm:
3140
                #ifdef WOLFSSL_ASYNC_CRYPT
3141
                    /* initialize event */
3142
                    ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
3143
                        WC_ASYNC_FLAG_NONE);
3144
                    if (ret != 0)
3145
                        break;
3146
                #endif
3147
3148
0
                    nonceSz = AESCCM_NONCE_SZ;
3149
                #if defined(HAVE_PK_CALLBACKS)
3150
                    ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN);
3151
                    if (ssl->ctx && ssl->ctx->PerformTlsRecordProcessingCb) {
3152
                        ret = ssl->ctx->PerformTlsRecordProcessingCb(ssl, 0,
3153
                                  output, input, dataSz,
3154
                                  ssl->decrypt.nonce, nonceSz,
3155
                                  (byte *)(input + dataSz), macSz,
3156
                                  aad, aadSz);
3157
                    }
3158
                    if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN))
3159
                #endif
3160
0
                    {
3161
0
                        ret = wc_AesCcmDecrypt(ssl->decrypt.aes, output, input,
3162
0
                            dataSz, ssl->decrypt.nonce, nonceSz,
3163
0
                            input + dataSz, macSz, aad, aadSz);
3164
                #ifdef WOLFSSL_ASYNC_CRYPT
3165
                        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
3166
                            ret = wolfSSL_AsyncPush(ssl,
3167
                                &ssl->decrypt.aes->asyncDev);
3168
                        }
3169
                #endif
3170
0
                    }
3171
0
                    break;
3172
0
            #endif
3173
3174
0
            #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
3175
0
                case wolfssl_chacha:
3176
0
                    ret = ChaCha20Poly1305_Decrypt(ssl, output, input, dataSz,
3177
0
                        ssl->decrypt.nonce, aad, aadSz, input + dataSz);
3178
0
                    break;
3179
0
            #endif
3180
3181
0
            #ifdef WOLFSSL_SM4_GCM
3182
0
                case wolfssl_sm4_gcm:
3183
0
                    nonceSz = SM4_GCM_NONCE_SZ;
3184
0
                    ret = wc_Sm4GcmDecrypt(ssl->decrypt.sm4, output, input,
3185
0
                        dataSz, ssl->decrypt.nonce, nonceSz, input + dataSz,
3186
0
                        macSz, aad, aadSz);
3187
0
                    break;
3188
0
            #endif
3189
3190
0
            #ifdef WOLFSSL_SM4_CCM
3191
0
                case wolfssl_sm4_ccm:
3192
0
                    nonceSz = SM4_CCM_NONCE_SZ;
3193
0
                    ret = wc_Sm4CcmDecrypt(ssl->decrypt.sm4, output, input,
3194
0
                        dataSz, ssl->decrypt.nonce, nonceSz, input + dataSz,
3195
0
                        macSz, aad, aadSz);
3196
0
                    break;
3197
0
            #endif
3198
3199
            #ifdef HAVE_NULL_CIPHER
3200
                case wolfssl_cipher_null:
3201
                    ret = Tls13IntegrityOnly_Decrypt(ssl, output, input, dataSz,
3202
                        ssl->decrypt.nonce, aad, aadSz, input + dataSz);
3203
                    break;
3204
            #endif
3205
0
                default:
3206
0
                    WOLFSSL_MSG("wolfSSL Decrypt programming error");
3207
0
                    return DECRYPT_ERROR;
3208
0
            }
3209
3210
            /* Advance state */
3211
0
            ssl->decrypt.state = CIPHER_STATE_END;
3212
3213
        #ifdef WOLFSSL_ASYNC_CRYPT
3214
            /* If pending, leave now */
3215
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
3216
                return ret;
3217
            }
3218
        #endif
3219
0
        }
3220
0
        FALL_THROUGH;
3221
3222
0
        case CIPHER_STATE_END:
3223
0
        {
3224
        #ifdef WOLFSSL_DEBUG_TLS
3225
            #ifdef CIPHER_NONCE
3226
                WOLFSSL_MSG("Nonce");
3227
                WOLFSSL_BUFFER(ssl->decrypt.nonce, ssl->specs.iv_size);
3228
            #endif
3229
                WOLFSSL_MSG("Decrypted data");
3230
                WOLFSSL_BUFFER(output, dataSz);
3231
        #endif
3232
        #ifdef WOLFSSL_CHECK_MEM_ZERO
3233
            if ((ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) &&
3234
                    (ret == 0)) {
3235
                wc_MemZero_Add("TLS 1.3 Decrypted data", output, sz);
3236
            }
3237
        #endif
3238
3239
0
        #ifdef CIPHER_NONCE
3240
0
            ForceZero(ssl->decrypt.nonce, ssl->specs.iv_size);
3241
0
        #endif
3242
3243
0
            break;
3244
0
        }
3245
3246
0
       default:
3247
0
            break;
3248
0
    }
3249
3250
0
    if (ret < 0) {
3251
0
        WOLFSSL_ERROR_VERBOSE(ret);
3252
0
    }
3253
3254
0
    return ret;
3255
0
}
3256
3257
/* Persistable BuildTls13Message arguments */
3258
typedef struct BuildMsg13Args {
3259
    word32 sz;
3260
    word32 idx;
3261
    word32 headerSz;
3262
    word16 size;
3263
    word32 paddingSz;
3264
} BuildMsg13Args;
3265
3266
static void FreeBuildMsg13Args(WOLFSSL* ssl, void* pArgs)
3267
564
{
3268
564
    BuildMsg13Args* args = (BuildMsg13Args*)pArgs;
3269
3270
564
    (void)ssl;
3271
564
    (void)args;
3272
3273
    /* no allocations in BuildTls13Message */
3274
564
}
3275
3276
/* Build SSL Message, encrypted.
3277
 * TLS v1.3 encryption is AEAD only.
3278
 *
3279
 * ssl         The SSL/TLS object.
3280
 * output      The buffer to write record message to.
3281
 * outSz       Size of the buffer being written into.
3282
 * input       The record data to encrypt (excluding record header).
3283
 * inSz        The size of the record data.
3284
 * type        The recorder header content type.
3285
 * hashOutput  Whether to hash the unencrypted record data.
3286
 * sizeOnly    Only want the size of the record message.
3287
 * asyncOkay   If non-zero can return WC_PENDING_E, otherwise blocks on crypto
3288
 * returns the size of the encrypted record message or negative value on error.
3289
 */
3290
int BuildTls13Message(WOLFSSL* ssl, byte* output, int outSz, const byte* input,
3291
                int inSz, int type, int hashOutput, int sizeOnly, int asyncOkay)
3292
0
{
3293
0
    int ret;
3294
0
    BuildMsg13Args* args;
3295
0
    BuildMsg13Args  lcl_args;
3296
3297
0
    WOLFSSL_ENTER("BuildTls13Message");
3298
3299
0
    if (ssl == NULL) {
3300
0
        return BAD_FUNC_ARG;
3301
0
    }
3302
3303
#ifdef WOLFSSL_ASYNC_CRYPT
3304
    ret = WC_NO_PENDING_E;
3305
    if (asyncOkay) {
3306
        WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
3307
3308
        if (ssl->async == NULL) {
3309
            ssl->async = (struct WOLFSSL_ASYNC*)
3310
                    XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
3311
                            DYNAMIC_TYPE_ASYNC);
3312
            if (ssl->async == NULL)
3313
                return MEMORY_E;
3314
        }
3315
        args = (BuildMsg13Args*)ssl->async->args;
3316
3317
        ret = wolfSSL_AsyncPop(ssl, &ssl->options.buildMsgState);
3318
        if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
3319
            /* Check for error */
3320
            if (ret < 0)
3321
                goto exit_buildmsg;
3322
        }
3323
    }
3324
    else
3325
#endif
3326
0
    {
3327
0
        args = &lcl_args;
3328
0
    }
3329
3330
    /* Reset state */
3331
#ifdef WOLFSSL_ASYNC_CRYPT
3332
    if (ret == WC_NO_ERR_TRACE(WC_NO_PENDING_E))
3333
#endif
3334
0
    {
3335
0
        ret = 0;
3336
0
        ssl->options.buildMsgState = BUILD_MSG_BEGIN;
3337
0
        XMEMSET(args, 0, sizeof(BuildMsg13Args));
3338
3339
0
        args->headerSz = RECORD_HEADER_SZ;
3340
#ifdef WOLFSSL_DTLS13
3341
        if (ssl->options.dtls)
3342
            args->headerSz = Dtls13GetRlHeaderLength(ssl, 1);
3343
#endif /* WOLFSSL_DTLS13 */
3344
3345
0
        args->sz = args->headerSz + (word32)inSz;
3346
0
        args->idx  = args->headerSz;
3347
3348
    #ifdef WOLFSSL_ASYNC_CRYPT
3349
        if (asyncOkay)
3350
            ssl->async->freeArgs = FreeBuildMsg13Args;
3351
    #endif
3352
0
    }
3353
3354
0
    switch (ssl->options.buildMsgState) {
3355
0
        case BUILD_MSG_BEGIN:
3356
0
        {
3357
           /* catch mistaken sizeOnly parameter */
3358
0
            if (sizeOnly) {
3359
0
                if (output || input) {
3360
0
                    WOLFSSL_MSG("BuildTls13Message with sizeOnly "
3361
0
                                "doesn't need input or output");
3362
0
                    return BAD_FUNC_ARG;
3363
0
                }
3364
0
            }
3365
0
            else if (output == NULL || input == NULL) {
3366
0
                return BAD_FUNC_ARG;
3367
0
            }
3368
3369
            /* Record layer content type at the end of record data. */
3370
0
            args->sz++;
3371
            /* Authentication data at the end. */
3372
0
            args->sz += ssl->specs.aead_mac_size;
3373
#ifdef WOLFSSL_DTLS13
3374
            /* Pad to minimum length */
3375
            if (ssl->options.dtls &&
3376
                    args->sz < (word32)Dtls13MinimumRecordLength(ssl)) {
3377
                args->paddingSz = Dtls13MinimumRecordLength(ssl) - args->sz;
3378
                args->sz = Dtls13MinimumRecordLength(ssl);
3379
            }
3380
#endif
3381
0
            if (sizeOnly)
3382
0
                return (int)args->sz;
3383
3384
0
            if (args->sz > (word32)outSz) {
3385
0
                WOLFSSL_MSG("Oops, want to write past output buffer size");
3386
0
                return BUFFER_E;
3387
0
            }
3388
3389
            /* Record data length. */
3390
0
            args->size = (word16)(args->sz - args->headerSz);
3391
            /* Write/update the record header with the new size.
3392
             * Always have the content type as application data for encrypted
3393
             * messages in TLS v1.3.
3394
             */
3395
3396
0
            if (ssl->options.dtls) {
3397
#ifdef WOLFSSL_DTLS13
3398
                Dtls13RlAddCiphertextHeader(ssl, output, args->size);
3399
#endif /* WOLFSSL_DTLS13 */
3400
0
            }
3401
0
            else {
3402
0
                AddTls13RecordHeader(output, args->size, application_data, ssl);
3403
0
            }
3404
3405
            /* TLS v1.3 can do in place encryption. */
3406
0
            if (input != output + args->idx)
3407
0
                XMEMCPY(output + args->idx, input, (size_t)inSz);
3408
0
            args->idx += (word32)inSz;
3409
3410
0
            ssl->options.buildMsgState = BUILD_MSG_HASH;
3411
0
        }
3412
0
        FALL_THROUGH;
3413
3414
0
        case BUILD_MSG_HASH:
3415
0
        {
3416
0
            if (hashOutput) {
3417
0
                ret = HashOutput(ssl, output, (int)args->headerSz + inSz, 0);
3418
0
                if (ret != 0)
3419
0
                    goto exit_buildmsg;
3420
0
            }
3421
3422
            /* The real record content type goes at the end of the data. */
3423
0
            output[args->idx++] = (byte)type;
3424
            /* Double check that any necessary padding is zero'd out */
3425
0
            XMEMSET(output + args->idx, 0, args->paddingSz);
3426
0
            args->idx += args->paddingSz;
3427
3428
0
            ssl->options.buildMsgState = BUILD_MSG_ENCRYPT;
3429
0
        }
3430
0
        FALL_THROUGH;
3431
3432
0
        case BUILD_MSG_ENCRYPT:
3433
0
        {
3434
#ifdef WOLFSSL_QUIC
3435
            if (WOLFSSL_IS_QUIC(ssl)) {
3436
                /* QUIC does not use encryption of the TLS Record Layer.
3437
                 * Return the original length + added headers
3438
                 * and restore it in the record header. */
3439
                AddTls13RecordHeader(output, (word32)inSz, (byte)type, ssl);
3440
                ret = (int)args->headerSz + inSz;
3441
                goto exit_buildmsg;
3442
            }
3443
#endif
3444
        #ifdef ATOMIC_USER
3445
            if (ssl->ctx->MacEncryptCb) {
3446
                /* User Record Layer Callback handling */
3447
                byte* mac = output + args->idx;
3448
                output += args->headerSz;
3449
3450
                ret = ssl->ctx->MacEncryptCb(ssl, mac, output, (unsigned int)inSz, (byte)type, 0,
3451
                        output, output, args->size, ssl->MacEncryptCtx);
3452
            }
3453
            else
3454
        #endif
3455
0
            {
3456
0
                const byte* aad = output;
3457
0
                output += args->headerSz;
3458
0
                ret = EncryptTls13(ssl, output, output, args->size, aad,
3459
0
                                   (word16)args->headerSz, asyncOkay);
3460
0
                if (ret != 0) {
3461
                #ifdef WOLFSSL_ASYNC_CRYPT
3462
                    if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
3463
                #endif
3464
0
                    {
3465
                        /* Zeroize plaintext. */
3466
0
                        ForceZero(output, args->size);
3467
0
                    }
3468
0
                }
3469
#ifdef WOLFSSL_DTLS13
3470
                if (ret == 0 && ssl->options.dtls) {
3471
                    /* AAD points to the header. Reuse the variable  */
3472
                    ret = Dtls13EncryptRecordNumber(ssl, (byte*)aad,
3473
                                                    (word16)args->sz);
3474
                }
3475
#endif /* WOLFSSL_DTLS13 */
3476
0
            }
3477
0
            break;
3478
0
        }
3479
3480
0
        default:
3481
0
            break;
3482
0
    }
3483
3484
0
exit_buildmsg:
3485
3486
0
    WOLFSSL_LEAVE("BuildTls13Message", ret);
3487
3488
#ifdef WOLFSSL_ASYNC_CRYPT
3489
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
3490
        return ret;
3491
    }
3492
#endif
3493
3494
    /* make sure build message state is reset */
3495
0
    ssl->options.buildMsgState = BUILD_MSG_BEGIN;
3496
3497
    /* return sz on success */
3498
0
    if (ret == 0) {
3499
0
        ret = (int)args->sz;
3500
0
    }
3501
0
    else {
3502
0
        WOLFSSL_ERROR_VERBOSE(ret);
3503
0
    }
3504
3505
    /* Final cleanup */
3506
#ifdef WOLFSSL_ASYNC_CRYPT
3507
    if (asyncOkay)
3508
        FreeAsyncCtx(ssl, 0);
3509
    else
3510
#endif
3511
0
        FreeBuildMsg13Args(ssl, args);
3512
3513
0
    return ret;
3514
0
}
3515
3516
#if !defined(NO_WOLFSSL_CLIENT) || (!defined(NO_WOLFSSL_SERVER) && \
3517
    (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)) && \
3518
    (defined(WOLFSSL_PSK_ONE_ID) || defined(WOLFSSL_PRIORITIZE_PSK)))
3519
/* Find the cipher suite in the suites set in the SSL.
3520
 *
3521
 * ssl    SSL/TLS object.
3522
 * suite  Cipher suite to look for.
3523
 * returns 1 when suite is found in SSL/TLS object's list and 0 otherwise.
3524
 */
3525
int FindSuiteSSL(const WOLFSSL* ssl, byte* suite)
3526
10
{
3527
10
    word16 i;
3528
10
    const Suites* suites = WOLFSSL_SUITES(ssl);
3529
3530
18
    for (i = 0; i < suites->suiteSz; i += 2) {
3531
18
        if (suites->suites[i+0] == suite[0] &&
3532
18
                suites->suites[i+1] == suite[1]) {
3533
10
            return 1;
3534
10
        }
3535
18
    }
3536
3537
0
    return 0;
3538
10
}
3539
#endif
3540
3541
#ifndef NO_PSK
3542
/* Get the MAC algorithm for the TLS 1.3 cipher suite.
3543
 *
3544
 * @param [in] suite.
3545
 * @return  A value from wc_MACAlgorithm enumeration.
3546
 */
3547
byte SuiteMac(const byte* suite)
3548
{
3549
    byte mac = no_mac;
3550
3551
    if (suite[0] == TLS13_BYTE) {
3552
        switch (suite[1]) {
3553
        #ifdef BUILD_TLS_AES_128_GCM_SHA256
3554
            case TLS_AES_128_GCM_SHA256:
3555
                mac = sha256_mac;
3556
                break;
3557
        #endif
3558
        #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
3559
            case TLS_CHACHA20_POLY1305_SHA256:
3560
                mac = sha256_mac;
3561
                break;
3562
        #endif
3563
        #ifdef BUILD_TLS_AES_128_CCM_SHA256
3564
            case TLS_AES_128_CCM_SHA256:
3565
                mac = sha256_mac;
3566
                break;
3567
        #endif
3568
        #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
3569
            case TLS_AES_128_CCM_8_SHA256:
3570
                mac = sha256_mac;
3571
                break;
3572
        #endif
3573
        #ifdef BUILD_TLS_AES_256_GCM_SHA384
3574
            case TLS_AES_256_GCM_SHA384:
3575
                mac = sha384_mac;
3576
                break;
3577
        #endif
3578
            default:
3579
                break;
3580
        }
3581
    }
3582
#if (defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
3583
     defined(WOLFSSL_SM3)
3584
    else if (suite[0] == CIPHER_BYTE) {
3585
        switch (suite[1]) {
3586
        #ifdef BUILD_TLS_SM4_GCM_SM3
3587
            case TLS_SM4_GCM_SM3:
3588
                mac = sm3_mac;
3589
                break;
3590
        #endif
3591
        #ifdef BUILD_TLS_SM4_CCM_SM3
3592
            case TLS_SM4_CCM_SM3:
3593
                mac = sm3_mac;
3594
                break;
3595
        #endif
3596
            default:
3597
                break;
3598
        }
3599
    }
3600
#endif
3601
#ifdef HAVE_NULL_CIPHER
3602
    else if (suite[0] == ECC_BYTE) {
3603
        switch (suite[1]) {
3604
        #ifdef BUILD_TLS_SHA256_SHA256
3605
            case TLS_SHA256_SHA256:
3606
                mac = sha256_mac;
3607
                break;
3608
        #endif
3609
        #ifdef BUILD_TLS_SHA384_SHA384
3610
            case TLS_SHA384_SHA384:
3611
                mac = sha384_mac;
3612
                break;
3613
        #endif
3614
            default:
3615
                break;
3616
        }
3617
    }
3618
#endif
3619
3620
    return mac;
3621
}
3622
#endif
3623
3624
#if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
3625
/* Create Cookie extension using the hash of the first ClientHello.
3626
 *
3627
 * ssl     SSL/TLS object.
3628
 * hash    The hash data.
3629
 * hashSz  The size of the hash data in bytes.
3630
 * returns 0 on success, otherwise failure.
3631
 */
3632
int CreateCookieExt(const WOLFSSL* ssl, byte* hash, word16 hashSz,
3633
                    TLSX** exts, byte cipherSuite0, byte cipherSuite)
3634
{
3635
    int  ret;
3636
    byte mac[WC_MAX_DIGEST_SIZE] = {0};
3637
    WC_DECLARE_VAR(cookieHmac, Hmac, 1, ssl->heap);
3638
    byte cookieType = 0;
3639
    byte macSz = 0;
3640
    byte cookie[OPAQUE8_LEN + WC_MAX_DIGEST_SIZE + OPAQUE16_LEN * 2];
3641
    TLSX* ext;
3642
    word16 cookieSz = 0;
3643
3644
    if (hash == NULL || hashSz == 0) {
3645
        return BAD_FUNC_ARG;
3646
    }
3647
3648
    if (ssl->buffers.tls13CookieSecret.buffer == NULL ||
3649
            ssl->buffers.tls13CookieSecret.length == 0) {
3650
        WOLFSSL_MSG("Missing DTLS 1.3 cookie secret");
3651
        return COOKIE_ERROR;
3652
    }
3653
3654
    /* Cookie Data = Hash Len | Hash | CS | KeyShare Group */
3655
    cookie[cookieSz++] = (byte)hashSz;
3656
    XMEMCPY(cookie + cookieSz, hash, hashSz);
3657
    cookieSz += hashSz;
3658
    cookie[cookieSz++] = cipherSuite0;
3659
    cookie[cookieSz++] = cipherSuite;
3660
    if ((ext = TLSX_Find(*exts, TLSX_KEY_SHARE)) != NULL) {
3661
        KeyShareEntry* kse = (KeyShareEntry*)ext->data;
3662
        if (kse == NULL) {
3663
            WOLFSSL_MSG("KeyShareEntry can't be empty when negotiating "
3664
                        "parameters");
3665
            return BAD_STATE_E;
3666
        }
3667
        c16toa(kse->group, cookie + cookieSz);
3668
        cookieSz += OPAQUE16_LEN;
3669
    }
3670
3671
#ifndef NO_SHA256
3672
    cookieType = WC_SHA256;
3673
    macSz = WC_SHA256_DIGEST_SIZE;
3674
#elif defined(WOLFSSL_SHA384)
3675
    cookieType = WC_SHA384;
3676
    macSz = WC_SHA384_DIGEST_SIZE;
3677
#elif defined(WOLFSSL_TLS13_SHA512)
3678
    cookieType = WC_SHA512;
3679
    macSz = WC_SHA512_DIGEST_SIZE;
3680
#elif defined(WOLFSSL_SM3)
3681
    cookieType = WC_SM3;
3682
    macSz = WC_SM3_DIGEST_SIZE;
3683
#else
3684
    #error "No digest to available to use with HMAC for cookies."
3685
#endif /* NO_SHA */
3686
3687
    WC_ALLOC_VAR_EX(cookieHmac, Hmac, 1, ssl->heap, DYNAMIC_TYPE_HMAC,
3688
                    return MEMORY_E);
3689
3690
    ret = wc_HmacInit(cookieHmac, ssl->heap, ssl->devId);
3691
    if (ret == 0) {
3692
        ret = wc_HmacSetKey(cookieHmac, cookieType,
3693
                            ssl->buffers.tls13CookieSecret.buffer,
3694
                            ssl->buffers.tls13CookieSecret.length);
3695
    }
3696
    if (ret == 0)
3697
        ret = wc_HmacUpdate(cookieHmac, cookie, cookieSz);
3698
#ifdef WOLFSSL_DTLS13
3699
    /* Tie cookie to peer address */
3700
    if (ret == 0) {
3701
        /* peerLock not necessary. Still in handshake phase. */
3702
        if (ssl->options.dtls && ssl->buffers.dtlsCtx.peer.sz > 0) {
3703
            ret = wc_HmacUpdate(cookieHmac,
3704
                (byte*)ssl->buffers.dtlsCtx.peer.sa,
3705
                ssl->buffers.dtlsCtx.peer.sz);
3706
        }
3707
    }
3708
#endif
3709
    if (ret == 0)
3710
        ret = wc_HmacFinal(cookieHmac, mac);
3711
3712
    wc_HmacFree(cookieHmac);
3713
    WC_FREE_VAR_EX(cookieHmac, ssl->heap, DYNAMIC_TYPE_HMAC);
3714
    if (ret != 0)
3715
        return ret;
3716
3717
    /* The cookie data is the hash and the integrity check. */
3718
    return TLSX_Cookie_Use(ssl, cookie, cookieSz, mac, macSz, 1, exts);
3719
}
3720
#endif
3721
3722
#ifdef WOLFSSL_DTLS13
3723
#define HRR_MAX_HS_HEADER_SZ DTLS_HANDSHAKE_HEADER_SZ
3724
#else
3725
#define HRR_MAX_HS_HEADER_SZ HANDSHAKE_HEADER_SZ
3726
#endif /* WOLFSSL_DTLS13 */
3727
3728
static int CreateCookie(const WOLFSSL* ssl, byte** hash, byte* hashSz,
3729
                            Hashes* hashes, TLSX** exts)
3730
{
3731
    int    ret = 0;
3732
3733
    (void)exts;
3734
3735
    *hash = NULL;
3736
    switch (ssl->specs.mac_algorithm) {
3737
    #ifndef NO_SHA256
3738
        case sha256_mac:
3739
            *hash = hashes->sha256;
3740
            break;
3741
    #endif
3742
    #ifdef WOLFSSL_SHA384
3743
        case sha384_mac:
3744
            *hash = hashes->sha384;
3745
            break;
3746
    #endif
3747
    #ifdef WOLFSSL_TLS13_SHA512
3748
        case sha512_mac:
3749
            *hash = hashes->sha512;
3750
            break;
3751
    #endif
3752
    #ifdef WOLFSSL_SM3
3753
        case sm3_mac:
3754
            *hash = hashes->sm3;
3755
            break;
3756
    #endif
3757
    }
3758
    *hashSz = ssl->specs.hash_size;
3759
3760
    /* check hash */
3761
    if (*hash == NULL && *hashSz > 0)
3762
        return BAD_FUNC_ARG;
3763
3764
#if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
3765
    if (ssl->options.sendCookie && ssl->options.side == WOLFSSL_SERVER_END)
3766
        ret = CreateCookieExt(ssl, *hash, *hashSz, exts,
3767
                ssl->options.cipherSuite0, ssl->options.cipherSuite);
3768
#endif
3769
    return ret;
3770
}
3771
3772
/* Restart the handshake hash with a hash of the previous messages.
3773
 *
3774
 * ssl The SSL/TLS object.
3775
 * returns 0 on success, otherwise failure.
3776
 */
3777
int RestartHandshakeHash(WOLFSSL* ssl)
3778
0
{
3779
0
    int    ret;
3780
0
    byte   header[HANDSHAKE_HEADER_SZ] = {0};
3781
0
    Hashes hashes;
3782
0
    byte*  hash = NULL;
3783
0
    byte   hashSz = 0;
3784
3785
0
    ret = BuildCertHashes(ssl, &hashes);
3786
0
    if (ret != 0)
3787
0
        return ret;
3788
0
    ret = CreateCookie(ssl, &hash, &hashSz, &hashes, &ssl->extensions);
3789
0
    if (ret != 0)
3790
0
        return ret;
3791
#if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
3792
    if (ssl->options.sendCookie && ssl->options.side == WOLFSSL_SERVER_END)
3793
        return 0;
3794
#endif
3795
3796
0
    AddTls13HandShakeHeader(header, hashSz, 0, 0, message_hash, ssl);
3797
3798
#ifdef WOLFSSL_DEBUG_TLS
3799
    WOLFSSL_MSG("Restart Hash");
3800
    WOLFSSL_BUFFER(hash, hashSz);
3801
#endif
3802
3803
0
    ret = InitHandshakeHashes(ssl);
3804
0
    if (ret != 0)
3805
0
        return ret;
3806
0
    ret = HashRaw(ssl, header, sizeof(header));
3807
0
    if (ret != 0)
3808
0
        return ret;
3809
0
    return HashRaw(ssl, hash, hashSz);
3810
0
}
3811
3812
#if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)
3813
/* The value in the random field of a ServerHello to indicate
3814
 * HelloRetryRequest.
3815
 */
3816
static byte helloRetryRequestRandom[] = {
3817
    0xCF, 0x21, 0xAD, 0x74, 0xE5, 0x9A, 0x61, 0x11,
3818
    0xBE, 0x1D, 0x8C, 0x02, 0x1E, 0x65, 0xB8, 0x91,
3819
    0xC2, 0xA2, 0x11, 0x16, 0x7A, 0xBB, 0x8C, 0x5E,
3820
    0x07, 0x9E, 0x09, 0xE2, 0xC8, 0xA8, 0x33, 0x9C
3821
};
3822
#endif
3823
3824
#ifdef HAVE_ECH
3825
/* returns the index of the first supported cipher suite, -1 if none */
3826
int EchConfigGetSupportedCipherSuite(WOLFSSL_EchConfig* config)
3827
{
3828
    int i = 0;
3829
3830
    if (!wc_HpkeKemIsSupported(config->kemId)) {
3831
        WOLFSSL_MSG("ECH config: KEM not supported");
3832
        return WOLFSSL_FATAL_ERROR;
3833
    }
3834
3835
    for (i = 0; i < config->numCipherSuites; i++) {
3836
        if (wc_HpkeKdfIsSupported(config->cipherSuites[i].kdfId) &&
3837
                wc_HpkeAeadIsSupported(config->cipherSuites[i].aeadId)) {
3838
            return i;
3839
        }
3840
    }
3841
3842
    WOLFSSL_MSG("ECH config: KDF or AEAD not supported");
3843
    return WOLFSSL_FATAL_ERROR;
3844
}
3845
3846
/* Hash the inner client hello, initializing the hsHashesEch field if needed.
3847
 * This should receive the client hello without outer_extensions 'encoding'
3848
 *
3849
 * ssl      SSL/TLS object.
3850
 * ech      ECH object.
3851
 * returns 0 on success and otherwise failure.
3852
 */
3853
static int EchHashHelloInner(WOLFSSL* ssl, WOLFSSL_ECH* ech)
3854
{
3855
    int ret = 0;
3856
    int headerSz;
3857
    word32 realSz;
3858
    HS_Hashes* tmpHashes;
3859
#ifndef NO_WOLFSSL_CLIENT
3860
    byte falseHeader[HRR_MAX_HS_HEADER_SZ];
3861
#endif
3862
3863
    if (ssl == NULL || ech == NULL) {
3864
        return BAD_FUNC_ARG;
3865
    }
3866
3867
#ifdef WOLFSSL_DTLS13
3868
    headerSz = ssl->options.dtls ? DTLS13_HANDSHAKE_HEADER_SZ :
3869
                                   HANDSHAKE_HEADER_SZ;
3870
#else
3871
    headerSz = HANDSHAKE_HEADER_SZ;
3872
#endif
3873
3874
    realSz = ech->innerClientHelloLen;
3875
3876
    tmpHashes = ssl->hsHashes;
3877
3878
    ssl->hsHashes = ssl->hsHashesEch;
3879
    if (ssl->hsHashes == NULL) {
3880
        ret = InitHandshakeHashes(ssl);
3881
        if (ret == 0) {
3882
            ssl->hsHashesEch = ssl->hsHashes;
3883
        }
3884
    }
3885
3886
    if (ret == 0) {
3887
#ifndef NO_WOLFSSL_CLIENT
3888
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
3889
            /* client-side: innerClientHello contains body only */
3890
            AddTls13HandShakeHeader(falseHeader, realSz, 0, 0, client_hello,
3891
                                    ssl);
3892
            ret = HashRaw(ssl, falseHeader, headerSz);
3893
            if (ret == 0) {
3894
                ret = HashRaw(ssl, ech->innerClientHello, realSz);
3895
            }
3896
        }
3897
#endif
3898
#ifndef NO_WOLFSSL_SERVER
3899
        if (ssl->options.side == WOLFSSL_SERVER_END) {
3900
            /* server-side: innerClientHello contains header + body */
3901
            ret = HashRaw(ssl, ech->innerClientHello, headerSz + realSz);
3902
        }
3903
#endif
3904
    }
3905
3906
    ssl->hsHashes = tmpHashes;
3907
    return ret;
3908
}
3909
3910
/* Calculate the 8 ECH confirmation bytes.
3911
 *
3912
 * ssl            SSL/TLS object.
3913
 * label          Ascii string describing ECH acceptance or rejection.
3914
 * labelSz        Length of label excluding NULL character.
3915
 * input          The buffer to calculate confirmation off of.
3916
 * acceptOffset   Where the 8 ECH confirmation bytes start.
3917
 * helloSz        Size of hello message.
3918
 * isHrr          Whether message is a HelloRetryRequest or not.
3919
 * acceptExpanded An 8 byte array to store calculated confirmation to.
3920
 * returns 0 on success and otherwise failure.
3921
 */
3922
static int EchCalcAcceptance(WOLFSSL* ssl, byte* label, word16 labelSz,
3923
    const byte* input, int acceptOffset, int helloSz, byte isHrr,
3924
    byte* acceptExpanded)
3925
{
3926
    int ret = 0;
3927
    int digestType = 0;
3928
    int digestSize = 0;
3929
    int hashSz = 0;
3930
    int headerSz;
3931
    HS_Hashes* tmpHashes;
3932
    HS_Hashes* acceptHash = NULL;
3933
    byte zeros[WC_MAX_DIGEST_SIZE];
3934
    byte transcriptEchConf[WC_MAX_DIGEST_SIZE];
3935
    byte clientHelloInnerHash[WC_MAX_DIGEST_SIZE];
3936
    byte expandLabelPrk[WC_MAX_DIGEST_SIZE];
3937
    byte messageHashHeader[HRR_MAX_HS_HEADER_SZ];
3938
3939
    XMEMSET(zeros, 0, sizeof(zeros));
3940
    XMEMSET(transcriptEchConf, 0, sizeof(transcriptEchConf));
3941
    XMEMSET(clientHelloInnerHash, 0, sizeof(clientHelloInnerHash));
3942
    XMEMSET(expandLabelPrk, 0, sizeof(expandLabelPrk));
3943
3944
#ifdef WOLFSSL_CHECK_MEM_ZERO
3945
    wc_MemZero_Add("ECH PRK", expandLabelPrk, sizeof(expandLabelPrk));
3946
#endif
3947
3948
    tmpHashes = ssl->hsHashes;
3949
    ssl->hsHashes = ssl->hsHashesEch;
3950
3951
#ifdef WOLFSSL_DTLS13
3952
    headerSz = ssl->options.dtls ? DTLS13_HANDSHAKE_HEADER_SZ :
3953
                                   HANDSHAKE_HEADER_SZ;
3954
#else
3955
    headerSz = HANDSHAKE_HEADER_SZ;
3956
#endif
3957
3958
    if (isHrr) {
3959
        /* the transcript hash of ClientHelloInner1 */
3960
        ret = GetMsgHash(ssl, clientHelloInnerHash);
3961
        if (ret > 0) {
3962
            hashSz = ret;
3963
            ret = 0;
3964
        }
3965
        else if (ret == 0) {
3966
            ret = HASH_TYPE_E;
3967
        }
3968
3969
        /* restart ECH transcript hash, similar to RestartHandshakeHash but
3970
         * don't add a cookie */
3971
        if (ret == 0) {
3972
            ret = InitHandshakeHashes(ssl);
3973
        }
3974
        if (ret == 0) {
3975
            ssl->hsHashesEch = ssl->hsHashes;
3976
            AddTls13HandShakeHeader(messageHashHeader, (word32)hashSz, 0, 0,
3977
                message_hash, ssl);
3978
            ret = HashRaw(ssl, messageHashHeader, headerSz);
3979
        }
3980
        if (ret == 0) {
3981
            ret = HashRaw(ssl, clientHelloInnerHash, (word32)hashSz);
3982
        }
3983
    }
3984
3985
    /* hash with zeros for confirmation computation */
3986
    if (ret == 0) {
3987
        ret = InitHandshakeHashesAndCopy(ssl, ssl->hsHashesEch, &acceptHash);
3988
    }
3989
    if (ret == 0) {
3990
        ssl->hsHashes = acceptHash;
3991
        ret = HashRaw(ssl, input, acceptOffset);
3992
    }
3993
    if (ret == 0) {
3994
        ret = HashRaw(ssl, zeros, ECH_ACCEPT_CONFIRMATION_SZ);
3995
    }
3996
    if (ret == 0) {
3997
        ret = HashRaw(ssl, input + acceptOffset + ECH_ACCEPT_CONFIRMATION_SZ,
3998
            helloSz + headerSz - (acceptOffset + ECH_ACCEPT_CONFIRMATION_SZ));
3999
    }
4000
4001
    /* get the modified transcript hash */
4002
    if (ret == 0) {
4003
        ret = GetMsgHash(ssl, transcriptEchConf);
4004
        if (ret > 0) {
4005
            ret = 0;
4006
        }
4007
        else if (ret == 0) {
4008
            ret = HASH_TYPE_E;
4009
        }
4010
    }
4011
4012
    /* pick the right type and size based on mac_algorithm */
4013
    if (ret == 0) {
4014
        switch (ssl->specs.mac_algorithm) {
4015
#ifndef NO_SHA256
4016
            case sha256_mac:
4017
                digestType = WC_SHA256;
4018
                digestSize = WC_SHA256_DIGEST_SIZE;
4019
                break;
4020
#endif /* !NO_SHA256 */
4021
#ifdef WOLFSSL_SHA384
4022
            case sha384_mac:
4023
                digestType = WC_SHA384;
4024
                digestSize = WC_SHA384_DIGEST_SIZE;
4025
                break;
4026
#endif /* WOLFSSL_SHA384 */
4027
#ifdef WOLFSSL_TLS13_SHA512
4028
            case sha512_mac:
4029
                digestType = WC_SHA512;
4030
                digestSize = WC_SHA512_DIGEST_SIZE;
4031
                break;
4032
#endif /* WOLFSSL_TLS13_SHA512 */
4033
#ifdef WOLFSSL_SM3
4034
            case sm3_mac:
4035
                digestType = WC_SM3;
4036
                digestSize = WC_SM3_DIGEST_SIZE;
4037
                break;
4038
#endif /* WOLFSSL_SM3 */
4039
            default:
4040
                ret = WOLFSSL_FATAL_ERROR;
4041
                break;
4042
        }
4043
    }
4044
4045
    /* extract clientRandomInner with a key of all zeros */
4046
    if (ret == 0) {
4047
        PRIVATE_KEY_UNLOCK();
4048
    #if !defined(HAVE_FIPS) || \
4049
        (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(6,0))
4050
        ret = wc_HKDF_Extract_ex(digestType, zeros, (word32)digestSize,
4051
            ssl->arrays->clientRandomInner, RAN_LEN, expandLabelPrk,
4052
            ssl->heap, ssl->devId);
4053
    #else
4054
        ret = wc_HKDF_Extract(digestType, zeros, digestSize,
4055
            ssl->arrays->clientRandomInner, RAN_LEN, expandLabelPrk);
4056
    #endif
4057
        PRIVATE_KEY_LOCK();
4058
    }
4059
4060
    /* tls expand with the confirmation label */
4061
    if (ret == 0) {
4062
        PRIVATE_KEY_UNLOCK();
4063
#ifdef WOLFSSL_DTLS13
4064
        if (ssl->options.dtls) {
4065
            ret = Tls13HKDFExpandKeyLabel(ssl, acceptExpanded,
4066
                ECH_ACCEPT_CONFIRMATION_SZ, expandLabelPrk, (word32)digestSize,
4067
                dtls13ProtocolLabel, DTLS13_PROTOCOL_LABEL_SZ, label, labelSz,
4068
                transcriptEchConf, (word32)digestSize, digestType,
4069
                WOLFSSL_SERVER_END);
4070
        }
4071
        else
4072
#endif
4073
        {
4074
            ret = Tls13HKDFExpandKeyLabel(ssl, acceptExpanded,
4075
                ECH_ACCEPT_CONFIRMATION_SZ, expandLabelPrk, (word32)digestSize,
4076
                tls13ProtocolLabel, TLS13_PROTOCOL_LABEL_SZ, label, labelSz,
4077
                transcriptEchConf, (word32)digestSize, digestType,
4078
                WOLFSSL_SERVER_END);
4079
        }
4080
        PRIVATE_KEY_LOCK();
4081
    }
4082
4083
    if (acceptHash != NULL) {
4084
        ssl->hsHashes = acceptHash;
4085
        FreeHandshakeHashes(ssl);
4086
    }
4087
4088
    ssl->hsHashes = tmpHashes;
4089
    ForceZero(expandLabelPrk, sizeof(expandLabelPrk));
4090
#ifdef WOLFSSL_CHECK_MEM_ZERO
4091
    wc_MemZero_Check(expandLabelPrk, sizeof(expandLabelPrk));
4092
#endif
4093
    return ret;
4094
}
4095
#endif
4096
4097
#ifndef NO_WOLFSSL_CLIENT
4098
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
4099
#if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_PSK_ONE_ID) && \
4100
    !defined(NO_PSK)
4101
/**
4102
* convert mac algorithm to WOLFSSL_EVP_MD
4103
* @param mac_alg mac algorithm
4104
* @return const WOLFSSL_EVP_MD on successful, otherwise NULL
4105
*/
4106
static const WOLFSSL_EVP_MD* ssl_handshake_md(const byte mac_alg)
4107
{
4108
    switch(mac_alg) {
4109
        case no_mac:
4110
            return NULL;
4111
    #ifndef NO_MD5
4112
        case md5_mac:
4113
            return wolfSSL_EVP_md5();
4114
    #endif
4115
    #ifndef NO_SHA
4116
        case sha_mac:
4117
            return wolfSSL_EVP_sha1();
4118
    #endif
4119
    #ifdef WOLFSSL_SHA224
4120
        case sha224_mac:
4121
            return wolfSSL_EVP_sha224();
4122
    #endif
4123
        case sha256_mac:
4124
            return wolfSSL_EVP_sha256();
4125
    #ifdef WOLFSSL_SHA384
4126
        case sha384_mac:
4127
            return wolfSSL_EVP_sha384();
4128
    #endif
4129
    #ifdef WOLFSSL_SHA512
4130
        case sha512_mac:
4131
            return wolfSSL_EVP_sha512();
4132
    #endif
4133
        case rmd_mac:
4134
        case blake2b_mac:
4135
            WOLFSSL_MSG("no suitable EVP_MD");
4136
            return NULL;
4137
        default:
4138
            WOLFSSL_MSG("Unknown mac algorithm");
4139
            return NULL;
4140
    }
4141
}
4142
#endif
4143
/* Setup pre-shared key based on the details in the extension data.
4144
 *
4145
 * ssl          SSL/TLS object.
4146
 * psk          Pre-shared key extension data.
4147
 * clientHello  Whether called from client_hello construction.
4148
 * returns 0 on success, PSK_KEY_ERROR when the client PSK callback fails and
4149
 * other negative value on failure.
4150
 */
4151
static int SetupPskKey(WOLFSSL* ssl, PreSharedKey* psk, int clientHello)
4152
0
{
4153
0
#if defined(HAVE_SESSION_TICKET) || !defined(WOLFSSL_PSK_ONE_ID)
4154
0
    int ret;
4155
0
#endif
4156
0
    byte suite[2];
4157
4158
0
    if (psk == NULL)
4159
0
        return BAD_FUNC_ARG;
4160
4161
0
    if (!HaveUniqueSessionObj(ssl)) {
4162
0
        WOLFSSL_MSG("Unable to have unique session object");
4163
0
        WOLFSSL_ERROR_VERBOSE(MEMORY_ERROR);
4164
0
        return MEMORY_ERROR;
4165
0
    }
4166
4167
0
    suite[0] = ssl->options.cipherSuite0;
4168
0
    suite[1] = ssl->options.cipherSuite;
4169
4170
0
#ifdef HAVE_SESSION_TICKET
4171
0
    if (psk->resumption) {
4172
0
        if (clientHello) {
4173
0
            suite[0] = psk->cipherSuite0;
4174
0
            suite[1] = psk->cipherSuite;
4175
4176
            /* Ensure cipher suite is supported or changed suite to one with
4177
             * the same MAC algorithm. */
4178
0
            if (!FindSuiteSSL(ssl, suite)) {
4179
0
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
4180
0
                return PSK_KEY_ERROR;
4181
0
            }
4182
4183
0
            ssl->options.cipherSuite0 = suite[0];
4184
0
            ssl->options.cipherSuite = suite[1];
4185
4186
            /* Setting mac for binder and keys for deriving EarlyData. */
4187
0
            ret = SetCipherSpecs(ssl);
4188
0
            if (ret != 0)
4189
0
                return ret;
4190
0
        }
4191
4192
    #ifdef WOLFSSL_EARLY_DATA
4193
        if (ssl->session->maxEarlyDataSz == 0)
4194
            ssl->earlyData = no_early_data;
4195
    #endif
4196
        /* Resumption PSK is master secret. */
4197
0
        ssl->arrays->psk_keySz = ssl->specs.hash_size;
4198
0
        if ((ret = DeriveResumptionPSK(ssl, ssl->session->ticketNonce.data,
4199
0
                   ssl->session->ticketNonce.len, ssl->arrays->psk_key)) != 0) {
4200
0
            return ret;
4201
0
        }
4202
0
        if (!clientHello) {
4203
            /* CLIENT: using secret in ticket for peer authentication. */
4204
0
            ssl->options.peerAuthGood = 1;
4205
0
        }
4206
0
    }
4207
0
#endif
4208
#ifndef NO_PSK
4209
    if (!psk->resumption) {
4210
        /* Get the pre-shared key. */
4211
#ifndef WOLFSSL_PSK_ONE_ID
4212
        const char* cipherName = NULL;
4213
    #ifdef OPENSSL_EXTRA
4214
        WOLFSSL_SESSION* psksession = NULL;
4215
    #endif
4216
4217
        /* Set the client identity to use. */
4218
        if (psk->identityLen > MAX_PSK_ID_LEN)
4219
            return PSK_KEY_ERROR;
4220
        XMEMSET(ssl->arrays->client_identity, 0,
4221
            sizeof(ssl->arrays->client_identity));
4222
        XMEMCPY(ssl->arrays->client_identity, psk->identity, psk->identityLen);
4223
4224
    #ifdef WOLFSSL_DEBUG_TLS
4225
        WOLFSSL_MSG("PSK cipher suite:");
4226
        WOLFSSL_MSG(GetCipherNameInternal(psk->cipherSuite0, psk->cipherSuite));
4227
    #endif
4228
4229
        /* Get the pre-shared key. */
4230
    #ifdef OPENSSL_EXTRA
4231
        if (ssl->options.session_psk_cb != NULL) {
4232
            const unsigned char* id = NULL;
4233
            size_t idlen = 0;
4234
            const WOLFSSL_EVP_MD* handshake_md = NULL;
4235
4236
            if (ssl->msgsReceived.got_hello_retry_request >= 1) {
4237
                handshake_md = ssl_handshake_md(ssl->specs.mac_algorithm);
4238
            }
4239
            /* OpenSSL compatible callback that gets cached session. */
4240
            if (ssl->options.session_psk_cb(ssl, handshake_md, &id, &idlen,
4241
                                                            &psksession) == 0) {
4242
                wolfSSL_FreeSession(ssl->ctx, psksession);
4243
                WOLFSSL_MSG("psk session callback failed");
4244
                return PSK_KEY_ERROR;
4245
            }
4246
            if (psksession != NULL) {
4247
                if (idlen > MAX_PSK_KEY_LEN) {
4248
                    wolfSSL_FreeSession(ssl->ctx, psksession);
4249
                    WOLFSSL_MSG("psk key length is too long");
4250
                    WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
4251
                    return PSK_KEY_ERROR;
4252
                }
4253
4254
                ssl->arrays->psk_keySz = (word32)idlen;
4255
                XMEMCPY(ssl->arrays->psk_key, id, idlen);
4256
                suite[0] = psksession->cipherSuite0;
4257
                suite[1] = psksession->cipherSuite;
4258
                /* Not needed anymore. */
4259
                wolfSSL_FreeSession(ssl->ctx, psksession);
4260
                /* Leave pointer not NULL to indicate success with callback. */
4261
            }
4262
        }
4263
        if (psksession != NULL) {
4264
            /* Don't try other callbacks - we have an answer. */
4265
        }
4266
        else
4267
    #endif /* OPENSSL_EXTRA */
4268
        if (ssl->options.client_psk_cs_cb != NULL) {
4269
        #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
4270
            ssl->arrays->client_identity[0] = 0;
4271
        #endif
4272
            /* Lookup key again for next identity. */
4273
            ssl->arrays->psk_keySz = ssl->options.client_psk_cs_cb(
4274
                ssl, ssl->arrays->server_hint,
4275
                ssl->arrays->client_identity, MAX_PSK_ID_LEN,
4276
                ssl->arrays->psk_key, MAX_PSK_KEY_LEN,
4277
                GetCipherNameInternal(psk->cipherSuite0, psk->cipherSuite));
4278
            if (clientHello) {
4279
                /* Use PSK cipher suite. */
4280
                ssl->options.cipherSuite0 = psk->cipherSuite0;
4281
                ssl->options.cipherSuite  = psk->cipherSuite;
4282
            }
4283
            else {
4284
                byte pskCS[2];
4285
                pskCS[0] = psk->cipherSuite0;
4286
                pskCS[1] = psk->cipherSuite;
4287
4288
                /* Ensure PSK and negotiated cipher suites have same hash. */
4289
                if (SuiteMac(pskCS) != SuiteMac(suite)) {
4290
                    WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
4291
                    return PSK_KEY_ERROR;
4292
                }
4293
                /* Negotiated cipher suite is to be used - update PSK. */
4294
                psk->cipherSuite0 = suite[0];
4295
                psk->cipherSuite  = suite[1];
4296
            }
4297
        }
4298
        else if (ssl->options.client_psk_tls13_cb != NULL) {
4299
            byte cipherSuite0;
4300
            byte cipherSuite;
4301
            int cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE;
4302
4303
            ssl->arrays->psk_keySz = ssl->options.client_psk_tls13_cb(ssl,
4304
                    ssl->arrays->server_hint, ssl->arrays->client_identity,
4305
                    MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN,
4306
                    &cipherName);
4307
            if (GetCipherSuiteFromName(cipherName, &cipherSuite0,
4308
                            &cipherSuite, NULL, NULL, &cipherSuiteFlags) != 0) {
4309
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
4310
                return PSK_KEY_ERROR;
4311
            }
4312
            ssl->options.cipherSuite0 = cipherSuite0;
4313
            ssl->options.cipherSuite  = cipherSuite;
4314
            (void)cipherSuiteFlags;
4315
        }
4316
        else {
4317
            ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
4318
                    ssl->arrays->server_hint, ssl->arrays->client_identity,
4319
                    MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
4320
            ssl->options.cipherSuite0 = TLS13_BYTE;
4321
            ssl->options.cipherSuite  = WOLFSSL_DEF_PSK_CIPHER;
4322
        }
4323
        if (ssl->arrays->psk_keySz == 0 ||
4324
                (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
4325
            (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
4326
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
4327
            return PSK_KEY_ERROR;
4328
        }
4329
4330
        ret = SetCipherSpecs(ssl);
4331
        if (ret != 0)
4332
            return ret;
4333
#else
4334
        /* PSK information loaded during setting of default TLS extensions. */
4335
#endif /* !WOLFSSL_PSK_ONE_ID */
4336
4337
        if (!clientHello && (psk->cipherSuite0 != suite[0] ||
4338
                             psk->cipherSuite  != suite[1])) {
4339
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
4340
            return PSK_KEY_ERROR;
4341
        }
4342
4343
        if (!clientHello) {
4344
#ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
4345
            if (ssl->options.certWithExternPsk) {
4346
                /* Certificate authentication is still required. */
4347
                ssl->options.peerAuthGood = 0;
4348
            }
4349
            else
4350
#endif
4351
            {
4352
                /* CLIENT: using PSK for peer authentication. */
4353
                ssl->options.peerAuthGood = 1;
4354
            }
4355
        }
4356
    }
4357
#endif
4358
4359
0
#ifdef HAVE_SUPPORTED_CURVES
4360
0
    if (!clientHello) {
4361
0
        TLSX* ext;
4362
0
        word32 modes;
4363
0
        KeyShareEntry* kse = NULL;
4364
4365
        /* Get the PSK key exchange modes the client wants to negotiate. */
4366
0
        ext = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
4367
0
        if (ext == NULL) {
4368
0
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
4369
0
            return PSK_KEY_ERROR;
4370
0
        }
4371
0
        modes = ext->val;
4372
4373
0
        ext = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
4374
0
        if (ext != NULL) {
4375
0
            kse = (KeyShareEntry*)ext->data;
4376
0
        }
4377
        /* Use (EC)DHE for forward-security if possible. */
4378
0
        if (((modes & (1 << PSK_DHE_KE)) != 0) && (!ssl->options.noPskDheKe) &&
4379
0
                                                (kse != NULL) && kse->derived) {
4380
0
            if ((kse->session != 0) && (kse->session != kse->group)) {
4381
0
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
4382
0
                return PSK_KEY_ERROR;
4383
0
            }
4384
0
        }
4385
0
        else if (ssl->options.onlyPskDheKe) {
4386
0
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
4387
0
            return PSK_KEY_ERROR;
4388
0
        }
4389
0
        else if (ssl->options.noPskDheKe) {
4390
0
            ssl->arrays->preMasterSz = 0;
4391
0
        }
4392
0
    }
4393
0
    else
4394
0
#endif
4395
0
    if (ssl->options.noPskDheKe) {
4396
0
        ssl->arrays->preMasterSz = 0;
4397
0
    }
4398
4399
    /* Derive the early secret using the PSK. */
4400
0
    return DeriveEarlySecret(ssl);
4401
0
}
4402
4403
/* Derive and write the binders into the ClientHello in space left when
4404
 * writing the Pre-Shared Key extension.
4405
 *
4406
 * ssl     The SSL/TLS object.
4407
 * output  The buffer containing the ClientHello.
4408
 * idx     The index at the end of the completed ClientHello.
4409
 * returns 0 on success and otherwise failure.
4410
 */
4411
static int WritePSKBinders(WOLFSSL* ssl, byte* output, word32 idx)
4412
{
4413
    int           ret;
4414
    TLSX*         ext;
4415
    PreSharedKey* current;
4416
    byte          binderKey[WC_MAX_DIGEST_SIZE];
4417
    word16        len;
4418
4419
    WOLFSSL_ENTER("WritePSKBinders");
4420
4421
    if (idx > WOLFSSL_MAX_16BIT) {
4422
        return INPUT_SIZE_E;
4423
    }
4424
4425
    ext = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
4426
    if (ext == NULL)
4427
        return SANITY_MSG_E;
4428
4429
    /* Get the size of the binders to determine where to write binders. */
4430
    ret = TLSX_PreSharedKey_GetSizeBinders((PreSharedKey*)ext->data,
4431
                                                            client_hello, &len);
4432
    if (ret < 0)
4433
        return ret;
4434
    idx -= len;
4435
4436
    /* Hash truncated ClientHello - up to binders. */
4437
#ifdef WOLFSSL_DTLS13
4438
    if (ssl->options.dtls)
4439
        ret = Dtls13HashHandshake(ssl, output + Dtls13GetRlHeaderLength(ssl, 0),
4440
                                 (word16)idx - Dtls13GetRlHeaderLength(ssl, 0));
4441
    else
4442
#endif /* WOLFSSL_DTLS13 */
4443
        ret = HashOutput(ssl, output, (int)idx, 0);
4444
4445
    if (ret != 0)
4446
        return ret;
4447
4448
    current = (PreSharedKey*)ext->data;
4449
#ifdef WOLFSSL_CHECK_MEM_ZERO
4450
    if (current != NULL) {
4451
        wc_MemZero_Add("WritePSKBinders binderKey", binderKey,
4452
            sizeof(binderKey));
4453
    }
4454
#endif
4455
    /* Calculate the binder for each identity based on previous handshake data.
4456
     */
4457
    while (current != NULL) {
4458
        if ((ret = SetupPskKey(ssl, current, 1)) != 0)
4459
            break;
4460
4461
    #ifdef HAVE_SESSION_TICKET
4462
        if (current->resumption)
4463
            ret = DeriveBinderKeyResume(ssl, binderKey);
4464
    #endif
4465
    #ifndef NO_PSK
4466
        if (!current->resumption)
4467
            ret = DeriveBinderKey(ssl, binderKey);
4468
    #endif
4469
        if (ret != 0)
4470
            break;
4471
4472
        /* Derive the Finished message secret. */
4473
        ret = DeriveFinishedSecret(ssl, binderKey,
4474
                                   ssl->keys.client_write_MAC_secret,
4475
                                   0 /* neither end */);
4476
        if (ret != 0)
4477
            break;
4478
4479
        /* Build the HMAC of the handshake message data = binder. */
4480
        ret = BuildTls13HandshakeHmac(ssl, ssl->keys.client_write_MAC_secret,
4481
            current->binder, &current->binderLen);
4482
        if (ret != 0)
4483
            break;
4484
4485
        current = current->next;
4486
    }
4487
4488
    ForceZero(binderKey, sizeof(binderKey));
4489
#ifdef WOLFSSL_CHECK_MEM_ZERO
4490
    wc_MemZero_Check(binderKey, sizeof(binderKey));
4491
#endif
4492
    if (ret != 0)
4493
        return ret;
4494
4495
    /* Data entered into extension, now write to message. */
4496
    ret = TLSX_PreSharedKey_WriteBinders((PreSharedKey*)ext->data, output + idx,
4497
                                                            client_hello, &len);
4498
    if (ret < 0)
4499
        return ret;
4500
4501
    /* Hash binders to complete the hash of the ClientHello. */
4502
    ret = HashRaw(ssl, output + idx, len);
4503
    if (ret < 0)
4504
        return ret;
4505
4506
    #ifdef WOLFSSL_EARLY_DATA
4507
    if (ssl->earlyData != no_early_data) {
4508
        if ((ret = SetupPskKey(ssl, (PreSharedKey*)ext->data, 1)) != 0)
4509
            return ret;
4510
4511
        /* Derive early data encryption key. */
4512
        ret = DeriveTls13Keys(ssl, early_data_key, ENCRYPT_SIDE_ONLY, 1);
4513
        if (ret != 0)
4514
            return ret;
4515
        if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
4516
            return ret;
4517
4518
    }
4519
    #endif
4520
4521
    WOLFSSL_LEAVE("WritePSKBinders", ret);
4522
4523
    return ret;
4524
}
4525
#endif
4526
4527
static void GetTls13SessionId(WOLFSSL* ssl, byte* output, word32* idx)
4528
6.37k
{
4529
6.37k
    if (ssl->session->sessionIDSz > 0) {
4530
        /* Session resumption for old versions of protocol. */
4531
0
        if (ssl->session->sessionIDSz <= ID_LEN) {
4532
0
            if (output != NULL)
4533
0
                output[*idx] = ssl->session->sessionIDSz;
4534
0
            (*idx)++;
4535
0
            if (output != NULL) {
4536
0
                XMEMCPY(output + *idx, ssl->session->sessionID,
4537
0
                    ssl->session->sessionIDSz);
4538
0
            }
4539
0
            *idx += ssl->session->sessionIDSz;
4540
0
        }
4541
0
        else {
4542
            /* Invalid session ID length. Reset it. */
4543
0
            ssl->session->sessionIDSz = 0;
4544
0
            if (output != NULL)
4545
0
                output[*idx] = 0;
4546
0
            (*idx)++;
4547
0
        }
4548
0
    }
4549
6.37k
    else {
4550
    #ifdef WOLFSSL_TLS13_MIDDLEBOX_COMPAT
4551
        if (ssl->options.tls13MiddleBoxCompat) {
4552
            if (output != NULL)
4553
                output[*idx] = ID_LEN;
4554
            (*idx)++;
4555
            if (output != NULL)
4556
                XMEMCPY(output + *idx, ssl->arrays->clientRandom, ID_LEN);
4557
            *idx += ID_LEN;
4558
        }
4559
        else
4560
    #endif /* WOLFSSL_TLS13_MIDDLEBOX_COMPAT */
4561
6.37k
        {
4562
            /* TLS v1.3 does not use session id - 0 length. */
4563
6.37k
            if (output != NULL)
4564
2.93k
                output[*idx] = 0;
4565
6.37k
            (*idx)++;
4566
6.37k
        }
4567
6.37k
    }
4568
6.37k
}
4569
4570
/* handle generation of TLS 1.3 client_hello (1) */
4571
/* Send a ClientHello message to the server.
4572
 * Include the information required to start a handshake with servers using
4573
 * protocol versions less than TLS v1.3.
4574
 * Only a client will send this message.
4575
 *
4576
 * ssl  The SSL/TLS object.
4577
 * returns 0 on success and otherwise failure.
4578
 */
4579
4580
typedef struct Sch13Args {
4581
    byte*  output;
4582
    word32 idx;
4583
    int    sendSz;
4584
    word32 length;
4585
#if defined(HAVE_ECH)
4586
    int clientRandomOffset;
4587
    int preXLength;
4588
    word32 expandedInnerLen;
4589
    WOLFSSL_ECH* ech;
4590
#endif
4591
} Sch13Args;
4592
4593
#ifdef WOLFSSL_EARLY_DATA
4594
/* Check if early data can potentially be sent.
4595
 * Returns 1 if early data is possible, 0 otherwise.
4596
 */
4597
static int EarlyDataPossible(WOLFSSL* ssl)
4598
{
4599
    /* Need session resumption OR PSK callback configured */
4600
    if (ssl->options.resuming) {
4601
        return 1;
4602
    }
4603
#ifndef NO_PSK
4604
    if (ssl->options.client_psk_tls13_cb != NULL ||
4605
        ssl->options.client_psk_cb != NULL) {
4606
        return 1;
4607
    }
4608
#endif
4609
    return 0;
4610
}
4611
#endif /* WOLFSSL_EARLY_DATA */
4612
4613
int SendTls13ClientHello(WOLFSSL* ssl)
4614
{
4615
    int ret;
4616
#ifdef WOLFSSL_ASYNC_CRYPT
4617
    Sch13Args* args = NULL;
4618
    WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
4619
#else
4620
    Sch13Args  args[1];
4621
#endif
4622
    byte major, tls12minor;
4623
    const Suites* suites;
4624
4625
    WOLFSSL_START(WC_FUNC_CLIENT_HELLO_SEND);
4626
    WOLFSSL_ENTER("SendTls13ClientHello");
4627
4628
    if (ssl == NULL) {
4629
        return BAD_FUNC_ARG;
4630
    }
4631
4632
    ssl->options.buildingMsg = 1;
4633
    major = SSLv3_MAJOR;
4634
    tls12minor = TLSv1_2_MINOR;
4635
4636
#ifdef WOLFSSL_DTLS13
4637
    if (ssl->options.dtls) {
4638
        major = DTLS_MAJOR;
4639
        tls12minor = DTLSv1_2_MINOR;
4640
    }
4641
#endif /* WOLFSSL_DTLS */
4642
4643
    if (ssl->options.resuming &&
4644
            ssl->session->version.major != 0 &&
4645
            (ssl->session->version.major != ssl->version.major ||
4646
             ssl->session->version.minor != ssl->version.minor)) {
4647
    #ifndef WOLFSSL_NO_TLS12
4648
        if (ssl->session->version.major == ssl->version.major &&
4649
            ssl->session->version.minor < ssl->version.minor) {
4650
            /* Cannot resume with a different protocol version. */
4651
            ssl->options.resuming = 0;
4652
            ssl->version.major = ssl->session->version.major;
4653
            ssl->version.minor = ssl->session->version.minor;
4654
            return SendClientHello(ssl);
4655
        }
4656
        else
4657
    #endif
4658
        {
4659
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
4660
            return VERSION_ERROR;
4661
        }
4662
    }
4663
4664
    suites = WOLFSSL_SUITES(ssl);
4665
    if (suites == NULL) {
4666
        WOLFSSL_MSG("Bad suites pointer in SendTls13ClientHello");
4667
        return SUITES_ERROR;
4668
    }
4669
4670
#ifdef WOLFSSL_ASYNC_CRYPT
4671
    if (ssl->async == NULL) {
4672
        ssl->async = (struct WOLFSSL_ASYNC*)
4673
                XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
4674
                        DYNAMIC_TYPE_ASYNC);
4675
        if (ssl->async == NULL)
4676
            return MEMORY_E;
4677
        ssl->async->freeArgs = NULL;
4678
    }
4679
    args = (Sch13Args*)ssl->async->args;
4680
4681
    ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
4682
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
4683
        /* Check for error */
4684
        if (ret < 0)
4685
            return ret;
4686
    }
4687
    else
4688
#endif
4689
    {
4690
        /* Reset state */
4691
        ssl->options.asyncState = TLS_ASYNC_BEGIN;
4692
        XMEMSET(args, 0, sizeof(Sch13Args));
4693
    }
4694
4695
    switch (ssl->options.asyncState) {
4696
    case TLS_ASYNC_BEGIN:
4697
    {
4698
    word32 sessIdSz = 0;
4699
4700
    args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
4701
4702
#ifdef WOLFSSL_DTLS13
4703
    if (ssl->options.dtls)
4704
        args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
4705
#endif /* WOLFSSL_DTLS13 */
4706
4707
    /* Version | Random | Cipher Suites | Compression */
4708
    args->length = VERSION_SZ + RAN_LEN + suites->suiteSz +
4709
            SUITE_LEN + COMP_LEN + ENUM_LEN;
4710
#ifdef WOLFSSL_QUIC
4711
    if (WOLFSSL_IS_QUIC(ssl)) {
4712
        /* RFC 9001 ch. 8.4 sessionID in ClientHello MUST be 0 length */
4713
        ssl->session->sessionIDSz = 0;
4714
        ssl->options.tls13MiddleBoxCompat = 0;
4715
    }
4716
#endif
4717
#ifdef WOLFSSL_DTLS13
4718
    if (ssl->options.dtls) {
4719
        /* RFC 9147 Section 5: DTLS implementations do not use the
4720
         *                     TLS 1.3 "compatibility mode" */
4721
        ssl->options.tls13MiddleBoxCompat = 0;
4722
    }
4723
#endif
4724
    GetTls13SessionId(ssl, NULL, &sessIdSz);
4725
    args->length += (word16)sessIdSz;
4726
4727
#ifdef WOLFSSL_DTLS13
4728
    if (ssl->options.dtls) {
4729
        /* legacy_cookie_id len */
4730
        args->length += ENUM_LEN;
4731
4732
        /* server sent us an HelloVerifyRequest and we allow downgrade  */
4733
        if (ssl->arrays->cookieSz > 0 && ssl->options.downgrade)
4734
            args->length += ssl->arrays->cookieSz;
4735
    }
4736
#endif /* WOLFSSL_DTLS13 */
4737
4738
    /* Advance state and proceed */
4739
    ssl->options.asyncState = TLS_ASYNC_BUILD;
4740
    } /* case TLS_ASYNC_BEGIN */
4741
    FALL_THROUGH;
4742
4743
    case TLS_ASYNC_BUILD:
4744
    case TLS_ASYNC_DO:
4745
    {
4746
    /* Auto populate extensions supported unless user defined. */
4747
    if ((ret = TLSX_PopulateExtensions(ssl, 0)) != 0)
4748
        return ret;
4749
4750
    /* Advance state and proceed */
4751
    ssl->options.asyncState = TLS_ASYNC_FINALIZE;
4752
    } /* case TLS_ASYNC_BUILD */
4753
    FALL_THROUGH;
4754
4755
    case TLS_ASYNC_FINALIZE:
4756
    {
4757
#ifdef WOLFSSL_EARLY_DATA
4758
    if (!EarlyDataPossible(ssl))
4759
        ssl->earlyData = no_early_data;
4760
    if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE)
4761
        ssl->earlyData = no_early_data;
4762
    if (ssl->earlyData == no_early_data)
4763
        TLSX_Remove(&ssl->extensions, TLSX_EARLY_DATA, ssl->heap);
4764
    if (ssl->earlyData != no_early_data &&
4765
        (ret = TLSX_EarlyData_Use(ssl, 0, 0)) < 0) {
4766
        return ret;
4767
    }
4768
#endif
4769
#ifdef WOLFSSL_QUIC
4770
    if (WOLFSSL_IS_QUIC(ssl) && IsAtLeastTLSv1_3(ssl->version)) {
4771
        ret = wolfSSL_quic_add_transport_extensions(ssl, client_hello);
4772
        if (ret != 0)
4773
            return ret;
4774
    }
4775
#endif
4776
4777
    /* find length of outer and inner */
4778
#if defined(HAVE_ECH)
4779
    if (ssl->echConfigs != NULL && !ssl->options.disableECH) {
4780
        TLSX* echX = TLSX_Find(ssl->extensions, TLSX_ECH);
4781
        if (echX == NULL)
4782
            return WOLFSSL_FATAL_ERROR;
4783
4784
        args->ech = (WOLFSSL_ECH*)echX->data;
4785
        if (args->ech == NULL)
4786
            return WOLFSSL_FATAL_ERROR;
4787
4788
        /* only prepare if we have a chance at acceptance */
4789
        if (ssl->options.echAccepted || args->ech->innerCount == 0) {
4790
            word32 encodedLen;
4791
            byte downgrade;
4792
4793
            /* ensure that a version less than TLS1.3 is never offered  */
4794
            downgrade = ssl->options.downgrade;
4795
            ssl->options.downgrade = 0;
4796
4797
            /* set the type to inner */
4798
            args->ech->type = ECH_TYPE_INNER;
4799
            args->preXLength = (int)args->length;
4800
4801
            /* get expanded inner size (used for transcript) */
4802
            ret = TLSX_GetRequestSize(ssl, client_hello, &args->length);
4803
            if (ret != 0) {
4804
                args->ech->type = ECH_TYPE_OUTER;
4805
                ssl->options.downgrade = downgrade;
4806
                return ret;
4807
            }
4808
4809
            /* args->expandedInnerLen carries the length for the hash */
4810
            args->expandedInnerLen = args->length;
4811
            if (args->expandedInnerLen > 0xFFFF) {
4812
                args->ech->type = ECH_TYPE_OUTER;
4813
                ssl->options.downgrade = downgrade;
4814
                return BUFFER_E;
4815
            }
4816
4817
            /* get encoded inner size */
4818
            args->ech->writeEncoded = 1;
4819
            encodedLen = args->preXLength;
4820
            ret = TLSX_GetRequestSize(ssl, client_hello, &encodedLen);
4821
            args->ech->writeEncoded = 0;
4822
            /* set the type to outer */
4823
            args->ech->type = ECH_TYPE_OUTER;
4824
            ssl->options.downgrade = downgrade;
4825
            if (ret != 0)
4826
                return ret;
4827
4828
            /* calculate padding (RFC 9849, section 6.1.3) */
4829
            if (args->ech->privateName != NULL) {
4830
                word16 nameLen = (word16)XSTRLEN(args->ech->privateName);
4831
                if (nameLen > args->ech->echConfig->maxNameLen)
4832
                    args->ech->paddingLen = 0;
4833
                else
4834
                    args->ech->paddingLen =
4835
                        (word16)args->ech->echConfig->maxNameLen - nameLen;
4836
            }
4837
            else {
4838
                args->ech->paddingLen = args->ech->echConfig->maxNameLen + 9;
4839
            }
4840
4841
            /* innerClientHelloLen and padding are based on the
4842
             * encoded (sealed) inner */
4843
            args->ech->paddingLen += 31 -
4844
                ((encodedLen + args->ech->paddingLen - 1) % 32);
4845
            args->ech->innerClientHelloLen = encodedLen +
4846
                args->ech->paddingLen + args->ech->hpke->Nt;
4847
4848
            if (args->ech->innerClientHelloLen > 0xFFFF)
4849
                return BUFFER_E;
4850
4851
            /* restore the length to pre-ClientHelloInner computations */
4852
            args->length = (word32)args->preXLength;
4853
        }
4854
    }
4855
#endif
4856
4857
    {
4858
#ifdef WOLFSSL_DTLS_CH_FRAG
4859
        word16 maxFrag = wolfssl_local_GetMaxPlaintextSize(ssl);
4860
        word16 lenWithoutExts = args->length;
4861
#endif
4862
4863
        /* Include length of TLS extensions. */
4864
        ret = TLSX_GetRequestSize(ssl, client_hello, &args->length);
4865
        if (ret != 0)
4866
            return ret;
4867
4868
        /* Total message size. */
4869
        args->sendSz =
4870
                (int)(args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ);
4871
4872
#ifdef WOLFSSL_DTLS13
4873
        if (ssl->options.dtls)
4874
            args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
4875
#endif /* WOLFSSL_DTLS13 */
4876
4877
#ifdef WOLFSSL_DTLS_CH_FRAG
4878
        if (ssl->options.dtls && args->sendSz > maxFrag &&
4879
                TLSX_Find(ssl->extensions, TLSX_COOKIE) == NULL) {
4880
            /* Try again with an empty key share if we would be fragmenting
4881
             * without a cookie */
4882
            ret = TLSX_KeyShare_Empty(ssl);
4883
            if (ret != 0)
4884
                return ret;
4885
            args->length = lenWithoutExts;
4886
            ret = TLSX_GetRequestSize(ssl, client_hello, &args->length);
4887
            if (ret != 0)
4888
                return ret;
4889
            args->sendSz = (int)(args->length +
4890
                    DTLS_HANDSHAKE_HEADER_SZ + DTLS_RECORD_HEADER_SZ);
4891
            if (args->sendSz > maxFrag) {
4892
                WOLFSSL_MSG("Can't fit first CH in one fragment.");
4893
                return BUFFER_ERROR;
4894
            }
4895
            WOLFSSL_MSG("Sending empty key share so we don't fragment CH1");
4896
        }
4897
#endif
4898
    }
4899
4900
    /* Check buffers are big enough and grow if needed. */
4901
    if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0)
4902
        return ret;
4903
4904
    /* Get position in output buffer to write new message to. */
4905
    args->output = GetOutputBuffer(ssl);
4906
4907
    /* Put the record and handshake headers on. */
4908
    AddTls13Headers(args->output, args->length, client_hello, ssl);
4909
4910
    /* Protocol version - negotiation now in extension: supported_versions. */
4911
    args->output[args->idx++] = major;
4912
    args->output[args->idx++] = tls12minor;
4913
4914
    /* Keep for downgrade. */
4915
    ssl->chVersion = ssl->version;
4916
4917
    if (ssl->arrays == NULL) {
4918
        return BAD_FUNC_ARG;
4919
    }
4920
    /* Client Random */
4921
    if (ssl->options.connectState == CONNECT_BEGIN) {
4922
        ret = wc_RNG_GenerateBlock(ssl->rng, args->output + args->idx, RAN_LEN);
4923
        if (ret != 0)
4924
            return ret;
4925
4926
        /* Store random for possible second ClientHello. */
4927
        XMEMCPY(ssl->arrays->clientRandom, args->output + args->idx, RAN_LEN);
4928
    }
4929
    else
4930
        XMEMCPY(args->output + args->idx, ssl->arrays->clientRandom, RAN_LEN);
4931
4932
#if defined(HAVE_ECH)
4933
    args->clientRandomOffset = (int)args->idx;
4934
#endif
4935
4936
    args->idx += RAN_LEN;
4937
4938
    GetTls13SessionId(ssl, args->output, &args->idx);
4939
4940
#ifdef WOLFSSL_DTLS13
4941
    if (ssl->options.dtls) {
4942
        args->output[args->idx++] = ssl->arrays->cookieSz;
4943
4944
        if (ssl->arrays->cookieSz > 0) {
4945
            /* We have a cookie saved, so the server sent us an
4946
             * HelloVerifyRequest, it means it is a v1.2 server */
4947
            if (!ssl->options.downgrade)
4948
                return VERSION_ERROR;
4949
            XMEMCPY(args->output + args->idx, ssl->arrays->cookie,
4950
                ssl->arrays->cookieSz);
4951
            args->idx += ssl->arrays->cookieSz;
4952
        }
4953
    }
4954
#endif /* WOLFSSL_DTLS13 */
4955
4956
    /* Cipher suites */
4957
    c16toa(suites->suiteSz, args->output + args->idx);
4958
    args->idx += OPAQUE16_LEN;
4959
    XMEMCPY(args->output + args->idx, &suites->suites,
4960
        suites->suiteSz);
4961
    args->idx += suites->suiteSz;
4962
#ifdef WOLFSSL_DEBUG_TLS
4963
    {
4964
        int ii;
4965
        WOLFSSL_MSG("Ciphers:");
4966
        for (ii = 0 ; ii < suites->suiteSz; ii += 2) {
4967
            WOLFSSL_MSG(GetCipherNameInternal(suites->suites[ii+0],
4968
                                              suites->suites[ii+1]));
4969
        }
4970
    }
4971
#endif
4972
4973
    /* Compression not supported in TLS v1.3. */
4974
    args->output[args->idx++] = COMP_LEN;
4975
    args->output[args->idx++] = NO_COMPRESSION;
4976
4977
#if defined(HAVE_ECH)
4978
    /* Build the expanded inner ClientHello */
4979
    if (ssl->echConfigs != NULL && !ssl->options.disableECH &&
4980
            (ssl->options.echAccepted || args->ech->innerCount == 0)) {
4981
        byte downgrade;
4982
4983
        /* calculate maximum buffer size needed */
4984
        word32 encodedBodyLen = args->ech->innerClientHelloLen -
4985
            args->ech->hpke->Nt;
4986
        word32 innerBufSize = args->expandedInnerLen;
4987
        if (encodedBodyLen > innerBufSize)
4988
            innerBufSize = encodedBodyLen;
4989
4990
        /* set the type to inner */
4991
        args->ech->type = ECH_TYPE_INNER;
4992
        /* innerClientHello may already exist from hrr, free if it does */
4993
        if (args->ech->innerClientHello != NULL) {
4994
            XFREE(args->ech->innerClientHello, ssl->heap,
4995
                DYNAMIC_TYPE_TMP_BUFFER);
4996
        }
4997
        /* allocate the inner */
4998
        args->ech->innerClientHello =
4999
            (byte*)XMALLOC(innerBufSize, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
5000
        if (args->ech->innerClientHello == NULL) {
5001
            args->ech->type = ECH_TYPE_OUTER;
5002
            return MEMORY_E;
5003
        }
5004
        /* copy everything before extensions into the innerClientHello
5005
         * ignore record and handshake headers */
5006
        XMEMCPY(args->ech->innerClientHello,
5007
            args->output + RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ,
5008
            args->preXLength);
5009
        /* copy the client random to inner - only for first CH, not after HRR */
5010
        if (!ssl->options.echAccepted) {
5011
            XMEMCPY(ssl->arrays->clientRandomInner, ssl->arrays->clientRandom,
5012
                RAN_LEN);
5013
        }
5014
        else {
5015
            /* After HRR, use the same inner random as CH1 */
5016
            XMEMCPY(args->ech->innerClientHello + VERSION_SZ,
5017
                ssl->arrays->clientRandomInner, RAN_LEN);
5018
        }
5019
        /* change the outer client random */
5020
        ret = wc_RNG_GenerateBlock(ssl->rng, args->output +
5021
            args->clientRandomOffset, RAN_LEN);
5022
        if (ret != 0) {
5023
            args->ech->type = ECH_TYPE_OUTER;
5024
            return ret;
5025
        }
5026
        /* copy the new client random */
5027
        XMEMCPY(ssl->arrays->clientRandom, args->output +
5028
            args->clientRandomOffset, RAN_LEN);
5029
5030
        /* ensure that a version less than TLS1.3 is never offered  */
5031
        downgrade = ssl->options.downgrade;
5032
        ssl->options.downgrade = 0;
5033
5034
        /* write the expanded extensions into the inner buffer */
5035
        args->length = 0;
5036
        ret = TLSX_WriteRequest(ssl,
5037
            args->ech->innerClientHello + args->preXLength, client_hello,
5038
            &args->length);
5039
        if (ret != 0) {
5040
            args->ech->type = ECH_TYPE_OUTER;
5041
            ssl->options.downgrade = downgrade;
5042
            return ret;
5043
        }
5044
5045
        /* hash expanded form */
5046
        args->ech->innerClientHelloLen = args->expandedInnerLen;
5047
        ret = EchHashHelloInner(ssl, args->ech);
5048
        args->ech->innerClientHelloLen = encodedBodyLen + args->ech->hpke->Nt;
5049
        if (ret != 0) {
5050
            args->ech->type = ECH_TYPE_OUTER;
5051
            ssl->options.downgrade = downgrade;
5052
            return ret;
5053
        }
5054
5055
        /* zero padding bytes sealed with the inner hello */
5056
        XMEMSET(args->ech->innerClientHello +
5057
            args->ech->innerClientHelloLen - args->ech->hpke->Nt -
5058
            args->ech->paddingLen, 0, args->ech->paddingLen);
5059
        /* Rewrite inner buffer with the encoded form for sealing */
5060
        args->ech->writeEncoded = 1;
5061
        args->length = 0;
5062
        ret = TLSX_WriteRequest(ssl,
5063
            args->ech->innerClientHello + args->preXLength, client_hello,
5064
            &args->length);
5065
        args->ech->writeEncoded = 0;
5066
        /* set the type to outer */
5067
        args->ech->type = ECH_TYPE_OUTER;
5068
        ssl->options.downgrade = downgrade;
5069
        if (ret != 0)
5070
            return ret;
5071
    }
5072
#endif
5073
5074
    /* Write out extensions for a request. */
5075
    args->length = 0;
5076
    ret = TLSX_WriteRequest(ssl, args->output + args->idx, client_hello,
5077
        &args->length);
5078
    if (ret != 0)
5079
        return ret;
5080
5081
    args->idx += args->length;
5082
5083
#if defined(HAVE_ECH)
5084
    /* HPKE-seal inner hello and place into outer ECH extension's payload */
5085
    if (ssl->echConfigs != NULL && !ssl->options.disableECH &&
5086
            (ssl->options.echAccepted || args->ech->innerCount == 0)) {
5087
#if defined(WOLFSSL_TEST_ECH)
5088
        if (ssl->echInnerHelloCb != NULL) {
5089
            ret = ssl->echInnerHelloCb(args->ech->innerClientHello,
5090
                args->ech->innerClientHelloLen - args->ech->hpke->Nt);
5091
            if (ret != 0)
5092
                return ret;
5093
        }
5094
#endif
5095
        ret = TLSX_FinalizeEch(args->ech,
5096
            args->output + RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ,
5097
            (word32)(args->sendSz - (RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ)));
5098
5099
        if (ret != 0)
5100
            return ret;
5101
5102
        /* innerCount gates HRR re-prep and the server's copyRandom logic. */
5103
        args->ech->innerCount = 1;
5104
    }
5105
#endif
5106
5107
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
5108
    /* Resumption has a specific set of extensions and binder is calculated
5109
     * for each identity.
5110
     */
5111
    if (TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY)) {
5112
        ret = WritePSKBinders(ssl, args->output, args->idx);
5113
    }
5114
    else
5115
#endif
5116
    {
5117
#ifdef WOLFSSL_DTLS13
5118
        if (ssl->options.dtls)
5119
            ret = Dtls13HashHandshake(ssl,
5120
                args->output + Dtls13GetRlHeaderLength(ssl, 0),
5121
                (word16)args->idx - Dtls13GetRlHeaderLength(ssl, 0));
5122
        else
5123
#endif /* WOLFSSL_DTLS13 */
5124
        {
5125
            /* compute the outer hash */
5126
            ret = HashOutput(ssl, args->output, (int)args->idx, 0);
5127
        }
5128
    }
5129
    if (ret != 0)
5130
        return ret;
5131
5132
    ssl->options.clientState = CLIENT_HELLO_COMPLETE;
5133
5134
#if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
5135
    if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
5136
    if (ssl->toInfoOn) {
5137
        ret = AddPacketInfo(ssl, "ClientHello", handshake, args->output,
5138
                      args->sendSz, WRITE_PROTO, 0, ssl->heap);
5139
        if (ret != 0)
5140
            return ret;
5141
    }
5142
#endif
5143
5144
    ssl->options.buildingMsg = 0;
5145
#ifdef WOLFSSL_DTLS13
5146
    if (ssl->options.dtls) {
5147
        ret = Dtls13HandshakeSend(ssl, args->output, (word16)args->sendSz,
5148
                                  (word16)args->idx, client_hello, 0);
5149
        break;
5150
    }
5151
#endif /* WOLFSSL_DTLS13 */
5152
5153
    ssl->buffers.outputBuffer.length += (word32)args->sendSz;
5154
5155
    /* Advance state and proceed */
5156
    ssl->options.asyncState = TLS_ASYNC_END;
5157
    }
5158
    /* case TLS_ASYNC_BUILD */
5159
    FALL_THROUGH;
5160
5161
    case TLS_ASYNC_END:
5162
    {
5163
#ifdef WOLFSSL_EARLY_DATA_GROUP
5164
    /* QUIC needs to forward records at their encryption level
5165
     * and is therefore unable to group here */
5166
    if (ssl->earlyData == no_early_data || WOLFSSL_IS_QUIC(ssl))
5167
#endif
5168
        ret = SendBuffered(ssl);
5169
5170
    break;
5171
    }
5172
    default:
5173
        ret = INPUT_CASE_ERROR;
5174
    } /* switch (ssl->options.asyncState) */
5175
5176
#ifdef WOLFSSL_ASYNC_CRYPT
5177
    if (ret == 0)
5178
        FreeAsyncCtx(ssl, 0);
5179
#endif
5180
5181
    WOLFSSL_LEAVE("SendTls13ClientHello", ret);
5182
    WOLFSSL_END(WC_FUNC_CLIENT_HELLO_SEND);
5183
5184
    return ret;
5185
}
5186
5187
#if defined(WOLFSSL_DTLS13) && !defined(NO_WOLFSSL_CLIENT)
5188
static int Dtls13ClientDoDowngrade(WOLFSSL* ssl)
5189
{
5190
    int ret;
5191
    if (ssl->dtls13ClientHello == NULL)
5192
        return BAD_STATE_E;
5193
5194
    /* v1.3 and v1.2 hash messages to compute the transcript hash. When we are
5195
     * using DTLSv1.3 we hash the first clientHello following v1.3 but the
5196
     * server can negotiate a lower version. So we need to re-hash the
5197
     * clientHello to adhere to DTLS <= v1.2 rules. */
5198
    ret = InitHandshakeHashes(ssl);
5199
    if (ret != 0)
5200
        return ret;
5201
    ret = HashRaw(ssl, ssl->dtls13ClientHello, ssl->dtls13ClientHelloSz);
5202
    XFREE(ssl->dtls13ClientHello, ssl->heap, DYNAMIC_TYPE_DTLS_MSG);
5203
    ssl->dtls13ClientHello = NULL;
5204
    ssl->dtls13ClientHelloSz = 0;
5205
    ssl->keys.dtls_sequence_number_hi =
5206
        (word16)w64GetHigh32(ssl->dtls13EncryptEpoch->nextSeqNumber);
5207
    ssl->keys.dtls_sequence_number_lo =
5208
        w64GetLow32(ssl->dtls13EncryptEpoch->nextSeqNumber);
5209
    return ret;
5210
}
5211
#endif /* WOLFSSL_DTLS13 && !NO_WOLFSSL_CLIENT*/
5212
5213
#if defined(HAVE_ECH)
5214
/* Calculate ECH acceptance and verify the server accepted ECH.
5215
 *
5216
 * ssl          SSL/TLS object.
5217
 * label        Ascii string describing ECH acceptance type.
5218
 * labelSz      Length of label excluding NULL character.
5219
 * input        The buffer to calculate confirmation off of.
5220
 * acceptOffset Where the 8 ECH confirmation bytes start.
5221
 * helloSz      Size of hello message.
5222
 * returns 0 on success and otherwise failure.
5223
 */
5224
static int EchCheckAcceptance(WOLFSSL* ssl, byte* label, word16 labelSz,
5225
    const byte* input, int acceptOffset, int helloSz, byte msgType)
5226
{
5227
    int ret = 0;
5228
    int headerSz;
5229
    HS_Hashes* tmpHashes;
5230
    byte acceptConfirmation[ECH_ACCEPT_CONFIRMATION_SZ];
5231
5232
    XMEMSET(acceptConfirmation, 0, sizeof(acceptConfirmation));
5233
5234
#ifdef WOLFSSL_DTLS13
5235
    headerSz = ssl->options.dtls ? DTLS13_HANDSHAKE_HEADER_SZ :
5236
                                   HANDSHAKE_HEADER_SZ;
5237
#else
5238
    headerSz = HANDSHAKE_HEADER_SZ;
5239
#endif
5240
5241
    ret = EchCalcAcceptance(ssl, label, labelSz, input, acceptOffset, helloSz,
5242
            msgType == hello_retry_request, acceptConfirmation);
5243
5244
    if (ret == 0) {
5245
        tmpHashes = ssl->hsHashes;
5246
        ssl->hsHashes = ssl->hsHashesEch;
5247
5248
        /* last 8 bytes must match the expand output */
5249
        ret = ConstantCompare(acceptConfirmation, input + acceptOffset,
5250
            ECH_ACCEPT_CONFIRMATION_SZ);
5251
5252
        if (ret == 0) {
5253
            WOLFSSL_MSG("ECH accepted");
5254
            ssl->options.echAccepted = 1;
5255
5256
            /* after HRR, hsHashesEch must contain:
5257
             * message_hash(ClientHelloInner1) || HRR (actual, not zeros) */
5258
            if (msgType == hello_retry_request) {
5259
                ret = HashRaw(ssl, input, helloSz + headerSz);
5260
            }
5261
            /* normal TLS code will calculate transcript of ServerHello */
5262
            else {
5263
                ssl->hsHashes = tmpHashes;
5264
                FreeHandshakeHashes(ssl);
5265
                tmpHashes = ssl->hsHashesEch;
5266
                ssl->hsHashesEch = NULL;
5267
            }
5268
        }
5269
        else {
5270
            if (msgType != hello_retry_request && ssl->options.echAccepted) {
5271
                /* the SH has rejected ECH after the HRR has accepted it
5272
                 * RFC 9849, section 6.1.5 */
5273
                WOLFSSL_MSG("ECH rejected, but it was previously accepted...");
5274
                ret = INVALID_PARAMETER;
5275
            }
5276
            else {
5277
                WOLFSSL_MSG("ECH rejected");
5278
                ret = 0;
5279
            }
5280
            ssl->options.echAccepted = 0;
5281
5282
            /* ECH rejected, continue with outer transcript */
5283
            FreeHandshakeHashes(ssl);
5284
            ssl->hsHashesEch = NULL;
5285
        }
5286
5287
        ssl->hsHashes = tmpHashes;
5288
    }
5289
5290
    return ret;
5291
}
5292
#endif /* HAVE_ECH */
5293
5294
/* handle processing of TLS 1.3 server_hello (2) and hello_retry_request (6) */
5295
/* Handle the ServerHello message from the server.
5296
 * Only a client will receive this message.
5297
 *
5298
 * ssl       The SSL/TLS object.
5299
 * input     The message buffer.
5300
 * inOutIdx  On entry, the index into the message buffer of ServerHello.
5301
 *           On exit, the index of byte after the ServerHello message.
5302
 * helloSz   The length of the current handshake message.
5303
 * returns 0 on success and otherwise failure.
5304
 */
5305
5306
typedef struct Dsh13Args {
5307
    ProtocolVersion pv;
5308
    word32          idx;
5309
    word32          begin;
5310
    const byte*     sessId;
5311
    word16          totalExtSz;
5312
    byte            sessIdSz;
5313
    byte            extMsgType;
5314
#if defined(HAVE_ECH)
5315
    TLSX* echX;
5316
    byte* acceptLabel;
5317
    word32 acceptOffset;
5318
    word16 acceptLabelSz;
5319
#endif
5320
} Dsh13Args;
5321
5322
int DoTls13ServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
5323
                       word32 helloSz, byte* extMsgType)
5324
0
{
5325
0
    int ret;
5326
0
    byte suite[2];
5327
0
    byte tls12minor;
5328
#ifdef WOLFSSL_ASYNC_CRYPT
5329
    Dsh13Args* args = NULL;
5330
#else
5331
0
    Dsh13Args  args[1];
5332
0
#endif
5333
#ifdef WOLFSSL_ASYNC_CRYPT
5334
    WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
5335
#endif
5336
5337
0
    WOLFSSL_START(WC_FUNC_SERVER_HELLO_DO);
5338
0
    WOLFSSL_ENTER("DoTls13ServerHello");
5339
5340
0
    if (ssl == NULL || ssl->arrays == NULL)
5341
0
        return BAD_FUNC_ARG;
5342
5343
0
    tls12minor = TLSv1_2_MINOR;
5344
5345
#ifdef WOLFSSL_DTLS13
5346
    if (ssl->options.dtls)
5347
        tls12minor = DTLSv1_2_MINOR;
5348
#endif /*  WOLFSSL_DTLS13 */
5349
5350
#ifdef WOLFSSL_ASYNC_CRYPT
5351
    if (ssl->async == NULL) {
5352
        ssl->async = (struct WOLFSSL_ASYNC*)
5353
                XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
5354
                        DYNAMIC_TYPE_ASYNC);
5355
        if (ssl->async == NULL)
5356
            return MEMORY_E;
5357
        ssl->async->freeArgs = NULL;
5358
    }
5359
    args = (Dsh13Args*)ssl->async->args;
5360
5361
    ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
5362
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
5363
        /* Check for error */
5364
        if (ret < 0) {
5365
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
5366
                /* Mark message as not received so it can process again */
5367
                ssl->msgsReceived.got_server_hello = 0;
5368
            }
5369
            return ret;
5370
        }
5371
    }
5372
    else
5373
#endif
5374
0
    {
5375
        /* Reset state */
5376
0
        ssl->options.asyncState = TLS_ASYNC_BEGIN;
5377
0
        XMEMSET(args, 0, sizeof(Dsh13Args));
5378
0
    }
5379
5380
0
    switch (ssl->options.asyncState) {
5381
0
    case TLS_ASYNC_BEGIN:
5382
0
    {
5383
0
    byte b;
5384
#ifdef WOLFSSL_CALLBACKS
5385
    if (ssl->hsInfoOn) AddPacketName(ssl, "ServerHello");
5386
    if (ssl->toInfoOn) AddLateName("ServerHello", &ssl->timeoutInfo);
5387
#endif
5388
5389
    /* Protocol version length check. */
5390
0
    if (helloSz < OPAQUE16_LEN)
5391
0
        return BUFFER_ERROR;
5392
5393
0
    args->idx = *inOutIdx;
5394
0
    args->begin = args->idx;
5395
5396
    /* Protocol version */
5397
0
    XMEMCPY(&args->pv, input + args->idx, OPAQUE16_LEN);
5398
0
    args->idx += OPAQUE16_LEN;
5399
5400
#ifdef WOLFSSL_DTLS
5401
    if (ssl->options.dtls &&
5402
        (args->pv.major != DTLS_MAJOR || args->pv.minor == DTLS_BOGUS_MINOR))
5403
        return VERSION_ERROR;
5404
#endif /* WOLFSSL_DTLS */
5405
5406
0
#ifndef WOLFSSL_NO_TLS12
5407
0
    {
5408
0
        byte wantDowngrade;
5409
5410
0
        wantDowngrade = args->pv.major == ssl->version.major &&
5411
0
            args->pv.minor < TLSv1_2_MINOR;
5412
5413
#ifdef WOLFSSL_DTLS13
5414
        if (ssl->options.dtls)
5415
            wantDowngrade = args->pv.major == ssl->version.major &&
5416
                args->pv.minor > DTLSv1_2_MINOR;
5417
#endif /* WOLFSSL_DTLS13 */
5418
5419
0
        if (wantDowngrade && ssl->options.downgrade) {
5420
            /* Force client hello version 1.2 to work for static RSA. */
5421
0
            ssl->chVersion.minor = TLSv1_2_MINOR;
5422
0
            ssl->version.minor = TLSv1_2_MINOR;
5423
0
            ssl->options.tls1_3 = 0;
5424
5425
#ifdef WOLFSSL_DTLS13
5426
            if (ssl->options.dtls) {
5427
                ssl->chVersion.minor = DTLSv1_2_MINOR;
5428
                ssl->version.minor = DTLSv1_2_MINOR;
5429
                ret = Dtls13ClientDoDowngrade(ssl);
5430
                if (ret != 0)
5431
                    return ret;
5432
            }
5433
#endif /* WOLFSSL_DTLS13 */
5434
5435
0
            return DoServerHello(ssl, input, inOutIdx, helloSz);
5436
0
        }
5437
0
    }
5438
0
#endif
5439
5440
0
    if (args->pv.major != ssl->version.major ||
5441
0
        args->pv.minor != tls12minor) {
5442
0
        SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
5443
0
        WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
5444
0
        return VERSION_ERROR;
5445
0
    }
5446
5447
    /* Random and session id length check */
5448
0
    if ((args->idx - args->begin) + RAN_LEN + ENUM_LEN > helloSz)
5449
0
        return BUFFER_ERROR;
5450
5451
    /* Check if hello retry request */
5452
0
    if (XMEMCMP(input + args->idx, helloRetryRequestRandom, RAN_LEN) == 0) {
5453
0
        WOLFSSL_MSG("HelloRetryRequest format");
5454
0
        *extMsgType = hello_retry_request;
5455
5456
0
        if (ssl->msgsReceived.got_hello_verify_request) {
5457
0
            WOLFSSL_MSG("Received HelloRetryRequest after a "
5458
0
                        "HelloVerifyRequest");
5459
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
5460
0
            return VERSION_ERROR;
5461
0
        }
5462
5463
        /* A HelloRetryRequest comes in as an ServerHello for MiddleBox compat.
5464
         * Found message to be a HelloRetryRequest.
5465
         * Don't allow more than one HelloRetryRequest or ServerHello.
5466
         */
5467
0
        if (ssl->msgsReceived.got_hello_retry_request) {
5468
0
            WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
5469
0
            return DUPLICATE_MSG_E;
5470
0
        }
5471
0
    }
5472
0
    args->extMsgType = *extMsgType;
5473
5474
    /* Server random - keep for debugging. */
5475
0
    XMEMCPY(ssl->arrays->serverRandom, input + args->idx, RAN_LEN);
5476
#if defined(HAVE_ECH)
5477
    /* last 8 bytes of server random */
5478
    args->acceptOffset = args->idx + RAN_LEN - ECH_ACCEPT_CONFIRMATION_SZ;
5479
#endif
5480
0
    args->idx += RAN_LEN;
5481
5482
    /* Session id */
5483
0
    args->sessIdSz = input[args->idx++];
5484
0
    if (args->sessIdSz > ID_LEN || args->sessIdSz > RAN_LEN ||
5485
0
        ((args->idx - args->begin) + args->sessIdSz > helloSz))
5486
0
        return BUFFER_ERROR;
5487
0
    args->sessId = input + args->idx;
5488
0
    args->idx += args->sessIdSz;
5489
5490
0
    ssl->options.haveSessionId = 1;
5491
5492
    /* Ciphersuite and compression check */
5493
0
    if ((args->idx - args->begin) + OPAQUE16_LEN + OPAQUE8_LEN > helloSz)
5494
0
        return BUFFER_ERROR;
5495
5496
    /* Set the cipher suite from the message. */
5497
0
    ssl->options.cipherSuite0 = input[args->idx++];
5498
0
    ssl->options.cipherSuite  = input[args->idx++];
5499
0
    if (*extMsgType == hello_retry_request) {
5500
0
        ssl->options.hrrCipherSuite0 = ssl->options.cipherSuite0;
5501
0
        ssl->options.hrrCipherSuite  = ssl->options.cipherSuite;
5502
0
    }
5503
0
    else if (ssl->msgsReceived.got_hello_retry_request &&
5504
0
             (ssl->options.hrrCipherSuite0 != ssl->options.cipherSuite0 ||
5505
0
                     ssl->options.hrrCipherSuite != ssl->options.cipherSuite)) {
5506
0
        WOLFSSL_MSG("Received ServerHello with different cipher suite than "
5507
0
                    "HelloRetryRequest");
5508
0
        WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
5509
0
        return INVALID_PARAMETER;
5510
0
    }
5511
#ifdef WOLFSSL_DEBUG_TLS
5512
    WOLFSSL_MSG("Chosen cipher suite:");
5513
    WOLFSSL_MSG(GetCipherNameInternal(ssl->options.cipherSuite0,
5514
                                      ssl->options.cipherSuite));
5515
#endif
5516
5517
    /* Compression */
5518
0
    b = input[args->idx++];
5519
0
    if (b != 0) {
5520
0
        WOLFSSL_MSG("Must be no compression types in list");
5521
0
        WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
5522
0
        return INVALID_PARAMETER;
5523
0
    }
5524
5525
0
    if ((args->idx - args->begin) + OPAQUE16_LEN > helloSz) {
5526
0
        if (!ssl->options.downgrade)
5527
0
            return BUFFER_ERROR;
5528
0
#ifndef WOLFSSL_NO_TLS12
5529
        /* Force client hello version 1.2 to work for static RSA. */
5530
0
        ssl->chVersion.minor = TLSv1_2_MINOR;
5531
0
        ssl->version.minor = TLSv1_2_MINOR;
5532
5533
#ifdef WOLFSSL_DTLS13
5534
        if (ssl->options.dtls) {
5535
            ssl->chVersion.minor = DTLSv1_2_MINOR;
5536
            ssl->version.minor = DTLSv1_2_MINOR;
5537
            ssl->options.tls1_3 = 0;
5538
            ret = Dtls13ClientDoDowngrade(ssl);
5539
            if (ret != 0)
5540
                return ret;
5541
        }
5542
#endif /* WOLFSSL_DTLS13 */
5543
5544
0
#endif
5545
0
        ssl->options.haveEMS = 0;
5546
0
        if (args->pv.minor < ssl->options.minDowngrade) {
5547
0
            SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
5548
0
            return VERSION_ERROR;
5549
0
        }
5550
0
#ifndef WOLFSSL_NO_TLS12
5551
0
        ssl->options.tls1_3 = 0;
5552
0
        return DoServerHello(ssl, input, inOutIdx, helloSz);
5553
#else
5554
        SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
5555
        return VERSION_ERROR;
5556
#endif
5557
0
    }
5558
5559
0
    if ((args->idx - args->begin) < helloSz) {
5560
0
        int foundVersion;
5561
5562
        /* Get extension length and length check. */
5563
0
        if ((args->idx - args->begin) + OPAQUE16_LEN > helloSz)
5564
0
            return BUFFER_ERROR;
5565
0
        ato16(&input[args->idx], &args->totalExtSz);
5566
0
        args->idx += OPAQUE16_LEN;
5567
0
        if ((args->idx - args->begin) + args->totalExtSz > helloSz)
5568
0
            return BUFFER_ERROR;
5569
5570
        /* Need to negotiate version first. */
5571
0
        if ((ret = TLSX_ParseVersion(ssl, input + args->idx,
5572
0
            args->totalExtSz, *extMsgType, &foundVersion))) {
5573
0
            return ret;
5574
0
        }
5575
0
        if (!foundVersion) {
5576
0
            if (!ssl->options.downgrade) {
5577
0
                WOLFSSL_MSG("Server trying to downgrade to version less than "
5578
0
                            "TLS v1.3");
5579
0
                SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
5580
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
5581
0
                return VERSION_ERROR;
5582
0
            }
5583
0
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
5584
0
    defined(WOLFSSL_WPAS_SMALL)
5585
            /* Check if client has disabled TLS 1.2 */
5586
0
            if (args->pv.minor == TLSv1_2_MINOR &&
5587
0
                (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2)
5588
0
                == WOLFSSL_OP_NO_TLSv1_2)
5589
0
            {
5590
0
                WOLFSSL_MSG("\tOption set to not allow TLSv1.2");
5591
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
5592
0
                return VERSION_ERROR;
5593
0
            }
5594
0
#endif
5595
5596
0
            if (!ssl->options.dtls &&
5597
0
                args->pv.minor < ssl->options.minDowngrade) {
5598
0
                SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
5599
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
5600
0
                return VERSION_ERROR;
5601
0
            }
5602
5603
0
            if (ssl->options.dtls &&
5604
0
                args->pv.minor > ssl->options.minDowngrade) {
5605
0
                SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
5606
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
5607
0
                return VERSION_ERROR;
5608
0
            }
5609
5610
0
            ssl->version.minor = args->pv.minor;
5611
0
            ssl->options.tls1_3 = 0;
5612
5613
#ifdef WOLFSSL_DTLS13
5614
            if (ssl->options.dtls) {
5615
                ret = Dtls13ClientDoDowngrade(ssl);
5616
                if (ret != 0)
5617
                    return ret;
5618
            }
5619
#endif /* WOLFSSL_DTLS13 */
5620
0
        }
5621
0
    }
5622
5623
#ifdef WOLFSSL_DTLS13
5624
    /* we are sure that version is >= v1.3 now, we can get rid of buffered
5625
     * ClientHello that was buffered to re-compute the hash in case of
5626
     * downgrade */
5627
    if (ssl->options.dtls && ssl->dtls13ClientHello != NULL) {
5628
        XFREE(ssl->dtls13ClientHello, ssl->heap, DYNAMIC_TYPE_DTLS_MSG);
5629
        ssl->dtls13ClientHello = NULL;
5630
        ssl->dtls13ClientHelloSz = 0;
5631
    }
5632
#endif /* WOLFSSL_DTLS13 */
5633
5634
    /* Advance state and proceed */
5635
0
    ssl->options.asyncState = TLS_ASYNC_BUILD;
5636
0
    } /* case TLS_ASYNC_BEGIN */
5637
0
    FALL_THROUGH;
5638
5639
0
    case TLS_ASYNC_BUILD:
5640
0
    case TLS_ASYNC_DO:
5641
0
    {
5642
    /* restore message type */
5643
0
    *extMsgType = args->extMsgType;
5644
5645
    /* Parse and handle extensions, unless lower than TLS1.3. In that case,
5646
     * extensions will be parsed in DoServerHello. */
5647
0
    if (args->totalExtSz > 0 && IsAtLeastTLSv1_3(ssl->version)) {
5648
0
        ret = TLSX_Parse(ssl, input + args->idx, args->totalExtSz,
5649
0
            *extMsgType, NULL);
5650
0
        if (ret != 0) {
5651
        #ifdef WOLFSSL_ASYNC_CRYPT
5652
            /* Handle async operation */
5653
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
5654
                /* Mark message as not received so it can process again */
5655
                ssl->msgsReceived.got_server_hello = 0;
5656
            }
5657
        #endif
5658
0
            return ret;
5659
0
        }
5660
5661
0
        if (*extMsgType == hello_retry_request) {
5662
            /* Update counts to reflect change of message type. */
5663
0
            ssl->msgsReceived.got_hello_retry_request = 1;
5664
0
            ssl->msgsReceived.got_server_hello = 0;
5665
0
        }
5666
0
    }
5667
5668
0
    if (args->totalExtSz > 0) {
5669
0
        args->idx += args->totalExtSz;
5670
0
    }
5671
5672
#ifdef WOLFSSL_DTLS_CID
5673
    if (ssl->options.useDtlsCID && *extMsgType == server_hello)
5674
        DtlsCIDOnExtensionsParsed(ssl);
5675
#endif /* WOLFSSL_DTLS_CID */
5676
5677
0
    if (IsAtLeastTLSv1_3(ssl->version)) {
5678
0
        *inOutIdx = args->idx;
5679
0
    }
5680
5681
0
    ssl->options.serverState = SERVER_HELLO_COMPLETE;
5682
5683
#ifdef HAVE_SECRET_CALLBACK
5684
    if (ssl->sessionSecretCb != NULL
5685
#ifdef HAVE_SESSION_TICKET
5686
            && ssl->session->ticketLen > 0
5687
#endif
5688
            ) {
5689
        int secretSz = SECRET_LEN;
5690
        ret = ssl->sessionSecretCb(ssl, ssl->session->masterSecret,
5691
                                   &secretSz, ssl->sessionSecretCtx);
5692
        if (ret != 0 || secretSz != SECRET_LEN) {
5693
            WOLFSSL_ERROR_VERBOSE(SESSION_SECRET_CB_E);
5694
            return SESSION_SECRET_CB_E;
5695
        }
5696
    }
5697
#endif /* HAVE_SECRET_CALLBACK */
5698
5699
    /* Version only negotiated in extensions for TLS v1.3.
5700
     * Only now do we know how to deal with session id.
5701
     */
5702
0
    if (!IsAtLeastTLSv1_3(ssl->version)) {
5703
0
#ifndef WOLFSSL_NO_TLS12
5704
0
        ssl->arrays->sessionIDSz = args->sessIdSz;
5705
5706
0
        if (ssl->arrays->sessionIDSz > ID_LEN) {
5707
0
            WOLFSSL_MSG("Invalid session ID size");
5708
0
            ssl->arrays->sessionIDSz = 0;
5709
0
            return BUFFER_ERROR;
5710
0
        }
5711
0
        else if (ssl->arrays->sessionIDSz) {
5712
0
            XMEMCPY(ssl->arrays->sessionID, args->sessId,
5713
0
                ssl->arrays->sessionIDSz);
5714
0
            ssl->options.haveSessionId = 1;
5715
0
        }
5716
5717
        /* Force client hello version 1.2 to work for static RSA. */
5718
0
        if (ssl->options.dtls)
5719
0
            ssl->chVersion.minor = DTLSv1_2_MINOR;
5720
0
        else
5721
0
            ssl->chVersion.minor = TLSv1_2_MINOR;
5722
        /* Complete TLS v1.2 processing of ServerHello. */
5723
0
        ret = DoServerHello(ssl, input, inOutIdx, helloSz);
5724
#else
5725
        WOLFSSL_MSG("Client using higher version, fatal error");
5726
        WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
5727
        ret = VERSION_ERROR;
5728
#endif
5729
5730
0
        WOLFSSL_LEAVE("DoTls13ServerHello", ret);
5731
5732
0
        return ret;
5733
0
    }
5734
5735
    /* Advance state and proceed */
5736
0
    ssl->options.asyncState = TLS_ASYNC_FINALIZE;
5737
0
    } /* case TLS_ASYNC_BUILD || TLS_ASYNC_DO */
5738
0
    FALL_THROUGH;
5739
5740
0
    case TLS_ASYNC_FINALIZE:
5741
0
    {
5742
#ifdef WOLFSSL_TLS13_MIDDLEBOX_COMPAT
5743
    if (ssl->options.tls13MiddleBoxCompat) {
5744
        if (args->sessIdSz == 0) {
5745
            WOLFSSL_MSG("args->sessIdSz == 0");
5746
            WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
5747
            return INVALID_PARAMETER;
5748
        }
5749
        if (ssl->session->sessionIDSz != 0) {
5750
            if (ssl->session->sessionIDSz != args->sessIdSz ||
5751
                XMEMCMP(ssl->session->sessionID, args->sessId,
5752
                    args->sessIdSz) != 0) {
5753
                WOLFSSL_MSG("session id doesn't match");
5754
                WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
5755
                return INVALID_PARAMETER;
5756
            }
5757
        }
5758
        else if (XMEMCMP(ssl->arrays->clientRandom, args->sessId,
5759
                args->sessIdSz) != 0) {
5760
            WOLFSSL_MSG("session id doesn't match client random");
5761
            WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
5762
            return INVALID_PARAMETER;
5763
        }
5764
    }
5765
    else
5766
#endif /* WOLFSSL_TLS13_MIDDLEBOX_COMPAT */
5767
#if defined(WOLFSSL_QUIC) || defined(WOLFSSL_DTLS13)
5768
    if (0
5769
#ifdef WOLFSSL_QUIC
5770
        || WOLFSSL_IS_QUIC(ssl)
5771
#endif
5772
#ifdef WOLFSSL_DTLS13
5773
        || ssl->options.dtls
5774
#endif
5775
    ) {
5776
        /* RFC 9147 Section 5.3 / RFC 9001 Section 8.4: DTLS 1.3 and QUIC
5777
         * ServerHello must have empty legacy_session_id_echo. */
5778
        if (args->sessIdSz != 0) {
5779
            WOLFSSL_MSG("args->sessIdSz != 0");
5780
            WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
5781
            return INVALID_PARAMETER;
5782
        }
5783
    }
5784
    else
5785
#endif /* WOLFSSL_QUIC || WOLFSSL_DTLS13 */
5786
0
    if (args->sessIdSz != ssl->session->sessionIDSz || (args->sessIdSz > 0 &&
5787
0
        XMEMCMP(ssl->session->sessionID, args->sessId, args->sessIdSz) != 0))
5788
0
    {
5789
0
        WOLFSSL_MSG("Server sent different session id");
5790
0
        WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
5791
0
        return INVALID_PARAMETER;
5792
0
    }
5793
5794
0
    ret = SetCipherSpecs(ssl);
5795
0
    if (ret != 0)
5796
0
        return ret;
5797
5798
#ifdef HAVE_NULL_CIPHER
5799
    if (ssl->options.cipherSuite0 == ECC_BYTE &&
5800
                              (ssl->options.cipherSuite == TLS_SHA256_SHA256 ||
5801
                               ssl->options.cipherSuite == TLS_SHA384_SHA384)) {
5802
        ;
5803
    }
5804
    else
5805
#endif
5806
0
#if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_SM3)
5807
0
    if (ssl->options.cipherSuite0 == CIPHER_BYTE &&
5808
0
            ssl->options.cipherSuite == TLS_SM4_GCM_SM3) {
5809
0
        ; /* Do nothing. */
5810
0
    }
5811
0
    else
5812
0
#endif
5813
0
#if defined(WOLFSSL_SM4_CCM) && defined(WOLFSSL_SM3)
5814
0
    if (ssl->options.cipherSuite0 == CIPHER_BYTE &&
5815
0
            ssl->options.cipherSuite == TLS_SM4_CCM_SM3) {
5816
0
        ; /* Do nothing. */
5817
0
    }
5818
0
    else
5819
0
#endif
5820
    /* Check that the negotiated ciphersuite matches protocol version. */
5821
0
    if (ssl->options.cipherSuite0 != TLS13_BYTE) {
5822
0
        WOLFSSL_MSG("Server sent non-TLS13 cipher suite in TLS 1.3 packet");
5823
0
        WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
5824
0
        return INVALID_PARAMETER;
5825
0
    }
5826
5827
0
    suite[0] = ssl->options.cipherSuite0;
5828
0
    suite[1] = ssl->options.cipherSuite;
5829
0
    if (!FindSuiteSSL(ssl, suite)) {
5830
0
        WOLFSSL_MSG("Cipher suite not supported on client");
5831
0
        WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
5832
0
        return INVALID_PARAMETER;
5833
0
    }
5834
5835
#if defined(HAVE_ECH)
5836
    /* check for acceptConfirmation */
5837
    if (ssl->echConfigs != NULL && !ssl->options.disableECH &&
5838
            ssl->hsHashesEch != NULL) {
5839
        args->echX = TLSX_Find(ssl->extensions, TLSX_ECH);
5840
        if (args->echX == NULL || args->echX->data == NULL)
5841
            return WOLFSSL_FATAL_ERROR;
5842
5843
        if (args->extMsgType == hello_retry_request &&
5844
                ((WOLFSSL_ECH*)args->echX->data)->confBuf == NULL) {
5845
            /* server rejected ECH, fallback to outer */
5846
            Free_HS_Hashes(ssl->hsHashesEch, ssl->heap);
5847
            ssl->hsHashesEch = NULL;
5848
        }
5849
        else {
5850
            /* account for hrr extension instead of server random */
5851
            if (args->extMsgType == hello_retry_request) {
5852
                args->acceptOffset =
5853
                    (word32)(((WOLFSSL_ECH*)args->echX->data)->confBuf - input);
5854
                args->acceptLabel = (byte*)echHrrAcceptConfirmationLabel;
5855
                args->acceptLabelSz = ECH_HRR_ACCEPT_CONFIRMATION_LABEL_SZ;
5856
            }
5857
            else {
5858
                args->acceptLabel = (byte*)echAcceptConfirmationLabel;
5859
                args->acceptLabelSz = ECH_ACCEPT_CONFIRMATION_LABEL_SZ;
5860
            }
5861
            /* check acceptance */
5862
            if (ret == 0) {
5863
                ret = EchCheckAcceptance(ssl, args->acceptLabel,
5864
                    args->acceptLabelSz, input, args->acceptOffset, helloSz,
5865
                    args->extMsgType);
5866
            }
5867
            if (ret != 0)
5868
                return ret;
5869
            /* use the inner random for client random */
5870
            if (args->extMsgType != hello_retry_request) {
5871
                XMEMCPY(ssl->arrays->clientRandom,
5872
                    ssl->arrays->clientRandomInner, RAN_LEN);
5873
            }
5874
        }
5875
    }
5876
#endif /* HAVE_ECH */
5877
5878
0
    if (*extMsgType == server_hello) {
5879
0
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
5880
0
        PreSharedKey* psk = NULL;
5881
0
        TLSX* ext = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
5882
0
        if (ext != NULL)
5883
0
            psk = (PreSharedKey*)ext->data;
5884
0
        while (psk != NULL && !psk->chosen)
5885
0
            psk = psk->next;
5886
0
        if (psk == NULL) {
5887
0
            ssl->options.resuming = 0;
5888
0
            ssl->arrays->psk_keySz = 0;
5889
0
            XMEMSET(ssl->arrays->psk_key, 0, MAX_PSK_KEY_LEN);
5890
0
        }
5891
0
        else {
5892
#if defined(HAVE_ECH)
5893
            /* do not resume when outerHandshake will be negotiated */
5894
            if (ssl->echConfigs != NULL && !ssl->options.disableECH &&
5895
                    !ssl->options.echAccepted) {
5896
                WOLFSSL_MSG("ECH rejected but server negotiated PSK");
5897
                return INVALID_PARAMETER;
5898
            }
5899
#endif
5900
#ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
5901
            if (ssl->options.certWithExternPsk && psk->resumption) {
5902
                /* RFC8773bis mode requires external PSK, not ticket resumption. */
5903
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
5904
                return PSK_KEY_ERROR;
5905
            }
5906
            if (ssl->options.certWithExternPsk && ssl->options.shSentKeyShare == 0) {
5907
                /* RFC8773bis Sec. 3: cert_with_extern_psk requires psk_dhe_ke;
5908
                 * a ServerHello without a key_share confirms only psk_ke. */
5909
                WOLFSSL_MSG("cert_with_extern_psk: ServerHello missing key_share");
5910
                WOLFSSL_ERROR_VERBOSE(EXT_MISSING);
5911
                return EXT_MISSING;
5912
            }
5913
#endif
5914
0
            if ((ret = SetupPskKey(ssl, psk, 0)) != 0)
5915
0
                return ret;
5916
0
            ssl->options.pskNegotiated = 1;
5917
0
        }
5918
#else
5919
        /* no resumption possible */
5920
        ssl->options.resuming = 0;
5921
#endif
5922
5923
        /* sanity check on PSK / KSE */
5924
0
        if (
5925
0
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
5926
0
            ssl->options.pskNegotiated == 0 &&
5927
0
    #endif
5928
0
            (ssl->session->namedGroup == 0 ||
5929
0
             ssl->options.shSentKeyShare == 0)) {
5930
0
            return EXT_MISSING;
5931
0
        }
5932
5933
0
        ssl->keys.encryptionOn = 1;
5934
0
        ssl->options.serverState = SERVER_HELLO_COMPLETE;
5935
5936
0
    }
5937
0
    else {
5938
        /* https://datatracker.ietf.org/doc/html/rfc8446#section-4.1.4
5939
         * Clients MUST abort the handshake with an
5940
         * "illegal_parameter" alert if the HelloRetryRequest would not result
5941
         * in any change in the ClientHello.
5942
         */
5943
        /* Check if the HRR contained a cookie or a keyshare */
5944
0
        if (!ssl->options.hrrSentKeyShare
5945
#ifdef WOLFSSL_SEND_HRR_COOKIE
5946
                && !ssl->options.hrrSentCookie
5947
#endif
5948
0
                ) {
5949
0
            SendAlert(ssl, alert_fatal, illegal_parameter);
5950
0
            return EXT_MISSING;
5951
0
        }
5952
5953
0
        ssl->options.tls1_3 = 1;
5954
0
        ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
5955
5956
0
        ret = RestartHandshakeHash(ssl);
5957
0
    }
5958
5959
0
    break;
5960
0
    } /* case TLS_ASYNC_FINALIZE */
5961
0
    default:
5962
0
        ret = INPUT_CASE_ERROR;
5963
0
    } /* switch (ssl->options.asyncState) */
5964
5965
#ifdef WOLFSSL_ASYNC_CRYPT
5966
    if (ret == 0)
5967
        FreeAsyncCtx(ssl, 0);
5968
#endif
5969
5970
0
    WOLFSSL_LEAVE("DoTls13ServerHello", ret);
5971
0
    WOLFSSL_END(WC_FUNC_SERVER_HELLO_DO);
5972
5973
0
    return ret;
5974
0
}
5975
5976
/* handle processing TLS 1.3 encrypted_extensions (8) */
5977
/* Parse and handle an EncryptedExtensions message.
5978
 * Only a client will receive this message.
5979
 *
5980
 * ssl       The SSL/TLS object.
5981
 * input     The message buffer.
5982
 * inOutIdx  On entry, the index into the message buffer of
5983
 *           EncryptedExtensions.
5984
 *           On exit, the index of byte after the EncryptedExtensions
5985
 *           message.
5986
 * totalSz   The length of the current handshake message.
5987
 * returns 0 on success and otherwise failure.
5988
 */
5989
static int DoTls13EncryptedExtensions(WOLFSSL* ssl, const byte* input,
5990
                                      word32* inOutIdx, word32 totalSz)
5991
0
{
5992
0
    int    ret;
5993
0
    word32 begin = *inOutIdx;
5994
0
    word32 i = begin;
5995
0
    word16 totalExtSz;
5996
5997
0
    WOLFSSL_START(WC_FUNC_ENCRYPTED_EXTENSIONS_DO);
5998
0
    WOLFSSL_ENTER("DoTls13EncryptedExtensions");
5999
6000
#ifdef WOLFSSL_CALLBACKS
6001
    if (ssl->hsInfoOn) AddPacketName(ssl, "EncryptedExtensions");
6002
    if (ssl->toInfoOn) AddLateName("EncryptedExtensions", &ssl->timeoutInfo);
6003
#endif
6004
6005
    /* Length field of extension data. */
6006
0
    if (totalSz < OPAQUE16_LEN)
6007
0
        return BUFFER_ERROR;
6008
0
    ato16(&input[i], &totalExtSz);
6009
0
    i += OPAQUE16_LEN;
6010
6011
    /* Extension data. */
6012
0
    if (i - begin + totalExtSz > totalSz)
6013
0
        return BUFFER_ERROR;
6014
0
    if ((ret = TLSX_Parse(ssl, input + i, totalExtSz, encrypted_extensions,
6015
0
                                                                       NULL))) {
6016
0
        return ret;
6017
0
    }
6018
6019
    /* Move index to byte after message. */
6020
0
    *inOutIdx = i + totalExtSz;
6021
6022
    /* Always encrypted. */
6023
0
    *inOutIdx += ssl->keys.padSz;
6024
6025
#ifdef WOLFSSL_EARLY_DATA
6026
    if (ssl->earlyData != no_early_data) {
6027
        TLSX* ext = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
6028
        if (ext == NULL || !ext->val) {
6029
            WOLFSSL_MSG("Early data rejected by server (no early_data "
6030
                        "EncryptedExtensions response)");
6031
            ssl->earlyData = no_early_data;
6032
        }
6033
    }
6034
6035
    if (ssl->earlyData == no_early_data) {
6036
        ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY);
6037
        if (ret != 0)
6038
            return ret;
6039
    }
6040
#endif /* WOLFSSL_EARLY_DATA */
6041
6042
0
    ssl->options.serverState = SERVER_ENCRYPTED_EXTENSIONS_COMPLETE;
6043
6044
0
    WOLFSSL_LEAVE("DoTls13EncryptedExtensions", ret);
6045
0
    WOLFSSL_END(WC_FUNC_ENCRYPTED_EXTENSIONS_DO);
6046
6047
0
    return ret;
6048
0
}
6049
6050
#ifndef NO_CERTS
6051
/* handle processing TLS v1.3 certificate_request (13) */
6052
/* Handle a TLS v1.3 CertificateRequest message.
6053
 * This message is always encrypted.
6054
 * Only a client will receive this message.
6055
 *
6056
 * ssl       The SSL/TLS object.
6057
 * input     The message buffer.
6058
 * inOutIdx  On entry, the index into the message buffer of CertificateRequest.
6059
 *           On exit, the index of byte after the CertificateRequest message.
6060
 * size      The length of the current handshake message.
6061
 * returns 0 on success and otherwise failure.
6062
 */
6063
static int DoTls13CertificateRequest(WOLFSSL* ssl, const byte* input,
6064
                                     word32* inOutIdx, word32 size)
6065
0
{
6066
0
    word16      len;
6067
0
    word32      begin = *inOutIdx;
6068
0
    int         ret = 0;
6069
0
    Suites      peerSuites;
6070
#ifdef WOLFSSL_POST_HANDSHAKE_AUTH
6071
    word16      reqCtxLen;
6072
    const byte* reqCtxData;
6073
#endif
6074
6075
0
    WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_DO);
6076
0
    WOLFSSL_ENTER("DoTls13CertificateRequest");
6077
6078
0
    XMEMSET(&peerSuites, 0, sizeof(Suites));
6079
6080
#ifdef WOLFSSL_CALLBACKS
6081
    if (ssl->hsInfoOn) AddPacketName(ssl, "CertificateRequest");
6082
    if (ssl->toInfoOn) AddLateName("CertificateRequest", &ssl->timeoutInfo);
6083
#endif
6084
6085
0
    if (OPAQUE8_LEN > size)
6086
0
        return BUFFER_ERROR;
6087
6088
    /* Length of the request context. */
6089
0
    len = input[(*inOutIdx)++];
6090
0
    if ((*inOutIdx - begin) + len > size)
6091
0
        return BUFFER_ERROR;
6092
0
    if (ssl->options.connectState < FINISHED_DONE && len > 0)
6093
0
        return BUFFER_ERROR;
6094
6095
#ifdef WOLFSSL_POST_HANDSHAKE_AUTH
6096
    /* Remember the request context bytes; the CertReqCtx allocation and
6097
     * linking into ssl->certReqCtx is deferred until after the rest of the
6098
     * message has been validated.
6099
     */
6100
    reqCtxLen = len;
6101
    reqCtxData = input + *inOutIdx;
6102
#endif
6103
0
    *inOutIdx += len;
6104
6105
    /* TODO: Add support for more extensions:
6106
     *   signed_certificate_timestamp, certificate_authorities, oid_filters.
6107
     */
6108
    /* Certificate extensions */
6109
0
    if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
6110
0
        return BUFFER_ERROR;
6111
0
    ato16(input + *inOutIdx, &len);
6112
0
    *inOutIdx += OPAQUE16_LEN;
6113
0
    if ((*inOutIdx - begin) + len > size)
6114
0
        return BUFFER_ERROR;
6115
0
    if (len == 0)
6116
0
        return INVALID_PARAMETER;
6117
0
    if ((ret = TLSX_Parse(ssl, input + *inOutIdx, len, certificate_request,
6118
0
                                                                &peerSuites))) {
6119
0
        return ret;
6120
0
    }
6121
0
    *inOutIdx += len;
6122
6123
0
#ifdef WOLFSSL_CERT_SETUP_CB
6124
0
    if ((ret = CertSetupCbWrapper(ssl)) != 0)
6125
0
        return ret;
6126
0
#endif
6127
6128
#if defined(HAVE_ECH)
6129
    /* RFC 9849 s6.1.7: ECH was offered but rejected by the server...
6130
     * the client MUST respond with an empty Certificate message. */
6131
    if (ssl->echConfigs != NULL && !ssl->options.disableECH &&
6132
            !ssl->options.echAccepted) {
6133
        ssl->options.sendVerify = SEND_BLANK_CERT;
6134
    }
6135
    else
6136
#endif
6137
0
    if ((ssl->buffers.certificate && ssl->buffers.certificate->buffer &&
6138
0
        ((ssl->buffers.key && ssl->buffers.key->buffer)
6139
        #ifdef HAVE_PK_CALLBACKS
6140
            || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
6141
        #endif
6142
0
    ))
6143
0
        #ifdef OPENSSL_EXTRA
6144
0
            || ssl->ctx->certSetupCb != NULL
6145
0
        #endif
6146
0
            ) {
6147
0
        if (PickHashSigAlgo(ssl, peerSuites.hashSigAlgo,
6148
0
                            peerSuites.hashSigAlgoSz, 0) != 0) {
6149
0
            WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
6150
0
            return INVALID_PARAMETER;
6151
0
        }
6152
0
        ssl->options.sendVerify = SEND_CERT;
6153
0
    }
6154
0
    else {
6155
0
#ifndef WOLFSSL_NO_CLIENT_CERT_ERROR
6156
0
        ssl->options.sendVerify = SEND_BLANK_CERT;
6157
#else
6158
        WOLFSSL_MSG("Certificate required but none set on client");
6159
        /* RFC 8446 Section 4.4.2.4: send certificate_required when a
6160
         * peer (here, the client) cannot provide a certificate that the
6161
         * other peer required. */
6162
        SendAlert(ssl, alert_fatal, certificate_required);
6163
        WOLFSSL_ERROR_VERBOSE(NO_CERT_ERROR);
6164
        return NO_CERT_ERROR;
6165
#endif
6166
0
    }
6167
6168
    /* This message is always encrypted so add encryption padding. */
6169
0
    *inOutIdx += ssl->keys.padSz;
6170
6171
#ifdef WOLFSSL_POST_HANDSHAKE_AUTH
6172
    {
6173
        /* CertReqCtx has one byte at end for context value.
6174
        * Increase size to handle other implementations sending more than one byte.
6175
        * That is, allocate extra space, over one byte, to hold the context value.
6176
        */
6177
        CertReqCtx* certReqCtx = (CertReqCtx*)XMALLOC(
6178
            sizeof(CertReqCtx) + (reqCtxLen == 0 ? 0 : reqCtxLen - 1),
6179
            ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
6180
        if (certReqCtx == NULL)
6181
            return MEMORY_E;
6182
        certReqCtx->next = ssl->certReqCtx;
6183
        certReqCtx->len = reqCtxLen;
6184
        XMEMCPY(&certReqCtx->ctx, reqCtxData, reqCtxLen);
6185
        ssl->certReqCtx = certReqCtx;
6186
    }
6187
#endif
6188
6189
0
    WOLFSSL_LEAVE("DoTls13CertificateRequest", ret);
6190
0
    WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_DO);
6191
6192
0
    return ret;
6193
0
}
6194
#endif /* !NO_CERTS */
6195
#endif /* !NO_WOLFSSL_CLIENT */
6196
6197
#ifndef NO_WOLFSSL_SERVER
6198
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
6199
#ifndef NO_PSK
6200
int FindPskSuite(const WOLFSSL* ssl, PreSharedKey* psk, byte* psk_key,
6201
        word32* psk_keySz, const byte* suite, int* found, byte* foundSuite)
6202
{
6203
    const char* cipherName = NULL;
6204
    byte        cipherSuite0 = TLS13_BYTE;
6205
    byte        cipherSuite  = WOLFSSL_DEF_PSK_CIPHER;
6206
    int         ret = 0;
6207
6208
    *found = 0;
6209
    (void)suite;
6210
6211
    if (ssl->options.server_psk_tls13_cb != NULL) {
6212
         *psk_keySz = ssl->options.server_psk_tls13_cb((WOLFSSL*)ssl,
6213
             (char*)psk->identity, psk_key, MAX_PSK_KEY_LEN, &cipherName);
6214
         if (*psk_keySz != 0) {
6215
             int cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE;
6216
             *found = (GetCipherSuiteFromName(cipherName, &cipherSuite0,
6217
                 &cipherSuite, NULL, NULL, &cipherSuiteFlags) == 0);
6218
             (void)cipherSuiteFlags;
6219
         }
6220
    }
6221
    if (*found == 0 && (ssl->options.server_psk_cb != NULL)) {
6222
         *psk_keySz = ssl->options.server_psk_cb((WOLFSSL*)ssl,
6223
                             (char*)psk->identity, psk_key,
6224
                             MAX_PSK_KEY_LEN);
6225
         *found = (*psk_keySz != 0);
6226
    }
6227
    if (*found) {
6228
        if (*psk_keySz > MAX_PSK_KEY_LEN &&
6229
            (int)*psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK)) {
6230
            WOLFSSL_MSG("Key len too long in FindPsk()");
6231
            ret = PSK_KEY_ERROR;
6232
            WOLFSSL_ERROR_VERBOSE(ret);
6233
            *found = 0;
6234
        }
6235
        if (ret == 0) {
6236
        #if !defined(WOLFSSL_PSK_ONE_ID) && !defined(WOLFSSL_PRIORITIZE_PSK)
6237
            /* Check whether PSK ciphersuite is in SSL. */
6238
            *found = (suite[0] == cipherSuite0) && (suite[1] == cipherSuite);
6239
        #else
6240
            (void)suite;
6241
            /* Check whether PSK ciphersuite is in SSL. */
6242
            {
6243
                byte s[2] = {
6244
                    cipherSuite0,
6245
                    cipherSuite,
6246
                };
6247
                *found = FindSuiteSSL(ssl, s);
6248
            }
6249
        #endif
6250
        }
6251
    }
6252
    if (*found && foundSuite != NULL) {
6253
        foundSuite[0] = cipherSuite0;
6254
        foundSuite[1] = cipherSuite;
6255
    }
6256
6257
    return ret;
6258
}
6259
6260
/* Attempt to find the PSK (not session ticket) that matches.
6261
 *
6262
 * @param [in, out] ssl    The SSL/TLS object.
6263
 * @param [in]      psk    A pre-shared key from the extension.
6264
 * @param [out]     suite  Cipher suite to use with PSK.
6265
 * @param [out]     err    Error code.
6266
 *                         PSK_KEY_ERROR when key is too big or ticket age is
6267
 *                         invalid,
6268
 *                         UNSUPPORTED_SUITE on invalid suite.
6269
 *                         Other error when attempting to derive early secret.
6270
 * @return  1 when a match found - but check error code.
6271
 * @return  0 when no match found.
6272
 */
6273
static int FindPsk(WOLFSSL* ssl, PreSharedKey* psk, const byte* suite, int* err)
6274
{
6275
    int         ret = 0;
6276
    int         found = 0;
6277
    byte        foundSuite[SUITE_LEN];
6278
6279
    WOLFSSL_ENTER("FindPsk");
6280
6281
    XMEMSET(foundSuite, 0, sizeof(foundSuite));
6282
6283
    ret = FindPskSuite(ssl, psk, ssl->arrays->psk_key, &ssl->arrays->psk_keySz,
6284
                       suite, &found, foundSuite);
6285
    if (ret == 0 && found) {
6286
        /* This identity matched via external PSK callback, not ticket resume. */
6287
        psk->resumption = 0;
6288
        /* Default to ciphersuite if cb doesn't specify. */
6289
        ssl->options.resuming = 0;
6290
        /* Don't send certificate request when using PSK. */
6291
#ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
6292
        if (!ssl->options.certWithExternPsk)
6293
#endif
6294
            ssl->options.verifyPeer = 0;
6295
6296
        /* PSK age is always zero. */
6297
        if (psk->ticketAge != 0) {
6298
            ret = PSK_KEY_ERROR;
6299
            WOLFSSL_ERROR_VERBOSE(ret);
6300
        }
6301
        if (ret == 0) {
6302
            /* Set PSK ciphersuite into SSL. */
6303
            ssl->options.cipherSuite0 = foundSuite[0];
6304
            ssl->options.cipherSuite  = foundSuite[1];
6305
            ret = SetCipherSpecs(ssl);
6306
        }
6307
        if (ret == 0) {
6308
            /* Derive the early secret using the PSK. */
6309
            ret = DeriveEarlySecret(ssl);
6310
        }
6311
        if (ret == 0) {
6312
            /* PSK negotiation has succeeded */
6313
            ssl->options.isPSK = 1;
6314
#ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
6315
            if (!ssl->options.certWithExternPsk)
6316
#endif
6317
            {
6318
                /* SERVER: using PSK for peer authentication. */
6319
                ssl->options.peerAuthGood = 1;
6320
            }
6321
        }
6322
    }
6323
6324
    *err = ret;
6325
    WOLFSSL_LEAVE("FindPsk", found);
6326
    WOLFSSL_LEAVE("FindPsk", ret);
6327
    return found;
6328
}
6329
#endif /* !NO_PSK */
6330
6331
/* Handle any Pre-Shared Key (PSK) extension.
6332
 * Find a PSK that supports the cipher suite passed in.
6333
 *
6334
 * ssl         SSL/TLS object.
6335
 * suite       Cipher suite to find PSK for.
6336
 * usingPSK    1=Indicates handshake is using Pre-Shared Keys (2=Ephemeral)
6337
 * first       Set to 1 if first in extension
6338
 * returns 0 on success and otherwise failure.
6339
 */
6340
static int DoPreSharedKeys(WOLFSSL* ssl, const byte* input, word32 inputSz,
6341
    const byte* suite, int* usingPSK, int* first)
6342
{
6343
    int           ret = 0;
6344
    TLSX*         ext;
6345
    PreSharedKey* current;
6346
    byte          binderKey[WC_MAX_DIGEST_SIZE];
6347
    byte          binder[WC_MAX_DIGEST_SIZE];
6348
    word32        binderLen;
6349
#if defined(WOLFSSL_CERT_WITH_EXTERN_PSK) && defined(HAVE_SESSION_TICKET)
6350
    int           certWithExternOffered = 0;
6351
#endif
6352
6353
    #ifdef NO_PSK
6354
        (void) suite; /* to avoid unused var warning when not used */
6355
    #endif
6356
6357
    WOLFSSL_ENTER("DoPreSharedKeys");
6358
6359
    (void)suite;
6360
6361
    ext = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
6362
    if (ext == NULL) {
6363
        WOLFSSL_MSG("No pre shared extension keys found");
6364
        ret = BAD_FUNC_ARG;
6365
        goto cleanup;
6366
    }
6367
#if defined(WOLFSSL_CERT_WITH_EXTERN_PSK) && defined(HAVE_SESSION_TICKET)
6368
    certWithExternOffered =
6369
        TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK) != NULL;
6370
#endif
6371
6372
    /* Look through all client's pre-shared keys for a match. */
6373
    for (current = (PreSharedKey*)ext->data; current != NULL;
6374
            current = current->next) {
6375
    #ifndef NO_PSK
6376
        if (current->identityLen > MAX_PSK_ID_LEN) {
6377
            ret = BUFFER_ERROR;
6378
            goto cleanup;
6379
        }
6380
        XMEMCPY(ssl->arrays->client_identity, current->identity,
6381
                current->identityLen);
6382
        ssl->arrays->client_identity[current->identityLen] = '\0';
6383
    #endif
6384
6385
    #ifdef HAVE_SESSION_TICKET
6386
        /* Decode the identity. */
6387
        switch (current->decryptRet) {
6388
            case PSK_DECRYPT_NONE:
6389
                ret = DoClientTicket_ex(ssl, current, 1);
6390
                /* psk->sess may be set. Need to clean up later. */
6391
                break;
6392
            case PSK_DECRYPT_OK:
6393
                ret = WOLFSSL_TICKET_RET_OK;
6394
                break;
6395
            case PSK_DECRYPT_CREATE:
6396
                ret = WOLFSSL_TICKET_RET_CREATE;
6397
                break;
6398
            case PSK_DECRYPT_FAIL:
6399
                ret = WOLFSSL_TICKET_RET_REJECT;
6400
                break;
6401
        }
6402
6403
        #ifdef WOLFSSL_ASYNC_CRYPT
6404
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
6405
            goto cleanup;
6406
        #endif
6407
6408
        if (ret != WOLFSSL_TICKET_RET_OK && current->sess_free_cb != NULL) {
6409
            current->sess_free_cb(ssl, current->sess,
6410
                    &current->sess_free_cb_ctx);
6411
            current->sess = NULL;
6412
            XMEMSET(&current->sess_free_cb_ctx, 0,
6413
                    sizeof(psk_sess_free_cb_ctx));
6414
        }
6415
        if (ret == WOLFSSL_TICKET_RET_OK) {
6416
#if defined(WOLFSSL_CERT_WITH_EXTERN_PSK) && defined(HAVE_SESSION_TICKET)
6417
            /* RFC 8773bis Sect. 5.1: all PSKs listed alongside
6418
             * tls_cert_with_extern_psk MUST be external PSKs.  A successfully
6419
             * decrypted session ticket identity is a resumption PSK, so the
6420
             * server MUST abort with illegal_parameter regardless of whether
6421
             * the ticket would otherwise be acceptable.  Check here, before
6422
             * DoClientTicketFinalize, to avoid polluting ssl->session with
6423
             * ticket state that will not be used. */
6424
            if (certWithExternOffered) {
6425
                if (current->sess_free_cb != NULL) {
6426
                    current->sess_free_cb(ssl, current->sess,
6427
                            &current->sess_free_cb_ctx);
6428
                    current->sess = NULL;
6429
                    XMEMSET(&current->sess_free_cb_ctx, 0,
6430
                            sizeof(psk_sess_free_cb_ctx));
6431
                }
6432
                ret = PSK_KEY_ERROR;
6433
                WOLFSSL_ERROR_VERBOSE(ret);
6434
                goto cleanup;
6435
            }
6436
#endif
6437
            ret = DoClientTicketCheck(ssl, current, ssl->timeout, suite);
6438
            if (ret == 0)
6439
                DoClientTicketFinalize(ssl, current->it, current->sess);
6440
            if (current->sess_free_cb != NULL) {
6441
                current->sess_free_cb(ssl, current->sess,
6442
                        &current->sess_free_cb_ctx);
6443
                current->sess = NULL;
6444
                XMEMSET(&current->sess_free_cb_ctx, 0,
6445
                        sizeof(psk_sess_free_cb_ctx));
6446
            }
6447
            if (ret != 0)
6448
                continue;
6449
6450
            /* SERVER: using secret in session ticket for peer auth. */
6451
            ssl->options.peerAuthGood = 1;
6452
6453
        #ifdef WOLFSSL_EARLY_DATA
6454
            ssl->options.maxEarlyDataSz = ssl->session->maxEarlyDataSz;
6455
        #endif
6456
            /* Use the same cipher suite as before and set up for use. */
6457
            ssl->options.cipherSuite0   = ssl->session->cipherSuite0;
6458
            ssl->options.cipherSuite    = ssl->session->cipherSuite;
6459
            ret = SetCipherSpecs(ssl);
6460
            if (ret != 0)
6461
                goto cleanup;
6462
6463
            /* Resumption PSK is resumption master secret. */
6464
            ssl->arrays->psk_keySz = ssl->specs.hash_size;
6465
            if ((ret = DeriveResumptionPSK(ssl, ssl->session->ticketNonce.data,
6466
                ssl->session->ticketNonce.len, ssl->arrays->psk_key)) != 0) {
6467
                goto cleanup;
6468
            }
6469
6470
            /* Derive the early secret using the PSK. */
6471
            ret = DeriveEarlySecret(ssl);
6472
            if (ret != 0)
6473
                goto cleanup;
6474
6475
            /* Hash data up to binders for deriving binders in PSK extension. */
6476
            ret = HashInput(ssl, input, (int)inputSz);
6477
            if (ret < 0)
6478
                goto cleanup;
6479
6480
            /* Derive the binder key to use with HMAC. */
6481
            ret = DeriveBinderKeyResume(ssl, binderKey);
6482
            if (ret != 0)
6483
                goto cleanup;
6484
        }
6485
        else
6486
    #endif /* HAVE_SESSION_TICKET */
6487
    #ifndef NO_PSK
6488
        if (FindPsk(ssl, current, suite, &ret)) {
6489
            if (ret != 0)
6490
                goto cleanup;
6491
6492
            ret = HashInput(ssl, input, (int)inputSz);
6493
            if (ret < 0)
6494
                goto cleanup;
6495
6496
            /* Derive the binder key to use with HMAC. */
6497
            ret = DeriveBinderKey(ssl, binderKey);
6498
            if (ret != 0)
6499
                goto cleanup;
6500
        }
6501
        else
6502
    #endif
6503
        {
6504
            continue;
6505
        }
6506
6507
        ssl->options.sendVerify = 0;
6508
6509
        /* Derive the Finished message secret. */
6510
        ret = DeriveFinishedSecret(ssl, binderKey,
6511
                                   ssl->keys.client_write_MAC_secret,
6512
                                   0 /* neither end */);
6513
        if (ret != 0)
6514
            goto cleanup;
6515
6516
        /* Derive the binder and compare with the one in the extension. */
6517
        ret = BuildTls13HandshakeHmac(ssl,
6518
                         ssl->keys.client_write_MAC_secret, binder, &binderLen);
6519
        if (ret != 0)
6520
            goto cleanup;
6521
        if (binderLen != current->binderLen ||
6522
                             ConstantCompare(binder, current->binder,
6523
                                binderLen) != 0) {
6524
            WOLFSSL_ERROR_VERBOSE(BAD_BINDER);
6525
            ret = BAD_BINDER;
6526
            goto cleanup;
6527
        }
6528
6529
        /* This PSK works, no need to try any more. */
6530
        current->chosen = 1;
6531
        ext->resp = 1;
6532
        break;
6533
    }
6534
6535
    if (current == NULL) {
6536
#ifdef WOLFSSL_PSK_ID_PROTECTION
6537
    #ifndef NO_CERTS
6538
        if (ssl->buffers.certChainCnt != 0) {
6539
            ret = 0;
6540
            goto cleanup;
6541
        }
6542
    #endif
6543
        WOLFSSL_ERROR_VERBOSE(BAD_BINDER);
6544
        ret = BAD_BINDER;
6545
        goto cleanup;
6546
#else
6547
        ret = 0;
6548
        goto cleanup;
6549
#endif
6550
    }
6551
6552
    *first = (current == ext->data);
6553
    *usingPSK = 1;
6554
6555
cleanup:
6556
    ForceZero(binderKey, sizeof(binderKey));
6557
    ForceZero(binder, sizeof(binder));
6558
    WOLFSSL_LEAVE("DoPreSharedKeys", ret);
6559
6560
    return ret;
6561
}
6562
6563
/* Handle any Pre-Shared Key (PSK) extension.
6564
 * Must do this in ClientHello as it requires a hash of the truncated message.
6565
 * Don't know size of binders until Pre-Shared Key extension has been parsed.
6566
 *
6567
 * ssl         SSL/TLS object.
6568
 * input       ClientHello message.
6569
 * helloSz     Size of the ClientHello message (including binders if present).
6570
 * clSuites    Client's cipher suite list.
6571
 * usingPSK    Indicates handshake is using Pre-Shared Keys.
6572
 */
6573
static int CheckPreSharedKeys(WOLFSSL* ssl, const byte* input, word32 helloSz,
6574
                              Suites* clSuites, int* usingPSK)
6575
{
6576
    int    ret;
6577
    TLSX*  ext;
6578
    word16 bindersLen;
6579
    int    first = 0;
6580
#ifndef WOLFSSL_PSK_ONE_ID
6581
    int    i;
6582
    const Suites* suites;
6583
#else
6584
    byte   suite[2];
6585
#endif
6586
6587
    WOLFSSL_ENTER("CheckPreSharedKeys");
6588
6589
    ext = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
6590
    if (ext == NULL) {
6591
#ifdef WOLFSSL_EARLY_DATA
6592
        ssl->earlyData = no_early_data;
6593
#endif
6594
        if (usingPSK)
6595
            *usingPSK = 0;
6596
        /* Hash data up to binders for deriving binders in PSK extension. */
6597
        ret = HashInput(ssl, input,  (int)helloSz);
6598
        return ret;
6599
    }
6600
6601
    /* Extensions pushed on stack/list and PSK must be last. */
6602
    if (ssl->extensions != ext) {
6603
        WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
6604
        return PSK_KEY_ERROR;
6605
    }
6606
6607
    /* Assume we are going to resume with a pre-shared key. */
6608
    ssl->options.resuming = 1;
6609
6610
    /* Find the pre-shared key extension and calculate hash of truncated
6611
     * ClientHello for binders.
6612
     */
6613
    ret = TLSX_PreSharedKey_GetSizeBinders((PreSharedKey*)ext->data,
6614
                                                     client_hello, &bindersLen);
6615
    if (ret < 0)
6616
        return ret;
6617
    if (bindersLen > helloSz)
6618
        return BUFFER_ERROR;
6619
6620
    /* Refine list for PSK processing. */
6621
    sslRefineSuites(ssl, clSuites);
6622
#ifndef WOLFSSL_PSK_ONE_ID
6623
    if (usingPSK == NULL)
6624
        return BAD_FUNC_ARG;
6625
6626
    /* set after refineSuites, to avoid taking a stale ptr to ctx->Suites */
6627
    suites = WOLFSSL_SUITES(ssl);
6628
    /* Server list has only common suites from refining in server or client
6629
     * order. */
6630
    for (i = 0; !(*usingPSK) && i < suites->suiteSz; i += 2) {
6631
        ret = DoPreSharedKeys(ssl, input, helloSz - bindersLen,
6632
                suites->suites + i, usingPSK, &first);
6633
        if (ret != 0) {
6634
#ifdef HAVE_SESSION_TICKET
6635
#ifdef WOLFSSL_ASYNC_CRYPT
6636
            if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
6637
#endif
6638
                CleanupClientTickets((PreSharedKey*)ext->data);
6639
#endif
6640
            WOLFSSL_MSG_EX("DoPreSharedKeys: %d", ret);
6641
            return ret;
6642
        }
6643
    }
6644
#ifdef HAVE_SESSION_TICKET
6645
    CleanupClientTickets((PreSharedKey*)ext->data);
6646
#endif
6647
#else
6648
    ret = DoPreSharedKeys(ssl, input, helloSz - bindersLen, suite, usingPSK,
6649
        &first);
6650
    if (ret != 0) {
6651
        WOLFSSL_MSG_EX("DoPreSharedKeys: %d", ret);
6652
        return ret;
6653
    }
6654
#endif
6655
6656
    if (*usingPSK) {
6657
        /* While verifying the selected PSK, we updated the
6658
         * handshake hash up to the binder bytes in the PSK extensions.
6659
         * Continuing, we need the rest of the ClientHello hashed as well.
6660
         */
6661
        ret = HashRaw(ssl, input + helloSz - bindersLen, bindersLen);
6662
    }
6663
    else {
6664
        /* No suitable PSK found, Hash the complete ClientHello,
6665
         * as caller expect it after we return */
6666
        ret = HashInput(ssl, input,  (int)helloSz);
6667
    }
6668
    if (ret != 0)
6669
        return ret;
6670
6671
    if (*usingPSK != 0) {
6672
        word32 modes;
6673
#ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
6674
        int usingCertWithExternPsk = 0;
6675
        TLSX* certExt = NULL;
6676
        TLSX* pskExt = NULL;
6677
        PreSharedKey* chosenPsk = NULL;
6678
#endif
6679
    #ifdef WOLFSSL_EARLY_DATA
6680
        TLSX*  extEarlyData;
6681
    #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
6682
        int hasCertWithExternPsk = (TLSX_Find(ssl->extensions,
6683
                                    TLSX_CERT_WITH_EXTERN_PSK) != NULL);
6684
    #endif
6685
6686
        extEarlyData = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
6687
        if (extEarlyData != NULL) {
6688
            /* Check if accepting early data and first PSK.
6689
             * RFC 8773bis: early_data is not compatible with
6690
             * cert_with_extern_psk, so skip key derivation in that case. */
6691
            if (ssl->earlyData != no_early_data && first
6692
                && ssl->options.maxEarlyDataSz > 0
6693
    #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
6694
                && !hasCertWithExternPsk
6695
    #endif
6696
    #if defined(HAVE_SESSION_TICKET) && !defined(NO_SESSION_CACHE)
6697
                /* RFC 8446 section 8: evict the session from the cache.
6698
                 * Accept 0-RTT only when the eviction found the entry
6699
                 * (single-use). */
6700
                && wolfSSL_SSL_CTX_remove_session(ssl->ctx, ssl->session)
6701
                    == 1
6702
    #endif
6703
            ) {
6704
                extEarlyData->resp = 1;
6705
6706
                /* Derive early data decryption key. */
6707
                ret = DeriveTls13Keys(ssl, early_data_key, DECRYPT_SIDE_ONLY,
6708
                                                                             1);
6709
                if (ret != 0)
6710
                    return ret;
6711
                if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
6712
                    return ret;
6713
6714
                ssl->keys.encryptionOn = 1;
6715
                ssl->earlyData = process_early_data;
6716
            }
6717
            else
6718
                extEarlyData->resp = 0;
6719
        }
6720
    #endif
6721
6722
        /* Get the PSK key exchange modes the client wants to negotiate. */
6723
        ext = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
6724
        if (ext == NULL) {
6725
            WOLFSSL_ERROR_VERBOSE(MISSING_HANDSHAKE_DATA);
6726
            return MISSING_HANDSHAKE_DATA;
6727
        }
6728
        modes = ext->val;
6729
6730
    #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
6731
        certExt = TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK);
6732
        if (certExt != NULL) {
6733
            pskExt = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
6734
            if (pskExt != NULL)
6735
                chosenPsk = (PreSharedKey*)pskExt->data;
6736
            while (chosenPsk != NULL && !chosenPsk->chosen)
6737
                chosenPsk = chosenPsk->next;
6738
            if (chosenPsk == NULL || chosenPsk->resumption) {
6739
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
6740
                return PSK_KEY_ERROR;
6741
            }
6742
            if ((modes & (1 << PSK_DHE_KE)) == 0) {
6743
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
6744
                return PSK_KEY_ERROR;
6745
            }
6746
            usingCertWithExternPsk = 1;
6747
            ssl->options.certWithExternPsk = 1;
6748
            if (clSuites->hashSigAlgoSz == 0) {
6749
                WOLFSSL_ERROR_VERBOSE(MISSING_HANDSHAKE_DATA);
6750
                return MISSING_HANDSHAKE_DATA;
6751
            }
6752
            ret = PickHashSigAlgo(ssl, clSuites->hashSigAlgo,
6753
                                  clSuites->hashSigAlgoSz, 1);
6754
            if (ret != 0)
6755
                return ret;
6756
            ssl->options.sendVerify = SEND_CERT;
6757
            certExt->resp = 1;
6758
        #ifdef WOLFSSL_EARLY_DATA
6759
            /* RFC 8773bis: early_data is not compatible with
6760
             * cert_with_extern_psk.  TLSX_Parse already rejects the
6761
             * combination in the ClientHello, but clear the response flag
6762
             * here as a defense-in-depth measure. */
6763
            if (extEarlyData != NULL) {
6764
                WOLFSSL_MSG("Rejecting early data: "
6765
                            "cert_with_extern_psk is not 0-RTT compatible");
6766
                extEarlyData->resp = 0;
6767
                ssl->earlyData = no_early_data;
6768
            }
6769
        #endif
6770
        }
6771
        else {
6772
            ssl->options.certWithExternPsk = 0;
6773
        }
6774
    #endif
6775
6776
#ifndef HAVE_SUPPORTED_CURVES
6777
    #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
6778
        if (usingCertWithExternPsk) {
6779
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
6780
            return PSK_KEY_ERROR;
6781
        }
6782
    #endif
6783
#endif
6784
    #ifdef HAVE_SUPPORTED_CURVES
6785
        ext = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
6786
        /* Use (EC)DHE for forward-security if possible. */
6787
        if (((modes & (1 << PSK_DHE_KE)) != 0 && !ssl->options.noPskDheKe &&
6788
             ext != NULL)
6789
#ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
6790
             || usingCertWithExternPsk
6791
#endif
6792
        ) {
6793
            if (ext == NULL) {
6794
                WOLFSSL_ERROR_VERBOSE(EXT_MISSING);
6795
                return EXT_MISSING;
6796
            }
6797
            /* Resumption path uses previous session group. */
6798
#ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
6799
            if (!usingCertWithExternPsk)
6800
#endif
6801
                ssl->namedGroup = ssl->session->namedGroup;
6802
            *usingPSK = 2; /* generate new ephemeral key */
6803
        }
6804
        else if (ssl->options.onlyPskDheKe) {
6805
            return PSK_KEY_ERROR;
6806
        }
6807
        else
6808
    #endif
6809
        {
6810
            if ((modes & (1 << PSK_KE)) == 0) {
6811
                WOLFSSL_MSG("psk_ke mode does not allow key share");
6812
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
6813
                return PSK_KEY_ERROR;
6814
            }
6815
            ssl->options.noPskDheKe = 1;
6816
            ssl->arrays->preMasterSz = 0;
6817
6818
            *usingPSK = 1;
6819
        }
6820
    }
6821
    else {
6822
#ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
6823
        TLSX_Remove(&ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK, ssl->heap);
6824
        ssl->options.certWithExternPsk = 0;
6825
#endif
6826
#ifdef WOLFSSL_PSK_ID_PROTECTION
6827
    #ifndef NO_CERTS
6828
        if (ssl->buffers.certChainCnt != 0)
6829
            return 0;
6830
    #endif
6831
        WOLFSSL_ERROR_VERBOSE(BAD_BINDER);
6832
        return BAD_BINDER;
6833
#endif
6834
    }
6835
6836
    WOLFSSL_LEAVE("CheckPreSharedKeys", ret);
6837
6838
    return 0;
6839
}
6840
#endif /* HAVE_SESSION_TICKET || !NO_PSK */
6841
6842
#if defined(WOLFSSL_SEND_HRR_COOKIE)
6843
/* Check that the Cookie data's integrity.
6844
 *
6845
 * ssl       SSL/TLS object.
6846
 * cookie    The cookie data - hash and MAC.
6847
 * cookieSz  The length of the cookie data in bytes.
6848
 * returns Length of the hash on success, otherwise failure.
6849
 */
6850
int TlsCheckCookie(const WOLFSSL* ssl, const byte* cookie, word16 cookieSz)
6851
{
6852
    int  ret;
6853
    byte mac[WC_MAX_DIGEST_SIZE] = {0};
6854
    WC_DECLARE_VAR(cookieHmac, Hmac, 1, ssl->heap);
6855
    byte cookieType = 0;
6856
    byte macSz = 0;
6857
6858
    if (ssl->buffers.tls13CookieSecret.buffer == NULL ||
6859
            ssl->buffers.tls13CookieSecret.length == 0) {
6860
        WOLFSSL_MSG("Missing DTLS 1.3 cookie secret");
6861
        return COOKIE_ERROR;
6862
    }
6863
6864
#ifndef NO_SHA256
6865
    cookieType = WC_SHA256;
6866
    macSz = WC_SHA256_DIGEST_SIZE;
6867
#elif defined(WOLFSSL_SHA384)
6868
    cookieType = WC_SHA384;
6869
    macSz = WC_SHA384_DIGEST_SIZE;
6870
#elif defined(WOLFSSL_TLS13_SHA512)
6871
    cookieType = WC_SHA512;
6872
    macSz = WC_SHA512_DIGEST_SIZE;
6873
#elif defined(WOLFSSL_SM3)
6874
    cookieType = WC_SM3;
6875
    macSz = WC_SM3_DIGEST_SIZE;
6876
#else
6877
    #error "No digest to available to use with HMAC for cookies."
6878
#endif /* NO_SHA */
6879
6880
    if (cookieSz < ssl->specs.hash_size + macSz)
6881
        return HRR_COOKIE_ERROR;
6882
    cookieSz -= macSz;
6883
6884
    WC_ALLOC_VAR_EX(cookieHmac, Hmac, 1, ssl->heap, DYNAMIC_TYPE_HMAC,
6885
                    return MEMORY_E);
6886
6887
    ret = wc_HmacInit(cookieHmac, ssl->heap, ssl->devId);
6888
    if (ret == 0) {
6889
        ret = wc_HmacSetKey(cookieHmac, cookieType,
6890
                            ssl->buffers.tls13CookieSecret.buffer,
6891
                            ssl->buffers.tls13CookieSecret.length);
6892
    }
6893
    if (ret == 0)
6894
        ret = wc_HmacUpdate(cookieHmac, cookie, cookieSz);
6895
#ifdef WOLFSSL_DTLS13
6896
    /* Tie cookie to peer address */
6897
    if (ret == 0) {
6898
        /* peerLock not necessary. Still in handshake phase. */
6899
        if (ssl->options.dtls && ssl->buffers.dtlsCtx.peer.sz > 0) {
6900
            ret = wc_HmacUpdate(cookieHmac,
6901
                (byte*)ssl->buffers.dtlsCtx.peer.sa,
6902
                ssl->buffers.dtlsCtx.peer.sz);
6903
        }
6904
    }
6905
#endif
6906
    if (ret == 0)
6907
        ret = wc_HmacFinal(cookieHmac, mac);
6908
6909
    wc_HmacFree(cookieHmac);
6910
    WC_FREE_VAR_EX(cookieHmac, ssl->heap, DYNAMIC_TYPE_HMAC);
6911
    if (ret != 0)
6912
        return ret;
6913
6914
    if (ConstantCompare(cookie + cookieSz, mac, macSz) != 0) {
6915
        WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
6916
        return HRR_COOKIE_ERROR;
6917
    }
6918
    return cookieSz;
6919
}
6920
6921
/* Length of the KeyShare Extension */
6922
#define HRR_KEY_SHARE_SZ   (OPAQUE16_LEN + OPAQUE16_LEN + OPAQUE16_LEN)
6923
/* Length of the Supported Versions Extension */
6924
#define HRR_VERSIONS_SZ    (OPAQUE16_LEN + OPAQUE16_LEN + OPAQUE16_LEN)
6925
/* Length of the Cookie Extension excluding cookie data */
6926
#define HRR_COOKIE_HDR_SZ  (OPAQUE16_LEN + OPAQUE16_LEN + OPAQUE16_LEN)
6927
/* PV | Random | Session Id | CipherSuite | Compression | Ext Len */
6928
#define HRR_BODY_SZ        (VERSION_SZ + RAN_LEN + ENUM_LEN + ID_LEN + \
6929
                            SUITE_LEN + COMP_LEN + OPAQUE16_LEN)
6930
/* HH | PV | CipherSuite | Ext Len | Key Share | Supported Version | Cookie */
6931
#define MAX_HRR_SZ   (HRR_MAX_HS_HEADER_SZ   + \
6932
                        HRR_BODY_SZ         + \
6933
                          HRR_KEY_SHARE_SZ  + \
6934
                          HRR_VERSIONS_SZ   + \
6935
                          HRR_COOKIE_HDR_SZ)
6936
6937
6938
/* Restart the handshake hash from the cookie value.
6939
 *
6940
 * ssl     SSL/TLS object.
6941
 * cookie  Cookie data from client.
6942
 * returns 0 on success, otherwise failure.
6943
 */
6944
static int RestartHandshakeHashWithCookie(WOLFSSL* ssl, Cookie* cookie)
6945
{
6946
    byte   header[HANDSHAKE_HEADER_SZ] = {0};
6947
    byte   hrr[MAX_HRR_SZ] = {0};
6948
    int    hrrIdx;
6949
    word32 idx;
6950
    byte   hashSz;
6951
    byte*  cookieData;
6952
    word16 cookieDataSz;
6953
    word16 length;
6954
    int    keyShareExt = 0;
6955
    int    ret;
6956
    byte   sessIdSz;
6957
6958
    ret = TlsCheckCookie(ssl, cookie->data, cookie->len);
6959
    if (ret < 0)
6960
        return ret;
6961
    cookieDataSz = (word16)ret;
6962
    hashSz = cookie->data[0];
6963
    cookieData = cookie->data;
6964
    idx = OPAQUE8_LEN;
6965
6966
    /* Restart handshake hash with synthetic message hash. */
6967
    AddTls13HandShakeHeader(header, hashSz, 0, 0, message_hash, ssl);
6968
6969
    if ((ret = InitHandshakeHashes(ssl)) != 0)
6970
        return ret;
6971
    if ((ret = HashRaw(ssl, header, sizeof(header))) != 0)
6972
        return ret;
6973
#ifdef WOLFSSL_DEBUG_TLS
6974
    WOLFSSL_MSG("Restart Hash from Cookie");
6975
    WOLFSSL_BUFFER(cookieData + idx, hashSz);
6976
#endif
6977
    if ((ret = HashRaw(ssl, cookieData + idx, hashSz)) != 0)
6978
        return ret;
6979
6980
    /* Reconstruct the HelloRetryMessage for handshake hash. */
6981
    sessIdSz = ssl->session->sessionIDSz;
6982
#ifdef WOLFSSL_DTLS13
6983
    /* RFC 9147 Section 5.3: DTLS 1.3 must use empty legacy_session_id. */
6984
    if (ssl->options.dtls)
6985
        sessIdSz = 0;
6986
#endif
6987
    length = HRR_BODY_SZ - ID_LEN + sessIdSz +
6988
             HRR_COOKIE_HDR_SZ + cookie->len;
6989
    length += HRR_VERSIONS_SZ;
6990
    /* HashSz (1 byte) + Hash (HashSz bytes) + CipherSuite (2 bytes) */
6991
    if (cookieDataSz > OPAQUE8_LEN + hashSz + OPAQUE16_LEN) {
6992
        keyShareExt = 1;
6993
        length += HRR_KEY_SHARE_SZ;
6994
    }
6995
6996
    AddTls13HandShakeHeader(hrr, length, 0, 0, server_hello, ssl);
6997
6998
    idx += hashSz;
6999
    hrrIdx = HANDSHAKE_HEADER_SZ;
7000
7001
#ifdef WOLFSSL_DTLS13
7002
    if (ssl->options.dtls)
7003
        hrrIdx += DTLS_HANDSHAKE_EXTRA;
7004
#endif /* WOLFSSL_DTLS13 */
7005
7006
    /* The negotiated protocol version. */
7007
    hrr[hrrIdx++] = ssl->version.major;
7008
    hrr[hrrIdx++] = ssl->options.dtls ? DTLSv1_2_MINOR : TLSv1_2_MINOR;
7009
7010
    /* HelloRetryRequest message has fixed value for random. */
7011
    XMEMCPY(hrr + hrrIdx, helloRetryRequestRandom, RAN_LEN);
7012
    hrrIdx += RAN_LEN;
7013
7014
    hrr[hrrIdx++] = sessIdSz;
7015
    if (sessIdSz > 0) {
7016
        XMEMCPY(hrr + hrrIdx, ssl->session->sessionID, sessIdSz);
7017
        hrrIdx += sessIdSz;
7018
    }
7019
7020
    /* Restore the cipher suite from the cookie. */
7021
    ssl->options.hrrCipherSuite0 = cookieData[idx];
7022
    hrr[hrrIdx++] = cookieData[idx++];
7023
    ssl->options.hrrCipherSuite  = cookieData[idx];
7024
    hrr[hrrIdx++] = cookieData[idx++];
7025
7026
    /* Compression not supported in TLS v1.3. */
7027
    hrr[hrrIdx++] = 0;
7028
7029
    /* Extensions' length */
7030
    length -= HRR_BODY_SZ - ID_LEN + sessIdSz;
7031
    c16toa(length, hrr + hrrIdx);
7032
    hrrIdx += 2;
7033
7034
    /* Optional KeyShare Extension */
7035
    if (keyShareExt) {
7036
        c16toa(TLSX_KEY_SHARE, hrr + hrrIdx);
7037
        hrrIdx += 2;
7038
        c16toa(OPAQUE16_LEN, hrr + hrrIdx);
7039
        hrrIdx += 2;
7040
        /* Restore the HRR key share group from the cookie. */
7041
        ato16(cookieData + idx, &ssl->hrr_keyshare_group);
7042
        hrr[hrrIdx++] = cookieData[idx++];
7043
        hrr[hrrIdx++] = cookieData[idx++];
7044
    }
7045
    c16toa(TLSX_SUPPORTED_VERSIONS, hrr + hrrIdx);
7046
    hrrIdx += 2;
7047
    c16toa(OPAQUE16_LEN, hrr + hrrIdx);
7048
    hrrIdx += 2;
7049
    #ifdef WOLFSSL_TLS13_DRAFT
7050
        hrr[hrrIdx++] = TLS_DRAFT_MAJOR;
7051
        hrr[hrrIdx++] = TLS_DRAFT_MINOR;
7052
    #else
7053
        hrr[hrrIdx++] = ssl->version.major;
7054
        hrr[hrrIdx++] = ssl->version.minor;
7055
    #endif
7056
7057
    /* Mandatory Cookie Extension */
7058
    c16toa(TLSX_COOKIE, hrr + hrrIdx);
7059
    hrrIdx += 2;
7060
    c16toa(cookie->len + OPAQUE16_LEN, hrr + hrrIdx);
7061
    hrrIdx += 2;
7062
    c16toa(cookie->len, hrr + hrrIdx);
7063
    hrrIdx += 2;
7064
7065
#ifdef WOLFSSL_DEBUG_TLS
7066
    WOLFSSL_MSG("Reconstructed HelloRetryRequest");
7067
    WOLFSSL_BUFFER(hrr, hrrIdx);
7068
    WOLFSSL_MSG("Cookie");
7069
    WOLFSSL_BUFFER(cookieData, cookie->len);
7070
#endif
7071
7072
#ifdef WOLFSSL_DTLS13
7073
    if (ssl->options.dtls) {
7074
        ret = Dtls13HashHandshake(ssl, hrr, (word16)hrrIdx);
7075
    }
7076
    else
7077
#endif /* WOLFSSL_DTLS13 */
7078
        {
7079
            ret = HashRaw(ssl, hrr, hrrIdx);
7080
        }
7081
7082
    if (ret != 0)
7083
        return ret;
7084
7085
    return HashRaw(ssl, cookieData, cookie->len);
7086
}
7087
#endif
7088
7089
/* Do SupportedVersion extension for TLS v1.3+ otherwise it is not.
7090
 *
7091
 * ssl       The SSL/TLS object.
7092
 * input     The message buffer.
7093
 * i         The index into the message buffer of ClientHello.
7094
 * helloSz   The length of the current handshake message.
7095
 * returns 0 on success and otherwise failure.
7096
 */
7097
static int DoTls13SupportedVersions(WOLFSSL* ssl, const byte* input, word32 i,
7098
                                    word32 helloSz, int* wantDowngrade)
7099
{
7100
    int    ret;
7101
    byte   b;
7102
    word16 suiteSz;
7103
    word16 totalExtSz;
7104
    int    foundVersion = 0;
7105
7106
    /* Client random */
7107
    i += RAN_LEN;
7108
    /* Session id - not used in TLS v1.3 */
7109
    b = input[i++];
7110
    if (i + b > helloSz) {
7111
        return BUFFER_ERROR;
7112
    }
7113
    i += b;
7114
#ifdef WOLFSSL_DTLS13
7115
    if (ssl->options.dtls) {
7116
        /* legacy_cookie - not used in DTLS v1.3 */
7117
        b = input[i++];
7118
        if (i + b > helloSz) {
7119
            return BUFFER_ERROR;
7120
        }
7121
        i += b;
7122
    }
7123
#endif /* WOLFSSL_DTLS13 */
7124
    /* Cipher suites */
7125
    if (i + OPAQUE16_LEN > helloSz)
7126
        return BUFFER_ERROR;
7127
    ato16(input + i, &suiteSz);
7128
    i += OPAQUE16_LEN;
7129
    if (i + suiteSz + 1 > helloSz)
7130
        return BUFFER_ERROR;
7131
    i += suiteSz;
7132
    /* Compression */
7133
    b = input[i++];
7134
    if (i + b > helloSz)
7135
        return BUFFER_ERROR;
7136
    i += b;
7137
7138
    /* TLS 1.3 must have extensions */
7139
    if (i < helloSz) {
7140
        if (i + OPAQUE16_LEN > helloSz)
7141
            return BUFFER_ERROR;
7142
        ato16(&input[i], &totalExtSz);
7143
        i += OPAQUE16_LEN;
7144
        if (totalExtSz != helloSz - i)
7145
            return BUFFER_ERROR;
7146
7147
        /* Need to negotiate version first. */
7148
        if ((ret = TLSX_ParseVersion(ssl, input + i, totalExtSz, client_hello,
7149
                                                              &foundVersion))) {
7150
            return ret;
7151
        }
7152
    }
7153
    *wantDowngrade = !foundVersion || !IsAtLeastTLSv1_3(ssl->version);
7154
7155
    return 0;
7156
}
7157
7158
#ifdef HAVE_ECH
7159
/* Calculate and write the 8 ECH confirmation bytes.
7160
 * Output into confirmation field on HRR and into ServerRandom on ServerHello.
7161
 *
7162
 * ssl          SSL/TLS object.
7163
 * label        Ascii string describing ECH acceptance or rejection.
7164
 * labelSz      Length of label excluding NULL character.
7165
 * output       The buffer to calculate/write confirmation from/to.
7166
 * acceptOffset Where the 8 ECH confirmation bytes should be placed.
7167
 * helloSz      Size of hello message.
7168
 * msgType      Type of message being written.
7169
 * returns 0 on success and otherwise failure.
7170
 */
7171
static int EchWriteAcceptance(WOLFSSL* ssl, byte* label, word16 labelSz,
7172
    byte* output, int acceptOffset, int helloSz, byte msgType)
7173
{
7174
    int ret = 0;
7175
    int headerSz;
7176
    HS_Hashes* tmpHashes;
7177
7178
#ifdef WOLFSSL_DTLS13
7179
    headerSz = ssl->options.dtls ? DTLS13_HANDSHAKE_HEADER_SZ :
7180
                                   HANDSHAKE_HEADER_SZ;
7181
#else
7182
    headerSz = HANDSHAKE_HEADER_SZ;
7183
#endif
7184
7185
    ret = EchCalcAcceptance(ssl, label, labelSz, output, acceptOffset,
7186
            helloSz - headerSz, msgType == hello_retry_request,
7187
            output + acceptOffset);
7188
7189
    if (ret == 0) {
7190
        tmpHashes = ssl->hsHashes;
7191
        ssl->hsHashes = ssl->hsHashesEch;
7192
7193
        /* after HRR, hsHashesEch must contain:
7194
         * message_hash(ClientHelloInner1) || HRR (actual, not zeros) */
7195
        if (msgType == hello_retry_request) {
7196
            ret = HashRaw(ssl, output, helloSz);
7197
        }
7198
        /* normal TLS code will calculate transcript of ServerHello */
7199
        else {
7200
            ssl->hsHashes = tmpHashes;
7201
            FreeHandshakeHashes(ssl);
7202
            tmpHashes = ssl->hsHashesEch;
7203
            ssl->hsHashesEch = NULL;
7204
        }
7205
7206
        ssl->hsHashes = tmpHashes;
7207
    }
7208
7209
    return ret;
7210
}
7211
#endif
7212
7213
/* Handle a ClientHello handshake message.
7214
 * If the protocol version in the message is not TLS v1.3 or higher, use
7215
 * DoClientHello()
7216
 * Only a server will receive this message.
7217
 *
7218
 * ssl       The SSL/TLS object.
7219
 * input     The message buffer.
7220
 * inOutIdx  On entry, the index into the message buffer of ClientHello.
7221
 *           On exit, the index of byte after the ClientHello message and
7222
 *           padding.
7223
 * helloSz   The length of the current handshake message.
7224
 * returns 0 on success and otherwise failure.
7225
 */
7226
7227
typedef struct Dch13Args {
7228
    ProtocolVersion pv;
7229
    word32          idx;
7230
    word32          begin;
7231
    int             usingPSK;
7232
} Dch13Args;
7233
7234
static void FreeDch13Args(WOLFSSL* ssl, void* pArgs)
7235
35.2k
{
7236
    /* openssl compat builds hang on to the client suites until WOLFSSL object
7237
     * is destroyed */
7238
#ifndef OPENSSL_EXTRA
7239
    if (ssl->clSuites) {
7240
        XFREE(ssl->clSuites, ssl->heap, DYNAMIC_TYPE_SUITES);
7241
        ssl->clSuites = NULL;
7242
    }
7243
#endif
7244
35.2k
    (void)ssl;
7245
35.2k
    (void)pArgs;
7246
7247
35.2k
}
7248
7249
int DoTls13ClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
7250
                       word32 helloSz)
7251
0
{
7252
0
    int ret;
7253
#ifdef WOLFSSL_ASYNC_CRYPT
7254
    Dch13Args* args = NULL;
7255
    WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
7256
#else
7257
0
    Dch13Args  args[1];
7258
0
#endif
7259
#if defined(HAVE_ECH)
7260
    TLSX* echX = NULL;
7261
#endif
7262
7263
0
    WOLFSSL_START(WC_FUNC_CLIENT_HELLO_DO);
7264
0
    WOLFSSL_ENTER("DoTls13ClientHello");
7265
7266
#ifdef WOLFSSL_ASYNC_CRYPT
7267
    if (ssl->async == NULL) {
7268
        ssl->async = (struct WOLFSSL_ASYNC*)
7269
                XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
7270
                        DYNAMIC_TYPE_ASYNC);
7271
        if (ssl->async == NULL)
7272
            ERROR_OUT(MEMORY_E, exit_dch);
7273
    }
7274
    args = (Dch13Args*)ssl->async->args;
7275
7276
    ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
7277
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
7278
        /* Check for error */
7279
        if (ret < 0) {
7280
            goto exit_dch;
7281
        }
7282
    }
7283
    else
7284
#endif
7285
0
    {
7286
        /* Reset state */
7287
0
        ret = WC_NO_ERR_TRACE(VERSION_ERROR);
7288
0
        ssl->options.asyncState = TLS_ASYNC_BEGIN;
7289
0
        XMEMSET(args, 0, sizeof(Dch13Args));
7290
    #ifdef WOLFSSL_ASYNC_CRYPT
7291
        ssl->async->freeArgs = FreeDch13Args;
7292
    #endif
7293
0
    }
7294
7295
0
    switch (ssl->options.asyncState) {
7296
0
    case TLS_ASYNC_BEGIN:
7297
0
    {
7298
0
    byte b;
7299
0
    byte sessIdSz;
7300
0
    int wantDowngrade = 0;
7301
0
    word16 totalExtSz = 0;
7302
7303
#ifdef WOLFSSL_CALLBACKS
7304
    if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
7305
    if (ssl->toInfoOn) AddLateName("ClientHello", &ssl->timeoutInfo);
7306
#endif
7307
7308
    /* do not change state in the SSL object before the next region of code
7309
     * to be able to statelessly compute a DTLS cookie */
7310
#if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
7311
    /* Update the ssl->options.dtlsStateful setting `if` statement in
7312
     * wolfSSL_accept_TLSv13 when changing this one. */
7313
    if (IsDtlsNotSctpMode(ssl) && ssl->options.sendCookie &&
7314
            !ssl->options.dtlsStateful) {
7315
        DtlsSetSeqNumForReply(ssl);
7316
        ret = DoClientHelloStateless(ssl, input + *inOutIdx, helloSz, 0, NULL);
7317
        if (ret != 0 || !ssl->options.dtlsStateful) {
7318
            *inOutIdx += helloSz;
7319
            goto exit_dch;
7320
        }
7321
        if (ssl->chGoodCb != NULL) {
7322
            int cbret = ssl->chGoodCb(ssl, ssl->chGoodCtx);
7323
            if (cbret < 0) {
7324
                ssl->error = cbret;
7325
                WOLFSSL_MSG("ClientHello Good Cb don't continue error");
7326
                return WOLFSSL_FATAL_ERROR;
7327
            }
7328
        }
7329
    }
7330
    ssl->options.dtlsStateful = 1;
7331
#endif /* WOLFSSL_DTLS */
7332
7333
0
    args->idx = *inOutIdx;
7334
0
    args->begin = args->idx;
7335
7336
    /* protocol version, random and session id length check */
7337
0
    if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz) {
7338
0
        ERROR_OUT(BUFFER_ERROR, exit_dch);
7339
0
    }
7340
7341
    /* Protocol version */
7342
0
    XMEMCPY(&args->pv, input + args->idx, OPAQUE16_LEN);
7343
0
    ssl->chVersion = args->pv;   /* store */
7344
0
    args->idx += OPAQUE16_LEN;
7345
7346
7347
    /* this check pass for DTLS Major (0xff) */
7348
0
    if (args->pv.major < SSLv3_MAJOR) {
7349
0
        WOLFSSL_MSG("Legacy version field contains unsupported value");
7350
0
        ERROR_OUT(VERSION_ERROR, exit_dch);
7351
0
    }
7352
7353
#ifdef WOLFSSL_DTLS13
7354
    if (ssl->options.dtls &&
7355
        args->pv.major == DTLS_MAJOR && args->pv.minor > DTLSv1_2_MINOR) {
7356
        wantDowngrade = 1;
7357
        ssl->version.minor = args->pv.minor;
7358
    }
7359
#endif /* WOLFSSL_DTLS13 */
7360
7361
0
    if (!ssl->options.dtls) {
7362
0
#ifndef WOLFSSL_ALLOW_BAD_TLS_LEGACY_VERSION
7363
        /* Check for TLS 1.3 version (0x0304) in legacy version field. RFC 8446
7364
         * Section 4.2.1 allows this action:
7365
         *
7366
         * "Servers MAY abort the handshake upon receiving a ClientHello with
7367
         * legacy_version 0x0304 or later."
7368
         *
7369
         * Note that if WOLFSSL_ALLOW_BAD_TLS_LEGACY_VERSION is defined then the
7370
         * semantics of RFC 5246 Appendix E will be followed. A ServerHello with
7371
         * version 1.2 will be sent. The same is true if TLS 1.3 is not enabled.
7372
         */
7373
0
        if (args->pv.major == SSLv3_MAJOR && args->pv.minor >= TLSv1_3_MINOR) {
7374
0
            WOLFSSL_MSG("Legacy version field is TLS 1.3 or later. Aborting.");
7375
0
            ERROR_OUT(VERSION_ERROR, exit_dch);
7376
0
        }
7377
0
#endif /* WOLFSSL_ALLOW_BAD_TLS_LEGACY_VERSION */
7378
7379
        /* Legacy protocol version cannot negotiate TLS 1.3 or higher. */
7380
0
        if (args->pv.major > SSLv3_MAJOR || (args->pv.major == SSLv3_MAJOR &&
7381
0
                                             args->pv.minor >= TLSv1_3_MINOR)) {
7382
0
            args->pv.major = SSLv3_MAJOR;
7383
0
            args->pv.minor = TLSv1_2_MINOR;
7384
0
            wantDowngrade = 1;
7385
0
            ssl->version.minor = args->pv.minor;
7386
0
        }
7387
        /* Legacy version must be [ SSLv3_MAJOR, TLSv1_2_MINOR ] for TLS v1.3 */
7388
0
        else if (args->pv.major == SSLv3_MAJOR &&
7389
0
                 args->pv.minor < TLSv1_2_MINOR) {
7390
0
            wantDowngrade = 1;
7391
0
            ssl->version.minor = args->pv.minor;
7392
0
        }
7393
0
    }
7394
7395
0
    if (!wantDowngrade) {
7396
0
        ret = DoTls13SupportedVersions(ssl, input + args->begin,
7397
0
            args->idx - args->begin, helloSz, &wantDowngrade);
7398
0
        if (ret < 0)
7399
0
            goto exit_dch;
7400
0
    }
7401
7402
0
    if (wantDowngrade) {
7403
0
#ifndef WOLFSSL_NO_TLS12
7404
0
        byte realMinor;
7405
0
#endif
7406
#if defined(HAVE_ECH)
7407
        if (ssl->options.echProcessingInner) {
7408
            WOLFSSL_MSG("ECH: inner client hello does not support version "
7409
                        "less than TLS v1.3");
7410
            ERROR_OUT(INVALID_PARAMETER, exit_dch);
7411
        }
7412
#endif
7413
0
#ifndef WOLFSSL_NO_TLS12
7414
0
        if (!ssl->options.downgrade) {
7415
0
            WOLFSSL_MSG("Client trying to connect with lesser version than "
7416
0
                        "TLS v1.3");
7417
0
            ERROR_OUT(VERSION_ERROR, exit_dch);
7418
0
        }
7419
7420
0
        if ((!ssl->options.dtls
7421
0
                 && args->pv.minor < ssl->options.minDowngrade) ||
7422
0
            (ssl->options.dtls && args->pv.minor > ssl->options.minDowngrade)) {
7423
0
            WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
7424
0
            ERROR_OUT(VERSION_ERROR, exit_dch);
7425
0
        }
7426
7427
0
        realMinor = ssl->version.minor;
7428
0
        ssl->version.minor = args->pv.minor;
7429
0
        ret = HashInput(ssl, input + args->begin, (int)helloSz);
7430
0
        ssl->version.minor = realMinor;
7431
0
        if (ret == 0) {
7432
0
            ret = DoClientHello(ssl, input, inOutIdx, helloSz);
7433
0
        }
7434
0
        goto exit_dch;
7435
#else
7436
        WOLFSSL_MSG("Client trying to connect with lesser version than "
7437
                    "TLS v1.3");
7438
        ERROR_OUT(VERSION_ERROR, exit_dch);
7439
#endif
7440
0
    }
7441
7442
    /* From here on we are a TLS 1.3 ClientHello. */
7443
7444
    /* Client random */
7445
0
    XMEMCPY(ssl->arrays->clientRandom, input + args->idx, RAN_LEN);
7446
0
    args->idx += RAN_LEN;
7447
7448
#ifdef WOLFSSL_DEBUG_TLS
7449
    WOLFSSL_MSG("client random");
7450
    WOLFSSL_BUFFER(ssl->arrays->clientRandom, RAN_LEN);
7451
#endif
7452
7453
0
    sessIdSz = input[args->idx++];
7454
0
    if (sessIdSz > ID_LEN)
7455
0
    {
7456
0
        ERROR_OUT(INVALID_PARAMETER, exit_dch);
7457
0
    }
7458
7459
0
    if (sessIdSz + args->idx > helloSz)
7460
0
        ERROR_OUT(BUFFER_ERROR, exit_dch);
7461
7462
#ifdef WOLFSSL_DTLS13
7463
    /* RFC 9147 Section 5.3: DTLS 1.3 ServerHello must have empty
7464
     * legacy_session_id_echo. Don't store the client's value so it
7465
     * won't be echoed in SendTls13ServerHello. */
7466
    if (ssl->options.dtls) {
7467
        ssl->session->sessionIDSz = 0;
7468
    }
7469
    else
7470
#endif
7471
0
    {
7472
0
        ssl->session->sessionIDSz = sessIdSz;
7473
0
        if (sessIdSz > 0)
7474
0
            XMEMCPY(ssl->session->sessionID, input + args->idx, sessIdSz);
7475
0
    }
7476
0
    args->idx += sessIdSz;
7477
7478
#ifdef WOLFSSL_TLS13_MIDDLEBOX_COMPAT
7479
    /* RFC 8446 Appendix D.4: server MUST only send CCS if the client's
7480
     * ClientHello contains a non-empty legacy_session_id. */
7481
    if (sessIdSz == 0) {
7482
        ssl->options.tls13MiddleBoxCompat = 0;
7483
    }
7484
#endif
7485
7486
#ifdef WOLFSSL_DTLS13
7487
    /* legacy_cookie */
7488
    if (ssl->options.dtls) {
7489
        /* https://www.rfc-editor.org/rfc/rfc9147.html#section-5.3 */
7490
        byte cookieLen = input[args->idx++];
7491
        if (cookieLen != 0) {
7492
            ERROR_OUT(INVALID_PARAMETER, exit_dch);
7493
        }
7494
    }
7495
#endif /* WOLFSSL_DTLS13 */
7496
7497
0
    XFREE(ssl->clSuites, ssl->heap, DYNAMIC_TYPE_SUITES);
7498
0
    ssl->clSuites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
7499
0
        DYNAMIC_TYPE_SUITES);
7500
0
    if (ssl->clSuites == NULL) {
7501
0
        ERROR_OUT(MEMORY_E, exit_dch);
7502
0
    }
7503
7504
    /* Cipher suites */
7505
0
    if ((args->idx - args->begin) + OPAQUE16_LEN > helloSz)
7506
0
        ERROR_OUT(BUFFER_ERROR, exit_dch);
7507
0
    ato16(&input[args->idx], &ssl->clSuites->suiteSz);
7508
0
    args->idx += OPAQUE16_LEN;
7509
0
    if ((ssl->clSuites->suiteSz % 2) != 0) {
7510
0
        ERROR_OUT(INVALID_PARAMETER, exit_dch);
7511
0
    }
7512
    /* suites and compression length check */
7513
0
    if ((args->idx - args->begin) + ssl->clSuites->suiteSz + OPAQUE8_LEN >
7514
0
            helloSz) {
7515
0
        ERROR_OUT(BUFFER_ERROR, exit_dch);
7516
0
    }
7517
0
    if (ssl->clSuites->suiteSz > WOLFSSL_MAX_SUITE_SZ)
7518
0
        ERROR_OUT(BUFFER_ERROR, exit_dch);
7519
0
    XMEMCPY(ssl->clSuites->suites, input + args->idx, ssl->clSuites->suiteSz);
7520
0
    args->idx += ssl->clSuites->suiteSz;
7521
0
    ssl->clSuites->hashSigAlgoSz = 0;
7522
7523
    /* Compression */
7524
0
    b = input[args->idx++];
7525
0
    if ((args->idx - args->begin) + b > helloSz)
7526
0
        ERROR_OUT(BUFFER_ERROR, exit_dch);
7527
0
    if (b != COMP_LEN) {
7528
0
        WOLFSSL_MSG("Must be one compression type in list");
7529
0
        ERROR_OUT(INVALID_PARAMETER, exit_dch);
7530
0
    }
7531
0
    b = input[args->idx++];
7532
0
    if (b != NO_COMPRESSION) {
7533
0
        WOLFSSL_MSG("Must be no compression type in list");
7534
0
        ERROR_OUT(INVALID_PARAMETER, exit_dch);
7535
0
    }
7536
7537
    /* Extensions */
7538
0
    if ((args->idx - args->begin) == helloSz)
7539
0
        ERROR_OUT(BUFFER_ERROR, exit_dch);
7540
0
    if ((args->idx - args->begin) + OPAQUE16_LEN > helloSz)
7541
0
        ERROR_OUT(BUFFER_ERROR, exit_dch);
7542
7543
0
    ato16(&input[args->idx], &totalExtSz);
7544
0
    args->idx += OPAQUE16_LEN;
7545
0
    if ((args->idx - args->begin) + totalExtSz > helloSz)
7546
0
        ERROR_OUT(BUFFER_ERROR, exit_dch);
7547
7548
    /* Auto populate extensions supported unless user defined. */
7549
0
    if ((ret = TLSX_PopulateExtensions(ssl, 1)) != 0)
7550
0
        goto exit_dch;
7551
7552
#if defined(HAVE_ECH)
7553
    if (ssl->ctx->echConfigs != NULL && !ssl->options.disableECH) {
7554
        /* save the start of the buffer so we can use it when parsing ech */
7555
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
7556
7557
        if (echX == NULL)
7558
            ERROR_OUT(WOLFSSL_FATAL_ERROR, exit_dch);
7559
7560
        ((WOLFSSL_ECH*)echX->data)->aad = input + HANDSHAKE_HEADER_SZ;
7561
        ((WOLFSSL_ECH*)echX->data)->aadLen = helloSz;
7562
    }
7563
#endif
7564
7565
    /* Parse extensions */
7566
0
    if ((ret = TLSX_Parse(ssl, input + args->idx, totalExtSz, client_hello,
7567
0
                                                            ssl->clSuites))) {
7568
0
        goto exit_dch;
7569
0
    }
7570
7571
#if defined(HAVE_ECH)
7572
    if (!ssl->options.echProcessingInner && echX != NULL &&
7573
            ((WOLFSSL_ECH*)echX->data)->state == ECH_WRITE_NONE) {
7574
        if (((WOLFSSL_ECH*)echX->data)->innerClientHello != NULL) {
7575
            /* Client sent real ECH and inner hello was decrypted, jump to
7576
             * exit so the caller can re-invoke with the inner hello */
7577
            goto exit_dch;
7578
        }
7579
        else {
7580
            /* If ECH was accepted in ClientHello1 then ClientHello2 MUST
7581
             * contain an ECH extension */
7582
            if (ssl->options.serverState ==
7583
                    SERVER_HELLO_RETRY_REQUEST_COMPLETE &&
7584
                    ssl->options.echAccepted) {
7585
                WOLFSSL_MSG("Client did not send an EncryptedClientHello "
7586
                            "extension");
7587
                ERROR_OUT(INCOMPLETE_DATA, exit_dch);
7588
            }
7589
            /* Server has ECH but client did not send ECH. Clear the
7590
             * response flag so the empty ECH extension is not written
7591
             * in EncryptedExtensions. */
7592
            echX->resp = 0;
7593
        }
7594
    }
7595
#endif
7596
7597
0
#ifdef HAVE_SNI
7598
0
        if ((ret = SNI_Callback(ssl)) != 0)
7599
0
            goto exit_dch;
7600
0
        ssl->options.side = WOLFSSL_SERVER_END;
7601
0
#endif
7602
7603
0
    args->idx += totalExtSz;
7604
0
    ssl->options.haveSessionId = 1;
7605
0
    ssl->options.sendVerify = SEND_CERT;
7606
7607
#if defined(WOLFSSL_SEND_HRR_COOKIE)
7608
    ssl->options.cookieGood = 0;
7609
    if (ssl->options.sendCookie &&
7610
            (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE
7611
#ifdef WOLFSSL_DTLS13
7612
                    /* Always check for a valid cookie since we may have already
7613
                     * sent a HRR but we reset the state. */
7614
                    || ssl->options.dtls
7615
#endif
7616
                    )) {
7617
        TLSX* ext = TLSX_Find(ssl->extensions, TLSX_COOKIE);
7618
7619
        if (ext != NULL) {
7620
            /* Ensure the cookie came from client and isn't the one in the
7621
            * response - HelloRetryRequest.
7622
            */
7623
            if (ext->resp == 0) {
7624
                ret = RestartHandshakeHashWithCookie(ssl, (Cookie*)ext->data);
7625
                if (ret != 0)
7626
                    goto exit_dch;
7627
                /* Don't change state here as we may want to enter
7628
                 * DoTls13ClientHello again. */
7629
                ssl->options.cookieGood = 1;
7630
            }
7631
            else {
7632
                ERROR_OUT(HRR_COOKIE_ERROR, exit_dch);
7633
            }
7634
        }
7635
        else {
7636
#if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_DTLS13_NO_HRR_ON_RESUME)
7637
            /* Don't error out as we may be resuming. We confirm this later. */
7638
            if (!ssl->options.dtls)
7639
#endif
7640
                ERROR_OUT(HRR_COOKIE_ERROR, exit_dch);
7641
        }
7642
    }
7643
#endif
7644
7645
0
#ifdef HAVE_SUPPORTED_CURVES
7646
0
    if (ssl->hrr_keyshare_group != 0) {
7647
        /*
7648
         * https://datatracker.ietf.org/doc/html/rfc8446#section-4.2.8
7649
         *   when sending the new ClientHello, the client MUST
7650
         *   replace the original "key_share" extension with one containing only
7651
         *   a new KeyShareEntry for the group indicated in the selected_group
7652
         *   field of the triggering HelloRetryRequest.
7653
         */
7654
0
        TLSX* extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
7655
0
        if (extension != NULL) {
7656
0
            KeyShareEntry* kse = (KeyShareEntry*)extension->data;
7657
            /* Exactly one KeyShareEntry with the HRR group must be present. */
7658
0
            if (kse == NULL || kse->next != NULL ||
7659
0
                                        kse->group != ssl->hrr_keyshare_group) {
7660
0
                ERROR_OUT(BAD_KEY_SHARE_DATA, exit_dch);
7661
0
            }
7662
0
        }
7663
0
        else
7664
0
            ERROR_OUT(BAD_KEY_SHARE_DATA, exit_dch);
7665
0
    }
7666
0
#endif
7667
7668
#if defined(HAVE_ECH)
7669
    /* hash clientHelloInner to hsHashesEch */
7670
    if (echX != NULL && ssl->ctx->echConfigs != NULL &&
7671
            !ssl->options.disableECH &&
7672
            ((WOLFSSL_ECH*)echX->data)->innerClientHello != NULL) {
7673
        ret = EchHashHelloInner(ssl, (WOLFSSL_ECH*)echX->data);
7674
        if (ret != 0)
7675
            goto exit_dch;
7676
        ((WOLFSSL_ECH*)echX->data)->innerCount = 1;
7677
    }
7678
#endif
7679
7680
0
#if (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)) && \
7681
0
                                                    defined(HAVE_TLS_EXTENSIONS)
7682
0
    ret = CheckPreSharedKeys(ssl, input + args->begin, helloSz, ssl->clSuites,
7683
0
        &args->usingPSK);
7684
0
    if (ret != 0)
7685
0
        goto exit_dch;
7686
#else
7687
    if ((ret = HashInput(ssl, input + args->begin, (int)helloSz)) != 0)
7688
        goto exit_dch;
7689
#endif
7690
7691
0
#if (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)) && \
7692
0
                                                    defined(HAVE_TLS_EXTENSIONS)
7693
0
    if (!args->usingPSK
7694
#ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
7695
        || ssl->options.certWithExternPsk
7696
#endif
7697
0
    )
7698
0
#endif
7699
0
    {
7700
0
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
7701
        /* Not using PSK so don't require no KE. */
7702
0
        ssl->options.noPskDheKe = 0;
7703
0
#endif
7704
7705
0
#ifndef NO_CERTS
7706
0
        if (TLSX_Find(ssl->extensions, TLSX_KEY_SHARE) == NULL) {
7707
0
            WOLFSSL_MSG("Client did not send a KeyShare extension");
7708
0
            ERROR_OUT(INCOMPLETE_DATA, exit_dch);
7709
0
        }
7710
        /* Can't check ssl->extensions here as SigAlgs are unconditionally
7711
           set by TLSX_PopulateExtensions */
7712
0
        if (ssl->clSuites->hashSigAlgoSz == 0) {
7713
0
            WOLFSSL_MSG("Client did not send a SignatureAlgorithms extension");
7714
0
            ERROR_OUT(INCOMPLETE_DATA, exit_dch);
7715
0
        }
7716
#else
7717
        ERROR_OUT(INVALID_PARAMETER, exit_dch);
7718
#endif
7719
0
    }
7720
7721
#ifdef HAVE_ALPN
7722
    /* With PSK and all other things validated, it's time to
7723
     * select the ALPN protocol, if so requested */
7724
    if ((ret = ALPN_Select(ssl)) != 0)
7725
        goto exit_dch;
7726
#endif
7727
0
#if defined(HAVE_SESSION_TICKET) && (defined(HAVE_SNI) || defined(HAVE_ALPN))
7728
0
    if ((ret = VerifyTicketBinding(ssl)) != 0)
7729
0
        goto exit_dch;
7730
0
#endif
7731
0
    } /* case TLS_ASYNC_BEGIN */
7732
0
    FALL_THROUGH;
7733
7734
0
    case TLS_ASYNC_BUILD:
7735
    /* Advance state and proceed */
7736
0
    ssl->options.asyncState = TLS_ASYNC_DO;
7737
0
    FALL_THROUGH;
7738
7739
0
    case TLS_ASYNC_DO:
7740
0
    {
7741
0
#ifdef WOLFSSL_CERT_SETUP_CB
7742
0
    if ((ret = CertSetupCbWrapper(ssl)) != 0)
7743
0
        goto exit_dch;
7744
0
#endif
7745
0
#ifndef NO_CERTS
7746
0
    if (!args->usingPSK) {
7747
0
        if ((ret = MatchSuite(ssl, ssl->clSuites)) < 0) {
7748
        #ifdef WOLFSSL_ASYNC_CRYPT
7749
            if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
7750
        #endif
7751
0
                WOLFSSL_MSG("Unsupported cipher suite, ClientHello 1.3");
7752
0
            goto exit_dch;
7753
0
        }
7754
0
    }
7755
0
#endif
7756
0
#ifdef HAVE_SUPPORTED_CURVES
7757
0
    if (args->usingPSK == 2) {
7758
        /* Pick key share and Generate a new key if not present. */
7759
0
        int doHelloRetry = 0;
7760
0
        ret = TLSX_KeyShare_Establish(ssl, &doHelloRetry);
7761
0
        if (doHelloRetry) {
7762
            /* Make sure we don't send HRR twice */
7763
0
            if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE)
7764
0
                ERROR_OUT(INVALID_PARAMETER, exit_dch);
7765
0
            ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
7766
0
            if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
7767
0
                ret = 0; /* for hello_retry return 0 */
7768
0
        }
7769
0
        if (ret != 0)
7770
0
            goto exit_dch;
7771
0
    }
7772
0
#endif
7773
7774
    /* Verify the cipher suite is the same as what was chosen in HRR.
7775
     * got_client_hello == 2 covers the stateful path.
7776
     * cookieGood covers the stateless DTLS path. */
7777
0
    if ((ssl->msgsReceived.got_client_hello == 2
7778
#ifdef WOLFSSL_SEND_HRR_COOKIE
7779
            || ssl->options.cookieGood
7780
#endif
7781
0
        ) &&
7782
0
            (ssl->options.cipherSuite0 != ssl->options.hrrCipherSuite0 ||
7783
0
             ssl->options.cipherSuite  != ssl->options.hrrCipherSuite)) {
7784
0
        WOLFSSL_MSG("Cipher suite in second ClientHello does not match "
7785
0
                    "HelloRetryRequest");
7786
0
        ERROR_OUT(INVALID_PARAMETER, exit_dch);
7787
0
    }
7788
7789
    /* Advance state and proceed */
7790
0
    ssl->options.asyncState = TLS_ASYNC_VERIFY;
7791
0
    } /* case TLS_ASYNC_BUILD || TLS_ASYNC_DO */
7792
0
    FALL_THROUGH;
7793
7794
0
    case TLS_ASYNC_VERIFY:
7795
0
    {
7796
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SUPPORTED_CURVES)
7797
    /* Check if the KeyShare calculations from the previous state are complete.
7798
     * wolfSSL_AsyncPop advances ssl->options.asyncState so we may end up here
7799
     * with a pending calculation. */
7800
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
7801
    if (extension != NULL && extension->resp == 1) {
7802
        KeyShareEntry* serverKSE = (KeyShareEntry*)extension->data;
7803
        if (serverKSE != NULL &&
7804
            serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
7805
    #if defined(WOLFSSL_HAVE_MLKEM)
7806
            if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(serverKSE->group)) {
7807
                ret = TLSX_KeyShare_HandlePqcHybridKeyServer(ssl, serverKSE,
7808
                        serverKSE->ke, serverKSE->keLen);
7809
            }
7810
            else
7811
    #endif
7812
            {
7813
                ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
7814
            }
7815
            if (ret != 0)
7816
                goto exit_dch;
7817
        }
7818
    }
7819
#endif
7820
    /* Advance state and proceed */
7821
0
    ssl->options.asyncState = TLS_ASYNC_FINALIZE;
7822
0
    }
7823
0
    FALL_THROUGH;
7824
7825
0
    case TLS_ASYNC_FINALIZE:
7826
0
    {
7827
0
    *inOutIdx = args->idx;
7828
0
    ssl->options.clientState = CLIENT_HELLO_COMPLETE;
7829
0
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
7830
0
    ssl->options.pskNegotiated = (args->usingPSK != 0);
7831
0
#endif
7832
7833
0
    if (!args->usingPSK) {
7834
0
#ifndef NO_CERTS
7835
        /* Check that the negotiated ciphersuite matches protocol version. */
7836
    #ifdef HAVE_NULL_CIPHER
7837
        if (ssl->options.cipherSuite0 == ECC_BYTE &&
7838
                              (ssl->options.cipherSuite == TLS_SHA256_SHA256 ||
7839
                               ssl->options.cipherSuite == TLS_SHA384_SHA384)) {
7840
            ;
7841
        }
7842
        else
7843
    #endif
7844
0
    #if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_SM3)
7845
0
        if (ssl->options.cipherSuite0 == CIPHER_BYTE &&
7846
0
                ssl->options.cipherSuite == TLS_SM4_GCM_SM3) {
7847
0
            ; /* Do nothing. */
7848
0
        }
7849
0
        else
7850
0
    #endif
7851
0
    #if defined(WOLFSSL_SM4_CCM) && defined(WOLFSSL_SM3)
7852
0
        if (ssl->options.cipherSuite0 == CIPHER_BYTE &&
7853
0
                ssl->options.cipherSuite == TLS_SM4_CCM_SM3) {
7854
0
            ; /* Do nothing. */
7855
0
        }
7856
0
        else
7857
0
    #endif
7858
0
        if (ssl->options.cipherSuite0 != TLS13_BYTE) {
7859
0
            WOLFSSL_MSG("Negotiated ciphersuite from lesser version than "
7860
0
                        "TLS v1.3");
7861
0
            ERROR_OUT(MATCH_SUITE_ERROR, exit_dch);
7862
0
        }
7863
7864
0
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
7865
0
        if (ssl->options.resuming) {
7866
0
            ssl->options.resuming = 0;
7867
0
            ssl->arrays->psk_keySz = 0;
7868
0
            XMEMSET(ssl->arrays->psk_key, 0, ssl->specs.hash_size);
7869
0
        }
7870
0
    #endif
7871
7872
        /* Derive early secret for handshake secret. */
7873
0
        if ((ret = DeriveEarlySecret(ssl)) != 0)
7874
0
            goto exit_dch;
7875
0
#endif /* !NO_CERTS */
7876
0
    }
7877
0
    break;
7878
0
    } /* case TLS_ASYNC_FINALIZE */
7879
0
    default:
7880
0
        ret = INPUT_CASE_ERROR;
7881
0
    } /* switch (ssl->options.asyncState) */
7882
7883
#ifdef WOLFSSL_SEND_HRR_COOKIE
7884
    if (ret == 0 && ssl->options.sendCookie) {
7885
        if (ssl->options.cookieGood &&
7886
                ssl->options.acceptState == TLS13_ACCEPT_FIRST_REPLY_DONE) {
7887
            /* Processing second ClientHello. Clear HRR state. */
7888
            ssl->options.serverState = NULL_STATE;
7889
        }
7890
7891
        if (ssl->options.cookieGood &&
7892
            ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
7893
            /* If we already verified the peer with a cookie then we can't
7894
             * do another HRR for cipher negotiation. Send alert and restart
7895
             * the entire handshake. */
7896
            ERROR_OUT(INVALID_PARAMETER, exit_dch);
7897
        }
7898
#ifdef WOLFSSL_DTLS13
7899
        if (ssl->options.dtls &&
7900
            ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
7901
            /* Cookie and key share negotiation should be handled in
7902
             * DoClientHelloStateless. If we enter here then something went
7903
             * wrong in our logic. */
7904
            ERROR_OUT(BAD_HELLO, exit_dch);
7905
        }
7906
#endif
7907
        /* Send a cookie */
7908
        if (!ssl->options.cookieGood &&
7909
            ssl->options.serverState != SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
7910
#ifdef WOLFSSL_DTLS13
7911
            if (ssl->options.dtls) {
7912
#ifdef WOLFSSL_DTLS13_NO_HRR_ON_RESUME
7913
                /* We can skip cookie on resumption */
7914
                if (!ssl->options.dtls || !ssl->options.dtls13NoHrrOnResume ||
7915
                        !args->usingPSK)
7916
#endif
7917
                    ERROR_OUT(BAD_HELLO, exit_dch);
7918
            }
7919
            else
7920
#endif
7921
            {
7922
                /* Need to remove the keyshare ext if we found a common group
7923
                 * and are not doing curve negotiation. */
7924
                TLSX_Remove(&ssl->extensions, TLSX_KEY_SHARE, ssl->heap);
7925
                ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
7926
            }
7927
7928
        }
7929
    }
7930
#endif /* WOLFSSL_DTLS13 */
7931
7932
#ifdef WOLFSSL_DTLS_CID
7933
    /* do not modify CID state if we are sending an HRR  */
7934
    if (ret == 0 && ssl->options.dtls && ssl->options.useDtlsCID &&
7935
            ssl->options.serverState != SERVER_HELLO_RETRY_REQUEST_COMPLETE)
7936
        DtlsCIDOnExtensionsParsed(ssl);
7937
#endif /* WOLFSSL_DTLS_CID */
7938
7939
7940
7941
0
exit_dch:
7942
7943
0
    WOLFSSL_LEAVE("DoTls13ClientHello", ret);
7944
7945
#ifdef WOLFSSL_ASYNC_CRYPT
7946
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
7947
        ssl->msgsReceived.got_client_hello = 0;
7948
        return ret;
7949
    }
7950
#endif
7951
7952
0
    FreeDch13Args(ssl, args);
7953
#ifdef WOLFSSL_ASYNC_CRYPT
7954
    FreeAsyncCtx(ssl, 0);
7955
#endif
7956
0
    WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
7957
7958
0
    if (ret != 0) {
7959
0
        WOLFSSL_ERROR_VERBOSE(ret);
7960
0
    }
7961
7962
#if defined(HAVE_ECH)
7963
    if (ret == 0 && echX != NULL &&
7964
        ((WOLFSSL_ECH*)echX->data)->state == ECH_WRITE_NONE &&
7965
        ((WOLFSSL_ECH*)echX->data)->innerClientHello != NULL) {
7966
7967
        /* add the header to the inner hello */
7968
        AddTls13HandShakeHeader(((WOLFSSL_ECH*)echX->data)->innerClientHello,
7969
            ((WOLFSSL_ECH*)echX->data)->innerClientHelloLen, 0, 0,
7970
            client_hello, ssl);
7971
    }
7972
#endif
7973
7974
0
    return ret;
7975
0
}
7976
7977
/* Send TLS v1.3 ServerHello message to client.
7978
 * Only a server will send this message.
7979
 *
7980
 * ssl  The SSL/TLS object.
7981
 * returns 0 on success, otherwise failure.
7982
 */
7983
/* handle generation of TLS 1.3 server_hello (2) */
7984
int SendTls13ServerHello(WOLFSSL* ssl, byte extMsgType)
7985
{
7986
    int    ret;
7987
    byte*  output;
7988
    word16 length;
7989
    word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
7990
    int    sendSz;
7991
#if defined(HAVE_ECH)
7992
    TLSX* echX = NULL;
7993
    byte* acceptLabel = (byte*)echAcceptConfirmationLabel;
7994
    word32 acceptOffset;
7995
    word16 acceptLabelSz = ECH_ACCEPT_CONFIRMATION_LABEL_SZ;
7996
#endif
7997
7998
    WOLFSSL_START(WC_FUNC_SERVER_HELLO_SEND);
7999
    WOLFSSL_ENTER("SendTls13ServerHello");
8000
8001
    /* When ssl->options.dtlsStateful is not set then cookie is calculated in
8002
     * dtls.c */
8003
    if (extMsgType == hello_retry_request
8004
#ifdef WOLFSSL_DTLS13
8005
            && (!ssl->options.dtls || ssl->options.dtlsStateful)
8006
#endif
8007
            ) {
8008
        WOLFSSL_MSG("wolfSSL Sending HelloRetryRequest");
8009
        if ((ret = RestartHandshakeHash(ssl)) < 0)
8010
            return ret;
8011
    }
8012
8013
    ssl->options.buildingMsg = 1;
8014
#ifdef WOLFSSL_DTLS13
8015
    if (ssl->options.dtls)
8016
        idx = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
8017
#endif /* WOLFSSL_DTLS13 */
8018
8019
    /* Protocol version, server random, session id, cipher suite, compression
8020
     * and extensions.
8021
     */
8022
    length = VERSION_SZ + RAN_LEN + ENUM_LEN + ssl->session->sessionIDSz +
8023
             SUITE_LEN + COMP_LEN;
8024
    ret = TLSX_GetResponseSize(ssl, extMsgType, &length);
8025
    if (ret != 0)
8026
        return ret;
8027
    sendSz = (int)(idx + length);
8028
8029
    /* Check buffers are big enough and grow if needed. */
8030
    if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
8031
        return ret;
8032
8033
    /* Get position in output buffer to write new message to. */
8034
    output = GetOutputBuffer(ssl);
8035
8036
    /* Put the record and handshake headers on. */
8037
    AddTls13Headers(output, length, server_hello, ssl);
8038
8039
    /* The protocol version must be TLS v1.2 for middleboxes. */
8040
    output[idx++] = ssl->version.major;
8041
    output[idx++] = ssl->options.dtls ? DTLSv1_2_MINOR : TLSv1_2_MINOR;
8042
8043
    if (extMsgType == server_hello) {
8044
        /* Generate server random. */
8045
        if ((ret = wc_RNG_GenerateBlock(ssl->rng, output + idx, RAN_LEN)) != 0)
8046
            return ret;
8047
    }
8048
    else {
8049
        /* HelloRetryRequest message has fixed value for random. */
8050
        XMEMCPY(output + idx, helloRetryRequestRandom, RAN_LEN);
8051
    }
8052
8053
#if defined(HAVE_ECH)
8054
    /* last 8 bytes of server random */
8055
    acceptOffset = idx + RAN_LEN - ECH_ACCEPT_CONFIRMATION_SZ;
8056
#endif
8057
8058
    /* Store in SSL for debugging. */
8059
    XMEMCPY(ssl->arrays->serverRandom, output + idx, RAN_LEN);
8060
    idx += RAN_LEN;
8061
8062
#ifdef WOLFSSL_DEBUG_TLS
8063
    WOLFSSL_MSG("Server random");
8064
    WOLFSSL_BUFFER(ssl->arrays->serverRandom, RAN_LEN);
8065
#endif
8066
8067
#ifdef WOLFSSL_DTLS13
8068
    if (ssl->options.dtls) {
8069
        /* RFC 9147 Section 5.3: DTLS 1.3 ServerHello must have empty
8070
         * legacy_session_id_echo. */
8071
        output[idx++] = 0;
8072
    }
8073
    else
8074
#endif
8075
    {
8076
        output[idx++] = ssl->session->sessionIDSz;
8077
        if (ssl->session->sessionIDSz > 0) {
8078
            XMEMCPY(output + idx, ssl->session->sessionID,
8079
                ssl->session->sessionIDSz);
8080
            idx += ssl->session->sessionIDSz;
8081
        }
8082
    }
8083
8084
    /* Chosen cipher suite */
8085
    output[idx++] = ssl->options.cipherSuite0;
8086
    output[idx++] = ssl->options.cipherSuite;
8087
#ifdef WOLFSSL_DEBUG_TLS
8088
    WOLFSSL_MSG("Chosen cipher suite:");
8089
    WOLFSSL_MSG(GetCipherNameInternal(ssl->options.cipherSuite0,
8090
                                      ssl->options.cipherSuite));
8091
#endif
8092
8093
    /* Compression not supported in TLS v1.3. */
8094
    output[idx++] = 0;
8095
8096
    /* Extensions */
8097
    ret = TLSX_WriteResponse(ssl, output + idx, extMsgType, NULL);
8098
    if (ret != 0)
8099
        return ret;
8100
8101
    /* When we send a HRR, we store the selected key share group to later check
8102
     * that the client uses the same group in the second ClientHello.
8103
     *
8104
     * In case of stateless DTLS, we do not store the group, however, as it is
8105
     * already stored in the cookie that is sent to the client. We later recover
8106
     * the group from the cookie to prevent storing a state in a stateless
8107
     * server.
8108
     *
8109
     * Similar logic holds for the hrrCipherSuite. */
8110
    if (extMsgType == hello_retry_request
8111
#if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
8112
        && (!ssl->options.dtls || ssl->options.dtlsStateful)
8113
#endif
8114
    ) {
8115
        TLSX* ksExt = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
8116
        if (ksExt != NULL) {
8117
            KeyShareEntry* kse = (KeyShareEntry*)ksExt->data;
8118
            if (kse != NULL)
8119
                ssl->hrr_keyshare_group = kse->group;
8120
        }
8121
8122
        ssl->options.hrrCipherSuite0 = ssl->options.cipherSuite0;
8123
        ssl->options.hrrCipherSuite  = ssl->options.cipherSuite;
8124
    }
8125
8126
#ifdef WOLFSSL_SEND_HRR_COOKIE
8127
    if (ssl->options.sendCookie && extMsgType == hello_retry_request) {
8128
        /* Reset the hashes from here. We will be able to restart the hashes
8129
         * from the cookie in RestartHandshakeHashWithCookie */
8130
#ifdef WOLFSSL_DTLS13
8131
        /* When ssl->options.dtlsStateful is not set then cookie is calculated
8132
         * in dtls.c */
8133
        if (ssl->options.dtls && !ssl->options.dtlsStateful)
8134
            ret = 0;
8135
        else
8136
#endif
8137
            ret = InitHandshakeHashes(ssl);
8138
    }
8139
    else
8140
#endif
8141
    {
8142
#ifdef WOLFSSL_DTLS13
8143
        if (ssl->options.dtls) {
8144
            ret = Dtls13HashHandshake(
8145
                ssl,
8146
                output + Dtls13GetRlHeaderLength(ssl, 0) ,
8147
                (word16)sendSz - Dtls13GetRlHeaderLength(ssl, 0));
8148
        }
8149
        else
8150
#endif /* WOLFSSL_DTLS13 */
8151
        {
8152
#if defined(HAVE_ECH)
8153
            if (ssl->ctx->echConfigs != NULL && !ssl->options.disableECH) {
8154
                echX = TLSX_Find(ssl->extensions, TLSX_ECH);
8155
                if (echX == NULL)
8156
                    return WOLFSSL_FATAL_ERROR;
8157
                /* use hrr offset */
8158
                if (extMsgType == hello_retry_request) {
8159
                    acceptOffset =
8160
                        (word32)(((WOLFSSL_ECH*)echX->data)->confBuf - output);
8161
                    acceptLabel = (byte*)echHrrAcceptConfirmationLabel;
8162
                    acceptLabelSz = ECH_HRR_ACCEPT_CONFIRMATION_LABEL_SZ;
8163
                }
8164
                /* replace the last 8 bytes of server random with the accept */
8165
                if (((WOLFSSL_ECH*)echX->data)->state == ECH_PARSED_INTERNAL) {
8166
                    if (ret == 0) {
8167
                        ret = EchWriteAcceptance(ssl, acceptLabel,
8168
                            acceptLabelSz, output + RECORD_HEADER_SZ,
8169
                            acceptOffset - RECORD_HEADER_SZ,
8170
                            sendSz - RECORD_HEADER_SZ, extMsgType);
8171
                    }
8172
                    if (extMsgType == hello_retry_request) {
8173
                        /* reset the ech state for round 2 */
8174
                        ((WOLFSSL_ECH*)echX->data)->state = ECH_WRITE_NONE;
8175
                        /* inner hello no longer needed, free it */
8176
                        XFREE(((WOLFSSL_ECH*)echX->data)->innerClientHello,
8177
                              ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8178
                        ((WOLFSSL_ECH*)echX->data)->innerClientHello = NULL;
8179
                    }
8180
                    else {
8181
                        if (ret == 0) {
8182
                            /* update serverRandom on success */
8183
                            XMEMCPY(ssl->arrays->serverRandom,
8184
                                output + acceptOffset -
8185
                                (RAN_LEN -ECH_ACCEPT_CONFIRMATION_SZ), RAN_LEN);
8186
                        }
8187
                        /* remove ech so we don't keep sending it in write */
8188
                        TLSX_Remove(&ssl->extensions, TLSX_ECH, ssl->heap);
8189
                    }
8190
                }
8191
            }
8192
#endif
8193
            if (ret == 0)
8194
                ret = HashOutput(ssl, output, sendSz, 0);
8195
        }
8196
    }
8197
8198
    if (ret != 0)
8199
        return ret;
8200
8201
#if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
8202
    if (ssl->hsInfoOn)
8203
        AddPacketName(ssl, "ServerHello");
8204
    if (ssl->toInfoOn) {
8205
        ret = AddPacketInfo(ssl, "ServerHello", handshake, output, sendSz,
8206
                      WRITE_PROTO, 0, ssl->heap);
8207
        if (ret != 0)
8208
            return ret;
8209
    }
8210
    #endif
8211
8212
    if (extMsgType == server_hello)
8213
        ssl->options.serverState = SERVER_HELLO_COMPLETE;
8214
8215
    ssl->options.buildingMsg = 0;
8216
#ifdef WOLFSSL_DTLS13
8217
    if (ssl->options.dtls) {
8218
        ret = Dtls13HandshakeSend(ssl, output, (word16)sendSz, (word16)sendSz,
8219
            (enum HandShakeType)extMsgType, 0);
8220
8221
        WOLFSSL_LEAVE("SendTls13ServerHello", ret);
8222
        WOLFSSL_END(WC_FUNC_SERVER_HELLO_SEND);
8223
        return ret;
8224
    }
8225
#endif /* WOLFSSL_DTLS13 */
8226
8227
    ssl->buffers.outputBuffer.length += (word32)sendSz;
8228
8229
    if (!ssl->options.groupMessages || extMsgType != server_hello)
8230
        ret = SendBuffered(ssl);
8231
8232
    WOLFSSL_LEAVE("SendTls13ServerHello", ret);
8233
    WOLFSSL_END(WC_FUNC_SERVER_HELLO_SEND);
8234
8235
    return ret;
8236
}
8237
8238
/* handle generation of TLS 1.3 encrypted_extensions (8) */
8239
/* Send the rest of the extensions encrypted under the handshake key.
8240
 * This message is always encrypted in TLS v1.3.
8241
 * Only a server will send this message.
8242
 *
8243
 * ssl  The SSL/TLS object.
8244
 * returns 0 on success, otherwise failure.
8245
 */
8246
static int SendTls13EncryptedExtensions(WOLFSSL* ssl)
8247
0
{
8248
0
    int    ret;
8249
0
    byte*  output;
8250
0
    word16 length = 0;
8251
0
    word32 idx;
8252
0
    int    sendSz;
8253
8254
0
    WOLFSSL_START(WC_FUNC_ENCRYPTED_EXTENSIONS_SEND);
8255
0
    WOLFSSL_ENTER("SendTls13EncryptedExtensions");
8256
8257
0
    ssl->options.buildingMsg = 1;
8258
0
    ssl->keys.encryptionOn = 1;
8259
8260
#ifdef WOLFSSL_DTLS13
8261
    if (ssl->options.dtls) {
8262
        idx = Dtls13GetHeadersLength(ssl, encrypted_extensions);
8263
    }
8264
    else
8265
#endif /* WOLFSSL_DTLS13 */
8266
0
    {
8267
0
        idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
8268
0
    }
8269
8270
0
#if defined(HAVE_SUPPORTED_CURVES) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
8271
0
    if ((ret = TLSX_SupportedCurve_CheckPriority(ssl)) != 0)
8272
0
        return ret;
8273
0
#endif
8274
8275
    /* Derive the handshake secret now that we are at first message to be
8276
     * encrypted under the keys.
8277
     */
8278
0
    if ((ret = DeriveHandshakeSecret(ssl)) != 0)
8279
0
        return ret;
8280
0
    if ((ret = DeriveTls13Keys(ssl, handshake_key,
8281
0
                               ENCRYPT_AND_DECRYPT_SIDE, 1)) != 0)
8282
0
        return ret;
8283
8284
    /* Setup encrypt/decrypt keys for following messages. */
8285
#ifdef WOLFSSL_EARLY_DATA
8286
    if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
8287
        return ret;
8288
    if (ssl->earlyData != process_early_data) {
8289
        if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
8290
            return ret;
8291
    }
8292
#else
8293
0
    if ((ret = SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE)) != 0)
8294
0
        return ret;
8295
0
#endif
8296
#ifdef WOLFSSL_QUIC
8297
    if (IsAtLeastTLSv1_3(ssl->version) && WOLFSSL_IS_QUIC(ssl)) {
8298
        ret = wolfSSL_quic_add_transport_extensions(ssl, encrypted_extensions);
8299
        if (ret != 0)
8300
            return ret;
8301
    }
8302
#endif
8303
8304
#ifdef WOLFSSL_DTLS13
8305
    if (ssl->options.dtls) {
8306
        w64wrapper epochHandshake = w64From32(0, DTLS13_EPOCH_HANDSHAKE);
8307
        ssl->dtls13Epoch = epochHandshake;
8308
8309
        ret = Dtls13SetEpochKeys(
8310
            ssl, epochHandshake, ENCRYPT_AND_DECRYPT_SIDE);
8311
        if (ret != 0)
8312
            return ret;
8313
8314
    }
8315
#endif /* WOLFSSL_DTLS13 */
8316
8317
0
    ret = TLSX_GetResponseSize(ssl, encrypted_extensions, &length);
8318
0
    if (ret != 0)
8319
0
        return ret;
8320
8321
0
    sendSz = (int)(idx + length);
8322
    /* Encryption always on. */
8323
0
    sendSz += MAX_MSG_EXTRA;
8324
8325
    /* Check buffers are big enough and grow if needed. */
8326
0
    ret = CheckAvailableSize(ssl, sendSz);
8327
0
    if (ret != 0)
8328
0
        return ret;
8329
8330
    /* Get position in output buffer to write new message to. */
8331
0
    output = GetOutputBuffer(ssl);
8332
8333
    /* Put the record and handshake headers on. */
8334
0
    AddTls13Headers(output, length, encrypted_extensions, ssl);
8335
8336
0
    ret = TLSX_WriteResponse(ssl, output + idx, encrypted_extensions, NULL);
8337
0
    if (ret != 0)
8338
0
        return ret;
8339
0
    idx += length;
8340
8341
0
#if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
8342
0
    if (ssl->hsInfoOn)
8343
0
        AddPacketName(ssl, "EncryptedExtensions");
8344
0
    if (ssl->toInfoOn) {
8345
0
        ret = AddPacketInfo(ssl, "EncryptedExtensions", handshake, output,
8346
0
                      sendSz, WRITE_PROTO, 0, ssl->heap);
8347
0
        if (ret != 0)
8348
0
            return ret;
8349
0
    }
8350
0
#endif
8351
8352
#ifdef WOLFSSL_DTLS13
8353
    if (ssl->options.dtls) {
8354
        ssl->options.buildingMsg = 0;
8355
        ret = Dtls13HandshakeSend(ssl, output, (word16)sendSz, (word16)idx,
8356
                                  encrypted_extensions, 1);
8357
8358
        if (ret == 0)
8359
            ssl->options.serverState = SERVER_ENCRYPTED_EXTENSIONS_COMPLETE;
8360
8361
        WOLFSSL_LEAVE("SendTls13EncryptedExtensions", ret);
8362
        WOLFSSL_END(WC_FUNC_ENCRYPTED_EXTENSIONS_SEND);
8363
8364
        return ret;
8365
    }
8366
#endif /* WOLFSSL_DTLS13 */
8367
8368
    /* This handshake message is always encrypted. */
8369
0
    sendSz = BuildTls13Message(ssl, output, sendSz, output + RECORD_HEADER_SZ,
8370
0
                               (int)(idx - RECORD_HEADER_SZ),
8371
0
                               handshake, 1, 0, 0);
8372
0
    if (sendSz < 0)
8373
0
        return sendSz;
8374
8375
0
    ssl->buffers.outputBuffer.length += (word32)sendSz;
8376
0
    ssl->options.buildingMsg = 0;
8377
0
    ssl->options.serverState = SERVER_ENCRYPTED_EXTENSIONS_COMPLETE;
8378
8379
0
    if (!ssl->options.groupMessages)
8380
0
        ret = SendBuffered(ssl);
8381
8382
8383
0
    WOLFSSL_LEAVE("SendTls13EncryptedExtensions", ret);
8384
0
    WOLFSSL_END(WC_FUNC_ENCRYPTED_EXTENSIONS_SEND);
8385
8386
0
    return ret;
8387
0
}
8388
8389
#ifndef NO_CERTS
8390
/* handle generation TLS v1.3 certificate_request (13) */
8391
/* Send the TLS v1.3 CertificateRequest message.
8392
 * This message is always encrypted in TLS v1.3.
8393
 * Only a server will send this message.
8394
 *
8395
 * ssl        SSL/TLS object.
8396
 * reqCtx     Request context.
8397
 * reqCtxLen  Length of context. 0 when sending as part of handshake.
8398
 * returns 0 on success, otherwise failure.
8399
 */
8400
static int SendTls13CertificateRequest(WOLFSSL* ssl, byte* reqCtx,
8401
                                       word32 reqCtxLen)
8402
0
{
8403
0
    byte*   output;
8404
0
    int    ret;
8405
0
    int    sendSz;
8406
0
    word32 i;
8407
0
    word32 reqSz;
8408
0
    SignatureAlgorithms* sa;
8409
8410
0
    WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_SEND);
8411
0
    WOLFSSL_ENTER("SendTls13CertificateRequest");
8412
8413
0
    ssl->options.buildingMsg = 1;
8414
8415
0
    if (ssl->options.side != WOLFSSL_SERVER_END)
8416
0
        return SIDE_ERROR;
8417
8418
    /* Use ssl->suites->hashSigAlgo so wolfSSL_set1_sigalgs_list() is honored.
8419
     * hashSigAlgoSz=0 makes GetSize/Write fall back to WOLFSSL_SUITES(ssl). */
8420
0
    sa = TLSX_SignatureAlgorithms_New(ssl, 0, ssl->heap);
8421
0
    if (sa == NULL)
8422
0
        return MEMORY_ERROR;
8423
0
    ret = TLSX_Push(&ssl->extensions, TLSX_SIGNATURE_ALGORITHMS, sa, ssl->heap);
8424
0
    if (ret != 0) {
8425
0
        TLSX_SignatureAlgorithms_FreeAll(sa, ssl->heap);
8426
0
        return ret;
8427
0
    }
8428
8429
0
    i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
8430
#ifdef WOLFSSL_DTLS13
8431
    if (ssl->options.dtls)
8432
        i = Dtls13GetRlHeaderLength(ssl, 1) + DTLS_HANDSHAKE_HEADER_SZ;
8433
#endif /* WOLFSSL_DTLS13 */
8434
8435
0
    reqSz = (word16)(OPAQUE8_LEN + reqCtxLen);
8436
0
    ret = TLSX_GetRequestSize(ssl, certificate_request, &reqSz);
8437
0
    if (ret != 0)
8438
0
        return ret;
8439
8440
0
    sendSz = (int)(i + reqSz);
8441
    /* Always encrypted and make room for padding. */
8442
0
    sendSz += MAX_MSG_EXTRA;
8443
8444
    /* Check buffers are big enough and grow if needed. */
8445
0
    if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
8446
0
        return ret;
8447
8448
    /* Get position in output buffer to write new message to. */
8449
0
    output = GetOutputBuffer(ssl);
8450
8451
    /* Put the record and handshake headers on. */
8452
0
    AddTls13Headers(output, reqSz, certificate_request, ssl);
8453
8454
    /* Certificate request context. */
8455
0
    output[i++] = (byte)reqCtxLen;
8456
0
    if (reqCtxLen != 0) {
8457
0
        XMEMCPY(output + i, reqCtx, reqCtxLen);
8458
0
        i += reqCtxLen;
8459
0
    }
8460
8461
    /* Certificate extensions. */
8462
0
    reqSz = 0;
8463
0
    ret = TLSX_WriteRequest(ssl, output + i, certificate_request, &reqSz);
8464
0
    if (ret != 0)
8465
0
        return ret;
8466
0
    i += reqSz;
8467
8468
#ifdef WOLFSSL_DTLS13
8469
    if (ssl->options.dtls) {
8470
        ssl->options.buildingMsg = 0;
8471
        ret =
8472
            Dtls13HandshakeSend(ssl, output, (word16)sendSz, (word16)i,
8473
                                certificate_request, 1);
8474
8475
        WOLFSSL_LEAVE("SendTls13CertificateRequest", ret);
8476
        WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_SEND);
8477
8478
        return ret;
8479
8480
    }
8481
#endif /* WOLFSSL_DTLS13 */
8482
8483
    /* Always encrypted. */
8484
0
    sendSz = BuildTls13Message(ssl, output, sendSz, output + RECORD_HEADER_SZ,
8485
0
                               (int)(i - RECORD_HEADER_SZ), handshake, 1, 0, 0);
8486
0
    if (sendSz < 0)
8487
0
        return sendSz;
8488
8489
0
    #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
8490
0
        if (ssl->hsInfoOn)
8491
0
            AddPacketName(ssl, "CertificateRequest");
8492
0
        if (ssl->toInfoOn) {
8493
0
            ret = AddPacketInfo(ssl, "CertificateRequest", handshake, output,
8494
0
                          sendSz, WRITE_PROTO, 0, ssl->heap);
8495
0
            if (ret != 0)
8496
0
                return ret;
8497
0
        }
8498
0
    #endif
8499
8500
0
    ssl->buffers.outputBuffer.length += (word32)sendSz;
8501
0
    ssl->options.buildingMsg = 0;
8502
0
    if (!ssl->options.groupMessages)
8503
0
        ret = SendBuffered(ssl);
8504
8505
0
    WOLFSSL_LEAVE("SendTls13CertificateRequest", ret);
8506
0
    WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_SEND);
8507
8508
0
    return ret;
8509
0
}
8510
#endif /* NO_CERTS */
8511
#endif /* NO_WOLFSSL_SERVER */
8512
8513
#ifndef NO_CERTS
8514
#if (!defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)) && \
8515
    (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
8516
     defined(HAVE_ED448) || defined(HAVE_FALCON) || defined(HAVE_DILITHIUM))
8517
/* Encode the signature algorithm into buffer.
8518
 *
8519
 * hashalgo  The hash algorithm.
8520
 * hsType   The signature type.
8521
 * output    The buffer to encode into.
8522
 */
8523
static WC_INLINE void EncodeSigAlg(const WOLFSSL * ssl, byte hashAlgo,
8524
    byte hsType, byte* output)
8525
{
8526
    (void)ssl;
8527
    switch (hsType) {
8528
#ifdef HAVE_ECC
8529
        case ecc_dsa_sa_algo:
8530
            if (ssl->pkCurveOID == ECC_BRAINPOOLP256R1_OID) {
8531
                output[0] = NEW_SA_MAJOR;
8532
                output[1] = ECDSA_BRAINPOOLP256R1TLS13_SHA256_MINOR;
8533
            }
8534
            else if (ssl->pkCurveOID == ECC_BRAINPOOLP384R1_OID) {
8535
                output[0] = NEW_SA_MAJOR;
8536
                output[1] = ECDSA_BRAINPOOLP384R1TLS13_SHA384_MINOR;
8537
            }
8538
            else if (ssl->pkCurveOID == ECC_BRAINPOOLP512R1_OID) {
8539
                output[0] = NEW_SA_MAJOR;
8540
                output[1] = ECDSA_BRAINPOOLP512R1TLS13_SHA512_MINOR;
8541
            }
8542
            else {
8543
                output[0] = hashAlgo;
8544
                output[1] = ecc_dsa_sa_algo;
8545
            }
8546
            break;
8547
#endif
8548
#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
8549
        case sm2_sa_algo:
8550
            output[0] = SM2_SA_MAJOR;
8551
            output[1] = SM2_SA_MINOR;
8552
            break;
8553
#endif
8554
#ifdef HAVE_ED25519
8555
        /* ED25519: 0x0807 */
8556
        case ed25519_sa_algo:
8557
            output[0] = ED25519_SA_MAJOR;
8558
            output[1] = ED25519_SA_MINOR;
8559
            (void)hashAlgo;
8560
            break;
8561
#endif
8562
#ifdef HAVE_ED448
8563
        /* ED448: 0x0808 */
8564
        case ed448_sa_algo:
8565
            output[0] = ED448_SA_MAJOR;
8566
            output[1] = ED448_SA_MINOR;
8567
            (void)hashAlgo;
8568
            break;
8569
#endif
8570
#ifndef NO_RSA
8571
        /* PSS signatures: 0x080[4-6] or 0x080[9-B] */
8572
        case rsa_pss_sa_algo:
8573
            output[0] = rsa_pss_sa_algo;
8574
#ifdef WC_RSA_PSS
8575
            /* If the private key uses the RSA-PSS OID, and the peer supports
8576
             * the rsa_pss_pss_* signature algorithm in use, then report
8577
             * rsa_pss_pss_* rather than rsa_pss_rsae_*. */
8578
            if (ssl->useRsaPss &&
8579
                ((ssl->pssAlgo & (1U << hashAlgo)) != 0U) &&
8580
                (sha256_mac <= hashAlgo) && (hashAlgo <= sha512_mac))
8581
            {
8582
                output[1] = PSS_RSAE_TO_PSS_PSS(hashAlgo);
8583
            }
8584
            else
8585
#endif
8586
            {
8587
                output[1] = hashAlgo;
8588
            }
8589
            break;
8590
#endif
8591
#ifdef HAVE_FALCON
8592
        case falcon_level1_sa_algo:
8593
            output[0] = FALCON_LEVEL1_SA_MAJOR;
8594
            output[1] = FALCON_LEVEL1_SA_MINOR;
8595
            break;
8596
        case falcon_level5_sa_algo:
8597
            output[0] = FALCON_LEVEL5_SA_MAJOR;
8598
            output[1] = FALCON_LEVEL5_SA_MINOR;
8599
            break;
8600
#endif
8601
#ifdef HAVE_DILITHIUM
8602
        case dilithium_level2_sa_algo:
8603
            output[0] = DILITHIUM_LEVEL2_SA_MAJOR;
8604
            output[1] = DILITHIUM_LEVEL2_SA_MINOR;
8605
            break;
8606
        case dilithium_level3_sa_algo:
8607
            output[0] = DILITHIUM_LEVEL3_SA_MAJOR;
8608
            output[1] = DILITHIUM_LEVEL3_SA_MINOR;
8609
            break;
8610
        case dilithium_level5_sa_algo:
8611
            output[0] = DILITHIUM_LEVEL5_SA_MAJOR;
8612
            output[1] = DILITHIUM_LEVEL5_SA_MINOR;
8613
            break;
8614
#endif
8615
        default:
8616
            break;
8617
    }
8618
}
8619
#endif
8620
8621
#if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
8622
    defined(HAVE_ED448) || defined(HAVE_FALCON) || defined(HAVE_DILITHIUM)
8623
#ifdef WOLFSSL_DUAL_ALG_CERTS
8624
/* These match up with what the OQS team has defined. */
8625
#define HYBRID_SA_MAJOR 0xFE
8626
#define HYBRID_P256_DILITHIUM_LEVEL2_SA_MINOR    0xA1
8627
#define HYBRID_RSA3072_DILITHIUM_LEVEL2_SA_MINOR 0xA2
8628
#define HYBRID_P384_DILITHIUM_LEVEL3_SA_MINOR    0xA4
8629
#define HYBRID_P521_DILITHIUM_LEVEL5_SA_MINOR    0xA6
8630
/* Falcon hybrid codepoints aligned with oqs-provider. */
8631
#define HYBRID_P256_FALCON_LEVEL1_SA_MINOR       0xD8
8632
#define HYBRID_RSA3072_FALCON_LEVEL1_SA_MINOR    0xD9
8633
#define HYBRID_P521_FALCON_LEVEL5_SA_MINOR       0xDB
8634
8635
/* Custom defined ones for PQC first */
8636
#define HYBRID_DILITHIUM_LEVEL2_P256_SA_MINOR    0xD1
8637
#define HYBRID_DILITHIUM_LEVEL2_RSA3072_SA_MINOR 0xD2
8638
#define HYBRID_DILITHIUM_LEVEL3_P384_SA_MINOR    0xD3
8639
#define HYBRID_DILITHIUM_LEVEL5_P521_SA_MINOR    0xD4
8640
#define HYBRID_FALCON_LEVEL1_P256_SA_MINOR       0xD5
8641
#define HYBRID_FALCON_LEVEL1_RSA3072_SA_MINOR    0xD6
8642
#define HYBRID_FALCON_LEVEL5_P521_SA_MINOR       0xD7
8643
8644
8645
static void EncodeDualSigAlg(byte sigAlg, byte altSigAlg, byte* output)
8646
{
8647
    /* Initialize output to error indicator. */
8648
    output[0] = 0x0;
8649
    output[1] = 0x0;
8650
8651
    if (sigAlg == ecc_dsa_sa_algo && altSigAlg == dilithium_level2_sa_algo) {
8652
        output[1] = HYBRID_P256_DILITHIUM_LEVEL2_SA_MINOR;
8653
    }
8654
    else if (sigAlg == rsa_pss_sa_algo &&
8655
             altSigAlg == dilithium_level2_sa_algo) {
8656
        output[1] = HYBRID_RSA3072_DILITHIUM_LEVEL2_SA_MINOR;
8657
    }
8658
    else if (sigAlg == ecc_dsa_sa_algo &&
8659
             altSigAlg == dilithium_level3_sa_algo) {
8660
        output[1] = HYBRID_P384_DILITHIUM_LEVEL3_SA_MINOR;
8661
    }
8662
    else if (sigAlg == ecc_dsa_sa_algo &&
8663
             altSigAlg == dilithium_level5_sa_algo) {
8664
        output[1] = HYBRID_P521_DILITHIUM_LEVEL5_SA_MINOR;
8665
    }
8666
    else if (sigAlg == ecc_dsa_sa_algo &&
8667
             altSigAlg == falcon_level1_sa_algo) {
8668
        output[1] = HYBRID_P256_FALCON_LEVEL1_SA_MINOR;
8669
    }
8670
    else if (sigAlg == rsa_pss_sa_algo &&
8671
             altSigAlg == falcon_level1_sa_algo) {
8672
        output[1] = HYBRID_RSA3072_FALCON_LEVEL1_SA_MINOR;
8673
    }
8674
    else if (sigAlg == ecc_dsa_sa_algo &&
8675
             altSigAlg == falcon_level5_sa_algo) {
8676
        output[1] = HYBRID_P521_FALCON_LEVEL5_SA_MINOR;
8677
    }
8678
    else if (sigAlg == dilithium_level2_sa_algo &&
8679
             altSigAlg == ecc_dsa_sa_algo) {
8680
        output[1] = HYBRID_DILITHIUM_LEVEL2_P256_SA_MINOR;
8681
    }
8682
    else if (sigAlg == dilithium_level2_sa_algo &&
8683
             altSigAlg == rsa_pss_sa_algo) {
8684
        output[1] = HYBRID_DILITHIUM_LEVEL2_RSA3072_SA_MINOR;
8685
    }
8686
    else if (sigAlg == dilithium_level3_sa_algo &&
8687
             altSigAlg == ecc_dsa_sa_algo) {
8688
        output[1] = HYBRID_DILITHIUM_LEVEL3_P384_SA_MINOR;
8689
    }
8690
    else if (sigAlg == dilithium_level5_sa_algo &&
8691
             altSigAlg == ecc_dsa_sa_algo) {
8692
        output[1] = HYBRID_DILITHIUM_LEVEL5_P521_SA_MINOR;
8693
    }
8694
    else if (sigAlg == falcon_level1_sa_algo &&
8695
             altSigAlg == ecc_dsa_sa_algo) {
8696
        output[1] = HYBRID_FALCON_LEVEL1_P256_SA_MINOR;
8697
    }
8698
    else if (sigAlg == falcon_level1_sa_algo &&
8699
             altSigAlg == rsa_pss_sa_algo) {
8700
        output[1] = HYBRID_FALCON_LEVEL1_RSA3072_SA_MINOR;
8701
    }
8702
    else if (sigAlg == falcon_level5_sa_algo &&
8703
             altSigAlg == ecc_dsa_sa_algo) {
8704
        output[1] = HYBRID_FALCON_LEVEL5_P521_SA_MINOR;
8705
    }
8706
8707
    if (output[1] != 0x0) {
8708
        output[0] = HYBRID_SA_MAJOR;
8709
    }
8710
}
8711
#endif /* WOLFSSL_DUAL_ALG_CERTS */
8712
8713
static enum wc_MACAlgorithm GetNewSAHashAlgo(int typeIn)
8714
0
{
8715
0
    switch (typeIn) {
8716
0
        case RSA_PSS_RSAE_SHA256_MINOR:
8717
0
        case RSA_PSS_PSS_SHA256_MINOR:
8718
0
        case ECDSA_BRAINPOOLP256R1TLS13_SHA256_MINOR:
8719
0
            return sha256_mac;
8720
8721
0
        case RSA_PSS_RSAE_SHA384_MINOR:
8722
0
        case RSA_PSS_PSS_SHA384_MINOR:
8723
0
        case ECDSA_BRAINPOOLP384R1TLS13_SHA384_MINOR:
8724
0
            return sha384_mac;
8725
8726
0
        case RSA_PSS_RSAE_SHA512_MINOR:
8727
0
        case RSA_PSS_PSS_SHA512_MINOR:
8728
0
        case ED25519_SA_MINOR:
8729
0
        case ED448_SA_MINOR:
8730
0
        case ECDSA_BRAINPOOLP512R1TLS13_SHA512_MINOR:
8731
0
            return sha512_mac;
8732
0
        default:
8733
0
            return no_mac;
8734
0
    }
8735
0
}
8736
8737
/* Decode the signature algorithm.
8738
 *
8739
 * input     The encoded signature algorithm.
8740
 * hashalgo  The hash algorithm.
8741
 * hsType    The signature type.
8742
 * returns INVALID_PARAMETER if not recognized and 0 otherwise.
8743
 */
8744
static WC_INLINE int DecodeTls13SigAlg(byte* input, byte* hashAlgo,
8745
                                       byte* hsType)
8746
0
{
8747
0
    int ret = 0;
8748
8749
0
    switch (input[0]) {
8750
0
    #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
8751
0
        case SM2_SA_MAJOR:
8752
0
            if (input[1] == SM2_SA_MINOR) {
8753
0
                *hsType = sm2_sa_algo;
8754
0
                *hashAlgo = sm3_mac;
8755
0
            }
8756
0
            else
8757
0
                ret = INVALID_PARAMETER;
8758
0
            break;
8759
0
    #endif
8760
0
        case NEW_SA_MAJOR:
8761
0
        {
8762
0
            enum wc_MACAlgorithm mac = GetNewSAHashAlgo(input[1]);
8763
0
            *hashAlgo = (byte)mac;
8764
0
        }
8765
8766
            /* PSS encryption: 0x080[4-6] */
8767
0
            if (input[1] >= RSA_PSS_RSAE_SHA256_MINOR &&
8768
0
                    input[1] <= RSA_PSS_RSAE_SHA512_MINOR) {
8769
0
                *hsType   = input[0];
8770
0
            }
8771
            /* PSS signature: 0x080[9-B] */
8772
0
            else if (input[1] >= RSA_PSS_PSS_SHA256_MINOR &&
8773
0
                    input[1] <= RSA_PSS_PSS_SHA512_MINOR) {
8774
0
                *hsType   = input[0];
8775
0
            }
8776
0
    #ifdef HAVE_ED25519
8777
            /* ED25519: 0x0807 */
8778
0
            else if (input[1] == ED25519_SA_MINOR) {
8779
0
                *hsType = ed25519_sa_algo;
8780
                /* Hash performed as part of sign/verify operation. */
8781
0
            }
8782
0
    #endif
8783
0
    #ifdef HAVE_ED448
8784
            /* ED448: 0x0808 */
8785
0
            else if (input[1] == ED448_SA_MINOR) {
8786
0
                *hsType = ed448_sa_algo;
8787
                /* Hash performed as part of sign/verify operation. */
8788
0
            }
8789
0
    #endif
8790
0
    #ifdef HAVE_ECC_BRAINPOOL
8791
0
            else if ((input[1] == ECDSA_BRAINPOOLP256R1TLS13_SHA256_MINOR) ||
8792
0
                     (input[1] == ECDSA_BRAINPOOLP384R1TLS13_SHA384_MINOR) ||
8793
0
                     (input[1] == ECDSA_BRAINPOOLP512R1TLS13_SHA512_MINOR)) {
8794
0
                *hsType = ecc_dsa_sa_algo;
8795
0
            }
8796
0
    #endif
8797
0
            else
8798
0
                ret = INVALID_PARAMETER;
8799
0
            break;
8800
#if defined(HAVE_FALCON)
8801
        case FALCON_SA_MAJOR:
8802
            if (input[1] == FALCON_LEVEL1_SA_MINOR) {
8803
                *hsType = falcon_level1_sa_algo;
8804
                /* Hash performed as part of sign/verify operation. */
8805
                *hashAlgo = sha512_mac;
8806
            } else if (input[1] == FALCON_LEVEL5_SA_MINOR) {
8807
                *hsType = falcon_level5_sa_algo;
8808
                /* Hash performed as part of sign/verify operation. */
8809
                *hashAlgo = sha512_mac;
8810
            }
8811
            else
8812
                ret = INVALID_PARAMETER;
8813
            break;
8814
#endif /* HAVE_FALCON */
8815
#if defined(HAVE_DILITHIUM)
8816
        case DILITHIUM_SA_MAJOR:
8817
            if (input[1] == DILITHIUM_LEVEL2_SA_MINOR) {
8818
                *hsType = dilithium_level2_sa_algo;
8819
                /* Hash performed as part of sign/verify operation. */
8820
                *hashAlgo = sha512_mac;
8821
            } else if (input[1] == DILITHIUM_LEVEL3_SA_MINOR) {
8822
                *hsType = dilithium_level3_sa_algo;
8823
                /* Hash performed as part of sign/verify operation. */
8824
                *hashAlgo = sha512_mac;
8825
            } else if (input[1] == DILITHIUM_LEVEL5_SA_MINOR) {
8826
                *hsType = dilithium_level5_sa_algo;
8827
                /* Hash performed as part of sign/verify operation. */
8828
                *hashAlgo = sha512_mac;
8829
            }
8830
            else
8831
            {
8832
                ret = INVALID_PARAMETER;
8833
            }
8834
            break;
8835
#endif /* HAVE_DILITHIUM */
8836
0
        default:
8837
0
            *hashAlgo = input[0];
8838
0
            *hsType   = input[1];
8839
0
            break;
8840
0
    }
8841
8842
0
    return ret;
8843
0
}
8844
8845
#ifdef WOLFSSL_DUAL_ALG_CERTS
8846
/* Decode the hybrid signature algorithm.
8847
 *
8848
 * input     The encoded signature algorithm.
8849
 * hashalgo  The hash algorithm.
8850
 * hsType    The signature type.
8851
 * returns INVALID_PARAMETER if not recognized and 0 otherwise.
8852
 */
8853
static WC_INLINE int DecodeTls13HybridSigAlg(byte* input, byte* hashAlg,
8854
                                             byte *sigAlg, byte *altSigAlg)
8855
{
8856
8857
    if (input[0] != HYBRID_SA_MAJOR) {
8858
        return INVALID_PARAMETER;
8859
    }
8860
8861
    if (input[1] == HYBRID_P256_DILITHIUM_LEVEL2_SA_MINOR) {
8862
        *sigAlg = ecc_dsa_sa_algo;
8863
        *hashAlg = sha256_mac;
8864
        *altSigAlg = dilithium_level2_sa_algo;
8865
    }
8866
    else if (input[1] == HYBRID_RSA3072_DILITHIUM_LEVEL2_SA_MINOR) {
8867
        *sigAlg = rsa_pss_sa_algo;
8868
        *hashAlg = sha256_mac;
8869
        *altSigAlg = dilithium_level2_sa_algo;
8870
    }
8871
    else if (input[1] == HYBRID_P384_DILITHIUM_LEVEL3_SA_MINOR) {
8872
        *sigAlg = ecc_dsa_sa_algo;
8873
        *hashAlg = sha384_mac;
8874
        *altSigAlg = dilithium_level3_sa_algo;
8875
    }
8876
    else if (input[1] == HYBRID_P521_DILITHIUM_LEVEL5_SA_MINOR) {
8877
        *sigAlg = ecc_dsa_sa_algo;
8878
        *hashAlg = sha512_mac;
8879
        *altSigAlg = dilithium_level5_sa_algo;
8880
    }
8881
    else if (input[1] == HYBRID_P256_FALCON_LEVEL1_SA_MINOR) {
8882
        *sigAlg = ecc_dsa_sa_algo;
8883
        *hashAlg = sha256_mac;
8884
        *altSigAlg = falcon_level1_sa_algo;
8885
    }
8886
    else if (input[1] == HYBRID_RSA3072_FALCON_LEVEL1_SA_MINOR) {
8887
        *sigAlg = rsa_pss_sa_algo;
8888
        *hashAlg = sha256_mac;
8889
        *altSigAlg = falcon_level1_sa_algo;
8890
    }
8891
    else if (input[1] == HYBRID_P521_FALCON_LEVEL5_SA_MINOR) {
8892
        *sigAlg = ecc_dsa_sa_algo;
8893
        *hashAlg = sha512_mac;
8894
        *altSigAlg = falcon_level5_sa_algo;
8895
    }
8896
    else if (input[1] == HYBRID_DILITHIUM_LEVEL2_P256_SA_MINOR) {
8897
        *sigAlg = dilithium_level2_sa_algo;
8898
        *hashAlg = sha256_mac;
8899
        *altSigAlg = ecc_dsa_sa_algo;
8900
    }
8901
    else if (input[1] == HYBRID_DILITHIUM_LEVEL2_RSA3072_SA_MINOR) {
8902
        *sigAlg = dilithium_level2_sa_algo;
8903
        *hashAlg = sha256_mac;
8904
        *altSigAlg = rsa_pss_sa_algo;
8905
    }
8906
    else if (input[1] == HYBRID_DILITHIUM_LEVEL3_P384_SA_MINOR) {
8907
        *sigAlg = dilithium_level3_sa_algo;
8908
        *hashAlg = sha384_mac;
8909
        *altSigAlg = ecc_dsa_sa_algo;
8910
    }
8911
    else if (input[1] == HYBRID_DILITHIUM_LEVEL5_P521_SA_MINOR) {
8912
        *sigAlg = dilithium_level5_sa_algo;
8913
        *hashAlg = sha512_mac;
8914
        *altSigAlg = ecc_dsa_sa_algo;
8915
    }
8916
    else if (input[1] == HYBRID_FALCON_LEVEL1_P256_SA_MINOR) {
8917
        *sigAlg = falcon_level1_sa_algo;
8918
        *hashAlg = sha256_mac;
8919
        *altSigAlg = ecc_dsa_sa_algo;
8920
    }
8921
    else if (input[1] == HYBRID_FALCON_LEVEL1_RSA3072_SA_MINOR) {
8922
        *sigAlg = falcon_level1_sa_algo;
8923
        *hashAlg = sha256_mac;
8924
        *altSigAlg = rsa_pss_sa_algo;
8925
    }
8926
    else if (input[1] == HYBRID_FALCON_LEVEL5_P521_SA_MINOR) {
8927
        *sigAlg = falcon_level5_sa_algo;
8928
        *hashAlg = sha512_mac;
8929
        *altSigAlg = ecc_dsa_sa_algo;
8930
    }
8931
    else {
8932
        return INVALID_PARAMETER;
8933
    }
8934
8935
    return 0;
8936
}
8937
#endif /* WOLFSSL_DUAL_ALG_CERTS */
8938
8939
/* Get the hash of the messages so far.
8940
 *
8941
 * ssl   The SSL/TLS object.
8942
 * hash  The buffer to write the hash to.
8943
 * returns the length of the hash.
8944
 */
8945
static WC_INLINE int GetMsgHash(WOLFSSL* ssl, byte* hash)
8946
0
{
8947
0
    int ret = 0;
8948
0
    switch (ssl->specs.mac_algorithm) {
8949
0
    #ifndef NO_SHA256
8950
0
        case sha256_mac:
8951
0
            ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
8952
0
            if (ret == 0)
8953
0
                ret = WC_SHA256_DIGEST_SIZE;
8954
0
            break;
8955
0
    #endif /* !NO_SHA256 */
8956
0
    #ifdef WOLFSSL_SHA384
8957
0
        case sha384_mac:
8958
0
            ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
8959
0
            if (ret == 0)
8960
0
                ret = WC_SHA384_DIGEST_SIZE;
8961
0
            break;
8962
0
    #endif /* WOLFSSL_SHA384 */
8963
    #ifdef WOLFSSL_TLS13_SHA512
8964
        case sha512_mac:
8965
            ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512, hash);
8966
            if (ret == 0)
8967
                ret = WC_SHA512_DIGEST_SIZE;
8968
            break;
8969
    #endif /* WOLFSSL_TLS13_SHA512 */
8970
0
    #ifdef WOLFSSL_SM3
8971
0
        case sm3_mac:
8972
0
            ret = wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash);
8973
0
            if (ret == 0)
8974
0
                ret = WC_SM3_DIGEST_SIZE;
8975
0
            break;
8976
0
    #endif /* WOLFSSL_SM3 */
8977
0
        default:
8978
0
            break;
8979
0
    }
8980
0
    return ret;
8981
0
}
8982
8983
/* The server certificate verification label. */
8984
static const byte serverCertVfyLabel[CERT_VFY_LABEL_SZ] =
8985
    "TLS 1.3, server CertificateVerify";
8986
/* The client certificate verification label. */
8987
static const byte clientCertVfyLabel[CERT_VFY_LABEL_SZ] =
8988
    "TLS 1.3, client CertificateVerify";
8989
/* The prefix byte in the signature data. */
8990
#define SIGNING_DATA_PREFIX_BYTE   0x20
8991
8992
/* Create the signature data for TLS v1.3 certificate verification.
8993
 *
8994
 * ssl        The SSL/TLS object.
8995
 * sigData    The signature data.
8996
 * sigDataSz  The length of the signature data.
8997
 * check      Indicates this is a check not create.
8998
 */
8999
int CreateSigData(WOLFSSL* ssl, byte* sigData, word16* sigDataSz,
9000
                  int check)
9001
113
{
9002
113
    word16 idx;
9003
113
    int side = ssl->options.side;
9004
113
    int ret;
9005
9006
    /* Signature Data = Prefix | Label | Handshake Hash */
9007
113
    XMEMSET(sigData, SIGNING_DATA_PREFIX_BYTE, SIGNING_DATA_PREFIX_SZ);
9008
113
    idx = SIGNING_DATA_PREFIX_SZ;
9009
9010
113
    if ((side == WOLFSSL_SERVER_END && check) ||
9011
113
        (side == WOLFSSL_CLIENT_END && !check)) {
9012
0
        XMEMCPY(&sigData[idx], clientCertVfyLabel, CERT_VFY_LABEL_SZ);
9013
0
    }
9014
113
    if ((side == WOLFSSL_CLIENT_END && check) ||
9015
113
        (side == WOLFSSL_SERVER_END && !check)) {
9016
113
        XMEMCPY(&sigData[idx], serverCertVfyLabel, CERT_VFY_LABEL_SZ);
9017
113
    }
9018
113
    idx += CERT_VFY_LABEL_SZ;
9019
9020
113
    ret = GetMsgHash(ssl, &sigData[idx]);
9021
113
    if (ret < 0)
9022
0
        return ret;
9023
113
    if (ret == 0)
9024
0
        return HASH_TYPE_E;
9025
9026
113
    *sigDataSz = (word16)(idx + ret);
9027
113
    ret = 0;
9028
9029
113
    return ret;
9030
113
}
9031
9032
#ifndef NO_RSA
9033
/* Encode the PKCS #1.5 RSA signature.
9034
 *
9035
 * sig        The buffer to place the encoded signature into.
9036
 * sigData    The data to be signed.
9037
 * sigDataSz  The size of the data to be signed.
9038
 * hashAlgo   The hash algorithm to use when signing.
9039
 * returns the length of the encoded signature or negative on error.
9040
 */
9041
int CreateRSAEncodedSig(byte* sig, byte* sigData, int sigDataSz,
9042
                        int sigAlgo, int hashAlgo)
9043
113
{
9044
113
    Digest digest;
9045
113
    int    hashSz = 0;
9046
113
    int    ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
9047
113
    byte*  hash;
9048
9049
113
    (void)sigAlgo;
9050
9051
113
    hash = sig;
9052
9053
    /* Digest the signature data. */
9054
113
    switch (hashAlgo) {
9055
0
#ifndef NO_SHA256
9056
73
        case sha256_mac:
9057
73
            ret = wc_InitSha256(&digest.sha256);
9058
73
            if (ret == 0) {
9059
73
                ret = wc_Sha256Update(&digest.sha256, sigData, (word32)sigDataSz);
9060
73
                if (ret == 0)
9061
73
                    ret = wc_Sha256Final(&digest.sha256, hash);
9062
73
                wc_Sha256Free(&digest.sha256);
9063
73
            }
9064
73
            hashSz = WC_SHA256_DIGEST_SIZE;
9065
73
            break;
9066
0
#endif
9067
0
#ifdef WOLFSSL_SHA384
9068
23
        case sha384_mac:
9069
23
            ret = wc_InitSha384(&digest.sha384);
9070
23
            if (ret == 0) {
9071
23
                ret = wc_Sha384Update(&digest.sha384, sigData, (word32)sigDataSz);
9072
23
                if (ret == 0)
9073
23
                    ret = wc_Sha384Final(&digest.sha384, hash);
9074
23
                wc_Sha384Free(&digest.sha384);
9075
23
            }
9076
23
            hashSz = WC_SHA384_DIGEST_SIZE;
9077
23
            break;
9078
0
#endif
9079
0
#ifdef WOLFSSL_SHA512
9080
17
        case sha512_mac:
9081
17
            ret = wc_InitSha512(&digest.sha512);
9082
17
            if (ret == 0) {
9083
17
                ret = wc_Sha512Update(&digest.sha512, sigData, (word32)sigDataSz);
9084
17
                if (ret == 0)
9085
17
                    ret = wc_Sha512Final(&digest.sha512, hash);
9086
17
                wc_Sha512Free(&digest.sha512);
9087
17
            }
9088
17
            hashSz = WC_SHA512_DIGEST_SIZE;
9089
17
            break;
9090
0
#endif
9091
0
       default:
9092
0
            ret = BAD_FUNC_ARG;
9093
0
            break;
9094
9095
113
    }
9096
9097
113
    if (ret != 0)
9098
0
        return ret;
9099
9100
113
    return hashSz;
9101
113
}
9102
#endif /* !NO_RSA */
9103
9104
#ifdef HAVE_ECC
9105
/* Encode the ECC signature.
9106
 *
9107
 * sigData    The data to be signed.
9108
 * sigDataSz  The size of the data to be signed.
9109
 * hashAlgo   The hash algorithm to use when signing.
9110
 * returns the length of the encoded signature or negative on error.
9111
 */
9112
static int CreateECCEncodedSig(byte* sigData, int sigDataSz, int hashAlgo)
9113
0
{
9114
0
    Digest digest;
9115
0
    int    hashSz = 0;
9116
0
    int    ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
9117
9118
    /* Digest the signature data. */
9119
0
    switch (hashAlgo) {
9120
0
#ifndef NO_SHA256
9121
0
        case sha256_mac:
9122
0
            ret = wc_InitSha256(&digest.sha256);
9123
0
            if (ret == 0) {
9124
0
                ret = wc_Sha256Update(&digest.sha256, sigData, (word32)sigDataSz);
9125
0
                if (ret == 0)
9126
0
                    ret = wc_Sha256Final(&digest.sha256, sigData);
9127
0
                wc_Sha256Free(&digest.sha256);
9128
0
            }
9129
0
            hashSz = WC_SHA256_DIGEST_SIZE;
9130
0
            break;
9131
0
#endif
9132
0
#ifdef WOLFSSL_SHA384
9133
0
        case sha384_mac:
9134
0
            ret = wc_InitSha384(&digest.sha384);
9135
0
            if (ret == 0) {
9136
0
                ret = wc_Sha384Update(&digest.sha384, sigData, (word32)sigDataSz);
9137
0
                if (ret == 0)
9138
0
                    ret = wc_Sha384Final(&digest.sha384, sigData);
9139
0
                wc_Sha384Free(&digest.sha384);
9140
0
            }
9141
0
            hashSz = WC_SHA384_DIGEST_SIZE;
9142
0
            break;
9143
0
#endif
9144
0
#ifdef WOLFSSL_SHA512
9145
0
        case sha512_mac:
9146
0
            ret = wc_InitSha512(&digest.sha512);
9147
0
            if (ret == 0) {
9148
0
                ret = wc_Sha512Update(&digest.sha512, sigData, (word32)sigDataSz);
9149
0
                if (ret == 0)
9150
0
                    ret = wc_Sha512Final(&digest.sha512, sigData);
9151
0
                wc_Sha512Free(&digest.sha512);
9152
0
            }
9153
0
            hashSz = WC_SHA512_DIGEST_SIZE;
9154
0
            break;
9155
0
#endif
9156
0
        default:
9157
0
            ret = BAD_FUNC_ARG;
9158
0
            break;
9159
0
    }
9160
9161
0
    if (ret != 0)
9162
0
        return ret;
9163
9164
0
    return hashSz;
9165
0
}
9166
#endif /* HAVE_ECC */
9167
9168
#if !defined(NO_RSA) && defined(WC_RSA_PSS)
9169
/* Check that the decrypted signature matches the encoded signature
9170
 * based on the digest of the signature data.
9171
 *
9172
 * ssl       The SSL/TLS object.
9173
 * sigAlgo   The signature algorithm used to generate signature.
9174
 * hashAlgo  The hash algorithm used to generate signature.
9175
 * decSig    The decrypted signature.
9176
 * decSigSz  The size of the decrypted signature.
9177
 * returns 0 on success, otherwise failure.
9178
 */
9179
static int CheckRSASignature(WOLFSSL* ssl, int sigAlgo, int hashAlgo,
9180
                             byte* decSig, word32 decSigSz)
9181
0
{
9182
0
    int    ret = 0;
9183
0
    byte   sigData[MAX_SIG_DATA_SZ];
9184
0
    word16 sigDataSz;
9185
9186
0
    ret = CreateSigData(ssl, sigData, &sigDataSz, 1);
9187
0
    if (ret != 0)
9188
0
        return ret;
9189
9190
0
    if (sigAlgo == rsa_pss_sa_algo) {
9191
0
        enum wc_HashType hashType = WC_HASH_TYPE_NONE;
9192
0
        word32 sigSz;
9193
9194
0
        ret = ConvertHashPss(hashAlgo, &hashType, NULL);
9195
0
        if (ret < 0)
9196
0
            return ret;
9197
9198
        /* PSS signature can be done in-place */
9199
0
        ret = CreateRSAEncodedSig(sigData, sigData, sigDataSz,
9200
0
                                  sigAlgo, hashAlgo);
9201
0
        if (ret < 0)
9202
0
            return ret;
9203
0
        sigSz = (word32)ret;
9204
9205
0
        ret = wc_RsaPSS_CheckPadding(sigData, sigSz, decSig, decSigSz,
9206
0
                                     hashType);
9207
0
    }
9208
9209
0
    return ret;
9210
0
}
9211
#endif /* !NO_RSA && WC_RSA_PSS */
9212
#endif /* !NO_RSA || HAVE_ECC */
9213
9214
#if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)
9215
/* Get the next certificate from the list for writing into the TLS v1.3
9216
 * Certificate message.
9217
 *
9218
 * data    The certificate list.
9219
 * length  The length of the certificate data in the list.
9220
 * idx     The index of the next certificate.
9221
 * returns the length of the certificate data. 0 indicates no more certificates
9222
 * in the list.
9223
 */
9224
static word32 NextCert(byte* data, word32 length, word32* idx)
9225
0
{
9226
0
    word32 len;
9227
9228
    /* Would index read past end of list? */
9229
0
    if (*idx + 3 > length)
9230
0
        return 0;
9231
9232
    /* Length of the current ASN.1 encoded certificate. */
9233
0
    c24to32(data + *idx, &len);
9234
    /* Include the length field. */
9235
0
    len += 3;
9236
9237
    /* Ensure len does not overrun certificate list */
9238
0
    if (*idx + len > length)
9239
0
        return 0;
9240
9241
    /* Move index to next certificate and return the current certificate's
9242
     * length.
9243
     */
9244
0
    *idx += len;
9245
0
    return len;
9246
0
}
9247
9248
#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) && !defined(NO_WOLFSSL_SERVER)
9249
/* Write certificate status request into certificate to buffer.
9250
 *
9251
 * ssl       SSL/TLS object.
9252
 * certExts  DerBuffer array. buffers written
9253
 * extSz     word32 array.
9254
 *           Length of the certificate status request data for the certificate.
9255
 * extSz_num number of the CSR written
9256
 * extIdx    The index number of certificate status request data
9257
 *           for the certificate.
9258
 * offset    index offset
9259
 * returns   Total number of bytes written on success or negative value on error.
9260
 */
9261
static int WriteCSRToBuffer(WOLFSSL* ssl, DerBuffer** certExts,
9262
                                word16* extSz,  word16 extSz_num)
9263
{
9264
    int    ret = 0;
9265
    TLSX* ext;
9266
    CertificateStatusRequest* csr;
9267
    word32 ex_offset = HELLO_EXT_TYPE_SZ + OPAQUE16_LEN /* extension type */
9268
                    + OPAQUE16_LEN /* extension length */;
9269
    word32 totalSz = 0;
9270
    word32 tmpSz;
9271
    word32 extIdx;
9272
    DerBuffer* der;
9273
9274
    if (extSz_num > MAX_CERT_EXTENSIONS)
9275
        return MAX_CERT_EXTENSIONS_ERR;
9276
9277
    ext = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
9278
    csr = ext ? (CertificateStatusRequest*)ext->data : NULL;
9279
9280
    if (csr) {
9281
        for (extIdx = 0; extIdx < (word16)(extSz_num); extIdx++) {
9282
            tmpSz = TLSX_CSR_GetSize_ex(csr, 0, (int)extIdx);
9283
9284
            if (tmpSz > (OPAQUE8_LEN + OPAQUE24_LEN) &&
9285
                certExts[extIdx] == NULL) {
9286
                /* csr extension is not zero */
9287
                if (tmpSz > WOLFSSL_MAX_16BIT)
9288
                    return BUFFER_E;
9289
                extSz[extIdx] = (word16)tmpSz;
9290
9291
                ret = AllocDer(&certExts[extIdx], extSz[extIdx] + ex_offset,
9292
                                                    CERT_TYPE, ssl->heap);
9293
                if (ret < 0)
9294
                    return ret;
9295
                der = certExts[extIdx];
9296
9297
                /* write extension type */
9298
                c16toa(ext->type, der->buffer
9299
                                + OPAQUE16_LEN);
9300
                /* writes extension data length. */
9301
                c16toa(extSz[extIdx], der->buffer
9302
                            + HELLO_EXT_TYPE_SZ + OPAQUE16_LEN);
9303
                /* write extension data */
9304
                extSz[extIdx] = (word16)TLSX_CSR_Write_ex(csr,
9305
                        der->buffer + ex_offset, 0, extIdx);
9306
                /* add extension offset */
9307
                extSz[extIdx] += (word16)ex_offset;
9308
                /* extension length */
9309
                c16toa(extSz[extIdx] - OPAQUE16_LEN,
9310
                            der->buffer);
9311
            }
9312
            totalSz += extSz[extIdx];
9313
        }
9314
    }
9315
    else {
9316
        /* chain cert empty extension size */
9317
        totalSz += OPAQUE16_LEN * extSz_num;
9318
    }
9319
    return (int)totalSz;
9320
}
9321
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
9322
/* Add certificate data and empty extension to output up to the fragment size.
9323
 *
9324
 * ssl     SSL/TLS object.
9325
 * cert    The certificate data to write out.
9326
 * len     The length of the certificate data.
9327
 * extSz   Length of the extension data with the certificate.
9328
 * idx     The start of the certificate data to write out.
9329
 * fragSz  The maximum size of this fragment.
9330
 * output  The buffer to write to.
9331
 * extIdx  The index number of the extension data with the certificate
9332
 * returns the number of bytes written.
9333
 */
9334
static word32 AddCertExt(WOLFSSL* ssl, byte* cert, word32 len, word16 extSz,
9335
                         word32 idx, word32 fragSz, byte* output, word16 extIdx)
9336
113
{
9337
113
    word32 i = 0;
9338
113
    word32 copySz = min(len - idx, fragSz);
9339
9340
113
    if (idx < len) {
9341
113
        XMEMCPY(output, cert + idx, copySz);
9342
113
        i = copySz;
9343
113
        if (copySz == fragSz)
9344
0
            return i;
9345
113
    }
9346
113
    copySz = len + extSz - idx - i;
9347
9348
113
    if (extSz == OPAQUE16_LEN) {
9349
113
        if (copySz <= fragSz) {
9350
            /* Empty extension */
9351
113
            output[i++] = 0;
9352
113
            output[i++] = 0;
9353
113
        }
9354
113
    }
9355
0
    else {
9356
0
        byte* certExts = ssl->buffers.certExts[extIdx]->buffer + idx + i - len;
9357
        /* Put out as much of the extensions' data as will fit in fragment. */
9358
0
        if (copySz > fragSz - i)
9359
0
            copySz = fragSz - i;
9360
0
        XMEMCPY(output + i, certExts, copySz);
9361
0
        i += copySz;
9362
0
    }
9363
9364
113
    return i;
9365
113
}
9366
9367
#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) && !defined(NO_WOLFSSL_SERVER)
9368
static int SetupOcspResp(WOLFSSL* ssl)
9369
{
9370
    DecodedCert* cert = NULL;
9371
    CertificateStatusRequest* csr = NULL;
9372
    TLSX* extension = NULL;
9373
    int ret = 0;
9374
    OcspRequest* request = NULL;
9375
9376
    extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
9377
    if (extension == NULL)
9378
        return 0; /* peer didn't signal ocsp support */
9379
    csr = (CertificateStatusRequest*)extension->data;
9380
    if (csr == NULL)
9381
        return MEMORY_ERROR;
9382
9383
    if (SSL_CM(ssl) != NULL &&
9384
            SSL_CM(ssl)->ocsp_stapling != NULL &&
9385
            SSL_CM(ssl)->ocsp_stapling->statusCb != NULL) {
9386
        return TLSX_CSR_SetResponseWithStatusCB(ssl);
9387
    }
9388
9389
    if (ssl->buffers.certificate == NULL) {
9390
        WOLFSSL_MSG("Certificate buffer not set!");
9391
        return BUFFER_ERROR;
9392
    }
9393
    cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
9394
                                 DYNAMIC_TYPE_DCERT);
9395
    if (cert == NULL) {
9396
        return MEMORY_E;
9397
    }
9398
    InitDecodedCert(cert, ssl->buffers.certificate->buffer,
9399
                    ssl->buffers.certificate->length, ssl->heap);
9400
    ret = ParseCert(cert, CERT_TYPE, NO_VERIFY, SSL_CM(ssl));
9401
    if (ret != 0) {
9402
        FreeDecodedCert(cert);
9403
        XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
9404
        return ret;
9405
    }
9406
    ret = TLSX_CSR_InitRequest(ssl->extensions, cert, ssl->heap);
9407
    FreeDecodedCert(cert);
9408
    XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
9409
    if (ret != 0 )
9410
        return ret;
9411
9412
    request = &csr->request.ocsp[0];
9413
    ret = CreateOcspResponse(ssl, &request, &csr->responses[0]);
9414
    if (request != &csr->request.ocsp[0] &&
9415
            ssl->buffers.weOwnCert) {
9416
        /* request will be allocated in CreateOcspResponse() */
9417
        FreeOcspRequest(request);
9418
        XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
9419
    }
9420
    if (ret != 0)
9421
        return ret;
9422
9423
    if (csr->responses[0].buffer)
9424
        extension->resp = 1;
9425
#if defined(WOLFSSL_TLS_OCSP_MULTI)
9426
    /* process OCSP request in certificate chain */
9427
    if ((ret = ProcessChainOCSPRequest(ssl)) != 0) {
9428
        WOLFSSL_MSG("Process Cert Chain OCSP request failed");
9429
        WOLFSSL_ERROR_VERBOSE(ret);
9430
        return ret;
9431
    }
9432
#endif
9433
    return ret;
9434
}
9435
#endif
9436
9437
/* handle generation TLS v1.3 certificate (11) */
9438
/* Send the certificate for this end and any CAs that help with validation.
9439
 * This message is always encrypted in TLS v1.3.
9440
 *
9441
 * ssl  The SSL/TLS object.
9442
 * returns 0 on success, otherwise failure.
9443
 */
9444
static int SendTls13Certificate(WOLFSSL* ssl)
9445
{
9446
    int    ret = 0;
9447
    word32 certSz, certChainSz, headerSz, listSz, payloadSz;
9448
    word16 extSz[MAX_CERT_EXTENSIONS];
9449
    word16 extIdx = 0;
9450
    word32 maxFragment;
9451
    word32 totalextSz = 0;
9452
    word32 len = 0;
9453
    word32 idx = 0;
9454
    word32 offset = OPAQUE16_LEN;
9455
    byte*  p = NULL;
9456
    byte   certReqCtxLen = 0;
9457
    sword32 length;
9458
#ifdef WOLFSSL_POST_HANDSHAKE_AUTH
9459
    byte*  certReqCtx = NULL;
9460
#endif
9461
9462
#ifdef OPENSSL_EXTRA
9463
    WOLFSSL_X509* x509 = NULL;
9464
    WOLFSSL_EVP_PKEY* pkey = NULL;
9465
#endif
9466
9467
    WOLFSSL_START(WC_FUNC_CERTIFICATE_SEND);
9468
    WOLFSSL_ENTER("SendTls13Certificate");
9469
9470
    XMEMSET(extSz, 0, sizeof(extSz));
9471
9472
    ssl->options.buildingMsg = 1;
9473
9474
#ifdef WOLFSSL_POST_HANDSHAKE_AUTH
9475
    if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->certReqCtx != NULL) {
9476
        certReqCtxLen = ssl->certReqCtx->len;
9477
        certReqCtx = &ssl->certReqCtx->ctx;
9478
    }
9479
#endif
9480
9481
#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_CERT_SETUP_CB)
9482
    /* call client cert callback if no cert has been loaded */
9483
    if ((ssl->ctx->CBClientCert != NULL) &&
9484
        (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer)) {
9485
        ret = ssl->ctx->CBClientCert(ssl, &x509, &pkey);
9486
        if (ret == 1) {
9487
            if ((wolfSSL_CTX_use_certificate(ssl->ctx, x509) == WOLFSSL_SUCCESS) &&
9488
                (wolfSSL_CTX_use_PrivateKey(ssl->ctx, pkey) == WOLFSSL_SUCCESS)) {
9489
                ssl->options.sendVerify = SEND_CERT;
9490
            }
9491
            wolfSSL_X509_free(x509);
9492
            x509 = NULL;
9493
            wolfSSL_EVP_PKEY_free(pkey);
9494
        }
9495
    }
9496
#endif
9497
9498
    if (ssl->options.sendVerify == SEND_BLANK_CERT) {
9499
        certSz = 0;
9500
        certChainSz = 0;
9501
        headerSz = OPAQUE8_LEN + certReqCtxLen + CERT_HEADER_SZ;
9502
        length = (sword32)headerSz;
9503
        listSz = 0;
9504
    }
9505
    else {
9506
        if (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer) {
9507
            WOLFSSL_MSG("Send Cert missing certificate buffer");
9508
            return NO_CERT_ERROR;
9509
        }
9510
        /* Certificate Data */
9511
        certSz = ssl->buffers.certificate->length;
9512
        /* Cert Req Ctx Len | Cert Req Ctx | Cert List Len | Cert Data Len */
9513
        headerSz = OPAQUE8_LEN + certReqCtxLen + CERT_HEADER_SZ +
9514
                   CERT_HEADER_SZ;
9515
        /* set empty extension as default */
9516
        for (extIdx = 0; extIdx < (word16)XELEM_CNT(extSz); extIdx++)
9517
            extSz[extIdx] = OPAQUE16_LEN;
9518
9519
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) && !defined(NO_WOLFSSL_SERVER)
9520
        /* We only send CSR on the server side. On client side, the CSR data
9521
         * is populated with the server response. We would be sending the server
9522
         * its own stapling data. */
9523
        if (ssl->options.side == WOLFSSL_SERVER_END) {
9524
            ret = SetupOcspResp(ssl);
9525
            if (ret != 0)
9526
                return ret;
9527
9528
            if ((1 + ssl->buffers.certChainCnt) > MAX_CERT_EXTENSIONS)
9529
                ret = MAX_CERT_EXTENSIONS_ERR;
9530
            if (ret == 0)
9531
                ret = WriteCSRToBuffer(ssl, &ssl->buffers.certExts[0], &extSz[0],
9532
                        1 /* +1 for leaf */ + (word16)ssl->buffers.certChainCnt);
9533
            if (ret < 0)
9534
                return ret;
9535
            totalextSz += ret;
9536
            ret = 0; /* Clear to signal no error */
9537
        }
9538
        else
9539
    #endif
9540
        {
9541
            /* Leaf cert empty extension size */
9542
            totalextSz += OPAQUE16_LEN;
9543
            /* chain cert empty extension size */
9544
            totalextSz += OPAQUE16_LEN * ssl->buffers.certChainCnt;
9545
        }
9546
9547
        /* Length of message data with one certificate and extensions. */
9548
        length = (sword32)(headerSz + certSz + totalextSz);
9549
        /* Length of list data with one certificate and extensions. */
9550
        listSz = CERT_HEADER_SZ + certSz + totalextSz;
9551
9552
        /* Send rest of chain if sending cert (chain has leading size/s). */
9553
        if (certSz > 0 && ssl->buffers.certChainCnt > 0) {
9554
            p = ssl->buffers.certChain->buffer;
9555
            /* Chain length including extensions. */
9556
            certChainSz = ssl->buffers.certChain->length;
9557
9558
            length += certChainSz;
9559
            listSz += certChainSz;
9560
        }
9561
        else
9562
            certChainSz = 0;
9563
    }
9564
9565
    payloadSz = (word32)length;
9566
9567
    if (ssl->fragOffset != 0)
9568
        length -= (ssl->fragOffset + headerSz);
9569
9570
    maxFragment = (word32)wolfssl_local_GetMaxPlaintextSize(ssl);
9571
9572
    extIdx = 0;
9573
9574
    while (length > 0 && ret == 0) {
9575
        byte*  output = NULL;
9576
        word32 fragSz = 0;
9577
        word32 i = RECORD_HEADER_SZ;
9578
        int    sendSz = RECORD_HEADER_SZ;
9579
9580
#ifdef WOLFSSL_DTLS13
9581
        if (ssl->options.dtls) {
9582
            i = Dtls13GetRlHeaderLength(ssl, 1);
9583
            sendSz = (int)i;
9584
        }
9585
#endif /* WOLFSSL_DTLS13 */
9586
9587
        if (ssl->fragOffset == 0) {
9588
            if (headerSz + certSz + totalextSz + certChainSz <=
9589
                                            maxFragment - HANDSHAKE_HEADER_SZ) {
9590
                fragSz = headerSz + certSz + totalextSz + certChainSz;
9591
            }
9592
#ifdef WOLFSSL_DTLS13
9593
            else if (ssl->options.dtls){
9594
                /* short-circuit the fragmentation logic here. DTLS
9595
                   fragmentation will be done in dtls13HandshakeSend() */
9596
                fragSz = headerSz + certSz + totalextSz + certChainSz;
9597
            }
9598
#endif /* WOLFSSL_DTLS13 */
9599
            else {
9600
                fragSz = maxFragment - HANDSHAKE_HEADER_SZ;
9601
            }
9602
9603
            sendSz += fragSz + HANDSHAKE_HEADER_SZ;
9604
            i += HANDSHAKE_HEADER_SZ;
9605
#ifdef WOLFSSL_DTLS13
9606
            if (ssl->options.dtls) {
9607
                sendSz += DTLS_HANDSHAKE_EXTRA;
9608
                i += DTLS_HANDSHAKE_EXTRA;
9609
            }
9610
#endif /* WOLFSSL_DTLS13 */
9611
        }
9612
        else {
9613
            fragSz = min((word32)length, maxFragment);
9614
            sendSz += fragSz;
9615
        }
9616
9617
        sendSz += MAX_MSG_EXTRA;
9618
9619
        /* Check buffers are big enough and grow if needed. */
9620
        if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
9621
            return ret;
9622
9623
        /* Get position in output buffer to write new message to. */
9624
        output = GetOutputBuffer(ssl);
9625
9626
        if (ssl->fragOffset == 0) {
9627
            AddTls13FragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
9628
9629
            /* Request context. */
9630
            output[i++] = certReqCtxLen;
9631
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
9632
            if (certReqCtxLen > 0) {
9633
                XMEMCPY(output + i, certReqCtx, certReqCtxLen);
9634
                i += certReqCtxLen;
9635
            }
9636
        #endif
9637
            length -= OPAQUE8_LEN + certReqCtxLen;
9638
            fragSz -= OPAQUE8_LEN + certReqCtxLen;
9639
            /* Certificate list length. */
9640
            c32to24(listSz, output + i);
9641
            i += CERT_HEADER_SZ;
9642
            length -= CERT_HEADER_SZ;
9643
            fragSz -= CERT_HEADER_SZ;
9644
            /* Leaf certificate data length. */
9645
            if (certSz > 0) {
9646
                c32to24(certSz, output + i);
9647
                i += CERT_HEADER_SZ;
9648
                length -= CERT_HEADER_SZ;
9649
                fragSz -= CERT_HEADER_SZ;
9650
            }
9651
        }
9652
        else
9653
            AddTls13RecordHeader(output, fragSz, handshake, ssl);
9654
9655
        if (extIdx == 0) {
9656
            if (certSz > 0 && ssl->fragOffset < certSz + extSz[0]) {
9657
                /* Put in the leaf certificate with extensions. */
9658
                word32 copySz = AddCertExt(ssl, ssl->buffers.certificate->buffer,
9659
                                certSz, extSz[0], ssl->fragOffset, fragSz,
9660
                                output + i, 0);
9661
                i += copySz;
9662
                ssl->fragOffset += copySz;
9663
                length -= copySz;
9664
                fragSz -= copySz;
9665
                if (ssl->fragOffset == certSz + extSz[0])
9666
                    FreeDer(&ssl->buffers.certExts[0]);
9667
            }
9668
        }
9669
        if (certChainSz > 0 && fragSz > 0) {
9670
             /* Put in the CA certificates with extensions. */
9671
             while (fragSz > 0) {
9672
                word32 l;
9673
9674
                if (offset == len + OPAQUE16_LEN) {
9675
                    /* Find next CA certificate to write out. */
9676
                    offset = 0;
9677
                    /* Point to the start of current cert in chain buffer. */
9678
                    p = ssl->buffers.certChain->buffer + idx;
9679
                    len = NextCert(ssl->buffers.certChain->buffer,
9680
                            ssl->buffers.certChain->length, &idx);
9681
                    if (len == 0)
9682
                        break;
9683
                #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) && \
9684
                        !defined(NO_WOLFSSL_SERVER)
9685
                    if (extIdx + 1 < MAX_CERT_EXTENSIONS)
9686
                        extIdx++;
9687
                #endif
9688
                }
9689
                /* Write out certificate and extension. */
9690
                l = AddCertExt(ssl, p, len, extSz[extIdx], offset, fragSz,
9691
                                                       output + i, extIdx);
9692
                i += l;
9693
                ssl->fragOffset += l;
9694
                length -= l;
9695
                fragSz -= l;
9696
                offset += l;
9697
9698
                if (extIdx != 0 && extIdx < MAX_CERT_EXTENSIONS &&
9699
                    ssl->buffers.certExts[extIdx] != NULL &&
9700
                                offset == len + extSz[extIdx]) {
9701
                    FreeDer(&ssl->buffers.certExts[extIdx]);
9702
                    /* for next chain cert */
9703
                    len += extSz[extIdx] - OPAQUE16_LEN;
9704
                }
9705
            }
9706
        }
9707
9708
        if ((int)i - RECORD_HEADER_SZ < 0) {
9709
            WOLFSSL_MSG("Send Cert bad inputSz");
9710
            return BUFFER_E;
9711
        }
9712
9713
#ifdef WOLFSSL_DTLS13
9714
        if (ssl->options.dtls) {
9715
            /* DTLS1.3 uses a separate variable and logic for fragments */
9716
            ssl->options.buildingMsg = 0;
9717
            ssl->fragOffset = 0;
9718
            if ((word32)sendSz > WOLFSSL_MAX_16BIT || i > WOLFSSL_MAX_16BIT) {
9719
                WOLFSSL_MSG("Send Cert DTLS size exceeds word16");
9720
                return BUFFER_E;
9721
            }
9722
            ret = Dtls13HandshakeSend(ssl, output, (word16)sendSz, (word16)i,
9723
                                      certificate, 1);
9724
        }
9725
        else
9726
#endif /* WOLFSSL_DTLS13 */
9727
        {
9728
            /* This message is always encrypted. */
9729
            sendSz = BuildTls13Message(ssl, output, sendSz,
9730
                output + RECORD_HEADER_SZ, (int)(i - RECORD_HEADER_SZ),
9731
                handshake, 1,
9732
                0, 0);
9733
            if (sendSz < 0)
9734
                return sendSz;
9735
9736
#if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
9737
            if (ssl->hsInfoOn)
9738
                AddPacketName(ssl, "Certificate");
9739
            if (ssl->toInfoOn) {
9740
                ret = AddPacketInfo(ssl, "Certificate", handshake, output,
9741
                              sendSz, WRITE_PROTO, 0, ssl->heap);
9742
                if (ret != 0)
9743
                    return ret;
9744
            }
9745
#endif
9746
9747
            ssl->buffers.outputBuffer.length += (word32)sendSz;
9748
            ssl->options.buildingMsg = 0;
9749
            if (!ssl->options.groupMessages)
9750
                ret = SendBuffered(ssl);
9751
        }
9752
    }
9753
9754
    if (ret != WC_NO_ERR_TRACE(WANT_WRITE)) {
9755
        /* Clean up the fragment offset. */
9756
        ssl->options.buildingMsg = 0;
9757
        ssl->fragOffset = 0;
9758
        if (ssl->options.side == WOLFSSL_SERVER_END)
9759
            ssl->options.serverState = SERVER_CERT_COMPLETE;
9760
    }
9761
9762
#ifdef WOLFSSL_POST_HANDSHAKE_AUTH
9763
    if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->certReqCtx != NULL) {
9764
        CertReqCtx* ctx = ssl->certReqCtx;
9765
        ssl->certReqCtx = ssl->certReqCtx->next;
9766
        XFREE(ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
9767
    }
9768
#endif
9769
9770
    WOLFSSL_LEAVE("SendTls13Certificate", ret);
9771
    WOLFSSL_END(WC_FUNC_CERTIFICATE_SEND);
9772
9773
    return ret;
9774
}
9775
9776
#if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
9777
     defined(HAVE_ED448) || defined(HAVE_FALCON) || \
9778
     defined(HAVE_DILITHIUM)) && \
9779
    (!defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH))
9780
typedef struct Scv13Args {
9781
    byte*  output; /* not allocated */
9782
    byte*  verify; /* not allocated */
9783
    word32 idx;
9784
    word32 sigLen;
9785
    int    sendSz;
9786
    word16 length;
9787
9788
    byte   sigAlgo;
9789
    byte*  sigData;
9790
    word16 sigDataSz;
9791
#ifndef NO_RSA
9792
    byte*  toSign; /* not allocated */
9793
    word32 toSignSz;
9794
#endif
9795
#ifdef WOLFSSL_DUAL_ALG_CERTS
9796
    byte   altSigAlgo;
9797
    word32 altSigLen;    /* Only used in the case of both native and alt. */
9798
    byte*  altSigData;
9799
    word16 altSigDataSz;
9800
#endif
9801
} Scv13Args;
9802
9803
static void FreeScv13Args(WOLFSSL* ssl, void* pArgs)
9804
113
{
9805
113
    Scv13Args* args = (Scv13Args*)pArgs;
9806
9807
113
    (void)ssl;
9808
9809
113
    if (args && args->sigData) {
9810
113
        XFREE(args->sigData, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
9811
113
        args->sigData = NULL;
9812
113
    }
9813
#ifdef WOLFSSL_DUAL_ALG_CERTS
9814
    if (args && args->altSigData != NULL) {
9815
        XFREE(args->altSigData, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
9816
        args->altSigData = NULL;
9817
    }
9818
#endif
9819
113
}
9820
9821
/* handle generation TLS v1.3 certificate_verify (15) */
9822
/* Send the TLS v1.3 CertificateVerify message.
9823
 * A hash of all the message so far is used.
9824
 * The signed data is:
9825
 *     0x20 * 64 | context string | 0x00 | hash of messages
9826
 * This message is always encrypted in TLS v1.3.
9827
 *
9828
 * ssl  The SSL/TLS object.
9829
 * returns 0 on success, otherwise failure.
9830
 */
9831
static int SendTls13CertificateVerify(WOLFSSL* ssl)
9832
{
9833
    int ret = 0;
9834
#ifndef NO_RSA
9835
    /* Use this as a temporary buffer for RSA signature verification. */
9836
    buffer* rsaSigBuf = &ssl->buffers.sig;
9837
#endif
9838
#ifdef WOLFSSL_ASYNC_CRYPT
9839
    Scv13Args* args = NULL;
9840
    WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
9841
#else
9842
    Scv13Args  args[1];
9843
#endif
9844
9845
#ifdef WOLFSSL_DTLS13
9846
    int recordLayerHdrExtra;
9847
#endif /* WOLFSSL_DTLS13 */
9848
9849
    WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_SEND);
9850
    WOLFSSL_ENTER("SendTls13CertificateVerify");
9851
9852
#ifdef WOLFSSL_BLIND_PRIVATE_KEY
9853
    wolfssl_priv_der_blind_toggle(ssl->buffers.key, ssl->buffers.keyMask);
9854
#endif
9855
9856
    ssl->options.buildingMsg = 1;
9857
9858
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
9859
    ret = tsip_Tls13SendCertVerify(ssl);
9860
    if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
9861
        goto exit_scv;
9862
    }
9863
    ret = 0;
9864
#endif /* WOLFSSL_RENESAS_TSIP_TLS */
9865
9866
#ifdef WOLFSSL_DTLS13
9867
    /* can be negative */
9868
    if (ssl->options.dtls)
9869
        recordLayerHdrExtra = Dtls13GetRlHeaderLength(ssl, 1) - RECORD_HEADER_SZ;
9870
    else
9871
        recordLayerHdrExtra = 0;
9872
9873
#endif /* WOLFSSL_DTLS13 */
9874
9875
#ifdef WOLFSSL_ASYNC_CRYPT
9876
    if (ssl->async == NULL) {
9877
        ssl->async = (struct WOLFSSL_ASYNC*)
9878
                XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
9879
                        DYNAMIC_TYPE_ASYNC);
9880
        if (ssl->async == NULL)
9881
            ERROR_OUT(MEMORY_E, exit_scv);
9882
    }
9883
    args = (Scv13Args*)ssl->async->args;
9884
9885
    ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
9886
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
9887
        /* Check for error */
9888
        if (ret < 0)
9889
            goto exit_scv;
9890
    }
9891
    else
9892
#endif
9893
    {
9894
        /* Reset state */
9895
        ret = 0;
9896
        ssl->options.asyncState = TLS_ASYNC_BEGIN;
9897
        XMEMSET(args, 0, sizeof(Scv13Args));
9898
    #ifdef WOLFSSL_ASYNC_CRYPT
9899
        ssl->async->freeArgs = FreeScv13Args;
9900
    #endif
9901
    }
9902
9903
    switch(ssl->options.asyncState)
9904
    {
9905
        case TLS_ASYNC_BEGIN:
9906
        {
9907
            if (ssl->options.sendVerify == SEND_BLANK_CERT) {
9908
            #ifdef WOLFSSL_BLIND_PRIVATE_KEY
9909
                wolfssl_priv_der_blind_toggle(ssl->buffers.key,
9910
                    ssl->buffers.keyMask);
9911
            #endif
9912
                return 0;  /* sent blank cert, can't verify */
9913
            }
9914
9915
            args->sendSz = WC_MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA;
9916
            /* Always encrypted.  */
9917
            args->sendSz += MAX_MSG_EXTRA;
9918
9919
            /* check for available size */
9920
            if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
9921
                goto exit_scv;
9922
            }
9923
9924
            /* get output buffer */
9925
            args->output = GetOutputBuffer(ssl);
9926
9927
            /* Advance state and proceed */
9928
            ssl->options.asyncState = TLS_ASYNC_BUILD;
9929
        } /* case TLS_ASYNC_BEGIN */
9930
        FALL_THROUGH;
9931
9932
        case TLS_ASYNC_BUILD:
9933
        {
9934
            int rem = (int)(ssl->buffers.outputBuffer.bufferSize
9935
              - ssl->buffers.outputBuffer.length
9936
              - RECORD_HEADER_SZ - HANDSHAKE_HEADER_SZ);
9937
9938
            /* idx is used to track verify pointer offset to output */
9939
            args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
9940
            args->verify =
9941
                          &args->output[RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ];
9942
9943
#ifdef WOLFSSL_DTLS13
9944
            if (ssl->options.dtls) {
9945
                rem -= recordLayerHdrExtra + DTLS_HANDSHAKE_EXTRA;
9946
                args->idx += recordLayerHdrExtra + DTLS_HANDSHAKE_EXTRA;
9947
                args->verify += recordLayerHdrExtra + DTLS_HANDSHAKE_EXTRA;
9948
            }
9949
#endif /* WOLFSSL_DTLS13 */
9950
9951
            if (ssl->buffers.key == NULL) {
9952
            #ifdef HAVE_PK_CALLBACKS
9953
                if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
9954
                    args->sigLen = (word16)GetPrivateKeySigSize(ssl);
9955
                else
9956
            #endif
9957
                    ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
9958
            }
9959
            else {
9960
#ifdef WOLFSSL_DUAL_ALG_CERTS
9961
                if (ssl->sigSpec != NULL &&
9962
                    *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_ALTERNATIVE) {
9963
                    /* In the case of alternative, we swap in the alt. */
9964
                    if (ssl->buffers.altKey == NULL) {
9965
                        ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
9966
                    }
9967
                    ssl->buffers.keyType = ssl->buffers.altKeyType;
9968
                    ssl->buffers.keySz = ssl->buffers.altKeySz;
9969
                    /* If we own it, free key before overriding it. */
9970
                    if (ssl->buffers.weOwnKey) {
9971
                        FreeDer(&ssl->buffers.key);
9972
                    #ifdef WOLFSSL_BLIND_PRIVATE_KEY
9973
                        FreeDer(&ssl->buffers.keyMask);
9974
                    #endif
9975
                    }
9976
9977
                    /* Swap keys */
9978
                    ssl->buffers.key     = ssl->buffers.altKey;
9979
                    ssl->buffers.weOwnKey = ssl->buffers.weOwnAltKey;
9980
9981
                #ifdef WOLFSSL_BLIND_PRIVATE_KEY
9982
                    ssl->buffers.keyMask = ssl->buffers.altKeyMask;
9983
                    /* Unblind the alternative key before decoding */
9984
                    wolfssl_priv_der_blind_toggle(ssl->buffers.key, ssl->buffers.keyMask);
9985
                #endif
9986
                }
9987
#endif /* WOLFSSL_DUAL_ALG_CERTS */
9988
                ret = DecodePrivateKey(ssl, &args->sigLen);
9989
                if (ret != 0)
9990
                    goto exit_scv;
9991
            }
9992
9993
            if (rem < 0 || (int)args->sigLen > rem) {
9994
                ERROR_OUT(BUFFER_E, exit_scv);
9995
            }
9996
9997
            if (args->sigLen == 0) {
9998
                ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
9999
            }
10000
10001
            /* Add signature algorithm. */
10002
            if (ssl->hsType == DYNAMIC_TYPE_RSA)
10003
                args->sigAlgo = rsa_pss_sa_algo;
10004
        #ifdef HAVE_ECC
10005
            else if (ssl->hsType == DYNAMIC_TYPE_ECC) {
10006
        #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
10007
                if (ssl->buffers.keyType == sm2_sa_algo) {
10008
                    args->sigAlgo = sm2_sa_algo;
10009
                }
10010
                else
10011
        #endif
10012
                {
10013
                    args->sigAlgo = ecc_dsa_sa_algo;
10014
                }
10015
            }
10016
        #endif
10017
        #ifdef HAVE_ED25519
10018
            else if (ssl->hsType == DYNAMIC_TYPE_ED25519)
10019
                args->sigAlgo = ed25519_sa_algo;
10020
        #endif
10021
        #ifdef HAVE_ED448
10022
            else if (ssl->hsType == DYNAMIC_TYPE_ED448)
10023
                args->sigAlgo = ed448_sa_algo;
10024
        #endif
10025
        #if defined(HAVE_FALCON)
10026
            else if (ssl->hsType == DYNAMIC_TYPE_FALCON) {
10027
                args->sigAlgo = ssl->buffers.keyType;
10028
            }
10029
        #endif /* HAVE_FALCON */
10030
        #if defined(HAVE_DILITHIUM)
10031
            else if (ssl->hsType == DYNAMIC_TYPE_DILITHIUM) {
10032
                args->sigAlgo = ssl->buffers.keyType;
10033
            }
10034
        #endif /* HAVE_DILITHIUM */
10035
            else {
10036
                ERROR_OUT(ALGO_ID_E, exit_scv);
10037
            }
10038
10039
        #ifdef WOLFSSL_DUAL_ALG_CERTS
10040
            if (ssl->peerSigSpec == NULL) {
10041
                /* The peer did not respond. We didn't send CKS or they don't
10042
                 * support it. Either way, we do not need to handle dual
10043
                 * key/sig case. */
10044
                ssl->sigSpec = NULL;
10045
                ssl->sigSpecSz = 0;
10046
            }
10047
10048
            if (ssl->sigSpec != NULL &&
10049
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
10050
                /* The native was already decoded. Now we need to do the
10051
                 * alternative. Note that no swap was done because this case is
10052
                 * both native and alternative, not just alternative. */
10053
                if (ssl->buffers.altKey == NULL) {
10054
                    ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
10055
                }
10056
10057
                /* After this call, args->altSigLen has the length we need for
10058
                 * the alternative signature. */
10059
                ret = DecodeAltPrivateKey(ssl, &args->altSigLen);
10060
                if (ret != 0)
10061
                    goto exit_scv;
10062
10063
                if (ssl->buffers.altKeyType == ecc_dsa_sa_algo ||
10064
                    ssl->buffers.altKeyType == falcon_level1_sa_algo ||
10065
                    ssl->buffers.altKeyType == falcon_level5_sa_algo ||
10066
                    ssl->buffers.altKeyType == dilithium_level2_sa_algo ||
10067
                    ssl->buffers.altKeyType == dilithium_level3_sa_algo ||
10068
                    ssl->buffers.altKeyType == dilithium_level5_sa_algo) {
10069
                    args->altSigAlgo = ssl->buffers.altKeyType;
10070
                }
10071
                else if (ssl->buffers.altKeyType == rsa_sa_algo &&
10072
                         ssl->hsAltType == DYNAMIC_TYPE_RSA) {
10073
                    args->altSigAlgo = rsa_pss_sa_algo;
10074
                }
10075
                else {
10076
                    ERROR_OUT(ALGO_ID_E, exit_scv);
10077
                }
10078
10079
                EncodeDualSigAlg(args->sigAlgo, args->altSigAlgo, args->verify);
10080
                if (args->verify[0] == 0) {
10081
                    ERROR_OUT(ALGO_ID_E, exit_scv);
10082
                }
10083
            }
10084
            else
10085
        #endif /* WOLFSSL_DUAL_ALG_CERTS */
10086
                EncodeSigAlg(ssl, ssl->options.hashAlgo, args->sigAlgo,
10087
                             args->verify);
10088
10089
            if (args->sigData == NULL) {
10090
                word32 sigLen = MAX_SIG_DATA_SZ;
10091
                if ((ssl->hsType == DYNAMIC_TYPE_RSA) &&
10092
                    (args->sigLen > MAX_SIG_DATA_SZ)) {
10093
                    /* We store the RSA signature in the sigData buffer
10094
                     * temporarily, hence its size must be fitting. */
10095
                    sigLen = args->sigLen;
10096
                }
10097
                args->sigData = (byte*)XMALLOC(sigLen, ssl->heap,
10098
                                                    DYNAMIC_TYPE_SIGNATURE);
10099
                if (args->sigData == NULL) {
10100
                    ERROR_OUT(MEMORY_E, exit_scv);
10101
                }
10102
            }
10103
10104
        #ifdef WOLFSSL_DUAL_ALG_CERTS
10105
            if ((ssl->sigSpec != NULL) &&
10106
                (*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) &&
10107
                (args->altSigData == NULL)) {
10108
                word32 sigLen = MAX_SIG_DATA_SZ;
10109
                if (ssl->hsAltType == DYNAMIC_TYPE_RSA &&
10110
                    args->altSigLen > MAX_SIG_DATA_SZ) {
10111
                    /* We store the RSA signature in the sigData buffer
10112
                     * temporarily, hence its size must be fitting. */
10113
                    sigLen = args->altSigLen;
10114
                }
10115
                args->altSigData = (byte*)XMALLOC(sigLen, ssl->heap,
10116
                                                    DYNAMIC_TYPE_SIGNATURE);
10117
                if (args->altSigData == NULL) {
10118
                    ERROR_OUT(MEMORY_E, exit_scv);
10119
                }
10120
            }
10121
        #endif /* WOLFSSL_DUAL_ALG_CERTS */
10122
10123
            /* Create the data to be signed. */
10124
            ret = CreateSigData(ssl, args->sigData, &args->sigDataSz, 0);
10125
            if (ret != 0)
10126
                goto exit_scv;
10127
10128
        #ifdef WOLFSSL_DUAL_ALG_CERTS
10129
            if ((ssl->sigSpec != NULL) &&
10130
                (*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH)) {
10131
                XMEMCPY(args->altSigData, args->sigData, args->sigDataSz);
10132
                args->altSigDataSz = args->sigDataSz;
10133
            }
10134
        #endif /* WOLFSSL_DUAL_ALG_CERTS */
10135
10136
        #ifndef NO_RSA
10137
            if (ssl->hsType == DYNAMIC_TYPE_RSA) {
10138
                /* build encoded signature buffer */
10139
                rsaSigBuf->length = WC_MAX_DIGEST_SIZE;
10140
                rsaSigBuf->buffer = (byte*)XMALLOC(rsaSigBuf->length, ssl->heap,
10141
                                                   DYNAMIC_TYPE_SIGNATURE);
10142
                if (rsaSigBuf->buffer == NULL) {
10143
                    ERROR_OUT(MEMORY_E, exit_scv);
10144
                }
10145
10146
                ret = CreateRSAEncodedSig(rsaSigBuf->buffer, args->sigData,
10147
                    args->sigDataSz, args->sigAlgo, ssl->options.hashAlgo);
10148
                if (ret < 0)
10149
                    goto exit_scv;
10150
                rsaSigBuf->length = (unsigned int)ret;
10151
                ret = 0;
10152
            }
10153
        #endif /* !NO_RSA */
10154
        #ifdef HAVE_ECC
10155
            if (ssl->hsType == DYNAMIC_TYPE_ECC) {
10156
                args->sigLen = (word32)args->sendSz - args->idx -
10157
                               HASH_SIG_SIZE -
10158
                               VERIFY_HEADER;
10159
            #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
10160
                if (ssl->buffers.keyType != sm2_sa_algo)
10161
            #endif
10162
                {
10163
                    ret = CreateECCEncodedSig(args->sigData,
10164
                        args->sigDataSz, ssl->options.hashAlgo);
10165
                    if (ret < 0)
10166
                        goto exit_scv;
10167
                    args->sigDataSz = (word16)ret;
10168
                    ret = 0;
10169
                }
10170
            }
10171
        #endif /* HAVE_ECC */
10172
        #ifdef HAVE_ED25519
10173
            if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
10174
                ret = Ed25519CheckPubKey(ssl);
10175
                if (ret < 0) {
10176
                    ERROR_OUT(ret, exit_scv);
10177
                }
10178
                args->sigLen = ED25519_SIG_SIZE;
10179
            }
10180
        #endif /* HAVE_ED25519 */
10181
        #ifdef HAVE_ED448
10182
            if (ssl->hsType == DYNAMIC_TYPE_ED448) {
10183
                ret = Ed448CheckPubKey(ssl);
10184
                if (ret < 0) {
10185
                    ERROR_OUT(ret, exit_scv);
10186
                }
10187
                args->sigLen = ED448_SIG_SIZE;
10188
            }
10189
10190
        #endif /* HAVE_ED448 */
10191
        #if defined(HAVE_FALCON)
10192
            if (ssl->hsType == DYNAMIC_TYPE_FALCON) {
10193
                args->sigLen = FALCON_MAX_SIG_SIZE;
10194
            }
10195
        #endif /* HAVE_FALCON */
10196
        #if defined(HAVE_DILITHIUM)
10197
            if (ssl->hsType == DYNAMIC_TYPE_DILITHIUM) {
10198
                args->sigLen = DILITHIUM_MAX_SIG_SIZE;
10199
            }
10200
        #endif /* HAVE_DILITHIUM */
10201
10202
        #ifdef WOLFSSL_DUAL_ALG_CERTS
10203
            if (ssl->sigSpec != NULL &&
10204
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
10205
10206
            #ifndef NO_RSA
10207
                if (ssl->hsAltType == DYNAMIC_TYPE_RSA) {
10208
                    /* build encoded signature buffer */
10209
                    XFREE(rsaSigBuf->buffer, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
10210
                    rsaSigBuf->length = WC_MAX_DIGEST_SIZE;
10211
                    rsaSigBuf->buffer = (byte*)XMALLOC(rsaSigBuf->length,
10212
                                                       ssl->heap,
10213
                                                       DYNAMIC_TYPE_SIGNATURE);
10214
                    if (rsaSigBuf->buffer == NULL) {
10215
                        ERROR_OUT(MEMORY_E, exit_scv);
10216
                    }
10217
10218
                    ret = CreateRSAEncodedSig(rsaSigBuf->buffer,
10219
                                    args->altSigData, args->altSigDataSz,
10220
                                    args->altSigAlgo, ssl->options.hashAlgo);
10221
                    if (ret < 0)
10222
                        goto exit_scv;
10223
                    rsaSigBuf->length = ret;
10224
                    ret = 0;
10225
                }
10226
            #endif /* !NO_RSA */
10227
            #ifdef HAVE_ECC
10228
                if (ssl->hsAltType == DYNAMIC_TYPE_ECC) {
10229
                    ret = CreateECCEncodedSig(args->altSigData,
10230
                            args->altSigDataSz, ssl->options.hashAlgo);
10231
                    if (ret < 0)
10232
                        goto exit_scv;
10233
                    args->altSigDataSz = (word16)ret;
10234
                    ret = 0;
10235
                }
10236
            #endif /* HAVE_ECC */
10237
            }
10238
        #endif /* WOLFSSL_DUAL_ALG_CERTS */
10239
10240
            /* Advance state and proceed */
10241
            ssl->options.asyncState = TLS_ASYNC_DO;
10242
        } /* case TLS_ASYNC_BUILD */
10243
        FALL_THROUGH;
10244
10245
        case TLS_ASYNC_DO:
10246
        {
10247
            byte* sigOut = args->verify + HASH_SIG_SIZE + VERIFY_HEADER;
10248
        #ifdef WOLFSSL_DUAL_ALG_CERTS
10249
            if (ssl->sigSpec != NULL &&
10250
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
10251
                /* As we have two signatures in the message, we store
10252
                 * the length of each before the actual signature. This
10253
                 * is necessary, as we could have two algorithms with
10254
                 * variable length signatures. */
10255
                sigOut += OPAQUE16_LEN;
10256
            }
10257
        #endif
10258
        #ifdef HAVE_ECC
10259
            if (ssl->hsType == DYNAMIC_TYPE_ECC) {
10260
            #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
10261
                if (ssl->buffers.keyType == sm2_sa_algo) {
10262
                    ret = Sm2wSm3Sign(ssl, TLS13_SM2_SIG_ID,
10263
                        TLS13_SM2_SIG_ID_SZ, args->sigData, args->sigDataSz,
10264
                        sigOut, &args->sigLen, (ecc_key*)ssl->hsKey, NULL);
10265
                }
10266
                else
10267
            #endif
10268
                {
10269
                    ret = EccSign(ssl, args->sigData, args->sigDataSz,
10270
                        sigOut, &args->sigLen, (ecc_key*)ssl->hsKey,
10271
                #ifdef HAVE_PK_CALLBACKS
10272
                        ssl->buffers.key
10273
                #else
10274
                        NULL
10275
                #endif
10276
                    );
10277
                }
10278
                args->length = (word16)args->sigLen;
10279
            }
10280
        #endif /* HAVE_ECC */
10281
        #ifdef HAVE_ED25519
10282
            if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
10283
                ret = Ed25519Sign(ssl, args->sigData, args->sigDataSz,
10284
                    sigOut, &args->sigLen, (ed25519_key*)ssl->hsKey,
10285
            #ifdef HAVE_PK_CALLBACKS
10286
                    ssl->buffers.key
10287
            #else
10288
                    NULL
10289
            #endif
10290
                );
10291
                args->length = (word16)args->sigLen;
10292
            }
10293
        #endif
10294
        #ifdef HAVE_ED448
10295
            if (ssl->hsType == DYNAMIC_TYPE_ED448) {
10296
                ret = Ed448Sign(ssl, args->sigData, args->sigDataSz,
10297
                    sigOut, &args->sigLen, (ed448_key*)ssl->hsKey,
10298
            #ifdef HAVE_PK_CALLBACKS
10299
                    ssl->buffers.key
10300
            #else
10301
                    NULL
10302
            #endif
10303
                );
10304
                args->length = (word16)args->sigLen;
10305
            }
10306
        #endif
10307
        #if defined(HAVE_FALCON)
10308
            if (ssl->hsType == DYNAMIC_TYPE_FALCON) {
10309
                ret = wc_falcon_sign_msg(args->sigData, args->sigDataSz,
10310
                                         sigOut, &args->sigLen,
10311
                                         (falcon_key*)ssl->hsKey, ssl->rng);
10312
                args->length = (word16)args->sigLen;
10313
            }
10314
        #endif /* HAVE_FALCON */
10315
        #if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_SIGN)
10316
            if (ssl->hsType == DYNAMIC_TYPE_DILITHIUM) {
10317
                ret = wc_dilithium_sign_ctx_msg(NULL, 0, args->sigData,
10318
                                                args->sigDataSz, sigOut,
10319
                                                &args->sigLen,
10320
                                                (dilithium_key*)ssl->hsKey,
10321
                                                ssl->rng);
10322
                args->length = (word16)args->sigLen;
10323
            }
10324
        #endif /* HAVE_DILITHIUM */
10325
        #if !defined(NO_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY) && \
10326
            !defined(WOLFSSL_RSA_VERIFY_ONLY)
10327
            if (ssl->hsType == DYNAMIC_TYPE_RSA) {
10328
                args->toSign = rsaSigBuf->buffer;
10329
                args->toSignSz = (word32)rsaSigBuf->length;
10330
            #if defined(HAVE_PK_CALLBACKS) && \
10331
                defined(TLS13_RSA_PSS_SIGN_CB_NO_PREHASH)
10332
                /* Pass full data to sign (args->sigData), not hash of */
10333
                if (ssl->ctx->RsaPssSignCb) {
10334
                    args->toSign = args->sigData;
10335
                    args->toSignSz = args->sigDataSz;
10336
                }
10337
            #endif
10338
                ret = RsaSign(ssl, (const byte*)args->toSign, args->toSignSz,
10339
                              sigOut, &args->sigLen, args->sigAlgo,
10340
                              ssl->options.hashAlgo, (RsaKey*)ssl->hsKey,
10341
                              ssl->buffers.key);
10342
                if (ret == 0) {
10343
                    args->length = (word16)args->sigLen;
10344
                    XMEMCPY(args->sigData, sigOut, args->sigLen);
10345
                }
10346
            }
10347
        #endif /* !NO_RSA && !WOLFSSL_RSA_PUBLIC_ONLY && !WOLFSSL_RSA_VERIFY_ONLY */
10348
10349
            /* Check for error */
10350
            if (ret != 0) {
10351
                goto exit_scv;
10352
            }
10353
10354
        #ifdef WOLFSSL_DUAL_ALG_CERTS
10355
            if (ssl->sigSpec != NULL &&
10356
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
10357
                /* Add signature length for the first signature. */
10358
                c16toa((word16)args->sigLen, sigOut - OPAQUE16_LEN);
10359
                args->length += OPAQUE16_LEN;
10360
10361
                /* Advance our pointer to where we store the alt signature.
10362
                 * We also add additional space for the length field of the
10363
                 * second signature. */
10364
                sigOut += args->sigLen + OPAQUE16_LEN;
10365
10366
                /* Generate the alternative signature */
10367
            #ifdef HAVE_ECC
10368
                if (ssl->hsAltType == DYNAMIC_TYPE_ECC) {
10369
                    ret = EccSign(ssl, args->altSigData, args->altSigDataSz,
10370
                                  sigOut, &args->altSigLen,
10371
                                  (ecc_key*)ssl->hsAltKey,
10372
                    #ifdef HAVE_PK_CALLBACKS
10373
                                  ssl->buffers.altKey
10374
                    #else
10375
                                  NULL
10376
                    #endif
10377
                                  );
10378
                }
10379
            #endif /* HAVE_ECC */
10380
            #if !defined(NO_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY) && \
10381
                !defined(WOLFSSL_RSA_VERIFY_ONLY)
10382
                if (ssl->hsAltType == DYNAMIC_TYPE_RSA) {
10383
                    args->toSign = rsaSigBuf->buffer;
10384
                    args->toSignSz = (word32)rsaSigBuf->length;
10385
                #if defined(HAVE_PK_CALLBACKS) && \
10386
                    defined(TLS13_RSA_PSS_SIGN_CB_NO_PREHASH)
10387
                    /* Pass full data to sign (args->altSigData), not hash of */
10388
                    if (ssl->ctx->RsaPssSignCb) {
10389
                        args->toSign = args->altSigData;
10390
                        args->toSignSz = (word32)args->altSigDataSz;
10391
                    }
10392
                #endif
10393
                    ret = RsaSign(ssl, (const byte*)args->toSign,
10394
                                  args->toSignSz, sigOut, &args->altSigLen,
10395
                                  args->altSigAlgo, ssl->options.hashAlgo,
10396
                                  (RsaKey*)ssl->hsAltKey,
10397
                                  ssl->buffers.altKey);
10398
10399
                    if (ret == 0) {
10400
                        XMEMCPY(args->altSigData, sigOut, args->altSigLen);
10401
                    }
10402
                }
10403
            #endif /* !NO_RSA && !WOLFSSL_RSA_PUBLIC_ONLY && !WOLFSSL_RSA_VERIFY_ONLY */
10404
            #if defined(HAVE_FALCON)
10405
                if (ssl->hsAltType == DYNAMIC_TYPE_FALCON) {
10406
                    ret = wc_falcon_sign_msg(args->altSigData,
10407
                                             args->altSigDataSz, sigOut,
10408
                                             &args->altSigLen,
10409
                                             (falcon_key*)ssl->hsAltKey,
10410
                                             ssl->rng);
10411
                }
10412
            #endif /* HAVE_FALCON */
10413
            #if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_SIGN)
10414
                if (ssl->hsAltType == DYNAMIC_TYPE_DILITHIUM) {
10415
                    ret = wc_dilithium_sign_ctx_msg(NULL, 0, args->altSigData,
10416
                                args->altSigDataSz, sigOut, &args->altSigLen,
10417
                                (dilithium_key*)ssl->hsAltKey, ssl->rng);
10418
                }
10419
            #endif /* HAVE_DILITHIUM */
10420
10421
                /* Check for error */
10422
                if (ret != 0) {
10423
                    goto exit_scv;
10424
                }
10425
10426
                /* Add signature length for the alternative signature. */
10427
                c16toa((word16)args->altSigLen, sigOut - OPAQUE16_LEN);
10428
10429
                /* Add length of the alt sig to the total length */
10430
                args->length += args->altSigLen + OPAQUE16_LEN;
10431
            }
10432
        #endif /* WOLFSSL_DUAL_ALG_CERTS */
10433
10434
            /* Add signature length. */
10435
            c16toa(args->length, args->verify + HASH_SIG_SIZE);
10436
10437
            /* Advance state and proceed */
10438
            ssl->options.asyncState = TLS_ASYNC_VERIFY;
10439
        } /* case TLS_ASYNC_DO */
10440
        FALL_THROUGH;
10441
10442
        case TLS_ASYNC_VERIFY:
10443
        {
10444
        #ifndef NO_RSA
10445
            if (ssl->hsType == DYNAMIC_TYPE_RSA) {
10446
                /* check for signature faults */
10447
                ret = VerifyRsaSign(ssl, args->sigData, args->sigLen,
10448
                    rsaSigBuf->buffer, (word32)rsaSigBuf->length, args->sigAlgo,
10449
                    ssl->options.hashAlgo, (RsaKey*)ssl->hsKey,
10450
                    ssl->buffers.key);
10451
            }
10452
        #ifdef WOLFSSL_DUAL_ALG_CERTS
10453
            if (ssl->sigSpec != NULL &&
10454
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH &&
10455
                ssl->hsAltType == DYNAMIC_TYPE_RSA) {
10456
                /* check for signature faults */
10457
                ret = VerifyRsaSign(ssl, args->altSigData, args->altSigLen,
10458
                        rsaSigBuf->buffer, (word32)rsaSigBuf->length,
10459
                        args->altSigAlgo, ssl->options.hashAlgo,
10460
                        (RsaKey*)ssl->hsAltKey, ssl->buffers.altKey);
10461
            }
10462
        #endif /* WOLFSSL_DUAL_ALG_CERTS */
10463
        #endif /* !NO_RSA */
10464
        #if defined(HAVE_ECC) && defined(WOLFSSL_CHECK_SIG_FAULTS)
10465
            if (ssl->hsType == DYNAMIC_TYPE_ECC) {
10466
                byte* sigOut = args->verify + HASH_SIG_SIZE + VERIFY_HEADER;
10467
            #ifdef WOLFSSL_DUAL_ALG_CERTS
10468
                if (ssl->sigSpec != NULL &&
10469
                    *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
10470
                    /* Add our length offset. */
10471
                    sigOut += OPAQUE16_LEN;
10472
                }
10473
            #endif
10474
            #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
10475
                if (ssl->buffers.keyType == sm2_sa_algo) {
10476
                    ret = Sm2wSm3Verify(ssl, TLS13_SM2_SIG_ID,
10477
                        TLS13_SM2_SIG_ID_SZ,
10478
                        sigOut, args->sigLen, args->sigData, args->sigDataSz,
10479
                        (ecc_key*)ssl->hsKey, NULL);
10480
                }
10481
                else
10482
            #endif
10483
                {
10484
                #ifdef HAVE_PK_CALLBACKS
10485
                    buffer tmp;
10486
10487
                    tmp.length = ssl->buffers.key->length;
10488
                    tmp.buffer = ssl->buffers.key->buffer;
10489
                #endif
10490
                    ret = EccVerify(ssl, sigOut, args->sigLen,
10491
                            args->sigData, args->sigDataSz,
10492
                            (ecc_key*)ssl->hsKey,
10493
                #ifdef HAVE_PK_CALLBACKS
10494
                            &tmp
10495
                #else
10496
                            NULL
10497
                #endif
10498
                            );
10499
                }
10500
            }
10501
        #ifdef WOLFSSL_DUAL_ALG_CERTS
10502
            if (ssl->sigSpec != NULL &&
10503
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH &&
10504
                ssl->hsAltType == DYNAMIC_TYPE_ECC) {
10505
                /* check for signature faults */
10506
                byte* sigOut = args->verify + HASH_SIG_SIZE + VERIFY_HEADER +
10507
                                args->sigLen + OPAQUE16_LEN + OPAQUE16_LEN;
10508
            #ifdef HAVE_PK_CALLBACKS
10509
                buffer tmp;
10510
                tmp.length = ssl->buffers.altKey->length;
10511
                tmp.buffer = ssl->buffers.altKey->buffer;
10512
            #endif
10513
                ret = EccVerify(ssl, sigOut, args->altSigLen,
10514
                        args->altSigData, args->altSigDataSz,
10515
                        (ecc_key*)ssl->hsAltKey,
10516
            #ifdef HAVE_PK_CALLBACKS
10517
                        &tmp
10518
            #else
10519
                        NULL
10520
            #endif
10521
                        );
10522
            }
10523
        #endif /* WOLFSSL_DUAL_ALG_CERTS */
10524
        #endif /* HAVE_ECC && WOLFSSL_CHECK_SIG_FAULTS */
10525
10526
            /* Check for error */
10527
            if (ret != 0) {
10528
                goto exit_scv;
10529
            }
10530
10531
            /* Advance state and proceed */
10532
            ssl->options.asyncState = TLS_ASYNC_FINALIZE;
10533
        } /* case TLS_ASYNC_VERIFY */
10534
        FALL_THROUGH;
10535
10536
        case TLS_ASYNC_FINALIZE:
10537
        {
10538
            /* Put the record and handshake headers on. */
10539
            AddTls13Headers(args->output, args->length + HASH_SIG_SIZE +
10540
                            VERIFY_HEADER, certificate_verify, ssl);
10541
10542
            args->sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ +
10543
                                args->length + HASH_SIG_SIZE + VERIFY_HEADER;
10544
#ifdef WOLFSSL_DTLS13
10545
            if (ssl->options.dtls)
10546
                args->sendSz += recordLayerHdrExtra + DTLS_HANDSHAKE_EXTRA;
10547
10548
#endif /* WOLFSSL_DTLS13 */
10549
            /* Advance state and proceed */
10550
            ssl->options.asyncState = TLS_ASYNC_END;
10551
        } /* case TLS_ASYNC_FINALIZE */
10552
        FALL_THROUGH;
10553
10554
        case TLS_ASYNC_END:
10555
        {
10556
#ifdef WOLFSSL_DTLS13
10557
            if (ssl->options.dtls) {
10558
                ssl->options.buildingMsg = 0;
10559
                ret = Dtls13HandshakeSend(ssl, args->output,
10560
                    WC_MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA + MAX_MSG_EXTRA,
10561
                    (word16)args->sendSz, certificate_verify, 1);
10562
                if (ret != 0)
10563
                    goto exit_scv;
10564
10565
                break;
10566
            }
10567
#endif /* WOLFSSL_DTLS13 */
10568
10569
            /* This message is always encrypted. */
10570
            ret = BuildTls13Message(ssl, args->output,
10571
                                    WC_MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA,
10572
                                    args->output + RECORD_HEADER_SZ,
10573
                                    args->sendSz - RECORD_HEADER_SZ, handshake,
10574
                                    1, 0, 0);
10575
10576
            if (ret < 0) {
10577
                goto exit_scv;
10578
            }
10579
            else {
10580
                args->sendSz = ret;
10581
                ret = 0;
10582
            }
10583
10584
        #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
10585
            if (ssl->hsInfoOn)
10586
                AddPacketName(ssl, "CertificateVerify");
10587
            if (ssl->toInfoOn) {
10588
                ret = AddPacketInfo(ssl, "CertificateVerify", handshake,
10589
                            args->output, args->sendSz, WRITE_PROTO, 0,
10590
                            ssl->heap);
10591
                if (ret != 0)
10592
                    goto exit_scv;
10593
            }
10594
        #endif
10595
10596
            ssl->buffers.outputBuffer.length += (word32)args->sendSz;
10597
            ssl->options.buildingMsg = 0;
10598
            if (!ssl->options.groupMessages)
10599
                ret = SendBuffered(ssl);
10600
            break;
10601
        }
10602
        default:
10603
            ret = INPUT_CASE_ERROR;
10604
    } /* switch(ssl->options.asyncState) */
10605
10606
exit_scv:
10607
#ifdef WOLFSSL_BLIND_PRIVATE_KEY
10608
    if (ret == 0) {
10609
        ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.key,
10610
            &ssl->buffers.keyMask);
10611
    }
10612
    else {
10613
        wolfssl_priv_der_blind_toggle(ssl->buffers.key, ssl->buffers.keyMask);
10614
    }
10615
#endif
10616
10617
    WOLFSSL_LEAVE("SendTls13CertificateVerify", ret);
10618
    WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_SEND);
10619
10620
#ifdef WOLFSSL_ASYNC_CRYPT
10621
    /* Handle async operation */
10622
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
10623
        return ret;
10624
    }
10625
#endif /* WOLFSSL_ASYNC_CRYPT */
10626
10627
    /* Final cleanup */
10628
    FreeScv13Args(ssl, args);
10629
    FreeKeyExchange(ssl);
10630
#ifdef WOLFSSL_ASYNC_IO
10631
    /* Cleanup async */
10632
    FreeAsyncCtx(ssl, 0);
10633
#endif
10634
10635
    if (ret != 0) {
10636
        WOLFSSL_ERROR_VERBOSE(ret);
10637
    }
10638
10639
    return ret;
10640
}
10641
#endif
10642
#endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */
10643
10644
#if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
10645
/* handle processing TLS v1.3 certificate (11) */
10646
/* Parse and handle a TLS v1.3 Certificate message.
10647
 *
10648
 * ssl       The SSL/TLS object.
10649
 * input     The message buffer.
10650
 * inOutIdx  On entry, the index into the message buffer of Certificate.
10651
 *           On exit, the index of byte after the Certificate message.
10652
 * totalSz   The length of the current handshake message.
10653
 * returns 0 on success and otherwise failure.
10654
 */
10655
static int DoTls13Certificate(WOLFSSL* ssl, byte* input, word32* inOutIdx,
10656
                              word32 totalSz)
10657
0
{
10658
0
    int ret = 0;
10659
10660
0
    WOLFSSL_START(WC_FUNC_CERTIFICATE_DO);
10661
0
    WOLFSSL_ENTER("DoTls13Certificate");
10662
10663
#ifdef WOLFSSL_DTLS13
10664
    if (ssl->options.dtls && ssl->options.handShakeDone) {
10665
        /* certificate needs some special care after the handshake */
10666
        ret = Dtls13RtxProcessingCertificate(
10667
            ssl, input + *inOutIdx, totalSz);
10668
    }
10669
#endif /* WOLFSSL_DTLS13 */
10670
10671
0
    if (ret == 0)
10672
0
        ret = ProcessPeerCerts(ssl, input, inOutIdx, totalSz);
10673
0
    if (ret == 0) {
10674
0
#if !defined(NO_WOLFSSL_CLIENT)
10675
0
        if (ssl->options.side == WOLFSSL_CLIENT_END)
10676
0
            ssl->options.serverState = SERVER_CERT_COMPLETE;
10677
0
#endif
10678
#if !defined(NO_WOLFSSL_SERVER) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
10679
        if (ssl->options.side == WOLFSSL_SERVER_END &&
10680
                                ssl->options.handShakeState == HANDSHAKE_DONE) {
10681
            /* reset handshake states */
10682
            ssl->options.serverState = SERVER_FINISHED_COMPLETE;
10683
            ssl->options.acceptState  = TICKET_SENT;
10684
            ssl->options.handShakeState = SERVER_FINISHED_COMPLETE;
10685
        }
10686
#endif
10687
0
    }
10688
10689
0
    WOLFSSL_LEAVE("DoTls13Certificate", ret);
10690
0
    WOLFSSL_END(WC_FUNC_CERTIFICATE_DO);
10691
10692
0
    return ret;
10693
0
}
10694
#endif
10695
10696
#if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
10697
                                                             defined(HAVE_ED448)
10698
10699
typedef struct Dcv13Args {
10700
    byte*  output; /* not allocated */
10701
    word32 sendSz;
10702
    word16 sz;
10703
    word32 sigSz;
10704
    word32 idx;
10705
    word32 begin;
10706
10707
    byte*  sigData;
10708
    word16 sigDataSz;
10709
#ifdef WOLFSSL_DUAL_ALG_CERTS
10710
    byte   altSigAlgo;
10711
    byte*  altSigData;
10712
    word32 altSigDataSz;
10713
    word32 altSignatureSz;
10714
    byte   altPeerAuthGood;
10715
#endif
10716
} Dcv13Args;
10717
10718
static void FreeDcv13Args(WOLFSSL* ssl, void* pArgs)
10719
0
{
10720
0
    Dcv13Args* args = (Dcv13Args*)pArgs;
10721
10722
0
    if (args && args->sigData != NULL) {
10723
0
        XFREE(args->sigData, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
10724
0
        args->sigData = NULL;
10725
0
    }
10726
#ifdef WOLFSSL_DUAL_ALG_CERTS
10727
    if (args && args->altSigData != NULL) {
10728
        XFREE(args->altSigData, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
10729
        args->altSigData = NULL;
10730
    }
10731
#endif
10732
0
    (void)ssl;
10733
0
}
10734
10735
#ifdef WOLFSSL_DUAL_ALG_CERTS
10736
#ifndef NO_RSA
10737
/* ssl->peerCert->sapkiDer is the alternative public key. Hopefully it is a
10738
 * RSA public key. Convert it into a usable public key. */
10739
static int decodeRsaKey(WOLFSSL* ssl)
10740
{
10741
    int keyRet;
10742
    word32 tmpIdx = 0;
10743
10744
    if (ssl->peerRsaKeyPresent)
10745
        return INVALID_PARAMETER;
10746
10747
    keyRet = AllocKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
10748
    if (keyRet != 0)
10749
        return PEER_KEY_ERROR;
10750
10751
    ssl->peerRsaKeyPresent = 1;
10752
    keyRet = wc_RsaPublicKeyDecode(ssl->peerCert.sapkiDer, &tmpIdx,
10753
                                   ssl->peerRsaKey,
10754
                                   ssl->peerCert.sapkiLen);
10755
    if (keyRet != 0)
10756
        return PEER_KEY_ERROR;
10757
10758
    return 0;
10759
}
10760
#endif /* !NO_RSA */
10761
10762
#ifdef HAVE_ECC
10763
/* ssl->peerCert->sapkiDer is the alternative public key. Hopefully it is a
10764
 * ECC public key. Convert it into a usable public key. */
10765
static int decodeEccKey(WOLFSSL* ssl)
10766
{
10767
    int keyRet;
10768
    word32 tmpIdx = 0;
10769
10770
    if (ssl->peerEccDsaKeyPresent)
10771
        return INVALID_PARAMETER;
10772
10773
    keyRet = AllocKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
10774
    if (keyRet != 0)
10775
        return PEER_KEY_ERROR;
10776
10777
    ssl->peerEccDsaKeyPresent = 1;
10778
    keyRet = wc_EccPublicKeyDecode(ssl->peerCert.sapkiDer, &tmpIdx,
10779
                                   ssl->peerEccDsaKey,
10780
                                   ssl->peerCert.sapkiLen);
10781
    if (keyRet != 0)
10782
        return PEER_KEY_ERROR;
10783
10784
    return 0;
10785
}
10786
#endif /* HAVE_ECC */
10787
10788
#ifdef HAVE_DILITHIUM
10789
/* ssl->peerCert->sapkiDer is the alternative public key. Hopefully it is a
10790
 * dilithium public key. Convert it into a usable public key. */
10791
static int decodeDilithiumKey(WOLFSSL* ssl, int level)
10792
{
10793
    int keyRet;
10794
    word32 tmpIdx = 0;
10795
10796
    if (ssl->peerDilithiumKeyPresent)
10797
        return INVALID_PARAMETER;
10798
10799
    keyRet = AllocKey(ssl, DYNAMIC_TYPE_DILITHIUM,
10800
                      (void**)&ssl->peerDilithiumKey);
10801
    if (keyRet != 0)
10802
        return PEER_KEY_ERROR;
10803
10804
    ssl->peerDilithiumKeyPresent = 1;
10805
    keyRet = wc_dilithium_set_level(ssl->peerDilithiumKey, level);
10806
    if (keyRet != 0)
10807
        return PEER_KEY_ERROR;
10808
10809
    keyRet = wc_Dilithium_PublicKeyDecode(ssl->peerCert.sapkiDer, &tmpIdx,
10810
                                          ssl->peerDilithiumKey,
10811
                                          ssl->peerCert.sapkiLen);
10812
    if (keyRet != 0)
10813
        return PEER_KEY_ERROR;
10814
10815
    return 0;
10816
}
10817
#endif /* HAVE_DILITHIUM */
10818
10819
#ifdef HAVE_FALCON
10820
/* ssl->peerCert->sapkiDer is the alternative public key. Hopefully it is a
10821
 * falcon public key. Convert it into a usable public key. */
10822
static int decodeFalconKey(WOLFSSL* ssl, int level)
10823
{
10824
    int keyRet;
10825
    word32 tmpIdx = 0;
10826
10827
    if (ssl->peerFalconKeyPresent)
10828
        return INVALID_PARAMETER;
10829
10830
    keyRet = AllocKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey);
10831
    if (keyRet != 0)
10832
        return PEER_KEY_ERROR;
10833
10834
    ssl->peerFalconKeyPresent = 1;
10835
    keyRet = wc_falcon_set_level(ssl->peerFalconKey, level);
10836
    if (keyRet != 0)
10837
        return PEER_KEY_ERROR;
10838
10839
    keyRet = wc_Falcon_PublicKeyDecode(ssl->peerCert.sapkiDer, &tmpIdx,
10840
                                       ssl->peerFalconKey,
10841
                                       ssl->peerCert.sapkiLen);
10842
    if (keyRet != 0)
10843
        return PEER_KEY_ERROR;
10844
10845
    return 0;
10846
}
10847
#endif /* HAVE_FALCON */
10848
#endif /* WOLFSSL_DUAL_ALG_CERTS */
10849
10850
/* handle processing TLS v1.3 certificate_verify (15) */
10851
/* Parse and handle a TLS v1.3 CertificateVerify message.
10852
 *
10853
 * ssl       The SSL/TLS object.
10854
 * input     The message buffer.
10855
 * inOutIdx  On entry, the index into the message buffer of
10856
 *           CertificateVerify.
10857
 *           On exit, the index of byte after the CertificateVerify message.
10858
 * totalSz   The length of the current handshake message.
10859
 * returns 0 on success and otherwise failure.
10860
 */
10861
static int DoTls13CertificateVerify(WOLFSSL* ssl, byte* input,
10862
                                    word32* inOutIdx, word32 totalSz)
10863
0
{
10864
0
    int         ret = 0;
10865
0
    byte*       sig = NULL;
10866
0
#ifndef NO_RSA
10867
    /* Use this as a temporary buffer for RSA signature verification. */
10868
0
    buffer*     rsaSigBuf = &ssl->buffers.sig;
10869
0
#endif
10870
#ifdef WOLFSSL_ASYNC_CRYPT
10871
    Dcv13Args* args = NULL;
10872
    WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
10873
#else
10874
0
    Dcv13Args  args[1];
10875
0
#endif
10876
10877
0
    WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_DO);
10878
0
    WOLFSSL_ENTER("DoTls13CertificateVerify");
10879
10880
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
10881
    ret = tsip_Tls13CertificateVerify(ssl, input, inOutIdx, totalSz);
10882
    if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
10883
        goto exit_dcv;
10884
    }
10885
    ret = 0;
10886
#endif
10887
10888
#ifdef WOLFSSL_ASYNC_CRYPT
10889
    if (ssl->async == NULL) {
10890
        ssl->async = (struct WOLFSSL_ASYNC*)
10891
                XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
10892
                        DYNAMIC_TYPE_ASYNC);
10893
        if (ssl->async == NULL)
10894
            ERROR_OUT(MEMORY_E, exit_dcv);
10895
    }
10896
    args = (Dcv13Args*)ssl->async->args;
10897
10898
    ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
10899
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
10900
        /* Check for error */
10901
        if (ret < 0)
10902
            goto exit_dcv;
10903
    }
10904
    else
10905
#endif
10906
0
    {
10907
        /* Reset state */
10908
0
        ret = 0;
10909
0
        ssl->options.asyncState = TLS_ASYNC_BEGIN;
10910
0
        XMEMSET(args, 0, sizeof(Dcv13Args));
10911
0
        ssl->options.peerHashAlgo = sha_mac;
10912
0
        ssl->options.peerSigAlgo = anonymous_sa_algo;
10913
0
        args->idx = *inOutIdx;
10914
0
        args->begin = *inOutIdx;
10915
    #ifdef WOLFSSL_ASYNC_CRYPT
10916
        ssl->async->freeArgs = FreeDcv13Args;
10917
    #endif
10918
0
    }
10919
10920
0
    switch(ssl->options.asyncState)
10921
0
    {
10922
0
        case TLS_ASYNC_BEGIN:
10923
0
        {
10924
        #ifdef WOLFSSL_CALLBACKS
10925
            if (ssl->hsInfoOn) AddPacketName(ssl, "CertificateVerify");
10926
            if (ssl->toInfoOn) AddLateName("CertificateVerify",
10927
                                           &ssl->timeoutInfo);
10928
        #endif
10929
10930
            /* Advance state and proceed */
10931
0
            ssl->options.asyncState = TLS_ASYNC_BUILD;
10932
0
        } /* case TLS_ASYNC_BEGIN */
10933
0
        FALL_THROUGH;
10934
10935
0
        case TLS_ASYNC_BUILD:
10936
0
        {
10937
0
            int validSigAlgo;
10938
0
            const Suites* suites = WOLFSSL_SUITES(ssl);
10939
0
            word16 i;
10940
10941
            /* Signature algorithm. */
10942
0
            if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN > totalSz) {
10943
0
                ERROR_OUT(BUFFER_ERROR, exit_dcv);
10944
0
            }
10945
10946
#ifdef WOLFSSL_DUAL_ALG_CERTS
10947
            if (ssl->peerSigSpec == NULL) {
10948
                /* The peer did not respond. We didn't send CKS or they don't
10949
                 * support it. Either way, we do not need to handle dual
10950
                 * key/sig case. */
10951
                ssl->sigSpec = NULL;
10952
                ssl->sigSpecSz = 0;
10953
            }
10954
10955
            /* If no CKS extension or either native or alternative, then just
10956
             * get a normal sigalgo.  But if BOTH, then get the native and alt
10957
             * sig algos. */
10958
            if (ssl->sigSpec == NULL ||
10959
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_NATIVE ||
10960
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_ALTERNATIVE) {
10961
#endif /* WOLFSSL_DUAL_ALG_CERTS */
10962
0
                validSigAlgo = 0;
10963
0
                for (i = 0; i < suites->hashSigAlgoSz; i += 2) {
10964
0
                     if ((suites->hashSigAlgo[i + 0] == input[args->idx + 0]) &&
10965
0
                             (suites->hashSigAlgo[i + 1] == input[args->idx + 1])) {
10966
0
                         validSigAlgo = 1;
10967
0
                         break;
10968
0
                     }
10969
0
                }
10970
0
                if (!validSigAlgo) {
10971
0
                    ERROR_OUT(INVALID_PARAMETER, exit_dcv);
10972
0
                }
10973
10974
0
                ret = DecodeTls13SigAlg(input + args->idx,
10975
0
                        &ssl->options.peerHashAlgo, &ssl->options.peerSigAlgo);
10976
#ifdef WOLFSSL_DUAL_ALG_CERTS
10977
            }
10978
            else {
10979
                ret = DecodeTls13HybridSigAlg(input + args->idx,
10980
                                              &ssl->options.peerHashAlgo,
10981
                                              &ssl->options.peerSigAlgo,
10982
                                              &args->altSigAlgo);
10983
            }
10984
#endif /* WOLFSSL_DUAL_ALG_CERTS */
10985
10986
0
            if (ret < 0)
10987
0
                goto exit_dcv;
10988
0
            args->idx += OPAQUE16_LEN;
10989
10990
            /* Signature length. */
10991
0
            if ((args->idx - args->begin) + OPAQUE16_LEN > totalSz) {
10992
0
                ERROR_OUT(BUFFER_ERROR, exit_dcv);
10993
0
            }
10994
0
            ato16(input + args->idx, &args->sz);
10995
0
            args->idx += OPAQUE16_LEN;
10996
10997
            /* Signature data. */
10998
0
            if ((args->idx - args->begin) + args->sz > totalSz) {
10999
0
                ERROR_OUT(BUFFER_ERROR, exit_dcv);
11000
0
            }
11001
11002
#ifdef WOLFSSL_DUAL_ALG_CERTS
11003
            if ((ssl->sigSpec != NULL) &&
11004
                (*ssl->sigSpec != WOLFSSL_CKS_SIGSPEC_NATIVE)) {
11005
11006
                word16 sa;
11007
                if (args->altSigAlgo == 0)
11008
                    sa = ssl->options.peerSigAlgo;
11009
                else
11010
                    sa = args->altSigAlgo;
11011
11012
                switch(sa) {
11013
            #ifndef NO_RSA
11014
                case rsa_pss_sa_algo:
11015
                    ret = decodeRsaKey(ssl);
11016
                    break;
11017
            #endif
11018
            #ifdef HAVE_ECC
11019
                case ecc_dsa_sa_algo:
11020
                    ret = decodeEccKey(ssl);
11021
                    break;
11022
            #endif
11023
            #ifdef HAVE_DILITHIUM
11024
                case dilithium_level2_sa_algo:
11025
                    ret = decodeDilithiumKey(ssl, WC_ML_DSA_44);
11026
                    break;
11027
                case dilithium_level3_sa_algo:
11028
                    ret = decodeDilithiumKey(ssl, WC_ML_DSA_65);
11029
                    break;
11030
                case dilithium_level5_sa_algo:
11031
                    ret = decodeDilithiumKey(ssl, WC_ML_DSA_87);
11032
                    break;
11033
            #endif
11034
            #ifdef HAVE_FALCON
11035
                case falcon_level1_sa_algo:
11036
                    ret = decodeFalconKey(ssl, 1);
11037
                    break;
11038
                case falcon_level5_sa_algo:
11039
                    ret = decodeFalconKey(ssl, 5);
11040
                    break;
11041
            #endif
11042
                default:
11043
                    ERROR_OUT(PEER_KEY_ERROR, exit_dcv);
11044
                }
11045
11046
                if (ret != 0)
11047
                    ERROR_OUT(ret, exit_dcv);
11048
11049
                if (*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_ALTERNATIVE) {
11050
                    /* Now swap in the alternative by removing the native.
11051
                     * sa contains the alternative signature type. */
11052
                #ifndef NO_RSA
11053
                    if (ssl->peerRsaKeyPresent && sa != rsa_pss_sa_algo) {
11054
                        FreeKey(ssl, DYNAMIC_TYPE_RSA,
11055
                                (void**)&ssl->peerRsaKey);
11056
                        ssl->peerRsaKeyPresent = 0;
11057
                    }
11058
                #endif
11059
                #ifdef HAVE_ECC
11060
                    else if (ssl->peerEccDsaKeyPresent &&
11061
                             sa != ecc_dsa_sa_algo) {
11062
                        FreeKey(ssl, DYNAMIC_TYPE_ECC,
11063
                                (void**)&ssl->peerEccDsaKey);
11064
                        ssl->peerEccDsaKeyPresent = 0;
11065
                    }
11066
                #endif
11067
                #ifdef HAVE_DILITHIUM
11068
                    else if (ssl->peerDilithiumKeyPresent &&
11069
                             sa != dilithium_level2_sa_algo &&
11070
                             sa != dilithium_level3_sa_algo &&
11071
                             sa != dilithium_level5_sa_algo) {
11072
                        FreeKey(ssl, DYNAMIC_TYPE_DILITHIUM,
11073
                                (void**)&ssl->peerDilithiumKey);
11074
                        ssl->peerDilithiumKeyPresent = 0;
11075
                    }
11076
                #endif
11077
                #ifdef HAVE_FALCON
11078
                    else if (ssl->peerFalconKeyPresent &&
11079
                             sa != falcon_level1_sa_algo &&
11080
                             sa != falcon_level5_sa_algo) {
11081
                        FreeKey(ssl, DYNAMIC_TYPE_FALCON,
11082
                                (void**)&ssl->peerFalconKey);
11083
                        ssl->peerFalconKeyPresent = 0;
11084
                    }
11085
                #endif
11086
                    else {
11087
                        ERROR_OUT(PEER_KEY_ERROR, exit_dcv);
11088
                    }
11089
                }
11090
            }
11091
#endif /* WOLFSSL_DUAL_ALG_CERTS */
11092
11093
            /* Check for public key of required type. */
11094
            /* Assume invalid unless signature algo matches the key provided */
11095
0
            validSigAlgo = 0;
11096
0
        #ifdef HAVE_ED25519
11097
0
            if (ssl->options.peerSigAlgo == ed25519_sa_algo) {
11098
0
                WOLFSSL_MSG("Peer sent ED25519 sig");
11099
0
                validSigAlgo = (ssl->peerEd25519Key != NULL) &&
11100
0
                                                     ssl->peerEd25519KeyPresent;
11101
0
            }
11102
0
        #endif
11103
0
        #ifdef HAVE_ED448
11104
0
            if (ssl->options.peerSigAlgo == ed448_sa_algo) {
11105
0
                WOLFSSL_MSG("Peer sent ED448 sig");
11106
0
                validSigAlgo = (ssl->peerEd448Key != NULL) &&
11107
0
                                                       ssl->peerEd448KeyPresent;
11108
0
            }
11109
0
        #endif
11110
0
        #ifdef HAVE_ECC
11111
0
            if (ssl->options.peerSigAlgo == ecc_dsa_sa_algo) {
11112
0
                WOLFSSL_MSG("Peer sent ECC sig");
11113
0
                validSigAlgo = (ssl->peerEccDsaKey != NULL) &&
11114
0
                                                      ssl->peerEccDsaKeyPresent;
11115
0
            }
11116
0
        #endif
11117
0
        #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
11118
0
            if (ssl->options.peerSigAlgo == sm2_sa_algo) {
11119
0
                WOLFSSL_MSG("Peer sent SM2 sig");
11120
0
                validSigAlgo = (ssl->peerEccDsaKey != NULL) &&
11121
0
                                                      ssl->peerEccDsaKeyPresent;
11122
0
            }
11123
0
        #endif
11124
        #ifdef HAVE_FALCON
11125
            if (ssl->options.peerSigAlgo == falcon_level1_sa_algo) {
11126
                WOLFSSL_MSG("Peer sent Falcon Level 1 sig");
11127
                validSigAlgo = (ssl->peerFalconKey != NULL) &&
11128
                               ssl->peerFalconKeyPresent;
11129
            }
11130
            if (ssl->options.peerSigAlgo == falcon_level5_sa_algo) {
11131
                WOLFSSL_MSG("Peer sent Falcon Level 5 sig");
11132
                validSigAlgo = (ssl->peerFalconKey != NULL) &&
11133
                               ssl->peerFalconKeyPresent;
11134
            }
11135
        #endif
11136
        #ifdef HAVE_DILITHIUM
11137
            if (ssl->options.peerSigAlgo == dilithium_level2_sa_algo) {
11138
                WOLFSSL_MSG("Peer sent Dilithium Level 2 sig");
11139
                validSigAlgo = (ssl->peerDilithiumKey != NULL) &&
11140
                               ssl->peerDilithiumKeyPresent;
11141
            }
11142
            if (ssl->options.peerSigAlgo == dilithium_level3_sa_algo) {
11143
                WOLFSSL_MSG("Peer sent Dilithium Level 3 sig");
11144
                validSigAlgo = (ssl->peerDilithiumKey != NULL) &&
11145
                               ssl->peerDilithiumKeyPresent;
11146
            }
11147
            if (ssl->options.peerSigAlgo == dilithium_level5_sa_algo) {
11148
                WOLFSSL_MSG("Peer sent Dilithium Level 5 sig");
11149
                validSigAlgo = (ssl->peerDilithiumKey != NULL) &&
11150
                               ssl->peerDilithiumKeyPresent;
11151
            }
11152
        #endif
11153
0
        #ifndef NO_RSA
11154
0
            if (ssl->options.peerSigAlgo == rsa_sa_algo) {
11155
0
                WOLFSSL_MSG("Peer sent PKCS#1.5 algo - not valid TLS 1.3");
11156
0
                ERROR_OUT(INVALID_PARAMETER, exit_dcv);
11157
0
            }
11158
0
            if (ssl->options.peerSigAlgo == rsa_pss_sa_algo) {
11159
0
                WOLFSSL_MSG("Peer sent RSA sig");
11160
0
                validSigAlgo = (ssl->peerRsaKey != NULL) &&
11161
0
                                                         ssl->peerRsaKeyPresent;
11162
0
            }
11163
0
        #endif
11164
0
            if (!validSigAlgo) {
11165
0
                WOLFSSL_MSG("Sig algo doesn't correspond to certificate");
11166
0
                ERROR_OUT(SIG_VERIFY_E, exit_dcv);
11167
0
            }
11168
11169
0
            args->sigSz = args->sz;
11170
#ifdef WOLFSSL_DUAL_ALG_CERTS
11171
            if (ssl->sigSpec != NULL &&
11172
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
11173
                /* In case we received two signatures, both of them are encoded
11174
                 * with their size as 16-bit integeter prior in memory. Hence,
11175
                 * we can decode both lengths here now. */
11176
                word32 tmpIdx = args->idx;
11177
                word16 tmpSz = 0;
11178
                if (args->sz < OPAQUE16_LEN) {
11179
                    ERROR_OUT(BUFFER_ERROR, exit_dcv);
11180
                }
11181
                ato16(input + tmpIdx, &tmpSz);
11182
                args->sigSz = tmpSz;
11183
11184
                tmpIdx += OPAQUE16_LEN + args->sigSz;
11185
                if (tmpIdx - args->idx + OPAQUE16_LEN > args->sz) {
11186
                    ERROR_OUT(BUFFER_ERROR, exit_dcv);
11187
                }
11188
                ato16(input + tmpIdx, &tmpSz);
11189
                args->altSignatureSz = tmpSz;
11190
11191
                if (args->sz != (args->sigSz + args->altSignatureSz +
11192
                                    OPAQUE16_LEN + OPAQUE16_LEN)) {
11193
                    ERROR_OUT(BUFFER_ERROR, exit_dcv);
11194
                }
11195
            }
11196
#endif /* WOLFSSL_DUAL_ALG_CERTS */
11197
11198
0
        #if !defined(NO_RSA) && defined(WC_RSA_PSS)
11199
            /* In case we have to verify an RSA signature, we have to store the
11200
             * signature in the 'rsaSigBuf' structure for further processing.
11201
             */
11202
0
            if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
11203
0
                word32 sigSz = args->sigSz;
11204
0
                sig = input + args->idx;
11205
            #ifdef WOLFSSL_DUAL_ALG_CERTS
11206
                /* Check if our alternative signature was RSA */
11207
                if (ssl->sigSpec != NULL &&
11208
                    *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
11209
                    if (ssl->options.peerSigAlgo != rsa_pss_sa_algo) {
11210
                        /* We have to skip the first signature (length field
11211
                         * and signature itself) and the length field of the
11212
                         * alternative signature. */
11213
                        sig += OPAQUE16_LEN + OPAQUE16_LEN + args->sigSz;
11214
                        sigSz = args->altSignatureSz;
11215
                    }
11216
                    else {
11217
                        /* We have to skip the length field */
11218
                        sig += OPAQUE16_LEN;
11219
                    }
11220
                }
11221
            #endif
11222
0
                rsaSigBuf->buffer = (byte*)XMALLOC(sigSz, ssl->heap,
11223
0
                                         DYNAMIC_TYPE_SIGNATURE);
11224
0
                if (rsaSigBuf->buffer == NULL) {
11225
0
                    ERROR_OUT(MEMORY_E, exit_dcv);
11226
0
                }
11227
0
                rsaSigBuf->length = sigSz;
11228
0
                XMEMCPY(rsaSigBuf->buffer, sig, rsaSigBuf->length);
11229
0
            }
11230
0
        #endif /* !NO_RSA && WC_RSA_PSS */
11231
11232
0
            args->sigData = (byte*)XMALLOC(MAX_SIG_DATA_SZ, ssl->heap,
11233
0
                                                    DYNAMIC_TYPE_SIGNATURE);
11234
0
            if (args->sigData == NULL) {
11235
0
                ERROR_OUT(MEMORY_E, exit_dcv);
11236
0
            }
11237
11238
0
            ret = CreateSigData(ssl, args->sigData, &args->sigDataSz, 1);
11239
0
            if (ret < 0)
11240
0
                goto exit_dcv;
11241
11242
        #ifdef WOLFSSL_DUAL_ALG_CERTS
11243
            if ((ssl->sigSpec != NULL) &&
11244
                (*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH)) {
11245
                args->altSigData = (byte*)XMALLOC(MAX_SIG_DATA_SZ, ssl->heap,
11246
                                                        DYNAMIC_TYPE_SIGNATURE);
11247
                if (args->altSigData == NULL) {
11248
                    ERROR_OUT(MEMORY_E, exit_dcv);
11249
                }
11250
                XMEMCPY(args->altSigData, args->sigData, args->sigDataSz);
11251
                args->altSigDataSz = args->sigDataSz;
11252
            }
11253
        #endif /* WOLFSSL_DUAL_ALG_CERTS */
11254
11255
0
        #ifdef HAVE_ECC
11256
0
            if ((ssl->options.peerSigAlgo == ecc_dsa_sa_algo) &&
11257
0
                (ssl->peerEccDsaKeyPresent)) {
11258
0
                ret = CreateECCEncodedSig(args->sigData,
11259
0
                    args->sigDataSz, ssl->options.peerHashAlgo);
11260
0
                if (ret < 0)
11261
0
                    goto exit_dcv;
11262
0
                args->sigDataSz = (word16)ret;
11263
0
                ret = 0;
11264
0
            }
11265
11266
        #ifdef WOLFSSL_DUAL_ALG_CERTS
11267
            if ((ssl->sigSpec != NULL) &&
11268
                (*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) &&
11269
                (args->altSigAlgo == ecc_dsa_sa_algo) &&
11270
                (ssl->peerEccDsaKeyPresent)) {
11271
                ret = CreateECCEncodedSig(args->altSigData,
11272
                        args->altSigDataSz, ssl->options.peerHashAlgo);
11273
                    if (ret < 0)
11274
                        goto exit_dcv;
11275
                    args->altSigDataSz = (word16)ret;
11276
                    ret = 0;
11277
            }
11278
        #endif /* WOLFSSL_DUAL_ALG_CERTS */
11279
0
        #endif /* HAVE_ECC */
11280
11281
            /* Advance state and proceed */
11282
0
            ssl->options.asyncState = TLS_ASYNC_DO;
11283
0
        } /* case TLS_ASYNC_BUILD */
11284
0
        FALL_THROUGH;
11285
11286
0
        case TLS_ASYNC_DO:
11287
0
        {
11288
0
            sig = input + args->idx;
11289
0
            (void)sig;
11290
        #ifdef WOLFSSL_DUAL_ALG_CERTS
11291
            if (ssl->sigSpec != NULL &&
11292
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
11293
                /* As we have two signatures in the message, we stored
11294
                 * the length of each before the actual signature. This
11295
                 * is necessary, as we could have two algorithms with
11296
                 * variable length signatures. */
11297
                sig += OPAQUE16_LEN;
11298
            }
11299
        #endif
11300
0
        #ifndef NO_RSA
11301
0
            if ((ssl->options.peerSigAlgo == rsa_pss_sa_algo) &&
11302
0
                (ssl->peerRsaKey != NULL) && (ssl->peerRsaKeyPresent != 0)) {
11303
0
                WOLFSSL_MSG("Doing RSA peer cert verify");
11304
0
                ret = RsaVerify(ssl, rsaSigBuf->buffer,
11305
0
                                (word32)rsaSigBuf->length, &args->output,
11306
0
                                ssl->options.peerSigAlgo,
11307
0
                                ssl->options.peerHashAlgo, ssl->peerRsaKey,
11308
                #ifdef HAVE_PK_CALLBACKS
11309
                                &ssl->buffers.peerRsaKey
11310
                #else
11311
0
                                NULL
11312
0
                #endif
11313
0
                                );
11314
0
                if (ret >= 0) {
11315
0
                    args->sendSz = (word32)ret;
11316
0
                    ret = 0;
11317
0
                }
11318
0
            }
11319
0
        #endif /* !NO_RSA */
11320
0
        #ifdef HAVE_ECC
11321
0
            if ((ssl->options.peerSigAlgo == ecc_dsa_sa_algo) &&
11322
0
                    ssl->peerEccDsaKeyPresent) {
11323
0
                WOLFSSL_MSG("Doing ECC peer cert verify");
11324
0
                ret = EccVerify(ssl, sig, args->sigSz,
11325
0
                    args->sigData, args->sigDataSz,
11326
0
                    ssl->peerEccDsaKey,
11327
                #ifdef HAVE_PK_CALLBACKS
11328
                    &ssl->buffers.peerEccDsaKey
11329
                #else
11330
0
                    NULL
11331
0
                #endif
11332
0
                    );
11333
11334
0
                if (ret >= 0) {
11335
                    /* CLIENT/SERVER: data verified with public key from
11336
                     * certificate. */
11337
0
                    ssl->options.peerAuthGood = 1;
11338
11339
0
                    FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
11340
0
                    ssl->peerEccDsaKeyPresent = 0;
11341
0
                }
11342
0
            }
11343
0
        #endif /* HAVE_ECC */
11344
0
        #if defined(HAVE_ECC) && defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
11345
0
            if ((ssl->options.peerSigAlgo == sm2_sa_algo) &&
11346
0
                   ssl->peerEccDsaKeyPresent) {
11347
0
                WOLFSSL_MSG("Doing SM2/SM3 peer cert verify");
11348
0
                ret = Sm2wSm3Verify(ssl, TLS13_SM2_SIG_ID, TLS13_SM2_SIG_ID_SZ,
11349
0
                    sig, args->sigSz, args->sigData, args->sigDataSz,
11350
0
                    ssl->peerEccDsaKey, NULL);
11351
0
                if (ret >= 0) {
11352
                    /* CLIENT/SERVER: data verified with public key from
11353
                     * certificate. */
11354
0
                    ssl->options.peerAuthGood = 1;
11355
11356
0
                    FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
11357
0
                    ssl->peerEccDsaKeyPresent = 0;
11358
0
                }
11359
0
            }
11360
0
        #endif
11361
0
        #ifdef HAVE_ED25519
11362
0
            if ((ssl->options.peerSigAlgo == ed25519_sa_algo) &&
11363
0
                (ssl->peerEd25519KeyPresent)) {
11364
0
                WOLFSSL_MSG("Doing ED25519 peer cert verify");
11365
0
                ret = Ed25519Verify(ssl, sig, args->sigSz,
11366
0
                    args->sigData, args->sigDataSz,
11367
0
                    ssl->peerEd25519Key,
11368
                #ifdef HAVE_PK_CALLBACKS
11369
                    &ssl->buffers.peerEd25519Key
11370
                #else
11371
0
                    NULL
11372
0
                #endif
11373
0
                    );
11374
11375
0
                if (ret >= 0) {
11376
                    /* CLIENT/SERVER: data verified with public key from
11377
                     * certificate. */
11378
0
                    ssl->options.peerAuthGood = 1;
11379
0
                    FreeKey(ssl, DYNAMIC_TYPE_ED25519,
11380
0
                                                  (void**)&ssl->peerEd25519Key);
11381
0
                    ssl->peerEd25519KeyPresent = 0;
11382
0
                }
11383
0
            }
11384
0
        #endif
11385
0
        #ifdef HAVE_ED448
11386
0
            if ((ssl->options.peerSigAlgo == ed448_sa_algo) &&
11387
0
                (ssl->peerEd448KeyPresent)) {
11388
0
                WOLFSSL_MSG("Doing ED448 peer cert verify");
11389
0
                ret = Ed448Verify(ssl, sig, args->sigSz,
11390
0
                    args->sigData, args->sigDataSz,
11391
0
                    ssl->peerEd448Key,
11392
                #ifdef HAVE_PK_CALLBACKS
11393
                    &ssl->buffers.peerEd448Key
11394
                #else
11395
0
                    NULL
11396
0
                #endif
11397
0
                );
11398
11399
0
                if (ret >= 0) {
11400
                    /* CLIENT/SERVER: data verified with public key from
11401
                     * certificate. */
11402
0
                    ssl->options.peerAuthGood = 1;
11403
0
                    FreeKey(ssl, DYNAMIC_TYPE_ED448,
11404
0
                                                    (void**)&ssl->peerEd448Key);
11405
0
                    ssl->peerEd448KeyPresent = 0;
11406
0
                }
11407
0
            }
11408
0
        #endif
11409
        #if defined(HAVE_FALCON)
11410
            if (((ssl->options.peerSigAlgo == falcon_level1_sa_algo) ||
11411
                 (ssl->options.peerSigAlgo == falcon_level5_sa_algo)) &&
11412
                (ssl->peerFalconKeyPresent)) {
11413
                int res = 0;
11414
                WOLFSSL_MSG("Doing Falcon peer cert verify");
11415
                ret = wc_falcon_verify_msg(sig, args->sigSz,
11416
                                           args->sigData, args->sigDataSz,
11417
                                           &res, ssl->peerFalconKey);
11418
11419
                if ((ret >= 0) && (res == 1)) {
11420
                    /* CLIENT/SERVER: data verified with public key from
11421
                     * certificate. */
11422
                    ssl->options.peerAuthGood = 1;
11423
11424
                    FreeKey(ssl, DYNAMIC_TYPE_FALCON,
11425
                                                   (void**)&ssl->peerFalconKey);
11426
                    ssl->peerFalconKeyPresent = 0;
11427
                }
11428
                else if ((ret >= 0) && (res == 0)) {
11429
                    WOLFSSL_MSG("Falcon signature verification failed");
11430
                    ret = SIG_VERIFY_E;
11431
                }
11432
            }
11433
        #endif /* HAVE_FALCON */
11434
        #if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_VERIFY)
11435
            if (((ssl->options.peerSigAlgo == dilithium_level2_sa_algo) ||
11436
                 (ssl->options.peerSigAlgo == dilithium_level3_sa_algo) ||
11437
                 (ssl->options.peerSigAlgo == dilithium_level5_sa_algo)) &&
11438
                (ssl->peerDilithiumKeyPresent)) {
11439
                int res = 0;
11440
                WOLFSSL_MSG("Doing Dilithium peer cert verify");
11441
                ret = wc_dilithium_verify_ctx_msg(sig, args->sigSz, NULL, 0,
11442
                                                  args->sigData, args->sigDataSz,
11443
                                                  &res, ssl->peerDilithiumKey);
11444
11445
                if ((ret >= 0) && (res == 1)) {
11446
                    /* CLIENT/SERVER: data verified with public key from
11447
                     * certificate. */
11448
                    ssl->options.peerAuthGood = 1;
11449
11450
                    FreeKey(ssl, DYNAMIC_TYPE_DILITHIUM,
11451
                            (void**)&ssl->peerDilithiumKey);
11452
                    ssl->peerDilithiumKeyPresent = 0;
11453
                }
11454
                else if ((ret >= 0) && (res == 0)) {
11455
                    WOLFSSL_MSG("Dilithium signature verification failed");
11456
                    ret = SIG_VERIFY_E;
11457
                }
11458
            }
11459
        #endif /* HAVE_DILITHIUM */
11460
11461
            /* Check for error */
11462
0
            if (ret != 0) {
11463
0
                goto exit_dcv;
11464
0
            }
11465
11466
        #ifdef WOLFSSL_DUAL_ALG_CERTS
11467
            if (ssl->sigSpec != NULL &&
11468
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
11469
                /* Move forward to the alternative signature. */
11470
                sig += args->sigSz + OPAQUE16_LEN;
11471
11472
                /* Verify the alternative signature */
11473
            #ifndef NO_RSA
11474
                if ((args->altSigAlgo == rsa_pss_sa_algo) &&
11475
                    (ssl->peerRsaKey != NULL) &&
11476
                    (ssl->peerRsaKeyPresent != 0)) {
11477
                    WOLFSSL_MSG("Doing RSA peer cert alt verify");
11478
                    ret = RsaVerify(ssl, rsaSigBuf->buffer,
11479
                                    (word32)rsaSigBuf->length,
11480
                                    &args->output, args->altSigAlgo,
11481
                                    ssl->options.peerHashAlgo, ssl->peerRsaKey,
11482
                    #ifdef HAVE_PK_CALLBACKS
11483
                                    &ssl->buffers.peerRsaKey
11484
                    #else
11485
                                    NULL
11486
                    #endif
11487
                                    );
11488
                    if (ret >= 0) {
11489
                        args->sendSz = ret;
11490
                        ret = 0;
11491
                    }
11492
                }
11493
            #endif /* !NO_RSA */
11494
            #ifdef HAVE_ECC
11495
                if ((args->altSigAlgo == ecc_dsa_sa_algo) &&
11496
                    (ssl->peerEccDsaKeyPresent)) {
11497
                    WOLFSSL_MSG("Doing ECC peer cert alt verify");
11498
                    ret = EccVerify(ssl, sig, args->altSignatureSz,
11499
                                args->altSigData, args->altSigDataSz,
11500
                                ssl->peerEccDsaKey,
11501
                    #ifdef HAVE_PK_CALLBACKS
11502
                                &ssl->buffers.peerEccDsaKey
11503
                    #else
11504
                                NULL
11505
                    #endif
11506
                                );
11507
11508
                    if (ret >= 0) {
11509
                        /* CLIENT/SERVER: data verified with public key from
11510
                        * certificate. */
11511
                        args->altPeerAuthGood = 1;
11512
11513
                        FreeKey(ssl, DYNAMIC_TYPE_ECC,
11514
                                                (void**)&ssl->peerEccDsaKey);
11515
                        ssl->peerEccDsaKeyPresent = 0;
11516
                    }
11517
                }
11518
            #endif /* HAVE_ECC */
11519
            #if defined(HAVE_FALCON)
11520
                if (((args->altSigAlgo == falcon_level1_sa_algo) ||
11521
                     (args->altSigAlgo == falcon_level5_sa_algo)) &&
11522
                    (ssl->peerFalconKeyPresent)) {
11523
                    int res = 0;
11524
                    WOLFSSL_MSG("Doing Falcon peer cert alt verify");
11525
                    ret = wc_falcon_verify_msg(sig, args->altSignatureSz,
11526
                                        args->altSigData, args->altSigDataSz,
11527
                                        &res, ssl->peerFalconKey);
11528
11529
                    if ((ret >= 0) && (res == 1)) {
11530
                        /* CLIENT/SERVER: data verified with public key from
11531
                        * certificate. */
11532
                        args->altPeerAuthGood = 1;
11533
11534
                        FreeKey(ssl, DYNAMIC_TYPE_FALCON,
11535
                                                (void**)&ssl->peerFalconKey);
11536
                        ssl->peerFalconKeyPresent = 0;
11537
                    }
11538
                    else if ((ret >= 0) && (res == 0)) {
11539
                        WOLFSSL_MSG("Falcon signature verification failed");
11540
                        ret = SIG_VERIFY_E;
11541
                    }
11542
                }
11543
            #endif /* HAVE_FALCON */
11544
            #if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_VERIFY)
11545
                if (((args->altSigAlgo == dilithium_level2_sa_algo) ||
11546
                     (args->altSigAlgo == dilithium_level3_sa_algo) ||
11547
                     (args->altSigAlgo == dilithium_level5_sa_algo)) &&
11548
                    (ssl->peerDilithiumKeyPresent)) {
11549
                    int res = 0;
11550
                    WOLFSSL_MSG("Doing Dilithium peer cert alt verify");
11551
                    ret = wc_dilithium_verify_ctx_msg(sig, args->altSignatureSz,
11552
                                        NULL, 0, args->altSigData,
11553
                                        args->altSigDataSz, &res,
11554
                                        ssl->peerDilithiumKey);
11555
11556
                    if ((ret >= 0) && (res == 1)) {
11557
                        /* CLIENT/SERVER: data verified with public key from
11558
                        * certificate. */
11559
                        args->altPeerAuthGood = 1;
11560
11561
                        FreeKey(ssl, DYNAMIC_TYPE_DILITHIUM,
11562
                                            (void**)&ssl->peerDilithiumKey);
11563
                        ssl->peerDilithiumKeyPresent = 0;
11564
                    }
11565
                    else if ((ret >= 0) && (res == 0)) {
11566
                        WOLFSSL_MSG("Dilithium signature verification failed");
11567
                        ret = SIG_VERIFY_E;
11568
                    }
11569
                }
11570
            #endif /* HAVE_DILITHIUM */
11571
11572
                /* Check for error */
11573
                if (ret != 0) {
11574
                    goto exit_dcv;
11575
                }
11576
            }
11577
        #endif /* WOLFSSL_DUAL_ALG_CERTS */
11578
11579
            /* Advance state and proceed */
11580
0
            ssl->options.asyncState = TLS_ASYNC_VERIFY;
11581
0
        } /* case TLS_ASYNC_DO */
11582
0
        FALL_THROUGH;
11583
11584
0
        case TLS_ASYNC_VERIFY:
11585
0
        {
11586
0
        #if !defined(NO_RSA) && defined(WC_RSA_PSS)
11587
0
            if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
11588
0
                int sigAlgo = ssl->options.peerSigAlgo;
11589
            #ifdef WOLFSSL_DUAL_ALG_CERTS
11590
                /* Check if our alternative signature was RSA */
11591
                if (ssl->sigSpec != NULL &&
11592
                    *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH &&
11593
                    ssl->options.peerSigAlgo != rsa_pss_sa_algo) {
11594
                    sigAlgo = args->altSigAlgo;
11595
                }
11596
            #endif
11597
0
                ret = CheckRSASignature(ssl, sigAlgo,
11598
0
                        ssl->options.peerHashAlgo, args->output, args->sendSz);
11599
0
                if (ret != 0)
11600
0
                    goto exit_dcv;
11601
11602
                /* CLIENT/SERVER: data verified with public key from
11603
                 * certificate. */
11604
0
                ssl->peerRsaKeyPresent = 0;
11605
0
                FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
11606
            #ifdef WOLFSSL_DUAL_ALG_CERTS
11607
                /* Check if our alternative signature was RSA */
11608
                if (ssl->sigSpec != NULL &&
11609
                    *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH &&
11610
                    ssl->options.peerSigAlgo != rsa_pss_sa_algo) {
11611
                    args->altPeerAuthGood = 1;
11612
                }
11613
                else
11614
            #endif
11615
0
                    ssl->options.peerAuthGood = 1;
11616
0
            }
11617
0
        #endif /* !NO_RSA && WC_RSA_PSS */
11618
11619
            /* Advance state and proceed */
11620
0
            ssl->options.asyncState = TLS_ASYNC_FINALIZE;
11621
0
        } /* case TLS_ASYNC_VERIFY */
11622
0
        FALL_THROUGH;
11623
11624
0
        case TLS_ASYNC_FINALIZE:
11625
0
        {
11626
#ifdef WOLFSSL_DUAL_ALG_CERTS
11627
            if (ssl->options.peerAuthGood &&
11628
                ssl->sigSpec != NULL &&
11629
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
11630
                ssl->options.peerAuthGood = args->altPeerAuthGood;
11631
            }
11632
#endif /* WOLFSSL_DUAL_ALG_CERTS */
11633
0
            ssl->options.havePeerVerify = 1;
11634
11635
            /* Set final index */
11636
0
            args->idx += args->sz;
11637
0
            *inOutIdx = args->idx;
11638
11639
            /* Encryption is always on: add padding */
11640
0
            *inOutIdx += ssl->keys.padSz;
11641
11642
            /* Advance state and proceed */
11643
0
            ssl->options.asyncState = TLS_ASYNC_END;
11644
11645
0
        #if !defined(NO_WOLFSSL_CLIENT)
11646
0
            if (ssl->options.side == WOLFSSL_CLIENT_END)
11647
0
                ssl->options.serverState = SERVER_CERT_VERIFY_COMPLETE;
11648
0
        #endif
11649
0
        } /* case TLS_ASYNC_FINALIZE */
11650
0
        FALL_THROUGH;
11651
11652
0
        case TLS_ASYNC_END:
11653
0
        {
11654
0
            break;
11655
0
        }
11656
11657
0
        default:
11658
0
            ret = INPUT_CASE_ERROR;
11659
0
    } /* switch(ssl->options.asyncState) */
11660
11661
0
exit_dcv:
11662
11663
0
    WOLFSSL_LEAVE("DoTls13CertificateVerify", ret);
11664
0
    WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_DO);
11665
11666
#ifdef WOLFSSL_ASYNC_CRYPT
11667
    /* Handle async operation */
11668
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11669
        /* Mark message as not received so it can process again */
11670
        ssl->msgsReceived.got_certificate_verify = 0;
11671
11672
        return ret;
11673
    }
11674
    else
11675
#endif /* WOLFSSL_ASYNC_CRYPT */
11676
0
    if (ret != 0) {
11677
0
        WOLFSSL_ERROR_VERBOSE(ret);
11678
11679
0
        if (ret != WC_NO_ERR_TRACE(INVALID_PARAMETER)) {
11680
0
            SendAlert(ssl, alert_fatal, decrypt_error);
11681
0
        }
11682
0
    }
11683
11684
    /* Final cleanup */
11685
0
    FreeDcv13Args(ssl, args);
11686
0
    FreeKeyExchange(ssl);
11687
0
#ifdef WOLFSSL_ASYNC_IO
11688
    /* Cleanup async */
11689
0
    FreeAsyncCtx(ssl, 0);
11690
0
#endif
11691
11692
0
    return ret;
11693
0
}
11694
#endif /* !NO_RSA || HAVE_ECC */
11695
#endif /* !NO_CERTS */
11696
11697
/* Parse and handle a TLS v1.3 Finished message.
11698
 *
11699
 * ssl       The SSL/TLS object.
11700
 * input     The message buffer.
11701
 * inOutIdx  On entry, the index into the message buffer of Finished.
11702
 *           On exit, the index of byte after the Finished message and padding.
11703
 * size      Length of message data.
11704
 * totalSz   Length of remaining data in the message buffer.
11705
 * sniff     Indicates whether we are sniffing packets.
11706
 * returns 0 on success and otherwise failure.
11707
 */
11708
int DoTls13Finished(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
11709
                           word32 size, word32 totalSz, int sniff)
11710
0
{
11711
0
    int    ret;
11712
0
    word32 finishedSz = 0;
11713
0
    byte*  secret;
11714
0
    byte   mac[WC_MAX_DIGEST_SIZE];
11715
11716
0
    WOLFSSL_START(WC_FUNC_FINISHED_DO);
11717
0
    WOLFSSL_ENTER("DoTls13Finished");
11718
11719
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
11720
    /* verify the client sent certificate if required */
11721
0
    if (ssl->options.side == WOLFSSL_SERVER_END && !ssl->options.resuming &&
11722
0
            (ssl->options.mutualAuth || ssl->options.failNoCert)) {
11723
#ifdef OPENSSL_COMPATIBLE_DEFAULTS
11724
        if (ssl->options.isPSK) {
11725
            WOLFSSL_MSG("TLS v1.3 client used PSK but cert required. Allowing "
11726
                        "for OpenSSL compatibility");
11727
        }
11728
        else
11729
#endif
11730
0
        if (
11731
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
11732
            !ssl->options.verifyPostHandshake &&
11733
        #endif
11734
0
            (!ssl->options.havePeerCert || !ssl->options.havePeerVerify)) {
11735
0
            ret = NO_PEER_CERT; /* NO_PEER_VERIFY */
11736
0
            WOLFSSL_MSG("TLS v1.3 client did not present peer cert");
11737
0
            DoCertFatalAlert(ssl, ret);
11738
0
            goto cleanup;
11739
0
        }
11740
0
    }
11741
0
#endif
11742
11743
    /* check against totalSz */
11744
0
    if (*inOutIdx + size > totalSz) {
11745
0
        ret = BUFFER_E;
11746
0
        goto cleanup;
11747
0
    }
11748
11749
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
11750
    ret = tsip_Tls13HandleFinished(ssl, input, inOutIdx, size, totalSz);
11751
    if (ret == 0) {
11752
        ssl->options.serverState = SERVER_FINISHED_COMPLETE;
11753
        goto cleanup;
11754
    }
11755
    if (ret == WC_NO_ERR_TRACE(VERIFY_FINISHED_ERROR)) {
11756
        SendAlert(ssl, alert_fatal, decrypt_error);
11757
        goto cleanup;
11758
    }
11759
    if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
11760
        /* other errors */
11761
        goto cleanup;
11762
    }
11763
    ret = 0;
11764
#endif /* WOLFSSL_RENESAS_TSIP_TLS */
11765
11766
0
    if (ssl->options.handShakeDone) {
11767
0
        ret = DeriveFinishedSecret(ssl, ssl->clientSecret,
11768
0
                                   ssl->keys.client_write_MAC_secret,
11769
0
                                   WOLFSSL_CLIENT_END);
11770
0
        if (ret != 0)
11771
0
            goto cleanup;
11772
11773
0
        secret = ssl->keys.client_write_MAC_secret;
11774
0
    }
11775
0
    else if (ssl->options.side == WOLFSSL_CLIENT_END) {
11776
        /* All the handshake messages have been received to calculate
11777
         * client and server finished keys.
11778
         */
11779
0
        ret = DeriveFinishedSecret(ssl, ssl->clientSecret,
11780
0
                                   ssl->keys.client_write_MAC_secret,
11781
0
                                   WOLFSSL_CLIENT_END);
11782
0
        if (ret != 0)
11783
0
            goto cleanup;
11784
11785
0
        ret = DeriveFinishedSecret(ssl, ssl->serverSecret,
11786
0
                                   ssl->keys.server_write_MAC_secret,
11787
0
                                   WOLFSSL_SERVER_END);
11788
0
        if (ret != 0)
11789
0
            goto cleanup;
11790
11791
0
        secret = ssl->keys.server_write_MAC_secret;
11792
0
    }
11793
0
    else {
11794
0
        secret = ssl->keys.client_write_MAC_secret;
11795
0
    }
11796
11797
0
    if (sniff == NO_SNIFF) {
11798
11799
0
        ret = BuildTls13HandshakeHmac(ssl, secret, mac, &finishedSz);
11800
0
    #ifdef WOLFSSL_HAVE_TLS_UNIQUE
11801
0
        if (finishedSz > TLS_FINISHED_SZ_MAX) {
11802
0
            ret = BUFFER_ERROR;
11803
0
            goto cleanup;
11804
0
        }
11805
0
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
11806
0
            XMEMCPY(ssl->serverFinished, mac, finishedSz);
11807
0
            ssl->serverFinished_len = (byte)finishedSz;
11808
0
        }
11809
0
        else {
11810
0
            XMEMCPY(ssl->clientFinished, mac, finishedSz);
11811
0
            ssl->clientFinished_len = (byte)finishedSz;
11812
0
        }
11813
0
    #endif /* WOLFSSL_HAVE_TLS_UNIQUE */
11814
0
        if (ret != 0)
11815
0
            goto cleanup;
11816
0
        if (size != finishedSz) {
11817
0
            ret = BUFFER_ERROR;
11818
0
            goto cleanup;
11819
0
        }
11820
0
    }
11821
11822
#ifdef WOLFSSL_CALLBACKS
11823
    if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
11824
    if (ssl->toInfoOn) AddLateName("Finished", &ssl->timeoutInfo);
11825
#endif
11826
11827
0
    if (sniff == NO_SNIFF) {
11828
        /* Actually check verify data. */
11829
0
        if (size > WC_MAX_DIGEST_SIZE ||
11830
0
                ConstantCompare(input + *inOutIdx, mac, size) != 0){
11831
0
            WOLFSSL_MSG("Verify finished error on hashes");
11832
0
            SendAlert(ssl, alert_fatal, decrypt_error);
11833
0
            WOLFSSL_ERROR_VERBOSE(VERIFY_FINISHED_ERROR);
11834
0
            ret = VERIFY_FINISHED_ERROR;
11835
0
            goto cleanup;
11836
0
        }
11837
0
    }
11838
11839
    /* Force input exhaustion at ProcessReply by consuming padSz. */
11840
0
    *inOutIdx += size + ssl->keys.padSz;
11841
11842
0
#ifndef NO_WOLFSSL_SERVER
11843
0
    if (ssl->options.side == WOLFSSL_SERVER_END &&
11844
0
                                                  !ssl->options.handShakeDone) {
11845
#ifdef WOLFSSL_EARLY_DATA
11846
        if (ssl->earlyData != no_early_data) {
11847
            if ((ret = DeriveTls13Keys(ssl, no_key, DECRYPT_SIDE_ONLY, 1)) != 0)
11848
                goto cleanup;
11849
        }
11850
#endif
11851
        /* Setup keys for application data messages from client. */
11852
0
        if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
11853
0
            goto cleanup;
11854
0
    }
11855
0
#endif
11856
11857
0
#ifndef NO_WOLFSSL_CLIENT
11858
0
    if (ssl->options.side == WOLFSSL_CLIENT_END)
11859
0
        ssl->options.serverState = SERVER_FINISHED_COMPLETE;
11860
0
#endif
11861
0
#ifndef NO_WOLFSSL_SERVER
11862
0
    if (ssl->options.side == WOLFSSL_SERVER_END) {
11863
0
        ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
11864
0
        ssl->options.handShakeState = HANDSHAKE_DONE;
11865
0
        ssl->options.handShakeDone  = 1;
11866
0
    }
11867
0
#endif
11868
11869
#if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_EARLY_DATA)
11870
    if (ssl->options.dtls && ssl->earlyData > early_data_ext) {
11871
        /* DTLSv1.3 has no EndOfearlydata messages. We stop processing EarlyData
11872
           as soon we receive the client's finished message */
11873
        ssl->earlyData = done_early_data;
11874
    }
11875
#endif /* WOLFSSL_DTLS13 && WOLFSSL_EARLY_DATA */
11876
#if defined(WOLFSSL_QUIC) && defined(WOLFSSL_EARLY_DATA)
11877
    if (WOLFSSL_IS_QUIC(ssl) && ssl->earlyData > early_data_ext) {
11878
        /* QUIC has no EndOfEarlyData messages. We stop processing EarlyData
11879
           as soon we receive the client's finished message */
11880
        ssl->earlyData = done_early_data;
11881
    }
11882
#endif /* WOLFSSL_QUIC && WOLFSSL_EARLY_DATA */
11883
11884
0
    ret = 0;
11885
0
cleanup:
11886
0
    ForceZero(mac, sizeof(mac));
11887
0
    WOLFSSL_LEAVE("DoTls13Finished", ret);
11888
0
    WOLFSSL_END(WC_FUNC_FINISHED_DO);
11889
11890
0
    return ret;
11891
0
}
11892
11893
#if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)
11894
/* Send the TLS v1.3 Finished message.
11895
 *
11896
 * ssl  The SSL/TLS object.
11897
 * returns 0 on success, otherwise failure.
11898
 */
11899
static int SendTls13Finished(WOLFSSL* ssl)
11900
{
11901
    byte  finishedSz = ssl->specs.hash_size;
11902
    byte* input;
11903
    byte* output;
11904
    int   ret;
11905
    int   headerSz = HANDSHAKE_HEADER_SZ;
11906
    int   outputSz;
11907
    byte* secret;
11908
11909
#ifdef WOLFSSL_DTLS13
11910
    int dtlsRet = 0, isDtls = 0;
11911
#endif /* WOLFSSL_DTLS13 */
11912
11913
    WOLFSSL_START(WC_FUNC_FINISHED_SEND);
11914
    WOLFSSL_ENTER("SendTls13Finished");
11915
11916
    ssl->options.buildingMsg = 1;
11917
#ifdef WOLFSSL_DTLS13
11918
    if (ssl->options.dtls) {
11919
        headerSz = DTLS_HANDSHAKE_HEADER_SZ;
11920
        /* using isDtls instead of ssl->options.dtls will abide clang static
11921
           analyzer on using an uninitialized value */
11922
        isDtls = 1;
11923
    }
11924
#endif /* WOLFSSL_DTLS13 */
11925
11926
    outputSz = WC_MAX_DIGEST_SIZE + DTLS_HANDSHAKE_HEADER_SZ + MAX_MSG_EXTRA;
11927
    /* Check buffers are big enough and grow if needed. */
11928
    if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
11929
        return ret;
11930
11931
    /* get output buffer */
11932
    output = GetOutputBuffer(ssl);
11933
    input = output + RECORD_HEADER_SZ;
11934
11935
#ifdef WOLFSSL_DTLS13
11936
    if (isDtls)
11937
        input = output + Dtls13GetRlHeaderLength(ssl, 1);
11938
#endif /* WOLFSSL_DTLS13 */
11939
11940
    AddTls13HandShakeHeader(input, (word32)finishedSz, 0, (word32)finishedSz,
11941
            finished, ssl);
11942
11943
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
11944
    if (ssl->options.side == WOLFSSL_CLIENT_END) {
11945
        ret = tsip_Tls13SendFinished(ssl, output, outputSz, input, 1);
11946
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
11947
            return ret;
11948
        }
11949
        ret = 0;
11950
    }
11951
#endif /* WOLFSSL_RENESAS_TSIP_TLS */
11952
11953
    /* make finished hashes */
11954
    if (ssl->options.handShakeDone) {
11955
        ret = DeriveFinishedSecret(ssl, ssl->clientSecret,
11956
                                   ssl->keys.client_write_MAC_secret,
11957
                                   WOLFSSL_CLIENT_END);
11958
        if (ret != 0)
11959
            return ret;
11960
11961
        secret = ssl->keys.client_write_MAC_secret;
11962
    }
11963
    else if (ssl->options.side == WOLFSSL_CLIENT_END)
11964
        secret = ssl->keys.client_write_MAC_secret;
11965
    else {
11966
        /* All the handshake messages have been done to calculate client and
11967
         * server finished keys.
11968
         */
11969
        ret = DeriveFinishedSecret(ssl, ssl->clientSecret,
11970
                                   ssl->keys.client_write_MAC_secret,
11971
                                   WOLFSSL_CLIENT_END);
11972
        if (ret != 0)
11973
            return ret;
11974
11975
        ret = DeriveFinishedSecret(ssl, ssl->serverSecret,
11976
                                   ssl->keys.server_write_MAC_secret,
11977
                                   WOLFSSL_SERVER_END);
11978
        if (ret != 0)
11979
            return ret;
11980
11981
        secret = ssl->keys.server_write_MAC_secret;
11982
    }
11983
    ret = BuildTls13HandshakeHmac(ssl, secret, &input[headerSz], NULL);
11984
    if (ret != 0)
11985
        return ret;
11986
    #ifdef WOLFSSL_HAVE_TLS_UNIQUE
11987
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
11988
            XMEMCPY(ssl->clientFinished, &input[headerSz], finishedSz);
11989
            ssl->clientFinished_len = finishedSz;
11990
        }
11991
        else {
11992
            XMEMCPY(ssl->serverFinished, &input[headerSz], finishedSz);
11993
            ssl->serverFinished_len = finishedSz;
11994
        }
11995
    #endif /* WOLFSSL_HAVE_TLS_UNIQUE */
11996
11997
#ifdef WOLFSSL_DTLS13
11998
    if (isDtls) {
11999
        dtlsRet = Dtls13HandshakeSend(ssl, output, (word16)outputSz,
12000
            (word16)(Dtls13GetRlHeaderLength(ssl, 1) + headerSz + finishedSz), finished,
12001
            1);
12002
        if (dtlsRet != 0 && dtlsRet != WC_NO_ERR_TRACE(WANT_WRITE))
12003
            return dtlsRet;
12004
12005
    } else
12006
#endif /* WOLFSSL_DTLS13 */
12007
    {
12008
        /* This message is always encrypted. */
12009
        int sendSz = BuildTls13Message(ssl, output, outputSz, input,
12010
                                   headerSz + finishedSz, handshake, 1, 0, 0);
12011
        if (sendSz < 0) {
12012
            WOLFSSL_ERROR_VERBOSE(BUILD_MSG_ERROR);
12013
            return BUILD_MSG_ERROR;
12014
        }
12015
12016
        #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
12017
            if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
12018
            if (ssl->toInfoOn) {
12019
                ret = AddPacketInfo(ssl, "Finished", handshake, output, sendSz,
12020
                              WRITE_PROTO, 0, ssl->heap);
12021
                if (ret != 0)
12022
                    return ret;
12023
            }
12024
        #endif
12025
12026
        ssl->buffers.outputBuffer.length += (word32)sendSz;
12027
        ssl->options.buildingMsg = 0;
12028
    }
12029
12030
    if (ssl->options.side == WOLFSSL_SERVER_END) {
12031
#ifdef WOLFSSL_EARLY_DATA
12032
        byte storeTrafficDecKeys = ssl->earlyData == no_early_data;
12033
#endif
12034
        /* Can send application data now. */
12035
        if ((ret = DeriveMasterSecret(ssl)) != 0)
12036
            return ret;
12037
        /* Last use of preMasterSecret - zeroize as soon as possible. */
12038
        ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
12039
#ifdef WOLFSSL_EARLY_DATA
12040
12041
#ifdef WOLFSSL_DTLS13
12042
        /* DTLS13 dynamically change keys and it needs all
12043
           the keys in ssl->keys to save the keying material */
12044
        if (isDtls)
12045
            storeTrafficDecKeys = 1;
12046
#endif /* WOLFSSL_DTLS13 */
12047
12048
        if ((ret = DeriveTls13Keys(ssl, traffic_key, ENCRYPT_SIDE_ONLY, 1))
12049
                                                                         != 0) {
12050
            return ret;
12051
        }
12052
        if ((ret = DeriveTls13Keys(ssl, traffic_key, DECRYPT_SIDE_ONLY,
12053
                                       storeTrafficDecKeys)) != 0) {
12054
            return ret;
12055
        }
12056
#else
12057
        if ((ret = DeriveTls13Keys(ssl, traffic_key, ENCRYPT_AND_DECRYPT_SIDE,
12058
                                                                     1)) != 0) {
12059
            return ret;
12060
        }
12061
#endif
12062
        if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
12063
            return ret;
12064
12065
#ifdef WOLFSSL_DTLS13
12066
        if (isDtls) {
12067
            w64wrapper epochTraffic0;
12068
            epochTraffic0 = w64From32(0, DTLS13_EPOCH_TRAFFIC0);
12069
            ssl->dtls13Epoch = epochTraffic0;
12070
            ssl->dtls13PeerEpoch = epochTraffic0;
12071
12072
            ret = Dtls13SetEpochKeys(
12073
                ssl, epochTraffic0, ENCRYPT_AND_DECRYPT_SIDE);
12074
            if (ret != 0)
12075
                return ret;
12076
12077
        }
12078
#endif /* WOLFSSL_DTLS13 */
12079
12080
    }
12081
12082
    if (ssl->options.side == WOLFSSL_CLIENT_END &&
12083
                                                  !ssl->options.handShakeDone) {
12084
#ifdef WOLFSSL_EARLY_DATA
12085
        if (ssl->earlyData != no_early_data) {
12086
            if ((ret = DeriveTls13Keys(ssl, no_key, ENCRYPT_SIDE_ONLY,
12087
                                                                     1)) != 0) {
12088
                    return ret;
12089
            }
12090
        }
12091
#endif
12092
        /* Setup keys for application data messages. */
12093
        if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
12094
            return ret;
12095
12096
#if defined(HAVE_SESSION_TICKET)
12097
        ret = DeriveResumptionSecret(ssl, ssl->session->masterSecret);
12098
        if (ret != 0)
12099
            return ret;
12100
#endif
12101
12102
#ifdef WOLFSSL_DTLS13
12103
        if (isDtls) {
12104
            w64wrapper epochTraffic0;
12105
            epochTraffic0 = w64From32(0, DTLS13_EPOCH_TRAFFIC0);
12106
            ssl->dtls13Epoch = epochTraffic0;
12107
            ssl->dtls13PeerEpoch = epochTraffic0;
12108
12109
            ret = Dtls13SetEpochKeys(
12110
                ssl, epochTraffic0, ENCRYPT_AND_DECRYPT_SIDE);
12111
            if (ret != 0)
12112
                return ret;
12113
12114
        }
12115
#endif /* WOLFSSL_DTLS13 */
12116
    }
12117
12118
#ifndef NO_WOLFSSL_CLIENT
12119
    if (ssl->options.side == WOLFSSL_CLIENT_END) {
12120
        ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
12121
        ssl->options.handShakeState = HANDSHAKE_DONE;
12122
        ssl->options.handShakeDone  = 1;
12123
    }
12124
#endif
12125
#ifndef NO_WOLFSSL_SERVER
12126
    if (ssl->options.side == WOLFSSL_SERVER_END) {
12127
        ssl->options.serverState = SERVER_FINISHED_COMPLETE;
12128
    }
12129
#endif
12130
12131
#ifdef WOLFSSL_DTLS13
12132
    if (isDtls) {
12133
        WOLFSSL_LEAVE("SendTls13Finished", ret);
12134
        WOLFSSL_END(WC_FUNC_FINISHED_SEND);
12135
12136
        return dtlsRet;
12137
    }
12138
#endif /* WOLFSSL_DTLS13 */
12139
12140
    if ((ret = SendBuffered(ssl)) != 0)
12141
        return ret;
12142
12143
    WOLFSSL_LEAVE("SendTls13Finished", ret);
12144
    WOLFSSL_END(WC_FUNC_FINISHED_SEND);
12145
12146
    return ret;
12147
}
12148
#endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */
12149
12150
/* handle generation TLS v1.3 key_update (24) */
12151
/* Send the TLS v1.3 KeyUpdate message.
12152
 *
12153
 * ssl  The SSL/TLS object.
12154
 * returns 0 on success, otherwise failure.
12155
 */
12156
int SendTls13KeyUpdate(WOLFSSL* ssl)
12157
0
{
12158
0
    byte*  input;
12159
0
    byte*  output;
12160
0
    int    ret;
12161
0
    int    headerSz = HANDSHAKE_HEADER_SZ;
12162
0
    int    outputSz;
12163
0
    word32 i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
12164
12165
0
    WOLFSSL_START(WC_FUNC_KEY_UPDATE_SEND);
12166
0
    WOLFSSL_ENTER("SendTls13KeyUpdate");
12167
12168
#ifdef WOLFSSL_DTLS13
12169
    if (ssl->options.dtls)
12170
        i = Dtls13GetRlHeaderLength(ssl, 1) + DTLS_HANDSHAKE_HEADER_SZ;
12171
#endif /* WOLFSSL_DTLS13 */
12172
12173
0
    outputSz = OPAQUE8_LEN + MAX_MSG_EXTRA;
12174
    /* Check buffers are big enough and grow if needed. */
12175
0
    if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
12176
0
        return ret;
12177
12178
    /* get output buffer */
12179
0
    output = GetOutputBuffer(ssl);
12180
0
    input = output + RECORD_HEADER_SZ;
12181
12182
#ifdef WOLFSSL_DTLS13
12183
    if (ssl->options.dtls)
12184
        input = output + Dtls13GetRlHeaderLength(ssl, 1);
12185
#endif /* WOLFSSL_DTLS13 */
12186
12187
0
    AddTls13Headers(output, OPAQUE8_LEN, key_update, ssl);
12188
12189
    /* If:
12190
     *   1. I haven't sent a KeyUpdate requesting a response and
12191
     *   2. This isn't responding to peer KeyUpdate requiring a response then,
12192
     * I want a response.
12193
     */
12194
0
    ssl->keys.updateResponseReq = output[i++] =
12195
0
         !ssl->keys.updateResponseReq && !ssl->keys.keyUpdateRespond;
12196
    /* Sent response, no longer need to respond. */
12197
0
    ssl->keys.keyUpdateRespond = 0;
12198
12199
#ifdef WOLFSSL_DTLS13
12200
    if (ssl->options.dtls) {
12201
        ret = Dtls13HandshakeSend(ssl, output, (word16)outputSz,
12202
            OPAQUE8_LEN + Dtls13GetRlHeaderLength(ssl, 1) +
12203
                DTLS_HANDSHAKE_HEADER_SZ,
12204
            key_update, 0);
12205
    }
12206
    else
12207
#endif /* WOLFSSL_DTLS13 */
12208
0
    {
12209
        /* This message is always encrypted. */
12210
0
        int sendSz = BuildTls13Message(ssl, output, outputSz, input,
12211
0
                                   headerSz + OPAQUE8_LEN, handshake, 0, 0, 0);
12212
0
        if (sendSz < 0)
12213
0
            return BUILD_MSG_ERROR;
12214
12215
0
        #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
12216
0
            if (ssl->hsInfoOn) AddPacketName(ssl, "KeyUpdate");
12217
0
            if (ssl->toInfoOn) {
12218
0
                ret = AddPacketInfo(ssl, "KeyUpdate", handshake, output, sendSz,
12219
0
                              WRITE_PROTO, 0, ssl->heap);
12220
0
                if (ret != 0)
12221
0
                    return ret;
12222
0
            }
12223
0
        #endif
12224
12225
0
        ssl->buffers.outputBuffer.length += (word32)sendSz;
12226
12227
0
        ret = SendBuffered(ssl);
12228
12229
12230
0
        if (ret != 0 && ret != WC_NO_ERR_TRACE(WANT_WRITE))
12231
0
            return ret;
12232
0
    }
12233
12234
    /* In DTLS we must wait for the ack before setting up the new keys */
12235
0
    if (!ssl->options.dtls) {
12236
12237
        /* Future traffic uses new encryption keys. */
12238
0
        if ((ret = DeriveTls13Keys(
12239
0
                       ssl, update_traffic_key, ENCRYPT_SIDE_ONLY, 1))
12240
0
            != 0)
12241
0
            return ret;
12242
0
        if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
12243
0
            return ret;
12244
0
    }
12245
12246
12247
0
    WOLFSSL_LEAVE("SendTls13KeyUpdate", ret);
12248
0
    WOLFSSL_END(WC_FUNC_KEY_UPDATE_SEND);
12249
12250
0
    return ret;
12251
0
}
12252
12253
/* handle processing TLS v1.3 key_update (24) */
12254
/* Parse and handle a TLS v1.3 KeyUpdate message.
12255
 *
12256
 * ssl       The SSL/TLS object.
12257
 * input     The message buffer.
12258
 * inOutIdx  On entry, the index into the message buffer of Finished.
12259
 *           On exit, the index of byte after the Finished message and padding.
12260
 * totalSz   The length of the current handshake message.
12261
 * returns 0 on success and otherwise failure.
12262
 */
12263
static int DoTls13KeyUpdate(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
12264
                            word32 totalSz)
12265
0
{
12266
0
    int    ret;
12267
0
    word32 i = *inOutIdx;
12268
12269
0
    WOLFSSL_START(WC_FUNC_KEY_UPDATE_DO);
12270
0
    WOLFSSL_ENTER("DoTls13KeyUpdate");
12271
12272
    /* check against totalSz */
12273
0
    if (OPAQUE8_LEN != totalSz)
12274
0
        return BUFFER_E;
12275
12276
0
    switch (input[i]) {
12277
0
        case update_not_requested:
12278
            /* This message in response to any outstanding request. */
12279
0
            ssl->keys.keyUpdateRespond = 0;
12280
0
            ssl->keys.updateResponseReq = 0;
12281
0
            break;
12282
0
        case update_requested:
12283
            /* New key update requiring a response. */
12284
0
            ssl->keys.keyUpdateRespond = 1;
12285
0
            break;
12286
0
        default:
12287
0
            WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
12288
0
            return INVALID_PARAMETER;
12289
0
    }
12290
12291
    /* Move index to byte after message. */
12292
0
    *inOutIdx += totalSz;
12293
    /* Always encrypted. */
12294
0
    *inOutIdx += ssl->keys.padSz;
12295
12296
    /* Future traffic uses new decryption keys. */
12297
0
    if ((ret = DeriveTls13Keys(ssl, update_traffic_key, DECRYPT_SIDE_ONLY, 1))
12298
0
                                                                         != 0) {
12299
0
        return ret;
12300
0
    }
12301
0
    if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
12302
0
        return ret;
12303
12304
#ifdef WOLFSSL_DTLS13
12305
    if (ssl->options.dtls) {
12306
        w64Increment(&ssl->dtls13PeerEpoch);
12307
12308
        ret = Dtls13SetEpochKeys(ssl, ssl->dtls13PeerEpoch, DECRYPT_SIDE_ONLY);
12309
        if (ret != 0)
12310
            return ret;
12311
    }
12312
#endif /* WOLFSSL_DTLS13 */
12313
12314
0
    if (ssl->keys.keyUpdateRespond) {
12315
12316
#ifdef WOLFSSL_DTLS13
12317
        /* we already sent a keyUpdate (either in response to a previous
12318
           KeyUpdate or initiated by the application) and we are waiting for the
12319
           ack. We can't send a new KeyUpdate right away but to honor the RFC we
12320
           should send another KeyUpdate after the one in-flight is acked. We
12321
           don't do that as it looks redundant, it will make the code more
12322
           complex and I don't see a good use case for that. */
12323
        if (ssl->options.dtls && ssl->dtls13WaitKeyUpdateAck) {
12324
            ssl->keys.keyUpdateRespond = 0;
12325
            return 0;
12326
        }
12327
#endif /* WOLFSSL_DTLS13 */
12328
12329
#if defined(HAVE_WRITE_DUP) && defined(WOLFSSL_TLS13)
12330
        /* Read side cannot write; delegate the response to the write side. */
12331
        if (ssl->dupWrite != NULL && ssl->dupSide == READ_DUP_SIDE) {
12332
            if (wc_LockMutex(&ssl->dupWrite->dupMutex) != 0)
12333
                return BAD_MUTEX_E;
12334
            ssl->dupWrite->keyUpdateRespond = 1;
12335
            wc_UnLockMutex(&ssl->dupWrite->dupMutex);
12336
            ssl->keys.keyUpdateRespond = 0;
12337
            return 0;
12338
        }
12339
#endif /* HAVE_WRITE_DUP && WOLFSSL_TLS13 */
12340
12341
0
#ifndef WOLFSSL_RW_THREADED
12342
0
        return SendTls13KeyUpdate(ssl);
12343
#else
12344
        ssl->options.sendKeyUpdate = 1;
12345
        return 0;
12346
#endif
12347
0
    }
12348
12349
0
    WOLFSSL_LEAVE("DoTls13KeyUpdate", ret);
12350
0
    WOLFSSL_END(WC_FUNC_KEY_UPDATE_DO);
12351
12352
0
    return 0;
12353
0
}
12354
12355
#ifdef WOLFSSL_EARLY_DATA
12356
#ifndef NO_WOLFSSL_CLIENT
12357
/* Send the TLS v1.3 EndOfEarlyData message to indicate that there will be no
12358
 * more early application data.
12359
 * The encryption key now changes to the pre-calculated handshake key.
12360
 *
12361
 * ssl  The SSL/TLS object.
12362
 * returns 0 on success and otherwise failure.
12363
 */
12364
static int SendTls13EndOfEarlyData(WOLFSSL* ssl)
12365
{
12366
    byte*  output;
12367
    int    ret;
12368
    int    sendSz;
12369
    word32 length;
12370
    word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
12371
12372
    WOLFSSL_START(WC_FUNC_END_OF_EARLY_DATA_SEND);
12373
    WOLFSSL_ENTER("SendTls13EndOfEarlyData");
12374
12375
    length = 0;
12376
    sendSz = (int)(idx + length + MAX_MSG_EXTRA);
12377
    ssl->options.buildingMsg = 1;
12378
12379
    /* Check buffers are big enough and grow if needed. */
12380
    if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
12381
        return ret;
12382
12383
    /* Get position in output buffer to write new message to. */
12384
    output = GetOutputBuffer(ssl);
12385
12386
    /* Put the record and handshake headers on. */
12387
    AddTls13Headers(output, length, end_of_early_data, ssl);
12388
12389
    /* This message is always encrypted. */
12390
    sendSz = BuildTls13Message(ssl, output, sendSz, output + RECORD_HEADER_SZ,
12391
                               idx - RECORD_HEADER_SZ, handshake, 1, 0, 0);
12392
    if (sendSz < 0)
12393
        return sendSz;
12394
12395
    ssl->buffers.outputBuffer.length += sendSz;
12396
12397
    if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
12398
        return ret;
12399
12400
    ssl->options.buildingMsg = 0;
12401
    if (!ssl->options.groupMessages)
12402
        ret = SendBuffered(ssl);
12403
12404
    ssl->earlyData = done_early_data;
12405
12406
    WOLFSSL_LEAVE("SendTls13EndOfEarlyData", ret);
12407
    WOLFSSL_END(WC_FUNC_END_OF_EARLY_DATA_SEND);
12408
12409
    return ret;
12410
}
12411
#endif /* !NO_WOLFSSL_CLIENT */
12412
12413
#ifndef NO_WOLFSSL_SERVER
12414
/* handle processing of TLS 1.3 end_of_early_data (5) */
12415
/* Parse the TLS v1.3 EndOfEarlyData message that indicates that there will be
12416
 * no more early application data.
12417
 * The decryption key now changes to the pre-calculated handshake key.
12418
 *
12419
 * ssl  The SSL/TLS object.
12420
 * returns 0 on success and otherwise failure.
12421
 */
12422
static int DoTls13EndOfEarlyData(WOLFSSL* ssl, const byte* input,
12423
                                 word32* inOutIdx, word32 size)
12424
{
12425
    int    ret;
12426
    word32 begin = *inOutIdx;
12427
12428
    (void)input;
12429
12430
    WOLFSSL_START(WC_FUNC_END_OF_EARLY_DATA_DO);
12431
    WOLFSSL_ENTER("DoTls13EndOfEarlyData");
12432
12433
    if ((*inOutIdx - begin) != size)
12434
        return BUFFER_ERROR;
12435
12436
    if (ssl->earlyData == no_early_data) {
12437
        WOLFSSL_MSG("EndOfEarlyData received unexpectedly");
12438
        SendAlert(ssl, alert_fatal, unexpected_message);
12439
        WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12440
        return OUT_OF_ORDER_E;
12441
    }
12442
12443
    ssl->earlyData = done_early_data;
12444
12445
    /* Always encrypted. */
12446
    *inOutIdx += ssl->keys.padSz;
12447
12448
    ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY);
12449
12450
    WOLFSSL_LEAVE("DoTls13EndOfEarlyData", ret);
12451
    WOLFSSL_END(WC_FUNC_END_OF_EARLY_DATA_DO);
12452
12453
    return ret;
12454
}
12455
#endif /* !NO_WOLFSSL_SERVER */
12456
#endif /* WOLFSSL_EARLY_DATA */
12457
12458
#if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TICKET_NONCE_MALLOC) &&    \
12459
    (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
12460
int SessionTicketNoncePopulate(WOLFSSL_SESSION *session, const byte *nonce,
12461
    byte len)
12462
{
12463
    if (session->ticketNonce.data
12464
            != session->ticketNonce.dataStatic) {
12465
         XFREE(session->ticketNonce.data, session->heap,
12466
             DYNAMIC_TYPE_SESSION_TICK);
12467
         session->ticketNonce.data = session->ticketNonce.dataStatic;
12468
         session->ticketNonce.len = 0;
12469
    }
12470
12471
    if (len > MAX_TICKET_NONCE_STATIC_SZ) {
12472
        WOLFSSL_MSG("Using dynamic nonce buffer");
12473
        session->ticketNonce.data = (byte*)XMALLOC(len,
12474
            session->heap, DYNAMIC_TYPE_SESSION_TICK);
12475
        if (session->ticketNonce.data == NULL)
12476
            return MEMORY_ERROR;
12477
    }
12478
    XMEMCPY(session->ticketNonce.data, nonce, len);
12479
    session->ticketNonce.len = len;
12480
    return 0;
12481
}
12482
#endif
12483
#ifndef NO_WOLFSSL_CLIENT
12484
/* Handle a New Session Ticket handshake message.
12485
 * Message contains the information required to perform resumption.
12486
 *
12487
 * ssl       The SSL/TLS object.
12488
 * input     The message buffer.
12489
 * inOutIdx  On entry, the index into the message buffer of Finished.
12490
 *           On exit, the index of byte after the Finished message and padding.
12491
 * size      The length of the current handshake message.
12492
 * returns 0 on success, otherwise failure.
12493
 */
12494
static int DoTls13NewSessionTicket(WOLFSSL* ssl, const byte* input,
12495
                                   word32* inOutIdx, word32 size)
12496
0
{
12497
0
#ifdef HAVE_SESSION_TICKET
12498
0
    int    ret;
12499
0
    word32 begin = *inOutIdx;
12500
0
    word32 lifetime;
12501
0
    word32 ageAdd;
12502
0
    word16 length;
12503
#ifdef WOLFSSL_32BIT_MILLI_TIME
12504
    word32 now;
12505
#else
12506
0
    sword64 now;
12507
0
#endif
12508
0
    const byte* nonce;
12509
0
    byte        nonceLength;
12510
12511
0
    WOLFSSL_START(WC_FUNC_NEW_SESSION_TICKET_DO);
12512
0
    WOLFSSL_ENTER("DoTls13NewSessionTicket");
12513
12514
#ifdef HAVE_ECH
12515
    /* ignore session ticket when ECH is rejected */
12516
    if (ssl->echConfigs != NULL && !ssl->options.disableECH &&
12517
            !ssl->options.echAccepted) {
12518
        *inOutIdx += size + ssl->keys.padSz;
12519
        return 0;
12520
    }
12521
#endif
12522
12523
    /* Lifetime hint. */
12524
0
    if ((*inOutIdx - begin) + SESSION_HINT_SZ > size)
12525
0
        return BUFFER_ERROR;
12526
0
    ato32(input + *inOutIdx, &lifetime);
12527
0
    *inOutIdx += SESSION_HINT_SZ;
12528
0
    if (lifetime > MAX_LIFETIME) {
12529
0
        WOLFSSL_ERROR_VERBOSE(SERVER_HINT_ERROR);
12530
0
        return SERVER_HINT_ERROR;
12531
0
    }
12532
12533
    /* Age add. */
12534
0
    if ((*inOutIdx - begin) + SESSION_ADD_SZ > size)
12535
0
        return BUFFER_ERROR;
12536
0
    ato32(input + *inOutIdx, &ageAdd);
12537
0
    *inOutIdx += SESSION_ADD_SZ;
12538
12539
    /* Ticket nonce. */
12540
0
    if ((*inOutIdx - begin) + 1 > size)
12541
0
        return BUFFER_ERROR;
12542
0
    nonceLength = input[*inOutIdx];
12543
0
#if !defined(WOLFSSL_TICKET_NONCE_MALLOC) &&                                   \
12544
0
    (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
12545
0
    if (nonceLength > MAX_TICKET_NONCE_STATIC_SZ) {
12546
0
        WOLFSSL_MSG("Nonce length not supported");
12547
0
        WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
12548
0
        return INVALID_PARAMETER;
12549
0
    }
12550
0
#endif /* WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3) */
12551
0
    *inOutIdx += 1;
12552
0
    if ((*inOutIdx - begin) + nonceLength > size)
12553
0
        return BUFFER_ERROR;
12554
0
    nonce = input + *inOutIdx;
12555
0
    *inOutIdx += nonceLength;
12556
12557
    /* Ticket length. */
12558
0
    if ((*inOutIdx - begin) + LENGTH_SZ > size)
12559
0
        return BUFFER_ERROR;
12560
0
    ato16(input + *inOutIdx, &length);
12561
0
    *inOutIdx += LENGTH_SZ;
12562
0
    if ((*inOutIdx - begin) + length > size)
12563
0
        return BUFFER_ERROR;
12564
12565
0
    if ((ret = SetTicket(ssl, input + *inOutIdx, length)) != 0)
12566
0
        return ret;
12567
0
    *inOutIdx += length;
12568
12569
0
    now = TimeNowInMilliseconds();
12570
0
    if (now == 0)
12571
0
        return GETTIME_ERROR;
12572
    /* Copy in ticket data (server identity). */
12573
0
    ssl->timeout                  = lifetime;
12574
0
    ssl->session->timeout         = lifetime;
12575
0
    ssl->session->cipherSuite0    = ssl->options.cipherSuite0;
12576
0
    ssl->session->cipherSuite     = ssl->options.cipherSuite;
12577
0
    ssl->session->ticketSeen      = now;
12578
0
    ssl->session->ticketAdd       = ageAdd;
12579
    #ifdef WOLFSSL_EARLY_DATA
12580
    ssl->session->maxEarlyDataSz  = ssl->options.maxEarlyDataSz;
12581
    #endif
12582
12583
#if defined(WOLFSSL_TICKET_NONCE_MALLOC) &&                                    \
12584
    (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
12585
    ret = SessionTicketNoncePopulate(ssl->session, nonce, nonceLength);
12586
    if (ret != 0)
12587
        return ret;
12588
#else
12589
0
    ssl->session->ticketNonce.len = nonceLength;
12590
0
    if (nonceLength > MAX_TICKET_NONCE_STATIC_SZ) {
12591
0
        ret = BUFFER_ERROR;
12592
0
        return ret;
12593
0
    }
12594
0
    if (nonceLength > 0)
12595
0
        XMEMCPY(ssl->session->ticketNonce.data, nonce, nonceLength);
12596
0
#endif /* defined(WOLFSSL_TICKET_NONCE_MALLOC) && FIPS_VERSION_GE(5,3) */
12597
12598
0
    ssl->session->namedGroup      = ssl->namedGroup;
12599
12600
0
    if ((*inOutIdx - begin) + EXTS_SZ > size)
12601
0
        return BUFFER_ERROR;
12602
0
    ato16(input + *inOutIdx, &length);
12603
0
    *inOutIdx += EXTS_SZ;
12604
0
    if ((*inOutIdx - begin) + length != size)
12605
0
        return BUFFER_ERROR;
12606
    #ifdef WOLFSSL_EARLY_DATA
12607
    ret = TLSX_Parse(ssl, (byte *)input + (*inOutIdx), length, session_ticket,
12608
                     NULL);
12609
    if (ret != 0)
12610
        return ret;
12611
    #endif
12612
0
    *inOutIdx += length;
12613
12614
0
    SetupSession(ssl);
12615
0
    #ifndef NO_SESSION_CACHE
12616
0
        AddSession(ssl);
12617
0
    #endif
12618
12619
    /* Always encrypted. */
12620
0
    *inOutIdx += ssl->keys.padSz;
12621
12622
0
    ssl->expect_session_ticket = 0;
12623
#else
12624
    (void)ssl;
12625
    (void)input;
12626
12627
    WOLFSSL_ENTER("DoTls13NewSessionTicket");
12628
12629
    *inOutIdx += size + ssl->keys.padSz;
12630
#endif /* HAVE_SESSION_TICKET */
12631
12632
0
    WOLFSSL_LEAVE("DoTls13NewSessionTicket", 0);
12633
0
    WOLFSSL_END(WC_FUNC_NEW_SESSION_TICKET_DO);
12634
12635
0
    return 0;
12636
0
}
12637
#endif /* NO_WOLFSSL_CLIENT */
12638
12639
#ifndef NO_WOLFSSL_SERVER
12640
    #ifdef HAVE_SESSION_TICKET
12641
12642
#ifdef WOLFSSL_TLS13_TICKET_BEFORE_FINISHED
12643
/* Offset of the MAC size in the finished message. */
12644
#define FINISHED_MSG_SIZE_OFFSET    3
12645
12646
/* Calculate the resumption secret which includes the unseen client finished
12647
 * message.
12648
 *
12649
 * ssl  The SSL/TLS object.
12650
 * returns 0 on success, otherwise failure.
12651
 */
12652
static int ExpectedResumptionSecret(WOLFSSL* ssl)
12653
{
12654
    int         ret;
12655
    word32      finishedSz = 0;
12656
    byte        mac[WC_MAX_DIGEST_SIZE];
12657
    Digest      digest;
12658
    byte header[] = { 0x14, 0x00, 0x00, 0x00 };
12659
12660
    XMEMSET(&digest, 0, sizeof(Digest));
12661
12662
    /* Copy the running hash so we can restore it after. */
12663
    switch (ssl->specs.mac_algorithm) {
12664
    #ifndef NO_SHA256
12665
        case sha256_mac:
12666
            ret = wc_Sha256Copy(&ssl->hsHashes->hashSha256, &digest.sha256);
12667
            if (ret != 0)
12668
                return ret;
12669
            break;
12670
    #endif
12671
    #ifdef WOLFSSL_SHA384
12672
        case sha384_mac:
12673
            ret = wc_Sha384Copy(&ssl->hsHashes->hashSha384, &digest.sha384);
12674
            if (ret != 0)
12675
                return ret;
12676
            break;
12677
    #endif
12678
    #ifdef WOLFSSL_TLS13_SHA512
12679
        case sha512_mac:
12680
            ret = wc_Sha512Copy(&ssl->hsHashes->hashSha512, &digest.sha512);
12681
            if (ret != 0)
12682
                return ret;
12683
            break;
12684
    #endif
12685
    #ifdef WOLFSSL_SM3
12686
        case sm3_mac:
12687
            ret = wc_Sm3Copy(&ssl->hsHashes->hashSm3, &digest.sm3);
12688
            if (ret != 0)
12689
                return ret;
12690
            break;
12691
    #endif
12692
    }
12693
12694
    /* Generate the Client's Finished message and hash it. */
12695
    ret = BuildTls13HandshakeHmac(ssl, ssl->keys.client_write_MAC_secret, mac,
12696
                                  &finishedSz);
12697
    if (ret != 0)
12698
        goto restore;
12699
    header[FINISHED_MSG_SIZE_OFFSET] = finishedSz;
12700
#ifdef WOLFSSL_EARLY_DATA
12701
    if (ssl->earlyData != no_early_data) {
12702
        static byte endOfEarlyData[] = { 0x05, 0x00, 0x00, 0x00 };
12703
        ret = HashRaw(ssl, endOfEarlyData, sizeof(endOfEarlyData));
12704
        if (ret != 0)
12705
            goto restore;
12706
    }
12707
#endif
12708
    if ((ret = HashRaw(ssl, header, sizeof(header))) != 0)
12709
        goto restore;
12710
    if ((ret = HashRaw(ssl, mac, finishedSz)) != 0)
12711
        goto restore;
12712
12713
    if ((ret = DeriveResumptionSecret(ssl, ssl->session->masterSecret)) != 0)
12714
        goto restore;
12715
12716
    /* Restore the hash inline with currently seen messages. */
12717
restore:
12718
    switch (ssl->specs.mac_algorithm) {
12719
    #ifndef NO_SHA256
12720
        case sha256_mac:
12721
            wc_Sha256Free(&ssl->hsHashes->hashSha256);
12722
            ret = wc_Sha256Copy(&digest.sha256, &ssl->hsHashes->hashSha256);
12723
            wc_Sha256Free(&digest.sha256);
12724
            break;
12725
    #endif
12726
    #ifdef WOLFSSL_SHA384
12727
        case sha384_mac:
12728
            wc_Sha384Free(&ssl->hsHashes->hashSha384);
12729
            ret = wc_Sha384Copy(&digest.sha384, &ssl->hsHashes->hashSha384);
12730
            wc_Sha384Free(&digest.sha384);
12731
            break;
12732
    #endif
12733
    #ifdef WOLFSSL_TLS13_SHA512
12734
        case sha512_mac:
12735
            wc_Sha512Free(&ssl->hsHashes->hashSha512);
12736
            ret = wc_Sha512Copy(&digest.sha512, &ssl->hsHashes->hashSha512);
12737
            wc_Sha512Free(&digest.sha512);
12738
            break;
12739
    #endif
12740
    #ifdef WOLFSSL_SM3
12741
        case sm3_mac:
12742
            wc_Sm3Free(&ssl->hsHashes->hashSm3);
12743
            ret = wc_Sm3Copy(&digest.sm3, &ssl->hsHashes->hashSm3);
12744
            wc_Sm3Free(&digest.sm3);
12745
            break;
12746
    #endif
12747
    }
12748
12749
    ForceZero(mac, sizeof(mac));
12750
    return ret;
12751
}
12752
#endif
12753
12754
/* Send New Session Ticket handshake message.
12755
 * Message contains the information required to perform resumption.
12756
 *
12757
 * ssl  The SSL/TLS object.
12758
 * returns 0 on success, otherwise failure.
12759
 */
12760
static int SendTls13NewSessionTicket(WOLFSSL* ssl)
12761
0
{
12762
0
    byte*  output;
12763
0
    int    ret;
12764
0
    word32 length;
12765
0
    int    sendSz;
12766
0
    word16 extSz;
12767
0
    word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
12768
12769
0
    WOLFSSL_START(WC_FUNC_NEW_SESSION_TICKET_SEND);
12770
0
    WOLFSSL_ENTER("SendTls13NewSessionTicket");
12771
12772
#ifdef WOLFSSL_DTLS13
12773
    if (ssl->options.dtls)
12774
        idx = Dtls13GetRlHeaderLength(ssl, 1) + DTLS_HANDSHAKE_HEADER_SZ;
12775
#endif /* WOLFSSL_DTLS13 */
12776
12777
#ifdef WOLFSSL_TLS13_TICKET_BEFORE_FINISHED
12778
    if (!ssl->msgsReceived.got_finished) {
12779
        if ((ret = ExpectedResumptionSecret(ssl)) != 0)
12780
            return ret;
12781
    }
12782
#endif
12783
12784
    /* Start ticket nonce at 0 and go up to 255. */
12785
0
    if (ssl->session->ticketNonce.len == 0) {
12786
0
        ssl->session->ticketNonce.len = DEF_TICKET_NONCE_SZ;
12787
0
        ssl->session->ticketNonce.data[0] = 0;
12788
0
    }
12789
0
    else
12790
    #ifdef WOLFSSL_ASYNC_CRYPT
12791
        if (ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E))
12792
    #endif
12793
0
    {
12794
0
        if (ssl->session->ticketNonce.data[0] == 255) {
12795
            /* RFC8446 Section 4.6.1: Each ticket must have a unique nonce
12796
             * value. As the nonce is only a single byte, we have to prevent
12797
             * the overflow and abort. */
12798
0
            return SESSION_TICKET_NONCE_OVERFLOW;
12799
0
        }
12800
0
        else
12801
0
            ssl->session->ticketNonce.data[0]++;
12802
0
    }
12803
12804
0
    if ((ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0) {
12805
        /* In this case we only send the ID as the ticket. Let's generate a new
12806
         * ID for the new ticket so that we don't overwrite any old ones */
12807
0
        ret = wc_RNG_GenerateBlock(ssl->rng, ssl->session->altSessionID,
12808
0
                                   ID_LEN);
12809
0
        if (ret != 0)
12810
0
            return ret;
12811
0
        ssl->session->haveAltSessionID = 1;
12812
0
    }
12813
12814
0
    if (!ssl->options.noTicketTls13) {
12815
0
        if ((ret = SetupTicket(ssl)) != 0)
12816
0
            return ret;
12817
        /* No need to create the ticket if we only send the ID */
12818
0
        if ((ssl->options.mask & WOLFSSL_OP_NO_TICKET) == 0) {
12819
0
            if ((ret = CreateTicket(ssl)) != 0)
12820
0
                return ret;
12821
0
        }
12822
0
    }
12823
12824
#ifdef WOLFSSL_EARLY_DATA
12825
    ssl->session->maxEarlyDataSz = ssl->options.maxEarlyDataSz;
12826
    if (ssl->session->maxEarlyDataSz > 0)
12827
        TLSX_EarlyData_Use(ssl, ssl->session->maxEarlyDataSz, 1);
12828
    extSz = 0;
12829
    ret = TLSX_GetResponseSize(ssl, session_ticket, &extSz);
12830
    if (ret != 0)
12831
        return ret;
12832
#else
12833
0
    extSz = EXTS_SZ;
12834
0
#endif
12835
    /* Lifetime | Age Add | Ticket session ID | Extensions */
12836
0
    length = SESSION_HINT_SZ + SESSION_ADD_SZ + LENGTH_SZ;
12837
0
    if ((ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0)
12838
0
        length += ID_LEN + extSz;
12839
0
    else
12840
0
        length += ssl->session->ticketLen + extSz;
12841
    /* Nonce */
12842
0
    length += TICKET_NONCE_LEN_SZ + DEF_TICKET_NONCE_SZ;
12843
12844
0
    sendSz = (int)(idx + length + MAX_MSG_EXTRA);
12845
12846
    /* Check buffers are big enough and grow if needed. */
12847
0
    if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
12848
0
        return ret;
12849
12850
    /* Get position in output buffer to write new message to. */
12851
0
    output = GetOutputBuffer(ssl);
12852
12853
    /* Put the record and handshake headers on. */
12854
0
    AddTls13Headers(output, length, session_ticket, ssl);
12855
12856
    /* Lifetime hint */
12857
0
    c32toa(ssl->ctx->ticketHint, output + idx);
12858
0
    idx += SESSION_HINT_SZ;
12859
    /* Age add - obfuscator */
12860
0
    c32toa(ssl->session->ticketAdd, output + idx);
12861
0
    idx += SESSION_ADD_SZ;
12862
12863
0
    output[idx++] = ssl->session->ticketNonce.len;
12864
0
    output[idx++] = ssl->session->ticketNonce.data[0];
12865
12866
    /* length */
12867
0
    if ((ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0) {
12868
0
        c16toa(ID_LEN, output + idx);
12869
0
    }
12870
0
    else {
12871
0
        c16toa(ssl->session->ticketLen, output + idx);
12872
0
    }
12873
12874
0
    idx += LENGTH_SZ;
12875
    /* ticket */
12876
0
    if ((ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0) {
12877
0
        if (ssl->session->haveAltSessionID)
12878
0
            XMEMCPY(output + idx, ssl->session->altSessionID, ID_LEN);
12879
0
        else
12880
0
            return BAD_FUNC_ARG; /* Should not happen */
12881
0
        idx += ID_LEN;
12882
0
    }
12883
0
    else {
12884
0
        XMEMCPY(output + idx, ssl->session->ticket, ssl->session->ticketLen);
12885
0
        idx += ssl->session->ticketLen;
12886
0
    }
12887
12888
#ifdef WOLFSSL_EARLY_DATA
12889
    extSz = 0;
12890
    ret = TLSX_WriteResponse(ssl, output + idx, session_ticket, &extSz);
12891
    if (ret != 0)
12892
        return ret;
12893
    idx += extSz;
12894
#else
12895
    /* No extension support - empty extensions. */
12896
0
    c16toa(0, output + idx);
12897
0
    idx += EXTS_SZ;
12898
0
#endif
12899
12900
0
    if (idx > WOLFSSL_MAX_16BIT ||
12901
0
        sendSz > (int)WOLFSSL_MAX_16BIT) {
12902
0
        return BAD_LENGTH_E;
12903
0
    }
12904
12905
0
    ssl->options.haveSessionId = 1;
12906
12907
0
    SetupSession(ssl);
12908
    /* Only add to cache when support built in and when the ticket contains
12909
     * an ID. Otherwise we have no way to actually retrieve the ticket from the
12910
     * cache. */
12911
0
#if !defined(NO_SESSION_CACHE) && defined(WOLFSSL_TICKET_HAVE_ID)
12912
0
    AddSession(ssl);
12913
0
#endif
12914
12915
#ifdef WOLFSSL_DTLS13
12916
    if (ssl->options.dtls)
12917
        return Dtls13HandshakeSend(ssl, output, (word16)sendSz,
12918
                                   (word16)idx, session_ticket, 0);
12919
#endif /* WOLFSSL_DTLS13 */
12920
12921
    /* This message is always encrypted. */
12922
0
    sendSz = BuildTls13Message(ssl, output, sendSz,
12923
0
                               output + RECORD_HEADER_SZ,
12924
0
                               (word16)idx - RECORD_HEADER_SZ,
12925
0
                               handshake, 0, 0, 0);
12926
0
    if (sendSz < 0)
12927
0
        return sendSz;
12928
12929
0
    ssl->buffers.outputBuffer.length += sendSz;
12930
12931
    /* Always send as this is either directly after server's Finished or only
12932
     * message after client's Finished.
12933
     */
12934
0
    ret = SendBuffered(ssl);
12935
12936
0
    WOLFSSL_LEAVE("SendTls13NewSessionTicket", 0);
12937
0
    WOLFSSL_END(WC_FUNC_NEW_SESSION_TICKET_SEND);
12938
12939
0
    return ret;
12940
0
}
12941
    #endif /* HAVE_SESSION_TICKET */
12942
#endif /* NO_WOLFSSL_SERVER */
12943
12944
/* Make sure no duplicates, no fast forward, or other problems
12945
 *
12946
 * ssl   The SSL/TLS object.
12947
 * type  Type of handshake message received.
12948
 * returns 0 on success, otherwise failure.
12949
 */
12950
static int SanityCheckTls13MsgReceived(WOLFSSL* ssl, byte type)
12951
{
12952
    /* verify not a duplicate, mark received, check state */
12953
    switch (type) {
12954
12955
#ifndef NO_WOLFSSL_SERVER
12956
        case client_hello:
12957
        #ifndef NO_WOLFSSL_CLIENT
12958
            /* Only valid when received on SERVER side. */
12959
            if (ssl->options.side == WOLFSSL_CLIENT_END) {
12960
                WOLFSSL_MSG("ClientHello received by client");
12961
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
12962
                return SIDE_ERROR;
12963
            }
12964
        #endif
12965
            /* Check state. */
12966
            if (ssl->options.clientState >= CLIENT_HELLO_COMPLETE) {
12967
                WOLFSSL_MSG("ClientHello received out of order");
12968
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12969
                return OUT_OF_ORDER_E;
12970
            }
12971
            /* Check previously seen. */
12972
            /* Initial and after HelloRetryRequest - no more than 2. */
12973
            if (ssl->msgsReceived.got_client_hello == 2) {
12974
                WOLFSSL_MSG("Too many ClientHello received");
12975
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
12976
                return DUPLICATE_MSG_E;
12977
            }
12978
            /* Second only after HelloRetryRequest seen. */
12979
            if (ssl->msgsReceived.got_client_hello == 1 &&
12980
                ssl->options.serverState !=
12981
                                          SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
12982
                WOLFSSL_MSG("Duplicate ClientHello received");
12983
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
12984
                return DUPLICATE_MSG_E;
12985
            }
12986
            ssl->msgsReceived.got_client_hello++;
12987
12988
            break;
12989
#endif
12990
12991
#ifndef NO_WOLFSSL_CLIENT
12992
        case server_hello:
12993
        #ifndef NO_WOLFSSL_SERVER
12994
            /* Only valid when received on CLIENT side. */
12995
            if (ssl->options.side == WOLFSSL_SERVER_END) {
12996
                WOLFSSL_MSG("ServerHello received by server");
12997
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
12998
                return SIDE_ERROR;
12999
            }
13000
        #endif
13001
            /* Check state. */
13002
            if (ssl->options.serverState >= SERVER_HELLO_COMPLETE) {
13003
                WOLFSSL_MSG("ServerHello received out of order");
13004
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13005
                return OUT_OF_ORDER_E;
13006
            }
13007
            /* Check previously seen. */
13008
            /* Only once after ClientHello.
13009
             * HelloRetryRequest has ServerHello type but count fixed up later
13010
             * - see DoTls13ServerHello().
13011
             */
13012
            if (ssl->msgsReceived.got_server_hello) {
13013
                WOLFSSL_MSG("Duplicate ServerHello received");
13014
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
13015
                return DUPLICATE_MSG_E;
13016
            }
13017
            ssl->msgsReceived.got_server_hello = 1;
13018
13019
            break;
13020
#endif
13021
13022
#ifndef NO_WOLFSSL_CLIENT
13023
        case session_ticket:
13024
        #ifndef NO_WOLFSSL_SERVER
13025
            /* Only valid when received on CLIENT side. */
13026
            if (ssl->options.side == WOLFSSL_SERVER_END) {
13027
                WOLFSSL_MSG("NewSessionTicket received by server");
13028
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
13029
                return SIDE_ERROR;
13030
            }
13031
        #endif
13032
            /* Check state. */
13033
        #ifdef WOLFSSL_TLS13_TICKET_BEFORE_FINISHED
13034
            /* Only allowed after server's Finished message. */
13035
            if (ssl->options.serverState < SERVER_FINISHED_COMPLETE) {
13036
                WOLFSSL_MSG("NewSessionTicket received out of order");
13037
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13038
                return OUT_OF_ORDER_E;
13039
            }
13040
        #else
13041
            /* Only allowed after client's Finished message. */
13042
            if (ssl->options.clientState < CLIENT_FINISHED_COMPLETE) {
13043
                WOLFSSL_MSG("NewSessionTicket received out of order");
13044
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13045
                return OUT_OF_ORDER_E;
13046
            }
13047
        #endif
13048
            /* Many SessionTickets can be sent. */
13049
            ssl->msgsReceived.got_session_ticket = 1;
13050
13051
            break;
13052
#endif
13053
13054
#ifndef NO_WOLFSSL_SERVER
13055
    #ifdef WOLFSSL_EARLY_DATA
13056
        case end_of_early_data:
13057
        #ifndef NO_WOLFSSL_CLIENT
13058
            /* Only valid when received on SERVER side. */
13059
            if (ssl->options.side == WOLFSSL_CLIENT_END) {
13060
                WOLFSSL_MSG("EndOfEarlyData received by client");
13061
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
13062
                return SIDE_ERROR;
13063
            }
13064
        #endif
13065
            /* Check state. */
13066
            /* Only after server's Finished and before client's Finished. */
13067
            if (ssl->options.serverState < SERVER_FINISHED_COMPLETE) {
13068
                WOLFSSL_MSG("EndOfEarlyData received out of order");
13069
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13070
                return OUT_OF_ORDER_E;
13071
            }
13072
            if (ssl->options.clientState >= CLIENT_FINISHED_COMPLETE) {
13073
                WOLFSSL_MSG("EndOfEarlyData received out of order");
13074
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13075
                return OUT_OF_ORDER_E;
13076
            }
13077
            /* Check previously seen. */
13078
            if (ssl->msgsReceived.got_end_of_early_data) {
13079
                WOLFSSL_MSG("Too many EndOfEarlyData received");
13080
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
13081
                return DUPLICATE_MSG_E;
13082
            }
13083
            ssl->msgsReceived.got_end_of_early_data = 1;
13084
13085
            break;
13086
    #endif
13087
#endif
13088
13089
#ifndef NO_WOLFSSL_CLIENT
13090
        case encrypted_extensions:
13091
        #ifndef NO_WOLFSSL_SERVER
13092
            /* Only valid when received on CLIENT side. */
13093
            if (ssl->options.side == WOLFSSL_SERVER_END) {
13094
                WOLFSSL_MSG("EncryptedExtensions received by server");
13095
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
13096
                return SIDE_ERROR;
13097
            }
13098
        #endif
13099
            /* Check state. */
13100
            /* Must be received directly after ServerHello.
13101
             * DoTls13EncryptedExtensions() changes state to:
13102
             *   SERVER_ENCRYPTED_EXTENSIONS_COMPLETE.
13103
             */
13104
            if (ssl->options.serverState != SERVER_HELLO_COMPLETE) {
13105
                WOLFSSL_MSG("EncryptedExtensions received out of order");
13106
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13107
                return OUT_OF_ORDER_E;
13108
            }
13109
            /* Check previously seen. */
13110
            if (ssl->msgsReceived.got_encrypted_extensions) {
13111
                WOLFSSL_MSG("Duplicate EncryptedExtensions received");
13112
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
13113
                return DUPLICATE_MSG_E;
13114
            }
13115
            ssl->msgsReceived.got_encrypted_extensions = 1;
13116
13117
            break;
13118
#endif
13119
13120
        case certificate:
13121
            /* Valid on both sides. */
13122
    #ifndef NO_WOLFSSL_CLIENT
13123
            /* Check state. */
13124
            /* On client, seen after EncryptedExtension and CertificateRequest
13125
             * (if sent) and before CertificateVerify and Finished.
13126
             * DoTls13Certificate() sets serverState to SERVER_CERT_COMPLETE.
13127
             */
13128
            if (ssl->options.side == WOLFSSL_CLIENT_END &&
13129
                ssl->options.serverState !=
13130
                                         SERVER_ENCRYPTED_EXTENSIONS_COMPLETE) {
13131
                WOLFSSL_MSG("Certificate received out of order - Client");
13132
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13133
                return OUT_OF_ORDER_E;
13134
            }
13135
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13136
            /* Server's authenticating with PSK must not send this. */
13137
            if (ssl->options.side == WOLFSSL_CLIENT_END &&
13138
                             ssl->options.serverState == SERVER_CERT_COMPLETE &&
13139
                             ssl->options.pskNegotiated
13140
#ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
13141
                             && !ssl->options.certWithExternPsk
13142
#endif
13143
               ) {
13144
                WOLFSSL_MSG("Certificate received while using PSK");
13145
                WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13146
                return SANITY_MSG_E;
13147
            }
13148
        #endif
13149
    #endif
13150
    #ifndef NO_WOLFSSL_SERVER
13151
            /* Check state. */
13152
            /* On Server, valid after ClientHello received and ServerFinished
13153
             * sent. */
13154
            if (ssl->options.side == WOLFSSL_SERVER_END &&
13155
                ssl->options.clientState != CLIENT_HELLO_COMPLETE &&
13156
                ssl->options.serverState < SERVER_FINISHED_COMPLETE) {
13157
                WOLFSSL_MSG("Certificate received out of order - Server");
13158
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13159
                return OUT_OF_ORDER_E;
13160
            }
13161
    #endif
13162
            /* Check previously seen. */
13163
            if (ssl->msgsReceived.got_certificate) {
13164
                WOLFSSL_MSG("Duplicate Certificate received");
13165
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
13166
                return DUPLICATE_MSG_E;
13167
            }
13168
            ssl->msgsReceived.got_certificate = 1;
13169
13170
            break;
13171
13172
#ifndef NO_WOLFSSL_CLIENT
13173
        case certificate_request:
13174
        #ifndef NO_WOLFSSL_SERVER
13175
            /* Only valid when received on CLIENT side. */
13176
            if (ssl->options.side == WOLFSSL_SERVER_END) {
13177
                WOLFSSL_MSG("CertificateRequest received by server");
13178
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
13179
                return SIDE_ERROR;
13180
            }
13181
        #endif
13182
            /* Check state. */
13183
        #ifndef WOLFSSL_POST_HANDSHAKE_AUTH
13184
            /* Only valid when sent after EncryptedExtensions and before
13185
             * Certificate. */
13186
            if (ssl->options.serverState !=
13187
                                         SERVER_ENCRYPTED_EXTENSIONS_COMPLETE) {
13188
                WOLFSSL_MSG("CertificateRequest received out of order");
13189
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13190
                return OUT_OF_ORDER_E;
13191
            }
13192
        #else
13193
            /* Valid when sent after EncryptedExtensions and before Certificate
13194
             * and after both client and server have sent Finished (Post
13195
             * Handshake Authentication). */
13196
            if (ssl->options.serverState !=
13197
                                         SERVER_ENCRYPTED_EXTENSIONS_COMPLETE &&
13198
                       (ssl->options.serverState < SERVER_FINISHED_COMPLETE ||
13199
                        ssl->options.clientState != CLIENT_FINISHED_COMPLETE)) {
13200
                WOLFSSL_MSG("CertificateRequest received out of order");
13201
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13202
                return OUT_OF_ORDER_E;
13203
            }
13204
        #endif
13205
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13206
            /* Server's authenticating with PSK must not send this. */
13207
            if (ssl->options.pskNegotiated
13208
#ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
13209
                && !ssl->options.certWithExternPsk
13210
#endif
13211
               ) {
13212
                WOLFSSL_MSG("CertificateRequest received while using PSK");
13213
                WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13214
                return SANITY_MSG_E;
13215
            }
13216
        #endif
13217
            /* Check previously seen. */
13218
        #ifndef WOLFSSL_POST_HANDSHAKE_AUTH
13219
            /* Only once during handshake. */
13220
            if (ssl->msgsReceived.got_certificate_request) {
13221
                WOLFSSL_MSG("Duplicate CertificateRequest received");
13222
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
13223
                return DUPLICATE_MSG_E;
13224
            }
13225
        #else
13226
            /* Only once during handshake. */
13227
            if (ssl->msgsReceived.got_certificate_request &&
13228
                ssl->options.clientState != CLIENT_FINISHED_COMPLETE) {
13229
                WOLFSSL_MSG("Duplicate CertificateRequest received");
13230
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
13231
                return DUPLICATE_MSG_E;
13232
            }
13233
        #endif
13234
            ssl->msgsReceived.got_certificate_request = 1;
13235
13236
            break;
13237
#endif
13238
13239
        case certificate_verify:
13240
            /* Valid on both sides. */
13241
    #ifndef NO_WOLFSSL_CLIENT
13242
            /* Check state on client.
13243
             * Valid only directly after a Certificate message. */
13244
            if (ssl->options.side == WOLFSSL_CLIENT_END) {
13245
                if (ssl->options.serverState != SERVER_CERT_COMPLETE) {
13246
                    WOLFSSL_MSG("No Cert before CertVerify");
13247
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13248
                    return OUT_OF_ORDER_E;
13249
                }
13250
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13251
                /* Server's authenticating with PSK must not send this. */
13252
                if (ssl->options.pskNegotiated
13253
#ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
13254
                    && !ssl->options.certWithExternPsk
13255
#endif
13256
                   ) {
13257
                    WOLFSSL_MSG("CertificateVerify received while using PSK");
13258
                    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13259
                    return SANITY_MSG_E;
13260
                }
13261
            #endif
13262
            }
13263
    #endif
13264
    #ifndef NO_WOLFSSL_SERVER
13265
            /* Check state on server. */
13266
            if (ssl->options.side == WOLFSSL_SERVER_END) {
13267
                /* Server must have sent Finished message. */
13268
                if (ssl->options.serverState < SERVER_FINISHED_COMPLETE) {
13269
                    WOLFSSL_MSG("CertificateVerify received out of order");
13270
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13271
                    return OUT_OF_ORDER_E;
13272
                }
13273
                /* Valid only directly after a Certificate message. */
13274
                if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
13275
                    WOLFSSL_MSG("CertificateVerify before ClientHello done");
13276
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13277
                    return OUT_OF_ORDER_E;
13278
                }
13279
                if (!ssl->msgsReceived.got_certificate) {
13280
                    WOLFSSL_MSG("No Cert before CertificateVerify");
13281
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13282
                    return OUT_OF_ORDER_E;
13283
                }
13284
            }
13285
    #endif
13286
            /* Check previously seen. */
13287
            if (ssl->msgsReceived.got_certificate_verify) {
13288
                WOLFSSL_MSG("Duplicate CertificateVerify received");
13289
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
13290
                return DUPLICATE_MSG_E;
13291
            }
13292
            ssl->msgsReceived.got_certificate_verify = 1;
13293
13294
            break;
13295
13296
        case finished:
13297
            /* Valid on both sides. */
13298
        #ifndef NO_WOLFSSL_CLIENT
13299
            /* Check state on client. */
13300
            if (ssl->options.side == WOLFSSL_CLIENT_END) {
13301
                /* After sending ClientHello */
13302
                if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
13303
                    WOLFSSL_MSG("Finished received out of order - clientState");
13304
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13305
                    return OUT_OF_ORDER_E;
13306
                }
13307
                /* Must have seen certificate and verify from server except when
13308
                 * using PSK. */
13309
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13310
                if (ssl->options.pskNegotiated) {
13311
#ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
13312
                    if (ssl->options.certWithExternPsk) {
13313
                        if (ssl->options.serverState !=
13314
                                                SERVER_CERT_VERIFY_COMPLETE) {
13315
                            WOLFSSL_MSG("Finished received out of order - "
13316
                                        "cert_with_extern_psk");
13317
                            WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13318
                            return OUT_OF_ORDER_E;
13319
                        }
13320
                    }
13321
                    else
13322
#endif
13323
                    {
13324
                        if (ssl->options.serverState !=
13325
                                         SERVER_ENCRYPTED_EXTENSIONS_COMPLETE) {
13326
                            WOLFSSL_MSG("Finished received out of order - PSK");
13327
                            WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13328
                            return OUT_OF_ORDER_E;
13329
                        }
13330
                    }
13331
                }
13332
                else
13333
            #endif
13334
                if (ssl->options.serverState != SERVER_CERT_VERIFY_COMPLETE) {
13335
                    WOLFSSL_MSG("Finished received out of order - serverState");
13336
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13337
                    return OUT_OF_ORDER_E;
13338
                }
13339
            }
13340
        #endif
13341
        #ifndef NO_WOLFSSL_SERVER
13342
            /* Check state on server. */
13343
            if (ssl->options.side == WOLFSSL_SERVER_END) {
13344
                if (ssl->options.serverState < SERVER_FINISHED_COMPLETE) {
13345
                    WOLFSSL_MSG("Finished received out of order - serverState");
13346
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13347
                    return OUT_OF_ORDER_E;
13348
                }
13349
                if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
13350
                    WOLFSSL_MSG("Finished received out of order - clientState");
13351
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13352
                    return OUT_OF_ORDER_E;
13353
                }
13354
            #ifdef WOLFSSL_EARLY_DATA
13355
                if (ssl->earlyData == process_early_data &&
13356
                    /* early data may be lost when using DTLS */
13357
                    !ssl->options.dtls
13358
                    /* QUIC does not use EndOfEarlyData records */
13359
                    && !WOLFSSL_IS_QUIC(ssl)) {
13360
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13361
                    return OUT_OF_ORDER_E;
13362
                }
13363
            #endif
13364
            }
13365
        #endif
13366
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13367
            if (!ssl->options.pskNegotiated
13368
#ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
13369
                || ssl->options.certWithExternPsk
13370
#endif
13371
            )
13372
        #endif
13373
            {
13374
                /* Must have received a Certificate message from client if
13375
                 * verifying the peer. Empty certificate message indicates
13376
                 * no certificate available.
13377
                 */
13378
                if (ssl->options.verifyPeer &&
13379
                #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
13380
                    !ssl->options.verifyPostHandshake &&
13381
                #endif
13382
                                           !ssl->msgsReceived.got_certificate) {
13383
                    WOLFSSL_MSG("Finished received out of order - "
13384
                                "missing Certificate message");
13385
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13386
                    return OUT_OF_ORDER_E;
13387
                }
13388
                /* Mutual authentication on server requires a certificate from
13389
                 * peer. Verify peer set on client side requires a certificate
13390
                 * from peer as not doing PSK.
13391
                 */
13392
                if ((ssl->options.mutualAuth ||
13393
                    (ssl->options.side == WOLFSSL_CLIENT_END &&
13394
                     ssl->options.verifyPeer)) && !ssl->options.havePeerCert) {
13395
                    WOLFSSL_MSG("Finished received out of order - "
13396
                                "no valid certificate");
13397
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13398
                    return OUT_OF_ORDER_E;
13399
                }
13400
                /* Must have received a valid CertificateVerify if verifying
13401
                 * peer and got a peer certificate.
13402
                 */
13403
                if ((ssl->options.mutualAuth || ssl->options.verifyPeer) &&
13404
                    ssl->options.havePeerCert && !ssl->options.havePeerVerify) {
13405
                    WOLFSSL_MSG("Finished received out of order - "
13406
                                "Certificate message but no CertificateVerify");
13407
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13408
                    return OUT_OF_ORDER_E;
13409
                }
13410
            }
13411
            /* Check previously seen. */
13412
            if (ssl->msgsReceived.got_finished) {
13413
                WOLFSSL_MSG("Duplicate Finished received");
13414
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
13415
                return DUPLICATE_MSG_E;
13416
            }
13417
            ssl->msgsReceived.got_finished = 1;
13418
13419
            break;
13420
13421
        case key_update:
13422
            /* Valid on both sides. */
13423
            /* Check state.
13424
             * Client and server must have received finished message from other
13425
             * side.
13426
             */
13427
            if (!ssl->msgsReceived.got_finished) {
13428
                WOLFSSL_MSG("No KeyUpdate before Finished");
13429
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13430
                return OUT_OF_ORDER_E;
13431
            }
13432
            /* Multiple KeyUpdates can be sent. */
13433
            break;
13434
#if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_NO_TLS12)
13435
        case hello_verify_request:
13436
            if (!ssl->options.dtls) {
13437
                WOLFSSL_MSG("HelloVerifyRequest when not in DTLS");
13438
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13439
                return OUT_OF_ORDER_E;
13440
            }
13441
            if (ssl->msgsReceived.got_hello_verify_request) {
13442
                WOLFSSL_MSG("Duplicate HelloVerifyRequest received");
13443
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
13444
                return DUPLICATE_MSG_E;
13445
            }
13446
            ssl->msgsReceived.got_hello_verify_request = 1;
13447
            if (ssl->msgsReceived.got_hello_retry_request) {
13448
                WOLFSSL_MSG(
13449
                    "Both HelloVerifyRequest and HelloRetryRequest received");
13450
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
13451
                return DUPLICATE_MSG_E;
13452
            }
13453
            if (ssl->options.serverState >=
13454
                    SERVER_HELLO_RETRY_REQUEST_COMPLETE ||
13455
                ssl->options.connectState != CLIENT_HELLO_SENT) {
13456
                WOLFSSL_MSG("HelloVerifyRequest received out of order");
13457
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13458
                return OUT_OF_ORDER_E;
13459
            }
13460
            if (ssl->options.side == WOLFSSL_SERVER_END) {
13461
                WOLFSSL_MSG("HelloVerifyRequest received on the server");
13462
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
13463
                return SIDE_ERROR;
13464
            }
13465
            if (!ssl->options.downgrade ||
13466
                ssl->options.minDowngrade < DTLSv1_2_MINOR) {
13467
                WOLFSSL_MSG(
13468
                    "HelloVerifyRequest received but not DTLSv1.2 allowed");
13469
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
13470
                return VERSION_ERROR;
13471
            }
13472
            break;
13473
#endif /* WOLFSSL_DTLS13 && !WOLFSSL_NO_TLS12*/
13474
13475
        default:
13476
            WOLFSSL_MSG("Unknown message type");
13477
            WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13478
            return SANITY_MSG_E;
13479
    }
13480
13481
    return 0;
13482
}
13483
13484
/* Handle a type of handshake message that has been received.
13485
 *
13486
 * ssl       The SSL/TLS object.
13487
 * input     The message buffer.
13488
 * inOutIdx  On entry, the index into the buffer of the current message.
13489
 *           On exit, the index into the buffer of the next message.
13490
 * size      The length of the current handshake message.
13491
 * totalSz   Length of remaining data in the message buffer.
13492
 * returns 0 on success and otherwise failure.
13493
 */
13494
int DoTls13HandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx,
13495
                            byte type, word32 size, word32 totalSz)
13496
0
{
13497
0
    int ret = 0, tmp;
13498
0
    word32 inIdx = *inOutIdx;
13499
0
    int alertType;
13500
#if defined(HAVE_ECH) && !defined(NO_WOLFSSL_SERVER)
13501
    TLSX* echX = NULL;
13502
    word32 echInOutIdx;
13503
#endif
13504
13505
0
    (void)totalSz;
13506
13507
0
    WOLFSSL_ENTER("DoTls13HandShakeMsgType");
13508
13509
    /* make sure we can read the message */
13510
0
    if (*inOutIdx + size > totalSz)
13511
0
        return INCOMPLETE_DATA;
13512
13513
    /* sanity check msg received */
13514
0
    if ((ret = SanityCheckTls13MsgReceived(ssl, type)) != 0) {
13515
0
        WOLFSSL_MSG("Sanity Check on handshake message type received failed");
13516
0
        if (ret == WC_NO_ERR_TRACE(VERSION_ERROR))
13517
0
            SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
13518
0
        else
13519
0
            SendAlert(ssl, alert_fatal, unexpected_message);
13520
0
        return ret;
13521
0
    }
13522
13523
#if defined(WOLFSSL_CALLBACKS)
13524
    /* add name later, add on record and handshake header part back on */
13525
    if (ssl->toInfoOn) {
13526
        ret = AddPacketInfo(ssl, 0, handshake, input + *inOutIdx -
13527
            HANDSHAKE_HEADER_SZ, size + HANDSHAKE_HEADER_SZ, READ_PROTO,
13528
            RECORD_HEADER_SZ, ssl->heap);
13529
        if (ret != 0)
13530
            return ret;
13531
        AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
13532
    }
13533
#endif
13534
13535
0
    if (ssl->options.handShakeState == HANDSHAKE_DONE &&
13536
0
            type != session_ticket && type != certificate_request &&
13537
0
            type != certificate && type != key_update && type != finished) {
13538
0
        WOLFSSL_MSG("HandShake message after handshake complete");
13539
0
        SendAlert(ssl, alert_fatal, unexpected_message);
13540
0
        WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13541
0
        return OUT_OF_ORDER_E;
13542
0
    }
13543
13544
0
    if (ssl->options.side == WOLFSSL_CLIENT_END &&
13545
0
               ssl->options.serverState == NULL_STATE &&
13546
0
               type != server_hello && type != hello_retry_request
13547
#if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_NO_TLS12)
13548
        && (!ssl->options.dtls || type != hello_verify_request)
13549
#endif /* defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_NO_TLS12) */
13550
0
        ) {
13551
0
        WOLFSSL_MSG("First server message not server hello");
13552
0
        SendAlert(ssl, alert_fatal, unexpected_message);
13553
0
        WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13554
0
        return OUT_OF_ORDER_E;
13555
0
    }
13556
13557
0
    if (ssl->options.side == WOLFSSL_SERVER_END &&
13558
0
               ssl->options.clientState == NULL_STATE && type != client_hello) {
13559
0
        WOLFSSL_MSG("First client message not client hello");
13560
0
        SendAlert(ssl, alert_fatal, unexpected_message);
13561
0
        WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
13562
0
        return OUT_OF_ORDER_E;
13563
0
    }
13564
13565
    /* above checks handshake state */
13566
0
    switch (type) {
13567
0
#ifndef NO_WOLFSSL_CLIENT
13568
    /* Messages only received by client. */
13569
0
    case server_hello:
13570
0
        WOLFSSL_MSG("processing server hello");
13571
0
        ret = DoTls13ServerHello(ssl, input, inOutIdx, size, &type);
13572
0
    #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
13573
0
               ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
13574
0
                (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
13575
0
        if (ssl->options.resuming || !IsAtLeastTLSv1_2(ssl) ||
13576
0
                                               IsAtLeastTLSv1_3(ssl->version)) {
13577
0
            ssl->options.cacheMessages = 0;
13578
0
            if ((ssl->hsHashes != NULL) && (ssl->hsHashes->messages != NULL)) {
13579
0
                ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
13580
0
                XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
13581
0
                ssl->hsHashes->messages = NULL;
13582
0
            }
13583
0
        }
13584
0
    #endif
13585
0
        break;
13586
13587
0
    case encrypted_extensions:
13588
0
        WOLFSSL_MSG("processing encrypted extensions");
13589
0
        ret = DoTls13EncryptedExtensions(ssl, input, inOutIdx, size);
13590
0
        break;
13591
13592
0
    #ifndef NO_CERTS
13593
0
    case certificate_request:
13594
0
        WOLFSSL_MSG("processing certificate request");
13595
0
        ret = DoTls13CertificateRequest(ssl, input, inOutIdx, size);
13596
0
        break;
13597
0
    #endif
13598
13599
0
    case session_ticket:
13600
0
        WOLFSSL_MSG("processing new session ticket");
13601
0
        ret = DoTls13NewSessionTicket(ssl, input, inOutIdx, size);
13602
0
        break;
13603
0
#endif /* !NO_WOLFSSL_CLIENT */
13604
13605
0
#ifndef NO_WOLFSSL_SERVER
13606
    /* Messages only received by server. */
13607
0
    case client_hello:
13608
0
        WOLFSSL_MSG("processing client hello");
13609
#if defined(HAVE_ECH)
13610
        /* keep the start idx so we can restore it for the inner call */
13611
        echInOutIdx = *inOutIdx;
13612
#endif
13613
0
        ret = DoTls13ClientHello(ssl, input, inOutIdx, size);
13614
0
    #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
13615
0
               ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
13616
0
                (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
13617
0
        if ((ssl->options.resuming || !ssl->options.verifyPeer ||
13618
0
               !IsAtLeastTLSv1_2(ssl) || IsAtLeastTLSv1_3(ssl->version))
13619
        #ifdef WOLFSSL_DTLS13
13620
               && (!ssl->options.dtls)
13621
        #endif
13622
0
               ) {
13623
        #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
13624
            if (ret != WC_NO_ERR_TRACE(WC_PENDING_E) &&
13625
                ret != WC_NO_ERR_TRACE(OCSP_WANT_READ))
13626
        #endif
13627
0
            {
13628
0
                ssl->options.cacheMessages = 0;
13629
0
                if ((ssl->hsHashes != NULL) &&
13630
0
                        (ssl->hsHashes->messages != NULL)) {
13631
0
                    ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
13632
0
                    XFREE(ssl->hsHashes->messages, ssl->heap,
13633
0
                        DYNAMIC_TYPE_HASHES);
13634
0
                    ssl->hsHashes->messages = NULL;
13635
0
                }
13636
0
            }
13637
0
        }
13638
0
    #endif
13639
#if defined(HAVE_ECH)
13640
        if (ret == 0) {
13641
            echX = TLSX_Find(ssl->extensions, TLSX_ECH);
13642
13643
            if (echX != NULL &&
13644
                    ((WOLFSSL_ECH*)echX->data)->state == ECH_WRITE_NONE &&
13645
                    ((WOLFSSL_ECH*)echX->data)->innerClientHello != NULL) {
13646
                byte copyRandom = ((WOLFSSL_ECH*)echX->data)->innerCount == 0;
13647
                /* reset the inOutIdx to the outer start */
13648
                *inOutIdx = echInOutIdx;
13649
                /* call again with the inner hello */
13650
                if (ret == 0) {
13651
                    if (((WOLFSSL_ECH*)echX->data)->sniState == ECH_OUTER_SNI) {
13652
                        ((WOLFSSL_ECH*)echX->data)->sniState = ECH_INNER_SNI;
13653
                    }
13654
13655
                    ssl->options.echProcessingInner = 1;
13656
                    ret = DoTls13ClientHello(ssl,
13657
                        ((WOLFSSL_ECH*)echX->data)->innerClientHello,
13658
                        &echInOutIdx,
13659
                        ((WOLFSSL_ECH*)echX->data)->innerClientHelloLen);
13660
                    ssl->options.echProcessingInner = 0;
13661
13662
                    ((WOLFSSL_ECH*)echX->data)->sniState = ECH_SNI_DONE;
13663
                }
13664
                if (ret == 0 && ((WOLFSSL_ECH*)echX->data)->state !=
13665
                        ECH_PARSED_INTERNAL) {
13666
                    WOLFSSL_MSG("ECH: inner ClientHello missing ECH extension");
13667
                    ret = INVALID_PARAMETER;
13668
                }
13669
                /* if the inner ech parsed successfully we have successfully
13670
                 * handled the hello and can skip the whole message */
13671
                if (ret == 0) {
13672
                    /* Copy inner client random for ECH acceptance calculation.
13673
                     * Only on first inner ClientHello (before HRR), not CH2. */
13674
                    if (copyRandom) {
13675
                        XMEMCPY(ssl->arrays->clientRandomInner,
13676
                                ((WOLFSSL_ECH*)echX->data)->innerClientHello +
13677
                                HANDSHAKE_HEADER_SZ + VERSION_SZ, RAN_LEN);
13678
                    }
13679
                    *inOutIdx += size;
13680
                }
13681
            }
13682
        }
13683
#endif /* HAVE_ECH */
13684
0
        break;
13685
13686
    #ifdef WOLFSSL_EARLY_DATA
13687
    case end_of_early_data:
13688
        WOLFSSL_MSG("processing end of early data");
13689
        ret = DoTls13EndOfEarlyData(ssl, input, inOutIdx, size);
13690
        break;
13691
    #endif
13692
0
#endif /* !NO_WOLFSSL_SERVER */
13693
13694
    /* Messages received by both client and server. */
13695
0
#if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \
13696
0
                           !defined(WOLFSSL_NO_CLIENT_AUTH))
13697
0
    case certificate:
13698
0
        WOLFSSL_MSG("processing certificate");
13699
0
        ret = DoTls13Certificate(ssl, input, inOutIdx, size);
13700
0
        break;
13701
0
#endif
13702
13703
0
#if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
13704
0
    defined(HAVE_ED448) || defined(HAVE_FALCON) || defined(HAVE_DILITHIUM)
13705
0
    case certificate_verify:
13706
0
        WOLFSSL_MSG("processing certificate verify");
13707
0
        ret = DoTls13CertificateVerify(ssl, input, inOutIdx, size);
13708
0
        break;
13709
0
#endif
13710
0
    case finished:
13711
0
        WOLFSSL_MSG("processing finished");
13712
0
        ret = DoTls13Finished(ssl, input, inOutIdx, size, totalSz, NO_SNIFF);
13713
0
        break;
13714
13715
0
    case key_update:
13716
0
        WOLFSSL_MSG("processing key update");
13717
0
        ret = DoTls13KeyUpdate(ssl, input, inOutIdx, size);
13718
0
        break;
13719
13720
#if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_NO_TLS12) && \
13721
    !defined(NO_WOLFSSL_CLIENT)
13722
    case hello_verify_request:
13723
        WOLFSSL_MSG("processing hello verify request");
13724
        ret = DoHelloVerifyRequest(ssl, input, inOutIdx, size);
13725
        break;
13726
#endif
13727
0
    default:
13728
0
        WOLFSSL_MSG("Unknown handshake message type");
13729
0
        ret = UNKNOWN_HANDSHAKE_TYPE;
13730
0
        break;
13731
0
    }
13732
13733
0
#if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_ASYNC_IO)
13734
    /* if async, offset index so this msg will be processed again */
13735
    /* NOTE: check this now before other calls can overwrite ret */
13736
0
    if ((ret == WC_NO_ERR_TRACE(WC_PENDING_E) ||
13737
0
         ret == WC_NO_ERR_TRACE(OCSP_WANT_READ)) && *inOutIdx > 0) {
13738
        /* DTLS always stores a message in a buffer when async is enable, so we
13739
         * don't need to adjust for the extra bytes here (*inOutIdx is always
13740
         * == 0) */
13741
0
        *inOutIdx -= HANDSHAKE_HEADER_SZ;
13742
0
    }
13743
13744
    /* make sure async error is cleared */
13745
0
    if (ret == 0 &&
13746
0
        (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E) ||
13747
0
         ssl->error == WC_NO_ERR_TRACE(OCSP_WANT_READ))) {
13748
0
        ssl->error = 0;
13749
0
    }
13750
0
#endif
13751
0
    if (ret == 0 && type != client_hello && type != session_ticket &&
13752
0
                                                           type != key_update) {
13753
0
        ret = HashInput(ssl, input + inIdx, (int)size);
13754
0
    }
13755
13756
0
    alertType = TranslateErrorToAlert(ret);
13757
13758
0
    if (alertType != invalid_alert) {
13759
#ifdef WOLFSSL_DTLS13
13760
        if (type == client_hello && ssl->options.dtls)
13761
            DtlsSetSeqNumForReply(ssl);
13762
#endif
13763
0
        tmp = SendAlert(ssl, alert_fatal, alertType);
13764
        /* propagate socket error instead of tls error to be sure the error is
13765
         * not ignored by DTLS code */
13766
0
        if (tmp == WC_NO_ERR_TRACE(SOCKET_ERROR_E))
13767
0
            ret = SOCKET_ERROR_E;
13768
0
    }
13769
13770
0
    if (ret == 0 && ssl->options.tls1_3) {
13771
        /* Need to hash input message before deriving secrets. */
13772
0
    #ifndef NO_WOLFSSL_CLIENT
13773
0
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
13774
0
            if (type == server_hello) {
13775
0
                if ((ret = DeriveEarlySecret(ssl)) != 0)
13776
0
                    return ret;
13777
0
                if ((ret = DeriveHandshakeSecret(ssl)) != 0)
13778
0
                    return ret;
13779
13780
0
                if ((ret = DeriveTls13Keys(ssl, handshake_key,
13781
0
                                        ENCRYPT_AND_DECRYPT_SIDE, 1)) != 0) {
13782
0
                    return ret;
13783
0
                }
13784
        #ifdef WOLFSSL_EARLY_DATA
13785
                if (ssl->earlyData != no_early_data) {
13786
                    if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
13787
                        return ret;
13788
                }
13789
                else
13790
        #endif
13791
0
                if ((ret = SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE)) != 0)
13792
0
                    return ret;
13793
13794
#ifdef WOLFSSL_DTLS13
13795
                if (ssl->options.dtls) {
13796
                    w64wrapper epochHandshake;
13797
                    epochHandshake = w64From32(0, DTLS13_EPOCH_HANDSHAKE);
13798
                    ssl->dtls13Epoch = epochHandshake;
13799
                    ssl->dtls13PeerEpoch = epochHandshake;
13800
13801
                    ret = Dtls13SetEpochKeys(
13802
                        ssl, epochHandshake, ENCRYPT_AND_DECRYPT_SIDE);
13803
                    if (ret != 0)
13804
                        return ret;
13805
13806
                }
13807
#endif /* WOLFSSL_DTLS13 */
13808
0
            }
13809
13810
0
            if (type == finished) {
13811
0
                if ((ret = DeriveMasterSecret(ssl)) != 0)
13812
0
                    return ret;
13813
                /* Last use of preMasterSecret - zeroize as soon as possible. */
13814
0
                ForceZero(ssl->arrays->preMasterSecret,
13815
0
                    ssl->arrays->preMasterSz);
13816
        #ifdef WOLFSSL_EARLY_DATA
13817
        #ifdef WOLFSSL_QUIC
13818
                if (WOLFSSL_IS_QUIC(ssl) && ssl->earlyData != no_early_data) {
13819
                    /* QUIC never sends/receives EndOfEarlyData, but having
13820
                     * early data means the last encryption keys had not been
13821
                     * set yet. */
13822
                    if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
13823
                        return ret;
13824
                }
13825
        #endif
13826
                if ((ret = DeriveTls13Keys(ssl, traffic_key,
13827
                                    ENCRYPT_AND_DECRYPT_SIDE,
13828
                                    ssl->earlyData == no_early_data)) != 0) {
13829
                    return ret;
13830
                }
13831
                if (ssl->earlyData != no_early_data) {
13832
                    if ((ret = DeriveTls13Keys(ssl, no_key, DECRYPT_SIDE_ONLY,
13833
                                                                  1)) != 0) {
13834
                            return ret;
13835
                    }
13836
                }
13837
        #else
13838
0
                if ((ret = DeriveTls13Keys(ssl, traffic_key,
13839
0
                                        ENCRYPT_AND_DECRYPT_SIDE, 1)) != 0) {
13840
0
                    return ret;
13841
0
                }
13842
0
        #endif
13843
                /* Setup keys for application data messages. */
13844
0
                if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
13845
0
                    return ret;
13846
0
            }
13847
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
13848
            if (type == certificate_request &&
13849
                                ssl->options.handShakeState == HANDSHAKE_DONE) {
13850
#if defined(HAVE_WRITE_DUP)
13851
                /* Read side cannot write; delegate the cert response to the
13852
                 * write side by saving auth state in the shared WriteDup. */
13853
                if (ssl->dupSide == READ_DUP_SIDE) {
13854
                    if (ssl->dupWrite == NULL)
13855
                        return BAD_STATE_E;
13856
                    if (wc_LockMutex(&ssl->dupWrite->dupMutex) != 0)
13857
                        return BAD_MUTEX_E;
13858
                    /* Copy the current transcript so the write side can
13859
                     * compute the correct Finished MAC. */
13860
                    ret = InitHandshakeHashesAndCopy(ssl, ssl->hsHashes,
13861
                                      &ssl->dupWrite->postHandshakeHashState);
13862
                    if (ret == 0) {
13863
                        /* Copy the cert request context. */
13864
                        CertReqCtx** tail = &ssl->certReqCtx;
13865
                        while (*tail != NULL)
13866
                            tail = &(*tail)->next;
13867
                        *tail = ssl->dupWrite->postHandshakeCertReqCtx;
13868
                        ssl->dupWrite->postHandshakeCertReqCtx = ssl->certReqCtx;
13869
                        ssl->certReqCtx = NULL;
13870
                        ssl->dupWrite->postHandshakeSendVerify =
13871
                            ssl->options.sendVerify;
13872
                        ssl->dupWrite->postHandshakeSigAlgo =
13873
                            ssl->options.sigAlgo;
13874
                        ssl->dupWrite->postHandshakeHashAlgo =
13875
                            ssl->options.hashAlgo;
13876
                        ssl->dupWrite->postHandshakeAuthPending = 1;
13877
                    }
13878
                    wc_UnLockMutex(&ssl->dupWrite->dupMutex);
13879
                    /* Leave ssl->options unchanged: read side must not reset
13880
                     * its states or call wolfSSL_connect_TLSv13. */
13881
                }
13882
                else
13883
#endif /* HAVE_WRITE_DUP */
13884
                {
13885
                    /* reset handshake states */
13886
                    ssl->options.clientState = CLIENT_HELLO_COMPLETE;
13887
                    ssl->options.connectState  = FIRST_REPLY_DONE;
13888
                    ssl->options.handShakeState = CLIENT_HELLO_COMPLETE;
13889
                    ssl->options.processReply = 0; /* doProcessInit */
13890
13891
                    /*
13892
                       DTLSv1.3 note: We can't reset serverState to
13893
                       SERVER_FINISHED_COMPLETE with the goal that this connect
13894
                       blocks until the cert/cert_verify/finished flight gets ACKed
13895
                       by the server. The problem is that we will invoke
13896
                       ProcessReplyEx() in that case, but we came here from
13897
                       ProcessReplyEx() and it is not re-entrant safe (the input
13898
                       buffer would still have the certificate_request message). */
13899
13900
                    if (wolfSSL_connect_TLSv13(ssl) != WOLFSSL_SUCCESS) {
13901
                        ret = ssl->error;
13902
                        if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
13903
                            ret = POST_HAND_AUTH_ERROR;
13904
                    }
13905
                }
13906
            }
13907
        #endif
13908
0
        }
13909
0
    #endif /* NO_WOLFSSL_CLIENT */
13910
13911
0
#ifndef NO_WOLFSSL_SERVER
13912
0
    #if defined(HAVE_SESSION_TICKET)
13913
0
        if (ssl->options.side == WOLFSSL_SERVER_END && type == finished) {
13914
0
            ret = DeriveResumptionSecret(ssl, ssl->session->masterSecret);
13915
0
            if (ret != 0)
13916
0
                return ret;
13917
0
        }
13918
0
    #endif
13919
0
#endif /* NO_WOLFSSL_SERVER */
13920
0
    }
13921
13922
#ifdef WOLFSSL_DTLS13
13923
    if (ssl->options.dtls && !ssl->options.dtlsStateful) {
13924
        DtlsResetState(ssl);
13925
        if (DtlsIgnoreError(ret))
13926
            ret = 0;
13927
    }
13928
#endif
13929
13930
0
    WOLFSSL_LEAVE("DoTls13HandShakeMsgType()", ret);
13931
0
    return ret;
13932
0
}
13933
13934
13935
/* Handle a handshake message that has been received.
13936
 *
13937
 * ssl       The SSL/TLS object.
13938
 * input     The message buffer.
13939
 * inOutIdx  On entry, the index into the buffer of the current message.
13940
 *           On exit, the index into the buffer of the next message.
13941
 * totalSz   Length of remaining data in the message buffer.
13942
 * returns 0 on success and otherwise failure.
13943
 */
13944
int DoTls13HandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
13945
                        word32 totalSz)
13946
13.9k
{
13947
13.9k
    int    ret = 0;
13948
13.9k
    word32 inputLength;
13949
13.9k
    byte   type;
13950
13.9k
    word32 size = 0;
13951
13952
13.9k
    WOLFSSL_ENTER("DoTls13HandShakeMsg");
13953
13954
13.9k
    if (ssl->arrays == NULL) {
13955
0
        if (GetHandshakeHeader(ssl, input, inOutIdx, &type, &size,
13956
0
                                                                totalSz) != 0) {
13957
0
            SendAlert(ssl, alert_fatal, unexpected_message);
13958
0
            WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
13959
0
            return PARSE_ERROR;
13960
0
        }
13961
13962
0
        ret = EarlySanityCheckMsgReceived(ssl, type, size);
13963
0
        if (ret != 0) {
13964
0
            WOLFSSL_ERROR(ret);
13965
0
            return ret;
13966
0
        }
13967
13968
0
        return DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
13969
0
                                       totalSz);
13970
0
    }
13971
13972
13.9k
    inputLength = ssl->buffers.inputBuffer.length - *inOutIdx - ssl->keys.padSz;
13973
13974
    /* If there is a pending fragmented handshake message,
13975
     * pending message size will be non-zero. */
13976
13.9k
    if (ssl->arrays->pendingMsgSz == 0) {
13977
13978
7.51k
        if (GetHandshakeHeader(ssl, input, inOutIdx, &type, &size,
13979
7.51k
                               totalSz) != 0) {
13980
5
            WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
13981
5
            return PARSE_ERROR;
13982
5
        }
13983
13984
7.50k
        ret = EarlySanityCheckMsgReceived(ssl, type,
13985
7.50k
                (inputLength > HANDSHAKE_HEADER_SZ) ?
13986
7.18k
                min(inputLength - HANDSHAKE_HEADER_SZ, size) : 0);
13987
7.50k
        if (ret != 0) {
13988
69
            WOLFSSL_ERROR(ret);
13989
69
            return ret;
13990
69
        }
13991
13992
        /* Cap the maximum size of a handshake message to something reasonable.
13993
         * By default is the maximum size of a certificate message assuming
13994
         * nine 2048-bit RSA certificates in the chain. */
13995
7.43k
        if (size > MAX_HANDSHAKE_SZ) {
13996
49
            WOLFSSL_MSG("Handshake message too large");
13997
49
            WOLFSSL_ERROR_VERBOSE(HANDSHAKE_SIZE_ERROR);
13998
49
            return HANDSHAKE_SIZE_ERROR;
13999
49
        }
14000
14001
        /* size is the size of the certificate message payload */
14002
7.38k
        if (inputLength - HANDSHAKE_HEADER_SZ < size) {
14003
370
            ssl->arrays->pendingMsgType = type;
14004
370
            ssl->arrays->pendingMsgSz = size + HANDSHAKE_HEADER_SZ;
14005
370
            ssl->arrays->pendingMsg = (byte*)XMALLOC(size + HANDSHAKE_HEADER_SZ,
14006
370
                                                     ssl->heap,
14007
370
                                                     DYNAMIC_TYPE_ARRAYS);
14008
370
            if (ssl->arrays->pendingMsg == NULL)
14009
0
                return MEMORY_E;
14010
370
            XMEMCPY(ssl->arrays->pendingMsg,
14011
370
                    input + *inOutIdx - HANDSHAKE_HEADER_SZ,
14012
370
                    inputLength);
14013
370
            ssl->arrays->pendingMsgOffset = inputLength;
14014
370
            *inOutIdx += inputLength + ssl->keys.padSz - HANDSHAKE_HEADER_SZ;
14015
370
            return 0;
14016
370
        }
14017
14018
7.01k
        ret = DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
14019
7.01k
                                      totalSz);
14020
7.01k
    }
14021
6.45k
    else {
14022
6.45k
        if (inputLength + ssl->arrays->pendingMsgOffset >
14023
6.45k
                                                    ssl->arrays->pendingMsgSz) {
14024
12
            inputLength = ssl->arrays->pendingMsgSz -
14025
12
                                                  ssl->arrays->pendingMsgOffset;
14026
12
        }
14027
14028
6.45k
        ret = EarlySanityCheckMsgReceived(ssl, ssl->arrays->pendingMsgType,
14029
6.45k
                inputLength);
14030
6.45k
        if (ret != 0) {
14031
8
            WOLFSSL_ERROR(ret);
14032
8
            return ret;
14033
8
        }
14034
14035
6.44k
        XMEMCPY(ssl->arrays->pendingMsg + ssl->arrays->pendingMsgOffset,
14036
6.44k
                input + *inOutIdx, inputLength);
14037
6.44k
        ssl->arrays->pendingMsgOffset += inputLength;
14038
6.44k
        *inOutIdx += inputLength + ssl->keys.padSz;
14039
14040
6.44k
        if (ssl->arrays->pendingMsgOffset == ssl->arrays->pendingMsgSz)
14041
40
        {
14042
40
            word32 idx = 0;
14043
40
            ret = DoTls13HandShakeMsgType(ssl,
14044
40
                                ssl->arrays->pendingMsg + HANDSHAKE_HEADER_SZ,
14045
40
                                &idx, ssl->arrays->pendingMsgType,
14046
40
                                ssl->arrays->pendingMsgSz - HANDSHAKE_HEADER_SZ,
14047
40
                                ssl->arrays->pendingMsgSz);
14048
        #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
14049
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E) ||
14050
                ret == WC_NO_ERR_TRACE(OCSP_WANT_READ)) {
14051
                /* setup to process fragment again */
14052
                ssl->arrays->pendingMsgOffset -= inputLength;
14053
                *inOutIdx -= inputLength + ssl->keys.padSz;
14054
            }
14055
            else
14056
        #endif
14057
40
            {
14058
40
                XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
14059
40
                ssl->arrays->pendingMsg = NULL;
14060
40
                ssl->arrays->pendingMsgSz = 0;
14061
40
            }
14062
40
        }
14063
6.44k
    }
14064
14065
13.4k
    WOLFSSL_LEAVE("DoTls13HandShakeMsg", ret);
14066
13.4k
    return ret;
14067
13.9k
}
14068
14069
#ifndef NO_WOLFSSL_CLIENT
14070
14071
/* The client connecting to the server.
14072
 * The protocol version is expecting to be TLS v1.3.
14073
 * If the server downgrades, and older versions of the protocol are compiled
14074
 * in, the client will fallback to wolfSSL_connect().
14075
 * Please see note at top of README if you get an error from connect.
14076
 *
14077
 * ssl  The SSL/TLS object.
14078
 * returns WOLFSSL_SUCCESS on successful handshake, WOLFSSL_FATAL_ERROR when
14079
 * unrecoverable error occurs and 0 otherwise.
14080
 * For more error information use wolfSSL_get_error().
14081
 */
14082
int wolfSSL_connect_TLSv13(WOLFSSL* ssl)
14083
0
{
14084
0
    int advanceState;
14085
0
    int ret = 0;
14086
14087
0
    WOLFSSL_ENTER("wolfSSL_connect_TLSv13");
14088
14089
0
#ifdef HAVE_ERRNO_H
14090
0
    errno = 0;
14091
0
#endif
14092
14093
0
    if (ssl == NULL)
14094
0
        return BAD_FUNC_ARG;
14095
14096
0
    if (ssl->options.side != WOLFSSL_CLIENT_END) {
14097
0
        ssl->error = SIDE_ERROR;
14098
0
        WOLFSSL_ERROR(ssl->error);
14099
0
        return WOLFSSL_FATAL_ERROR;
14100
0
    }
14101
14102
    /* make sure this wolfSSL object has arrays and rng setup. Protects
14103
     * case where the WOLFSSL object is reused via wolfSSL_clear() */
14104
0
    if ((ret = ReinitSSL(ssl, ssl->ctx, 0)) != 0) {
14105
0
        return ret;
14106
0
    }
14107
14108
#ifdef WOLFSSL_DTLS
14109
    if (ssl->version.major == DTLS_MAJOR) {
14110
        ssl->options.dtls   = 1;
14111
        ssl->options.dtlsStateful = 1;
14112
    }
14113
#endif
14114
14115
#ifdef WOLFSSL_WOLFSENTRY_HOOKS
14116
    if ((ssl->ConnectFilter != NULL) &&
14117
        (ssl->options.connectState == CONNECT_BEGIN))
14118
    {
14119
        wolfSSL_netfilter_decision_t res;
14120
        if ((ssl->ConnectFilter(ssl, ssl->ConnectFilter_arg, &res) ==
14121
             WOLFSSL_SUCCESS) &&
14122
            (res == WOLFSSL_NETFILTER_REJECT)) {
14123
            ssl->error = SOCKET_FILTERED_E;
14124
            WOLFSSL_ERROR(ssl->error);
14125
            return WOLFSSL_FATAL_ERROR;
14126
        }
14127
    }
14128
#endif /* WOLFSSL_WOLFSENTRY_HOOKS */
14129
14130
    /* fragOffset is non-zero when sending fragments. On the last
14131
     * fragment, fragOffset is zero again, and the state can be
14132
     * advanced. Also, only advance from states in which we send data */
14133
0
    advanceState = (ssl->options.connectState == CONNECT_BEGIN ||
14134
0
            ssl->options.connectState == HELLO_AGAIN ||
14135
0
            (ssl->options.connectState >= FIRST_REPLY_DONE &&
14136
0
             ssl->options.connectState <= FIRST_REPLY_FOURTH));
14137
14138
#ifdef WOLFSSL_DTLS13
14139
    if (ssl->options.dtls)
14140
        advanceState = advanceState && !ssl->dtls13SendingFragments
14141
            && !ssl->dtls13SendingAckOrRtx;
14142
#endif /* WOLFSSL_DTLS13 */
14143
14144
0
    if (ssl->buffers.outputBuffer.length > 0
14145
    #ifdef WOLFSSL_ASYNC_CRYPT
14146
        /* do not send buffered or advance state if last error was an
14147
            async pending operation */
14148
        && ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E)
14149
    #endif
14150
0
    ) {
14151
0
        if ((ret = SendBuffered(ssl)) == 0) {
14152
0
            if (ssl->fragOffset == 0 && !ssl->options.buildingMsg) {
14153
0
                if (advanceState) {
14154
#ifdef WOLFSSL_DTLS13
14155
                    if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version) &&
14156
                        ssl->options.connectState == FIRST_REPLY_FOURTH) {
14157
                    /* WAIT_FINISHED_ACK is a state added afterwards, but it
14158
                       can't follow FIRST_REPLY_FOURTH in the enum order. Indeed
14159
                       the value of the enum ConnectState is stored in
14160
                       serialized session. This would make importing serialized
14161
                       session from other wolfSSL version incompatible */
14162
                        ssl->options.connectState = WAIT_FINISHED_ACK;
14163
                    }
14164
                    else
14165
#endif /* WOLFSSL_DTLS13 */
14166
0
                    {
14167
0
                        ssl->options.connectState++;
14168
0
                    }
14169
0
                    WOLFSSL_MSG("connect state: "
14170
0
                                "Advanced from last buffered fragment send");
14171
0
#ifdef WOLFSSL_ASYNC_IO
14172
0
                    FreeAsyncCtx(ssl, 0);
14173
0
#endif
14174
14175
0
                }
14176
0
            }
14177
0
            else {
14178
0
                WOLFSSL_MSG("connect state: "
14179
0
                            "Not advanced, more fragments to send");
14180
0
            }
14181
#ifdef WOLFSSL_DTLS13
14182
            if (ssl->options.dtls)
14183
                ssl->dtls13SendingAckOrRtx = 0;
14184
#endif /* WOLFSSL_DTLS13 */
14185
14186
0
        }
14187
0
        else {
14188
0
            ssl->error = ret;
14189
0
            WOLFSSL_ERROR(ssl->error);
14190
0
            return WOLFSSL_FATAL_ERROR;
14191
0
        }
14192
0
    }
14193
14194
0
    ret = RetrySendAlert(ssl);
14195
0
    if (ret != 0) {
14196
0
        ssl->error = ret;
14197
0
        WOLFSSL_ERROR(ssl->error);
14198
0
        return WOLFSSL_FATAL_ERROR;
14199
0
    }
14200
14201
#ifdef WOLFSSL_DTLS13
14202
    if (ssl->options.dtls && ssl->dtls13SendingFragments) {
14203
        if ((ssl->error = Dtls13FragmentsContinue(ssl)) != 0) {
14204
                WOLFSSL_ERROR(ssl->error);
14205
                return WOLFSSL_FATAL_ERROR;
14206
        }
14207
14208
        /* we sent all the fragments. Advance state. */
14209
        ssl->options.connectState++;
14210
    }
14211
#endif /* WOLFSSL_DTLS13 */
14212
14213
0
    switch (ssl->options.connectState) {
14214
14215
0
        case CONNECT_BEGIN:
14216
            /* Always send client hello first. */
14217
0
            if ((ssl->error = SendTls13ClientHello(ssl)) != 0) {
14218
0
                WOLFSSL_ERROR(ssl->error);
14219
0
                return WOLFSSL_FATAL_ERROR;
14220
0
            }
14221
14222
0
            ssl->options.connectState = CLIENT_HELLO_SENT;
14223
0
            WOLFSSL_MSG("TLSv13 connect state: CLIENT_HELLO_SENT");
14224
0
            FALL_THROUGH;
14225
14226
0
        case CLIENT_HELLO_SENT:
14227
    #ifdef WOLFSSL_EARLY_DATA
14228
            if (ssl->earlyData != no_early_data &&
14229
                ssl->options.handShakeState != CLIENT_HELLO_COMPLETE) {
14230
        #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
14231
                    if (!ssl->options.dtls &&
14232
                           ssl->options.tls13MiddleBoxCompat) {
14233
                        if ((ssl->error = SendChangeCipher(ssl)) != 0) {
14234
                            WOLFSSL_ERROR(ssl->error);
14235
                            return WOLFSSL_FATAL_ERROR;
14236
                        }
14237
                        ssl->options.sentChangeCipher = 1;
14238
                    }
14239
        #endif
14240
                ssl->options.handShakeState = CLIENT_HELLO_COMPLETE;
14241
                return WOLFSSL_SUCCESS;
14242
            }
14243
    #endif
14244
            /* Get the response/s from the server. */
14245
0
            while (ssl->options.serverState <
14246
0
                    SERVER_HELLOVERIFYREQUEST_COMPLETE) {
14247
0
                if ((ssl->error = ProcessReply(ssl)) < 0) {
14248
0
                        WOLFSSL_ERROR(ssl->error);
14249
0
                        return WOLFSSL_FATAL_ERROR;
14250
0
                }
14251
14252
#ifdef WOLFSSL_DTLS13
14253
                if (ssl->options.dtls) {
14254
                    if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
14255
                        WOLFSSL_ERROR(ssl->error);
14256
                        return WOLFSSL_FATAL_ERROR;
14257
                    }
14258
                }
14259
#endif /* WOLFSSL_DTLS13 */
14260
0
            }
14261
14262
0
            if (!ssl->options.tls1_3) {
14263
0
    #ifndef WOLFSSL_NO_TLS12
14264
0
                if (ssl->options.downgrade)
14265
0
                    return wolfSSL_connect(ssl);
14266
0
    #endif
14267
0
                WOLFSSL_MSG("Client using higher version, fatal error");
14268
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
14269
0
                return VERSION_ERROR;
14270
0
            }
14271
14272
0
            ssl->options.connectState = HELLO_AGAIN;
14273
0
            WOLFSSL_MSG("connect state: HELLO_AGAIN");
14274
0
            FALL_THROUGH;
14275
14276
0
        case HELLO_AGAIN:
14277
14278
0
            if (ssl->options.serverState ==
14279
0
                                          SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
14280
        #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
14281
                if (!ssl->options.dtls && !ssl->options.sentChangeCipher
14282
                    && ssl->options.tls13MiddleBoxCompat) {
14283
                    if ((ssl->error = SendChangeCipher(ssl)) != 0) {
14284
                        WOLFSSL_ERROR(ssl->error);
14285
                        return WOLFSSL_FATAL_ERROR;
14286
                    }
14287
                    ssl->options.sentChangeCipher = 1;
14288
                }
14289
        #endif
14290
                /* Try again with different security parameters. */
14291
0
                if ((ssl->error = SendTls13ClientHello(ssl)) != 0) {
14292
0
                    WOLFSSL_ERROR(ssl->error);
14293
0
                    return WOLFSSL_FATAL_ERROR;
14294
0
                }
14295
0
            }
14296
14297
0
            ssl->options.connectState = HELLO_AGAIN_REPLY;
14298
0
            WOLFSSL_MSG("connect state: HELLO_AGAIN_REPLY");
14299
0
            FALL_THROUGH;
14300
14301
0
        case HELLO_AGAIN_REPLY:
14302
            /* Get the response/s from the server. */
14303
0
            while (ssl->options.serverState < SERVER_FINISHED_COMPLETE) {
14304
#ifdef WOLFSSL_DTLS13
14305
                if (!IsAtLeastTLSv1_3(ssl->version)) {
14306
        #ifndef WOLFSSL_NO_TLS12
14307
                    if (ssl->options.downgrade)
14308
                        return wolfSSL_connect(ssl);
14309
        #endif
14310
                }
14311
#endif /* WOLFSSL_DTLS13 */
14312
0
                if ((ssl->error = ProcessReply(ssl)) < 0) {
14313
0
                        WOLFSSL_ERROR(ssl->error);
14314
0
                        return WOLFSSL_FATAL_ERROR;
14315
0
                }
14316
14317
#ifdef WOLFSSL_DTLS13
14318
                if (ssl->options.dtls) {
14319
                    if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
14320
                        WOLFSSL_ERROR(ssl->error);
14321
                        return WOLFSSL_FATAL_ERROR;
14322
                    }
14323
                }
14324
#endif /* WOLFSSL_DTLS13 */
14325
0
            }
14326
14327
0
            ssl->options.connectState = FIRST_REPLY_DONE;
14328
0
            WOLFSSL_MSG("connect state: FIRST_REPLY_DONE");
14329
0
            FALL_THROUGH;
14330
14331
0
        case FIRST_REPLY_DONE:
14332
0
            if (ssl->options.certOnly)
14333
0
                return WOLFSSL_SUCCESS;
14334
        #ifdef WOLFSSL_EARLY_DATA
14335
            if (!ssl->options.dtls && ssl->earlyData != no_early_data
14336
                && !WOLFSSL_IS_QUIC(ssl)) {
14337
                if ((ssl->error = SendTls13EndOfEarlyData(ssl)) != 0) {
14338
                    WOLFSSL_ERROR(ssl->error);
14339
                    return WOLFSSL_FATAL_ERROR;
14340
                }
14341
                WOLFSSL_MSG("sent: end_of_early_data");
14342
            }
14343
        #endif
14344
14345
0
            ssl->options.connectState = FIRST_REPLY_FIRST;
14346
0
            WOLFSSL_MSG("connect state: FIRST_REPLY_FIRST");
14347
0
            FALL_THROUGH;
14348
14349
0
        case FIRST_REPLY_FIRST:
14350
        #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
14351
            if (!ssl->options.sentChangeCipher && !ssl->options.dtls
14352
                && ssl->options.tls13MiddleBoxCompat) {
14353
                if ((ssl->error = SendChangeCipher(ssl)) != 0) {
14354
                    WOLFSSL_ERROR(ssl->error);
14355
                    return WOLFSSL_FATAL_ERROR;
14356
                }
14357
                ssl->options.sentChangeCipher = 1;
14358
            }
14359
        #endif
14360
14361
0
            ssl->options.connectState = FIRST_REPLY_SECOND;
14362
0
            WOLFSSL_MSG("connect state: FIRST_REPLY_SECOND");
14363
0
            FALL_THROUGH;
14364
14365
0
        case FIRST_REPLY_SECOND:
14366
            /* CLIENT: check peer authentication. */
14367
0
            if (!ssl->options.peerAuthGood) {
14368
0
                WOLFSSL_MSG("Server authentication did not happen");
14369
0
                WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
14370
0
                return WOLFSSL_FATAL_ERROR;
14371
0
            }
14372
0
        #ifndef NO_CERTS
14373
0
            if (!ssl->options.resuming && ssl->options.sendVerify) {
14374
0
                ssl->error = SendTls13Certificate(ssl);
14375
0
                if (ssl->error != 0) {
14376
0
                    wolfssl_local_MaybeCheckAlertOnErr(ssl, ssl->error);
14377
0
                    WOLFSSL_ERROR(ssl->error);
14378
0
                    return WOLFSSL_FATAL_ERROR;
14379
0
                }
14380
0
                WOLFSSL_MSG("sent: certificate");
14381
0
            }
14382
0
        #endif
14383
14384
0
            ssl->options.connectState = FIRST_REPLY_THIRD;
14385
0
            WOLFSSL_MSG("connect state: FIRST_REPLY_THIRD");
14386
0
            FALL_THROUGH;
14387
14388
0
        case FIRST_REPLY_THIRD:
14389
0
        #if (!defined(NO_CERTS) && (!defined(NO_RSA) || defined(HAVE_ECC) || \
14390
0
             defined(HAVE_ED25519) || defined(HAVE_ED448) || \
14391
0
             defined(HAVE_FALCON) || defined(HAVE_DILITHIUM))) && \
14392
0
             (!defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH))
14393
0
            if (!ssl->options.resuming && ssl->options.sendVerify) {
14394
0
                ssl->error = SendTls13CertificateVerify(ssl);
14395
0
                if (ssl->error != 0) {
14396
0
                    wolfssl_local_MaybeCheckAlertOnErr(ssl, ssl->error);
14397
0
                    WOLFSSL_ERROR(ssl->error);
14398
0
                    return WOLFSSL_FATAL_ERROR;
14399
0
                }
14400
0
                WOLFSSL_MSG("sent: certificate verify");
14401
0
            }
14402
0
        #endif
14403
14404
0
            ssl->options.connectState = FIRST_REPLY_FOURTH;
14405
0
            WOLFSSL_MSG("connect state: FIRST_REPLY_FOURTH");
14406
0
            FALL_THROUGH;
14407
14408
0
        case FIRST_REPLY_FOURTH:
14409
0
            if ((ssl->error = SendTls13Finished(ssl)) != 0) {
14410
0
                wolfssl_local_MaybeCheckAlertOnErr(ssl, ssl->error);
14411
0
                WOLFSSL_ERROR(ssl->error);
14412
0
                return WOLFSSL_FATAL_ERROR;
14413
0
            }
14414
0
            WOLFSSL_MSG("sent: finished");
14415
14416
#ifdef WOLFSSL_DTLS13
14417
            ssl->options.connectState = WAIT_FINISHED_ACK;
14418
            WOLFSSL_MSG("connect state: WAIT_FINISHED_ACK");
14419
            FALL_THROUGH;
14420
14421
        case WAIT_FINISHED_ACK:
14422
            if (ssl->options.dtls) {
14423
                while (ssl->options.serverState != SERVER_FINISHED_ACKED) {
14424
                    if ((ssl->error = ProcessReply(ssl)) < 0) {
14425
                        WOLFSSL_ERROR(ssl->error);
14426
                        return WOLFSSL_FATAL_ERROR;
14427
                    }
14428
14429
                    if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
14430
                        WOLFSSL_ERROR(ssl->error);
14431
                        return WOLFSSL_FATAL_ERROR;
14432
                    }
14433
                }
14434
            }
14435
#endif /* WOLFSSL_DTLS13 */
14436
0
            ssl->options.connectState = FINISHED_DONE;
14437
0
            WOLFSSL_MSG("connect state: FINISHED_DONE");
14438
0
            FALL_THROUGH;
14439
14440
0
        case FINISHED_DONE:
14441
0
        #ifndef NO_HANDSHAKE_DONE_CB
14442
0
            if (ssl->hsDoneCb != NULL) {
14443
0
                int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
14444
0
                if (cbret < 0) {
14445
0
                    ssl->error = cbret;
14446
0
                    WOLFSSL_ERROR_VERBOSE(ssl->error);
14447
0
                    WOLFSSL_MSG("HandShake Done Cb don't continue error");
14448
0
                    return WOLFSSL_FATAL_ERROR;
14449
0
                }
14450
0
            }
14451
0
        #endif /* NO_HANDSHAKE_DONE_CB */
14452
14453
        #if defined(HAVE_ECH)
14454
            /* RFC 9849 s6.1.6: if we offered ECH but the server rejected it,
14455
             * send ech_required alert and abort before returning to the app */
14456
            if (ssl->echConfigs != NULL && !ssl->options.disableECH &&
14457
                    !ssl->options.echAccepted) {
14458
                if (ssl->echRetryConfigs != NULL) {
14459
                    ssl->options.echRetryConfigsAccepted = 1;
14460
                }
14461
                SendAlert(ssl, alert_fatal, ech_required);
14462
                ssl->error = ECH_REQUIRED_E;
14463
                WOLFSSL_ERROR_VERBOSE(ECH_REQUIRED_E);
14464
                return WOLFSSL_FATAL_ERROR;
14465
            }
14466
        #endif /* HAVE_ECH */
14467
14468
0
            if (!ssl->options.keepResources) {
14469
0
                FreeHandshakeResources(ssl);
14470
0
            }
14471
0
        #if defined(WOLFSSL_ASYNC_IO) && !defined(WOLFSSL_ASYNC_CRYPT)
14472
            /* Free the remaining async context if not using it for crypto */
14473
0
            FreeAsyncCtx(ssl, 1);
14474
0
        #endif
14475
14476
0
            ssl->error = 0; /* clear the error */
14477
14478
0
            WOLFSSL_LEAVE("wolfSSL_connect_TLSv13", WOLFSSL_SUCCESS);
14479
0
            return WOLFSSL_SUCCESS;
14480
14481
0
        default:
14482
0
            WOLFSSL_MSG("Unknown connect state ERROR");
14483
0
            return WOLFSSL_FATAL_ERROR; /* unknown connect state */
14484
0
    }
14485
0
}
14486
#endif
14487
14488
#if defined(WOLFSSL_SEND_HRR_COOKIE)
14489
/* Send a cookie with the HelloRetryRequest to avoid storing state.
14490
 *
14491
 * ssl       SSL/TLS object.
14492
 * secret    Secret to use when generating integrity check for cookie.
14493
 *           A value of NULL indicates to generate a new random secret.
14494
 * secretSz  Size of secret data in bytes.
14495
 *           Use a value of 0 to indicate use of default size.
14496
 * returns BAD_FUNC_ARG when ssl is NULL or not using TLS v1.3, SIDE_ERROR when
14497
 * called on a client; WOLFSSL_SUCCESS on success and otherwise failure.
14498
 */
14499
int wolfSSL_send_hrr_cookie(WOLFSSL* ssl, const unsigned char* secret,
14500
                            unsigned int secretSz)
14501
{
14502
    int ret;
14503
14504
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
14505
        return BAD_FUNC_ARG;
14506
 #ifndef NO_WOLFSSL_SERVER
14507
    if (ssl->options.side == WOLFSSL_CLIENT_END)
14508
        return SIDE_ERROR;
14509
14510
    if (secretSz == 0) {
14511
    #ifndef NO_SHA256
14512
        secretSz = WC_SHA256_DIGEST_SIZE;
14513
    #elif defined(WOLFSSL_SHA384)
14514
        secretSz = WC_SHA384_DIGEST_SIZE;
14515
    #elif defined(WOLFSSL_TLS13_SHA512)
14516
        secretSz = WC_SHA512_DIGEST_SIZE;
14517
    #elif defined(WOLFSSL_SM3)
14518
        secretSz = WC_SM3_DIGEST_SIZE;
14519
    #else
14520
        #error "No digest to available to use with HMAC for cookies."
14521
    #endif /* NO_SHA */
14522
    }
14523
14524
    if (secretSz != ssl->buffers.tls13CookieSecret.length) {
14525
        byte* newSecret;
14526
14527
        if (ssl->buffers.tls13CookieSecret.buffer != NULL) {
14528
            ForceZero(ssl->buffers.tls13CookieSecret.buffer,
14529
                      ssl->buffers.tls13CookieSecret.length);
14530
            XFREE(ssl->buffers.tls13CookieSecret.buffer,
14531
                  ssl->heap, DYNAMIC_TYPE_COOKIE_PWD);
14532
        }
14533
14534
        newSecret = (byte*)XMALLOC(secretSz, ssl->heap,
14535
                                   DYNAMIC_TYPE_COOKIE_PWD);
14536
        if (newSecret == NULL) {
14537
            ssl->buffers.tls13CookieSecret.buffer = NULL;
14538
            ssl->buffers.tls13CookieSecret.length = 0;
14539
            WOLFSSL_MSG("couldn't allocate new cookie secret");
14540
            return MEMORY_ERROR;
14541
        }
14542
        ssl->buffers.tls13CookieSecret.buffer = newSecret;
14543
        ssl->buffers.tls13CookieSecret.length = secretSz;
14544
    #ifdef WOLFSSL_CHECK_MEM_ZERO
14545
        wc_MemZero_Add("wolfSSL_send_hrr_cookie secret",
14546
            ssl->buffers.tls13CookieSecret.buffer,
14547
            ssl->buffers.tls13CookieSecret.length);
14548
    #endif
14549
    }
14550
14551
    /* If the supplied secret is NULL, randomly generate a new secret. */
14552
    if (secret == NULL) {
14553
        ret = wc_RNG_GenerateBlock(ssl->rng,
14554
                               ssl->buffers.tls13CookieSecret.buffer, secretSz);
14555
        if (ret < 0)
14556
            return ret;
14557
    }
14558
    else
14559
        XMEMCPY(ssl->buffers.tls13CookieSecret.buffer, secret, secretSz);
14560
14561
    ssl->options.sendCookie = 1;
14562
14563
    ret = WOLFSSL_SUCCESS;
14564
#else
14565
    (void)secret;
14566
    (void)secretSz;
14567
14568
    ret = SIDE_ERROR;
14569
#endif
14570
14571
    return ret;
14572
}
14573
14574
int wolfSSL_disable_hrr_cookie(WOLFSSL* ssl)
14575
{
14576
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
14577
        return BAD_FUNC_ARG;
14578
14579
#ifdef NO_WOLFSSL_SERVER
14580
    return SIDE_ERROR;
14581
#else
14582
    if (ssl->options.side == WOLFSSL_CLIENT_END)
14583
        return SIDE_ERROR;
14584
14585
    if (ssl->buffers.tls13CookieSecret.buffer != NULL) {
14586
        ForceZero(ssl->buffers.tls13CookieSecret.buffer,
14587
            ssl->buffers.tls13CookieSecret.length);
14588
        XFREE(ssl->buffers.tls13CookieSecret.buffer, ssl->heap,
14589
            DYNAMIC_TYPE_COOKIE_PWD);
14590
        ssl->buffers.tls13CookieSecret.buffer = NULL;
14591
        ssl->buffers.tls13CookieSecret.length = 0;
14592
    }
14593
14594
    ssl->options.sendCookie = 0;
14595
    return WOLFSSL_SUCCESS;
14596
#endif /* NO_WOLFSSL_SERVER */
14597
}
14598
14599
#endif /* defined(WOLFSSL_SEND_HRR_COOKIE) */
14600
14601
#ifdef HAVE_SUPPORTED_CURVES
14602
/* Create a key share entry from group.
14603
 * Generates a key pair.
14604
 *
14605
 * ssl    The SSL/TLS object.
14606
 * group  The named group.
14607
 * returns 0 on success, otherwise failure.
14608
 *   for async can return WC_PENDING_E and should be called again
14609
 */
14610
int wolfSSL_UseKeyShare(WOLFSSL* ssl, word16 group)
14611
0
{
14612
0
    int ret;
14613
14614
0
    if (ssl == NULL)
14615
0
        return BAD_FUNC_ARG;
14616
14617
#ifdef WOLFSSL_ASYNC_CRYPT
14618
    ret = wolfSSL_AsyncPop(ssl, NULL);
14619
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
14620
        /* Check for error */
14621
        if (ret < 0)
14622
            return ret;
14623
    }
14624
#endif
14625
14626
0
#if defined(WOLFSSL_HAVE_MLKEM)
14627
0
    if (WOLFSSL_NAMED_GROUP_IS_PQC(group) ||
14628
0
        WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(group)) {
14629
14630
0
        if (!IsAtLeastTLSv1_3(ssl->version)) {
14631
0
            return BAD_FUNC_ARG;
14632
0
        }
14633
14634
0
        if (ssl->options.side == WOLFSSL_SERVER_END) {
14635
            /* If I am the server of a KEM connection, do not do keygen because
14636
             * I'm going to encapsulate with the client's public key. Note that
14637
             * I might be the client and ssl->option.side has not been properly
14638
             * set yet. In that case the KeyGen operation will be deferred to
14639
             * connection time. */
14640
0
            return WOLFSSL_SUCCESS;
14641
0
        }
14642
0
    }
14643
0
#endif
14644
#if defined(NO_TLS)
14645
    (void)ret;
14646
    (void)group;
14647
#else
14648
    /* Check if the group is supported. */
14649
0
    if (!TLSX_IsGroupSupported(group)) {
14650
0
        WOLFSSL_MSG("Group not supported.");
14651
0
        return BAD_FUNC_ARG;
14652
0
    }
14653
14654
0
    ret = TLSX_KeyShare_Use(ssl, group, 0, NULL, NULL, &ssl->extensions);
14655
0
    if (ret != 0)
14656
0
        return ret;
14657
0
#endif /* NO_TLS */
14658
0
    return WOLFSSL_SUCCESS;
14659
0
}
14660
14661
/* Send no key share entries - use HelloRetryRequest to negotiate shared group.
14662
 *
14663
 * ssl    The SSL/TLS object.
14664
 * returns 0 on success, otherwise failure.
14665
 */
14666
int wolfSSL_NoKeyShares(WOLFSSL* ssl)
14667
0
{
14668
0
    int ret;
14669
14670
0
    if (ssl == NULL)
14671
0
        return BAD_FUNC_ARG;
14672
0
    if (ssl->options.side == WOLFSSL_SERVER_END)
14673
0
        return SIDE_ERROR;
14674
#if defined(NO_TLS)
14675
    (void)ret;
14676
#else
14677
0
    ret = TLSX_KeyShare_Empty(ssl);
14678
0
    if (ret != 0)
14679
0
        return ret;
14680
0
#endif /* NO_TLS */
14681
0
    return WOLFSSL_SUCCESS;
14682
0
}
14683
#endif
14684
14685
#ifdef WOLFSSL_DUAL_ALG_CERTS
14686
int wolfSSL_UseCKS(WOLFSSL* ssl, byte *sigSpec, word16 sigSpecSz)
14687
{
14688
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->ctx->method->version) ||
14689
        sigSpec == NULL || sigSpecSz == 0)
14690
        return BAD_FUNC_ARG;
14691
14692
    ssl->sigSpec = sigSpec;
14693
    ssl->sigSpecSz = sigSpecSz;
14694
    return WOLFSSL_SUCCESS;
14695
}
14696
14697
int wolfSSL_CTX_UseCKS(WOLFSSL_CTX* ctx, byte *sigSpec, word16 sigSpecSz)
14698
{
14699
    if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version) ||
14700
        sigSpec == NULL || sigSpecSz == 0)
14701
        return BAD_FUNC_ARG;
14702
14703
    ctx->sigSpec = sigSpec;
14704
    ctx->sigSpecSz = sigSpecSz;
14705
    return WOLFSSL_SUCCESS;
14706
}
14707
#endif /* WOLFSSL_DUAL_ALG_CERTS */
14708
14709
/* Do not send a ticket after TLS v1.3 handshake for resumption.
14710
 *
14711
 * ctx  The SSL/TLS CTX object.
14712
 * returns BAD_FUNC_ARG when ctx is NULL and 0 on success.
14713
 */
14714
int wolfSSL_CTX_no_ticket_TLSv13(WOLFSSL_CTX* ctx)
14715
0
{
14716
0
    if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version))
14717
0
        return BAD_FUNC_ARG;
14718
0
    if (ctx->method->side == WOLFSSL_CLIENT_END)
14719
0
        return SIDE_ERROR;
14720
14721
0
#ifdef HAVE_SESSION_TICKET
14722
0
    ctx->noTicketTls13 = 1;
14723
0
#endif
14724
14725
0
    return 0;
14726
0
}
14727
14728
/* Do not send a ticket after TLS v1.3 handshake for resumption.
14729
 *
14730
 * ssl  The SSL/TLS object.
14731
 * returns BAD_FUNC_ARG when ssl is NULL, not using TLS v1.3, or called on
14732
 * a client and 0 on success.
14733
 */
14734
int wolfSSL_no_ticket_TLSv13(WOLFSSL* ssl)
14735
0
{
14736
0
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
14737
0
        return BAD_FUNC_ARG;
14738
0
    if (ssl->options.side == WOLFSSL_CLIENT_END)
14739
0
        return SIDE_ERROR;
14740
14741
0
#ifdef HAVE_SESSION_TICKET
14742
0
    ssl->options.noTicketTls13 = 1;
14743
0
#endif
14744
14745
0
    return 0;
14746
0
}
14747
14748
/* Disallow (EC)DHE key exchange when using pre-shared keys.
14749
 *
14750
 * ctx  The SSL/TLS CTX object.
14751
 * returns BAD_FUNC_ARG when ctx is NULL and 0 on success.
14752
 */
14753
int wolfSSL_CTX_no_dhe_psk(WOLFSSL_CTX* ctx)
14754
0
{
14755
0
    if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version))
14756
0
        return BAD_FUNC_ARG;
14757
14758
0
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14759
0
    ctx->noPskDheKe = 1;
14760
0
#endif
14761
14762
0
    return 0;
14763
0
}
14764
14765
/* Disallow (EC)DHE key exchange when using pre-shared keys.
14766
 *
14767
 * ssl  The SSL/TLS object.
14768
 * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3 and 0 on
14769
 * success.
14770
 */
14771
int wolfSSL_no_dhe_psk(WOLFSSL* ssl)
14772
0
{
14773
0
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
14774
0
        return BAD_FUNC_ARG;
14775
14776
0
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14777
0
    ssl->options.noPskDheKe = 1;
14778
0
#endif
14779
14780
0
    return 0;
14781
0
}
14782
14783
#ifdef HAVE_SUPPORTED_CURVES
14784
/* Only allow (EC)DHE key exchange when using pre-shared keys.
14785
 *
14786
 * ctx  The SSL/TLS CTX object.
14787
 * returns BAD_FUNC_ARG when ctx is NULL and 0 on success.
14788
 */
14789
int wolfSSL_CTX_only_dhe_psk(WOLFSSL_CTX* ctx)
14790
0
{
14791
0
    if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version))
14792
0
        return BAD_FUNC_ARG;
14793
14794
0
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14795
0
    ctx->onlyPskDheKe = 1;
14796
0
#endif
14797
14798
0
    return 0;
14799
0
}
14800
14801
/* Only allow (EC)DHE key exchange when using pre-shared keys.
14802
 *
14803
 * ssl  The SSL/TLS object.
14804
 * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3 and 0 on
14805
 * success.
14806
 */
14807
int wolfSSL_only_dhe_psk(WOLFSSL* ssl)
14808
0
{
14809
0
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
14810
0
        return BAD_FUNC_ARG;
14811
14812
0
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14813
0
    ssl->options.onlyPskDheKe = 1;
14814
0
#endif
14815
14816
0
    return 0;
14817
0
}
14818
#endif /* HAVE_SUPPORTED_CURVES */
14819
14820
int Tls13UpdateKeys(WOLFSSL* ssl)
14821
0
{
14822
0
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
14823
0
        return BAD_FUNC_ARG;
14824
14825
#ifdef WOLFSSL_DTLS13
14826
    /* we are already waiting for the ack of a sent key update message. We can't
14827
       send another one before receiving its ack. Either wolfSSL_update_keys()
14828
       was invoked multiple times over a short period of time or we replied to a
14829
       KeyUpdate with update request. We'll just ignore sending this
14830
       KeyUpdate. */
14831
    /* TODO: add WOLFSSL_ERROR_ALREADY_IN_PROGRESS type of error here */
14832
    if (ssl->options.dtls && ssl->dtls13WaitKeyUpdateAck)
14833
        return 0;
14834
#endif /* WOLFSSL_DTLS13 */
14835
14836
0
    return SendTls13KeyUpdate(ssl);
14837
0
}
14838
14839
/* Update the keys for encryption and decryption.
14840
 * If using non-blocking I/O and WOLFSSL_ERROR_WANT_WRITE is returned then
14841
 * calling wolfSSL_write() will have the message sent when ready.
14842
 *
14843
 * ssl  The SSL/TLS object.
14844
 * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
14845
 * WOLFSSL_ERROR_WANT_WRITE when non-blocking I/O is not ready to write,
14846
 * WOLFSSL_SUCCESS on success and otherwise failure.
14847
 */
14848
int wolfSSL_update_keys(WOLFSSL* ssl)
14849
0
{
14850
0
    int ret;
14851
0
    ret = Tls13UpdateKeys(ssl);
14852
0
    if (ret == WC_NO_ERR_TRACE(WANT_WRITE))
14853
0
        ret = WOLFSSL_ERROR_WANT_WRITE;
14854
0
    else if (ret == 0)
14855
0
        ret = WOLFSSL_SUCCESS;
14856
0
    return ret;
14857
0
}
14858
14859
/* Whether a response is waiting for key update request.
14860
 *
14861
 * ssl        The SSL/TLS object.
14862
 * required   0 when no key update response required.
14863
 *            1 when no key update response required.
14864
 * return  0 on success.
14865
 * return  BAD_FUNC_ARG when ssl is NULL or not using TLS v1.3
14866
 */
14867
int wolfSSL_key_update_response(WOLFSSL* ssl, int* required)
14868
0
{
14869
0
    if (required == NULL || ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
14870
0
        return BAD_FUNC_ARG;
14871
14872
0
    *required = ssl->keys.updateResponseReq;
14873
14874
0
    return 0;
14875
0
}
14876
14877
#if !defined(NO_CERTS) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
14878
/* Allow post-handshake authentication in TLS v1.3 connections.
14879
 *
14880
 * ctx  The SSL/TLS CTX object.
14881
 * returns BAD_FUNC_ARG when ctx is NULL, SIDE_ERROR when not a client and
14882
 * 0 on success.
14883
 */
14884
int wolfSSL_CTX_allow_post_handshake_auth(WOLFSSL_CTX* ctx)
14885
{
14886
    if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version))
14887
        return BAD_FUNC_ARG;
14888
    if (ctx->method->side == WOLFSSL_SERVER_END)
14889
        return SIDE_ERROR;
14890
14891
    ctx->postHandshakeAuth = 1;
14892
14893
    return 0;
14894
}
14895
14896
/* Allow post-handshake authentication in TLS v1.3 connection.
14897
 *
14898
 * ssl  The SSL/TLS object.
14899
 * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
14900
 * SIDE_ERROR when not a client and 0 on success.
14901
 */
14902
int wolfSSL_allow_post_handshake_auth(WOLFSSL* ssl)
14903
{
14904
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
14905
        return BAD_FUNC_ARG;
14906
    if (ssl->options.side == WOLFSSL_SERVER_END)
14907
        return SIDE_ERROR;
14908
14909
    ssl->options.postHandshakeAuth = 1;
14910
14911
    return 0;
14912
}
14913
14914
/* Request a certificate of the client.
14915
 * Can be called any time after handshake completion.
14916
 * A maximum of 256 requests can be sent on a connection.
14917
 *
14918
 * ssl  SSL/TLS object.
14919
 */
14920
int wolfSSL_request_certificate(WOLFSSL* ssl)
14921
{
14922
    int         ret;
14923
#ifndef NO_WOLFSSL_SERVER
14924
    CertReqCtx* certReqCtx;
14925
#endif
14926
14927
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
14928
        return BAD_FUNC_ARG;
14929
#ifndef NO_WOLFSSL_SERVER
14930
    if (ssl->options.side == WOLFSSL_CLIENT_END)
14931
        return SIDE_ERROR;
14932
    if (ssl->options.handShakeState != HANDSHAKE_DONE)
14933
        return NOT_READY_ERROR;
14934
    if (!ssl->options.postHandshakeAuth)
14935
        return POST_HAND_AUTH_ERROR;
14936
    if (ssl->certReqCtx != NULL) {
14937
        if (ssl->certReqCtx->len != 1)
14938
            return BAD_STATE_E;
14939
        /* We support sending up to 255 certificate requests */
14940
        if (ssl->certReqCtx->ctx == 255)
14941
            return BAD_STATE_E;
14942
    }
14943
14944
    certReqCtx = (CertReqCtx*)XMALLOC(sizeof(CertReqCtx), ssl->heap,
14945
                                                       DYNAMIC_TYPE_TMP_BUFFER);
14946
    if (certReqCtx == NULL)
14947
        return MEMORY_E;
14948
    XMEMSET(certReqCtx, 0, sizeof(CertReqCtx));
14949
    certReqCtx->next = ssl->certReqCtx;
14950
    certReqCtx->len = 1;
14951
    if (certReqCtx->next != NULL)
14952
        certReqCtx->ctx = certReqCtx->next->ctx + 1;
14953
    ssl->certReqCtx = certReqCtx;
14954
14955
    ssl->msgsReceived.got_certificate = 0;
14956
    ssl->msgsReceived.got_certificate_verify = 0;
14957
    ssl->msgsReceived.got_finished = 0;
14958
14959
    ret = SendTls13CertificateRequest(ssl, &certReqCtx->ctx, certReqCtx->len);
14960
    if (ret == WC_NO_ERR_TRACE(WANT_WRITE))
14961
        ret = WOLFSSL_ERROR_WANT_WRITE;
14962
    else if (ret == 0)
14963
        ret = WOLFSSL_SUCCESS;
14964
#else
14965
    ret = SIDE_ERROR;
14966
#endif
14967
14968
    return ret;
14969
}
14970
#endif /* !NO_CERTS && WOLFSSL_POST_HANDSHAKE_AUTH */
14971
14972
#if !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
14973
/* Get the preferred key exchange group.
14974
 *
14975
 * ssl  The SSL/TLS object.
14976
 * returns BAD_FUNC_ARG when ssl is NULL or not using TLS v1.3,
14977
 * SIDE_ERROR when not a client, NOT_READY_ERROR when handshake not complete
14978
 * and group number on success.
14979
 */
14980
int wolfSSL_preferred_group(WOLFSSL* ssl)
14981
0
{
14982
0
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
14983
0
        return BAD_FUNC_ARG;
14984
0
#ifndef NO_WOLFSSL_CLIENT
14985
0
    if (ssl->options.side == WOLFSSL_SERVER_END)
14986
0
        return SIDE_ERROR;
14987
0
    if (ssl->options.handShakeState != HANDSHAKE_DONE)
14988
0
        return NOT_READY_ERROR;
14989
14990
0
#ifdef HAVE_SUPPORTED_CURVES
14991
    /* Return supported groups only. */
14992
0
    return TLSX_SupportedCurve_Preferred(ssl, 1);
14993
#else
14994
    return 0;
14995
#endif
14996
#else
14997
    return SIDE_ERROR;
14998
#endif
14999
0
}
15000
#endif
15001
15002
#ifndef NO_PSK
15003
/* Set the PSK callback, that is passed the cipher suite, for a client to use
15004
 * against context object.
15005
 *
15006
 * @param [in, out] ctx  SSL/TLS context object.
15007
 * @param [in]      cb   Client PSK callback passed a cipher suite.
15008
 */
15009
void wolfSSL_CTX_set_psk_client_cs_callback(WOLFSSL_CTX* ctx,
15010
                                            wc_psk_client_cs_callback cb)
15011
{
15012
    WOLFSSL_ENTER("wolfSSL_CTX_set_psk_client_cs_callback");
15013
15014
    if (ctx == NULL)
15015
        return;
15016
15017
    ctx->havePSK = 1;
15018
    ctx->client_psk_cs_cb = cb;
15019
}
15020
15021
/* Set the PSK callback, that is passed the cipher suite, for a client to use
15022
 * against SSL object.
15023
 *
15024
 * @param [in, out] ssl  SSL/TLS object.
15025
 * @param [in]      cb   Client PSK callback passed a cipher suite.
15026
 */
15027
void wolfSSL_set_psk_client_cs_callback(WOLFSSL* ssl,
15028
                                        wc_psk_client_cs_callback cb)
15029
{
15030
    byte haveRSA = 1;
15031
    int  keySz   = 0;
15032
15033
    WOLFSSL_ENTER("wolfSSL_set_psk_client_cs_callback");
15034
15035
    if (ssl == NULL)
15036
        return;
15037
15038
    ssl->options.havePSK = 1;
15039
    ssl->options.client_psk_cs_cb = cb;
15040
15041
    #ifdef NO_RSA
15042
        haveRSA = 0;
15043
    #endif
15044
    #ifndef NO_CERTS
15045
        keySz = ssl->buffers.keySz;
15046
    #endif
15047
    if (AllocateSuites(ssl) != 0)
15048
        return;
15049
    InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
15050
               ssl->options.haveDH, ssl->options.haveECDSAsig,
15051
               ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
15052
               ssl->options.useAnon, TRUE, TRUE, TRUE, TRUE, ssl->options.side);
15053
}
15054
15055
/* Set the PSK callback that returns the cipher suite for a client to use
15056
 * against context object.
15057
 *
15058
 * @param [in, out] ctx  SSL/TLS context object.
15059
 * @param [in]      cb   Client PSK callback returning cipher suite.
15060
 */
15061
void wolfSSL_CTX_set_psk_client_tls13_callback(WOLFSSL_CTX* ctx,
15062
                                               wc_psk_client_tls13_callback cb)
15063
{
15064
    WOLFSSL_ENTER("wolfSSL_CTX_set_psk_client_tls13_callback");
15065
15066
    if (ctx == NULL)
15067
        return;
15068
15069
    ctx->havePSK = 1;
15070
    ctx->client_psk_tls13_cb = cb;
15071
}
15072
15073
/* Set the PSK callback that returns the cipher suite for a client to use
15074
 * against SSL object.
15075
 *
15076
 * @param [in, out] ssl  SSL/TLS object.
15077
 * @param [in]      cb   Client PSK callback returning cipher suite.
15078
 */
15079
void wolfSSL_set_psk_client_tls13_callback(WOLFSSL* ssl,
15080
                                           wc_psk_client_tls13_callback cb)
15081
{
15082
    byte haveRSA = 1;
15083
    int  keySz   = 0;
15084
15085
    WOLFSSL_ENTER("wolfSSL_set_psk_client_tls13_callback");
15086
15087
    if (ssl == NULL)
15088
        return;
15089
15090
    ssl->options.havePSK = 1;
15091
    ssl->options.client_psk_tls13_cb = cb;
15092
15093
    #ifdef NO_RSA
15094
        haveRSA = 0;
15095
    #endif
15096
    #ifndef NO_CERTS
15097
        keySz = ssl->buffers.keySz;
15098
    #endif
15099
    if (AllocateSuites(ssl) != 0)
15100
        return;
15101
    InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
15102
               ssl->options.haveDH, ssl->options.haveECDSAsig,
15103
               ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
15104
               ssl->options.useAnon, TRUE, TRUE, TRUE, TRUE, ssl->options.side);
15105
}
15106
15107
/* Set the PSK callback that returns the cipher suite for a server to use
15108
 * against context object.
15109
 *
15110
 * @param [in, out] ctx  SSL/TLS context object.
15111
 * @param [in]      cb   Server PSK callback returning cipher suite.
15112
 */
15113
void wolfSSL_CTX_set_psk_server_tls13_callback(WOLFSSL_CTX* ctx,
15114
                                               wc_psk_server_tls13_callback cb)
15115
{
15116
    WOLFSSL_ENTER("wolfSSL_CTX_set_psk_server_tls13_callback");
15117
    if (ctx == NULL)
15118
        return;
15119
    ctx->havePSK = 1;
15120
    ctx->server_psk_tls13_cb = cb;
15121
}
15122
15123
/* Set the PSK callback that returns the cipher suite for a server to use
15124
 * against SSL object.
15125
 *
15126
 * @param [in, out] ssl  SSL/TLS object.
15127
 * @param [in]      cb   Server PSK callback returning cipher suite.
15128
 */
15129
void wolfSSL_set_psk_server_tls13_callback(WOLFSSL* ssl,
15130
                                           wc_psk_server_tls13_callback cb)
15131
{
15132
    byte haveRSA = 1;
15133
    int  keySz   = 0;
15134
15135
    WOLFSSL_ENTER("wolfSSL_set_psk_server_tls13_callback");
15136
    if (ssl == NULL)
15137
        return;
15138
15139
    ssl->options.havePSK = 1;
15140
    ssl->options.server_psk_tls13_cb = cb;
15141
15142
    #ifdef NO_RSA
15143
        haveRSA = 0;
15144
    #endif
15145
    #ifndef NO_CERTS
15146
        keySz = ssl->buffers.keySz;
15147
    #endif
15148
    if (AllocateSuites(ssl) != 0)
15149
        return;
15150
    InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
15151
               ssl->options.haveDH, ssl->options.haveECDSAsig,
15152
               ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
15153
               ssl->options.useAnon, TRUE, TRUE, TRUE, TRUE, ssl->options.side);
15154
}
15155
15156
/* Get name of first supported cipher suite that uses the hash indicated.
15157
 *
15158
 * @param [in] ssl   SSL/TLS object.
15159
 * @param [in] hash  Name of hash algorithm. e.g. "SHA256", "SHA384"
15160
 * @return  Name of cipher suite.
15161
 * @return  NULL on failure.
15162
 */
15163
const char* wolfSSL_get_cipher_name_by_hash(WOLFSSL* ssl, const char* hash)
15164
{
15165
    const char* name = NULL;
15166
    byte mac = no_mac;
15167
    int i;
15168
    const Suites* suites;
15169
15170
    if (hash == NULL || ssl == NULL ||
15171
        (ssl->suites == NULL && ssl->ctx == NULL))
15172
        return NULL;
15173
15174
    suites = WOLFSSL_SUITES(ssl);
15175
    if (suites == NULL)
15176
        return NULL;
15177
15178
    if (XSTRCMP(hash, "SHA256") == 0) {
15179
        mac = sha256_mac;
15180
    }
15181
    else if (XSTRCMP(hash, "SHA384") == 0) {
15182
        mac = sha384_mac;
15183
    }
15184
    if (mac != no_mac) {
15185
        for (i = 0; i < suites->suiteSz; i += 2) {
15186
            if (SuiteMac(suites->suites + i) == mac) {
15187
                name = GetCipherNameInternal(suites->suites[i + 0],
15188
                                             suites->suites[i + 1]);
15189
                break;
15190
            }
15191
        }
15192
    }
15193
    return name;
15194
}
15195
#endif /* !NO_PSK */
15196
15197
15198
#ifndef NO_WOLFSSL_SERVER
15199
15200
/* The server accepting a connection from a client.
15201
 * The protocol version is expecting to be TLS v1.3.
15202
 * If the client downgrades, and older versions of the protocol are compiled
15203
 * in, the server will fallback to wolfSSL_accept().
15204
 * Please see note at top of README if you get an error from accept.
15205
 *
15206
 * ssl  The SSL/TLS object.
15207
 * returns WOLFSSL_SUCCESS on successful handshake, WOLFSSL_FATAL_ERROR when
15208
 * unrecoverable error occurs and 0 otherwise.
15209
 * For more error information use wolfSSL_get_error().
15210
 */
15211
int wolfSSL_accept_TLSv13(WOLFSSL* ssl)
15212
0
{
15213
0
#if !defined(NO_CERTS) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
15214
0
    word16 havePSK = 0;
15215
0
#endif
15216
0
    int ret = 0;
15217
15218
0
    WOLFSSL_ENTER("wolfSSL_accept_TLSv13");
15219
15220
0
#ifdef HAVE_ERRNO_H
15221
0
    errno = 0;
15222
0
#endif
15223
15224
0
    if (ssl == NULL)
15225
0
        return WOLFSSL_FATAL_ERROR;
15226
15227
0
#if !defined(NO_CERTS) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
15228
0
    havePSK = ssl->options.havePSK;
15229
0
#endif
15230
15231
0
    if (ssl->options.side != WOLFSSL_SERVER_END) {
15232
0
        ssl->error = SIDE_ERROR;
15233
0
        WOLFSSL_ERROR(ssl->error);
15234
0
        return WOLFSSL_FATAL_ERROR;
15235
0
    }
15236
15237
    /* make sure this wolfSSL object has arrays and rng setup. Protects
15238
     * case where the WOLFSSL object is reused via wolfSSL_clear() */
15239
0
    if ((ret = ReinitSSL(ssl, ssl->ctx, 0)) != 0) {
15240
0
        return ret;
15241
0
    }
15242
15243
#ifdef WOLFSSL_DTLS
15244
    if (ssl->version.major == DTLS_MAJOR) {
15245
        ssl->options.dtls   = 1;
15246
        if (!IsDtlsNotSctpMode(ssl) || !ssl->options.sendCookie)
15247
            ssl->options.dtlsStateful = 1;
15248
    }
15249
#endif
15250
15251
#ifdef WOLFSSL_WOLFSENTRY_HOOKS
15252
    if ((ssl->AcceptFilter != NULL) &&
15253
            ((ssl->options.acceptState == TLS13_ACCEPT_BEGIN)
15254
#ifdef HAVE_SECURE_RENEGOTIATION
15255
             || (ssl->options.acceptState == TLS13_ACCEPT_BEGIN_RENEG)
15256
#endif
15257
                ))
15258
    {
15259
        wolfSSL_netfilter_decision_t res;
15260
        if ((ssl->AcceptFilter(ssl, ssl->AcceptFilter_arg, &res) ==
15261
             WOLFSSL_SUCCESS) &&
15262
            (res == WOLFSSL_NETFILTER_REJECT)) {
15263
            ssl->error = SOCKET_FILTERED_E;
15264
            WOLFSSL_ERROR(ssl->error);
15265
            return WOLFSSL_FATAL_ERROR;
15266
        }
15267
    }
15268
#endif /* WOLFSSL_WOLFSENTRY_HOOKS */
15269
15270
0
#ifndef NO_CERTS
15271
0
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15272
0
    if (!havePSK)
15273
0
#endif
15274
0
    {
15275
0
    #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || \
15276
0
        defined(WOLFSSL_NGINX) || defined (WOLFSSL_HAPROXY)
15277
0
        if (ssl->ctx->certSetupCb != NULL) {
15278
0
            WOLFSSL_MSG("CertSetupCb set. server cert and "
15279
0
                        "key not checked");
15280
0
        }
15281
0
        else
15282
0
    #endif
15283
0
        {
15284
0
            if (!ssl->buffers.certificate ||
15285
0
                !ssl->buffers.certificate->buffer) {
15286
15287
0
                WOLFSSL_MSG("accept error: server cert required");
15288
0
                ssl->error = NO_PRIVATE_KEY;
15289
0
                WOLFSSL_ERROR(ssl->error);
15290
0
                return WOLFSSL_FATAL_ERROR;
15291
0
            }
15292
15293
0
            if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
15294
                /* allow no private key if using existing key */
15295
0
            #ifdef WOLF_PRIVATE_KEY_ID
15296
0
                if (ssl->devId != INVALID_DEVID
15297
                #ifdef HAVE_PK_CALLBACKS
15298
                    || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
15299
                #endif
15300
0
                ) {
15301
0
                    WOLFSSL_MSG("Allowing no server private key (external)");
15302
0
                }
15303
0
                else
15304
0
            #endif
15305
0
                {
15306
0
                    WOLFSSL_MSG("accept error: server key required");
15307
0
                    ssl->error = NO_PRIVATE_KEY;
15308
0
                    WOLFSSL_ERROR(ssl->error);
15309
0
                    return WOLFSSL_FATAL_ERROR;
15310
0
                }
15311
0
            }
15312
0
        }
15313
0
    }
15314
0
#endif /* NO_CERTS */
15315
15316
0
    if (ssl->buffers.outputBuffer.length > 0
15317
    #ifdef WOLFSSL_ASYNC_CRYPT
15318
        /* do not send buffered or advance state if last error was an
15319
            async pending operation */
15320
        && ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E)
15321
    #endif
15322
0
    ) {
15323
15324
        /* fragOffset is non-zero when sending fragments. On the last
15325
         * fragment, fragOffset is zero again, and the state can be
15326
         * advanced. */
15327
0
        int advanceState =
15328
0
            (ssl->options.acceptState == TLS13_ACCEPT_CLIENT_HELLO_DONE ||
15329
0
                ssl->options.acceptState ==
15330
0
                    TLS13_ACCEPT_HELLO_RETRY_REQUEST_DONE ||
15331
0
                ssl->options.acceptState == TLS13_ACCEPT_SECOND_REPLY_DONE ||
15332
0
                ssl->options.acceptState == TLS13_SERVER_HELLO_SENT ||
15333
0
                ssl->options.acceptState == TLS13_ACCEPT_THIRD_REPLY_DONE ||
15334
0
                ssl->options.acceptState == TLS13_SERVER_EXTENSIONS_SENT ||
15335
0
                ssl->options.acceptState == TLS13_CERT_REQ_SENT ||
15336
0
                ssl->options.acceptState == TLS13_CERT_SENT ||
15337
0
                ssl->options.acceptState == TLS13_CERT_VERIFY_SENT ||
15338
0
                ssl->options.acceptState == TLS13_ACCEPT_FINISHED_SENT ||
15339
0
                ssl->options.acceptState == TLS13_ACCEPT_FINISHED_DONE);
15340
15341
#ifdef WOLFSSL_DTLS13
15342
        if (ssl->options.dtls)
15343
            advanceState = advanceState && !ssl->dtls13SendingFragments
15344
                && !ssl->dtls13SendingAckOrRtx;
15345
#endif /* WOLFSSL_DTLS13 */
15346
15347
0
        ret = SendBuffered(ssl);
15348
0
        if (ret == 0) {
15349
0
            if (ssl->fragOffset == 0 && !ssl->options.buildingMsg) {
15350
0
                if (advanceState) {
15351
0
                    ssl->options.acceptState++;
15352
0
                    WOLFSSL_MSG("accept state: "
15353
0
                                "Advanced from last buffered fragment send");
15354
0
#ifdef WOLFSSL_ASYNC_IO
15355
0
                    FreeAsyncCtx(ssl, 0);
15356
0
#endif
15357
0
                }
15358
0
            }
15359
0
            else {
15360
0
                WOLFSSL_MSG("accept state: "
15361
0
                            "Not advanced, more fragments to send");
15362
0
            }
15363
15364
#ifdef WOLFSSL_DTLS13
15365
            if (ssl->options.dtls)
15366
                ssl->dtls13SendingAckOrRtx = 0;
15367
#endif /* WOLFSSL_DTLS13 */
15368
15369
0
        }
15370
0
        else {
15371
0
            ssl->error = ret;
15372
0
            WOLFSSL_ERROR(ssl->error);
15373
0
            return WOLFSSL_FATAL_ERROR;
15374
0
        }
15375
0
    }
15376
15377
0
    ret = RetrySendAlert(ssl);
15378
0
    if (ret != 0) {
15379
0
        ssl->error = ret;
15380
0
        WOLFSSL_ERROR(ssl->error);
15381
0
        return WOLFSSL_FATAL_ERROR;
15382
0
    }
15383
#ifdef WOLFSSL_DTLS13
15384
    if (ssl->options.dtls && ssl->dtls13SendingFragments) {
15385
        if ((ssl->error = Dtls13FragmentsContinue(ssl)) != 0) {
15386
                WOLFSSL_ERROR(ssl->error);
15387
                return WOLFSSL_FATAL_ERROR;
15388
        }
15389
15390
        /* we sent all the fragments. Advance state. */
15391
        ssl->options.acceptState++;
15392
    }
15393
#endif /* WOLFSSL_DTLS13 */
15394
15395
0
    switch (ssl->options.acceptState) {
15396
15397
#ifdef HAVE_SECURE_RENEGOTIATION
15398
        case TLS13_ACCEPT_BEGIN_RENEG:
15399
#endif
15400
0
        case TLS13_ACCEPT_BEGIN :
15401
            /* get client_hello */
15402
15403
0
            while (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
15404
0
                if ((ssl->error = ProcessReply(ssl)) < 0) {
15405
0
                    WOLFSSL_ERROR(ssl->error);
15406
0
                    return WOLFSSL_FATAL_ERROR;
15407
0
                }
15408
15409
#ifdef WOLFSSL_DTLS13
15410
                if (ssl->options.dtls) {
15411
                    if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
15412
                        WOLFSSL_ERROR(ssl->error);
15413
                        return WOLFSSL_FATAL_ERROR;
15414
                    }
15415
                }
15416
#endif /* WOLFSSL_DTLS13 */
15417
15418
0
            }
15419
15420
0
            ssl->options.acceptState = TLS13_ACCEPT_CLIENT_HELLO_DONE;
15421
0
            WOLFSSL_MSG("accept state ACCEPT_CLIENT_HELLO_DONE");
15422
0
            if (!IsAtLeastTLSv1_3(ssl->version))
15423
0
                return wolfSSL_accept(ssl);
15424
0
            FALL_THROUGH;
15425
15426
0
        case TLS13_ACCEPT_CLIENT_HELLO_DONE :
15427
0
            if (ssl->options.serverState ==
15428
0
                                          SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
15429
0
                if ((ssl->error = SendTls13ServerHello(ssl,
15430
0
                                                   hello_retry_request)) != 0) {
15431
0
                    WOLFSSL_ERROR(ssl->error);
15432
0
                    return WOLFSSL_FATAL_ERROR;
15433
0
                }
15434
0
            }
15435
15436
0
            ssl->options.acceptState = TLS13_ACCEPT_HELLO_RETRY_REQUEST_DONE;
15437
0
            WOLFSSL_MSG("accept state ACCEPT_HELLO_RETRY_REQUEST_DONE");
15438
0
            FALL_THROUGH;
15439
15440
0
        case TLS13_ACCEPT_HELLO_RETRY_REQUEST_DONE :
15441
    #ifdef WOLFSSL_TLS13_MIDDLEBOX_COMPAT
15442
            if (!ssl->options.dtls && ssl->options.tls13MiddleBoxCompat
15443
                && ssl->options.serverState ==
15444
                                          SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
15445
                if ((ssl->error = SendChangeCipher(ssl)) != 0) {
15446
                    WOLFSSL_ERROR(ssl->error);
15447
                    return WOLFSSL_FATAL_ERROR;
15448
                }
15449
                ssl->options.sentChangeCipher = 1;
15450
                ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
15451
            }
15452
    #endif
15453
0
            ssl->options.acceptState = TLS13_ACCEPT_FIRST_REPLY_DONE;
15454
0
            WOLFSSL_MSG("accept state ACCEPT_FIRST_REPLY_DONE");
15455
0
            FALL_THROUGH;
15456
15457
0
        case TLS13_ACCEPT_FIRST_REPLY_DONE :
15458
0
            if (ssl->options.serverState ==
15459
0
                                          SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
15460
0
                ssl->options.clientState = CLIENT_HELLO_RETRY;
15461
0
                while (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
15462
0
                    if ((ssl->error = ProcessReply(ssl)) < 0) {
15463
0
                        WOLFSSL_ERROR(ssl->error);
15464
0
                        return WOLFSSL_FATAL_ERROR;
15465
0
                    }
15466
15467
#ifdef WOLFSSL_DTLS13
15468
                if (ssl->options.dtls) {
15469
                    if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
15470
                        WOLFSSL_ERROR(ssl->error);
15471
                        return WOLFSSL_FATAL_ERROR;
15472
                    }
15473
                }
15474
#endif /* WOLFSSL_DTLS13 */
15475
15476
0
                }
15477
0
            }
15478
15479
0
            ssl->options.acceptState = TLS13_ACCEPT_SECOND_REPLY_DONE;
15480
0
            WOLFSSL_MSG("accept state ACCEPT_SECOND_REPLY_DONE");
15481
0
            FALL_THROUGH;
15482
15483
0
        case TLS13_ACCEPT_SECOND_REPLY_DONE :
15484
0
            if (ssl->options.returnOnGoodCh) {
15485
                /* Higher level in stack wants us to return. Simulate a
15486
                 * WANT_WRITE to accomplish this. */
15487
0
                ssl->error = WANT_WRITE;
15488
0
                return WOLFSSL_FATAL_ERROR;
15489
0
            }
15490
15491
0
            if ((ssl->error = SendTls13ServerHello(ssl, server_hello)) != 0) {
15492
0
                WOLFSSL_ERROR(ssl->error);
15493
0
                return WOLFSSL_FATAL_ERROR;
15494
0
            }
15495
0
            ssl->options.acceptState = TLS13_SERVER_HELLO_SENT;
15496
0
            WOLFSSL_MSG("accept state SERVER_HELLO_SENT");
15497
0
            FALL_THROUGH;
15498
15499
0
        case TLS13_SERVER_HELLO_SENT :
15500
    #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
15501
            if (!ssl->options.dtls && ssl->options.tls13MiddleBoxCompat
15502
                          && !ssl->options.sentChangeCipher && !ssl->options.dtls) {
15503
                if ((ssl->error = SendChangeCipher(ssl)) != 0) {
15504
                    WOLFSSL_ERROR(ssl->error);
15505
                    return WOLFSSL_FATAL_ERROR;
15506
                }
15507
                ssl->options.sentChangeCipher = 1;
15508
            }
15509
    #endif
15510
15511
0
            ssl->options.acceptState = TLS13_ACCEPT_THIRD_REPLY_DONE;
15512
0
            WOLFSSL_MSG("accept state ACCEPT_THIRD_REPLY_DONE");
15513
0
            FALL_THROUGH;
15514
15515
0
        case TLS13_ACCEPT_THIRD_REPLY_DONE :
15516
0
    #ifdef HAVE_SUPPORTED_CURVES
15517
0
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15518
0
            if (!ssl->options.noPskDheKe)
15519
0
        #endif
15520
0
            {
15521
0
                ssl->error = TLSX_KeyShare_DeriveSecret(ssl);
15522
0
                if (ssl->error != 0)
15523
0
                    return WOLFSSL_FATAL_ERROR;
15524
0
            }
15525
0
    #endif
15526
15527
0
            if ((ssl->error = SendTls13EncryptedExtensions(ssl)) != 0) {
15528
0
                WOLFSSL_ERROR(ssl->error);
15529
0
                return WOLFSSL_FATAL_ERROR;
15530
0
            }
15531
0
            ssl->options.acceptState = TLS13_SERVER_EXTENSIONS_SENT;
15532
0
            WOLFSSL_MSG("accept state SERVER_EXTENSIONS_SENT");
15533
0
            FALL_THROUGH;
15534
15535
0
        case TLS13_SERVER_EXTENSIONS_SENT :
15536
0
#ifndef NO_CERTS
15537
0
            if (!ssl->options.resuming) {
15538
0
                if (ssl->options.verifyPeer
15539
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
15540
                    && !ssl->options.verifyPostHandshake
15541
    #endif
15542
0
                   ) {
15543
0
                    ssl->error = SendTls13CertificateRequest(ssl, NULL, 0);
15544
0
                    if (ssl->error != 0) {
15545
0
                        WOLFSSL_ERROR(ssl->error);
15546
0
                        return WOLFSSL_FATAL_ERROR;
15547
0
                    }
15548
0
                }
15549
0
                else {
15550
                    /* SERVER: Peer auth good if not verifying client. */
15551
0
                    ssl->options.peerAuthGood = 1;
15552
0
                }
15553
0
            }
15554
0
#endif
15555
0
            ssl->options.acceptState = TLS13_CERT_REQ_SENT;
15556
0
            WOLFSSL_MSG("accept state CERT_REQ_SENT");
15557
0
            FALL_THROUGH;
15558
15559
0
        case TLS13_CERT_REQ_SENT :
15560
0
#ifndef NO_CERTS
15561
0
            if (!ssl->options.resuming && ssl->options.sendVerify) {
15562
0
                if ((ssl->error = SendTls13Certificate(ssl)) != 0) {
15563
0
                    WOLFSSL_ERROR(ssl->error);
15564
0
                    return WOLFSSL_FATAL_ERROR;
15565
0
                }
15566
0
            }
15567
0
#endif
15568
0
            ssl->options.acceptState = TLS13_CERT_SENT;
15569
0
            WOLFSSL_MSG("accept state CERT_SENT");
15570
0
            FALL_THROUGH;
15571
15572
0
        case TLS13_CERT_SENT :
15573
0
#if !defined(NO_CERTS) && (!defined(NO_RSA) || defined(HAVE_ECC) || \
15574
0
     defined(HAVE_ED25519) || defined(HAVE_ED448) || defined(HAVE_FALCON) || \
15575
0
     defined(HAVE_DILITHIUM))
15576
0
            if (!ssl->options.resuming && ssl->options.sendVerify) {
15577
0
                if ((ssl->error = SendTls13CertificateVerify(ssl)) != 0) {
15578
0
                    WOLFSSL_ERROR(ssl->error);
15579
0
                    return WOLFSSL_FATAL_ERROR;
15580
0
                }
15581
0
            }
15582
0
#endif
15583
0
            ssl->options.acceptState = TLS13_CERT_VERIFY_SENT;
15584
0
            WOLFSSL_MSG("accept state CERT_VERIFY_SENT");
15585
0
            FALL_THROUGH;
15586
15587
0
        case TLS13_CERT_VERIFY_SENT :
15588
0
            if ((ssl->error = SendTls13Finished(ssl)) != 0) {
15589
0
                WOLFSSL_ERROR(ssl->error);
15590
0
                return WOLFSSL_FATAL_ERROR;
15591
0
            }
15592
15593
0
            ssl->options.acceptState = TLS13_ACCEPT_FINISHED_SENT;
15594
0
            WOLFSSL_MSG("accept state ACCEPT_FINISHED_SENT");
15595
0
            FALL_THROUGH;
15596
15597
0
        case TLS13_ACCEPT_FINISHED_SENT:
15598
#ifdef WOLFSSL_EARLY_DATA
15599
            if (ssl->earlyData != no_early_data &&
15600
                    ssl->options.handShakeState != SERVER_FINISHED_COMPLETE) {
15601
                ssl->options.handShakeState = SERVER_FINISHED_COMPLETE;
15602
                return WOLFSSL_SUCCESS;
15603
            }
15604
#endif
15605
0
#ifdef HAVE_SESSION_TICKET
15606
    #ifdef WOLFSSL_TLS13_TICKET_BEFORE_FINISHED
15607
            if (!ssl->options.verifyPeer && !ssl->options.noTicketTls13 &&
15608
                    ssl->ctx->ticketEncCb != NULL &&
15609
                    ssl->options.maxTicketTls13 > 0) {
15610
                if ((ssl->error = SendTls13NewSessionTicket(ssl)) != 0) {
15611
                    WOLFSSL_ERROR(ssl->error);
15612
                    return WOLFSSL_FATAL_ERROR;
15613
                }
15614
                ssl->options.ticketsSent = 1;
15615
            }
15616
    #endif
15617
0
#endif /* HAVE_SESSION_TICKET */
15618
0
            ssl->options.acceptState = TLS13_PRE_TICKET_SENT;
15619
0
            WOLFSSL_MSG("accept state  TICKET_SENT");
15620
0
            FALL_THROUGH;
15621
15622
0
        case TLS13_PRE_TICKET_SENT :
15623
0
            while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE) {
15624
0
                if ( (ssl->error = ProcessReply(ssl)) < 0) {
15625
0
                        WOLFSSL_ERROR(ssl->error);
15626
0
                        return WOLFSSL_FATAL_ERROR;
15627
0
                    }
15628
15629
#ifdef WOLFSSL_DTLS13
15630
                if (ssl->options.dtls) {
15631
                    if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
15632
                        WOLFSSL_ERROR(ssl->error);
15633
                        return WOLFSSL_FATAL_ERROR;
15634
                    }
15635
                }
15636
#endif /* WOLFSSL_DTLS13 */
15637
0
            }
15638
15639
0
            ssl->options.acceptState = TLS13_ACCEPT_FINISHED_DONE;
15640
0
            WOLFSSL_MSG("accept state ACCEPT_FINISHED_DONE");
15641
0
            FALL_THROUGH;
15642
15643
0
        case TLS13_ACCEPT_FINISHED_DONE :
15644
            /* SERVER: When not resuming and verifying peer but no certificate
15645
             * received and not failing when not received then peer auth good.
15646
             */
15647
0
            if (!ssl->options.resuming && ssl->options.verifyPeer &&
15648
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
15649
                !ssl->options.verifyPostHandshake &&
15650
        #endif
15651
0
                !ssl->options.havePeerCert && !ssl->options.failNoCert) {
15652
0
                ssl->options.peerAuthGood = 1;
15653
0
            }
15654
            /* SERVER: check peer authentication. */
15655
0
            if (!ssl->options.peerAuthGood) {
15656
0
                WOLFSSL_MSG("Client authentication did not happen");
15657
0
                return WOLFSSL_FATAL_ERROR;
15658
0
            }
15659
0
#ifdef HAVE_SESSION_TICKET
15660
0
            while (ssl->options.ticketsSent < ssl->options.maxTicketTls13) {
15661
0
                if (!ssl->options.noTicketTls13 && ssl->ctx->ticketEncCb
15662
0
                        != NULL) {
15663
0
                    if ((ssl->error = SendTls13NewSessionTicket(ssl)) != 0) {
15664
0
                        WOLFSSL_ERROR(ssl->error);
15665
0
                        return WOLFSSL_FATAL_ERROR;
15666
0
                    }
15667
0
                }
15668
0
                ssl->options.ticketsSent++;
15669
15670
                /* only one session ticket is sent on session resumption */
15671
0
                if (ssl->options.resuming) {
15672
0
                    break;
15673
0
                }
15674
0
            }
15675
0
#endif /* HAVE_SESSION_TICKET */
15676
0
            ssl->options.acceptState = TLS13_TICKET_SENT;
15677
0
            WOLFSSL_MSG("accept state TICKET_SENT");
15678
0
            FALL_THROUGH;
15679
15680
0
        case TLS13_TICKET_SENT :
15681
0
#ifndef NO_HANDSHAKE_DONE_CB
15682
0
            if (ssl->hsDoneCb) {
15683
0
                int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
15684
0
                if (cbret < 0) {
15685
0
                    ssl->error = cbret;
15686
0
                    WOLFSSL_MSG("HandShake Done Cb don't continue error");
15687
0
                    return WOLFSSL_FATAL_ERROR;
15688
0
                }
15689
0
            }
15690
0
#endif /* NO_HANDSHAKE_DONE_CB */
15691
15692
0
            if (!ssl->options.keepResources) {
15693
0
                FreeHandshakeResources(ssl);
15694
0
            }
15695
15696
0
#if defined(WOLFSSL_ASYNC_IO) && !defined(WOLFSSL_ASYNC_CRYPT)
15697
            /* Free the remaining async context if not using it for crypto */
15698
0
            FreeAsyncCtx(ssl, 1);
15699
0
#endif
15700
15701
0
            ssl->error = 0; /* clear the error */
15702
15703
0
            WOLFSSL_LEAVE("wolfSSL_accept", WOLFSSL_SUCCESS);
15704
0
            return WOLFSSL_SUCCESS;
15705
15706
0
        default:
15707
0
            WOLFSSL_MSG("Unknown accept state ERROR");
15708
0
            return WOLFSSL_FATAL_ERROR;
15709
0
    }
15710
0
}
15711
#endif
15712
15713
#if !defined(NO_WOLFSSL_SERVER) && defined(HAVE_SESSION_TICKET)
15714
/* Server sends a session ticket to the peer.
15715
 *
15716
 * RFC 8446, section 4.6.1, para 1.
15717
 *
15718
 * ssl  The SSL/TLS object.
15719
 * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
15720
 *         SIDE_ERROR when not a server,
15721
 *         NOT_READY_ERROR when handshake not complete,
15722
 *         WOLFSSL_FATAL_ERROR when creating or sending message fails, and
15723
 *         WOLFSSL_SUCCESS on success.
15724
 */
15725
int wolfSSL_send_SessionTicket(WOLFSSL* ssl)
15726
0
{
15727
0
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
15728
0
        return BAD_FUNC_ARG;
15729
0
    if (ssl->options.side == WOLFSSL_CLIENT_END)
15730
0
        return SIDE_ERROR;
15731
0
    if (ssl->options.handShakeState != HANDSHAKE_DONE)
15732
0
        return NOT_READY_ERROR;
15733
15734
0
    if ((ssl->error = SendTls13NewSessionTicket(ssl)) != 0) {
15735
0
        WOLFSSL_ERROR(ssl->error);
15736
0
        return WOLFSSL_FATAL_ERROR;
15737
0
    }
15738
0
    ssl->options.ticketsSent++;
15739
15740
0
    return WOLFSSL_SUCCESS;
15741
0
}
15742
#endif
15743
15744
#ifdef WOLFSSL_EARLY_DATA
15745
/* Sets the maximum amount of early data that can be seen by server when using
15746
 * session tickets for resumption.
15747
 * A value of zero indicates no early data is to be sent by client using session
15748
 * tickets.
15749
 *
15750
 * The default value is zero: per RFC 8446 Appendix E.5, TLS implementations
15751
 * "MUST NOT enable 0-RTT (either sending or accepting) unless specifically
15752
 * requested by the application." Servers must explicitly opt in by calling
15753
 * this function (or the per-SSL equivalent) with a non-zero value.
15754
 *
15755
 * ctx  The SSL/TLS CTX object.
15756
 * sz   Maximum size of the early data.
15757
 * returns BAD_FUNC_ARG when ctx is NULL, SIDE_ERROR when not a server and
15758
 * 0 on success.
15759
 */
15760
int wolfSSL_CTX_set_max_early_data(WOLFSSL_CTX* ctx, unsigned int sz)
15761
{
15762
    if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version))
15763
        return BAD_FUNC_ARG;
15764
    if (ctx->method->side == WOLFSSL_CLIENT_END)
15765
        return SIDE_ERROR;
15766
15767
    ctx->maxEarlyDataSz = sz;
15768
15769
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_ERROR_CODE_OPENSSL)
15770
    /* 1 on success in OpenSSL*/
15771
    return WOLFSSL_SUCCESS;
15772
#else
15773
    return 0;
15774
#endif
15775
}
15776
15777
/* Sets the maximum amount of early data that a client or server would like
15778
 * to exchange. Servers will advertise this value in session tickets sent
15779
 * to a client.
15780
 * A value of zero indicates no early data will be sent by a client, or
15781
 * no early data is accepted by a server (and announced as such in send out
15782
 * session tickets).
15783
 *
15784
 * ssl  The SSL/TLS object.
15785
 * sz   Maximum size of the early data.
15786
 * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
15787
 * and 0 on success.
15788
 */
15789
int wolfSSL_set_max_early_data(WOLFSSL* ssl, unsigned int sz)
15790
{
15791
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
15792
        return BAD_FUNC_ARG;
15793
15794
    ssl->options.maxEarlyDataSz = sz;
15795
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_ERROR_CODE_OPENSSL)
15796
    /* 1 on success in OpenSSL*/
15797
    return WOLFSSL_SUCCESS;
15798
#else
15799
    return 0;
15800
#endif
15801
}
15802
15803
/* Gets the maximum amount of early data that can be seen by server when using
15804
 * session tickets for resumption.
15805
 * A value of zero indicates no early data is to be sent by client using session
15806
 * tickets.
15807
 *
15808
 * ctx  The SSL/TLS CTX object.
15809
 * returns BAD_FUNC_ARG when ctx is NULL, SIDE_ERROR when not a server and
15810
 * returns the maximum amount of early data to be set
15811
 */
15812
int wolfSSL_CTX_get_max_early_data(WOLFSSL_CTX* ctx)
15813
{
15814
    if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version))
15815
        return BAD_FUNC_ARG;
15816
    if (ctx->method->side == WOLFSSL_CLIENT_END)
15817
        return SIDE_ERROR;
15818
15819
    return ctx->maxEarlyDataSz;
15820
}
15821
15822
/* Gets the maximum amount of early data that can be seen by server when using
15823
 * session tickets for resumption.
15824
 * A value of zero indicates no early data is to be sent by client using session
15825
 * tickets.
15826
 *
15827
 * ssl  The SSL/TLS object.
15828
 * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
15829
 * SIDE_ERROR when not a server and
15830
 * returns the maximum amount of early data to be set
15831
 */
15832
int wolfSSL_get_max_early_data(WOLFSSL* ssl)
15833
{
15834
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
15835
        return BAD_FUNC_ARG;
15836
15837
    return ssl->options.maxEarlyDataSz;
15838
}
15839
15840
/* Write early data to the server.
15841
 *
15842
 * ssl    The SSL/TLS object.
15843
 * data   Early data to write
15844
 * sz     The size of the early data in bytes.
15845
 * outSz  The number of early data bytes written.
15846
 * returns BAD_FUNC_ARG when: ssl, data or outSz is NULL; sz is negative;
15847
 * or not using TLS v1.3. SIDE ERROR when not a server. BAD_STATE_E if invoked
15848
 * without a valid session or without a valid PSK CB.
15849
 * Otherwise the number of early data bytes written.
15850
 */
15851
int wolfSSL_write_early_data(WOLFSSL* ssl, const void* data, int sz, int* outSz)
15852
{
15853
    int ret = 0;
15854
15855
    WOLFSSL_ENTER("wolfSSL_write_early_data");
15856
15857
    if (ssl == NULL || data == NULL || sz < 0 || outSz == NULL)
15858
        return BAD_FUNC_ARG;
15859
    if (!IsAtLeastTLSv1_3(ssl->version))
15860
        return BAD_FUNC_ARG;
15861
15862
    *outSz = 0;
15863
15864
#ifndef NO_WOLFSSL_CLIENT
15865
    if (ssl->options.side == WOLFSSL_SERVER_END)
15866
        return SIDE_ERROR;
15867
15868
    /* Early data requires PSK or session resumption */
15869
    if (!EarlyDataPossible(ssl)) {
15870
        return BAD_STATE_E;
15871
    }
15872
15873
    if (ssl->options.handShakeState == NULL_STATE) {
15874
        /* avoid re-setting ssl->earlyData if we re-enter the function because
15875
         * of WC_PENDING_E, WANT_WRITE or WANT_READ */
15876
        if (ssl->error == 0)
15877
            ssl->earlyData = expecting_early_data;
15878
        ret = wolfSSL_connect_TLSv13(ssl);
15879
        if (ret != WOLFSSL_SUCCESS)
15880
            return WOLFSSL_FATAL_ERROR;
15881
        /* on client side, status is set to rejected        */
15882
        /* until sever accepts the early data extension.    */
15883
        ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_REJECTED;
15884
    }
15885
    if (ssl->options.handShakeState == CLIENT_HELLO_COMPLETE) {
15886
#ifdef OPENSSL_EXTRA
15887
        /* when processed early data exceeds max size */
15888
        if (ssl->session->maxEarlyDataSz > 0 &&
15889
            (ssl->earlyDataSz + sz > ssl->session->maxEarlyDataSz)) {
15890
            ssl->error = TOO_MUCH_EARLY_DATA;
15891
            return WOLFSSL_FATAL_ERROR;
15892
        }
15893
#endif
15894
        ret = SendData(ssl, data, sz);
15895
        if (ret > 0) {
15896
            *outSz = ret;
15897
            /* store amount of processed early data from client */
15898
            ssl->earlyDataSz += ret;
15899
        }
15900
    }
15901
#else
15902
    return SIDE_ERROR;
15903
#endif
15904
15905
    WOLFSSL_LEAVE("wolfSSL_write_early_data", ret);
15906
15907
    if (ret < 0)
15908
        ret = WOLFSSL_FATAL_ERROR;
15909
    return ret;
15910
}
15911
15912
/* Read the any early data from the client.
15913
 *
15914
 * ssl    The SSL/TLS object.
15915
 * data   Buffer to put the early data into.
15916
 * sz     The size of the buffer in bytes.
15917
 * outSz  The number of early data bytes read.
15918
 * returns BAD_FUNC_ARG when: ssl, data or outSz is NULL; sz is negative;
15919
 * or not using TLS v1.3. SIDE ERROR when not a server. Otherwise the number of
15920
 * early data bytes read.
15921
 */
15922
int wolfSSL_read_early_data(WOLFSSL* ssl, void* data, int sz, int* outSz)
15923
{
15924
    int ret = 0;
15925
15926
    WOLFSSL_ENTER("wolfSSL_read_early_data");
15927
15928
15929
    if (ssl == NULL || data == NULL || sz < 0 || outSz == NULL)
15930
        return BAD_FUNC_ARG;
15931
    if (!IsAtLeastTLSv1_3(ssl->version))
15932
        return BAD_FUNC_ARG;
15933
15934
    *outSz = 0;
15935
#ifndef NO_WOLFSSL_SERVER
15936
    if (ssl->options.side == WOLFSSL_CLIENT_END)
15937
        return SIDE_ERROR;
15938
15939
    if (ssl->options.handShakeState == NULL_STATE) {
15940
        /* the server flight can return WANT_WRITE and we re-enter here after
15941
         * setting ssl->earlyData = process_early_data, set earlyData to
15942
         * expecting_early_data just once */
15943
        if (ssl->earlyData < expecting_early_data)
15944
            ssl->earlyData = expecting_early_data;
15945
        /* this used to be: ret = wolfSSL_accept_TLSv13(ssl);
15946
         * However, wolfSSL_accept_TLSv13() expects a certificate to
15947
         * be installed already, which is not the case in servers
15948
         * such as HAProxy. They do it after inspecting the ClientHello.
15949
         * The common wolfssl_accept() allows that. */
15950
        ret = wolfSSL_accept(ssl);
15951
        if (ret <= 0)
15952
            return WOLFSSL_FATAL_ERROR;
15953
    }
15954
    if (ssl->options.handShakeState == SERVER_FINISHED_COMPLETE) {
15955
        ssl->options.clientInEarlyData = 1;
15956
        ret = ReceiveData(ssl, (byte*)data, (size_t)sz, FALSE);
15957
        ssl->options.clientInEarlyData = 0;
15958
        if (ret > 0)
15959
            *outSz = ret;
15960
        if (ssl->error == WC_NO_ERR_TRACE(APP_DATA_READY)) {
15961
            ret = 0;
15962
            ssl->error = WOLFSSL_ERROR_NONE;
15963
#ifdef WOLFSSL_DTLS13
15964
            if (ssl->options.dtls) {
15965
                ret = Dtls13DoScheduledWork(ssl);
15966
                if (ret  < 0) {
15967
                    ssl->error = ret;
15968
                    WOLFSSL_ERROR(ssl->error);
15969
                    return WOLFSSL_FATAL_ERROR;
15970
                }
15971
            }
15972
#endif /* WOLFSSL_DTLS13 */
15973
        }
15974
    }
15975
#ifdef WOLFSSL_DTLS13
15976
    else if (ssl->buffers.outputBuffer.length > 0 &&
15977
        ssl->options.dtls && ssl->dtls13SendingAckOrRtx) {
15978
        ret = SendBuffered(ssl);
15979
        if (ret == 0) {
15980
            ssl->dtls13SendingAckOrRtx = 0;
15981
        }
15982
        else {
15983
            ssl->error = ret;
15984
            WOLFSSL_ERROR(ssl->error);
15985
            return WOLFSSL_FATAL_ERROR;
15986
        }
15987
    }
15988
#endif /* WOLFSSL_DTLS13 */
15989
    else
15990
        ret = 0;
15991
#else
15992
    return SIDE_ERROR;
15993
#endif
15994
15995
    WOLFSSL_LEAVE("wolfSSL_read_early_data", ret);
15996
15997
    if (ret < 0)
15998
        ret = WOLFSSL_FATAL_ERROR;
15999
    return ret;
16000
}
16001
16002
/* Returns early data status
16003
 *
16004
 * ssl    The SSL/TLS object.
16005
 * returns WOLFSSL_EARLY_DATA_ACCEPTED if the data was accepted
16006
 *         WOLFSSL_EARLY_DATA_REJECTED if the data was rejected
16007
 *         WOLFSSL_EARLY_DATA_NOT_SENT if no early data was sent
16008
 */
16009
int wolfSSL_get_early_data_status(const WOLFSSL* ssl)
16010
{
16011
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
16012
        return BAD_FUNC_ARG;
16013
16014
    return ssl->earlyDataStatus;
16015
}
16016
#endif
16017
16018
#ifdef HAVE_SECRET_CALLBACK
16019
int wolfSSL_set_tls13_secret_cb(WOLFSSL* ssl, Tls13SecretCb cb, void* ctx)
16020
{
16021
    WOLFSSL_ENTER("wolfSSL_set_tls13_secret_cb");
16022
    if (ssl == NULL)
16023
        return WOLFSSL_FATAL_ERROR;
16024
16025
    ssl->tls13SecretCb = cb;
16026
    ssl->tls13SecretCtx = ctx;
16027
16028
    return WOLFSSL_SUCCESS;
16029
}
16030
16031
#if defined(SHOW_SECRETS) && defined(WOLFSSL_SSLKEYLOGFILE)
16032
int tls13ShowSecrets(WOLFSSL* ssl, int id, const unsigned char* secret,
16033
    int secretSz, void* ctx)
16034
{
16035
    int i;
16036
    const char* str = NULL;
16037
    byte clientRandom[RAN_LEN];
16038
    int clientRandomSz;
16039
    XFILE fp;
16040
16041
    (void) ctx;
16042
#ifdef WOLFSSL_SSLKEYLOGFILE_OUTPUT
16043
    fp = XFOPEN(WOLFSSL_SSLKEYLOGFILE_OUTPUT, "ab");
16044
    if (fp == XBADFILE) {
16045
        return BAD_FUNC_ARG;
16046
    }
16047
#else
16048
    fp = stderr;
16049
#endif
16050
16051
    clientRandomSz = (int)wolfSSL_get_client_random(ssl, clientRandom,
16052
        sizeof(clientRandom));
16053
16054
    if (clientRandomSz <= 0) {
16055
        printf("Error getting server random %d\n", clientRandomSz);
16056
        return BAD_FUNC_ARG;
16057
    }
16058
16059
#if 0
16060
    printf("TLS Server Secret CB: Rand %d, Secret %d\n",
16061
        serverRandomSz, secretSz);
16062
#endif
16063
16064
    switch (id) {
16065
        case CLIENT_EARLY_TRAFFIC_SECRET:
16066
            str = "CLIENT_EARLY_TRAFFIC_SECRET"; break;
16067
        case EARLY_EXPORTER_SECRET:
16068
            str = "EARLY_EXPORTER_SECRET"; break;
16069
        case CLIENT_HANDSHAKE_TRAFFIC_SECRET:
16070
            str = "CLIENT_HANDSHAKE_TRAFFIC_SECRET"; break;
16071
        case SERVER_HANDSHAKE_TRAFFIC_SECRET:
16072
            str = "SERVER_HANDSHAKE_TRAFFIC_SECRET"; break;
16073
        case CLIENT_TRAFFIC_SECRET:
16074
            str = "CLIENT_TRAFFIC_SECRET_0"; break;
16075
        case SERVER_TRAFFIC_SECRET:
16076
            str = "SERVER_TRAFFIC_SECRET_0"; break;
16077
        case EXPORTER_SECRET:
16078
            str = "EXPORTER_SECRET"; break;
16079
        default:
16080
#ifdef WOLFSSL_SSLKEYLOGFILE_OUTPUT
16081
            XFCLOSE(fp);
16082
#endif
16083
            return BAD_FUNC_ARG;
16084
            break;
16085
    }
16086
16087
    fprintf(fp, "%s ", str);
16088
    for (i = 0; i < (int)clientRandomSz; i++) {
16089
        fprintf(fp, "%02x", clientRandom[i]);
16090
    }
16091
    fprintf(fp, " ");
16092
    for (i = 0; i < secretSz; i++) {
16093
        fprintf(fp, "%02x", secret[i]);
16094
    }
16095
    fprintf(fp, "\n");
16096
16097
#ifdef WOLFSSL_SSLKEYLOGFILE_OUTPUT
16098
    XFCLOSE(fp);
16099
#endif
16100
16101
    return 0;
16102
}
16103
#endif
16104
#endif
16105
16106
#undef ERROR_OUT
16107
16108
#endif /* !WOLFCRYPT_ONLY */
16109
16110
#endif /* !NO_TLS && WOLFSSL_TLS13 */