Coverage Report

Created: 2026-02-14 07:18

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wolfssl-fastmath/src/tls13.c
Line
Count
Source
1
/* tls13.c
2
 *
3
 * Copyright (C) 2006-2025 wolfSSL Inc.
4
 *
5
 * This file is part of wolfSSL.
6
 *
7
 * wolfSSL is free software; you can redistribute it and/or modify
8
 * it under the terms of the GNU General Public License as published by
9
 * the Free Software Foundation; either version 3 of the License, or
10
 * (at your option) any later version.
11
 *
12
 * wolfSSL is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU General Public License
18
 * along with this program; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
20
 */
21
22
#include <wolfssl/wolfcrypt/libwolfssl_sources.h>
23
24
/*
25
 * BUILD_GCM
26
 *    Enables AES-GCM ciphersuites.
27
 * HAVE_AESCCM
28
 *    Enables AES-CCM ciphersuites.
29
 * HAVE_SESSION_TICKET
30
 *    Enables session tickets - required for TLS 1.3 resumption.
31
 * NO_PSK
32
 *    Do not enable Pre-Shared Keys.
33
 * HAVE_KEYING_MATERIAL
34
 *    Enables exporting keying material based on section 7.5 of RFC 8446.
35
 * WOLFSSL_ASYNC_CRYPT
36
 *    Enables the use of asynchronous cryptographic operations.
37
 *    This is available for ciphers and certificates.
38
 * HAVE_CHACHA && HAVE_POLY1305
39
 *    Enables use of CHACHA20-POLY1305 ciphersuites.
40
 * WOLFSSL_DEBUG_TLS
41
 *    Writes out details of TLS 1.3 protocol including handshake message buffers
42
 *    and key generation input and output.
43
 * WOLFSSL_EARLY_DATA
44
 *    Allow 0-RTT Handshake using Early Data extensions and handshake message
45
 * WOLFSSL_EARLY_DATA_GROUP
46
 *    Group EarlyData message with ClientHello when sending
47
 * WOLFSSL_NO_SERVER_GROUPS_EXT
48
 *    Do not send the server's groups in an extension when the server's top
49
 *    preference is not in client's list.
50
 * WOLFSSL_POST_HANDSHAKE_AUTH
51
 *    Allow TLS v1.3 code to perform post-handshake authentication of the
52
 *    client.
53
 * WOLFSSL_SEND_HRR_COOKIE
54
 *    Send a cookie in hello_retry_request message to enable stateless tracking
55
 *    of ClientHello replies.
56
 * WOLFSSL_TLS13
57
 *    Enable TLS 1.3 protocol implementation.
58
 * WOLFSSL_TLS13_MIDDLEBOX_COMPAT
59
 *    Enable middlebox compatibility in the TLS 1.3 handshake.
60
 *    This includes sending ChangeCipherSpec before encrypted messages and
61
 *    including a session id.
62
 * WOLFSSL_TLS13_SHA512
63
 *    Allow generation of SHA-512 digests in handshake - no ciphersuite
64
 *    requires SHA-512 at this time.
65
 * WOLFSSL_TLS13_TICKET_BEFORE_FINISHED
66
 *    Allow a NewSessionTicket message to be sent by server before Client's
67
 *    Finished message.
68
 *    See TLS v1.3 specification, Section 4.6.1, Paragraph 4 (Note).
69
 * WOLFSSL_PSK_ONE_ID
70
 *    When only one PSK ID is used and only one call to the PSK callback can
71
 *    be made per connect.
72
 *    You cannot use wc_psk_client_cs_callback type callback on client.
73
 * WOLFSSL_PRIORITIZE_PSK
74
 *    During a handshake, prioritize PSK order instead of ciphersuite order.
75
 * WOLFSSL_CHECK_ALERT_ON_ERR
76
 *    Check for alerts during the handshake in the event of an error.
77
 * WOLFSSL_NO_CLIENT_CERT_ERROR
78
 *    Requires client to set a client certificate
79
 * WOLFSSL_PSK_MULTI_ID_PER_CS
80
 *    When multiple PSK identities are available for the same cipher suite.
81
 *    Sets the first byte of the client identity to the count of identities
82
 *    that have been seen so far for the cipher suite.
83
 * WOLFSSL_CHECK_SIG_FAULTS
84
 *    Verifies the ECC signature after signing in case of faults in the
85
 *    calculation of the signature. Useful when signature fault injection is a
86
 *    possible attack.
87
 * WOLFSSL_32BIT_MILLI_TIME
88
 *    Function TimeNowInMilliseconds() returns an unsigned 32-bit value.
89
 *    Default behavior is to return a signed 64-bit value.
90
 */
91
92
#if !defined(NO_TLS) && defined(WOLFSSL_TLS13)
93
94
#ifndef WOLFCRYPT_ONLY
95
96
#ifdef HAVE_ERRNO_H
97
    #include <errno.h>
98
#endif
99
100
#if defined(__MACH__) || defined(__FreeBSD__) || \
101
    defined(__INCLUDE_NUTTX_CONFIG_H) || defined(WOLFSSL_RIOT_OS)
102
#include <sys/time.h>
103
#endif /* __MACH__ || __FreeBSD__ ||
104
          __INCLUDE_NUTTX_CONFIG_H || WOLFSSL_RIOT_OS */
105
106
107
#include <wolfssl/internal.h>
108
#include <wolfssl/error-ssl.h>
109
#include <wolfssl/wolfcrypt/asn.h>
110
#include <wolfssl/wolfcrypt/dh.h>
111
#include <wolfssl/wolfcrypt/kdf.h>
112
#include <wolfssl/wolfcrypt/signature.h>
113
#ifdef NO_INLINE
114
    #include <wolfssl/wolfcrypt/misc.h>
115
#else
116
    #define WOLFSSL_MISC_INCLUDED
117
    #include <wolfcrypt/src/misc.c>
118
#endif
119
120
#ifdef __sun
121
    #include <sys/filio.h>
122
#endif
123
124
#ifndef TRUE
125
    #define TRUE  1
126
#endif
127
#ifndef FALSE
128
    #define FALSE 0
129
#endif
130
131
#ifndef HAVE_AEAD
132
    #ifndef _MSC_VER
133
        #error "The build option HAVE_AEAD is required for TLS 1.3"
134
    #else
135
        #pragma \
136
        message("error: The build option HAVE_AEAD is required for TLS 1.3")
137
    #endif
138
#endif
139
140
#ifndef HAVE_HKDF
141
    #ifndef _MSC_VER
142
        #error "The build option HAVE_HKDF is required for TLS 1.3"
143
    #else
144
        #pragma message("error: The build option HAVE_HKDF is required for TLS 1.3")
145
    #endif
146
#endif
147
148
#ifndef HAVE_TLS_EXTENSIONS
149
    #ifndef _MSC_VER
150
        #error "The build option HAVE_TLS_EXTENSIONS is required for TLS 1.3"
151
    #else
152
        #pragma message("error: The build option HAVE_TLS_EXTENSIONS is required for TLS 1.3")
153
    #endif
154
#endif
155
156
157
/* Set ret to error value and jump to label.
158
 *
159
 * err     The error value to set.
160
 * eLabel  The label to jump to.
161
 */
162
0
#define ERROR_OUT(err, eLabel) { ret = (err); goto eLabel; }
163
164
/* Size of the TLS v1.3 label use when deriving keys. */
165
0
#define TLS13_PROTOCOL_LABEL_SZ    6
166
/* The protocol label for TLS v1.3. */
167
static const byte tls13ProtocolLabel[TLS13_PROTOCOL_LABEL_SZ + 1] = "tls13 ";
168
169
#ifdef WOLFSSL_DTLS13
170
#define DTLS13_PROTOCOL_LABEL_SZ    6
171
static const byte dtls13ProtocolLabel[DTLS13_PROTOCOL_LABEL_SZ + 1] = "dtls13";
172
#endif /* WOLFSSL_DTLS13 */
173
174
#if defined(HAVE_ECH)
175
#define ECH_ACCEPT_CONFIRMATION_LABEL_SZ 23
176
#define ECH_HRR_ACCEPT_CONFIRMATION_LABEL_SZ 27
177
static const byte
178
    echAcceptConfirmationLabel[ECH_ACCEPT_CONFIRMATION_LABEL_SZ + 1] =
179
    "ech accept confirmation";
180
static const byte
181
    echHrrAcceptConfirmationLabel[ECH_HRR_ACCEPT_CONFIRMATION_LABEL_SZ + 1] =
182
    "hrr ech accept confirmation";
183
#endif
184
185
#ifndef NO_CERTS
186
#if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
187
    defined(HAVE_ED448) || defined(HAVE_FALCON) || defined(HAVE_DILITHIUM)
188
189
static WC_INLINE int GetMsgHash(WOLFSSL* ssl, byte* hash);
190
191
#endif
192
#endif
193
194
/* Expand data using HMAC, salt and label and info.
195
 * TLS v1.3 defines this function. Use callback if available. */
196
static int Tls13HKDFExpandLabel(WOLFSSL* ssl, byte* okm, word32 okmLen,
197
                                const byte* prk, word32 prkLen,
198
                                const byte* protocol, word32 protocolLen,
199
                                const byte* label, word32 labelLen,
200
                                const byte* info, word32 infoLen,
201
                                int digest)
202
3.81k
{
203
3.81k
    int ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN);
204
205
#if defined(HAVE_PK_CALLBACKS)
206
    if (ssl->ctx && ssl->ctx->HKDFExpandLabelCb) {
207
        ret = ssl->ctx->HKDFExpandLabelCb(okm, okmLen, prk, prkLen,
208
                                          protocol, protocolLen,
209
                                          label, labelLen,
210
                                          info, infoLen, digest,
211
                                          WOLFSSL_CLIENT_END /* ignored */);
212
    }
213
214
    if (ret != WC_NO_ERR_TRACE(NOT_COMPILED_IN))
215
        return ret;
216
#endif
217
3.81k
    (void)ssl;
218
3.81k
    PRIVATE_KEY_UNLOCK();
219
3.81k
#if !defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(6,0))
220
3.81k
    ret = wc_Tls13_HKDF_Expand_Label_ex(okm, okmLen, prk, prkLen,
221
3.81k
                                     protocol, protocolLen,
222
3.81k
                                     label, labelLen,
223
3.81k
                                     info, infoLen, digest,
224
3.81k
                                     ssl->heap, ssl->devId);
225
#else
226
    ret = wc_Tls13_HKDF_Expand_Label(okm, okmLen, prk, prkLen,
227
                                     protocol, protocolLen,
228
                                     label, labelLen,
229
                                     info, infoLen, digest);
230
#endif
231
3.81k
    PRIVATE_KEY_LOCK();
232
3.81k
    return ret;
233
3.81k
}
234
235
/* Same as above, but pass in the side we are expanding for:
236
 * side: either WOLFSSL_CLIENT_END or WOLFSSL_SERVER_END.
237
 */
238
static int Tls13HKDFExpandKeyLabel(WOLFSSL* ssl, byte* okm, word32 okmLen,
239
                                   const byte* prk, word32 prkLen,
240
                                   const byte* protocol, word32 protocolLen,
241
                                   const byte* label, word32 labelLen,
242
                                   const byte* info, word32 infoLen,
243
                                   int digest, int side)
244
8.73k
{
245
8.73k
    int ret;
246
#if defined(HAVE_PK_CALLBACKS)
247
    ret = NOT_COMPILED_IN;
248
    if (ssl->ctx && ssl->ctx->HKDFExpandLabelCb) {
249
        ret = ssl->ctx->HKDFExpandLabelCb(okm, okmLen, prk, prkLen,
250
                                         protocol, protocolLen,
251
                                         label, labelLen,
252
                                         info, infoLen,
253
                                         digest, side);
254
    }
255
    if (ret != WC_NO_ERR_TRACE(NOT_COMPILED_IN))
256
        return ret;
257
#endif
258
259
8.73k
#if !defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(6,0))
260
8.73k
    ret = wc_Tls13_HKDF_Expand_Label_ex(okm, okmLen, prk, prkLen,
261
8.73k
                                      protocol, protocolLen,
262
8.73k
                                      label, labelLen,
263
8.73k
                                      info, infoLen, digest,
264
8.73k
                                      ssl->heap, ssl->devId);
265
266
#elif defined(HAVE_FIPS) && defined(wc_Tls13_HKDF_Expand_Label)
267
    ret = wc_Tls13_HKDF_Expand_Label_fips(okm, okmLen, prk, prkLen,
268
                                      protocol, protocolLen,
269
                                      label, labelLen,
270
                                      info, infoLen, digest);
271
#else
272
    ret = wc_Tls13_HKDF_Expand_Label(okm, okmLen, prk, prkLen,
273
                                      protocol, protocolLen,
274
                                      label, labelLen,
275
                                      info, infoLen, digest);
276
#endif
277
8.73k
    (void)ssl;
278
8.73k
    (void)side;
279
8.73k
    return ret;
280
8.73k
}
281
282
283
/* Derive a key from a message.
284
 *
285
 * ssl        The SSL/TLS object.
286
 * output     The buffer to hold the derived key.
287
 * outputLen  The length of the derived key.
288
 * secret     The secret used to derive the key (HMAC secret).
289
 * label      The label used to distinguish the context.
290
 * labelLen   The length of the label.
291
 * msg        The message data to derive key from.
292
 * msgLen     The length of the message data to derive key from.
293
 * hashAlgo   The hash algorithm to use in the HMAC.
294
 * returns 0 on success, otherwise failure.
295
 */
296
static int DeriveKeyMsg(WOLFSSL* ssl, byte* output, int outputLen,
297
                        const byte* secret, const byte* label, word32 labelLen,
298
                        byte* msg, int msgLen, int hashAlgo)
299
{
300
    byte        hash[WC_MAX_DIGEST_SIZE];
301
    Digest      digest;
302
    word32      hashSz = 0;
303
    const byte* protocol;
304
    word32      protocolLen;
305
    int         digestAlg = -1;
306
    int         ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
307
308
    switch (hashAlgo) {
309
#ifndef NO_SHA256
310
        case sha256_mac:
311
            ret = wc_InitSha256_ex(&digest.sha256, ssl->heap, ssl->devId);
312
            if (ret == 0) {
313
                    ret = wc_Sha256Update(&digest.sha256, msg, (word32)msgLen);
314
                if (ret == 0)
315
                    ret = wc_Sha256Final(&digest.sha256, hash);
316
                wc_Sha256Free(&digest.sha256);
317
            }
318
            hashSz = WC_SHA256_DIGEST_SIZE;
319
            digestAlg = WC_SHA256;
320
            break;
321
#endif
322
#ifdef WOLFSSL_SHA384
323
        case sha384_mac:
324
            ret = wc_InitSha384_ex(&digest.sha384, ssl->heap, ssl->devId);
325
            if (ret == 0) {
326
                ret = wc_Sha384Update(&digest.sha384, msg, (word32)msgLen);
327
                if (ret == 0)
328
                    ret = wc_Sha384Final(&digest.sha384, hash);
329
                wc_Sha384Free(&digest.sha384);
330
            }
331
            hashSz = WC_SHA384_DIGEST_SIZE;
332
            digestAlg = WC_SHA384;
333
            break;
334
#endif
335
#ifdef WOLFSSL_TLS13_SHA512
336
        case sha512_mac:
337
            ret = wc_InitSha512_ex(&digest.sha512, ssl->heap, ssl->devId);
338
            if (ret == 0) {
339
                ret = wc_Sha512Update(&digest.sha512, msg, (word32)msgLen);
340
                if (ret == 0)
341
                    ret = wc_Sha512Final(&digest.sha512, hash);
342
                wc_Sha512Free(&digest.sha512);
343
            }
344
            hashSz = WC_SHA512_DIGEST_SIZE;
345
            digestAlg = WC_SHA512;
346
            break;
347
#endif
348
#ifdef WOLFSSL_SM3
349
        case sm3_mac:
350
            ret = wc_InitSm3(&digest.sm3, ssl->heap, ssl->devId);
351
            if (ret == 0) {
352
                ret = wc_Sm3Update(&digest.sm3, msg, (word32)msgLen);
353
                if (ret == 0)
354
                    ret = wc_Sm3Final(&digest.sm3, hash);
355
                wc_Sm3Free(&digest.sm3);
356
            }
357
            hashSz = WC_SM3_DIGEST_SIZE;
358
            digestAlg = WC_SM3;
359
            break;
360
#endif
361
        default:
362
            ret = BAD_FUNC_ARG;
363
            digestAlg = -1;
364
            break;
365
    }
366
367
    if (digestAlg < 0)
368
        return HASH_TYPE_E;
369
370
    if (ret != 0)
371
        return ret;
372
373
    switch (ssl->version.minor) {
374
        case TLSv1_3_MINOR:
375
            protocol = tls13ProtocolLabel;
376
            protocolLen = TLS13_PROTOCOL_LABEL_SZ;
377
            break;
378
#ifdef WOLFSSL_DTLS13
379
        case DTLSv1_3_MINOR:
380
            if (!ssl->options.dtls)
381
                return VERSION_ERROR;
382
383
            protocol = dtls13ProtocolLabel;
384
            protocolLen = DTLS13_PROTOCOL_LABEL_SZ;
385
            break;
386
#endif /* WOLFSSL_DTLS13 */
387
        default:
388
            return VERSION_ERROR;
389
    }
390
    if (outputLen == -1)
391
        outputLen = (int)hashSz;
392
393
    ret = Tls13HKDFExpandLabel(ssl, output, (word32)outputLen, secret, hashSz,
394
                               protocol, protocolLen, label, labelLen,
395
                               hash, hashSz, digestAlg);
396
    return ret;
397
}
398
399
/* Derive a key.
400
 *
401
 * ssl          The SSL/TLS object.
402
 * output       The buffer to hold the derived key.
403
 * outputLen    The length of the derived key.
404
 * secret       The secret used to derive the key (HMAC secret).
405
 * label        The label used to distinguish the context.
406
 * labelLen     The length of the label.
407
 * hashAlgo     The hash algorithm to use in the HMAC.
408
 * includeMsgs  Whether to include a hash of the handshake messages so far.
409
 * side         The side that we are deriving the secret for.
410
 * returns 0 on success, otherwise failure.
411
 */
412
int Tls13DeriveKey(WOLFSSL* ssl, byte* output, int outputLen,
413
                   const byte* secret, const byte* label, word32 labelLen,
414
                   int hashAlgo, int includeMsgs, int side)
415
0
{
416
0
    int         ret = 0;
417
0
    byte        hash[WC_MAX_DIGEST_SIZE];
418
0
    word32      hashSz = 0;
419
0
    word32      hashOutSz = 0;
420
0
    const byte* protocol;
421
0
    word32      protocolLen;
422
0
    int         digestAlg = 0;
423
424
425
0
    switch (hashAlgo) {
426
0
    #ifndef NO_SHA256
427
0
        case sha256_mac:
428
0
            hashSz    = WC_SHA256_DIGEST_SIZE;
429
0
            digestAlg = WC_SHA256;
430
0
            if (includeMsgs)
431
0
                ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
432
0
            break;
433
0
    #endif
434
435
0
    #ifdef WOLFSSL_SHA384
436
0
        case sha384_mac:
437
0
            hashSz    = WC_SHA384_DIGEST_SIZE;
438
0
            digestAlg = WC_SHA384;
439
0
            if (includeMsgs)
440
0
                ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
441
0
            break;
442
0
    #endif
443
444
    #ifdef WOLFSSL_TLS13_SHA512
445
        case sha512_mac:
446
            hashSz    = WC_SHA512_DIGEST_SIZE;
447
            digestAlg = WC_SHA512;
448
            if (includeMsgs)
449
                ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512, hash);
450
            break;
451
    #endif
452
453
0
    #ifdef WOLFSSL_SM3
454
0
        case sm3_mac:
455
0
            hashSz    = WC_SM3_DIGEST_SIZE;
456
0
            digestAlg = WC_SM3;
457
0
            if (includeMsgs)
458
0
                ret = wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash);
459
0
            break;
460
0
    #endif
461
462
0
        default:
463
0
            ret = HASH_TYPE_E;
464
0
            break;
465
0
    }
466
0
    if (ret != 0)
467
0
        return ret;
468
469
0
    protocol = tls13ProtocolLabel;
470
0
    protocolLen = TLS13_PROTOCOL_LABEL_SZ;
471
472
#ifdef WOLFSSL_DTLS13
473
    if (ssl->options.dtls) {
474
         protocol = dtls13ProtocolLabel;
475
         protocolLen = DTLS13_PROTOCOL_LABEL_SZ;
476
    }
477
#endif /* WOLFSSL_DTLS13 */
478
479
0
    if (outputLen == -1) {
480
0
        outputLen = (int)hashSz;
481
0
    }
482
0
    if (includeMsgs) {
483
0
        hashOutSz = hashSz;
484
0
    }
485
0
    else {
486
        /* Appease static analyzers by making sure hash is cleared, since it is
487
         * passed into expand key label where older wc_Tls13_HKDF_Expand_Label
488
         * will unconditionally try to call a memcpy on it, however length will
489
         * always be 0. */
490
0
        XMEMSET(hash, 0, sizeof(hash));
491
0
        hashOutSz = 0;
492
0
    }
493
494
0
    PRIVATE_KEY_UNLOCK();
495
0
    ret = Tls13HKDFExpandKeyLabel(ssl, output, (word32)outputLen, secret, hashSz,
496
0
                                  protocol, protocolLen, label, labelLen,
497
0
                                  hash, hashOutSz, digestAlg, side);
498
0
    PRIVATE_KEY_LOCK();
499
500
#ifdef WOLFSSL_CHECK_MEM_ZERO
501
    wc_MemZero_Add("TLS 1.3 derived key", output, outputLen);
502
#endif
503
0
    return ret;
504
0
}
505
506
/* Convert TLS mac ID to a hash algorithm ID
507
 *
508
 * mac Mac ID to convert
509
 * returns hash ID on success, or the NONE type.
510
 */
511
static WC_INLINE int mac2hash(int mac)
512
{
513
    int hash;
514
    switch (mac) {
515
        #ifndef NO_SHA256
516
        case sha256_mac:
517
            hash = WC_SHA256;
518
            break;
519
        #endif
520
521
        #ifdef WOLFSSL_SHA384
522
        case sha384_mac:
523
            hash = WC_SHA384;
524
            break;
525
        #endif
526
527
        #ifdef WOLFSSL_TLS13_SHA512
528
        case sha512_mac:
529
            hash = WC_SHA512;
530
            break;
531
        #endif
532
533
        #ifdef WOLFSSL_SM3
534
        case sm3_mac:
535
            hash = WC_SM3;
536
            break;
537
        #endif
538
539
    default:
540
        hash = WC_HASH_TYPE_NONE;
541
    }
542
    return hash;
543
}
544
545
#ifndef NO_PSK
546
/* The length of the binder key label. */
547
#define BINDER_KEY_LABEL_SZ         10
548
/* The binder key label. */
549
static const byte binderKeyLabel[BINDER_KEY_LABEL_SZ + 1] =
550
    "ext binder";
551
552
/* Derive the binder key.
553
 *
554
 * ssl  The SSL/TLS object.
555
 * key  The derived key.
556
 * returns 0 on success, otherwise failure.
557
 */
558
static int DeriveBinderKey(WOLFSSL* ssl, byte* key)
559
{
560
    WOLFSSL_MSG("Derive Binder Key");
561
    if (ssl == NULL || ssl->arrays == NULL) {
562
        return BAD_FUNC_ARG;
563
    }
564
    return DeriveKeyMsg(ssl, key, -1, ssl->arrays->secret,
565
                        binderKeyLabel, BINDER_KEY_LABEL_SZ,
566
                        NULL, 0, ssl->specs.mac_algorithm);
567
}
568
#endif /* !NO_PSK */
569
570
#if defined(HAVE_SESSION_TICKET) && \
571
    (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER))
572
/* The length of the binder key resume label. */
573
#define BINDER_KEY_RESUME_LABEL_SZ  10
574
/* The binder key resume label. */
575
static const byte binderKeyResumeLabel[BINDER_KEY_RESUME_LABEL_SZ + 1] =
576
    "res binder";
577
578
/* Derive the binder resumption key.
579
 *
580
 * ssl  The SSL/TLS object.
581
 * key  The derived key.
582
 * returns 0 on success, otherwise failure.
583
 */
584
static int DeriveBinderKeyResume(WOLFSSL* ssl, byte* key)
585
{
586
    WOLFSSL_MSG("Derive Binder Key - Resumption");
587
    if (ssl == NULL || ssl->arrays == NULL) {
588
        return BAD_FUNC_ARG;
589
    }
590
    return DeriveKeyMsg(ssl, key, -1, ssl->arrays->secret,
591
                        binderKeyResumeLabel, BINDER_KEY_RESUME_LABEL_SZ,
592
                        NULL, 0, ssl->specs.mac_algorithm);
593
}
594
#endif /* HAVE_SESSION_TICKET && (!NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER) */
595
596
#ifdef WOLFSSL_EARLY_DATA
597
598
/* The length of the early traffic label. */
599
#define EARLY_TRAFFIC_LABEL_SZ      11
600
/* The early traffic label. */
601
static const byte earlyTrafficLabel[EARLY_TRAFFIC_LABEL_SZ + 1] =
602
    "c e traffic";
603
604
/* Derive the early traffic key.
605
 *
606
 * ssl  The SSL/TLS object.
607
 * key  The derived key.
608
 * side The side that we are deriving the secret for.
609
 * returns 0 on success, otherwise failure.
610
 */
611
static int DeriveEarlyTrafficSecret(WOLFSSL* ssl, byte* key, int side)
612
{
613
    int ret;
614
    WOLFSSL_MSG("Derive Early Traffic Secret");
615
    if (ssl == NULL || ssl->arrays == NULL) {
616
        return BAD_FUNC_ARG;
617
    }
618
619
#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
620
    /* If this is called from a sniffer session with keylog file support,
621
     * obtain the appropriate secret from the callback */
622
    if (ssl->snifferSecretCb != NULL) {
623
        return ssl->snifferSecretCb(ssl->arrays->clientRandom,
624
                                    SNIFFER_SECRET_CLIENT_EARLY_TRAFFIC_SECRET,
625
                                    key);
626
    }
627
#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
628
629
    ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->secret,
630
                    earlyTrafficLabel, EARLY_TRAFFIC_LABEL_SZ,
631
                    ssl->specs.mac_algorithm, 1, side);
632
#ifdef HAVE_SECRET_CALLBACK
633
    if (ret == 0 && ssl->tls13SecretCb != NULL) {
634
        ret = ssl->tls13SecretCb(ssl, CLIENT_EARLY_TRAFFIC_SECRET, key,
635
                                 ssl->specs.hash_size, ssl->tls13SecretCtx);
636
        if (ret != 0) {
637
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
638
            return TLS13_SECRET_CB_E;
639
        }
640
    }
641
#ifdef OPENSSL_EXTRA
642
    if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
643
        ret = ssl->tls13KeyLogCb(ssl, CLIENT_EARLY_TRAFFIC_SECRET, key,
644
                                ssl->specs.hash_size, NULL);
645
        if (ret != 0) {
646
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
647
            return TLS13_SECRET_CB_E;
648
        }
649
    }
650
#endif /* OPENSSL_EXTRA */
651
#endif /* HAVE_SECRET_CALLBACK */
652
    return ret;
653
}
654
655
#endif
656
657
/* The length of the client handshake label. */
658
625
#define CLIENT_HANDSHAKE_LABEL_SZ   12
659
/* The client handshake label. */
660
static const byte clientHandshakeLabel[CLIENT_HANDSHAKE_LABEL_SZ + 1] =
661
    "c hs traffic";
662
663
/* Derive the client handshake key.
664
 *
665
 * ssl  The SSL/TLS object.
666
 * key  The derived key.
667
 * returns 0 on success, otherwise failure.
668
 */
669
static int DeriveClientHandshakeSecret(WOLFSSL* ssl, byte* key)
670
625
{
671
625
    int ret;
672
625
    WOLFSSL_MSG("Derive Client Handshake Secret");
673
625
    if (ssl == NULL || ssl->arrays == NULL) {
674
0
        return BAD_FUNC_ARG;
675
0
    }
676
677
#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
678
    /* If this is called from a sniffer session with keylog file support,
679
     * obtain the appropriate secret from the callback */
680
    if (ssl->snifferSecretCb != NULL) {
681
        return ssl->snifferSecretCb(ssl->arrays->clientRandom,
682
                               SNIFFER_SECRET_CLIENT_HANDSHAKE_TRAFFIC_SECRET,
683
                               key);
684
    }
685
#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
686
687
625
    ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->preMasterSecret,
688
625
                    clientHandshakeLabel, CLIENT_HANDSHAKE_LABEL_SZ,
689
625
                    ssl->specs.mac_algorithm, 1, WOLFSSL_CLIENT_END);
690
#ifdef HAVE_SECRET_CALLBACK
691
    if (ret == 0 && ssl->tls13SecretCb != NULL) {
692
        ret = ssl->tls13SecretCb(ssl, CLIENT_HANDSHAKE_TRAFFIC_SECRET, key,
693
                                 ssl->specs.hash_size, ssl->tls13SecretCtx);
694
        if (ret != 0) {
695
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
696
            return TLS13_SECRET_CB_E;
697
        }
698
    }
699
#ifdef OPENSSL_EXTRA
700
    if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
701
        ret = ssl->tls13KeyLogCb(ssl, CLIENT_HANDSHAKE_TRAFFIC_SECRET, key,
702
                                ssl->specs.hash_size, NULL);
703
        if (ret != 0) {
704
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
705
            return TLS13_SECRET_CB_E;
706
        }
707
    }
708
#endif /* OPENSSL_EXTRA */
709
#endif /* HAVE_SECRET_CALLBACK */
710
625
    return ret;
711
625
}
712
713
/* The length of the server handshake label. */
714
618
#define SERVER_HANDSHAKE_LABEL_SZ   12
715
/* The server handshake label. */
716
static const byte serverHandshakeLabel[SERVER_HANDSHAKE_LABEL_SZ + 1] =
717
    "s hs traffic";
718
719
/* Derive the server handshake key.
720
 *
721
 * ssl  The SSL/TLS object.
722
 * key  The derived key.
723
 * returns 0 on success, otherwise failure.
724
 */
725
static int DeriveServerHandshakeSecret(WOLFSSL* ssl, byte* key)
726
618
{
727
618
    int ret;
728
618
    WOLFSSL_MSG("Derive Server Handshake Secret");
729
618
    if (ssl == NULL || ssl->arrays == NULL) {
730
0
        return BAD_FUNC_ARG;
731
0
    }
732
733
#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
734
    /* If this is called from a sniffer session with keylog file support,
735
     * obtain the appropriate secret from the callback */
736
    if (ssl->snifferSecretCb != NULL) {
737
        return ssl->snifferSecretCb(ssl->arrays->clientRandom,
738
                                SNIFFER_SECRET_SERVER_HANDSHAKE_TRAFFIC_SECRET,
739
                                key);
740
    }
741
#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
742
743
618
    ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->preMasterSecret,
744
618
                    serverHandshakeLabel, SERVER_HANDSHAKE_LABEL_SZ,
745
618
                    ssl->specs.mac_algorithm, 1, WOLFSSL_SERVER_END);
746
747
#ifdef HAVE_SECRET_CALLBACK
748
    if (ret == 0 && ssl->tls13SecretCb != NULL) {
749
        ret = ssl->tls13SecretCb(ssl, SERVER_HANDSHAKE_TRAFFIC_SECRET, key,
750
                                 ssl->specs.hash_size, ssl->tls13SecretCtx);
751
        if (ret != 0) {
752
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
753
            return TLS13_SECRET_CB_E;
754
        }
755
    }
756
#ifdef OPENSSL_EXTRA
757
    if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
758
        ret = ssl->tls13KeyLogCb(ssl, SERVER_HANDSHAKE_TRAFFIC_SECRET, key,
759
                                ssl->specs.hash_size, NULL);
760
        if (ret != 0) {
761
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
762
            return TLS13_SECRET_CB_E;
763
        }
764
    }
765
#endif /* OPENSSL_EXTRA */
766
#endif /* HAVE_SECRET_CALLBACK */
767
618
    return ret;
768
618
}
769
770
/* The length of the client application traffic label. */
771
345
#define CLIENT_APP_LABEL_SZ         12
772
/* The client application traffic label. */
773
static const byte clientAppLabel[CLIENT_APP_LABEL_SZ + 1] =
774
    "c ap traffic";
775
776
/* Derive the client application traffic key.
777
 *
778
 * ssl  The SSL/TLS object.
779
 * key  The derived key.
780
 * returns 0 on success, otherwise failure.
781
 */
782
static int DeriveClientTrafficSecret(WOLFSSL* ssl, byte* key)
783
345
{
784
345
    int ret;
785
345
    WOLFSSL_MSG("Derive Client Traffic Secret");
786
345
    if (ssl == NULL || ssl->arrays == NULL) {
787
0
        return BAD_FUNC_ARG;
788
0
    }
789
790
#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
791
    /* If this is called from a sniffer session with keylog file support,
792
     * obtain the appropriate secret from the callback */
793
    if (ssl->snifferSecretCb != NULL) {
794
        return ssl->snifferSecretCb(ssl->arrays->clientRandom,
795
                                    SNIFFER_SECRET_CLIENT_TRAFFIC_SECRET,
796
                                    key);
797
    }
798
#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
799
800
345
    ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->masterSecret,
801
345
                    clientAppLabel, CLIENT_APP_LABEL_SZ,
802
345
                    ssl->specs.mac_algorithm, 1, WOLFSSL_CLIENT_END);
803
804
#ifdef HAVE_SECRET_CALLBACK
805
    if (ret == 0 && ssl->tls13SecretCb != NULL) {
806
        ret = ssl->tls13SecretCb(ssl, CLIENT_TRAFFIC_SECRET, key,
807
                                 ssl->specs.hash_size, ssl->tls13SecretCtx);
808
        if (ret != 0) {
809
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
810
            return TLS13_SECRET_CB_E;
811
        }
812
    }
813
#ifdef OPENSSL_EXTRA
814
    if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
815
        ret = ssl->tls13KeyLogCb(ssl, CLIENT_TRAFFIC_SECRET, key,
816
                                ssl->specs.hash_size, NULL);
817
        if (ret != 0) {
818
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
819
            return TLS13_SECRET_CB_E;
820
        }
821
    }
822
#endif /* OPENSSL_EXTRA */
823
#endif /* HAVE_SECRET_CALLBACK */
824
345
    return ret;
825
345
}
826
827
/* The length of the server application traffic label. */
828
349
#define SERVER_APP_LABEL_SZ         12
829
/* The  server application traffic label. */
830
static const byte serverAppLabel[SERVER_APP_LABEL_SZ + 1] =
831
    "s ap traffic";
832
833
/* Derive the server application traffic key.
834
 *
835
 * ssl  The SSL/TLS object.
836
 * key  The derived key.
837
 * returns 0 on success, otherwise failure.
838
 */
839
static int DeriveServerTrafficSecret(WOLFSSL* ssl, byte* key)
840
349
{
841
349
    int ret;
842
349
    WOLFSSL_MSG("Derive Server Traffic Secret");
843
349
    if (ssl == NULL || ssl->arrays == NULL) {
844
0
        return BAD_FUNC_ARG;
845
0
    }
846
847
#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
848
    /* If this is called from a sniffer session with keylog file support,
849
     * obtain the appropriate secret from the callback */
850
    if (ssl->snifferSecretCb != NULL) {
851
        return ssl->snifferSecretCb(ssl->arrays->clientRandom,
852
                                    SNIFFER_SECRET_SERVER_TRAFFIC_SECRET,
853
                                    key);
854
    }
855
#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
856
857
349
    ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->masterSecret,
858
349
                    serverAppLabel, SERVER_APP_LABEL_SZ,
859
349
                    ssl->specs.mac_algorithm, 1, WOLFSSL_SERVER_END);
860
861
#ifdef HAVE_SECRET_CALLBACK
862
    if (ret == 0 && ssl->tls13SecretCb != NULL) {
863
        ret = ssl->tls13SecretCb(ssl, SERVER_TRAFFIC_SECRET, key,
864
                                 ssl->specs.hash_size, ssl->tls13SecretCtx);
865
        if (ret != 0) {
866
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
867
            return TLS13_SECRET_CB_E;
868
        }
869
    }
870
#ifdef OPENSSL_EXTRA
871
    if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
872
        ret = ssl->tls13KeyLogCb(ssl, SERVER_TRAFFIC_SECRET, key,
873
                                ssl->specs.hash_size, NULL);
874
        if (ret != 0) {
875
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
876
            return TLS13_SECRET_CB_E;
877
        }
878
    }
879
#endif /* OPENSSL_EXTRA */
880
#endif /* HAVE_SECRET_CALLBACK */
881
349
    return ret;
882
349
}
883
884
#ifdef HAVE_KEYING_MATERIAL
885
/* The length of the exporter master secret label. */
886
#define EXPORTER_MASTER_LABEL_SZ    10
887
/* The exporter master secret label. */
888
static const byte exporterMasterLabel[EXPORTER_MASTER_LABEL_SZ + 1] =
889
    "exp master";
890
891
/* Derive the exporter secret.
892
 *
893
 * ssl  The SSL/TLS object.
894
 * key  The derived key.
895
 * returns 0 on success, otherwise failure.
896
 */
897
static int DeriveExporterSecret(WOLFSSL* ssl, byte* key)
898
{
899
    int ret;
900
    WOLFSSL_ENTER("Derive Exporter Secret");
901
    if (ssl == NULL || ssl->arrays == NULL) {
902
        return BAD_FUNC_ARG;
903
    }
904
    ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->masterSecret,
905
                        exporterMasterLabel, EXPORTER_MASTER_LABEL_SZ,
906
                        ssl->specs.mac_algorithm, 1, 0 /* Unused */);
907
#ifdef HAVE_SECRET_CALLBACK
908
    if (ret == 0 && ssl->tls13SecretCb != NULL) {
909
        ret = ssl->tls13SecretCb(ssl, EXPORTER_SECRET, key,
910
                                 ssl->specs.hash_size, ssl->tls13SecretCtx);
911
        if (ret != 0) {
912
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
913
            return TLS13_SECRET_CB_E;
914
        }
915
    }
916
#ifdef OPENSSL_EXTRA
917
    if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
918
        ret = ssl->tls13KeyLogCb(ssl, EXPORTER_SECRET, key,
919
                                ssl->specs.hash_size, NULL);
920
        if (ret != 0) {
921
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
922
            return TLS13_SECRET_CB_E;
923
        }
924
    }
925
#endif /* OPENSSL_EXTRA */
926
#endif /* HAVE_SECRET_CALLBACK */
927
    return ret;
928
}
929
930
/* The length of the exporter label. */
931
#define EXPORTER_LABEL_SZ    8
932
/* The exporter label. */
933
static const byte exporterLabel[EXPORTER_LABEL_SZ + 1] =
934
    "exporter";
935
/* Hash("") */
936
#ifndef NO_SHA256
937
static const byte emptySHA256Hash[] = {
938
    0xE3, 0xB0, 0xC4, 0x42, 0x98, 0xFC, 0x1C, 0x14, 0x9A, 0xFB, 0xF4, 0xC8,
939
    0x99, 0x6F, 0xB9, 0x24, 0x27, 0xAE, 0x41, 0xE4, 0x64, 0x9B, 0x93, 0x4C,
940
    0xA4, 0x95, 0x99, 0x1B, 0x78, 0x52, 0xB8, 0x55
941
};
942
#endif
943
#ifdef WOLFSSL_SHA384
944
static const byte emptySHA384Hash[] = {
945
    0x38, 0xB0, 0x60, 0xA7, 0x51, 0xAC, 0x96, 0x38, 0x4C, 0xD9, 0x32, 0x7E,
946
    0xB1, 0xB1, 0xE3, 0x6A, 0x21, 0xFD, 0xB7, 0x11, 0x14, 0xBE, 0x07, 0x43,
947
    0x4C, 0x0C, 0xC7, 0xBF, 0x63, 0xF6, 0xE1, 0xDA, 0x27, 0x4E, 0xDE, 0xBF,
948
    0xE7, 0x6F, 0x65, 0xFB, 0xD5, 0x1A, 0xD2, 0xF1, 0x48, 0x98, 0xB9, 0x5B
949
};
950
#endif
951
#ifdef WOLFSSL_TLS13_SHA512
952
static const byte emptySHA512Hash[] = {
953
    0xCF, 0x83, 0xE1, 0x35, 0x7E, 0xEF, 0xB8, 0xBD, 0xF1, 0x54, 0x28, 0x50,
954
    0xD6, 0x6D, 0x80, 0x07, 0xD6, 0x20, 0xE4, 0x05, 0x0B, 0x57, 0x15, 0xDC,
955
    0x83, 0xF4, 0xA9, 0x21, 0xD3, 0x6C, 0xE9, 0xCE, 0x47, 0xD0, 0xD1, 0x3C,
956
    0x5D, 0x85, 0xF2, 0xB0, 0xFF, 0x83, 0x18, 0xD2, 0x87, 0x7E, 0xEC, 0x2F,
957
    0x63, 0xB9, 0x31, 0xBD, 0x47, 0x41, 0x7A, 0x81, 0xA5, 0x38, 0x32, 0x7A,
958
    0xF9, 0x27, 0xDA, 0x3E
959
};
960
#endif
961
/**
962
 * Implement section 7.5 of RFC 8446
963
 * @return  0 on success
964
 *         <0 on failure
965
 */
966
int Tls13_Exporter(WOLFSSL* ssl, unsigned char *out, size_t outLen,
967
        const char *label, size_t labelLen,
968
        const unsigned char *context, size_t contextLen)
969
{
970
    int                 ret;
971
    enum wc_HashType    hashType = WC_HASH_TYPE_NONE;
972
    word32              hashLen = 0;
973
    byte                hashOut[WC_MAX_DIGEST_SIZE];
974
    const byte*         emptyHash = NULL;
975
    byte                firstExpand[WC_MAX_DIGEST_SIZE];
976
    const byte*         protocol = tls13ProtocolLabel;
977
    word32              protocolLen = TLS13_PROTOCOL_LABEL_SZ;
978
979
    if (ssl->options.dtls && ssl->version.minor != DTLSv1_3_MINOR)
980
        return VERSION_ERROR;
981
982
    if (!ssl->options.dtls && ssl->version.minor != TLSv1_3_MINOR)
983
        return VERSION_ERROR;
984
985
#ifdef WOLFSSL_DTLS13
986
    if (ssl->options.dtls) {
987
        protocol = dtls13ProtocolLabel;
988
        protocolLen = DTLS13_PROTOCOL_LABEL_SZ;
989
    }
990
#endif /* WOLFSSL_DTLS13 */
991
992
    switch (ssl->specs.mac_algorithm) {
993
        #ifndef NO_SHA256
994
        case sha256_mac:
995
            hashType  = WC_HASH_TYPE_SHA256;
996
            hashLen   = WC_SHA256_DIGEST_SIZE;
997
            emptyHash = emptySHA256Hash;
998
            break;
999
        #endif
1000
1001
        #ifdef WOLFSSL_SHA384
1002
        case sha384_mac:
1003
            hashType  = WC_HASH_TYPE_SHA384;
1004
            hashLen   = WC_SHA384_DIGEST_SIZE;
1005
            emptyHash = emptySHA384Hash;
1006
            break;
1007
        #endif
1008
1009
        #ifdef WOLFSSL_TLS13_SHA512
1010
        case sha512_mac:
1011
            hashType  = WC_HASH_TYPE_SHA512;
1012
            hashLen   = WC_SHA512_DIGEST_SIZE;
1013
            emptyHash = emptySHA512Hash;
1014
            break;
1015
        #endif
1016
    }
1017
1018
    /* Derive-Secret(Secret, label, "") */
1019
    ret = Tls13HKDFExpandLabel(ssl, firstExpand, hashLen,
1020
            ssl->arrays->exporterSecret, hashLen,
1021
            protocol, protocolLen, (byte*)label, (word32)labelLen,
1022
            emptyHash, hashLen, (int)hashType);
1023
    if (ret != 0)
1024
        return ret;
1025
1026
    /* Hash(context_value) */
1027
    ret = wc_Hash(hashType, context, (word32)contextLen, hashOut, WC_MAX_DIGEST_SIZE);
1028
    if (ret != 0)
1029
        return ret;
1030
1031
    ret = Tls13HKDFExpandLabel(ssl, out, (word32)outLen, firstExpand, hashLen,
1032
            protocol, protocolLen, exporterLabel, EXPORTER_LABEL_SZ,
1033
            hashOut, hashLen, (int)hashType);
1034
1035
    return ret;
1036
}
1037
#endif
1038
1039
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
1040
/* The length of the resumption master secret label. */
1041
#define RESUME_MASTER_LABEL_SZ      10
1042
/* The resumption master secret label. */
1043
static const byte resumeMasterLabel[RESUME_MASTER_LABEL_SZ + 1] =
1044
    "res master";
1045
1046
/* Derive the resumption secret.
1047
 *
1048
 * ssl  The SSL/TLS object.
1049
 * key  The derived key.
1050
 * returns 0 on success, otherwise failure.
1051
 */
1052
int DeriveResumptionSecret(WOLFSSL* ssl, byte* key)
1053
{
1054
    byte* masterSecret;
1055
1056
    WOLFSSL_MSG("Derive Resumption Secret");
1057
    if (ssl == NULL) {
1058
        return BAD_FUNC_ARG;
1059
    }
1060
    if (ssl->arrays != NULL) {
1061
        masterSecret = ssl->arrays->masterSecret;
1062
    }
1063
    else {
1064
        masterSecret = ssl->session->masterSecret;
1065
    }
1066
    return Tls13DeriveKey(ssl, key, -1, masterSecret, resumeMasterLabel,
1067
                     RESUME_MASTER_LABEL_SZ, ssl->specs.mac_algorithm, 1,
1068
                     0 /* Unused */);
1069
}
1070
#endif
1071
1072
/* Length of the finished label. */
1073
3.54k
#define FINISHED_LABEL_SZ           8
1074
/* Finished label for generating finished key. */
1075
static const byte finishedLabel[FINISHED_LABEL_SZ+1] = "finished";
1076
/* Derive the finished secret.
1077
 *
1078
 * ssl     The SSL/TLS object.
1079
 * key     The key to use with the HMAC.
1080
 * secret  The derived secret.
1081
 * side    The side that we are deriving the secret for.
1082
 * returns 0 on success, otherwise failure.
1083
 */
1084
static int DeriveFinishedSecret(WOLFSSL* ssl, byte* key, byte* secret,
1085
                                int side)
1086
3.54k
{
1087
3.54k
    WOLFSSL_MSG("Derive Finished Secret");
1088
3.54k
    return Tls13DeriveKey(ssl, secret, -1, key, finishedLabel,
1089
3.54k
                          FINISHED_LABEL_SZ,  ssl->specs.mac_algorithm, 0,
1090
3.54k
                          side);
1091
3.54k
}
1092
1093
/* The length of the application traffic label. */
1094
0
#define APP_TRAFFIC_LABEL_SZ        11
1095
/* The application traffic label. */
1096
static const byte appTrafficLabel[APP_TRAFFIC_LABEL_SZ + 1] =
1097
    "traffic upd";
1098
1099
/* Update the traffic secret.
1100
 *
1101
 * ssl     The SSL/TLS object.
1102
 * secret  The previous secret and derived secret.
1103
 * side    The side that we are deriving the secret for.
1104
 * returns 0 on success, otherwise failure.
1105
 */
1106
static int DeriveTrafficSecret(WOLFSSL* ssl, byte* secret, int side)
1107
0
{
1108
0
    WOLFSSL_MSG("Derive New Application Traffic Secret");
1109
0
    return Tls13DeriveKey(ssl, secret, -1, secret,
1110
0
                     appTrafficLabel, APP_TRAFFIC_LABEL_SZ,
1111
0
                     ssl->specs.mac_algorithm, 0, side);
1112
0
}
1113
1114
1115
static int Tls13_HKDF_Extract(WOLFSSL *ssl, byte* prk, const byte* salt,
1116
                              int saltLen, byte* ikm, int ikmLen, int digest)
1117
{
1118
    int ret;
1119
#ifdef HAVE_PK_CALLBACKS
1120
    void *cb_ctx = ssl->HkdfExtractCtx;
1121
    CallbackHKDFExtract cb = ssl->ctx->HkdfExtractCb;
1122
    if (cb != NULL) {
1123
        ret = cb(prk, salt, (word32)saltLen, ikm, (word32)ikmLen, digest, cb_ctx);
1124
    }
1125
    else
1126
#endif
1127
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
1128
    if ((int)ssl->arrays->psk_keySz < 0) {
1129
        ret = PSK_KEY_ERROR;
1130
    }
1131
    else
1132
#endif
1133
    {
1134
    #if !defined(HAVE_FIPS) || \
1135
        (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(6,0))
1136
        ret = wc_Tls13_HKDF_Extract_ex(prk, salt, (word32)saltLen, ikm, (word32)ikmLen, digest,
1137
            ssl->heap, ssl->devId);
1138
    #else
1139
        ret = wc_Tls13_HKDF_Extract(prk, salt, saltLen, ikm, ikmLen, digest);
1140
        (void)ssl;
1141
    #endif
1142
    }
1143
    return ret;
1144
}
1145
1146
/* Derive the early secret using HKDF Extract.
1147
 *
1148
 * ssl  The SSL/TLS object.
1149
 */
1150
int DeriveEarlySecret(WOLFSSL* ssl)
1151
3.76k
{
1152
3.76k
    int ret;
1153
1154
3.76k
    WOLFSSL_MSG("Derive Early Secret");
1155
3.76k
    if (ssl == NULL || ssl->arrays == NULL) {
1156
0
        return BAD_FUNC_ARG;
1157
0
    }
1158
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
1159
    ret = tsip_Tls13DeriveEarlySecret(ssl);
1160
    if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
1161
        return ret;
1162
#endif
1163
3.76k
    PRIVATE_KEY_UNLOCK();
1164
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
1165
    ret = Tls13_HKDF_Extract(ssl, ssl->arrays->secret, NULL, 0,
1166
            ssl->arrays->psk_key, (int)ssl->arrays->psk_keySz,
1167
            mac2hash(ssl->specs.mac_algorithm));
1168
#else
1169
3.76k
    ret = Tls13_HKDF_Extract(ssl, ssl->arrays->secret, NULL, 0,
1170
3.76k
            ssl->arrays->masterSecret, 0, mac2hash(ssl->specs.mac_algorithm));
1171
3.76k
#endif
1172
3.76k
    PRIVATE_KEY_LOCK();
1173
3.76k
    return ret;
1174
3.76k
}
1175
1176
/* The length of the derived label. */
1177
650
#define DERIVED_LABEL_SZ        7
1178
/* The derived label. */
1179
static const byte derivedLabel[DERIVED_LABEL_SZ + 1] =
1180
    "derived";
1181
1182
/* Derive the handshake secret using HKDF Extract.
1183
 *
1184
 * ssl  The SSL/TLS object.
1185
 */
1186
int DeriveHandshakeSecret(WOLFSSL* ssl)
1187
650
{
1188
650
    byte key[WC_MAX_DIGEST_SIZE];
1189
650
    int ret;
1190
650
    WOLFSSL_MSG("Derive Handshake Secret");
1191
650
    if (ssl == NULL || ssl->arrays == NULL) {
1192
0
        return BAD_FUNC_ARG;
1193
0
    }
1194
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
1195
    ret = tsip_Tls13DeriveHandshakeSecret(ssl);
1196
    if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
1197
        return ret;
1198
#endif
1199
1200
    /* Derive-Secret(., "derived", "") per RFC 8446 Section 7.1.
1201
     * Empty hash (NULL, 0) is required by the TLS 1.3 key schedule. */
1202
650
    ret = DeriveKeyMsg(ssl, key, -1, ssl->arrays->secret,
1203
650
                        derivedLabel, DERIVED_LABEL_SZ,
1204
650
                        NULL, 0, ssl->specs.mac_algorithm);
1205
650
    if (ret != 0)
1206
14
        return ret;
1207
1208
636
    PRIVATE_KEY_UNLOCK();
1209
636
    ret = Tls13_HKDF_Extract(ssl, ssl->arrays->preMasterSecret,
1210
636
            key, ssl->specs.hash_size,
1211
636
            ssl->arrays->preMasterSecret, (int)ssl->arrays->preMasterSz,
1212
636
            mac2hash(ssl->specs.mac_algorithm));
1213
636
    PRIVATE_KEY_LOCK();
1214
1215
636
    return ret;
1216
650
}
1217
1218
/* Derive the master secret using HKDF Extract.
1219
 *
1220
 * ssl  The SSL/TLS object.
1221
 */
1222
int DeriveMasterSecret(WOLFSSL* ssl)
1223
{
1224
    byte key[WC_MAX_DIGEST_SIZE];
1225
    int ret;
1226
    WOLFSSL_MSG("Derive Master Secret");
1227
    if (ssl == NULL || ssl->arrays == NULL) {
1228
        return BAD_FUNC_ARG;
1229
    }
1230
1231
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
1232
    ret = tsip_Tls13DeriveMasterSecret(ssl);
1233
    if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
1234
        return ret;
1235
#endif
1236
1237
    /* Derive-Secret(., "derived", "") per RFC 8446 Section 7.1.
1238
     * Empty hash (NULL, 0) is required by the TLS 1.3 key schedule. */
1239
    ret = DeriveKeyMsg(ssl, key, -1, ssl->arrays->preMasterSecret,
1240
                        derivedLabel, DERIVED_LABEL_SZ,
1241
                        NULL, 0, ssl->specs.mac_algorithm);
1242
    if (ret != 0)
1243
        return ret;
1244
1245
    PRIVATE_KEY_UNLOCK();
1246
    ret = Tls13_HKDF_Extract(ssl, ssl->arrays->masterSecret,
1247
            key, ssl->specs.hash_size,
1248
            ssl->arrays->masterSecret, 0, mac2hash(ssl->specs.mac_algorithm));
1249
    PRIVATE_KEY_LOCK();
1250
1251
#ifdef HAVE_KEYING_MATERIAL
1252
    if (ret != 0)
1253
        return ret;
1254
    /* Calculate exporter secret only when saving arrays */
1255
    if (ssl->options.saveArrays)
1256
        ret = DeriveExporterSecret(ssl, ssl->arrays->exporterSecret);
1257
#endif
1258
1259
    return ret;
1260
}
1261
1262
#if defined(HAVE_SESSION_TICKET)
1263
/* Length of the resumption label. */
1264
#define RESUMPTION_LABEL_SZ         10
1265
/* Resumption label for generating PSK associated with the ticket. */
1266
static const byte resumptionLabel[RESUMPTION_LABEL_SZ+1] = "resumption";
1267
1268
/* Derive the PSK associated with the ticket.
1269
 *
1270
 * ssl       The SSL/TLS object.
1271
 * nonce     The nonce to derive with.
1272
 * nonceLen  The length of the nonce to derive with.
1273
 * secret    The derived secret.
1274
 * returns 0 on success, otherwise failure.
1275
 */
1276
int DeriveResumptionPSK(WOLFSSL* ssl, byte* nonce, byte nonceLen, byte* secret)
1277
{
1278
    int         digestAlg;
1279
    /* Only one protocol version defined at this time. */
1280
    const byte* protocol    = tls13ProtocolLabel;
1281
    word32      protocolLen = TLS13_PROTOCOL_LABEL_SZ;
1282
    int         ret;
1283
1284
    WOLFSSL_MSG("Derive Resumption PSK");
1285
1286
#ifdef WOLFSSL_DTLS13
1287
    if (ssl->options.dtls) {
1288
        protocol = dtls13ProtocolLabel;
1289
        protocolLen = DTLS13_PROTOCOL_LABEL_SZ;
1290
    }
1291
#endif /* WOLFSSL_DTLS13 */
1292
1293
    switch (ssl->specs.mac_algorithm) {
1294
        #ifndef NO_SHA256
1295
        case sha256_mac:
1296
            digestAlg = WC_SHA256;
1297
            break;
1298
        #endif
1299
1300
        #ifdef WOLFSSL_SHA384
1301
        case sha384_mac:
1302
            digestAlg = WC_SHA384;
1303
            break;
1304
        #endif
1305
1306
        #ifdef WOLFSSL_TLS13_SHA512
1307
        case sha512_mac:
1308
            digestAlg = WC_SHA512;
1309
            break;
1310
        #endif
1311
1312
        #ifdef WOLFSSL_SM3
1313
        case sm3_mac:
1314
            digestAlg = WC_SM3;
1315
            break;
1316
        #endif
1317
1318
        default:
1319
            return BAD_FUNC_ARG;
1320
    }
1321
1322
#if defined(WOLFSSL_TICKET_NONCE_MALLOC) &&                                    \
1323
    (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
1324
    PRIVATE_KEY_UNLOCK();
1325
    ret = wc_Tls13_HKDF_Expand_Label_Alloc(secret, ssl->specs.hash_size,
1326
        ssl->session->masterSecret, ssl->specs.hash_size, protocol, protocolLen,
1327
        resumptionLabel, RESUMPTION_LABEL_SZ, nonce, nonceLen, digestAlg,
1328
        ssl->heap);
1329
    PRIVATE_KEY_LOCK();
1330
#else
1331
    ret = Tls13HKDFExpandLabel(ssl, secret, ssl->specs.hash_size,
1332
                               ssl->session->masterSecret, ssl->specs.hash_size,
1333
                               protocol, protocolLen, resumptionLabel,
1334
                               RESUMPTION_LABEL_SZ, nonce, nonceLen, digestAlg);
1335
#endif /* !defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3) */
1336
    return ret;
1337
}
1338
#endif /* HAVE_SESSION_TICKET */
1339
1340
1341
/* Calculate the HMAC of message data to this point.
1342
 *
1343
 * ssl   The SSL/TLS object.
1344
 * key   The HMAC key.
1345
 * hash  The hash result - verify data.
1346
 * returns length of verify data generated.
1347
 */
1348
static int BuildTls13HandshakeHmac(WOLFSSL* ssl, byte* key, byte* hash,
1349
    word32* pHashSz)
1350
0
{
1351
0
    WC_DECLARE_VAR(verifyHmac, Hmac, 1, 0);
1352
0
    int  hashType = WC_SHA256;
1353
0
    int  hashSz = WC_SHA256_DIGEST_SIZE;
1354
0
    int  ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
1355
1356
0
    if (ssl == NULL || key == NULL || hash == NULL) {
1357
0
        return BAD_FUNC_ARG;
1358
0
    }
1359
1360
    /* Get the hash of the previous handshake messages. */
1361
0
    switch (ssl->specs.mac_algorithm) {
1362
0
    #ifndef NO_SHA256
1363
0
        case sha256_mac:
1364
0
            hashType = WC_SHA256;
1365
0
            hashSz = WC_SHA256_DIGEST_SIZE;
1366
0
            ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
1367
0
            break;
1368
0
    #endif /* !NO_SHA256 */
1369
0
    #ifdef WOLFSSL_SHA384
1370
0
        case sha384_mac:
1371
0
            hashType = WC_SHA384;
1372
0
            hashSz = WC_SHA384_DIGEST_SIZE;
1373
0
            ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
1374
0
            break;
1375
0
    #endif /* WOLFSSL_SHA384 */
1376
    #ifdef WOLFSSL_TLS13_SHA512
1377
        case sha512_mac:
1378
            hashType = WC_SHA512;
1379
            hashSz = WC_SHA512_DIGEST_SIZE;
1380
            ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512, hash);
1381
            break;
1382
    #endif /* WOLFSSL_TLS13_SHA512 */
1383
0
    #ifdef WOLFSSL_SM3
1384
0
        case sm3_mac:
1385
0
            hashType = WC_SM3;
1386
0
            hashSz = WC_SM3_DIGEST_SIZE;
1387
0
            ret = wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash);
1388
0
            break;
1389
0
    #endif /* WOLFSSL_SM3 */
1390
0
        default:
1391
0
            ret = BAD_FUNC_ARG;
1392
0
            break;
1393
0
    }
1394
0
    if (ret != 0)
1395
0
        return ret;
1396
1397
#ifdef WOLFSSL_DEBUG_TLS
1398
    WOLFSSL_MSG("  Key");
1399
    WOLFSSL_BUFFER(key, ssl->specs.hash_size);
1400
    WOLFSSL_MSG("  Msg Hash");
1401
    WOLFSSL_BUFFER(hash, hashSz);
1402
#endif
1403
1404
0
    WC_ALLOC_VAR_EX(verifyHmac, Hmac, 1, NULL, DYNAMIC_TYPE_HMAC,
1405
0
        return MEMORY_E);
1406
1407
    /* Calculate the verify data. */
1408
0
    ret = wc_HmacInit(verifyHmac, ssl->heap, ssl->devId);
1409
0
    if (ret == 0) {
1410
0
        ret = wc_HmacSetKey(verifyHmac, hashType, key, ssl->specs.hash_size);
1411
0
        if (ret == 0)
1412
0
            ret = wc_HmacUpdate(verifyHmac, hash, (word32)hashSz);
1413
0
        if (ret == 0)
1414
0
            ret = wc_HmacFinal(verifyHmac, hash);
1415
0
        wc_HmacFree(verifyHmac);
1416
0
    }
1417
1418
0
    WC_FREE_VAR_EX(verifyHmac, NULL, DYNAMIC_TYPE_HMAC);
1419
1420
#ifdef WOLFSSL_DEBUG_TLS
1421
    WOLFSSL_MSG("  Hash");
1422
    WOLFSSL_BUFFER(hash, hashSz);
1423
#endif
1424
1425
0
    if (pHashSz)
1426
0
        *pHashSz = (word32)hashSz;
1427
1428
0
    return ret;
1429
0
}
1430
1431
/* The length of the label to use when deriving keys. */
1432
#define WRITE_KEY_LABEL_SZ     3
1433
/* The length of the label to use when deriving IVs. */
1434
#define WRITE_IV_LABEL_SZ      2
1435
/* The label to use when deriving keys. */
1436
static const byte writeKeyLabel[WRITE_KEY_LABEL_SZ+1] = "key";
1437
/* The label to use when deriving IVs. */
1438
static const byte writeIVLabel[WRITE_IV_LABEL_SZ+1]   = "iv";
1439
1440
/* Derive the keys and IVs for TLS v1.3.
1441
 *
1442
 * ssl      The SSL/TLS object.
1443
 * secret   early_data_key when deriving the key and IV for encrypting early
1444
 *          data application data and end_of_early_data messages.
1445
 *          handshake_key when deriving keys and IVs for encrypting handshake
1446
 *          messages.
1447
 *          traffic_key when deriving first keys and IVs for encrypting
1448
 *          traffic messages.
1449
 *          update_traffic_key when deriving next keys and IVs for encrypting
1450
 *          traffic messages.
1451
 * side     ENCRYPT_SIDE_ONLY when only encryption secret needs to be derived.
1452
 *          DECRYPT_SIDE_ONLY when only decryption secret needs to be derived.
1453
 *          ENCRYPT_AND_DECRYPT_SIDE when both secret needs to be derived.
1454
 * store    1 indicates to derive the keys and IVs from derived secret and
1455
 *          store ready for provisioning.
1456
 * returns 0 on success, otherwise failure.
1457
 */
1458
int DeriveTls13Keys(WOLFSSL* ssl, int secret, int side, int store)
1459
{
1460
    int   ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); /* Assume failure */
1461
    int   i = 0;
1462
    WC_DECLARE_VAR(key_dig, byte, MAX_PRF_DIG, 0);
1463
    int   provision;
1464
1465
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
1466
    ret = tsip_Tls13DeriveKeys(ssl, secret, side);
1467
    if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
1468
        return ret;
1469
    }
1470
    ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); /* Assume failure */
1471
#endif
1472
1473
    WC_ALLOC_VAR_EX(key_dig, byte, MAX_PRF_DIG, ssl->heap,
1474
        DYNAMIC_TYPE_DIGEST, return MEMORY_E);
1475
1476
    if (side == ENCRYPT_AND_DECRYPT_SIDE) {
1477
        provision = PROVISION_CLIENT_SERVER;
1478
    }
1479
    else {
1480
        provision = ((ssl->options.side != WOLFSSL_CLIENT_END) ^
1481
                     (side == ENCRYPT_SIDE_ONLY)) ? PROVISION_CLIENT :
1482
                                                    PROVISION_SERVER;
1483
    }
1484
1485
    /* Derive the appropriate secret to use in the HKDF. */
1486
    switch (secret) {
1487
#ifdef WOLFSSL_EARLY_DATA
1488
        case early_data_key:
1489
            ret = DeriveEarlyTrafficSecret(ssl, ssl->clientSecret,
1490
                                           WOLFSSL_CLIENT_END);
1491
            if (ret != 0)
1492
                goto end;
1493
            break;
1494
#endif
1495
1496
        case handshake_key:
1497
            if (provision & PROVISION_CLIENT) {
1498
                ret = DeriveClientHandshakeSecret(ssl,
1499
                                                  ssl->clientSecret);
1500
                if (ret != 0)
1501
                    goto end;
1502
            }
1503
            if (provision & PROVISION_SERVER) {
1504
                ret = DeriveServerHandshakeSecret(ssl,
1505
                                                  ssl->serverSecret);
1506
                if (ret != 0)
1507
                    goto end;
1508
            }
1509
            break;
1510
1511
        case traffic_key:
1512
            if (provision & PROVISION_CLIENT) {
1513
                ret = DeriveClientTrafficSecret(ssl, ssl->clientSecret);
1514
                if (ret != 0)
1515
                    goto end;
1516
            }
1517
            if (provision & PROVISION_SERVER) {
1518
                ret = DeriveServerTrafficSecret(ssl, ssl->serverSecret);
1519
                if (ret != 0)
1520
                    goto end;
1521
            }
1522
            break;
1523
1524
        case update_traffic_key:
1525
            if (provision & PROVISION_CLIENT) {
1526
                ret = DeriveTrafficSecret(ssl, ssl->clientSecret,
1527
                                          WOLFSSL_CLIENT_END);
1528
                if (ret != 0)
1529
                    goto end;
1530
            }
1531
            if (provision & PROVISION_SERVER) {
1532
                ret = DeriveTrafficSecret(ssl, ssl->serverSecret,
1533
                                          WOLFSSL_SERVER_END);
1534
                if (ret != 0)
1535
                    goto end;
1536
            }
1537
            break;
1538
1539
        default:
1540
            ret = BAD_FUNC_ARG;
1541
            break;
1542
    }
1543
1544
#ifdef WOLFSSL_QUIC
1545
    if (WOLFSSL_IS_QUIC(ssl)) {
1546
        ret = wolfSSL_quic_forward_secrets(ssl, secret, side);
1547
        if (ret != 0)
1548
            goto end;
1549
    }
1550
#endif /* WOLFSSL_QUIC */
1551
1552
    if (!store)
1553
        goto end;
1554
1555
    /* Key data = client key | server key | client IV | server IV */
1556
1557
    if (provision & PROVISION_CLIENT) {
1558
        /* Derive the client key.  */
1559
        WOLFSSL_MSG("Derive Client Key");
1560
        ret = Tls13DeriveKey(ssl, &key_dig[i], ssl->specs.key_size,
1561
                        ssl->clientSecret, writeKeyLabel,
1562
                        WRITE_KEY_LABEL_SZ, ssl->specs.mac_algorithm, 0,
1563
                        WOLFSSL_CLIENT_END);
1564
        if (ret != 0)
1565
            goto end;
1566
        i += ssl->specs.key_size;
1567
    }
1568
1569
    if (provision & PROVISION_SERVER) {
1570
        /* Derive the server key.  */
1571
        WOLFSSL_MSG("Derive Server Key");
1572
        ret = Tls13DeriveKey(ssl, &key_dig[i], ssl->specs.key_size,
1573
                        ssl->serverSecret, writeKeyLabel,
1574
                        WRITE_KEY_LABEL_SZ, ssl->specs.mac_algorithm, 0,
1575
                        WOLFSSL_SERVER_END);
1576
        if (ret != 0)
1577
            goto end;
1578
        i += ssl->specs.key_size;
1579
    }
1580
1581
    if (provision & PROVISION_CLIENT) {
1582
        /* Derive the client IV.  */
1583
        WOLFSSL_MSG("Derive Client IV");
1584
        ret = Tls13DeriveKey(ssl, &key_dig[i], ssl->specs.iv_size,
1585
                        ssl->clientSecret, writeIVLabel,
1586
                        WRITE_IV_LABEL_SZ, ssl->specs.mac_algorithm, 0,
1587
                        WOLFSSL_CLIENT_END);
1588
        if (ret != 0)
1589
            goto end;
1590
        i += ssl->specs.iv_size;
1591
    }
1592
1593
    if (provision & PROVISION_SERVER) {
1594
        /* Derive the server IV.  */
1595
        WOLFSSL_MSG("Derive Server IV");
1596
        ret = Tls13DeriveKey(ssl, &key_dig[i], ssl->specs.iv_size,
1597
                        ssl->serverSecret, writeIVLabel,
1598
                        WRITE_IV_LABEL_SZ, ssl->specs.mac_algorithm, 0,
1599
                        WOLFSSL_SERVER_END);
1600
        if (ret != 0)
1601
            goto end;
1602
        i += ssl->specs.iv_size;
1603
    }
1604
1605
    /* Store keys and IVs but don't activate them. */
1606
    ret = StoreKeys(ssl, key_dig, provision);
1607
1608
#ifdef WOLFSSL_DTLS13
1609
    if (ret != 0)
1610
      goto end;
1611
1612
    if (ssl->options.dtls) {
1613
        w64wrapper epochNumber;
1614
        ret = Dtls13DeriveSnKeys(ssl, provision);
1615
        if (ret != 0)
1616
            goto end;
1617
1618
        switch (secret) {
1619
            case early_data_key:
1620
                epochNumber = w64From32(0, DTLS13_EPOCH_EARLYDATA);
1621
                break;
1622
            case handshake_key:
1623
                epochNumber = w64From32(0, DTLS13_EPOCH_HANDSHAKE);
1624
                break;
1625
            case traffic_key:
1626
            case no_key:
1627
                epochNumber = w64From32(0, DTLS13_EPOCH_TRAFFIC0);
1628
                break;
1629
            case update_traffic_key:
1630
                if (side == ENCRYPT_SIDE_ONLY) {
1631
                    epochNumber = ssl->dtls13Epoch;
1632
                }
1633
                else if (side == DECRYPT_SIDE_ONLY) {
1634
                    epochNumber = ssl->dtls13PeerEpoch;
1635
                }
1636
                else {
1637
                    ret = BAD_STATE_E;
1638
                    goto end;
1639
                }
1640
                w64Increment(&epochNumber);
1641
                break;
1642
            default:
1643
                ret = BAD_STATE_E;
1644
                goto end;
1645
        }
1646
        ret = Dtls13NewEpoch(ssl, epochNumber, side);
1647
        if (ret != 0)
1648
            goto end;
1649
    }
1650
1651
#endif /* WOLFSSL_DTLS13 */
1652
1653
end:
1654
    ForceZero(key_dig, (word32)i);
1655
#ifdef WOLFSSL_SMALL_STACK
1656
    XFREE(key_dig, ssl->heap, DYNAMIC_TYPE_DIGEST);
1657
#elif defined(WOLFSSL_CHECK_MEM_ZERO)
1658
    wc_MemZero_Check(key_dig, MAX_PRF_DIG);
1659
#endif
1660
1661
    if (ret != 0) {
1662
        WOLFSSL_ERROR_VERBOSE(ret);
1663
    }
1664
1665
    return ret;
1666
}
1667
1668
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) || defined(WOLFSSL_DTLS13)
1669
#ifdef WOLFSSL_32BIT_MILLI_TIME
1670
#ifndef NO_ASN_TIME
1671
#if defined(USER_TICKS)
1672
#if 0
1673
    word32 TimeNowInMilliseconds(void)
1674
    {
1675
        /*
1676
        write your own clock tick function if don't want gettimeofday()
1677
        needs millisecond accuracy but doesn't have to correlated to EPOCH
1678
        */
1679
    }
1680
#endif
1681
1682
#elif defined(TIME_OVERRIDES)
1683
#if !defined(NO_ASN) && !defined(NO_ASN_TIME)
1684
    word32 TimeNowInMilliseconds(void)
1685
    {
1686
        return (word32) wc_Time(0) * 1000;
1687
    }
1688
#else
1689
    #ifndef HAVE_TIME_T_TYPE
1690
        typedef long time_t;
1691
    #endif
1692
    extern time_t XTIME(time_t * timer);
1693
1694
    /* The time in milliseconds.
1695
     * Used for tickets to represent difference between when first seen and when
1696
     * sending.
1697
     *
1698
     * returns the time in milliseconds as a 32-bit value.
1699
     */
1700
    word32 TimeNowInMilliseconds(void)
1701
    {
1702
        return (word32) XTIME(0) * 1000;
1703
    }
1704
#endif
1705
1706
#elif defined(XTIME_MS)
1707
    word32 TimeNowInMilliseconds(void)
1708
    {
1709
        return (word32)XTIME_MS(0);
1710
    }
1711
1712
#elif defined(USE_WINDOWS_API)
1713
    /* The time in milliseconds.
1714
     * Used for tickets to represent difference between when first seen and when
1715
     * sending.
1716
     *
1717
     * returns the time in milliseconds as a 32-bit value.
1718
     */
1719
    word32 TimeNowInMilliseconds(void)
1720
    {
1721
        static int           init = 0;
1722
        static LARGE_INTEGER freq;
1723
        LARGE_INTEGER        count;
1724
1725
        if (!init) {
1726
            QueryPerformanceFrequency(&freq);
1727
            init = 1;
1728
        }
1729
1730
        QueryPerformanceCounter(&count);
1731
1732
        return (word32)(count.QuadPart / (freq.QuadPart / 1000));
1733
    }
1734
1735
#elif defined(HAVE_RTP_SYS)
1736
    #include "rtptime.h"
1737
1738
    /* The time in milliseconds.
1739
     * Used for tickets to represent difference between when first seen and when
1740
     * sending.
1741
     *
1742
     * returns the time in milliseconds as a 32-bit value.
1743
     */
1744
    word32 TimeNowInMilliseconds(void)
1745
    {
1746
        return (word32)rtp_get_system_sec() * 1000;
1747
    }
1748
#elif defined(WOLFSSL_DEOS)
1749
    word32 TimeNowInMilliseconds(void)
1750
    {
1751
        const word32 systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
1752
        word32 *systemTickPtr = systemTickPointer();
1753
1754
        return (word32) (*systemTickPtr/systemTickTimeInHz) * 1000;
1755
    }
1756
#elif defined(MICRIUM)
1757
    /* The time in milliseconds.
1758
     * Used for tickets to represent difference between when first seen and when
1759
     * sending.
1760
     *
1761
     * returns the time in milliseconds as a 32-bit value.
1762
     */
1763
    word32 TimeNowInMilliseconds(void)
1764
    {
1765
        OS_TICK ticks = 0;
1766
        OS_ERR  err;
1767
1768
        ticks = OSTimeGet(&err);
1769
1770
        return (word32) (ticks / OSCfg_TickRate_Hz) * 1000;
1771
    }
1772
#elif defined(MICROCHIP_TCPIP_V5)
1773
    /* The time in milliseconds.
1774
     * Used for tickets to represent difference between when first seen and when
1775
     * sending.
1776
     *
1777
     * returns the time in milliseconds as a 32-bit value.
1778
     */
1779
    word32 TimeNowInMilliseconds(void)
1780
    {
1781
        return (word32) (TickGet() / (TICKS_PER_SECOND / 1000));
1782
    }
1783
#elif defined(MICROCHIP_TCPIP)
1784
    #if defined(MICROCHIP_MPLAB_HARMONY)
1785
        #include <system/tmr/sys_tmr.h>
1786
1787
    /* The time in milliseconds.
1788
     * Used for tickets to represent difference between when first seen and when
1789
     * sending.
1790
     *
1791
     * returns the time in milliseconds as a 32-bit value.
1792
     */
1793
    word32 TimeNowInMilliseconds(void)
1794
    {
1795
        return (word32)(SYS_TMR_TickCountGet() /
1796
                        (SYS_TMR_TickCounterFrequencyGet() / 1000));
1797
    }
1798
    #else
1799
    /* The time in milliseconds.
1800
     * Used for tickets to represent difference between when first seen and when
1801
     * sending.
1802
     *
1803
     * returns the time in milliseconds as a 32-bit value.
1804
     */
1805
    word32 TimeNowInMilliseconds(void)
1806
    {
1807
        return (word32)(SYS_TICK_Get() / (SYS_TICK_TicksPerSecondGet() / 1000));
1808
    }
1809
1810
    #endif
1811
1812
#elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
1813
    /* The time in milliseconds.
1814
     * Used for tickets to represent difference between when first seen and when
1815
     * sending.
1816
     *
1817
     * returns the time in milliseconds as a 32-bit value.
1818
     */
1819
    word32 TimeNowInMilliseconds(void)
1820
    {
1821
        TIME_STRUCT mqxTime;
1822
1823
        _time_get_elapsed(&mqxTime);
1824
1825
        return (word32) mqxTime.SECONDS * 1000;
1826
    }
1827
#elif defined(FREESCALE_FREE_RTOS) || defined(FREESCALE_KSDK_FREERTOS)
1828
    #include "include/task.h"
1829
1830
    /* The time in milliseconds.
1831
     * Used for tickets to represent difference between when first seen and when
1832
     * sending.
1833
     *
1834
     * returns the time in milliseconds as a 32-bit value.
1835
     */
1836
    word32 TimeNowInMilliseconds(void)
1837
    {
1838
        return (unsigned int)(((float)xTaskGetTickCount()) /
1839
                              (configTICK_RATE_HZ / 1000));
1840
    }
1841
#elif defined(FREESCALE_KSDK_BM)
1842
    #include "lwip/sys.h" /* lwIP */
1843
1844
    /* The time in milliseconds.
1845
     * Used for tickets to represent difference between when first seen and when
1846
     * sending.
1847
     *
1848
     * returns the time in milliseconds as a 32-bit value.
1849
     */
1850
    word32 TimeNowInMilliseconds(void)
1851
    {
1852
        return sys_now();
1853
    }
1854
1855
#elif defined(WOLFSSL_CMSIS_RTOS) || defined(WOLFSSL_CMSIS_RTOSv2)
1856
1857
    word32 TimeNowInMilliseconds(void)
1858
    {
1859
        return (word32)osKernelGetTickCount();
1860
    }
1861
1862
#elif defined(WOLFSSL_TIRTOS)
1863
    /* The time in milliseconds.
1864
     * Used for tickets to represent difference between when first seen and when
1865
     * sending.
1866
     *
1867
     * returns the time in milliseconds as a 32-bit value.
1868
     */
1869
    word32 TimeNowInMilliseconds(void)
1870
    {
1871
        return (word32) Seconds_get() * 1000;
1872
    }
1873
#elif defined(WOLFSSL_UTASKER)
1874
    /* The time in milliseconds.
1875
     * Used for tickets to represent difference between when first seen and when
1876
     * sending.
1877
     *
1878
     * returns the time in milliseconds as a 32-bit value.
1879
     */
1880
    word32 TimeNowInMilliseconds(void)
1881
    {
1882
        return (word32)(uTaskerSystemTick / (TICK_RESOLUTION / 1000));
1883
    }
1884
#elif defined(WOLFSSL_LINUXKM)
1885
    word32 TimeNowInMilliseconds(void)
1886
    {
1887
        s64 t;
1888
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)
1889
        struct timespec ts;
1890
        getnstimeofday(&ts);
1891
        t = ts.tv_sec * (s64)1000;
1892
        t += ts.tv_nsec / (s64)1000000;
1893
#else
1894
        struct timespec64 ts;
1895
#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0)
1896
        ts = current_kernel_time64();
1897
#else
1898
        ktime_get_coarse_real_ts64(&ts);
1899
#endif
1900
        t = ts.tv_sec * 1000L;
1901
        t += ts.tv_nsec / 1000000L;
1902
#endif
1903
        return (word32)t;
1904
    }
1905
#elif defined(WOLFSSL_QNX_CAAM)
1906
    word32 TimeNowInMilliseconds(void)
1907
    {
1908
        struct timespec now;
1909
        clock_gettime(CLOCK_REALTIME, &now);
1910
        return (word32)(now.tv_sec * 1000 + now.tv_nsec / 1000000);
1911
    }
1912
#elif defined(FUSION_RTOS)
1913
    /* The time in milliseconds.
1914
     * Used for tickets to represent difference between when first seen and when
1915
     * sending.
1916
     *
1917
     * returns the time in milliseconds as a 32-bit value.
1918
     */
1919
    word32 TimeNowInMilliseconds(void)
1920
    {
1921
        struct timeval now;
1922
        if (FCL_GETTIMEOFDAY(&now, 0) < 0)
1923
            return 0;
1924
1925
        /* Convert to milliseconds number. */
1926
        return (word32)(now.tv_sec * 1000 + now.tv_usec / 1000);
1927
    }
1928
#elif defined(WOLFSSL_ZEPHYR)
1929
    word32 TimeNowInMilliseconds(void)
1930
    {
1931
        int64_t t;
1932
    #if defined(CONFIG_ARCH_POSIX)
1933
        k_cpu_idle();
1934
    #endif
1935
        t = k_uptime_get(); /* returns current uptime in milliseconds */
1936
        return (word32)t;
1937
    }
1938
#elif defined(FREERTOS)
1939
    word32 TimeNowInMilliseconds(void)
1940
    {
1941
        return (word32)((uint64_t)(xTaskGetTickCount() * 1000) /
1942
            configTICK_RATE_HZ);
1943
    }
1944
#else
1945
    /* The time in milliseconds.
1946
     * Used for tickets to represent difference between when first seen and when
1947
     * sending.
1948
     *
1949
     * returns the time in milliseconds as a 32-bit value.
1950
     */
1951
    word32 TimeNowInMilliseconds(void)
1952
    {
1953
        struct timeval now;
1954
1955
        if (gettimeofday(&now, 0) < 0)
1956
            return 0;
1957
1958
        /* Convert to milliseconds number. */
1959
        return (word32)(now.tv_sec * 1000 + now.tv_usec / 1000);
1960
    }
1961
#endif
1962
#else
1963
    /* user must supply time in milliseconds function:
1964
     *   word32 TimeNowInMilliseconds(void);
1965
     * The response is milliseconds elapsed
1966
     */
1967
#endif /* !NO_ASN_TIME */
1968
#else
1969
#ifndef NO_ASN_TIME
1970
#if defined(USER_TICKS)
1971
#if 0
1972
    sword64 TimeNowInMilliseconds(void)
1973
    {
1974
        /*
1975
        write your own clock tick function if don't want gettimeofday()
1976
        needs millisecond accuracy but doesn't have to correlated to EPOCH
1977
        */
1978
    }
1979
#endif
1980
1981
#elif defined(TIME_OVERRIDES)
1982
#if !defined(NO_ASN) && !defined(NO_ASN_TIME)
1983
    sword64 TimeNowInMilliseconds(void)
1984
    {
1985
        return (sword64) wc_Time(0) * 1000;
1986
    }
1987
#else
1988
    #ifndef HAVE_TIME_T_TYPE
1989
        typedef long time_t;
1990
    #endif
1991
    extern time_t XTIME(time_t * timer);
1992
1993
    /* The time in milliseconds.
1994
     * Used for tickets to represent difference between when first seen and when
1995
     * sending.
1996
     *
1997
     * returns the time in milliseconds as a 32-bit value.
1998
     */
1999
    sword64 TimeNowInMilliseconds(void)
2000
    {
2001
        return (sword64) XTIME(0) * 1000;
2002
    }
2003
#endif
2004
2005
#elif defined(XTIME_MS)
2006
    sword64 TimeNowInMilliseconds(void)
2007
    {
2008
        return (sword64)XTIME_MS(0);
2009
    }
2010
2011
#elif defined(USE_WINDOWS_API)
2012
    /* The time in milliseconds.
2013
     * Used for tickets to represent difference between when first seen and when
2014
     * sending.
2015
     *
2016
     * returns the time in milliseconds as a 64-bit value.
2017
     */
2018
    sword64 TimeNowInMilliseconds(void)
2019
    {
2020
        static int           init = 0;
2021
        static LARGE_INTEGER freq;
2022
        LARGE_INTEGER        count;
2023
2024
        if (!init) {
2025
            QueryPerformanceFrequency(&freq);
2026
            init = 1;
2027
        }
2028
2029
        QueryPerformanceCounter(&count);
2030
2031
        return (sword64)(count.QuadPart / (freq.QuadPart / 1000));
2032
    }
2033
2034
#elif defined(HAVE_RTP_SYS)
2035
    #include "rtptime.h"
2036
2037
    /* The time in milliseconds.
2038
     * Used for tickets to represent difference between when first seen and when
2039
     * sending.
2040
     *
2041
     * returns the time in milliseconds as a 64-bit value.
2042
     */
2043
    sword64 TimeNowInMilliseconds(void)
2044
    {
2045
        return (sword64)rtp_get_system_sec() * 1000;
2046
    }
2047
#elif defined(WOLFSSL_DEOS)
2048
    sword64 TimeNowInMilliseconds(void)
2049
    {
2050
        const word32 systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
2051
        word32 *systemTickPtr = systemTickPointer();
2052
2053
        return (sword64) (*systemTickPtr/systemTickTimeInHz) * 1000;
2054
    }
2055
#elif defined(MICRIUM)
2056
    /* The time in milliseconds.
2057
     * Used for tickets to represent difference between when first seen and when
2058
     * sending.
2059
     *
2060
     * returns the time in milliseconds as a 64-bit value.
2061
     */
2062
    sword64 TimeNowInMilliseconds(void)
2063
    {
2064
        OS_TICK ticks = 0;
2065
        OS_ERR  err;
2066
2067
        ticks = OSTimeGet(&err);
2068
2069
        return (sword64) (ticks / OSCfg_TickRate_Hz) * 1000;
2070
    }
2071
#elif defined(MICROCHIP_TCPIP_V5)
2072
    /* The time in milliseconds.
2073
     * Used for tickets to represent difference between when first seen and when
2074
     * sending.
2075
     *
2076
     * returns the time in milliseconds as a 64-bit value.
2077
     */
2078
    sword64 TimeNowInMilliseconds(void)
2079
    {
2080
        return (sword64) (TickGet() / (TICKS_PER_SECOND / 1000));
2081
    }
2082
#elif defined(MICROCHIP_TCPIP)
2083
    #if defined(MICROCHIP_MPLAB_HARMONY)
2084
        #include <system/tmr/sys_tmr.h>
2085
2086
    /* The time in milliseconds.
2087
     * Used for tickets to represent difference between when first seen and when
2088
     * sending.
2089
     *
2090
     * returns the time in milliseconds as a 64-bit value.
2091
     */
2092
    sword64 TimeNowInMilliseconds(void)
2093
    {
2094
        return (sword64)SYS_TMR_TickCountGet() /
2095
                        (SYS_TMR_TickCounterFrequencyGet() / 1000);
2096
    }
2097
    #else
2098
    /* The time in milliseconds.
2099
     * Used for tickets to represent difference between when first seen and when
2100
     * sending.
2101
     *
2102
     * returns the time in milliseconds as a 64-bit value.
2103
     */
2104
    sword64 TimeNowInMilliseconds(void)
2105
    {
2106
        return (sword64)SYS_TICK_Get() / (SYS_TICK_TicksPerSecondGet() / 1000);
2107
    }
2108
2109
    #endif
2110
2111
#elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
2112
    /* The time in milliseconds.
2113
     * Used for tickets to represent difference between when first seen and when
2114
     * sending.
2115
     *
2116
     * returns the time in milliseconds as a 64-bit value.
2117
     */
2118
    sword64 TimeNowInMilliseconds(void)
2119
    {
2120
        TIME_STRUCT mqxTime;
2121
2122
        _time_get_elapsed(&mqxTime);
2123
2124
        return (sword64) mqxTime.SECONDS * 1000;
2125
    }
2126
#elif defined(FREESCALE_FREE_RTOS) || defined(FREESCALE_KSDK_FREERTOS)
2127
    #include "include/task.h"
2128
2129
    /* The time in milliseconds.
2130
     * Used for tickets to represent difference between when first seen and when
2131
     * sending.
2132
     *
2133
     * returns the time in milliseconds as a 64-bit value.
2134
     */
2135
    sword64 TimeNowInMilliseconds(void)
2136
    {
2137
        return (sword64)xTaskGetTickCount() / (configTICK_RATE_HZ / 1000);
2138
    }
2139
#elif defined(FREESCALE_KSDK_BM)
2140
    #include "lwip/sys.h" /* lwIP */
2141
2142
    /* The time in milliseconds.
2143
     * Used for tickets to represent difference between when first seen and when
2144
     * sending.
2145
     *
2146
     * returns the time in milliseconds as a 64-bit value.
2147
     */
2148
    sword64 TimeNowInMilliseconds(void)
2149
    {
2150
        return sys_now();
2151
    }
2152
2153
#elif defined(WOLFSSL_CMSIS_RTOS) || defined(WOLFSSL_CMSIS_RTOSv2)
2154
2155
    sword64 TimeNowInMilliseconds(void)
2156
    {
2157
        return (sword64)osKernelGetTickCount();
2158
    }
2159
2160
#elif defined(WOLFSSL_TIRTOS)
2161
    /* The time in milliseconds.
2162
     * Used for tickets to represent difference between when first seen and when
2163
     * sending.
2164
     *
2165
     * returns the time in milliseconds as a 64-bit value.
2166
     */
2167
    sword64 TimeNowInMilliseconds(void)
2168
    {
2169
        return (sword64) Seconds_get() * 1000;
2170
    }
2171
#elif defined(WOLFSSL_UTASKER)
2172
    /* The time in milliseconds.
2173
     * Used for tickets to represent difference between when first seen and when
2174
     * sending.
2175
     *
2176
     * returns the time in milliseconds as a 64-bit value.
2177
     */
2178
    sword64 TimeNowInMilliseconds(void)
2179
    {
2180
        return (sword64)(uTaskerSystemTick / (TICK_RESOLUTION / 1000));
2181
    }
2182
#elif defined(WOLFSSL_LINUXKM)
2183
    sword64 TimeNowInMilliseconds(void)
2184
    {
2185
        s64 t;
2186
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)
2187
        struct timespec ts;
2188
        getnstimeofday(&ts);
2189
        t = ts.tv_sec * (s64)1000;
2190
        t += ts.tv_nsec / (s64)1000000;
2191
#else
2192
        struct timespec64 ts;
2193
#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0)
2194
        ts = current_kernel_time64();
2195
#else
2196
        ktime_get_coarse_real_ts64(&ts);
2197
#endif
2198
        t = ts.tv_sec * 1000L;
2199
        t += ts.tv_nsec / 1000000L;
2200
#endif
2201
        return (sword64)t;
2202
    }
2203
#elif defined(WOLFSSL_QNX_CAAM)
2204
    sword64 TimeNowInMilliseconds(void)
2205
    {
2206
        struct timespec now;
2207
        clock_gettime(CLOCK_REALTIME, &now);
2208
        return (sword64)(now.tv_sec * 1000 + now.tv_nsec / 1000000);
2209
    }
2210
#elif defined(FUSION_RTOS)
2211
    /* The time in milliseconds.
2212
     * Used for tickets to represent difference between when first seen and when
2213
     * sending.
2214
     *
2215
     * returns the time in milliseconds as a 64-bit value.
2216
     */
2217
    sword64 TimeNowInMilliseconds(void)
2218
    {
2219
        struct timeval now;
2220
        if (FCL_GETTIMEOFDAY(&now, 0) < 0)
2221
            return 0;
2222
2223
        /* Convert to milliseconds number. */
2224
        return (sword64)now.tv_sec * 1000 + now.tv_usec / 1000;
2225
    }
2226
#elif defined(WOLFSSL_ZEPHYR)
2227
    sword64 TimeNowInMilliseconds(void)
2228
    {
2229
        int64_t t;
2230
    #if defined(CONFIG_ARCH_POSIX)
2231
        k_cpu_idle();
2232
    #endif
2233
        t = k_uptime_get(); /* returns current uptime in milliseconds */
2234
        return (sword64)t;
2235
    }
2236
#elif defined(FREERTOS)
2237
    sword64 TimeNowInMilliseconds(void)
2238
    {
2239
        return (sword64)((uint64_t)(xTaskGetTickCount() * 1000) /
2240
            configTICK_RATE_HZ);
2241
    }
2242
#else
2243
    /* The time in milliseconds.
2244
     * Used for tickets to represent difference between when first seen and when
2245
     * sending.
2246
     *
2247
     * returns the time in milliseconds as a 64-bit value.
2248
     */
2249
    sword64 TimeNowInMilliseconds(void)
2250
    {
2251
        struct timeval now;
2252
2253
        if (gettimeofday(&now, 0) < 0)
2254
            return 0;
2255
2256
        /* Convert to milliseconds number. */
2257
        return (sword64)now.tv_sec * 1000 + now.tv_usec / 1000;
2258
    }
2259
#endif
2260
#else
2261
    /* user must supply time in milliseconds function:
2262
     *   sword64 TimeNowInMilliseconds(void);
2263
     * The response is milliseconds elapsed
2264
     */
2265
#endif /* !NO_ASN_TIME */
2266
#endif /* WOLFSSL_32BIT_MILLI_TIME */
2267
#endif /* HAVE_SESSION_TICKET || !NO_PSK || WOLFSSL_DTLS13 */
2268
2269
/* Add record layer header to message.
2270
 *
2271
 * output  The buffer to write the record layer header into.
2272
 * length  The length of the record data.
2273
 * type    The type of record message.
2274
 * ssl     The SSL/TLS object.
2275
 */
2276
static void AddTls13RecordHeader(byte* output, word32 length, byte type,
2277
                                 WOLFSSL* ssl)
2278
5.43k
{
2279
5.43k
    RecordLayerHeader* rl;
2280
2281
5.43k
    rl = (RecordLayerHeader*)output;
2282
5.43k
    rl->type    = type;
2283
5.43k
    rl->pvMajor = ssl->version.major;
2284
    /* NOTE: May be TLSv1_MINOR when sending first ClientHello. */
2285
5.43k
    rl->pvMinor = TLSv1_2_MINOR;
2286
5.43k
    c16toa((word16)length, rl->length);
2287
5.43k
}
2288
2289
/* Add handshake header to message.
2290
 *
2291
 * output      The buffer to write the handshake header into.
2292
 * length      The length of the handshake data.
2293
 * fragOffset  The offset of the fragment data. (DTLS)
2294
 * fragLength  The length of the fragment data. (DTLS)
2295
 * type        The type of handshake message.
2296
 * ssl         The SSL/TLS object. (DTLS)
2297
 */
2298
static void AddTls13HandShakeHeader(byte* output, word32 length,
2299
                                    word32 fragOffset, word32 fragLength,
2300
                                    byte type, WOLFSSL* ssl)
2301
{
2302
    HandShakeHeader* hs;
2303
    (void)fragOffset;
2304
    (void)fragLength;
2305
    (void)ssl;
2306
2307
#ifdef WOLFSSL_DTLS13
2308
    /* message_hash type is used for a synthetic message that replaces the first
2309
       ClientHello in the hash transcript when using HelloRetryRequest. It will
2310
       never be transmitted and, as the DTLS-only fields must not be considered
2311
       when computing the hash transcript, we can avoid to use the DTLS
2312
       handshake header. */
2313
    if (ssl->options.dtls && type != message_hash) {
2314
        Dtls13HandshakeAddHeader(ssl, output, (enum HandShakeType)type, length);
2315
        return;
2316
    }
2317
#endif /* WOLFSSL_DTLS13 */
2318
2319
    /* handshake header */
2320
    hs = (HandShakeHeader*)output;
2321
    hs->type = type;
2322
    c32to24(length, hs->length);
2323
}
2324
2325
2326
/* Add both record layer and handshake header to message.
2327
 *
2328
 * output      The buffer to write the headers into.
2329
 * length      The length of the handshake data.
2330
 * type        The type of record layer message.
2331
 * ssl         The SSL/TLS object. (DTLS)
2332
 */
2333
static void AddTls13Headers(byte* output, word32 length, byte type,
2334
                            WOLFSSL* ssl)
2335
{
2336
    word32 lengthAdj = HANDSHAKE_HEADER_SZ;
2337
    word32 outputAdj = RECORD_HEADER_SZ;
2338
2339
#ifdef WOLFSSL_DTLS13
2340
    if (ssl->options.dtls) {
2341
        Dtls13AddHeaders(output, length, (enum HandShakeType)type, ssl);
2342
        return;
2343
    }
2344
#endif /* WOLFSSL_DTLS13 */
2345
2346
    AddTls13RecordHeader(output, length + lengthAdj, handshake, ssl);
2347
    AddTls13HandShakeHeader(output + outputAdj, length, 0, length, type, ssl);
2348
}
2349
2350
#if (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) \
2351
    && !defined(NO_CERTS)
2352
/* Add both record layer and fragment handshake header to message.
2353
 *
2354
 * output      The buffer to write the headers into.
2355
 * fragOffset  The offset of the fragment data. (DTLS)
2356
 * fragLength  The length of the fragment data. (DTLS)
2357
 * length      The length of the handshake data.
2358
 * type        The type of record layer message.
2359
 * ssl         The SSL/TLS object. (DTLS)
2360
 */
2361
static void AddTls13FragHeaders(byte* output, word32 fragSz, word32 fragOffset,
2362
                                word32 length, byte type, WOLFSSL* ssl)
2363
{
2364
    word32 lengthAdj = HANDSHAKE_HEADER_SZ;
2365
    word32 outputAdj = RECORD_HEADER_SZ;
2366
    (void)fragSz;
2367
2368
#ifdef WOLFSSL_DTLS13
2369
    /* we ignore fragmentation fields here because fragmentation logic for
2370
       DTLS1.3 is inside dtls13_handshake_send(). */
2371
    if (ssl->options.dtls) {
2372
        Dtls13AddHeaders(output, length, (enum HandShakeType)type, ssl);
2373
        return;
2374
    }
2375
#endif /* WOLFSSL_DTLS13 */
2376
2377
    AddTls13RecordHeader(output, fragSz + lengthAdj, handshake, ssl);
2378
    AddTls13HandShakeHeader(output + outputAdj, length, fragOffset, fragSz,
2379
                            type, ssl);
2380
}
2381
#endif /* (!NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER) && !NO_CERTS */
2382
2383
/* Write the sequence number into the buffer.
2384
 * No DTLS v1.3 support.
2385
 *
2386
 * ssl          The SSL/TLS object.
2387
 * verifyOrder  Which set of sequence numbers to use.
2388
 * out          The buffer to write into.
2389
 */
2390
static WC_INLINE void WriteSEQTls13(WOLFSSL* ssl, int verifyOrder, byte* out)
2391
7.53k
{
2392
7.53k
    word32 seq[2] = {0, 0};
2393
2394
7.53k
    if (ssl->options.dtls) {
2395
#ifdef WOLFSSL_DTLS13
2396
        Dtls13GetSeq(ssl, verifyOrder, seq, 1);
2397
#endif /* WOLFSSL_DTLS13 */
2398
0
    }
2399
7.53k
    else if (verifyOrder == PEER_ORDER) {
2400
5.37k
        seq[0] = ssl->keys.peer_sequence_number_hi;
2401
5.37k
        seq[1] = ssl->keys.peer_sequence_number_lo++;
2402
        /* handle rollover */
2403
5.37k
        if (seq[1] > ssl->keys.peer_sequence_number_lo)
2404
12
            ssl->keys.peer_sequence_number_hi++;
2405
5.37k
    }
2406
2.16k
    else {
2407
2.16k
        seq[0] = ssl->keys.sequence_number_hi;
2408
2.16k
        seq[1] = ssl->keys.sequence_number_lo++;
2409
        /* handle rollover */
2410
2.16k
        if (seq[1] > ssl->keys.sequence_number_lo)
2411
0
            ssl->keys.sequence_number_hi++;
2412
2.16k
    }
2413
#ifdef WOLFSSL_DEBUG_TLS
2414
    WOLFSSL_MSG_EX("TLS 1.3 Write Sequence %d %d", seq[0], seq[1]);
2415
#endif
2416
2417
7.53k
    c32toa(seq[0], out);
2418
7.53k
    c32toa(seq[1], out + OPAQUE32_LEN);
2419
7.53k
}
2420
2421
/* Build the nonce for TLS v1.3 encryption and decryption.
2422
 *
2423
 * ssl    The SSL/TLS object.
2424
 * nonce  The nonce data to use when encrypting or decrypting.
2425
 * iv     The derived IV.
2426
 * order  The side on which the message is to be or was sent.
2427
 */
2428
static WC_INLINE void BuildTls13Nonce(WOLFSSL* ssl, byte* nonce, const byte* iv,
2429
                                   int order)
2430
7.53k
{
2431
7.53k
    int seq_offset = AEAD_NONCE_SZ - SEQ_SZ;
2432
    /* The nonce is the IV with the sequence XORed into the last bytes. */
2433
7.53k
    WriteSEQTls13(ssl, order, nonce + seq_offset);
2434
7.53k
    XMEMCPY(nonce, iv, seq_offset);
2435
7.53k
    xorbuf(nonce + seq_offset, iv + seq_offset, SEQ_SZ);
2436
7.53k
}
2437
2438
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
2439
/* Encrypt with ChaCha20 and create authentication tag with Poly1305.
2440
 *
2441
 * ssl     The SSL/TLS object.
2442
 * output  The buffer to write encrypted data and authentication tag into.
2443
 *         May be the same pointer as input.
2444
 * input   The data to encrypt.
2445
 * sz      The number of bytes to encrypt.
2446
 * nonce   The nonce to use with ChaCha20.
2447
 * aad     The additional authentication data.
2448
 * aadSz   The size of the addition authentication data.
2449
 * tag     The authentication tag buffer.
2450
 * returns 0 on success, otherwise failure.
2451
 */
2452
static int ChaCha20Poly1305_Encrypt(WOLFSSL* ssl, byte* output,
2453
                                    const byte* input, word16 sz, byte* nonce,
2454
                                    const byte* aad, word16 aadSz, byte* tag)
2455
644
{
2456
644
    int    ret    = 0;
2457
644
    byte   poly[CHACHA20_256_KEY_SIZE];
2458
2459
    /* Poly1305 key is 256 bits of zero encrypted with ChaCha20. */
2460
644
    XMEMSET(poly, 0, sizeof(poly));
2461
2462
    /* Set the nonce for ChaCha and get Poly1305 key. */
2463
644
    ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 0);
2464
644
    if (ret != 0)
2465
0
        return ret;
2466
    /* Create Poly1305 key using ChaCha20 keystream. */
2467
644
    ret = wc_Chacha_Process(ssl->encrypt.chacha, poly, poly, sizeof(poly));
2468
644
    if (ret != 0)
2469
0
        return ret;
2470
#ifdef WOLFSSL_CHECK_MEM_ZERO
2471
    wc_MemZero_Add("ChaCha20Poly1305_Encrypt poly", poly, sizeof(poly));
2472
#endif
2473
644
    ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 1);
2474
644
    if (ret != 0)
2475
0
        return ret;
2476
    /* Encrypt the plain text. */
2477
644
    ret = wc_Chacha_Process(ssl->encrypt.chacha, output, input, sz);
2478
644
    if (ret != 0) {
2479
0
        ForceZero(poly, sizeof(poly));
2480
    #ifdef WOLFSSL_CHECK_MEM_ZERO
2481
        wc_MemZero_Check(poly, sizeof(poly));
2482
    #endif
2483
0
        return ret;
2484
0
    }
2485
2486
    /* Set key for Poly1305. */
2487
644
    ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly, sizeof(poly));
2488
644
    ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
2489
#ifdef WOLFSSL_CHECK_MEM_ZERO
2490
    wc_MemZero_Check(poly, sizeof(poly));
2491
#endif
2492
644
    if (ret != 0)
2493
0
        return ret;
2494
    /* Add authentication code of encrypted data to end. */
2495
644
    ret = wc_Poly1305_MAC(ssl->auth.poly1305, aad, aadSz, output, sz, tag,
2496
644
                                                              POLY1305_AUTH_SZ);
2497
2498
644
    return ret;
2499
644
}
2500
#endif
2501
2502
#ifdef HAVE_NULL_CIPHER
2503
/* Create authentication tag and copy data over input.
2504
 *
2505
 * ssl     The SSL/TLS object.
2506
 * output  The buffer to copy data into.
2507
 *         May be the same pointer as input.
2508
 * input   The data.
2509
 * sz      The number of bytes of data.
2510
 * nonce   The nonce to use with authentication.
2511
 * aad     The additional authentication data.
2512
 * aadSz   The size of the addition authentication data.
2513
 * tag     The authentication tag buffer.
2514
 * returns 0 on success, otherwise failure.
2515
 */
2516
static int Tls13IntegrityOnly_Encrypt(WOLFSSL* ssl, byte* output,
2517
                                      const byte* input, word16 sz,
2518
                                      const byte* nonce,
2519
                                      const byte* aad, word16 aadSz, byte* tag)
2520
{
2521
    int ret;
2522
2523
    /* HMAC: nonce | aad | input  */
2524
    ret = wc_HmacUpdate(ssl->encrypt.hmac, nonce, HMAC_NONCE_SZ);
2525
    if (ret == 0)
2526
        ret = wc_HmacUpdate(ssl->encrypt.hmac, aad, aadSz);
2527
    if (ret == 0)
2528
        ret = wc_HmacUpdate(ssl->encrypt.hmac, input, sz);
2529
    if (ret == 0)
2530
        ret = wc_HmacFinal(ssl->encrypt.hmac, tag);
2531
    /* Copy the input to output if not the same buffer */
2532
    if (ret == 0 && output != input)
2533
        XMEMCPY(output, input, sz);
2534
    return ret;
2535
}
2536
#endif
2537
2538
/* Encrypt data for TLS v1.3.
2539
 *
2540
 * ssl     The SSL/TLS object.
2541
 * output  The buffer to write encrypted data and authentication tag into.
2542
 *         May be the same pointer as input.
2543
 * input   The record header and data to encrypt.
2544
 * sz      The number of bytes to encrypt.
2545
 * aad     The additional authentication data.
2546
 * aadSz   The size of the addition authentication data.
2547
 * asyncOkay If non-zero can return WC_PENDING_E, otherwise blocks on crypto
2548
 * returns 0 on success, otherwise failure.
2549
 */
2550
static int EncryptTls13(WOLFSSL* ssl, byte* output, const byte* input,
2551
                        word16 sz, const byte* aad, word16 aadSz, int asyncOkay)
2552
0
{
2553
0
    int    ret    = 0;
2554
0
    word16 dataSz = sz - ssl->specs.aead_mac_size;
2555
0
    word16 macSz  = ssl->specs.aead_mac_size;
2556
0
    word32 nonceSz = 0;
2557
#ifdef WOLFSSL_ASYNC_CRYPT
2558
    WC_ASYNC_DEV* asyncDev = NULL;
2559
    word32 event_flags = WC_ASYNC_FLAG_CALL_AGAIN;
2560
#endif
2561
2562
0
    WOLFSSL_ENTER("EncryptTls13");
2563
2564
0
    (void)output;
2565
0
    (void)input;
2566
0
    (void)sz;
2567
0
    (void)dataSz;
2568
0
    (void)macSz;
2569
0
    (void)asyncOkay;
2570
0
    (void)nonceSz;
2571
2572
#ifdef WOLFSSL_ASYNC_CRYPT
2573
    if (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E)) {
2574
        ssl->error = 0; /* clear async */
2575
    }
2576
#endif
2577
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
2578
    ret = tsip_Tls13AesEncrypt(ssl, output, input, dataSz);
2579
    if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
2580
        if (ret > 0) {
2581
            ret = 0; /* tsip_Tls13AesEncrypt returns output size */
2582
        }
2583
        return ret;
2584
    }
2585
    ret = 0;
2586
#endif /* WOLFSSL_RENESAS_TSIP_TLS */
2587
2588
0
    switch (ssl->encrypt.state) {
2589
0
        case CIPHER_STATE_BEGIN:
2590
0
        {
2591
        #ifdef WOLFSSL_DEBUG_TLS
2592
            WOLFSSL_MSG("Data to encrypt");
2593
            WOLFSSL_BUFFER(input, dataSz);
2594
            WOLFSSL_MSG("Additional Authentication Data");
2595
            WOLFSSL_BUFFER(aad, aadSz);
2596
        #endif
2597
2598
        #ifdef WOLFSSL_CIPHER_TEXT_CHECK
2599
            if (ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) {
2600
                XMEMCPY(ssl->encrypt.sanityCheck, input,
2601
                    min(dataSz, sizeof(ssl->encrypt.sanityCheck)));
2602
            }
2603
        #endif
2604
2605
0
        #ifdef CIPHER_NONCE
2606
0
            if (ssl->encrypt.nonce == NULL) {
2607
0
                ssl->encrypt.nonce = (byte*)XMALLOC(AEAD_NONCE_SZ,
2608
0
                                                ssl->heap, DYNAMIC_TYPE_CIPHER);
2609
            #ifdef WOLFSSL_CHECK_MEM_ZERO
2610
                if (ssl->encrypt.nonce != NULL) {
2611
                    wc_MemZero_Add("EncryptTls13 nonce", ssl->encrypt.nonce,
2612
                        AEAD_NONCE_SZ);
2613
                }
2614
            #endif
2615
0
            }
2616
0
            if (ssl->encrypt.nonce == NULL)
2617
0
                return MEMORY_E;
2618
2619
0
            BuildTls13Nonce(ssl, ssl->encrypt.nonce, ssl->keys.aead_enc_imp_IV,
2620
0
                            CUR_ORDER);
2621
0
        #endif
2622
2623
            /* Advance state and proceed */
2624
0
            ssl->encrypt.state = CIPHER_STATE_DO;
2625
0
        }
2626
0
        FALL_THROUGH;
2627
2628
0
        case CIPHER_STATE_DO:
2629
0
        {
2630
0
            switch (ssl->specs.bulk_cipher_algorithm) {
2631
0
            #ifdef BUILD_AESGCM
2632
0
                case wolfssl_aes_gcm:
2633
                #ifdef WOLFSSL_ASYNC_CRYPT
2634
                    /* initialize event */
2635
                    asyncDev = &ssl->encrypt.aes->asyncDev;
2636
                    ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
2637
                    if (ret != 0)
2638
                        break;
2639
                #endif
2640
2641
0
                    nonceSz = AESGCM_NONCE_SZ;
2642
2643
                #if defined(HAVE_PK_CALLBACKS)
2644
                    ret = NOT_COMPILED_IN;
2645
                    if (ssl->ctx && ssl->ctx->PerformTlsRecordProcessingCb) {
2646
                        ret = ssl->ctx->PerformTlsRecordProcessingCb(ssl, 1,
2647
                                  output, input, dataSz,
2648
                                  ssl->encrypt.nonce, nonceSz,
2649
                                  output + dataSz, macSz,
2650
                                  aad, aadSz);
2651
                    }
2652
                    if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN))
2653
                #endif
2654
0
                    {
2655
2656
                #if ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
2657
                    (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
2658
                        ret = wc_AesGcmEncrypt(ssl->encrypt.aes, output, input,
2659
                            dataSz, ssl->encrypt.nonce, nonceSz,
2660
                            output + dataSz, macSz, aad, aadSz);
2661
                #else
2662
0
                        ret = wc_AesGcmSetExtIV(ssl->encrypt.aes,
2663
0
                                ssl->encrypt.nonce, nonceSz);
2664
0
                        if (ret == 0) {
2665
0
                            ret = wc_AesGcmEncrypt_ex(ssl->encrypt.aes, output,
2666
0
                                    input, dataSz, ssl->encrypt.nonce, nonceSz,
2667
0
                                    output + dataSz, macSz, aad, aadSz);
2668
0
                        }
2669
0
                #endif
2670
0
                    }
2671
0
                    break;
2672
0
            #endif
2673
2674
0
            #ifdef HAVE_AESCCM
2675
0
                case wolfssl_aes_ccm:
2676
                #ifdef WOLFSSL_ASYNC_CRYPT
2677
                    /* initialize event */
2678
                    asyncDev = &ssl->encrypt.aes->asyncDev;
2679
                    ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
2680
                    if (ret != 0)
2681
                        break;
2682
                #endif
2683
2684
0
                    nonceSz = AESCCM_NONCE_SZ;
2685
                #if defined(HAVE_PK_CALLBACKS)
2686
                    ret = NOT_COMPILED_IN;
2687
                    if (ssl->ctx && ssl->ctx->PerformTlsRecordProcessingCb) {
2688
                        ret = ssl->ctx->PerformTlsRecordProcessingCb(ssl, 1,
2689
                                  output, input, dataSz,
2690
                                  ssl->encrypt.nonce, nonceSz,
2691
                                  output + dataSz, macSz,
2692
                                  aad, aadSz);
2693
                    }
2694
                    if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN))
2695
                #endif
2696
0
                    {
2697
                #if ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
2698
                    (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
2699
                        ret = wc_AesCcmEncrypt(ssl->encrypt.aes, output, input,
2700
                            dataSz, ssl->encrypt.nonce, nonceSz,
2701
                            output + dataSz, macSz, aad, aadSz);
2702
                #else
2703
0
                        ret = wc_AesCcmSetNonce(ssl->encrypt.aes,
2704
0
                                ssl->encrypt.nonce, nonceSz);
2705
0
                        if (ret == 0) {
2706
0
                            ret = wc_AesCcmEncrypt_ex(ssl->encrypt.aes, output,
2707
0
                                    input, dataSz, ssl->encrypt.nonce, nonceSz,
2708
0
                                    output + dataSz, macSz, aad, aadSz);
2709
0
                        }
2710
0
                #endif
2711
0
                    }
2712
0
                    break;
2713
0
            #endif
2714
2715
0
            #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
2716
0
                case wolfssl_chacha:
2717
0
                    ret = ChaCha20Poly1305_Encrypt(ssl, output, input, dataSz,
2718
0
                        ssl->encrypt.nonce, aad, aadSz, output + dataSz);
2719
0
                    break;
2720
0
            #endif
2721
2722
0
            #ifdef WOLFSSL_SM4_GCM
2723
0
                case wolfssl_sm4_gcm:
2724
0
                    nonceSz = SM4_GCM_NONCE_SZ;
2725
0
                    ret = wc_Sm4GcmEncrypt(ssl->encrypt.sm4, output, input,
2726
0
                        dataSz, ssl->encrypt.nonce, nonceSz, output + dataSz,
2727
0
                        macSz, aad, aadSz);
2728
0
                    break;
2729
0
            #endif
2730
2731
0
            #ifdef WOLFSSL_SM4_CCM
2732
0
                case wolfssl_sm4_ccm:
2733
0
                    nonceSz = SM4_CCM_NONCE_SZ;
2734
0
                    ret = wc_Sm4CcmEncrypt(ssl->encrypt.sm4, output, input,
2735
0
                        dataSz, ssl->encrypt.nonce, nonceSz, output + dataSz,
2736
0
                        macSz, aad, aadSz);
2737
0
                    break;
2738
0
            #endif
2739
2740
            #ifdef HAVE_NULL_CIPHER
2741
                case wolfssl_cipher_null:
2742
                    ret = Tls13IntegrityOnly_Encrypt(ssl, output, input, dataSz,
2743
                        ssl->encrypt.nonce, aad, aadSz, output + dataSz);
2744
                    break;
2745
            #endif
2746
2747
0
                default:
2748
0
                    WOLFSSL_MSG("wolfSSL Encrypt programming error");
2749
0
                    return ENCRYPT_ERROR;
2750
0
            }
2751
2752
            /* Advance state */
2753
0
            ssl->encrypt.state = CIPHER_STATE_END;
2754
2755
        #ifdef WOLFSSL_ASYNC_CRYPT
2756
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
2757
                /* if async is not okay, then block */
2758
                if (!asyncOkay) {
2759
                    ret = wc_AsyncWait(ret, asyncDev, event_flags);
2760
                }
2761
                else {
2762
                    /* If pending, then leave and return will resume below */
2763
                    return wolfSSL_AsyncPush(ssl, asyncDev);
2764
                }
2765
            }
2766
        #endif
2767
0
        }
2768
0
        FALL_THROUGH;
2769
2770
0
        case CIPHER_STATE_END:
2771
0
        {
2772
        #ifdef WOLFSSL_DEBUG_TLS
2773
            #ifdef CIPHER_NONCE
2774
                WOLFSSL_MSG("Nonce");
2775
                WOLFSSL_BUFFER(ssl->encrypt.nonce, ssl->specs.iv_size);
2776
            #endif
2777
                WOLFSSL_MSG("Encrypted data");
2778
                WOLFSSL_BUFFER(output, dataSz);
2779
                WOLFSSL_MSG("Authentication Tag");
2780
                WOLFSSL_BUFFER(output + dataSz, macSz);
2781
        #endif
2782
2783
        #ifdef WOLFSSL_CIPHER_TEXT_CHECK
2784
            if (ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null &&
2785
                XMEMCMP(output, ssl->encrypt.sanityCheck,
2786
                    min(dataSz, sizeof(ssl->encrypt.sanityCheck))) == 0) {
2787
2788
                WOLFSSL_MSG("EncryptTls13 sanity check failed! Glitch?");
2789
                return ENCRYPT_ERROR;
2790
            }
2791
            ForceZero(ssl->encrypt.sanityCheck,
2792
                sizeof(ssl->encrypt.sanityCheck));
2793
        #endif
2794
        #ifdef WOLFSSL_CHECK_MEM_ZERO
2795
            if ((ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) &&
2796
                    (output != input) && (ret == 0)) {
2797
                wc_MemZero_Add("TLS 1.3 Encrypt plaintext", input, sz);
2798
            }
2799
        #endif
2800
2801
0
        #ifdef CIPHER_NONCE
2802
0
            ForceZero(ssl->encrypt.nonce, AEAD_NONCE_SZ);
2803
0
        #endif
2804
2805
0
            break;
2806
0
        }
2807
2808
0
        default:
2809
0
            break;
2810
0
    }
2811
2812
2813
    /* Reset state */
2814
0
    ssl->encrypt.state = CIPHER_STATE_BEGIN;
2815
2816
0
    return ret;
2817
0
}
2818
2819
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
2820
/* Decrypt with ChaCha20 and check authentication tag with Poly1305.
2821
 *
2822
 * ssl     The SSL/TLS object.
2823
 * output  The buffer to write decrypted data into.
2824
 *         May be the same pointer as input.
2825
 * input   The data to decrypt.
2826
 * sz      The number of bytes to decrypt.
2827
 * nonce   The nonce to use with ChaCha20.
2828
 * aad     The additional authentication data.
2829
 * aadSz   The size of the addition authentication data.
2830
 * tagIn   The authentication tag data from packet.
2831
 * returns 0 on success, otherwise failure.
2832
 */
2833
static int ChaCha20Poly1305_Decrypt(WOLFSSL* ssl, byte* output,
2834
                                    const byte* input, word16 sz, byte* nonce,
2835
                                    const byte* aad, word16 aadSz,
2836
                                    const byte* tagIn)
2837
2.31k
{
2838
2.31k
    int ret;
2839
2.31k
    byte tag[POLY1305_AUTH_SZ];
2840
2.31k
    byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for mac */
2841
2842
    /* Poly1305 key is 256 bits of zero encrypted with ChaCha20. */
2843
2.31k
    XMEMSET(poly, 0, sizeof(poly));
2844
2845
    /* Set nonce and get Poly1305 key. */
2846
2.31k
    ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 0);
2847
2.31k
    if (ret != 0)
2848
0
        return ret;
2849
    /* Use ChaCha20 keystream to get Poly1305 key for tag. */
2850
2.31k
    ret = wc_Chacha_Process(ssl->decrypt.chacha, poly, poly, sizeof(poly));
2851
2.31k
    if (ret != 0)
2852
0
        return ret;
2853
#ifdef WOLFSSL_CHECK_MEM_ZERO
2854
    wc_MemZero_Add("ChaCha20Poly1305_Decrypt poly", poly, sizeof(poly));
2855
#endif
2856
2.31k
    ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 1);
2857
2.31k
    if (ret != 0) {
2858
0
        ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
2859
    #ifdef WOLFSSL_CHECK_MEM_ZERO
2860
        wc_MemZero_Check(poly, sizeof(poly));
2861
    #endif
2862
0
        return ret;
2863
0
    }
2864
2865
    /* Set key for Poly1305. */
2866
2.31k
    ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly, sizeof(poly));
2867
2.31k
    ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
2868
#ifdef WOLFSSL_CHECK_MEM_ZERO
2869
    wc_MemZero_Check(poly, sizeof(poly));
2870
#endif
2871
2.31k
    if (ret != 0)
2872
0
        return ret;
2873
    /* Generate authentication tag for encrypted data. */
2874
2.31k
    if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, aad, aadSz, input, sz, tag,
2875
2.31k
                                                           sizeof(tag))) != 0) {
2876
0
        return ret;
2877
0
    }
2878
2879
    /* Check tag sent along with packet. */
2880
2.31k
    if (ConstantCompare(tagIn, tag, POLY1305_AUTH_SZ) != 0) {
2881
2.31k
        WOLFSSL_MSG("MAC did not match");
2882
2.31k
        return VERIFY_MAC_ERROR;
2883
2.31k
    }
2884
2885
    /* If the tag was good decrypt message. */
2886
0
    ret = wc_Chacha_Process(ssl->decrypt.chacha, output, input, sz);
2887
2888
0
    return ret;
2889
2.31k
}
2890
#endif
2891
2892
#ifdef HAVE_NULL_CIPHER
2893
/* Check HMAC tag and copy over input.
2894
 *
2895
 * ssl     The SSL/TLS object.
2896
 * output  The buffer to copy data into.
2897
 *         May be the same pointer as input.
2898
 * input   The data.
2899
 * sz      The number of bytes of data.
2900
 * nonce   The nonce to use with authentication.
2901
 * aad     The additional authentication data.
2902
 * aadSz   The size of the addition authentication data.
2903
 * tagIn   The authentication tag data from packet.
2904
 * returns 0 on success, otherwise failure.
2905
 */
2906
static int Tls13IntegrityOnly_Decrypt(WOLFSSL* ssl, byte* output,
2907
                                      const byte* input, word16 sz,
2908
                                      const byte* nonce,
2909
                                      const byte* aad, word16 aadSz,
2910
                                      const byte* tagIn)
2911
{
2912
    int ret;
2913
    byte hmac[WC_MAX_DIGEST_SIZE];
2914
2915
    /* HMAC: nonce | aad | input  */
2916
    ret = wc_HmacUpdate(ssl->decrypt.hmac, nonce, HMAC_NONCE_SZ);
2917
    if (ret == 0)
2918
        ret = wc_HmacUpdate(ssl->decrypt.hmac, aad, aadSz);
2919
    if (ret == 0)
2920
        ret = wc_HmacUpdate(ssl->decrypt.hmac, input, sz);
2921
    if (ret == 0)
2922
        ret = wc_HmacFinal(ssl->decrypt.hmac, hmac);
2923
    /* Check authentication tag matches */
2924
    if (ret == 0 && ConstantCompare(tagIn, hmac, ssl->specs.hash_size) != 0)
2925
        ret = DECRYPT_ERROR;
2926
    /* Copy the input to output if not the same buffer */
2927
    if (ret == 0 && output != input)
2928
        XMEMCPY(output, input, sz);
2929
    return ret;
2930
}
2931
#endif
2932
2933
/* Decrypt data for TLS v1.3.
2934
 *
2935
 * ssl     The SSL/TLS object.
2936
 * output  The buffer to write decrypted data into.
2937
 *         May be the same pointer as input.
2938
 * input   The data to decrypt and authentication tag.
2939
 * sz      The length of the encrypted data plus authentication tag.
2940
 * aad     The additional authentication data.
2941
 * aadSz   The size of the addition authentication data.
2942
 * returns 0 on success, otherwise failure.
2943
 */
2944
int DecryptTls13(WOLFSSL* ssl, byte* output, const byte* input, word16 sz,
2945
                 const byte* aad, word16 aadSz)
2946
{
2947
    int    ret    = 0;
2948
    word16 dataSz = sz - ssl->specs.aead_mac_size;
2949
    word16 macSz  = ssl->specs.aead_mac_size;
2950
    word32 nonceSz = 0;
2951
2952
    WOLFSSL_ENTER("DecryptTls13");
2953
2954
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
2955
    ret = tsip_Tls13AesDecrypt(ssl, output, input, sz);
2956
2957
    if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
2958
        #ifndef WOLFSSL_EARLY_DATA
2959
        if (ret < 0) {
2960
            ret = VERIFY_MAC_ERROR;
2961
            WOLFSSL_ERROR_VERBOSE(ret);
2962
        }
2963
        #endif
2964
        return ret;
2965
    }
2966
#endif
2967
2968
#ifdef WOLFSSL_ASYNC_CRYPT
2969
    ret = wolfSSL_AsyncPop(ssl, &ssl->decrypt.state);
2970
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
2971
        /* check for still pending */
2972
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
2973
            return ret;
2974
2975
        ssl->error = 0; /* clear async */
2976
2977
        /* let failures through so CIPHER_STATE_END logic is run */
2978
    }
2979
    else
2980
#endif
2981
    {
2982
        /* Reset state */
2983
        ret = 0;
2984
        ssl->decrypt.state = CIPHER_STATE_BEGIN;
2985
    }
2986
2987
    (void)output;
2988
    (void)input;
2989
    (void)sz;
2990
    (void)dataSz;
2991
    (void)macSz;
2992
    (void)nonceSz;
2993
2994
    switch (ssl->decrypt.state) {
2995
        case CIPHER_STATE_BEGIN:
2996
        {
2997
        #ifdef WOLFSSL_DEBUG_TLS
2998
            WOLFSSL_MSG("Data to decrypt");
2999
            WOLFSSL_BUFFER(input, dataSz);
3000
            WOLFSSL_MSG("Additional Authentication Data");
3001
            WOLFSSL_BUFFER(aad, aadSz);
3002
            WOLFSSL_MSG("Authentication tag");
3003
            WOLFSSL_BUFFER(input + dataSz, macSz);
3004
        #endif
3005
3006
        #ifdef CIPHER_NONCE
3007
            if (ssl->decrypt.nonce == NULL) {
3008
                ssl->decrypt.nonce = (byte*)XMALLOC(AEAD_NONCE_SZ,
3009
                                                ssl->heap, DYNAMIC_TYPE_CIPHER);
3010
            #ifdef WOLFSSL_CHECK_MEM_ZERO
3011
                if (ssl->decrypt.nonce != NULL) {
3012
                    wc_MemZero_Add("DecryptTls13 nonce", ssl->decrypt.nonce,
3013
                        AEAD_NONCE_SZ);
3014
                }
3015
            #endif
3016
            }
3017
            if (ssl->decrypt.nonce == NULL)
3018
                return MEMORY_E;
3019
3020
            BuildTls13Nonce(ssl, ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
3021
                            PEER_ORDER);
3022
        #endif
3023
3024
            /* Advance state and proceed */
3025
            ssl->decrypt.state = CIPHER_STATE_DO;
3026
        }
3027
        FALL_THROUGH;
3028
3029
        case CIPHER_STATE_DO:
3030
        {
3031
            switch (ssl->specs.bulk_cipher_algorithm) {
3032
            #ifdef BUILD_AESGCM
3033
                case wolfssl_aes_gcm:
3034
                #ifdef WOLFSSL_ASYNC_CRYPT
3035
                    /* initialize event */
3036
                    ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
3037
                        WC_ASYNC_FLAG_NONE);
3038
                    if (ret != 0)
3039
                        break;
3040
                #endif
3041
3042
                    nonceSz = AESGCM_NONCE_SZ;
3043
3044
                #if defined(HAVE_PK_CALLBACKS)
3045
                    ret = NOT_COMPILED_IN;
3046
                    if (ssl->ctx && ssl->ctx->PerformTlsRecordProcessingCb) {
3047
                        ret = ssl->ctx->PerformTlsRecordProcessingCb(ssl, 0,
3048
                                  output, input, dataSz,
3049
                                  ssl->decrypt.nonce, nonceSz,
3050
                                  (byte *)(input + dataSz), macSz,
3051
                                  aad, aadSz);
3052
                    }
3053
                    if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN))
3054
                #endif
3055
                    {
3056
3057
                        ret = wc_AesGcmDecrypt(ssl->decrypt.aes, output, input,
3058
                            dataSz, ssl->decrypt.nonce, nonceSz,
3059
                            input + dataSz, macSz, aad, aadSz);
3060
3061
                #ifdef WOLFSSL_ASYNC_CRYPT
3062
                        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
3063
                            ret = wolfSSL_AsyncPush(ssl,
3064
                                &ssl->decrypt.aes->asyncDev);
3065
                        }
3066
                #endif
3067
3068
                    }
3069
                    break;
3070
            #endif
3071
3072
            #ifdef HAVE_AESCCM
3073
                case wolfssl_aes_ccm:
3074
                #ifdef WOLFSSL_ASYNC_CRYPT
3075
                    /* initialize event */
3076
                    ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
3077
                        WC_ASYNC_FLAG_NONE);
3078
                    if (ret != 0)
3079
                        break;
3080
                #endif
3081
3082
                    nonceSz = AESCCM_NONCE_SZ;
3083
                #if defined(HAVE_PK_CALLBACKS)
3084
                    ret = NOT_COMPILED_IN;
3085
                    if (ssl->ctx && ssl->ctx->PerformTlsRecordProcessingCb) {
3086
                        ret = ssl->ctx->PerformTlsRecordProcessingCb(ssl, 0,
3087
                                  output, input, dataSz,
3088
                                  ssl->decrypt.nonce, nonceSz,
3089
                                  (byte *)(input + dataSz), macSz,
3090
                                  aad, aadSz);
3091
                    }
3092
                    if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN))
3093
                #endif
3094
                    {
3095
                        ret = wc_AesCcmDecrypt(ssl->decrypt.aes, output, input,
3096
                            dataSz, ssl->decrypt.nonce, nonceSz,
3097
                            input + dataSz, macSz, aad, aadSz);
3098
                #ifdef WOLFSSL_ASYNC_CRYPT
3099
                        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
3100
                            ret = wolfSSL_AsyncPush(ssl,
3101
                                &ssl->decrypt.aes->asyncDev);
3102
                        }
3103
                #endif
3104
                    }
3105
                    break;
3106
            #endif
3107
3108
            #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
3109
                case wolfssl_chacha:
3110
                    ret = ChaCha20Poly1305_Decrypt(ssl, output, input, dataSz,
3111
                        ssl->decrypt.nonce, aad, aadSz, input + dataSz);
3112
                    break;
3113
            #endif
3114
3115
            #ifdef WOLFSSL_SM4_GCM
3116
                case wolfssl_sm4_gcm:
3117
                    nonceSz = SM4_GCM_NONCE_SZ;
3118
                    ret = wc_Sm4GcmDecrypt(ssl->decrypt.sm4, output, input,
3119
                        dataSz, ssl->decrypt.nonce, nonceSz, output + dataSz,
3120
                        macSz, aad, aadSz);
3121
                    break;
3122
            #endif
3123
3124
            #ifdef WOLFSSL_SM4_CCM
3125
                case wolfssl_sm4_ccm:
3126
                    nonceSz = SM4_CCM_NONCE_SZ;
3127
                    ret = wc_Sm4CcmDecrypt(ssl->decrypt.sm4, output, input,
3128
                        dataSz, ssl->decrypt.nonce, nonceSz, output + dataSz,
3129
                        macSz, aad, aadSz);
3130
                    break;
3131
            #endif
3132
3133
            #ifdef HAVE_NULL_CIPHER
3134
                case wolfssl_cipher_null:
3135
                    ret = Tls13IntegrityOnly_Decrypt(ssl, output, input, dataSz,
3136
                        ssl->decrypt.nonce, aad, aadSz, input + dataSz);
3137
                    break;
3138
            #endif
3139
                default:
3140
                    WOLFSSL_MSG("wolfSSL Decrypt programming error");
3141
                    return DECRYPT_ERROR;
3142
            }
3143
3144
            /* Advance state */
3145
            ssl->decrypt.state = CIPHER_STATE_END;
3146
3147
        #ifdef WOLFSSL_ASYNC_CRYPT
3148
            /* If pending, leave now */
3149
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
3150
                return ret;
3151
            }
3152
        #endif
3153
        }
3154
        FALL_THROUGH;
3155
3156
        case CIPHER_STATE_END:
3157
        {
3158
        #ifdef WOLFSSL_DEBUG_TLS
3159
            #ifdef CIPHER_NONCE
3160
                WOLFSSL_MSG("Nonce");
3161
                WOLFSSL_BUFFER(ssl->decrypt.nonce, ssl->specs.iv_size);
3162
            #endif
3163
                WOLFSSL_MSG("Decrypted data");
3164
                WOLFSSL_BUFFER(output, dataSz);
3165
        #endif
3166
        #ifdef WOLFSSL_CHECK_MEM_ZERO
3167
            if ((ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) &&
3168
                    (ret == 0)) {
3169
                wc_MemZero_Add("TLS 1.3 Decrypted data", output, sz);
3170
            }
3171
        #endif
3172
3173
        #ifdef CIPHER_NONCE
3174
            ForceZero(ssl->decrypt.nonce, AEAD_NONCE_SZ);
3175
        #endif
3176
3177
            break;
3178
        }
3179
3180
       default:
3181
            break;
3182
    }
3183
3184
    if (ret < 0) {
3185
        WOLFSSL_ERROR_VERBOSE(ret);
3186
    }
3187
3188
    return ret;
3189
}
3190
3191
/* Persistable BuildTls13Message arguments */
3192
typedef struct BuildMsg13Args {
3193
    word32 sz;
3194
    word32 idx;
3195
    word32 headerSz;
3196
    word16 size;
3197
    word32 paddingSz;
3198
} BuildMsg13Args;
3199
3200
static void FreeBuildMsg13Args(WOLFSSL* ssl, void* pArgs)
3201
2.18k
{
3202
2.18k
    BuildMsg13Args* args = (BuildMsg13Args*)pArgs;
3203
3204
2.18k
    (void)ssl;
3205
2.18k
    (void)args;
3206
3207
    /* no allocations in BuildTls13Message */
3208
2.18k
}
3209
3210
/* Build SSL Message, encrypted.
3211
 * TLS v1.3 encryption is AEAD only.
3212
 *
3213
 * ssl         The SSL/TLS object.
3214
 * output      The buffer to write record message to.
3215
 * outSz       Size of the buffer being written into.
3216
 * input       The record data to encrypt (excluding record header).
3217
 * inSz        The size of the record data.
3218
 * type        The recorder header content type.
3219
 * hashOutput  Whether to hash the unencrypted record data.
3220
 * sizeOnly    Only want the size of the record message.
3221
 * asyncOkay   If non-zero can return WC_PENDING_E, otherwise blocks on crypto
3222
 * returns the size of the encrypted record message or negative value on error.
3223
 */
3224
int BuildTls13Message(WOLFSSL* ssl, byte* output, int outSz, const byte* input,
3225
                int inSz, int type, int hashOutput, int sizeOnly, int asyncOkay)
3226
{
3227
    int ret;
3228
    BuildMsg13Args* args;
3229
    BuildMsg13Args  lcl_args;
3230
3231
    WOLFSSL_ENTER("BuildTls13Message");
3232
3233
#ifdef WOLFSSL_ASYNC_CRYPT
3234
    ret = WC_NO_PENDING_E;
3235
    if (asyncOkay) {
3236
        WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
3237
3238
        if (ssl->async == NULL) {
3239
            ssl->async = (struct WOLFSSL_ASYNC*)
3240
                    XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
3241
                            DYNAMIC_TYPE_ASYNC);
3242
            if (ssl->async == NULL)
3243
                return MEMORY_E;
3244
        }
3245
        args = (BuildMsg13Args*)ssl->async->args;
3246
3247
        ret = wolfSSL_AsyncPop(ssl, &ssl->options.buildMsgState);
3248
        if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
3249
            /* Check for error */
3250
            if (ret < 0)
3251
                goto exit_buildmsg;
3252
        }
3253
    }
3254
    else
3255
#endif
3256
    {
3257
        args = &lcl_args;
3258
    }
3259
3260
    /* Reset state */
3261
#ifdef WOLFSSL_ASYNC_CRYPT
3262
    if (ret == WC_NO_ERR_TRACE(WC_NO_PENDING_E))
3263
#endif
3264
    {
3265
        ret = 0;
3266
        ssl->options.buildMsgState = BUILD_MSG_BEGIN;
3267
        XMEMSET(args, 0, sizeof(BuildMsg13Args));
3268
3269
        args->headerSz = RECORD_HEADER_SZ;
3270
#ifdef WOLFSSL_DTLS13
3271
        if (ssl->options.dtls)
3272
            args->headerSz = Dtls13GetRlHeaderLength(ssl, 1);
3273
#endif /* WOLFSSL_DTLS13 */
3274
3275
        args->sz = args->headerSz + (word32)inSz;
3276
        args->idx  = args->headerSz;
3277
3278
    #ifdef WOLFSSL_ASYNC_CRYPT
3279
        if (asyncOkay)
3280
            ssl->async->freeArgs = FreeBuildMsg13Args;
3281
    #endif
3282
    }
3283
3284
    switch (ssl->options.buildMsgState) {
3285
        case BUILD_MSG_BEGIN:
3286
        {
3287
           /* catch mistaken sizeOnly parameter */
3288
            if (sizeOnly) {
3289
                if (output || input) {
3290
                    WOLFSSL_MSG("BuildTls13Message with sizeOnly "
3291
                                "doesn't need input or output");
3292
                    return BAD_FUNC_ARG;
3293
                }
3294
            }
3295
            else if (output == NULL || input == NULL) {
3296
                return BAD_FUNC_ARG;
3297
            }
3298
3299
            /* Record layer content type at the end of record data. */
3300
            args->sz++;
3301
            /* Authentication data at the end. */
3302
            args->sz += ssl->specs.aead_mac_size;
3303
#ifdef WOLFSSL_DTLS13
3304
            /* Pad to minimum length */
3305
            if (ssl->options.dtls &&
3306
                    args->sz < (word32)Dtls13MinimumRecordLength(ssl)) {
3307
                args->paddingSz = Dtls13MinimumRecordLength(ssl) - args->sz;
3308
                args->sz = Dtls13MinimumRecordLength(ssl);
3309
            }
3310
#endif
3311
            if (sizeOnly)
3312
                return (int)args->sz;
3313
3314
            if (args->sz > (word32)outSz) {
3315
                WOLFSSL_MSG("Oops, want to write past output buffer size");
3316
                return BUFFER_E;
3317
            }
3318
3319
            /* Record data length. */
3320
            args->size = (word16)(args->sz - args->headerSz);
3321
            /* Write/update the record header with the new size.
3322
             * Always have the content type as application data for encrypted
3323
             * messages in TLS v1.3.
3324
             */
3325
3326
            if (ssl->options.dtls) {
3327
#ifdef WOLFSSL_DTLS13
3328
                Dtls13RlAddCiphertextHeader(ssl, output, args->size);
3329
#endif /* WOLFSSL_DTLS13 */
3330
            }
3331
            else {
3332
                AddTls13RecordHeader(output, args->size, application_data, ssl);
3333
            }
3334
3335
            /* TLS v1.3 can do in place encryption. */
3336
            if (input != output + args->idx)
3337
                XMEMCPY(output + args->idx, input, (size_t)inSz);
3338
            args->idx += (word32)inSz;
3339
3340
            ssl->options.buildMsgState = BUILD_MSG_HASH;
3341
        }
3342
        FALL_THROUGH;
3343
3344
        case BUILD_MSG_HASH:
3345
        {
3346
            if (hashOutput) {
3347
                ret = HashOutput(ssl, output, (int)args->headerSz + inSz, 0);
3348
                if (ret != 0)
3349
                    goto exit_buildmsg;
3350
            }
3351
3352
            /* The real record content type goes at the end of the data. */
3353
            output[args->idx++] = (byte)type;
3354
            /* Double check that any necessary padding is zero'd out */
3355
            XMEMSET(output + args->idx, 0, args->paddingSz);
3356
            args->idx += args->paddingSz;
3357
3358
            ssl->options.buildMsgState = BUILD_MSG_ENCRYPT;
3359
        }
3360
        FALL_THROUGH;
3361
3362
        case BUILD_MSG_ENCRYPT:
3363
        {
3364
#ifdef WOLFSSL_QUIC
3365
            if (WOLFSSL_IS_QUIC(ssl)) {
3366
                /* QUIC does not use encryption of the TLS Record Layer.
3367
                 * Return the original length + added headers
3368
                 * and restore it in the record header. */
3369
                AddTls13RecordHeader(output, (word32)inSz, (byte)type, ssl);
3370
                ret = (int)args->headerSz + inSz;
3371
                goto exit_buildmsg;
3372
            }
3373
#endif
3374
        #ifdef ATOMIC_USER
3375
            if (ssl->ctx->MacEncryptCb) {
3376
                /* User Record Layer Callback handling */
3377
                byte* mac = output + args->idx;
3378
                output += args->headerSz;
3379
3380
                ret = ssl->ctx->MacEncryptCb(ssl, mac, output, (unsigned int)inSz, (byte)type, 0,
3381
                        output, output, args->size, ssl->MacEncryptCtx);
3382
            }
3383
            else
3384
        #endif
3385
            {
3386
                const byte* aad = output;
3387
                output += args->headerSz;
3388
                ret = EncryptTls13(ssl, output, output, args->size, aad,
3389
                                   (word16)args->headerSz, asyncOkay);
3390
                if (ret != 0) {
3391
                #ifdef WOLFSSL_ASYNC_CRYPT
3392
                    if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
3393
                #endif
3394
                    {
3395
                        /* Zeroize plaintext. */
3396
                        ForceZero(output, args->size);
3397
                    }
3398
                }
3399
#ifdef WOLFSSL_DTLS13
3400
                if (ret == 0 && ssl->options.dtls) {
3401
                    /* AAD points to the header. Reuse the variable  */
3402
                    ret = Dtls13EncryptRecordNumber(ssl, (byte*)aad,
3403
                                                    (word16)args->sz);
3404
                }
3405
#endif /* WOLFSSL_DTLS13 */
3406
            }
3407
            break;
3408
        }
3409
3410
        default:
3411
            break;
3412
    }
3413
3414
exit_buildmsg:
3415
3416
    WOLFSSL_LEAVE("BuildTls13Message", ret);
3417
3418
#ifdef WOLFSSL_ASYNC_CRYPT
3419
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
3420
        return ret;
3421
    }
3422
#endif
3423
3424
    /* make sure build message state is reset */
3425
    ssl->options.buildMsgState = BUILD_MSG_BEGIN;
3426
3427
    /* return sz on success */
3428
    if (ret == 0) {
3429
        ret = (int)args->sz;
3430
    }
3431
    else {
3432
        WOLFSSL_ERROR_VERBOSE(ret);
3433
    }
3434
3435
    /* Final cleanup */
3436
#ifdef WOLFSSL_ASYNC_CRYPT
3437
    if (asyncOkay)
3438
        FreeAsyncCtx(ssl, 0);
3439
    else
3440
#endif
3441
        FreeBuildMsg13Args(ssl, args);
3442
3443
    return ret;
3444
}
3445
3446
#if !defined(NO_WOLFSSL_CLIENT) || (!defined(NO_WOLFSSL_SERVER) && \
3447
    (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)) && \
3448
    (defined(WOLFSSL_PSK_ONE_ID) || defined(WOLFSSL_PRIORITIZE_PSK)))
3449
/* Find the cipher suite in the suites set in the SSL.
3450
 *
3451
 * ssl    SSL/TLS object.
3452
 * suite  Cipher suite to look for.
3453
 * returns 1 when suite is found in SSL/TLS object's list and 0 otherwise.
3454
 */
3455
int FindSuiteSSL(const WOLFSSL* ssl, byte* suite)
3456
80
{
3457
80
    word16 i;
3458
80
    const Suites* suites = WOLFSSL_SUITES(ssl);
3459
3460
648
    for (i = 0; i < suites->suiteSz; i += 2) {
3461
642
        if (suites->suites[i+0] == suite[0] &&
3462
235
                suites->suites[i+1] == suite[1]) {
3463
74
            return 1;
3464
74
        }
3465
642
    }
3466
3467
6
    return 0;
3468
80
}
3469
#endif
3470
3471
#ifndef NO_PSK
3472
/* Get the MAC algorithm for the TLS 1.3 cipher suite.
3473
 *
3474
 * @param [in] suite.
3475
 * @return  A value from wc_MACAlgorithm enumeration.
3476
 */
3477
byte SuiteMac(const byte* suite)
3478
{
3479
    byte mac = no_mac;
3480
3481
    if (suite[0] == TLS13_BYTE) {
3482
        switch (suite[1]) {
3483
        #ifdef BUILD_TLS_AES_128_GCM_SHA256
3484
            case TLS_AES_128_GCM_SHA256:
3485
                mac = sha256_mac;
3486
                break;
3487
        #endif
3488
        #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
3489
            case TLS_CHACHA20_POLY1305_SHA256:
3490
                mac = sha256_mac;
3491
                break;
3492
        #endif
3493
        #ifdef BUILD_TLS_AES_128_CCM_SHA256
3494
            case TLS_AES_128_CCM_SHA256:
3495
                mac = sha256_mac;
3496
                break;
3497
        #endif
3498
        #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
3499
            case TLS_AES_128_CCM_8_SHA256:
3500
                mac = sha256_mac;
3501
                break;
3502
        #endif
3503
        #ifdef BUILD_TLS_AES_256_GCM_SHA384
3504
            case TLS_AES_256_GCM_SHA384:
3505
                mac = sha384_mac;
3506
                break;
3507
        #endif
3508
            default:
3509
                break;
3510
        }
3511
    }
3512
#if (defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
3513
     defined(WOLFSSL_SM3)
3514
    else if (suite[0] == CIPHER_BYTE) {
3515
        switch (suite[1]) {
3516
        #ifdef BUILD_TLS_SM4_GCM_SM3
3517
            case TLS_SM4_GCM_SM3:
3518
                mac = sm3_mac;
3519
                break;
3520
        #endif
3521
        #ifdef BUILD_TLS_SM4_CCM_SM3
3522
            case TLS_SM4_CCM_SM3:
3523
                mac = sm3_mac;
3524
                break;
3525
        #endif
3526
            default:
3527
                break;
3528
        }
3529
    }
3530
#endif
3531
#ifdef HAVE_NULL_CIPHER
3532
    else if (suite[0] == ECC_BYTE) {
3533
        switch (suite[1]) {
3534
        #ifdef BUILD_TLS_SHA256_SHA256
3535
            case TLS_SHA256_SHA256:
3536
                mac = sha256_mac;
3537
                break;
3538
        #endif
3539
        #ifdef BUILD_TLS_SHA384_SHA384
3540
            case TLS_SHA384_SHA384:
3541
                mac = sha384_mac;
3542
                break;
3543
        #endif
3544
            default:
3545
                break;
3546
        }
3547
    }
3548
#endif
3549
3550
    return mac;
3551
}
3552
#endif
3553
3554
#if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
3555
/* Create Cookie extension using the hash of the first ClientHello.
3556
 *
3557
 * ssl     SSL/TLS object.
3558
 * hash    The hash data.
3559
 * hashSz  The size of the hash data in bytes.
3560
 * returns 0 on success, otherwise failure.
3561
 */
3562
int CreateCookieExt(const WOLFSSL* ssl, byte* hash, word16 hashSz,
3563
                    TLSX** exts, byte cipherSuite0, byte cipherSuite)
3564
{
3565
    int  ret;
3566
    byte mac[WC_MAX_DIGEST_SIZE] = {0};
3567
    Hmac cookieHmac;
3568
    byte cookieType = 0;
3569
    byte macSz = 0;
3570
    byte cookie[OPAQUE8_LEN + WC_MAX_DIGEST_SIZE + OPAQUE16_LEN * 2];
3571
    TLSX* ext;
3572
    word16 cookieSz = 0;
3573
3574
    if (hash == NULL || hashSz == 0) {
3575
        return BAD_FUNC_ARG;
3576
    }
3577
3578
    if (ssl->buffers.tls13CookieSecret.buffer == NULL ||
3579
            ssl->buffers.tls13CookieSecret.length == 0) {
3580
        WOLFSSL_MSG("Missing DTLS 1.3 cookie secret");
3581
        return COOKIE_ERROR;
3582
    }
3583
3584
    /* Cookie Data = Hash Len | Hash | CS | KeyShare Group */
3585
    cookie[cookieSz++] = (byte)hashSz;
3586
    XMEMCPY(cookie + cookieSz, hash, hashSz);
3587
    cookieSz += hashSz;
3588
    cookie[cookieSz++] = cipherSuite0;
3589
    cookie[cookieSz++] = cipherSuite;
3590
    if ((ext = TLSX_Find(*exts, TLSX_KEY_SHARE)) != NULL) {
3591
        KeyShareEntry* kse = (KeyShareEntry*)ext->data;
3592
        if (kse == NULL) {
3593
            WOLFSSL_MSG("KeyShareEntry can't be empty when negotiating "
3594
                        "parameters");
3595
            return BAD_STATE_E;
3596
        }
3597
        c16toa(kse->group, cookie + cookieSz);
3598
        cookieSz += OPAQUE16_LEN;
3599
    }
3600
3601
#ifndef NO_SHA256
3602
    cookieType = WC_SHA256;
3603
    macSz = WC_SHA256_DIGEST_SIZE;
3604
#elif defined(WOLFSSL_SHA384)
3605
    cookieType = WC_SHA384;
3606
    macSz = WC_SHA384_DIGEST_SIZE;
3607
#elif defined(WOLFSSL_TLS13_SHA512)
3608
    cookieType = WC_SHA512;
3609
    macSz = WC_SHA512_DIGEST_SIZE;
3610
#elif defined(WOLFSSL_SM3)
3611
    cookieType = WC_SM3;
3612
    macSz = WC_SM3_DIGEST_SIZE;
3613
#else
3614
    #error "No digest to available to use with HMAC for cookies."
3615
#endif /* NO_SHA */
3616
3617
    ret = wc_HmacInit(&cookieHmac, ssl->heap, ssl->devId);
3618
    if (ret == 0) {
3619
        ret = wc_HmacSetKey(&cookieHmac, cookieType,
3620
                            ssl->buffers.tls13CookieSecret.buffer,
3621
                            ssl->buffers.tls13CookieSecret.length);
3622
    }
3623
    if (ret == 0)
3624
        ret = wc_HmacUpdate(&cookieHmac, cookie, cookieSz);
3625
#ifdef WOLFSSL_DTLS13
3626
    /* Tie cookie to peer address */
3627
    if (ret == 0) {
3628
        /* peerLock not necessary. Still in handshake phase. */
3629
        if (ssl->options.dtls && ssl->buffers.dtlsCtx.peer.sz > 0) {
3630
            ret = wc_HmacUpdate(&cookieHmac,
3631
                (byte*)ssl->buffers.dtlsCtx.peer.sa,
3632
                ssl->buffers.dtlsCtx.peer.sz);
3633
        }
3634
    }
3635
#endif
3636
    if (ret == 0)
3637
        ret = wc_HmacFinal(&cookieHmac, mac);
3638
3639
    wc_HmacFree(&cookieHmac);
3640
    if (ret != 0)
3641
        return ret;
3642
3643
    /* The cookie data is the hash and the integrity check. */
3644
    return TLSX_Cookie_Use(ssl, cookie, cookieSz, mac, macSz, 1, exts);
3645
}
3646
#endif
3647
3648
#ifdef WOLFSSL_DTLS13
3649
#define HRR_MAX_HS_HEADER_SZ DTLS_HANDSHAKE_HEADER_SZ
3650
#else
3651
#define HRR_MAX_HS_HEADER_SZ HANDSHAKE_HEADER_SZ
3652
#endif /* WOLFSSL_DTLS13 */
3653
3654
static int CreateCookie(const WOLFSSL* ssl, byte** hash, byte* hashSz,
3655
                            Hashes* hashes, TLSX** exts)
3656
{
3657
    int    ret = 0;
3658
3659
    (void)exts;
3660
3661
    *hash = NULL;
3662
    switch (ssl->specs.mac_algorithm) {
3663
    #ifndef NO_SHA256
3664
        case sha256_mac:
3665
            *hash = hashes->sha256;
3666
            break;
3667
    #endif
3668
    #ifdef WOLFSSL_SHA384
3669
        case sha384_mac:
3670
            *hash = hashes->sha384;
3671
            break;
3672
    #endif
3673
    #ifdef WOLFSSL_TLS13_SHA512
3674
        case sha512_mac:
3675
            *hash = hashes->sha512;
3676
            break;
3677
    #endif
3678
    #ifdef WOLFSSL_SM3
3679
        case sm3_mac:
3680
            *hash = hashes->sm3;
3681
            break;
3682
    #endif
3683
    }
3684
    *hashSz = ssl->specs.hash_size;
3685
3686
    /* check hash */
3687
    if (*hash == NULL && *hashSz > 0)
3688
        return BAD_FUNC_ARG;
3689
3690
#if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
3691
    if (ssl->options.sendCookie && ssl->options.side == WOLFSSL_SERVER_END)
3692
        ret = CreateCookieExt(ssl, *hash, *hashSz, exts,
3693
                ssl->options.cipherSuite0, ssl->options.cipherSuite);
3694
#endif
3695
    return ret;
3696
}
3697
3698
/* Restart the handshake hash with a hash of the previous messages.
3699
 *
3700
 * ssl The SSL/TLS object.
3701
 * returns 0 on success, otherwise failure.
3702
 */
3703
int RestartHandshakeHash(WOLFSSL* ssl)
3704
0
{
3705
0
    int    ret;
3706
0
    byte   header[HANDSHAKE_HEADER_SZ] = {0};
3707
0
    Hashes hashes;
3708
0
    byte*  hash = NULL;
3709
0
    byte   hashSz = 0;
3710
3711
0
    ret = BuildCertHashes(ssl, &hashes);
3712
0
    if (ret != 0)
3713
0
        return ret;
3714
0
    ret = CreateCookie(ssl, &hash, &hashSz, &hashes, &ssl->extensions);
3715
0
    if (ret != 0)
3716
0
        return ret;
3717
#if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
3718
    if (ssl->options.sendCookie && ssl->options.side == WOLFSSL_SERVER_END)
3719
        return 0;
3720
#endif
3721
3722
0
    AddTls13HandShakeHeader(header, hashSz, 0, 0, message_hash, ssl);
3723
3724
#ifdef WOLFSSL_DEBUG_TLS
3725
    WOLFSSL_MSG("Restart Hash");
3726
    WOLFSSL_BUFFER(hash, hashSz);
3727
#endif
3728
3729
0
    ret = InitHandshakeHashes(ssl);
3730
0
    if (ret != 0)
3731
0
        return ret;
3732
0
    ret = HashRaw(ssl, header, sizeof(header));
3733
0
    if (ret != 0)
3734
0
        return ret;
3735
0
    return HashRaw(ssl, hash, hashSz);
3736
0
}
3737
3738
#if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)
3739
/* The value in the random field of a ServerHello to indicate
3740
 * HelloRetryRequest.
3741
 */
3742
static byte helloRetryRequestRandom[] = {
3743
    0xCF, 0x21, 0xAD, 0x74, 0xE5, 0x9A, 0x61, 0x11,
3744
    0xBE, 0x1D, 0x8C, 0x02, 0x1E, 0x65, 0xB8, 0x91,
3745
    0xC2, 0xA2, 0x11, 0x16, 0x7A, 0xBB, 0x8C, 0x5E,
3746
    0x07, 0x9E, 0x09, 0xE2, 0xC8, 0xA8, 0x33, 0x9C
3747
};
3748
#endif
3749
3750
#ifdef HAVE_ECH
3751
/* returns the index of the first supported cipher suite, -1 if none */
3752
int EchConfigGetSupportedCipherSuite(WOLFSSL_EchConfig* config)
3753
{
3754
    int i, j, supported = 0;
3755
3756
    for (i = 0; i < config->numCipherSuites; i++) {
3757
        supported = 0;
3758
3759
        for (j = 0; j < HPKE_SUPPORTED_KDF_LEN; j++) {
3760
            if (config->cipherSuites[i].kdfId == hpkeSupportedKdf[j])
3761
                break;
3762
        }
3763
3764
        if (j < HPKE_SUPPORTED_KDF_LEN)
3765
            for (j = 0; j < HPKE_SUPPORTED_AEAD_LEN; j++) {
3766
                if (config->cipherSuites[i].aeadId == hpkeSupportedAead[j]) {
3767
                    supported = 1;
3768
                    break;
3769
                }
3770
            }
3771
3772
        if (supported)
3773
            return i;
3774
    }
3775
3776
    return WOLFSSL_FATAL_ERROR;
3777
}
3778
#endif
3779
3780
#ifndef NO_WOLFSSL_CLIENT
3781
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
3782
#if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_PSK_ONE_ID) && \
3783
    !defined(NO_PSK)
3784
/**
3785
* convert mac algorithm to WOLFSSL_EVP_MD
3786
* @param mac_alg mac algorithm
3787
* @return const WOLFSSL_EVP_MD on successful, otherwise NULL
3788
*/
3789
static const WOLFSSL_EVP_MD* ssl_handshake_md(const byte mac_alg)
3790
{
3791
    switch(mac_alg) {
3792
        case no_mac:
3793
    #ifndef NO_MD5
3794
        case md5_mac:
3795
            return wolfSSL_EVP_md5();
3796
    #endif
3797
    #ifndef NO_SHA
3798
        case sha_mac:
3799
            return wolfSSL_EVP_sha1();
3800
    #endif
3801
    #ifdef WOLFSSL_SHA224
3802
        case sha224_mac:
3803
            return wolfSSL_EVP_sha224();
3804
    #endif
3805
        case sha256_mac:
3806
            return wolfSSL_EVP_sha256();
3807
    #ifdef WOLFSSL_SHA384
3808
        case sha384_mac:
3809
            return wolfSSL_EVP_sha384();
3810
    #endif
3811
    #ifdef WOLFSSL_SHA512
3812
        case sha512_mac:
3813
            return wolfSSL_EVP_sha512();
3814
    #endif
3815
        case rmd_mac:
3816
        case blake2b_mac:
3817
            WOLFSSL_MSG("no suitable EVP_MD");
3818
            return NULL;
3819
        default:
3820
            WOLFSSL_MSG("Unknown mac algorithm");
3821
            return NULL;
3822
    }
3823
}
3824
#endif
3825
/* Setup pre-shared key based on the details in the extension data.
3826
 *
3827
 * ssl          SSL/TLS object.
3828
 * psk          Pre-shared key extension data.
3829
 * clientHello  Whether called from client_hello construction.
3830
 * returns 0 on success, PSK_KEY_ERROR when the client PSK callback fails and
3831
 * other negative value on failure.
3832
 */
3833
static int SetupPskKey(WOLFSSL* ssl, PreSharedKey* psk, int clientHello)
3834
{
3835
#if defined(HAVE_SESSION_TICKET) || !defined(WOLFSSL_PSK_ONE_ID)
3836
    int ret;
3837
#endif
3838
    byte suite[2];
3839
3840
    if (psk == NULL)
3841
        return BAD_FUNC_ARG;
3842
3843
    if (!HaveUniqueSessionObj(ssl)) {
3844
        WOLFSSL_MSG("Unable to have unique session object");
3845
        WOLFSSL_ERROR_VERBOSE(MEMORY_ERROR);
3846
        return MEMORY_ERROR;
3847
    }
3848
3849
    suite[0] = ssl->options.cipherSuite0;
3850
    suite[1] = ssl->options.cipherSuite;
3851
3852
#ifdef HAVE_SESSION_TICKET
3853
    if (psk->resumption) {
3854
        if (clientHello) {
3855
            suite[0] = psk->cipherSuite0;
3856
            suite[1] = psk->cipherSuite;
3857
3858
            /* Ensure cipher suite is supported or changed suite to one with
3859
             * the same MAC algorithm. */
3860
            if (!FindSuiteSSL(ssl, suite)) {
3861
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
3862
                return PSK_KEY_ERROR;
3863
            }
3864
3865
            ssl->options.cipherSuite0 = suite[0];
3866
            ssl->options.cipherSuite = suite[1];
3867
3868
            /* Setting mac for binder and keys for deriving EarlyData. */
3869
            ret = SetCipherSpecs(ssl);
3870
            if (ret != 0)
3871
                return ret;
3872
        }
3873
3874
    #ifdef WOLFSSL_EARLY_DATA
3875
        if (ssl->session->maxEarlyDataSz == 0)
3876
            ssl->earlyData = no_early_data;
3877
    #endif
3878
        /* Resumption PSK is master secret. */
3879
        ssl->arrays->psk_keySz = ssl->specs.hash_size;
3880
        if ((ret = DeriveResumptionPSK(ssl, ssl->session->ticketNonce.data,
3881
                   ssl->session->ticketNonce.len, ssl->arrays->psk_key)) != 0) {
3882
            return ret;
3883
        }
3884
        if (!clientHello) {
3885
            /* CLIENT: using secret in ticket for peer authentication. */
3886
            ssl->options.peerAuthGood = 1;
3887
        }
3888
    }
3889
#endif
3890
#ifndef NO_PSK
3891
    if (!psk->resumption) {
3892
        /* Get the pre-shared key. */
3893
#ifndef WOLFSSL_PSK_ONE_ID
3894
        const char* cipherName = NULL;
3895
    #ifdef OPENSSL_EXTRA
3896
        WOLFSSL_SESSION* psksession = NULL;
3897
    #endif
3898
3899
        /* Set the client identity to use. */
3900
        XMEMSET(ssl->arrays->client_identity, 0,
3901
            sizeof(ssl->arrays->client_identity));
3902
        XMEMCPY(ssl->arrays->client_identity, psk->identity, psk->identityLen);
3903
3904
    #ifdef WOLFSSL_DEBUG_TLS
3905
        WOLFSSL_MSG("PSK cipher suite:");
3906
        WOLFSSL_MSG(GetCipherNameInternal(psk->cipherSuite0, psk->cipherSuite));
3907
    #endif
3908
3909
        /* Get the pre-shared key. */
3910
    #ifdef OPENSSL_EXTRA
3911
        if (ssl->options.session_psk_cb != NULL) {
3912
            const unsigned char* id = NULL;
3913
            size_t idlen = 0;
3914
            const WOLFSSL_EVP_MD* handshake_md = NULL;
3915
3916
            if (ssl->msgsReceived.got_hello_retry_request >= 1) {
3917
                handshake_md = ssl_handshake_md(ssl->specs.mac_algorithm);
3918
            }
3919
            /* OpenSSL compatible callback that gets cached session. */
3920
            if (ssl->options.session_psk_cb(ssl, handshake_md, &id, &idlen,
3921
                                                            &psksession) == 0) {
3922
                wolfSSL_FreeSession(ssl->ctx, psksession);
3923
                WOLFSSL_MSG("psk session callback failed");
3924
                return PSK_KEY_ERROR;
3925
            }
3926
            if (psksession != NULL) {
3927
                if (idlen > MAX_PSK_KEY_LEN) {
3928
                    wolfSSL_FreeSession(ssl->ctx, psksession);
3929
                    WOLFSSL_MSG("psk key length is too long");
3930
                    WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
3931
                    return PSK_KEY_ERROR;
3932
                }
3933
3934
                ssl->arrays->psk_keySz = (word32)idlen;
3935
                XMEMCPY(ssl->arrays->psk_key, id, idlen);
3936
                suite[0] = psksession->cipherSuite0;
3937
                suite[1] = psksession->cipherSuite;
3938
                /* Not needed anymore. */
3939
                wolfSSL_FreeSession(ssl->ctx, psksession);
3940
                /* Leave pointer not NULL to indicate success with callback. */
3941
            }
3942
        }
3943
        if (psksession != NULL) {
3944
            /* Don't try other callbacks - we have an answer. */
3945
        }
3946
        else
3947
    #endif /* OPENSSL_EXTRA */
3948
        if (ssl->options.client_psk_cs_cb != NULL) {
3949
        #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
3950
            ssl->arrays->client_identity[0] = 0;
3951
        #endif
3952
            /* Lookup key again for next identity. */
3953
            ssl->arrays->psk_keySz = ssl->options.client_psk_cs_cb(
3954
                ssl, ssl->arrays->server_hint,
3955
                ssl->arrays->client_identity, MAX_PSK_ID_LEN,
3956
                ssl->arrays->psk_key, MAX_PSK_KEY_LEN,
3957
                GetCipherNameInternal(psk->cipherSuite0, psk->cipherSuite));
3958
            if (clientHello) {
3959
                /* Use PSK cipher suite. */
3960
                ssl->options.cipherSuite0 = psk->cipherSuite0;
3961
                ssl->options.cipherSuite  = psk->cipherSuite;
3962
            }
3963
            else {
3964
                byte pskCS[2];
3965
                pskCS[0] = psk->cipherSuite0;
3966
                pskCS[1] = psk->cipherSuite;
3967
3968
                /* Ensure PSK and negotiated cipher suites have same hash. */
3969
                if (SuiteMac(pskCS) != SuiteMac(suite)) {
3970
                    WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
3971
                    return PSK_KEY_ERROR;
3972
                }
3973
                /* Negotiated cipher suite is to be used - update PSK. */
3974
                psk->cipherSuite0 = suite[0];
3975
                psk->cipherSuite  = suite[1];
3976
            }
3977
        }
3978
        else if (ssl->options.client_psk_tls13_cb != NULL) {
3979
            byte cipherSuite0;
3980
            byte cipherSuite;
3981
            int cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE;
3982
3983
            ssl->arrays->psk_keySz = ssl->options.client_psk_tls13_cb(ssl,
3984
                    ssl->arrays->server_hint, ssl->arrays->client_identity,
3985
                    MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN,
3986
                    &cipherName);
3987
            if (GetCipherSuiteFromName(cipherName, &cipherSuite0,
3988
                            &cipherSuite, NULL, NULL, &cipherSuiteFlags) != 0) {
3989
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
3990
                return PSK_KEY_ERROR;
3991
            }
3992
            ssl->options.cipherSuite0 = cipherSuite0;
3993
            ssl->options.cipherSuite  = cipherSuite;
3994
            (void)cipherSuiteFlags;
3995
        }
3996
        else {
3997
            ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
3998
                    ssl->arrays->server_hint, ssl->arrays->client_identity,
3999
                    MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
4000
            ssl->options.cipherSuite0 = TLS13_BYTE;
4001
            ssl->options.cipherSuite  = WOLFSSL_DEF_PSK_CIPHER;
4002
        }
4003
        if (ssl->arrays->psk_keySz == 0 ||
4004
                (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
4005
            (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
4006
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
4007
            return PSK_KEY_ERROR;
4008
        }
4009
4010
        ret = SetCipherSpecs(ssl);
4011
        if (ret != 0)
4012
            return ret;
4013
#else
4014
        /* PSK information loaded during setting of default TLS extensions. */
4015
#endif /* !WOLFSSL_PSK_ONE_ID */
4016
4017
        if (!clientHello && (psk->cipherSuite0 != suite[0] ||
4018
                             psk->cipherSuite  != suite[1])) {
4019
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
4020
            return PSK_KEY_ERROR;
4021
        }
4022
4023
        if (!clientHello) {
4024
            /* CLIENT: using PSK for peer authentication. */
4025
            ssl->options.peerAuthGood = 1;
4026
        }
4027
    }
4028
#endif
4029
4030
#ifdef HAVE_SUPPORTED_CURVES
4031
    if (!clientHello) {
4032
        TLSX* ext;
4033
        word32 modes;
4034
        KeyShareEntry* kse = NULL;
4035
4036
        /* Get the PSK key exchange modes the client wants to negotiate. */
4037
        ext = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
4038
        if (ext == NULL) {
4039
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
4040
            return PSK_KEY_ERROR;
4041
        }
4042
        modes = ext->val;
4043
4044
        ext = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
4045
        if (ext != NULL) {
4046
            kse = (KeyShareEntry*)ext->data;
4047
        }
4048
        /* Use (EC)DHE for forward-security if possible. */
4049
        if (((modes & (1 << PSK_DHE_KE)) != 0) && (!ssl->options.noPskDheKe) &&
4050
                                                (kse != NULL) && kse->derived) {
4051
            if ((kse->session != 0) && (kse->session != kse->group)) {
4052
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
4053
                return PSK_KEY_ERROR;
4054
            }
4055
        }
4056
        else if (ssl->options.onlyPskDheKe) {
4057
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
4058
            return PSK_KEY_ERROR;
4059
        }
4060
        else if (ssl->options.noPskDheKe) {
4061
            ssl->arrays->preMasterSz = 0;
4062
        }
4063
    }
4064
    else
4065
#endif
4066
    if (ssl->options.noPskDheKe) {
4067
        ssl->arrays->preMasterSz = 0;
4068
    }
4069
4070
    /* Derive the early secret using the PSK. */
4071
    return DeriveEarlySecret(ssl);
4072
}
4073
4074
/* Derive and write the binders into the ClientHello in space left when
4075
 * writing the Pre-Shared Key extension.
4076
 *
4077
 * ssl     The SSL/TLS object.
4078
 * output  The buffer containing the ClientHello.
4079
 * idx     The index at the end of the completed ClientHello.
4080
 * returns 0 on success and otherwise failure.
4081
 */
4082
static int WritePSKBinders(WOLFSSL* ssl, byte* output, word32 idx)
4083
{
4084
    int           ret;
4085
    TLSX*         ext;
4086
    PreSharedKey* current;
4087
    byte          binderKey[WC_MAX_DIGEST_SIZE];
4088
    word16        len;
4089
4090
    WOLFSSL_ENTER("WritePSKBinders");
4091
4092
    if (idx > WOLFSSL_MAX_16BIT) {
4093
        return INPUT_SIZE_E;
4094
    }
4095
4096
    ext = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
4097
    if (ext == NULL)
4098
        return SANITY_MSG_E;
4099
4100
    /* Get the size of the binders to determine where to write binders. */
4101
    ret = TLSX_PreSharedKey_GetSizeBinders((PreSharedKey*)ext->data,
4102
                                                            client_hello, &len);
4103
    if (ret < 0)
4104
        return ret;
4105
    idx -= len;
4106
4107
    /* Hash truncated ClientHello - up to binders. */
4108
#ifdef WOLFSSL_DTLS13
4109
    if (ssl->options.dtls)
4110
        ret = Dtls13HashHandshake(ssl, output + Dtls13GetRlHeaderLength(ssl, 0),
4111
                                 (word16)idx - Dtls13GetRlHeaderLength(ssl, 0));
4112
    else
4113
#endif /* WOLFSSL_DTLS13 */
4114
        ret = HashOutput(ssl, output, (int)idx, 0);
4115
4116
    if (ret != 0)
4117
        return ret;
4118
4119
    current = (PreSharedKey*)ext->data;
4120
#ifdef WOLFSSL_CHECK_MEM_ZERO
4121
    if (current != NULL) {
4122
        wc_MemZero_Add("WritePSKBinders binderKey", binderKey,
4123
            sizeof(binderKey));
4124
    }
4125
#endif
4126
    /* Calculate the binder for each identity based on previous handshake data.
4127
     */
4128
    while (current != NULL) {
4129
        if ((ret = SetupPskKey(ssl, current, 1)) != 0)
4130
            break;
4131
4132
    #ifdef HAVE_SESSION_TICKET
4133
        if (current->resumption)
4134
            ret = DeriveBinderKeyResume(ssl, binderKey);
4135
    #endif
4136
    #ifndef NO_PSK
4137
        if (!current->resumption)
4138
            ret = DeriveBinderKey(ssl, binderKey);
4139
    #endif
4140
        if (ret != 0)
4141
            break;
4142
4143
        /* Derive the Finished message secret. */
4144
        ret = DeriveFinishedSecret(ssl, binderKey,
4145
                                   ssl->keys.client_write_MAC_secret,
4146
                                   0 /* neither end */);
4147
        if (ret != 0)
4148
            break;
4149
4150
        /* Build the HMAC of the handshake message data = binder. */
4151
        ret = BuildTls13HandshakeHmac(ssl, ssl->keys.client_write_MAC_secret,
4152
            current->binder, &current->binderLen);
4153
        if (ret != 0)
4154
            break;
4155
4156
        current = current->next;
4157
    }
4158
4159
    ForceZero(binderKey, sizeof(binderKey));
4160
#ifdef WOLFSSL_CHECK_MEM_ZERO
4161
    wc_MemZero_Check(binderKey, sizeof(binderKey));
4162
#endif
4163
    if (ret != 0)
4164
        return ret;
4165
4166
    /* Data entered into extension, now write to message. */
4167
    ret = TLSX_PreSharedKey_WriteBinders((PreSharedKey*)ext->data, output + idx,
4168
                                                            client_hello, &len);
4169
    if (ret < 0)
4170
        return ret;
4171
4172
    /* Hash binders to complete the hash of the ClientHello. */
4173
    ret = HashRaw(ssl, output + idx, len);
4174
    if (ret < 0)
4175
        return ret;
4176
4177
    #ifdef WOLFSSL_EARLY_DATA
4178
    if (ssl->earlyData != no_early_data) {
4179
        if ((ret = SetupPskKey(ssl, (PreSharedKey*)ext->data, 1)) != 0)
4180
            return ret;
4181
4182
        /* Derive early data encryption key. */
4183
        ret = DeriveTls13Keys(ssl, early_data_key, ENCRYPT_SIDE_ONLY, 1);
4184
        if (ret != 0)
4185
            return ret;
4186
        if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
4187
            return ret;
4188
4189
    }
4190
    #endif
4191
4192
    WOLFSSL_LEAVE("WritePSKBinders", ret);
4193
4194
    return ret;
4195
}
4196
#endif
4197
4198
#if defined(HAVE_ECH)
4199
/* returns status after we hash the ech inner */
4200
static int EchHashHelloInner(WOLFSSL* ssl, WOLFSSL_ECH* ech)
4201
{
4202
    int ret = 0;
4203
    word32 realSz;
4204
    HS_Hashes* tmpHashes;
4205
#ifdef WOLFSSL_DTLS13
4206
    byte falseHeader[DTLS13_HANDSHAKE_HEADER_SZ];
4207
#else
4208
    byte falseHeader[HANDSHAKE_HEADER_SZ];
4209
#endif
4210
4211
    if (ssl == NULL || ech == NULL)
4212
        return BAD_FUNC_ARG;
4213
    realSz = ech->innerClientHelloLen - ech->paddingLen - ech->hpke->Nt;
4214
    tmpHashes = ssl->hsHashes;
4215
    ssl->hsHashes = NULL;
4216
    /* init the ech hashes */
4217
    ret = InitHandshakeHashes(ssl);
4218
    if (ret == 0) {
4219
        ssl->hsHashesEch = ssl->hsHashes;
4220
        /* do the handshake header then the body */
4221
        AddTls13HandShakeHeader(falseHeader, realSz, 0, 0, client_hello, ssl);
4222
        ret = HashRaw(ssl, falseHeader, HANDSHAKE_HEADER_SZ);
4223
        /* hash with inner */
4224
        if (ret == 0) {
4225
            /* init hsHashesEchInner */
4226
            if (ech->innerCount == 0) {
4227
                ssl->hsHashes = ssl->hsHashesEchInner;
4228
                ret = InitHandshakeHashes(ssl);
4229
                if (ret == 0) {
4230
                    ssl->hsHashesEchInner = ssl->hsHashes;
4231
                    ech->innerCount = 1;
4232
                }
4233
            }
4234
            else {
4235
                /* switch back to hsHashes so we have hrr -> echInner2 */
4236
                ssl->hsHashes = tmpHashes;
4237
                ret = InitHandshakeHashesAndCopy(ssl, ssl->hsHashes,
4238
                                                 &ssl->hsHashesEchInner);
4239
            }
4240
4241
            if (ret == 0) {
4242
                ssl->hsHashes = ssl->hsHashesEchInner;
4243
                ret = HashRaw(ssl, falseHeader, HANDSHAKE_HEADER_SZ);
4244
                ssl->hsHashes = ssl->hsHashesEch;
4245
            }
4246
        }
4247
    }
4248
    /* hash the body */
4249
    if (ret == 0)
4250
        ret = HashRaw(ssl, ech->innerClientHello, realSz);
4251
    /* hash with inner */
4252
    if (ret == 0) {
4253
        ssl->hsHashes = ssl->hsHashesEchInner;
4254
        ret = HashRaw(ssl, ech->innerClientHello, realSz);
4255
    }
4256
    /* swap hsHashes back */
4257
    ssl->hsHashes = tmpHashes;
4258
    return ret;
4259
}
4260
#endif
4261
4262
static void GetTls13SessionId(WOLFSSL* ssl, byte* output, word32* idx)
4263
6.20k
{
4264
6.20k
    if (ssl->session->sessionIDSz > 0) {
4265
        /* Session resumption for old versions of protocol. */
4266
0
        if (ssl->session->sessionIDSz <= ID_LEN) {
4267
0
            if (output != NULL)
4268
0
                output[*idx] = ssl->session->sessionIDSz;
4269
0
            (*idx)++;
4270
0
            if (output != NULL) {
4271
0
                XMEMCPY(output + *idx, ssl->session->sessionID,
4272
0
                    ssl->session->sessionIDSz);
4273
0
            }
4274
0
            *idx += ssl->session->sessionIDSz;
4275
0
        }
4276
0
        else {
4277
            /* Invalid session ID length. Reset it. */
4278
0
            ssl->session->sessionIDSz = 0;
4279
0
            if (output != NULL)
4280
0
                output[*idx] = 0;
4281
0
            (*idx)++;
4282
0
        }
4283
0
    }
4284
6.20k
    else {
4285
    #ifdef WOLFSSL_TLS13_MIDDLEBOX_COMPAT
4286
        if (ssl->options.tls13MiddleBoxCompat) {
4287
            if (output != NULL)
4288
                output[*idx] = ID_LEN;
4289
            (*idx)++;
4290
            if (output != NULL)
4291
                XMEMCPY(output + *idx, ssl->arrays->clientRandom, ID_LEN);
4292
            *idx += ID_LEN;
4293
        }
4294
        else
4295
    #endif /* WOLFSSL_TLS13_MIDDLEBOX_COMPAT */
4296
6.20k
        {
4297
            /* TLS v1.3 does not use session id - 0 length. */
4298
6.20k
            if (output != NULL)
4299
2.82k
                output[*idx] = 0;
4300
6.20k
            (*idx)++;
4301
6.20k
        }
4302
6.20k
    }
4303
6.20k
}
4304
4305
/* handle generation of TLS 1.3 client_hello (1) */
4306
/* Send a ClientHello message to the server.
4307
 * Include the information required to start a handshake with servers using
4308
 * protocol versions less than TLS v1.3.
4309
 * Only a client will send this message.
4310
 *
4311
 * ssl  The SSL/TLS object.
4312
 * returns 0 on success and otherwise failure.
4313
 */
4314
4315
typedef struct Sch13Args {
4316
    byte*  output;
4317
    word32 idx;
4318
    int    sendSz;
4319
    word32 length;
4320
#if defined(HAVE_ECH)
4321
    int clientRandomOffset;
4322
    int preXLength;
4323
    WOLFSSL_ECH* ech;
4324
#endif
4325
} Sch13Args;
4326
4327
#ifdef WOLFSSL_EARLY_DATA
4328
/* Check if early data can potentially be sent.
4329
 * Returns 1 if early data is possible, 0 otherwise.
4330
 */
4331
static int EarlyDataPossible(WOLFSSL* ssl)
4332
{
4333
    /* Need session resumption OR PSK callback configured */
4334
    if (ssl->options.resuming) {
4335
        return 1;
4336
    }
4337
#ifndef NO_PSK
4338
    if (ssl->options.client_psk_tls13_cb != NULL ||
4339
        ssl->options.client_psk_cb != NULL) {
4340
        return 1;
4341
    }
4342
#endif
4343
    return 0;
4344
}
4345
#endif /* WOLFSSL_EARLY_DATA */
4346
4347
int SendTls13ClientHello(WOLFSSL* ssl)
4348
0
{
4349
0
    int ret;
4350
#ifdef WOLFSSL_ASYNC_CRYPT
4351
    Sch13Args* args = NULL;
4352
    WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
4353
#else
4354
0
    Sch13Args  args[1];
4355
0
#endif
4356
0
    byte major, tls12minor;
4357
0
    const Suites* suites;
4358
4359
0
    WOLFSSL_START(WC_FUNC_CLIENT_HELLO_SEND);
4360
0
    WOLFSSL_ENTER("SendTls13ClientHello");
4361
4362
0
    if (ssl == NULL) {
4363
0
        return BAD_FUNC_ARG;
4364
0
    }
4365
4366
0
    ssl->options.buildingMsg = 1;
4367
0
    major = SSLv3_MAJOR;
4368
0
    tls12minor = TLSv1_2_MINOR;
4369
4370
#ifdef WOLFSSL_DTLS13
4371
    if (ssl->options.dtls) {
4372
        major = DTLS_MAJOR;
4373
        tls12minor = DTLSv1_2_MINOR;
4374
    }
4375
#endif /* WOLFSSL_DTLS */
4376
4377
#ifdef HAVE_SESSION_TICKET
4378
    if (ssl->options.resuming &&
4379
            (ssl->session->version.major != ssl->version.major ||
4380
             ssl->session->version.minor != ssl->version.minor)) {
4381
    #ifndef WOLFSSL_NO_TLS12
4382
        if (ssl->session->version.major == ssl->version.major &&
4383
            ssl->session->version.minor < ssl->version.minor) {
4384
            /* Cannot resume with a different protocol version. */
4385
            ssl->options.resuming = 0;
4386
            ssl->version.major = ssl->session->version.major;
4387
            ssl->version.minor = ssl->session->version.minor;
4388
            return SendClientHello(ssl);
4389
        }
4390
        else
4391
    #endif
4392
        {
4393
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
4394
            return VERSION_ERROR;
4395
        }
4396
    }
4397
#endif
4398
4399
0
    suites = WOLFSSL_SUITES(ssl);
4400
0
    if (suites == NULL) {
4401
0
        WOLFSSL_MSG("Bad suites pointer in SendTls13ClientHello");
4402
0
        return SUITES_ERROR;
4403
0
    }
4404
4405
#ifdef WOLFSSL_ASYNC_CRYPT
4406
    if (ssl->async == NULL) {
4407
        ssl->async = (struct WOLFSSL_ASYNC*)
4408
                XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
4409
                        DYNAMIC_TYPE_ASYNC);
4410
        if (ssl->async == NULL)
4411
            return MEMORY_E;
4412
        ssl->async->freeArgs = NULL;
4413
    }
4414
    args = (Sch13Args*)ssl->async->args;
4415
4416
    ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
4417
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
4418
        /* Check for error */
4419
        if (ret < 0)
4420
            return ret;
4421
    }
4422
    else
4423
#endif
4424
0
    {
4425
        /* Reset state */
4426
0
        ssl->options.asyncState = TLS_ASYNC_BEGIN;
4427
0
        XMEMSET(args, 0, sizeof(Sch13Args));
4428
0
    }
4429
4430
0
    switch (ssl->options.asyncState) {
4431
0
    case TLS_ASYNC_BEGIN:
4432
0
    {
4433
0
    word32 sessIdSz = 0;
4434
4435
0
    args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
4436
4437
#ifdef WOLFSSL_DTLS13
4438
    if (ssl->options.dtls)
4439
        args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
4440
#endif /* WOLFSSL_DTLS13 */
4441
4442
    /* Version | Random | Cipher Suites | Compression */
4443
0
    args->length = VERSION_SZ + RAN_LEN + suites->suiteSz +
4444
0
            SUITE_LEN + COMP_LEN + ENUM_LEN;
4445
#ifdef WOLFSSL_QUIC
4446
    if (WOLFSSL_IS_QUIC(ssl)) {
4447
        /* RFC 9001 ch. 8.4 sessionID in ClientHello MUST be 0 length */
4448
        ssl->session->sessionIDSz = 0;
4449
        ssl->options.tls13MiddleBoxCompat = 0;
4450
    }
4451
#endif
4452
0
    GetTls13SessionId(ssl, NULL, &sessIdSz);
4453
0
    args->length += (word16)sessIdSz;
4454
4455
#ifdef WOLFSSL_DTLS13
4456
    if (ssl->options.dtls) {
4457
        /* legacy_cookie_id len */
4458
        args->length += ENUM_LEN;
4459
4460
        /* server sent us an HelloVerifyRequest and we allow downgrade  */
4461
        if (ssl->arrays->cookieSz > 0 && ssl->options.downgrade)
4462
            args->length += ssl->arrays->cookieSz;
4463
    }
4464
#endif /* WOLFSSL_DTLS13 */
4465
4466
    /* Advance state and proceed */
4467
0
    ssl->options.asyncState = TLS_ASYNC_BUILD;
4468
0
    } /* case TLS_ASYNC_BEGIN */
4469
0
    FALL_THROUGH;
4470
4471
0
    case TLS_ASYNC_BUILD:
4472
0
    case TLS_ASYNC_DO:
4473
0
    {
4474
    /* Auto populate extensions supported unless user defined. */
4475
0
    if ((ret = TLSX_PopulateExtensions(ssl, 0)) != 0)
4476
0
        return ret;
4477
4478
    /* Advance state and proceed */
4479
0
    ssl->options.asyncState = TLS_ASYNC_FINALIZE;
4480
0
    } /* case TLS_ASYNC_BUILD */
4481
0
    FALL_THROUGH;
4482
4483
0
    case TLS_ASYNC_FINALIZE:
4484
0
    {
4485
#ifdef WOLFSSL_EARLY_DATA
4486
    if (!EarlyDataPossible(ssl))
4487
        ssl->earlyData = no_early_data;
4488
    if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE)
4489
        ssl->earlyData = no_early_data;
4490
    if (ssl->earlyData == no_early_data)
4491
        TLSX_Remove(&ssl->extensions, TLSX_EARLY_DATA, ssl->heap);
4492
    if (ssl->earlyData != no_early_data &&
4493
        (ret = TLSX_EarlyData_Use(ssl, 0, 0)) < 0) {
4494
        return ret;
4495
    }
4496
#endif
4497
#ifdef WOLFSSL_QUIC
4498
    if (WOLFSSL_IS_QUIC(ssl) && IsAtLeastTLSv1_3(ssl->version)) {
4499
        ret = wolfSSL_quic_add_transport_extensions(ssl, client_hello);
4500
        if (ret != 0)
4501
            return ret;
4502
    }
4503
#endif
4504
4505
    /* find length of outer and inner */
4506
#if defined(HAVE_ECH)
4507
    if (ssl->options.useEch == 1 && !ssl->options.disableECH) {
4508
        TLSX* echX = TLSX_Find(ssl->extensions, TLSX_ECH);
4509
        if (echX == NULL)
4510
            return WOLFSSL_FATAL_ERROR;
4511
4512
        args->ech = (WOLFSSL_ECH*)echX->data;
4513
        if (args->ech == NULL)
4514
            return WOLFSSL_FATAL_ERROR;
4515
4516
        /* only prepare if we have a chance at acceptance */
4517
        if (ssl->options.echAccepted || args->ech->innerCount == 0) {
4518
            /* set the type to inner */
4519
            args->ech->type = ECH_TYPE_INNER;
4520
            args->preXLength = (int)args->length;
4521
4522
            /* get size for inner */
4523
            ret = TLSX_GetRequestSize(ssl, client_hello, &args->length);
4524
            if (ret != 0)
4525
                return ret;
4526
4527
            /* set the type to outer */
4528
            args->ech->type = 0;
4529
            /* set innerClientHelloLen to ClientHelloInner + padding + tag */
4530
            args->ech->paddingLen = 31 - ((args->length - 1) % 32);
4531
            args->ech->innerClientHelloLen = (word16)(args->length +
4532
                args->ech->paddingLen + args->ech->hpke->Nt);
4533
            /* set the length back to before we computed ClientHelloInner size */
4534
            args->length = (word32)args->preXLength;
4535
        }
4536
    }
4537
#endif
4538
4539
0
    {
4540
#ifdef WOLFSSL_DTLS_CH_FRAG
4541
        word16 maxFrag = wolfssl_local_GetMaxPlaintextSize(ssl);
4542
        word16 lenWithoutExts = args->length;
4543
#endif
4544
4545
        /* Include length of TLS extensions. */
4546
0
        ret = TLSX_GetRequestSize(ssl, client_hello, &args->length);
4547
0
        if (ret != 0)
4548
0
            return ret;
4549
4550
        /* Total message size. */
4551
0
        args->sendSz =
4552
0
                (int)(args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ);
4553
4554
#ifdef WOLFSSL_DTLS13
4555
        if (ssl->options.dtls)
4556
            args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
4557
#endif /* WOLFSSL_DTLS13 */
4558
4559
#ifdef WOLFSSL_DTLS_CH_FRAG
4560
        if (ssl->options.dtls && args->sendSz > maxFrag &&
4561
                TLSX_Find(ssl->extensions, TLSX_COOKIE) == NULL) {
4562
            /* Try again with an empty key share if we would be fragmenting
4563
             * without a cookie */
4564
            ret = TLSX_KeyShare_Empty(ssl);
4565
            if (ret != 0)
4566
                return ret;
4567
            args->length = lenWithoutExts;
4568
            ret = TLSX_GetRequestSize(ssl, client_hello, &args->length);
4569
            if (ret != 0)
4570
                return ret;
4571
            args->sendSz = (int)(args->length +
4572
                    DTLS_HANDSHAKE_HEADER_SZ + DTLS_RECORD_HEADER_SZ);
4573
            if (args->sendSz > maxFrag) {
4574
                WOLFSSL_MSG("Can't fit first CH in one fragment.");
4575
                return BUFFER_ERROR;
4576
            }
4577
            WOLFSSL_MSG("Sending empty key share so we don't fragment CH1");
4578
        }
4579
#endif
4580
0
    }
4581
4582
    /* Check buffers are big enough and grow if needed. */
4583
0
    if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0)
4584
0
        return ret;
4585
4586
    /* Get position in output buffer to write new message to. */
4587
0
    args->output = GetOutputBuffer(ssl);
4588
4589
    /* Put the record and handshake headers on. */
4590
0
    AddTls13Headers(args->output, args->length, client_hello, ssl);
4591
4592
    /* Protocol version - negotiation now in extension: supported_versions. */
4593
0
    args->output[args->idx++] = major;
4594
0
    args->output[args->idx++] = tls12minor;
4595
4596
    /* Keep for downgrade. */
4597
0
    ssl->chVersion = ssl->version;
4598
4599
0
    if (ssl->arrays == NULL) {
4600
0
        return BAD_FUNC_ARG;
4601
0
    }
4602
    /* Client Random */
4603
0
    if (ssl->options.connectState == CONNECT_BEGIN) {
4604
0
        ret = wc_RNG_GenerateBlock(ssl->rng, args->output + args->idx, RAN_LEN);
4605
0
        if (ret != 0)
4606
0
            return ret;
4607
4608
        /* Store random for possible second ClientHello. */
4609
0
        XMEMCPY(ssl->arrays->clientRandom, args->output + args->idx, RAN_LEN);
4610
0
    }
4611
0
    else
4612
0
        XMEMCPY(args->output + args->idx, ssl->arrays->clientRandom, RAN_LEN);
4613
4614
#if defined(HAVE_ECH)
4615
    args->clientRandomOffset = (int)args->idx;
4616
#endif
4617
4618
0
    args->idx += RAN_LEN;
4619
4620
0
    GetTls13SessionId(ssl, args->output, &args->idx);
4621
4622
#ifdef WOLFSSL_DTLS13
4623
    if (ssl->options.dtls) {
4624
        args->output[args->idx++] = ssl->arrays->cookieSz;
4625
4626
        if (ssl->arrays->cookieSz > 0) {
4627
            /* We have a cookie saved, so the server sent us an
4628
             * HelloVerifyRequest, it means it is a v1.2 server */
4629
            if (!ssl->options.downgrade)
4630
                return VERSION_ERROR;
4631
            XMEMCPY(args->output + args->idx, ssl->arrays->cookie,
4632
                ssl->arrays->cookieSz);
4633
            args->idx += ssl->arrays->cookieSz;
4634
        }
4635
    }
4636
#endif /* WOLFSSL_DTLS13 */
4637
4638
    /* Cipher suites */
4639
0
    c16toa(suites->suiteSz, args->output + args->idx);
4640
0
    args->idx += OPAQUE16_LEN;
4641
0
    XMEMCPY(args->output + args->idx, &suites->suites,
4642
0
        suites->suiteSz);
4643
0
    args->idx += suites->suiteSz;
4644
#ifdef WOLFSSL_DEBUG_TLS
4645
    {
4646
        int ii;
4647
        WOLFSSL_MSG("Ciphers:");
4648
        for (ii = 0 ; ii < suites->suiteSz; ii += 2) {
4649
            WOLFSSL_MSG(GetCipherNameInternal(suites->suites[ii+0],
4650
                                              suites->suites[ii+1]));
4651
        }
4652
    }
4653
#endif
4654
4655
    /* Compression not supported in TLS v1.3. */
4656
0
    args->output[args->idx++] = COMP_LEN;
4657
0
    args->output[args->idx++] = NO_COMPRESSION;
4658
4659
#if defined(HAVE_ECH)
4660
    /* write inner then outer */
4661
    if (ssl->options.useEch == 1 && !ssl->options.disableECH &&
4662
        (ssl->options.echAccepted || args->ech->innerCount == 0)) {
4663
        /* set the type to inner */
4664
        args->ech->type = ECH_TYPE_INNER;
4665
        /* innerClientHello may already exist from hrr, free if it does */
4666
        if (args->ech->innerClientHello != NULL) {
4667
            XFREE(args->ech->innerClientHello, ssl->heap,
4668
                DYNAMIC_TYPE_TMP_BUFFER);
4669
        }
4670
        /* allocate the inner */
4671
        args->ech->innerClientHello =
4672
            (byte*)XMALLOC(args->ech->innerClientHelloLen - args->ech->hpke->Nt,
4673
            ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
4674
        if (args->ech->innerClientHello == NULL)
4675
            return MEMORY_E;
4676
        /* set the padding bytes to 0 */
4677
        XMEMSET(args->ech->innerClientHello + args->ech->innerClientHelloLen -
4678
            args->ech->hpke->Nt - args->ech->paddingLen, 0,
4679
            args->ech->paddingLen);
4680
        /* copy the client hello to the ech innerClientHello, exclude record */
4681
        /* and handshake headers */
4682
        XMEMCPY(args->ech->innerClientHello,
4683
            args->output + RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ,
4684
            args->idx - (RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ));
4685
        /* copy the client random to inner */
4686
        XMEMCPY(ssl->arrays->clientRandomInner, ssl->arrays->clientRandom,
4687
            RAN_LEN);
4688
        /* change the outer client random */
4689
        ret = wc_RNG_GenerateBlock(ssl->rng, args->output +
4690
            args->clientRandomOffset, RAN_LEN);
4691
        if (ret != 0)
4692
            return ret;
4693
        /* copy the new client random */
4694
        XMEMCPY(ssl->arrays->clientRandom, args->output +
4695
            args->clientRandomOffset, RAN_LEN);
4696
        /* write the extensions for inner */
4697
        args->length = 0;
4698
        ret = TLSX_WriteRequest(ssl, args->ech->innerClientHello + args->idx -
4699
            (RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ), client_hello,
4700
            &args->length);
4701
        if (ret != 0)
4702
            return ret;
4703
        /* set the type to outer */
4704
        args->ech->type = 0;
4705
    }
4706
#endif
4707
4708
    /* Write out extensions for a request. */
4709
0
    args->length = 0;
4710
0
    ret = TLSX_WriteRequest(ssl, args->output + args->idx, client_hello,
4711
0
        &args->length);
4712
0
    if (ret != 0)
4713
0
        return ret;
4714
4715
0
    args->idx += args->length;
4716
4717
#if defined(HAVE_ECH)
4718
    /* encrypt and pack the ech innerClientHello */
4719
    if (ssl->options.useEch == 1 && !ssl->options.disableECH &&
4720
        (ssl->options.echAccepted || args->ech->innerCount == 0)) {
4721
        ret = TLSX_FinalizeEch(args->ech,
4722
            args->output + RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ,
4723
            (word32)(args->sendSz - (RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ)));
4724
4725
        if (ret != 0)
4726
            return ret;
4727
    }
4728
#endif
4729
4730
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
4731
    /* Resumption has a specific set of extensions and binder is calculated
4732
     * for each identity.
4733
     */
4734
    if (TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY)) {
4735
        ret = WritePSKBinders(ssl, args->output, args->idx);
4736
    }
4737
    else
4738
#endif
4739
0
    {
4740
#ifdef WOLFSSL_DTLS13
4741
        if (ssl->options.dtls)
4742
            ret = Dtls13HashHandshake(ssl,
4743
                args->output + Dtls13GetRlHeaderLength(ssl, 0),
4744
                (word16)args->idx - Dtls13GetRlHeaderLength(ssl, 0));
4745
        else
4746
#endif /* WOLFSSL_DTLS13 */
4747
0
        {
4748
#if defined(HAVE_ECH)
4749
            /* compute the inner hash */
4750
            if (ssl->options.useEch == 1 && !ssl->options.disableECH &&
4751
                (ssl->options.echAccepted || args->ech->innerCount == 0))
4752
                ret = EchHashHelloInner(ssl, args->ech);
4753
#endif
4754
            /* compute the outer hash */
4755
0
            if (ret == 0)
4756
0
                ret = HashOutput(ssl, args->output, (int)args->idx, 0);
4757
0
        }
4758
0
    }
4759
0
    if (ret != 0)
4760
0
        return ret;
4761
4762
0
    ssl->options.clientState = CLIENT_HELLO_COMPLETE;
4763
4764
#if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
4765
    if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
4766
    if (ssl->toInfoOn) {
4767
        ret = AddPacketInfo(ssl, "ClientHello", handshake, args->output,
4768
                      args->sendSz, WRITE_PROTO, 0, ssl->heap);
4769
        if (ret != 0)
4770
            return ret;
4771
    }
4772
#endif
4773
4774
0
    ssl->options.buildingMsg = 0;
4775
#ifdef WOLFSSL_DTLS13
4776
    if (ssl->options.dtls) {
4777
        ret = Dtls13HandshakeSend(ssl, args->output, (word16)args->sendSz,
4778
                                  (word16)args->idx, client_hello, 0);
4779
        break;
4780
    }
4781
#endif /* WOLFSSL_DTLS13 */
4782
4783
0
    ssl->buffers.outputBuffer.length += (word32)args->sendSz;
4784
4785
    /* Advance state and proceed */
4786
0
    ssl->options.asyncState = TLS_ASYNC_END;
4787
0
    }
4788
    /* case TLS_ASYNC_BUILD */
4789
0
    FALL_THROUGH;
4790
4791
0
    case TLS_ASYNC_END:
4792
0
    {
4793
#ifdef WOLFSSL_EARLY_DATA_GROUP
4794
    /* QUIC needs to forward records at their encryption level
4795
     * and is therefore unable to group here */
4796
    if (ssl->earlyData == no_early_data || WOLFSSL_IS_QUIC(ssl))
4797
#endif
4798
0
        ret = SendBuffered(ssl);
4799
4800
0
    break;
4801
0
    }
4802
0
    default:
4803
0
        ret = INPUT_CASE_ERROR;
4804
0
    } /* switch (ssl->options.asyncState) */
4805
4806
#ifdef WOLFSSL_ASYNC_CRYPT
4807
    if (ret == 0)
4808
        FreeAsyncCtx(ssl, 0);
4809
#endif
4810
4811
0
    WOLFSSL_LEAVE("SendTls13ClientHello", ret);
4812
0
    WOLFSSL_END(WC_FUNC_CLIENT_HELLO_SEND);
4813
4814
0
    return ret;
4815
0
}
4816
4817
#if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_NO_CLIENT)
4818
static int Dtls13ClientDoDowngrade(WOLFSSL* ssl)
4819
{
4820
    int ret;
4821
    if (ssl->dtls13ClientHello == NULL)
4822
        return BAD_STATE_E;
4823
4824
    /* v1.3 and v1.2 hash messages to compute the transcript hash. When we are
4825
     * using DTLSv1.3 we hash the first clientHello following v1.3 but the
4826
     * server can negotiate a lower version. So we need to re-hash the
4827
     * clientHello to adhere to DTLS <= v1.2 rules. */
4828
    ret = InitHandshakeHashes(ssl);
4829
    if (ret != 0)
4830
        return ret;
4831
    ret = HashRaw(ssl, ssl->dtls13ClientHello, ssl->dtls13ClientHelloSz);
4832
    XFREE(ssl->dtls13ClientHello, ssl->heap, DYNAMIC_TYPE_DTLS_MSG);
4833
    ssl->dtls13ClientHello = NULL;
4834
    ssl->dtls13ClientHelloSz = 0;
4835
    ssl->keys.dtls_sequence_number_hi =
4836
        (word16)w64GetHigh32(ssl->dtls13EncryptEpoch->nextSeqNumber);
4837
    ssl->keys.dtls_sequence_number_lo =
4838
        w64GetLow32(ssl->dtls13EncryptEpoch->nextSeqNumber);
4839
    return ret;
4840
}
4841
#endif /* WOLFSSL_DTLS13 && !WOLFSSL_NO_CLIENT*/
4842
4843
#if defined(HAVE_ECH)
4844
/* check if the server accepted ech or not, must be run after an hsHashes
4845
 * restart */
4846
static int EchCheckAcceptance(WOLFSSL* ssl, byte* label, word16 labelSz,
4847
    const byte* input, int acceptOffset, int helloSz)
4848
{
4849
    int ret = 0;
4850
    int digestType = 0;
4851
    int digestSize = 0;
4852
    HS_Hashes* tmpHashes;
4853
    byte zeros[WC_MAX_DIGEST_SIZE];
4854
    byte transcriptEchConf[WC_MAX_DIGEST_SIZE];
4855
    byte expandLabelPrk[WC_MAX_DIGEST_SIZE];
4856
    byte acceptConfirmation[ECH_ACCEPT_CONFIRMATION_SZ];
4857
    XMEMSET(zeros, 0, sizeof(zeros));
4858
    XMEMSET(transcriptEchConf, 0, sizeof(transcriptEchConf));
4859
    XMEMSET(expandLabelPrk, 0, sizeof(expandLabelPrk));
4860
    XMEMSET(acceptConfirmation, 0, sizeof(acceptConfirmation));
4861
    /* store so we can restore regardless of the outcome */
4862
    tmpHashes = ssl->hsHashes;
4863
    /* swap hsHashes to hsHashesEch */
4864
    ssl->hsHashes = ssl->hsHashesEch;
4865
    /* hash up to the last 8 bytes */
4866
    ret = HashRaw(ssl, input, acceptOffset);
4867
    /* hash 8 zeros */
4868
    if (ret == 0)
4869
        ret = HashRaw(ssl, zeros, ECH_ACCEPT_CONFIRMATION_SZ);
4870
    /* hash the rest of the hello */
4871
    if (ret == 0) {
4872
        ret = HashRaw(ssl, input + acceptOffset + ECH_ACCEPT_CONFIRMATION_SZ,
4873
            helloSz + HANDSHAKE_HEADER_SZ -
4874
            (acceptOffset + ECH_ACCEPT_CONFIRMATION_SZ));
4875
    }
4876
    /* get the modified transcript hash */
4877
    if (ret == 0)
4878
        ret = GetMsgHash(ssl, transcriptEchConf);
4879
    if (ret > 0)
4880
        ret = 0;
4881
    /* pick the right type and size based on mac_algorithm */
4882
    if (ret == 0) {
4883
        switch (ssl->specs.mac_algorithm) {
4884
#ifndef NO_SHA256
4885
            case sha256_mac:
4886
                digestType = WC_SHA256;
4887
                digestSize = WC_SHA256_DIGEST_SIZE;
4888
                break;
4889
#endif /* !NO_SHA256 */
4890
#ifdef WOLFSSL_SHA384
4891
            case sha384_mac:
4892
                digestType = WC_SHA384;
4893
                digestSize = WC_SHA384_DIGEST_SIZE;
4894
                break;
4895
#endif /* WOLFSSL_SHA384 */
4896
#ifdef WOLFSSL_TLS13_SHA512
4897
            case sha512_mac:
4898
                digestType = WC_SHA512;
4899
                digestSize = WC_SHA512_DIGEST_SIZE;
4900
                break;
4901
#endif /* WOLFSSL_TLS13_SHA512 */
4902
#ifdef WOLFSSL_SM3
4903
            case sm3_mac:
4904
                digestType = WC_SM3;
4905
                digestSize = WC_SM3_DIGEST_SIZE;
4906
                break;
4907
#endif /* WOLFSSL_SM3 */
4908
            default:
4909
                ret = WOLFSSL_FATAL_ERROR;
4910
                break;
4911
        }
4912
    }
4913
    /* extract clientRandomInner with a key of all zeros */
4914
    if (ret == 0) {
4915
        PRIVATE_KEY_UNLOCK();
4916
    #if !defined(HAVE_FIPS) || \
4917
        (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(6,0))
4918
        ret = wc_HKDF_Extract_ex(digestType, zeros, (word32)digestSize,
4919
            ssl->arrays->clientRandomInner, RAN_LEN, expandLabelPrk,
4920
            ssl->heap, ssl->devId);
4921
    #else
4922
        ret = wc_HKDF_Extract(digestType, zeros, digestSize,
4923
            ssl->arrays->clientRandomInner, RAN_LEN, expandLabelPrk);
4924
    #endif
4925
        PRIVATE_KEY_LOCK();
4926
    }
4927
    /* tls expand with the confirmation label */
4928
    if (ret == 0) {
4929
        PRIVATE_KEY_UNLOCK();
4930
        ret = Tls13HKDFExpandKeyLabel(ssl, acceptConfirmation,
4931
            ECH_ACCEPT_CONFIRMATION_SZ, expandLabelPrk, (word32)digestSize,
4932
            tls13ProtocolLabel, TLS13_PROTOCOL_LABEL_SZ, label, labelSz,
4933
            transcriptEchConf, (word32)digestSize, digestType,
4934
            WOLFSSL_SERVER_END);
4935
        PRIVATE_KEY_LOCK();
4936
    }
4937
    if (ret == 0) {
4938
        /* last 8 bytes should match our expand output */
4939
        ret = XMEMCMP(acceptConfirmation, input + acceptOffset,
4940
            ECH_ACCEPT_CONFIRMATION_SZ);
4941
        /* ech accepted */
4942
        if (ret == 0) {
4943
            /* set echAccepted to 1 */
4944
            ssl->options.echAccepted = 1;
4945
            /* free hsHashes and go with inner */
4946
            ssl->hsHashes = tmpHashes;
4947
            FreeHandshakeHashes(ssl);
4948
            ssl->hsHashes = ssl->hsHashesEch;
4949
            tmpHashes = ssl->hsHashesEchInner;
4950
            ssl->hsHashesEchInner = NULL;
4951
        }
4952
        /* ech rejected */
4953
        else {
4954
            /* set echAccepted to 0, needed in case HRR */
4955
            ssl->options.echAccepted = 0;
4956
            /* free inner since we're continuing with outer */
4957
            ssl->hsHashes = ssl->hsHashesEchInner;
4958
            FreeHandshakeHashes(ssl);
4959
            ssl->hsHashesEchInner = NULL;
4960
        }
4961
        /* continue with outer if we failed to verify ech was accepted */
4962
        ret = 0;
4963
    }
4964
    FreeHandshakeHashes(ssl);
4965
    /* set hsHashesEch to NULL to avoid double free */
4966
    ssl->hsHashesEch = NULL;
4967
    /* swap to tmp, will be inner if accepted, hsHashes if rejected */
4968
    ssl->hsHashes = tmpHashes;
4969
    return ret;
4970
}
4971
#endif
4972
4973
/* handle processing of TLS 1.3 server_hello (2) and hello_retry_request (6) */
4974
/* Handle the ServerHello message from the server.
4975
 * Only a client will receive this message.
4976
 *
4977
 * ssl       The SSL/TLS object.
4978
 * input     The message buffer.
4979
 * inOutIdx  On entry, the index into the message buffer of ServerHello.
4980
 *           On exit, the index of byte after the ServerHello message.
4981
 * helloSz   The length of the current handshake message.
4982
 * returns 0 on success and otherwise failure.
4983
 */
4984
4985
typedef struct Dsh13Args {
4986
    ProtocolVersion pv;
4987
    word32          idx;
4988
    word32          begin;
4989
    const byte*     sessId;
4990
    word16          totalExtSz;
4991
    byte            sessIdSz;
4992
    byte            extMsgType;
4993
#if defined(HAVE_ECH)
4994
    TLSX* echX;
4995
    byte* acceptLabel;
4996
    word32 acceptOffset;
4997
    word16 acceptLabelSz;
4998
#endif
4999
} Dsh13Args;
5000
5001
int DoTls13ServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
5002
                       word32 helloSz, byte* extMsgType)
5003
{
5004
    int ret;
5005
    byte suite[2];
5006
    byte tls12minor;
5007
#ifdef WOLFSSL_ASYNC_CRYPT
5008
    Dsh13Args* args = NULL;
5009
#else
5010
    Dsh13Args  args[1];
5011
#endif
5012
#ifdef WOLFSSL_ASYNC_CRYPT
5013
    WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
5014
#endif
5015
5016
    WOLFSSL_START(WC_FUNC_SERVER_HELLO_DO);
5017
    WOLFSSL_ENTER("DoTls13ServerHello");
5018
5019
    if (ssl == NULL || ssl->arrays == NULL)
5020
        return BAD_FUNC_ARG;
5021
5022
    tls12minor = TLSv1_2_MINOR;
5023
5024
#ifdef WOLFSSL_DTLS13
5025
    if (ssl->options.dtls)
5026
        tls12minor = DTLSv1_2_MINOR;
5027
#endif /*  WOLFSSL_DTLS13 */
5028
5029
#ifdef WOLFSSL_ASYNC_CRYPT
5030
    if (ssl->async == NULL) {
5031
        ssl->async = (struct WOLFSSL_ASYNC*)
5032
                XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
5033
                        DYNAMIC_TYPE_ASYNC);
5034
        if (ssl->async == NULL)
5035
            return MEMORY_E;
5036
        ssl->async->freeArgs = NULL;
5037
    }
5038
    args = (Dsh13Args*)ssl->async->args;
5039
5040
    ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
5041
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
5042
        /* Check for error */
5043
        if (ret < 0) {
5044
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
5045
                /* Mark message as not received so it can process again */
5046
                ssl->msgsReceived.got_server_hello = 0;
5047
            }
5048
            return ret;
5049
        }
5050
    }
5051
    else
5052
#endif
5053
    {
5054
        /* Reset state */
5055
        ssl->options.asyncState = TLS_ASYNC_BEGIN;
5056
        XMEMSET(args, 0, sizeof(Dsh13Args));
5057
    }
5058
5059
    switch (ssl->options.asyncState) {
5060
    case TLS_ASYNC_BEGIN:
5061
    {
5062
    byte b;
5063
#ifdef WOLFSSL_CALLBACKS
5064
    if (ssl->hsInfoOn) AddPacketName(ssl, "ServerHello");
5065
    if (ssl->toInfoOn) AddLateName("ServerHello", &ssl->timeoutInfo);
5066
#endif
5067
5068
    /* Protocol version length check. */
5069
    if (helloSz < OPAQUE16_LEN)
5070
        return BUFFER_ERROR;
5071
5072
    args->idx = *inOutIdx;
5073
    args->begin = args->idx;
5074
5075
    /* Protocol version */
5076
    XMEMCPY(&args->pv, input + args->idx, OPAQUE16_LEN);
5077
    args->idx += OPAQUE16_LEN;
5078
5079
#ifdef WOLFSSL_DTLS
5080
    if (ssl->options.dtls &&
5081
        (args->pv.major != DTLS_MAJOR || args->pv.minor == DTLS_BOGUS_MINOR))
5082
        return VERSION_ERROR;
5083
#endif /* WOLFSSL_DTLS */
5084
5085
#ifndef WOLFSSL_NO_TLS12
5086
    {
5087
        byte wantDowngrade;
5088
5089
        wantDowngrade = args->pv.major == ssl->version.major &&
5090
            args->pv.minor < TLSv1_2_MINOR;
5091
5092
#ifdef WOLFSSL_DTLS13
5093
        if (ssl->options.dtls)
5094
            wantDowngrade = args->pv.major == ssl->version.major &&
5095
                args->pv.minor > DTLSv1_2_MINOR;
5096
#endif /* WOLFSSL_DTLS13 */
5097
5098
        if (wantDowngrade && ssl->options.downgrade) {
5099
            /* Force client hello version 1.2 to work for static RSA. */
5100
            ssl->chVersion.minor = TLSv1_2_MINOR;
5101
            ssl->version.minor = TLSv1_2_MINOR;
5102
            ssl->options.tls1_3 = 0;
5103
5104
#ifdef WOLFSSL_DTLS13
5105
            if (ssl->options.dtls) {
5106
                ssl->chVersion.minor = DTLSv1_2_MINOR;
5107
                ssl->version.minor = DTLSv1_2_MINOR;
5108
                ret = Dtls13ClientDoDowngrade(ssl);
5109
                if (ret != 0)
5110
                    return ret;
5111
            }
5112
#endif /* WOLFSSL_DTLS13 */
5113
5114
            return DoServerHello(ssl, input, inOutIdx, helloSz);
5115
        }
5116
    }
5117
#endif
5118
5119
    if (args->pv.major != ssl->version.major ||
5120
        args->pv.minor != tls12minor) {
5121
        SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
5122
        WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
5123
        return VERSION_ERROR;
5124
    }
5125
5126
    /* Random and session id length check */
5127
    if ((args->idx - args->begin) + RAN_LEN + ENUM_LEN > helloSz)
5128
        return BUFFER_ERROR;
5129
5130
    /* Check if hello retry request */
5131
    if (XMEMCMP(input + args->idx, helloRetryRequestRandom, RAN_LEN) == 0) {
5132
        WOLFSSL_MSG("HelloRetryRequest format");
5133
        *extMsgType = hello_retry_request;
5134
5135
        if (ssl->msgsReceived.got_hello_verify_request) {
5136
            WOLFSSL_MSG("Received HelloRetryRequest after a "
5137
                        "HelloVerifyRequest");
5138
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
5139
            return VERSION_ERROR;
5140
        }
5141
5142
        /* A HelloRetryRequest comes in as an ServerHello for MiddleBox compat.
5143
         * Found message to be a HelloRetryRequest.
5144
         * Don't allow more than one HelloRetryRequest or ServerHello.
5145
         */
5146
        if (ssl->msgsReceived.got_hello_retry_request) {
5147
            WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
5148
            return DUPLICATE_MSG_E;
5149
        }
5150
    }
5151
    args->extMsgType = *extMsgType;
5152
5153
    /* Server random - keep for debugging. */
5154
    XMEMCPY(ssl->arrays->serverRandom, input + args->idx, RAN_LEN);
5155
#if defined(HAVE_ECH)
5156
    /* last 8 bytes of server random */
5157
    args->acceptOffset = args->idx + RAN_LEN - ECH_ACCEPT_CONFIRMATION_SZ;
5158
#endif
5159
    args->idx += RAN_LEN;
5160
5161
    /* Session id */
5162
    args->sessIdSz = input[args->idx++];
5163
    if ((args->idx - args->begin) + args->sessIdSz > helloSz)
5164
        return BUFFER_ERROR;
5165
    args->sessId = input + args->idx;
5166
    args->idx += args->sessIdSz;
5167
5168
    ssl->options.haveSessionId = 1;
5169
5170
    /* Ciphersuite and compression check */
5171
    if ((args->idx - args->begin) + OPAQUE16_LEN + OPAQUE8_LEN > helloSz)
5172
        return BUFFER_ERROR;
5173
5174
    /* Set the cipher suite from the message. */
5175
    ssl->options.cipherSuite0 = input[args->idx++];
5176
    ssl->options.cipherSuite  = input[args->idx++];
5177
    if (*extMsgType == hello_retry_request) {
5178
        ssl->options.hrrCipherSuite0 = ssl->options.cipherSuite0;
5179
        ssl->options.hrrCipherSuite  = ssl->options.cipherSuite;
5180
    }
5181
    else if (ssl->msgsReceived.got_hello_retry_request &&
5182
             (ssl->options.hrrCipherSuite0 != ssl->options.cipherSuite0 ||
5183
                     ssl->options.hrrCipherSuite != ssl->options.cipherSuite)) {
5184
        WOLFSSL_MSG("Received ServerHello with different cipher suite than "
5185
                    "HelloRetryRequest");
5186
        WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
5187
        return INVALID_PARAMETER;
5188
    }
5189
#ifdef WOLFSSL_DEBUG_TLS
5190
    WOLFSSL_MSG("Chosen cipher suite:");
5191
    WOLFSSL_MSG(GetCipherNameInternal(ssl->options.cipherSuite0,
5192
                                      ssl->options.cipherSuite));
5193
#endif
5194
5195
    /* Compression */
5196
    b = input[args->idx++];
5197
    if (b != 0) {
5198
        WOLFSSL_MSG("Must be no compression types in list");
5199
        WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
5200
        return INVALID_PARAMETER;
5201
    }
5202
5203
    if ((args->idx - args->begin) + OPAQUE16_LEN > helloSz) {
5204
        if (!ssl->options.downgrade)
5205
            return BUFFER_ERROR;
5206
#ifndef WOLFSSL_NO_TLS12
5207
        /* Force client hello version 1.2 to work for static RSA. */
5208
        ssl->chVersion.minor = TLSv1_2_MINOR;
5209
        ssl->version.minor = TLSv1_2_MINOR;
5210
5211
#ifdef WOLFSSL_DTLS13
5212
        if (ssl->options.dtls) {
5213
            ssl->chVersion.minor = DTLSv1_2_MINOR;
5214
            ssl->version.minor = DTLSv1_2_MINOR;
5215
            ssl->options.tls1_3 = 0;
5216
            ret = Dtls13ClientDoDowngrade(ssl);
5217
            if (ret != 0)
5218
                return ret;
5219
        }
5220
#endif /* WOLFSSL_DTLS13 */
5221
5222
#endif
5223
        ssl->options.haveEMS = 0;
5224
        if (args->pv.minor < ssl->options.minDowngrade) {
5225
            SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
5226
            return VERSION_ERROR;
5227
        }
5228
#ifndef WOLFSSL_NO_TLS12
5229
        ssl->options.tls1_3 = 0;
5230
        return DoServerHello(ssl, input, inOutIdx, helloSz);
5231
#else
5232
        SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
5233
        return VERSION_ERROR;
5234
#endif
5235
    }
5236
5237
    if ((args->idx - args->begin) < helloSz) {
5238
        int foundVersion;
5239
5240
        /* Get extension length and length check. */
5241
        if ((args->idx - args->begin) + OPAQUE16_LEN > helloSz)
5242
            return BUFFER_ERROR;
5243
        ato16(&input[args->idx], &args->totalExtSz);
5244
        args->idx += OPAQUE16_LEN;
5245
        if ((args->idx - args->begin) + args->totalExtSz > helloSz)
5246
            return BUFFER_ERROR;
5247
5248
        /* Need to negotiate version first. */
5249
        if ((ret = TLSX_ParseVersion(ssl, input + args->idx,
5250
            args->totalExtSz, *extMsgType, &foundVersion))) {
5251
            return ret;
5252
        }
5253
        if (!foundVersion) {
5254
            if (!ssl->options.downgrade) {
5255
                WOLFSSL_MSG("Server trying to downgrade to version less than "
5256
                            "TLS v1.3");
5257
                SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
5258
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
5259
                return VERSION_ERROR;
5260
            }
5261
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
5262
    defined(WOLFSSL_WPAS_SMALL)
5263
            /* Check if client has disabled TLS 1.2 */
5264
            if (args->pv.minor == TLSv1_2_MINOR &&
5265
                (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2)
5266
                == WOLFSSL_OP_NO_TLSv1_2)
5267
            {
5268
                WOLFSSL_MSG("\tOption set to not allow TLSv1.2");
5269
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
5270
                return VERSION_ERROR;
5271
            }
5272
#endif
5273
5274
            if (!ssl->options.dtls &&
5275
                args->pv.minor < ssl->options.minDowngrade) {
5276
                SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
5277
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
5278
                return VERSION_ERROR;
5279
            }
5280
5281
            if (ssl->options.dtls &&
5282
                args->pv.minor > ssl->options.minDowngrade) {
5283
                SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
5284
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
5285
                return VERSION_ERROR;
5286
            }
5287
5288
            ssl->version.minor = args->pv.minor;
5289
            ssl->options.tls1_3 = 0;
5290
5291
#ifdef WOLFSSL_DTLS13
5292
            if (ssl->options.dtls) {
5293
                ret = Dtls13ClientDoDowngrade(ssl);
5294
                if (ret != 0)
5295
                    return ret;
5296
            }
5297
#endif /* WOLFSSL_DTLS13 */
5298
        }
5299
    }
5300
5301
#ifdef WOLFSSL_DTLS13
5302
    /* we are sure that version is >= v1.3 now, we can get rid of buffered
5303
     * ClientHello that was buffered to re-compute the hash in case of
5304
     * downgrade */
5305
    if (ssl->options.dtls && ssl->dtls13ClientHello != NULL) {
5306
        XFREE(ssl->dtls13ClientHello, ssl->heap, DYNAMIC_TYPE_DTLS_MSG);
5307
        ssl->dtls13ClientHello = NULL;
5308
        ssl->dtls13ClientHelloSz = 0;
5309
    }
5310
#endif /* WOLFSSL_DTLS13 */
5311
5312
    /* Advance state and proceed */
5313
    ssl->options.asyncState = TLS_ASYNC_BUILD;
5314
    } /* case TLS_ASYNC_BEGIN */
5315
    FALL_THROUGH;
5316
5317
    case TLS_ASYNC_BUILD:
5318
    case TLS_ASYNC_DO:
5319
    {
5320
    /* restore message type */
5321
    *extMsgType = args->extMsgType;
5322
5323
    /* Parse and handle extensions, unless lower than TLS1.3. In that case,
5324
     * extensions will be parsed in DoServerHello. */
5325
    if (args->totalExtSz > 0 && IsAtLeastTLSv1_3(ssl->version)) {
5326
        ret = TLSX_Parse(ssl, input + args->idx, args->totalExtSz,
5327
            *extMsgType, NULL);
5328
        if (ret != 0) {
5329
        #ifdef WOLFSSL_ASYNC_CRYPT
5330
            /* Handle async operation */
5331
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
5332
                /* Mark message as not received so it can process again */
5333
                ssl->msgsReceived.got_server_hello = 0;
5334
            }
5335
        #endif
5336
            return ret;
5337
        }
5338
5339
        if (*extMsgType == hello_retry_request) {
5340
            /* Update counts to reflect change of message type. */
5341
            ssl->msgsReceived.got_hello_retry_request = 1;
5342
            ssl->msgsReceived.got_server_hello = 0;
5343
        }
5344
    }
5345
5346
    if (args->totalExtSz > 0) {
5347
        args->idx += args->totalExtSz;
5348
    }
5349
5350
#ifdef WOLFSSL_DTLS_CID
5351
    if (ssl->options.useDtlsCID && *extMsgType == server_hello)
5352
        DtlsCIDOnExtensionsParsed(ssl);
5353
#endif /* WOLFSSL_DTLS_CID */
5354
5355
    if (IsAtLeastTLSv1_3(ssl->version)) {
5356
        *inOutIdx = args->idx;
5357
    }
5358
5359
    ssl->options.serverState = SERVER_HELLO_COMPLETE;
5360
5361
#ifdef HAVE_SECRET_CALLBACK
5362
    if (ssl->sessionSecretCb != NULL
5363
#ifdef HAVE_SESSION_TICKET
5364
            && ssl->session->ticketLen > 0
5365
#endif
5366
            ) {
5367
        int secretSz = SECRET_LEN;
5368
        ret = ssl->sessionSecretCb(ssl, ssl->session->masterSecret,
5369
                                   &secretSz, ssl->sessionSecretCtx);
5370
        if (ret != 0 || secretSz != SECRET_LEN) {
5371
            WOLFSSL_ERROR_VERBOSE(SESSION_SECRET_CB_E);
5372
            return SESSION_SECRET_CB_E;
5373
        }
5374
    }
5375
#endif /* HAVE_SECRET_CALLBACK */
5376
5377
    /* Version only negotiated in extensions for TLS v1.3.
5378
     * Only now do we know how to deal with session id.
5379
     */
5380
    if (!IsAtLeastTLSv1_3(ssl->version)) {
5381
#ifndef WOLFSSL_NO_TLS12
5382
        ssl->arrays->sessionIDSz = args->sessIdSz;
5383
5384
        if (ssl->arrays->sessionIDSz > ID_LEN) {
5385
            WOLFSSL_MSG("Invalid session ID size");
5386
            ssl->arrays->sessionIDSz = 0;
5387
            return BUFFER_ERROR;
5388
        }
5389
        else if (ssl->arrays->sessionIDSz) {
5390
            XMEMCPY(ssl->arrays->sessionID, args->sessId,
5391
                ssl->arrays->sessionIDSz);
5392
            ssl->options.haveSessionId = 1;
5393
        }
5394
5395
        /* Force client hello version 1.2 to work for static RSA. */
5396
        if (ssl->options.dtls)
5397
            ssl->chVersion.minor = DTLSv1_2_MINOR;
5398
        else
5399
            ssl->chVersion.minor = TLSv1_2_MINOR;
5400
        /* Complete TLS v1.2 processing of ServerHello. */
5401
        ret = DoServerHello(ssl, input, inOutIdx, helloSz);
5402
#else
5403
        WOLFSSL_MSG("Client using higher version, fatal error");
5404
        WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
5405
        ret = VERSION_ERROR;
5406
#endif
5407
5408
        WOLFSSL_LEAVE("DoTls13ServerHello", ret);
5409
5410
        return ret;
5411
    }
5412
5413
    /* Advance state and proceed */
5414
    ssl->options.asyncState = TLS_ASYNC_FINALIZE;
5415
    } /* case TLS_ASYNC_BUILD || TLS_ASYNC_DO */
5416
    FALL_THROUGH;
5417
5418
    case TLS_ASYNC_FINALIZE:
5419
    {
5420
#ifdef WOLFSSL_TLS13_MIDDLEBOX_COMPAT
5421
    if (ssl->options.tls13MiddleBoxCompat) {
5422
        if (args->sessIdSz == 0) {
5423
            WOLFSSL_MSG("args->sessIdSz == 0");
5424
            WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
5425
            return INVALID_PARAMETER;
5426
        }
5427
        if (ssl->session->sessionIDSz != 0) {
5428
            if (ssl->session->sessionIDSz != args->sessIdSz ||
5429
                XMEMCMP(ssl->session->sessionID, args->sessId,
5430
                    args->sessIdSz) != 0) {
5431
                WOLFSSL_MSG("session id doesn't match");
5432
                WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
5433
                return INVALID_PARAMETER;
5434
            }
5435
        }
5436
        else if (XMEMCMP(ssl->arrays->clientRandom, args->sessId,
5437
                args->sessIdSz) != 0) {
5438
            WOLFSSL_MSG("session id doesn't match client random");
5439
            WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
5440
            return INVALID_PARAMETER;
5441
        }
5442
    }
5443
    else
5444
#endif /* WOLFSSL_TLS13_MIDDLEBOX_COMPAT */
5445
#ifdef WOLFSSL_QUIC
5446
    if (WOLFSSL_IS_QUIC(ssl)) {
5447
        if (args->sessIdSz != 0) {
5448
            WOLFSSL_MSG("args->sessIdSz != 0");
5449
            WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
5450
            return INVALID_PARAMETER;
5451
        }
5452
    }
5453
    else
5454
#endif /* WOLFSSL_QUIC */
5455
    if (args->sessIdSz != ssl->session->sessionIDSz || (args->sessIdSz > 0 &&
5456
        XMEMCMP(ssl->session->sessionID, args->sessId, args->sessIdSz) != 0))
5457
    {
5458
        WOLFSSL_MSG("Server sent different session id");
5459
        WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
5460
        return INVALID_PARAMETER;
5461
    }
5462
5463
    ret = SetCipherSpecs(ssl);
5464
    if (ret != 0)
5465
        return ret;
5466
5467
#ifdef HAVE_NULL_CIPHER
5468
    if (ssl->options.cipherSuite0 == ECC_BYTE &&
5469
                              (ssl->options.cipherSuite == TLS_SHA256_SHA256 ||
5470
                               ssl->options.cipherSuite == TLS_SHA384_SHA384)) {
5471
        ;
5472
    }
5473
    else
5474
#endif
5475
#if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_SM3)
5476
    if (ssl->options.cipherSuite0 == CIPHER_BYTE &&
5477
            ssl->options.cipherSuite == TLS_SM4_GCM_SM3) {
5478
        ; /* Do nothing. */
5479
    }
5480
    else
5481
#endif
5482
#if defined(WOLFSSL_SM4_CCM) && defined(WOLFSSL_SM3)
5483
    if (ssl->options.cipherSuite0 == CIPHER_BYTE &&
5484
            ssl->options.cipherSuite == TLS_SM4_CCM_SM3) {
5485
        ; /* Do nothing. */
5486
    }
5487
    else
5488
#endif
5489
    /* Check that the negotiated ciphersuite matches protocol version. */
5490
    if (ssl->options.cipherSuite0 != TLS13_BYTE) {
5491
        WOLFSSL_MSG("Server sent non-TLS13 cipher suite in TLS 1.3 packet");
5492
        WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
5493
        return INVALID_PARAMETER;
5494
    }
5495
5496
    suite[0] = ssl->options.cipherSuite0;
5497
    suite[1] = ssl->options.cipherSuite;
5498
    if (!FindSuiteSSL(ssl, suite)) {
5499
        WOLFSSL_MSG("Cipher suite not supported on client");
5500
        WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
5501
        return INVALID_PARAMETER;
5502
    }
5503
5504
#if defined(HAVE_ECH)
5505
    /* check for acceptConfirmation, must be done after hashes restart */
5506
    if (ssl->options.useEch == 1) {
5507
        args->echX = TLSX_Find(ssl->extensions, TLSX_ECH);
5508
        /* account for hrr extension instead of server random */
5509
        if (args->extMsgType == hello_retry_request) {
5510
            args->acceptOffset =
5511
                (word32)(((WOLFSSL_ECH*)args->echX->data)->confBuf - input);
5512
            args->acceptLabel = (byte*)echHrrAcceptConfirmationLabel;
5513
            args->acceptLabelSz = ECH_HRR_ACCEPT_CONFIRMATION_LABEL_SZ;
5514
        }
5515
        else {
5516
            args->acceptLabel = (byte*)echAcceptConfirmationLabel;
5517
            args->acceptLabelSz = ECH_ACCEPT_CONFIRMATION_LABEL_SZ;
5518
        }
5519
        /* check acceptance */
5520
        if (ret == 0) {
5521
            ret = EchCheckAcceptance(ssl, args->acceptLabel,
5522
                args->acceptLabelSz, input, args->acceptOffset, helloSz);
5523
        }
5524
        if (ret != 0)
5525
            return ret;
5526
        /* use the inner random for client random */
5527
        if (args->extMsgType != hello_retry_request) {
5528
            XMEMCPY(ssl->arrays->clientRandom, ssl->arrays->clientRandomInner,
5529
                RAN_LEN);
5530
        }
5531
    }
5532
#endif /* HAVE_ECH */
5533
5534
    if (*extMsgType == server_hello) {
5535
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
5536
        PreSharedKey* psk = NULL;
5537
        TLSX* ext = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
5538
        if (ext != NULL)
5539
            psk = (PreSharedKey*)ext->data;
5540
        while (psk != NULL && !psk->chosen)
5541
            psk = psk->next;
5542
        if (psk == NULL) {
5543
            ssl->options.resuming = 0;
5544
            ssl->arrays->psk_keySz = 0;
5545
            XMEMSET(ssl->arrays->psk_key, 0, MAX_PSK_KEY_LEN);
5546
        }
5547
        else {
5548
            if ((ret = SetupPskKey(ssl, psk, 0)) != 0)
5549
                return ret;
5550
            ssl->options.pskNegotiated = 1;
5551
        }
5552
#else
5553
        /* no resumption possible */
5554
        ssl->options.resuming = 0;
5555
#endif
5556
5557
        /* sanity check on PSK / KSE */
5558
        if (
5559
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
5560
            ssl->options.pskNegotiated == 0 &&
5561
    #endif
5562
            (ssl->session->namedGroup == 0 ||
5563
             ssl->options.shSentKeyShare == 0)) {
5564
            return EXT_MISSING;
5565
        }
5566
5567
        ssl->keys.encryptionOn = 1;
5568
        ssl->options.serverState = SERVER_HELLO_COMPLETE;
5569
5570
    }
5571
    else {
5572
        /* https://datatracker.ietf.org/doc/html/rfc8446#section-4.1.4
5573
         * Clients MUST abort the handshake with an
5574
         * "illegal_parameter" alert if the HelloRetryRequest would not result
5575
         * in any change in the ClientHello.
5576
         */
5577
        /* Check if the HRR contained a cookie or a keyshare */
5578
        if (!ssl->options.hrrSentKeyShare
5579
#ifdef WOLFSSL_SEND_HRR_COOKIE
5580
                && !ssl->options.hrrSentCookie
5581
#endif
5582
                ) {
5583
            SendAlert(ssl, alert_fatal, illegal_parameter);
5584
            return EXT_MISSING;
5585
        }
5586
5587
        ssl->options.tls1_3 = 1;
5588
        ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
5589
5590
        ret = RestartHandshakeHash(ssl);
5591
    }
5592
5593
    break;
5594
    } /* case TLS_ASYNC_FINALIZE */
5595
    default:
5596
        ret = INPUT_CASE_ERROR;
5597
    } /* switch (ssl->options.asyncState) */
5598
5599
#ifdef WOLFSSL_ASYNC_CRYPT
5600
    if (ret == 0)
5601
        FreeAsyncCtx(ssl, 0);
5602
#endif
5603
5604
    WOLFSSL_LEAVE("DoTls13ServerHello", ret);
5605
    WOLFSSL_END(WC_FUNC_SERVER_HELLO_DO);
5606
5607
    return ret;
5608
}
5609
5610
/* handle processing TLS 1.3 encrypted_extensions (8) */
5611
/* Parse and handle an EncryptedExtensions message.
5612
 * Only a client will receive this message.
5613
 *
5614
 * ssl       The SSL/TLS object.
5615
 * input     The message buffer.
5616
 * inOutIdx  On entry, the index into the message buffer of
5617
 *           EncryptedExtensions.
5618
 *           On exit, the index of byte after the EncryptedExtensions
5619
 *           message.
5620
 * totalSz   The length of the current handshake message.
5621
 * returns 0 on success and otherwise failure.
5622
 */
5623
static int DoTls13EncryptedExtensions(WOLFSSL* ssl, const byte* input,
5624
                                      word32* inOutIdx, word32 totalSz)
5625
0
{
5626
0
    int    ret;
5627
0
    word32 begin = *inOutIdx;
5628
0
    word32 i = begin;
5629
0
    word16 totalExtSz;
5630
5631
0
    WOLFSSL_START(WC_FUNC_ENCRYPTED_EXTENSIONS_DO);
5632
0
    WOLFSSL_ENTER("DoTls13EncryptedExtensions");
5633
5634
#ifdef WOLFSSL_CALLBACKS
5635
    if (ssl->hsInfoOn) AddPacketName(ssl, "EncryptedExtensions");
5636
    if (ssl->toInfoOn) AddLateName("EncryptedExtensions", &ssl->timeoutInfo);
5637
#endif
5638
5639
    /* Length field of extension data. */
5640
0
    if (totalSz < OPAQUE16_LEN)
5641
0
        return BUFFER_ERROR;
5642
0
    ato16(&input[i], &totalExtSz);
5643
0
    i += OPAQUE16_LEN;
5644
5645
    /* Extension data. */
5646
0
    if (i - begin + totalExtSz > totalSz)
5647
0
        return BUFFER_ERROR;
5648
0
    if ((ret = TLSX_Parse(ssl, input + i, totalExtSz, encrypted_extensions,
5649
0
                                                                       NULL))) {
5650
0
        return ret;
5651
0
    }
5652
5653
    /* Move index to byte after message. */
5654
0
    *inOutIdx = i + totalExtSz;
5655
5656
    /* Always encrypted. */
5657
0
    *inOutIdx += ssl->keys.padSz;
5658
5659
#ifdef WOLFSSL_EARLY_DATA
5660
    if (ssl->earlyData != no_early_data) {
5661
        TLSX* ext = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
5662
        if (ext == NULL || !ext->val)
5663
            ssl->earlyData = no_early_data;
5664
    }
5665
5666
    if (ssl->earlyData == no_early_data) {
5667
        ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY);
5668
        if (ret != 0)
5669
            return ret;
5670
    }
5671
#endif /* WOLFSSL_EARLY_DATA */
5672
5673
0
    ssl->options.serverState = SERVER_ENCRYPTED_EXTENSIONS_COMPLETE;
5674
5675
0
    WOLFSSL_LEAVE("DoTls13EncryptedExtensions", ret);
5676
0
    WOLFSSL_END(WC_FUNC_ENCRYPTED_EXTENSIONS_DO);
5677
5678
0
    return ret;
5679
0
}
5680
5681
#ifndef NO_CERTS
5682
/* handle processing TLS v1.3 certificate_request (13) */
5683
/* Handle a TLS v1.3 CertificateRequest message.
5684
 * This message is always encrypted.
5685
 * Only a client will receive this message.
5686
 *
5687
 * ssl       The SSL/TLS object.
5688
 * input     The message buffer.
5689
 * inOutIdx  On entry, the index into the message buffer of CertificateRequest.
5690
 *           On exit, the index of byte after the CertificateRequest message.
5691
 * size      The length of the current handshake message.
5692
 * returns 0 on success and otherwise failure.
5693
 */
5694
static int DoTls13CertificateRequest(WOLFSSL* ssl, const byte* input,
5695
                                     word32* inOutIdx, word32 size)
5696
0
{
5697
0
    word16      len;
5698
0
    word32      begin = *inOutIdx;
5699
0
    int         ret = 0;
5700
0
    Suites      peerSuites;
5701
#ifdef WOLFSSL_POST_HANDSHAKE_AUTH
5702
    CertReqCtx* certReqCtx;
5703
#endif
5704
5705
0
    WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_DO);
5706
0
    WOLFSSL_ENTER("DoTls13CertificateRequest");
5707
5708
0
    XMEMSET(&peerSuites, 0, sizeof(Suites));
5709
5710
#ifdef WOLFSSL_CALLBACKS
5711
    if (ssl->hsInfoOn) AddPacketName(ssl, "CertificateRequest");
5712
    if (ssl->toInfoOn) AddLateName("CertificateRequest", &ssl->timeoutInfo);
5713
#endif
5714
5715
#ifdef WOLFSSL_CERT_SETUP_CB
5716
    if ((ret = CertSetupCbWrapper(ssl)) != 0)
5717
        return ret;
5718
#endif
5719
5720
0
    if (OPAQUE8_LEN > size)
5721
0
        return BUFFER_ERROR;
5722
5723
    /* Length of the request context. */
5724
0
    len = input[(*inOutIdx)++];
5725
0
    if ((*inOutIdx - begin) + len > size)
5726
0
        return BUFFER_ERROR;
5727
0
    if (ssl->options.connectState < FINISHED_DONE && len > 0)
5728
0
        return BUFFER_ERROR;
5729
5730
#ifdef WOLFSSL_POST_HANDSHAKE_AUTH
5731
    /* CertReqCtx has one byte at end for context value.
5732
     * Increase size to handle other implementations sending more than one byte.
5733
     * That is, allocate extra space, over one byte, to hold the context value.
5734
     */
5735
    certReqCtx = (CertReqCtx*)XMALLOC(sizeof(CertReqCtx) + len - 1, ssl->heap,
5736
                                                       DYNAMIC_TYPE_TMP_BUFFER);
5737
    if (certReqCtx == NULL)
5738
        return MEMORY_E;
5739
    certReqCtx->next = ssl->certReqCtx;
5740
    certReqCtx->len = len;
5741
    XMEMCPY(&certReqCtx->ctx, input + *inOutIdx, len);
5742
    ssl->certReqCtx = certReqCtx;
5743
#endif
5744
0
    *inOutIdx += len;
5745
5746
    /* TODO: Add support for more extensions:
5747
     *   signed_certificate_timestamp, certificate_authorities, oid_filters.
5748
     */
5749
    /* Certificate extensions */
5750
0
    if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
5751
0
        return BUFFER_ERROR;
5752
0
    ato16(input + *inOutIdx, &len);
5753
0
    *inOutIdx += OPAQUE16_LEN;
5754
0
    if ((*inOutIdx - begin) + len > size)
5755
0
        return BUFFER_ERROR;
5756
0
    if (len == 0)
5757
0
        return INVALID_PARAMETER;
5758
0
    if ((ret = TLSX_Parse(ssl, input + *inOutIdx, len, certificate_request,
5759
0
                                                                &peerSuites))) {
5760
0
        return ret;
5761
0
    }
5762
0
    *inOutIdx += len;
5763
5764
#ifdef OPENSSL_EXTRA
5765
    if ((ret = CertSetupCbWrapper(ssl)) != 0)
5766
        return ret;
5767
#endif
5768
5769
0
    if ((ssl->buffers.certificate && ssl->buffers.certificate->buffer &&
5770
0
        ((ssl->buffers.key && ssl->buffers.key->buffer)
5771
        #ifdef HAVE_PK_CALLBACKS
5772
            || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
5773
        #endif
5774
0
    ))
5775
        #ifdef OPENSSL_EXTRA
5776
            || ssl->ctx->certSetupCb != NULL
5777
        #endif
5778
0
            ) {
5779
0
        if (PickHashSigAlgo(ssl, peerSuites.hashSigAlgo,
5780
0
                            peerSuites.hashSigAlgoSz, 0) != 0) {
5781
0
            WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
5782
0
            return INVALID_PARAMETER;
5783
0
        }
5784
0
        ssl->options.sendVerify = SEND_CERT;
5785
0
    }
5786
0
    else {
5787
0
#ifndef WOLFSSL_NO_CLIENT_CERT_ERROR
5788
0
        ssl->options.sendVerify = SEND_BLANK_CERT;
5789
#else
5790
        WOLFSSL_MSG("Certificate required but none set on client");
5791
        SendAlert(ssl, alert_fatal, illegal_parameter);
5792
        WOLFSSL_ERROR_VERBOSE(NO_CERT_ERROR);
5793
        return NO_CERT_ERROR;
5794
#endif
5795
0
    }
5796
5797
    /* This message is always encrypted so add encryption padding. */
5798
0
    *inOutIdx += ssl->keys.padSz;
5799
5800
0
    WOLFSSL_LEAVE("DoTls13CertificateRequest", ret);
5801
0
    WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_DO);
5802
5803
0
    return ret;
5804
0
}
5805
#endif /* !NO_CERTS */
5806
#endif /* !NO_WOLFSSL_CLIENT */
5807
5808
#ifndef NO_WOLFSSL_SERVER
5809
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
5810
#ifndef NO_PSK
5811
int FindPskSuite(const WOLFSSL* ssl, PreSharedKey* psk, byte* psk_key,
5812
        word32* psk_keySz, const byte* suite, int* found, byte* foundSuite)
5813
{
5814
    const char* cipherName = NULL;
5815
    byte        cipherSuite0 = TLS13_BYTE;
5816
    byte        cipherSuite  = WOLFSSL_DEF_PSK_CIPHER;
5817
    int         ret = 0;
5818
5819
    *found = 0;
5820
    (void)suite;
5821
5822
    if (ssl->options.server_psk_tls13_cb != NULL) {
5823
         *psk_keySz = ssl->options.server_psk_tls13_cb((WOLFSSL*)ssl,
5824
             (char*)psk->identity, psk_key, MAX_PSK_KEY_LEN, &cipherName);
5825
         if (*psk_keySz != 0) {
5826
             int cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE;
5827
             *found = (GetCipherSuiteFromName(cipherName, &cipherSuite0,
5828
                 &cipherSuite, NULL, NULL, &cipherSuiteFlags) == 0);
5829
             (void)cipherSuiteFlags;
5830
         }
5831
    }
5832
    if (*found == 0 && (ssl->options.server_psk_cb != NULL)) {
5833
         *psk_keySz = ssl->options.server_psk_cb((WOLFSSL*)ssl,
5834
                             (char*)psk->identity, psk_key,
5835
                             MAX_PSK_KEY_LEN);
5836
         *found = (*psk_keySz != 0);
5837
    }
5838
    if (*found) {
5839
        if (*psk_keySz > MAX_PSK_KEY_LEN &&
5840
            *((int*)psk_keySz) != WC_NO_ERR_TRACE(USE_HW_PSK)) {
5841
            WOLFSSL_MSG("Key len too long in FindPsk()");
5842
            ret = PSK_KEY_ERROR;
5843
            WOLFSSL_ERROR_VERBOSE(ret);
5844
            *found = 0;
5845
        }
5846
        if (ret == 0) {
5847
        #if !defined(WOLFSSL_PSK_ONE_ID) && !defined(WOLFSSL_PRIORITIZE_PSK)
5848
            /* Check whether PSK ciphersuite is in SSL. */
5849
            *found = (suite[0] == cipherSuite0) && (suite[1] == cipherSuite);
5850
        #else
5851
            (void)suite;
5852
            /* Check whether PSK ciphersuite is in SSL. */
5853
            {
5854
                byte s[2] = {
5855
                    cipherSuite0,
5856
                    cipherSuite,
5857
                };
5858
                *found = FindSuiteSSL(ssl, s);
5859
            }
5860
        #endif
5861
        }
5862
    }
5863
    if (*found && foundSuite != NULL) {
5864
        foundSuite[0] = cipherSuite0;
5865
        foundSuite[1] = cipherSuite;
5866
    }
5867
5868
    return ret;
5869
}
5870
5871
/* Attempt to find the PSK (not session ticket) that matches.
5872
 *
5873
 * @param [in, out] ssl    The SSL/TLS object.
5874
 * @param [in]      psk    A pre-shared key from the extension.
5875
 * @param [out]     suite  Cipher suite to use with PSK.
5876
 * @param [out]     err    Error code.
5877
 *                         PSK_KEY_ERROR when key is too big or ticket age is
5878
 *                         invalid,
5879
 *                         UNSUPPORTED_SUITE on invalid suite.
5880
 *                         Other error when attempting to derive early secret.
5881
 * @return  1 when a match found - but check error code.
5882
 * @return  0 when no match found.
5883
 */
5884
static int FindPsk(WOLFSSL* ssl, PreSharedKey* psk, const byte* suite, int* err)
5885
{
5886
    int         ret = 0;
5887
    int         found = 0;
5888
    byte        foundSuite[SUITE_LEN];
5889
5890
    WOLFSSL_ENTER("FindPsk");
5891
5892
    XMEMSET(foundSuite, 0, sizeof(foundSuite));
5893
5894
    ret = FindPskSuite(ssl, psk, ssl->arrays->psk_key, &ssl->arrays->psk_keySz,
5895
                       suite, &found, foundSuite);
5896
    if (ret == 0 && found) {
5897
        /* Default to ciphersuite if cb doesn't specify. */
5898
        ssl->options.resuming = 0;
5899
        /* Don't send certificate request when using PSK. */
5900
        ssl->options.verifyPeer = 0;
5901
5902
        /* PSK age is always zero. */
5903
        if (psk->ticketAge != 0) {
5904
            ret = PSK_KEY_ERROR;
5905
            WOLFSSL_ERROR_VERBOSE(ret);
5906
        }
5907
        if (ret == 0) {
5908
            /* Set PSK ciphersuite into SSL. */
5909
            ssl->options.cipherSuite0 = foundSuite[0];
5910
            ssl->options.cipherSuite  = foundSuite[1];
5911
            ret = SetCipherSpecs(ssl);
5912
        }
5913
        if (ret == 0) {
5914
            /* Derive the early secret using the PSK. */
5915
            ret = DeriveEarlySecret(ssl);
5916
        }
5917
        if (ret == 0) {
5918
            /* PSK negotiation has succeeded */
5919
            ssl->options.isPSK = 1;
5920
            /* SERVER: using PSK for peer authentication. */
5921
            ssl->options.peerAuthGood = 1;
5922
        }
5923
    }
5924
5925
    *err = ret;
5926
    WOLFSSL_LEAVE("FindPsk", found);
5927
    WOLFSSL_LEAVE("FindPsk", ret);
5928
    return found;
5929
}
5930
#endif /* !NO_PSK */
5931
5932
/* Handle any Pre-Shared Key (PSK) extension.
5933
 * Find a PSK that supports the cipher suite passed in.
5934
 *
5935
 * ssl         SSL/TLS object.
5936
 * suite       Cipher suite to find PSK for.
5937
 * usingPSK    1=Indicates handshake is using Pre-Shared Keys (2=Ephemeral)
5938
 * first       Set to 1 if first in extension
5939
 * returns 0 on success and otherwise failure.
5940
 */
5941
static int DoPreSharedKeys(WOLFSSL* ssl, const byte* input, word32 inputSz,
5942
    const byte* suite, int* usingPSK, int* first)
5943
{
5944
    int           ret = 0;
5945
    TLSX*         ext;
5946
    PreSharedKey* current;
5947
    byte          binderKey[WC_MAX_DIGEST_SIZE];
5948
    byte          binder[WC_MAX_DIGEST_SIZE];
5949
    word32        binderLen;
5950
5951
    #ifdef NO_PSK
5952
        (void) suite; /* to avoid unused var warning when not used */
5953
    #endif
5954
5955
    WOLFSSL_ENTER("DoPreSharedKeys");
5956
5957
    (void)suite;
5958
5959
    ext = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
5960
    if (ext == NULL) {
5961
        WOLFSSL_MSG("No pre shared extension keys found");
5962
        return BAD_FUNC_ARG;
5963
    }
5964
5965
    /* Look through all client's pre-shared keys for a match. */
5966
    for (current = (PreSharedKey*)ext->data; current != NULL;
5967
            current = current->next) {
5968
    #ifndef NO_PSK
5969
        if (current->identityLen > MAX_PSK_ID_LEN) {
5970
            return BUFFER_ERROR;
5971
        }
5972
        XMEMCPY(ssl->arrays->client_identity, current->identity,
5973
                current->identityLen);
5974
        ssl->arrays->client_identity[current->identityLen] = '\0';
5975
    #endif
5976
5977
    #ifdef HAVE_SESSION_TICKET
5978
        /* Decode the identity. */
5979
        switch (current->decryptRet) {
5980
            case PSK_DECRYPT_NONE:
5981
                ret = DoClientTicket_ex(ssl, current, 1);
5982
                /* psk->sess may be set. Need to clean up later. */
5983
                break;
5984
            case PSK_DECRYPT_OK:
5985
                ret = WOLFSSL_TICKET_RET_OK;
5986
                break;
5987
            case PSK_DECRYPT_CREATE:
5988
                ret = WOLFSSL_TICKET_RET_CREATE;
5989
                break;
5990
            case PSK_DECRYPT_FAIL:
5991
                ret = WOLFSSL_TICKET_RET_REJECT;
5992
                break;
5993
        }
5994
5995
        #ifdef WOLFSSL_ASYNC_CRYPT
5996
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
5997
            return ret;
5998
        #endif
5999
6000
        if (ret != WOLFSSL_TICKET_RET_OK && current->sess_free_cb != NULL) {
6001
            current->sess_free_cb(ssl, current->sess,
6002
                    &current->sess_free_cb_ctx);
6003
            current->sess = NULL;
6004
            XMEMSET(&current->sess_free_cb_ctx, 0,
6005
                    sizeof(psk_sess_free_cb_ctx));
6006
        }
6007
        if (ret == WOLFSSL_TICKET_RET_OK) {
6008
            ret = DoClientTicketCheck(ssl, current, ssl->timeout, suite);
6009
            if (ret == 0)
6010
                DoClientTicketFinalize(ssl, current->it, current->sess);
6011
            if (current->sess_free_cb != NULL) {
6012
                current->sess_free_cb(ssl, current->sess,
6013
                        &current->sess_free_cb_ctx);
6014
                current->sess = NULL;
6015
                XMEMSET(&current->sess_free_cb_ctx, 0,
6016
                        sizeof(psk_sess_free_cb_ctx));
6017
            }
6018
            if (ret != 0)
6019
                continue;
6020
6021
            /* SERVER: using secret in session ticket for peer auth. */
6022
            ssl->options.peerAuthGood = 1;
6023
6024
        #ifdef WOLFSSL_EARLY_DATA
6025
            ssl->options.maxEarlyDataSz = ssl->session->maxEarlyDataSz;
6026
        #endif
6027
            /* Use the same cipher suite as before and set up for use. */
6028
            ssl->options.cipherSuite0   = ssl->session->cipherSuite0;
6029
            ssl->options.cipherSuite    = ssl->session->cipherSuite;
6030
            ret = SetCipherSpecs(ssl);
6031
            if (ret != 0)
6032
                return ret;
6033
6034
            /* Resumption PSK is resumption master secret. */
6035
            ssl->arrays->psk_keySz = ssl->specs.hash_size;
6036
            if ((ret = DeriveResumptionPSK(ssl, ssl->session->ticketNonce.data,
6037
                ssl->session->ticketNonce.len, ssl->arrays->psk_key)) != 0) {
6038
                return ret;
6039
            }
6040
6041
            /* Derive the early secret using the PSK. */
6042
            ret = DeriveEarlySecret(ssl);
6043
            if (ret != 0)
6044
                return ret;
6045
6046
            /* Hash data up to binders for deriving binders in PSK extension. */
6047
            ret = HashInput(ssl, input, (int)inputSz);
6048
            if (ret < 0)
6049
                return ret;
6050
6051
            /* Derive the binder key to use with HMAC. */
6052
            ret = DeriveBinderKeyResume(ssl, binderKey);
6053
            if (ret != 0)
6054
                return ret;
6055
        }
6056
        else
6057
    #endif /* HAVE_SESSION_TICKET */
6058
    #ifndef NO_PSK
6059
        if (FindPsk(ssl, current, suite, &ret)) {
6060
            if (ret != 0)
6061
                return ret;
6062
6063
            ret = HashInput(ssl, input, (int)inputSz);
6064
            if (ret < 0)
6065
                return ret;
6066
6067
            /* Derive the binder key to use with HMAC. */
6068
            ret = DeriveBinderKey(ssl, binderKey);
6069
            if (ret != 0)
6070
                return ret;
6071
        }
6072
        else
6073
    #endif
6074
        {
6075
            continue;
6076
        }
6077
6078
        ssl->options.sendVerify = 0;
6079
6080
        /* Derive the Finished message secret. */
6081
        ret = DeriveFinishedSecret(ssl, binderKey,
6082
                                   ssl->keys.client_write_MAC_secret,
6083
                                   0 /* neither end */);
6084
        if (ret != 0)
6085
            return ret;
6086
6087
        /* Derive the binder and compare with the one in the extension. */
6088
        ret = BuildTls13HandshakeHmac(ssl,
6089
                         ssl->keys.client_write_MAC_secret, binder, &binderLen);
6090
        if (ret != 0)
6091
            return ret;
6092
        if (binderLen != current->binderLen ||
6093
                             ConstantCompare(binder, current->binder,
6094
                                binderLen) != 0) {
6095
            WOLFSSL_ERROR_VERBOSE(BAD_BINDER);
6096
            return BAD_BINDER;
6097
        }
6098
6099
        /* This PSK works, no need to try any more. */
6100
        current->chosen = 1;
6101
        ext->resp = 1;
6102
        break;
6103
    }
6104
6105
    if (current == NULL) {
6106
#ifdef WOLFSSL_PSK_ID_PROTECTION
6107
    #ifndef NO_CERTS
6108
        if (ssl->buffers.certChainCnt != 0)
6109
            return 0;
6110
    #endif
6111
        WOLFSSL_ERROR_VERBOSE(BAD_BINDER);
6112
        return BAD_BINDER;
6113
#else
6114
        return 0;
6115
#endif
6116
    }
6117
6118
    *first = (current == ext->data);
6119
    *usingPSK = 1;
6120
6121
    WOLFSSL_LEAVE("DoPreSharedKeys", ret);
6122
6123
    return ret;
6124
}
6125
6126
/* Handle any Pre-Shared Key (PSK) extension.
6127
 * Must do this in ClientHello as it requires a hash of the truncated message.
6128
 * Don't know size of binders until Pre-Shared Key extension has been parsed.
6129
 *
6130
 * ssl         SSL/TLS object.
6131
 * input       ClientHello message.
6132
 * helloSz     Size of the ClientHello message (including binders if present).
6133
 * clSuites    Client's cipher suite list.
6134
 * usingPSK    Indicates handshake is using Pre-Shared Keys.
6135
 */
6136
static int CheckPreSharedKeys(WOLFSSL* ssl, const byte* input, word32 helloSz,
6137
                              Suites* clSuites, int* usingPSK)
6138
{
6139
    int    ret;
6140
    TLSX*  ext;
6141
    word16 bindersLen;
6142
    int    first = 0;
6143
#ifndef WOLFSSL_PSK_ONE_ID
6144
    int    i;
6145
    const Suites* suites;
6146
#else
6147
    byte   suite[2];
6148
#endif
6149
6150
    WOLFSSL_ENTER("CheckPreSharedKeys");
6151
6152
    ext = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
6153
    if (ext == NULL) {
6154
#ifdef WOLFSSL_EARLY_DATA
6155
        ssl->earlyData = no_early_data;
6156
#endif
6157
        if (usingPSK)
6158
            *usingPSK = 0;
6159
        /* Hash data up to binders for deriving binders in PSK extension. */
6160
        ret = HashInput(ssl, input,  (int)helloSz);
6161
        return ret;
6162
    }
6163
6164
    /* Extensions pushed on stack/list and PSK must be last. */
6165
    if (ssl->extensions != ext) {
6166
        WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
6167
        return PSK_KEY_ERROR;
6168
    }
6169
6170
    /* Assume we are going to resume with a pre-shared key. */
6171
    ssl->options.resuming = 1;
6172
6173
    /* Find the pre-shared key extension and calculate hash of truncated
6174
     * ClientHello for binders.
6175
     */
6176
    ret = TLSX_PreSharedKey_GetSizeBinders((PreSharedKey*)ext->data,
6177
                                                     client_hello, &bindersLen);
6178
    if (ret < 0)
6179
        return ret;
6180
6181
    /* Refine list for PSK processing. */
6182
    sslRefineSuites(ssl, clSuites);
6183
#ifndef WOLFSSL_PSK_ONE_ID
6184
    if (usingPSK == NULL)
6185
        return BAD_FUNC_ARG;
6186
6187
    /* set after refineSuites, to avoid taking a stale ptr to ctx->Suites */
6188
    suites = WOLFSSL_SUITES(ssl);
6189
    /* Server list has only common suites from refining in server or client
6190
     * order. */
6191
    for (i = 0; !(*usingPSK) && i < suites->suiteSz; i += 2) {
6192
        ret = DoPreSharedKeys(ssl, input, helloSz - bindersLen,
6193
                suites->suites + i, usingPSK, &first);
6194
        if (ret != 0) {
6195
#ifdef HAVE_SESSION_TICKET
6196
#ifdef WOLFSSL_ASYNC_CRYPT
6197
            if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
6198
#endif
6199
                CleanupClientTickets((PreSharedKey*)ext->data);
6200
#endif
6201
            WOLFSSL_MSG_EX("DoPreSharedKeys: %d", ret);
6202
            return ret;
6203
        }
6204
    }
6205
#ifdef HAVE_SESSION_TICKET
6206
    CleanupClientTickets((PreSharedKey*)ext->data);
6207
#endif
6208
#else
6209
    ret = DoPreSharedKeys(ssl, input, helloSz - bindersLen, suite, usingPSK,
6210
        &first);
6211
    if (ret != 0) {
6212
        WOLFSSL_MSG_EX("DoPreSharedKeys: %d", ret);
6213
        return ret;
6214
    }
6215
#endif
6216
6217
    if (*usingPSK) {
6218
        /* While verifying the selected PSK, we updated the
6219
         * handshake hash up to the binder bytes in the PSK extensions.
6220
         * Continuing, we need the rest of the ClientHello hashed as well.
6221
         */
6222
        ret = HashRaw(ssl, input + helloSz - bindersLen, bindersLen);
6223
    }
6224
    else {
6225
        /* No suitable PSK found, Hash the complete ClientHello,
6226
         * as caller expect it after we return */
6227
        ret = HashInput(ssl, input,  (int)helloSz);
6228
    }
6229
    if (ret != 0)
6230
        return ret;
6231
6232
    if (*usingPSK != 0) {
6233
        word32 modes;
6234
    #ifdef WOLFSSL_EARLY_DATA
6235
        TLSX*  extEarlyData;
6236
6237
        extEarlyData = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
6238
        if (extEarlyData != NULL) {
6239
            /* Check if accepting early data and first PSK. */
6240
            if (ssl->earlyData != no_early_data && first) {
6241
                extEarlyData->resp = 1;
6242
6243
                /* Derive early data decryption key. */
6244
                ret = DeriveTls13Keys(ssl, early_data_key, DECRYPT_SIDE_ONLY,
6245
                                                                             1);
6246
                if (ret != 0)
6247
                    return ret;
6248
                if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
6249
                    return ret;
6250
6251
                ssl->keys.encryptionOn = 1;
6252
                ssl->earlyData = process_early_data;
6253
            }
6254
            else
6255
                extEarlyData->resp = 0;
6256
        }
6257
    #endif
6258
6259
        /* Get the PSK key exchange modes the client wants to negotiate. */
6260
        ext = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
6261
        if (ext == NULL) {
6262
            WOLFSSL_ERROR_VERBOSE(MISSING_HANDSHAKE_DATA);
6263
            return MISSING_HANDSHAKE_DATA;
6264
        }
6265
        modes = ext->val;
6266
6267
    #ifdef HAVE_SUPPORTED_CURVES
6268
        ext = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
6269
        /* Use (EC)DHE for forward-security if possible. */
6270
        if ((modes & (1 << PSK_DHE_KE)) != 0 && !ssl->options.noPskDheKe &&
6271
                                                                  ext != NULL) {
6272
            /* Only use named group used in last session. */
6273
            ssl->namedGroup = ssl->session->namedGroup;
6274
6275
            *usingPSK = 2; /* generate new ephemeral key */
6276
        }
6277
        else if (ssl->options.onlyPskDheKe) {
6278
            return PSK_KEY_ERROR;
6279
        }
6280
        else
6281
    #endif
6282
        {
6283
            if ((modes & (1 << PSK_KE)) == 0) {
6284
                WOLFSSL_MSG("psk_ke mode does not allow key share");
6285
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
6286
                return PSK_KEY_ERROR;
6287
            }
6288
            ssl->options.noPskDheKe = 1;
6289
            ssl->arrays->preMasterSz = 0;
6290
6291
            *usingPSK = 1;
6292
        }
6293
    }
6294
#ifdef WOLFSSL_PSK_ID_PROTECTION
6295
    else {
6296
    #ifndef NO_CERTS
6297
        if (ssl->buffers.certChainCnt != 0)
6298
            return 0;
6299
    #endif
6300
        WOLFSSL_ERROR_VERBOSE(BAD_BINDER);
6301
        return BAD_BINDER;
6302
    }
6303
#endif
6304
6305
    WOLFSSL_LEAVE("CheckPreSharedKeys", ret);
6306
6307
    return 0;
6308
}
6309
#endif /* HAVE_SESSION_TICKET || !NO_PSK */
6310
6311
#if defined(WOLFSSL_SEND_HRR_COOKIE)
6312
/* Check that the Cookie data's integrity.
6313
 *
6314
 * ssl       SSL/TLS object.
6315
 * cookie    The cookie data - hash and MAC.
6316
 * cookieSz  The length of the cookie data in bytes.
6317
 * returns Length of the hash on success, otherwise failure.
6318
 */
6319
int TlsCheckCookie(const WOLFSSL* ssl, const byte* cookie, word16 cookieSz)
6320
{
6321
    int  ret;
6322
    byte mac[WC_MAX_DIGEST_SIZE] = {0};
6323
    Hmac cookieHmac;
6324
    byte cookieType = 0;
6325
    byte macSz = 0;
6326
6327
    if (ssl->buffers.tls13CookieSecret.buffer == NULL ||
6328
            ssl->buffers.tls13CookieSecret.length == 0) {
6329
        WOLFSSL_MSG("Missing DTLS 1.3 cookie secret");
6330
        return COOKIE_ERROR;
6331
    }
6332
6333
#ifndef NO_SHA256
6334
    cookieType = WC_SHA256;
6335
    macSz = WC_SHA256_DIGEST_SIZE;
6336
#elif defined(WOLFSSL_SHA384)
6337
    cookieType = WC_SHA384;
6338
    macSz = WC_SHA384_DIGEST_SIZE;
6339
#elif defined(WOLFSSL_TLS13_SHA512)
6340
    cookieType = WC_SHA512;
6341
    macSz = WC_SHA512_DIGEST_SIZE;
6342
#elif defined(WOLFSSL_SM3)
6343
    cookieType = WC_SM3;
6344
    macSz = WC_SM3_DIGEST_SIZE;
6345
#else
6346
    #error "No digest to available to use with HMAC for cookies."
6347
#endif /* NO_SHA */
6348
6349
    if (cookieSz < ssl->specs.hash_size + macSz)
6350
        return HRR_COOKIE_ERROR;
6351
    cookieSz -= macSz;
6352
6353
    ret = wc_HmacInit(&cookieHmac, ssl->heap, ssl->devId);
6354
    if (ret == 0) {
6355
        ret = wc_HmacSetKey(&cookieHmac, cookieType,
6356
                            ssl->buffers.tls13CookieSecret.buffer,
6357
                            ssl->buffers.tls13CookieSecret.length);
6358
    }
6359
    if (ret == 0)
6360
        ret = wc_HmacUpdate(&cookieHmac, cookie, cookieSz);
6361
#ifdef WOLFSSL_DTLS13
6362
    /* Tie cookie to peer address */
6363
    if (ret == 0) {
6364
        /* peerLock not necessary. Still in handshake phase. */
6365
        if (ssl->options.dtls && ssl->buffers.dtlsCtx.peer.sz > 0) {
6366
            ret = wc_HmacUpdate(&cookieHmac,
6367
                (byte*)ssl->buffers.dtlsCtx.peer.sa,
6368
                ssl->buffers.dtlsCtx.peer.sz);
6369
        }
6370
    }
6371
#endif
6372
    if (ret == 0)
6373
        ret = wc_HmacFinal(&cookieHmac, mac);
6374
6375
    wc_HmacFree(&cookieHmac);
6376
    if (ret != 0)
6377
        return ret;
6378
6379
    if (ConstantCompare(cookie + cookieSz, mac, macSz) != 0) {
6380
        WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
6381
        return HRR_COOKIE_ERROR;
6382
    }
6383
    return cookieSz;
6384
}
6385
6386
/* Length of the KeyShare Extension */
6387
#define HRR_KEY_SHARE_SZ   (OPAQUE16_LEN + OPAQUE16_LEN + OPAQUE16_LEN)
6388
/* Length of the Supported Versions Extension */
6389
#define HRR_VERSIONS_SZ    (OPAQUE16_LEN + OPAQUE16_LEN + OPAQUE16_LEN)
6390
/* Length of the Cookie Extension excluding cookie data */
6391
#define HRR_COOKIE_HDR_SZ  (OPAQUE16_LEN + OPAQUE16_LEN + OPAQUE16_LEN)
6392
/* PV | Random | Session Id | CipherSuite | Compression | Ext Len */
6393
#define HRR_BODY_SZ        (VERSION_SZ + RAN_LEN + ENUM_LEN + ID_LEN + \
6394
                            SUITE_LEN + COMP_LEN + OPAQUE16_LEN)
6395
/* HH | PV | CipherSuite | Ext Len | Key Share | Supported Version | Cookie */
6396
#define MAX_HRR_SZ   (HRR_MAX_HS_HEADER_SZ   + \
6397
                        HRR_BODY_SZ         + \
6398
                          HRR_KEY_SHARE_SZ  + \
6399
                          HRR_VERSIONS_SZ   + \
6400
                          HRR_COOKIE_HDR_SZ)
6401
6402
6403
/* Restart the handshake hash from the cookie value.
6404
 *
6405
 * ssl     SSL/TLS object.
6406
 * cookie  Cookie data from client.
6407
 * returns 0 on success, otherwise failure.
6408
 */
6409
static int RestartHandshakeHashWithCookie(WOLFSSL* ssl, Cookie* cookie)
6410
{
6411
    byte   header[HANDSHAKE_HEADER_SZ] = {0};
6412
    byte   hrr[MAX_HRR_SZ] = {0};
6413
    int    hrrIdx;
6414
    word32 idx;
6415
    byte   hashSz;
6416
    byte*  cookieData;
6417
    word16 cookieDataSz;
6418
    word16 length;
6419
    int    keyShareExt = 0;
6420
    int    ret;
6421
6422
    ret = TlsCheckCookie(ssl, cookie->data, (byte)cookie->len);
6423
    if (ret < 0)
6424
        return ret;
6425
    cookieDataSz = (word16)ret;
6426
    hashSz = cookie->data[0];
6427
    cookieData = cookie->data;
6428
    idx = OPAQUE8_LEN;
6429
6430
    /* Restart handshake hash with synthetic message hash. */
6431
    AddTls13HandShakeHeader(header, hashSz, 0, 0, message_hash, ssl);
6432
6433
    if ((ret = InitHandshakeHashes(ssl)) != 0)
6434
        return ret;
6435
    if ((ret = HashRaw(ssl, header, sizeof(header))) != 0)
6436
        return ret;
6437
#ifdef WOLFSSL_DEBUG_TLS
6438
    WOLFSSL_MSG("Restart Hash from Cookie");
6439
    WOLFSSL_BUFFER(cookieData + idx, hashSz);
6440
#endif
6441
    if ((ret = HashRaw(ssl, cookieData + idx, hashSz)) != 0)
6442
        return ret;
6443
6444
    /* Reconstruct the HelloRetryMessage for handshake hash. */
6445
    length = HRR_BODY_SZ - ID_LEN + ssl->session->sessionIDSz +
6446
             HRR_COOKIE_HDR_SZ + cookie->len;
6447
    length += HRR_VERSIONS_SZ;
6448
    /* HashSz (1 byte) + Hash (HashSz bytes) + CipherSuite (2 bytes) */
6449
    if (cookieDataSz > OPAQUE8_LEN + hashSz + OPAQUE16_LEN) {
6450
        keyShareExt = 1;
6451
        length += HRR_KEY_SHARE_SZ;
6452
    }
6453
6454
    AddTls13HandShakeHeader(hrr, length, 0, 0, server_hello, ssl);
6455
6456
    idx += hashSz;
6457
    hrrIdx = HANDSHAKE_HEADER_SZ;
6458
6459
#ifdef WOLFSSL_DTLS13
6460
    if (ssl->options.dtls)
6461
        hrrIdx += DTLS_HANDSHAKE_EXTRA;
6462
#endif /* WOLFSSL_DTLS13 */
6463
6464
    /* The negotiated protocol version. */
6465
    hrr[hrrIdx++] = ssl->version.major;
6466
    hrr[hrrIdx++] = ssl->options.dtls ? DTLSv1_2_MINOR : TLSv1_2_MINOR;
6467
6468
    /* HelloRetryRequest message has fixed value for random. */
6469
    XMEMCPY(hrr + hrrIdx, helloRetryRequestRandom, RAN_LEN);
6470
    hrrIdx += RAN_LEN;
6471
6472
    hrr[hrrIdx++] = ssl->session->sessionIDSz;
6473
    if (ssl->session->sessionIDSz > 0) {
6474
        XMEMCPY(hrr + hrrIdx, ssl->session->sessionID, ssl->session->sessionIDSz);
6475
        hrrIdx += ssl->session->sessionIDSz;
6476
    }
6477
6478
    /* Cipher Suite */
6479
    hrr[hrrIdx++] = cookieData[idx++];
6480
    hrr[hrrIdx++] = cookieData[idx++];
6481
6482
    /* Compression not supported in TLS v1.3. */
6483
    hrr[hrrIdx++] = 0;
6484
6485
    /* Extensions' length */
6486
    length -= HRR_BODY_SZ - ID_LEN + ssl->session->sessionIDSz;
6487
    c16toa(length, hrr + hrrIdx);
6488
    hrrIdx += 2;
6489
6490
    /* Optional KeyShare Extension */
6491
    if (keyShareExt) {
6492
        c16toa(TLSX_KEY_SHARE, hrr + hrrIdx);
6493
        hrrIdx += 2;
6494
        c16toa(OPAQUE16_LEN, hrr + hrrIdx);
6495
        hrrIdx += 2;
6496
        hrr[hrrIdx++] = cookieData[idx++];
6497
        hrr[hrrIdx++] = cookieData[idx++];
6498
    }
6499
    c16toa(TLSX_SUPPORTED_VERSIONS, hrr + hrrIdx);
6500
    hrrIdx += 2;
6501
    c16toa(OPAQUE16_LEN, hrr + hrrIdx);
6502
    hrrIdx += 2;
6503
    #ifdef WOLFSSL_TLS13_DRAFT
6504
        hrr[hrrIdx++] = TLS_DRAFT_MAJOR;
6505
        hrr[hrrIdx++] = TLS_DRAFT_MINOR;
6506
    #else
6507
        hrr[hrrIdx++] = ssl->version.major;
6508
        hrr[hrrIdx++] = ssl->version.minor;
6509
    #endif
6510
6511
    /* Mandatory Cookie Extension */
6512
    c16toa(TLSX_COOKIE, hrr + hrrIdx);
6513
    hrrIdx += 2;
6514
    c16toa(cookie->len + OPAQUE16_LEN, hrr + hrrIdx);
6515
    hrrIdx += 2;
6516
    c16toa(cookie->len, hrr + hrrIdx);
6517
    hrrIdx += 2;
6518
6519
#ifdef WOLFSSL_DEBUG_TLS
6520
    WOLFSSL_MSG("Reconstructed HelloRetryRequest");
6521
    WOLFSSL_BUFFER(hrr, hrrIdx);
6522
    WOLFSSL_MSG("Cookie");
6523
    WOLFSSL_BUFFER(cookieData, cookie->len);
6524
#endif
6525
6526
#ifdef WOLFSSL_DTLS13
6527
    if (ssl->options.dtls) {
6528
        ret = Dtls13HashHandshake(ssl, hrr, (word16)hrrIdx);
6529
    }
6530
    else
6531
#endif /* WOLFSSL_DTLS13 */
6532
        {
6533
            ret = HashRaw(ssl, hrr, hrrIdx);
6534
        }
6535
6536
    if (ret != 0)
6537
        return ret;
6538
6539
    return HashRaw(ssl, cookieData, cookie->len);
6540
}
6541
#endif
6542
6543
/* Do SupportedVersion extension for TLS v1.3+ otherwise it is not.
6544
 *
6545
 * ssl       The SSL/TLS object.
6546
 * input     The message buffer.
6547
 * i         The index into the message buffer of ClientHello.
6548
 * helloSz   The length of the current handshake message.
6549
 * returns 0 on success and otherwise failure.
6550
 */
6551
static int DoTls13SupportedVersions(WOLFSSL* ssl, const byte* input, word32 i,
6552
                                    word32 helloSz, int* wantDowngrade)
6553
{
6554
    int    ret;
6555
    byte   b;
6556
    word16 suiteSz;
6557
    word16 totalExtSz;
6558
    int    foundVersion = 0;
6559
6560
    /* Client random */
6561
    i += RAN_LEN;
6562
    /* Session id - not used in TLS v1.3 */
6563
    b = input[i++];
6564
    if (i + b > helloSz) {
6565
        return BUFFER_ERROR;
6566
    }
6567
    i += b;
6568
#ifdef WOLFSSL_DTLS13
6569
    if (ssl->options.dtls) {
6570
        /* legacy_cookie - not used in DTLS v1.3 */
6571
        b = input[i++];
6572
        if (i + b > helloSz) {
6573
            return BUFFER_ERROR;
6574
        }
6575
        i += b;
6576
    }
6577
#endif /* WOLFSSL_DTLS13 */
6578
    /* Cipher suites */
6579
    if (i + OPAQUE16_LEN > helloSz)
6580
        return BUFFER_ERROR;
6581
    ato16(input + i, &suiteSz);
6582
    i += OPAQUE16_LEN;
6583
    if (i + suiteSz + 1 > helloSz)
6584
        return BUFFER_ERROR;
6585
    i += suiteSz;
6586
    /* Compression */
6587
    b = input[i++];
6588
    if (i + b > helloSz)
6589
        return BUFFER_ERROR;
6590
    i += b;
6591
6592
    /* TLS 1.3 must have extensions */
6593
    if (i < helloSz) {
6594
        if (i + OPAQUE16_LEN > helloSz)
6595
            return BUFFER_ERROR;
6596
        ato16(&input[i], &totalExtSz);
6597
        i += OPAQUE16_LEN;
6598
        if (totalExtSz != helloSz - i)
6599
            return BUFFER_ERROR;
6600
6601
        /* Need to negotiate version first. */
6602
        if ((ret = TLSX_ParseVersion(ssl, input + i, totalExtSz, client_hello,
6603
                                                              &foundVersion))) {
6604
            return ret;
6605
        }
6606
    }
6607
    *wantDowngrade = !foundVersion || !IsAtLeastTLSv1_3(ssl->version);
6608
6609
    return 0;
6610
}
6611
6612
/* Handle a ClientHello handshake message.
6613
 * If the protocol version in the message is not TLS v1.3 or higher, use
6614
 * DoClientHello()
6615
 * Only a server will receive this message.
6616
 *
6617
 * ssl       The SSL/TLS object.
6618
 * input     The message buffer.
6619
 * inOutIdx  On entry, the index into the message buffer of ClientHello.
6620
 *           On exit, the index of byte after the ClientHello message and
6621
 *           padding.
6622
 * helloSz   The length of the current handshake message.
6623
 * returns 0 on success and otherwise failure.
6624
 */
6625
6626
typedef struct Dch13Args {
6627
    ProtocolVersion pv;
6628
    word32          idx;
6629
    word32          begin;
6630
    int             usingPSK;
6631
} Dch13Args;
6632
6633
static void FreeDch13Args(WOLFSSL* ssl, void* pArgs)
6634
{
6635
    /* openssl compat builds hang on to the client suites until WOLFSSL object
6636
     * is destroyed */
6637
#ifndef OPENSSL_EXTRA
6638
    if (ssl->clSuites) {
6639
        XFREE(ssl->clSuites, ssl->heap, DYNAMIC_TYPE_SUITES);
6640
        ssl->clSuites = NULL;
6641
    }
6642
#endif
6643
    (void)ssl;
6644
    (void)pArgs;
6645
6646
}
6647
6648
int DoTls13ClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
6649
                       word32 helloSz)
6650
0
{
6651
0
    int ret;
6652
#ifdef WOLFSSL_ASYNC_CRYPT
6653
    Dch13Args* args = NULL;
6654
    WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
6655
#else
6656
0
    Dch13Args  args[1];
6657
0
#endif
6658
#if defined(HAVE_ECH)
6659
    TLSX* echX = NULL;
6660
    HS_Hashes* tmpHashes;
6661
#endif
6662
6663
0
    WOLFSSL_START(WC_FUNC_CLIENT_HELLO_DO);
6664
0
    WOLFSSL_ENTER("DoTls13ClientHello");
6665
6666
#ifdef WOLFSSL_ASYNC_CRYPT
6667
    if (ssl->async == NULL) {
6668
        ssl->async = (struct WOLFSSL_ASYNC*)
6669
                XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
6670
                        DYNAMIC_TYPE_ASYNC);
6671
        if (ssl->async == NULL)
6672
            ERROR_OUT(MEMORY_E, exit_dch);
6673
    }
6674
    args = (Dch13Args*)ssl->async->args;
6675
6676
    ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
6677
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
6678
        /* Check for error */
6679
        if (ret < 0) {
6680
            goto exit_dch;
6681
        }
6682
    }
6683
    else
6684
#endif
6685
0
    {
6686
        /* Reset state */
6687
0
        ret = VERSION_ERROR;
6688
0
        ssl->options.asyncState = TLS_ASYNC_BEGIN;
6689
0
        XMEMSET(args, 0, sizeof(Dch13Args));
6690
    #ifdef WOLFSSL_ASYNC_CRYPT
6691
        ssl->async->freeArgs = FreeDch13Args;
6692
    #endif
6693
0
    }
6694
6695
0
    switch (ssl->options.asyncState) {
6696
0
    case TLS_ASYNC_BEGIN:
6697
0
    {
6698
0
    byte b;
6699
0
    byte sessIdSz;
6700
0
    int wantDowngrade = 0;
6701
0
    word16 totalExtSz = 0;
6702
6703
#ifdef WOLFSSL_CALLBACKS
6704
    if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
6705
    if (ssl->toInfoOn) AddLateName("ClientHello", &ssl->timeoutInfo);
6706
#endif
6707
6708
    /* do not change state in the SSL object before the next region of code
6709
     * to be able to statelessly compute a DTLS cookie */
6710
#if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
6711
    /* Update the ssl->options.dtlsStateful setting `if` statement in
6712
     * wolfSSL_accept_TLSv13 when changing this one. */
6713
    if (IsDtlsNotSctpMode(ssl) && ssl->options.sendCookie &&
6714
            !ssl->options.dtlsStateful) {
6715
        DtlsSetSeqNumForReply(ssl);
6716
        ret = DoClientHelloStateless(ssl, input + *inOutIdx, helloSz, 0, NULL);
6717
        if (ret != 0 || !ssl->options.dtlsStateful) {
6718
            *inOutIdx += helloSz;
6719
            goto exit_dch;
6720
        }
6721
        if (ssl->chGoodCb != NULL) {
6722
            int cbret = ssl->chGoodCb(ssl, ssl->chGoodCtx);
6723
            if (cbret < 0) {
6724
                ssl->error = cbret;
6725
                WOLFSSL_MSG("ClientHello Good Cb don't continue error");
6726
                return WOLFSSL_FATAL_ERROR;
6727
            }
6728
        }
6729
    }
6730
    ssl->options.dtlsStateful = 1;
6731
#endif /* WOLFSSL_DTLS */
6732
6733
0
    args->idx = *inOutIdx;
6734
0
    args->begin = args->idx;
6735
6736
    /* protocol version, random and session id length check */
6737
0
    if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz) {
6738
0
        ERROR_OUT(BUFFER_ERROR, exit_dch);
6739
0
    }
6740
6741
    /* Protocol version */
6742
0
    XMEMCPY(&args->pv, input + args->idx, OPAQUE16_LEN);
6743
0
    ssl->chVersion = args->pv;   /* store */
6744
0
    args->idx += OPAQUE16_LEN;
6745
6746
6747
    /* this check pass for DTLS Major (0xff) */
6748
0
    if (args->pv.major < SSLv3_MAJOR) {
6749
0
        WOLFSSL_MSG("Legacy version field contains unsupported value");
6750
0
        ERROR_OUT(VERSION_ERROR, exit_dch);
6751
0
    }
6752
6753
#ifdef WOLFSSL_DTLS13
6754
    if (ssl->options.dtls &&
6755
        args->pv.major == DTLS_MAJOR && args->pv.minor > DTLSv1_2_MINOR) {
6756
        wantDowngrade = 1;
6757
        ssl->version.minor = args->pv.minor;
6758
    }
6759
#endif /* WOLFSSL_DTLS13 */
6760
6761
0
    if (!ssl->options.dtls) {
6762
0
#ifndef WOLFSSL_ALLOW_BAD_TLS_LEGACY_VERSION
6763
        /* Check for TLS 1.3 version (0x0304) in legacy version field. RFC 8446
6764
         * Section 4.2.1 allows this action:
6765
         *
6766
         * "Servers MAY abort the handshake upon receiving a ClientHello with
6767
         * legacy_version 0x0304 or later."
6768
         *
6769
         * Note that if WOLFSSL_ALLOW_BAD_TLS_LEGACY_VERSION is defined then the
6770
         * semantics of RFC 5246 Appendix E will be followed. A ServerHello with
6771
         * version 1.2 will be sent. The same is true if TLS 1.3 is not enabled.
6772
         */
6773
0
        if (args->pv.major == SSLv3_MAJOR && args->pv.minor >= TLSv1_3_MINOR) {
6774
0
            WOLFSSL_MSG("Legacy version field is TLS 1.3 or later. Aborting.");
6775
0
            ERROR_OUT(VERSION_ERROR, exit_dch);
6776
0
        }
6777
0
#endif /* WOLFSSL_ALLOW_BAD_TLS_LEGACY_VERSION */
6778
6779
        /* Legacy protocol version cannot negotiate TLS 1.3 or higher. */
6780
0
        if (args->pv.major > SSLv3_MAJOR || (args->pv.major == SSLv3_MAJOR &&
6781
0
                                             args->pv.minor >= TLSv1_3_MINOR)) {
6782
0
            args->pv.major = SSLv3_MAJOR;
6783
0
            args->pv.minor = TLSv1_2_MINOR;
6784
0
            wantDowngrade = 1;
6785
0
            ssl->version.minor = args->pv.minor;
6786
0
        }
6787
        /* Legacy version must be [ SSLv3_MAJOR, TLSv1_2_MINOR ] for TLS v1.3 */
6788
0
        else if (args->pv.major == SSLv3_MAJOR &&
6789
0
                 args->pv.minor < TLSv1_2_MINOR) {
6790
0
            wantDowngrade = 1;
6791
0
            ssl->version.minor = args->pv.minor;
6792
0
        }
6793
0
    }
6794
6795
0
    if (!wantDowngrade) {
6796
0
        ret = DoTls13SupportedVersions(ssl, input + args->begin,
6797
0
            args->idx - args->begin, helloSz, &wantDowngrade);
6798
0
        if (ret < 0)
6799
0
            goto exit_dch;
6800
0
    }
6801
6802
0
    if (wantDowngrade) {
6803
0
#ifndef WOLFSSL_NO_TLS12
6804
0
        byte realMinor;
6805
0
        if (!ssl->options.downgrade) {
6806
0
            WOLFSSL_MSG("Client trying to connect with lesser version than "
6807
0
                        "TLS v1.3");
6808
0
            ERROR_OUT(VERSION_ERROR, exit_dch);
6809
0
        }
6810
6811
0
        if ((!ssl->options.dtls
6812
0
                 && args->pv.minor < ssl->options.minDowngrade) ||
6813
0
            (ssl->options.dtls && args->pv.minor > ssl->options.minDowngrade)) {
6814
0
            WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
6815
0
            ERROR_OUT(VERSION_ERROR, exit_dch);
6816
0
        }
6817
6818
0
        realMinor = ssl->version.minor;
6819
0
        ssl->version.minor = args->pv.minor;
6820
0
        ret = HashInput(ssl, input + args->begin, (int)helloSz);
6821
0
        ssl->version.minor = realMinor;
6822
0
        if (ret == 0) {
6823
0
            ret = DoClientHello(ssl, input, inOutIdx, helloSz);
6824
0
        }
6825
0
        goto exit_dch;
6826
#else
6827
        WOLFSSL_MSG("Client trying to connect with lesser version than "
6828
                    "TLS v1.3");
6829
        ERROR_OUT(VERSION_ERROR, exit_dch);
6830
#endif
6831
0
    }
6832
6833
    /* From here on we are a TLS 1.3 ClientHello. */
6834
6835
    /* Client random */
6836
0
    XMEMCPY(ssl->arrays->clientRandom, input + args->idx, RAN_LEN);
6837
0
    args->idx += RAN_LEN;
6838
6839
#ifdef WOLFSSL_DEBUG_TLS
6840
    WOLFSSL_MSG("client random");
6841
    WOLFSSL_BUFFER(ssl->arrays->clientRandom, RAN_LEN);
6842
#endif
6843
6844
0
    sessIdSz = input[args->idx++];
6845
0
#ifndef WOLFSSL_TLS13_MIDDLEBOX_COMPAT
6846
0
    if (sessIdSz > ID_LEN)
6847
#else
6848
    if (sessIdSz != ID_LEN && sessIdSz != 0)
6849
#endif
6850
0
    {
6851
0
        ERROR_OUT(INVALID_PARAMETER, exit_dch);
6852
0
    }
6853
6854
0
    if (sessIdSz + args->idx > helloSz)
6855
0
        ERROR_OUT(BUFFER_ERROR, exit_dch);
6856
6857
0
    ssl->session->sessionIDSz = sessIdSz;
6858
0
    if (sessIdSz > 0)
6859
0
        XMEMCPY(ssl->session->sessionID, input + args->idx, sessIdSz);
6860
0
    args->idx += sessIdSz;
6861
6862
#ifdef WOLFSSL_DTLS13
6863
    /* legacy_cookie */
6864
    if (ssl->options.dtls) {
6865
        /* https://www.rfc-editor.org/rfc/rfc9147.html#section-5.3 */
6866
        byte cookieLen = input[args->idx++];
6867
        if (cookieLen != 0) {
6868
            ERROR_OUT(INVALID_PARAMETER, exit_dch);
6869
        }
6870
    }
6871
#endif /* WOLFSSL_DTLS13 */
6872
6873
0
    XFREE(ssl->clSuites, ssl->heap, DYNAMIC_TYPE_SUITES);
6874
0
    ssl->clSuites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
6875
0
        DYNAMIC_TYPE_SUITES);
6876
0
    if (ssl->clSuites == NULL) {
6877
0
        ERROR_OUT(MEMORY_E, exit_dch);
6878
0
    }
6879
6880
    /* Cipher suites */
6881
0
    if ((args->idx - args->begin) + OPAQUE16_LEN > helloSz)
6882
0
        ERROR_OUT(BUFFER_ERROR, exit_dch);
6883
0
    ato16(&input[args->idx], &ssl->clSuites->suiteSz);
6884
0
    args->idx += OPAQUE16_LEN;
6885
0
    if ((ssl->clSuites->suiteSz % 2) != 0) {
6886
0
        ERROR_OUT(INVALID_PARAMETER, exit_dch);
6887
0
    }
6888
    /* suites and compression length check */
6889
0
    if ((args->idx - args->begin) + ssl->clSuites->suiteSz + OPAQUE8_LEN >
6890
0
            helloSz) {
6891
0
        ERROR_OUT(BUFFER_ERROR, exit_dch);
6892
0
    }
6893
0
    if (ssl->clSuites->suiteSz > WOLFSSL_MAX_SUITE_SZ)
6894
0
        ERROR_OUT(BUFFER_ERROR, exit_dch);
6895
0
    XMEMCPY(ssl->clSuites->suites, input + args->idx, ssl->clSuites->suiteSz);
6896
0
    args->idx += ssl->clSuites->suiteSz;
6897
0
    ssl->clSuites->hashSigAlgoSz = 0;
6898
6899
    /* Compression */
6900
0
    b = input[args->idx++];
6901
0
    if ((args->idx - args->begin) + b > helloSz)
6902
0
        ERROR_OUT(BUFFER_ERROR, exit_dch);
6903
0
    if (b != COMP_LEN) {
6904
0
        WOLFSSL_MSG("Must be one compression type in list");
6905
0
        ERROR_OUT(INVALID_PARAMETER, exit_dch);
6906
0
    }
6907
0
    b = input[args->idx++];
6908
0
    if (b != NO_COMPRESSION) {
6909
0
        WOLFSSL_MSG("Must be no compression type in list");
6910
0
        ERROR_OUT(INVALID_PARAMETER, exit_dch);
6911
0
    }
6912
6913
    /* Extensions */
6914
0
    if ((args->idx - args->begin) == helloSz)
6915
0
        ERROR_OUT(BUFFER_ERROR, exit_dch);
6916
0
    if ((args->idx - args->begin) + OPAQUE16_LEN > helloSz)
6917
0
        ERROR_OUT(BUFFER_ERROR, exit_dch);
6918
6919
0
    ato16(&input[args->idx], &totalExtSz);
6920
0
    args->idx += OPAQUE16_LEN;
6921
0
    if ((args->idx - args->begin) + totalExtSz > helloSz)
6922
0
        ERROR_OUT(BUFFER_ERROR, exit_dch);
6923
6924
    /* Auto populate extensions supported unless user defined. */
6925
0
    if ((ret = TLSX_PopulateExtensions(ssl, 1)) != 0)
6926
0
        goto exit_dch;
6927
6928
#if defined(HAVE_ECH)
6929
    if (ssl->ctx->echConfigs != NULL && !ssl->options.disableECH) {
6930
        /* save the start of the buffer so we can use it when parsing ech */
6931
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
6932
6933
        if (echX == NULL)
6934
            ERROR_OUT(WOLFSSL_FATAL_ERROR, exit_dch);
6935
6936
        ((WOLFSSL_ECH*)echX->data)->aad = input + HANDSHAKE_HEADER_SZ;
6937
        ((WOLFSSL_ECH*)echX->data)->aadLen = helloSz;
6938
    }
6939
#endif
6940
6941
    /* Parse extensions */
6942
0
    if ((ret = TLSX_Parse(ssl, input + args->idx, totalExtSz, client_hello,
6943
0
                                                            ssl->clSuites))) {
6944
0
        goto exit_dch;
6945
0
    }
6946
6947
#if defined(HAVE_ECH)
6948
    /* jump to the end to clean things up */
6949
    if (echX != NULL && ((WOLFSSL_ECH*)echX->data)->state == ECH_WRITE_NONE)
6950
        goto exit_dch;
6951
#endif
6952
6953
0
#ifdef HAVE_SNI
6954
0
        if ((ret = SNI_Callback(ssl)) != 0)
6955
0
            goto exit_dch;
6956
0
        ssl->options.side = WOLFSSL_SERVER_END;
6957
0
#endif
6958
6959
0
    args->idx += totalExtSz;
6960
0
    ssl->options.haveSessionId = 1;
6961
0
    ssl->options.sendVerify = SEND_CERT;
6962
6963
#if defined(WOLFSSL_SEND_HRR_COOKIE)
6964
    ssl->options.cookieGood = 0;
6965
    if (ssl->options.sendCookie &&
6966
            (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE
6967
#ifdef WOLFSSL_DTLS13
6968
                    /* Always check for a valid cookie since we may have already
6969
                     * sent a HRR but we reset the state. */
6970
                    || ssl->options.dtls
6971
#endif
6972
                    )) {
6973
        TLSX* ext = TLSX_Find(ssl->extensions, TLSX_COOKIE);
6974
6975
        if (ext != NULL) {
6976
            /* Ensure the cookie came from client and isn't the one in the
6977
            * response - HelloRetryRequest.
6978
            */
6979
            if (ext->resp == 0) {
6980
                ret = RestartHandshakeHashWithCookie(ssl, (Cookie*)ext->data);
6981
                if (ret != 0)
6982
                    goto exit_dch;
6983
                /* Don't change state here as we may want to enter
6984
                 * DoTls13ClientHello again. */
6985
                ssl->options.cookieGood = 1;
6986
            }
6987
            else {
6988
                ERROR_OUT(HRR_COOKIE_ERROR, exit_dch);
6989
            }
6990
        }
6991
        else {
6992
#if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_DTLS13_NO_HRR_ON_RESUME)
6993
            /* Don't error out as we may be resuming. We confirm this later. */
6994
            if (!ssl->options.dtls)
6995
#endif
6996
                ERROR_OUT(HRR_COOKIE_ERROR, exit_dch);
6997
        }
6998
    }
6999
#endif
7000
7001
#if defined(HAVE_ECH)
7002
    /* hash clientHelloInner to hsHashesEch independently since it can't include
7003
     * the HRR */
7004
    if (ssl->ctx->echConfigs != NULL && !ssl->options.disableECH) {
7005
        tmpHashes = ssl->hsHashes;
7006
        ssl->hsHashes = NULL;
7007
        ret = InitHandshakeHashes(ssl);
7008
        if (ret != 0)
7009
            goto exit_dch;
7010
        if ((ret = HashInput(ssl, input + args->begin, (int)helloSz)) != 0)
7011
            goto exit_dch;
7012
        ssl->hsHashesEch = ssl->hsHashes;
7013
        ssl->hsHashes = tmpHashes;
7014
    }
7015
#endif
7016
7017
#if (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)) && \
7018
                                                    defined(HAVE_TLS_EXTENSIONS)
7019
    ret = CheckPreSharedKeys(ssl, input + args->begin, helloSz, ssl->clSuites,
7020
        &args->usingPSK);
7021
    if (ret != 0)
7022
        goto exit_dch;
7023
#else
7024
0
    if ((ret = HashInput(ssl, input + args->begin, (int)helloSz)) != 0)
7025
0
        goto exit_dch;
7026
0
#endif
7027
7028
#if (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)) && \
7029
                                                    defined(HAVE_TLS_EXTENSIONS)
7030
    if (!args->usingPSK)
7031
#endif
7032
0
    {
7033
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
7034
        /* Not using PSK so don't require no KE. */
7035
        ssl->options.noPskDheKe = 0;
7036
#endif
7037
7038
0
#ifndef NO_CERTS
7039
0
        if (TLSX_Find(ssl->extensions, TLSX_KEY_SHARE) == NULL) {
7040
0
            WOLFSSL_MSG("Client did not send a KeyShare extension");
7041
0
            ERROR_OUT(INCOMPLETE_DATA, exit_dch);
7042
0
        }
7043
        /* Can't check ssl->extensions here as SigAlgs are unconditionally
7044
           set by TLSX_PopulateExtensions */
7045
0
        if (ssl->clSuites->hashSigAlgoSz == 0) {
7046
0
            WOLFSSL_MSG("Client did not send a SignatureAlgorithms extension");
7047
0
            ERROR_OUT(INCOMPLETE_DATA, exit_dch);
7048
0
        }
7049
#else
7050
        ERROR_OUT(INVALID_PARAMETER, exit_dch);
7051
#endif
7052
0
    }
7053
7054
#ifdef HAVE_ALPN
7055
    /* With PSK and all other things validated, it's time to
7056
     * select the ALPN protocol, if so requested */
7057
    if ((ret = ALPN_Select(ssl)) != 0)
7058
        goto exit_dch;
7059
#endif
7060
0
    } /* case TLS_ASYNC_BEGIN */
7061
0
    FALL_THROUGH;
7062
7063
0
    case TLS_ASYNC_BUILD:
7064
    /* Advance state and proceed */
7065
0
    ssl->options.asyncState = TLS_ASYNC_DO;
7066
0
    FALL_THROUGH;
7067
7068
0
    case TLS_ASYNC_DO:
7069
0
    {
7070
#ifdef WOLFSSL_CERT_SETUP_CB
7071
    if ((ret = CertSetupCbWrapper(ssl)) != 0)
7072
        goto exit_dch;
7073
#endif
7074
0
#ifndef NO_CERTS
7075
0
    if (!args->usingPSK) {
7076
0
        if ((ret = MatchSuite(ssl, ssl->clSuites)) < 0) {
7077
        #ifdef WOLFSSL_ASYNC_CRYPT
7078
            if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
7079
        #endif
7080
0
                WOLFSSL_MSG("Unsupported cipher suite, ClientHello 1.3");
7081
0
            goto exit_dch;
7082
0
        }
7083
0
    }
7084
0
#endif
7085
0
#ifdef HAVE_SUPPORTED_CURVES
7086
0
    if (args->usingPSK == 2) {
7087
        /* Pick key share and Generate a new key if not present. */
7088
0
        int doHelloRetry = 0;
7089
0
        ret = TLSX_KeyShare_Establish(ssl, &doHelloRetry);
7090
0
        if (doHelloRetry) {
7091
            /* Make sure we don't send HRR twice */
7092
0
            if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE)
7093
0
                ERROR_OUT(INVALID_PARAMETER, exit_dch);
7094
0
            ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
7095
0
            if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
7096
0
                ret = 0; /* for hello_retry return 0 */
7097
0
        }
7098
0
        if (ret != 0)
7099
0
            goto exit_dch;
7100
0
    }
7101
0
#endif
7102
7103
    /* Advance state and proceed */
7104
0
    ssl->options.asyncState = TLS_ASYNC_VERIFY;
7105
0
    } /* case TLS_ASYNC_BUILD || TLS_ASYNC_DO */
7106
0
    FALL_THROUGH;
7107
7108
0
    case TLS_ASYNC_VERIFY:
7109
0
    {
7110
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SUPPORTED_CURVES)
7111
    /* Check if the KeyShare calculations from the previous state are complete.
7112
     * wolfSSL_AsyncPop advances ssl->options.asyncState so we may end up here
7113
     * with a pending calculation. */
7114
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
7115
    if (extension != NULL && extension->resp == 1) {
7116
        KeyShareEntry* serverKSE = (KeyShareEntry*)extension->data;
7117
        if (serverKSE != NULL &&
7118
            serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
7119
            ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
7120
            if (ret != 0)
7121
                goto exit_dch;
7122
        }
7123
    }
7124
#endif
7125
    /* Advance state and proceed */
7126
0
    ssl->options.asyncState = TLS_ASYNC_FINALIZE;
7127
0
    }
7128
0
    FALL_THROUGH;
7129
7130
0
    case TLS_ASYNC_FINALIZE:
7131
0
    {
7132
0
    *inOutIdx = args->idx;
7133
0
    ssl->options.clientState = CLIENT_HELLO_COMPLETE;
7134
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
7135
    ssl->options.pskNegotiated = (args->usingPSK != 0);
7136
#endif
7137
7138
0
    if (!args->usingPSK) {
7139
0
#ifndef NO_CERTS
7140
        /* Check that the negotiated ciphersuite matches protocol version. */
7141
    #ifdef HAVE_NULL_CIPHER
7142
        if (ssl->options.cipherSuite0 == ECC_BYTE &&
7143
                              (ssl->options.cipherSuite == TLS_SHA256_SHA256 ||
7144
                               ssl->options.cipherSuite == TLS_SHA384_SHA384)) {
7145
            ;
7146
        }
7147
        else
7148
    #endif
7149
0
    #if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_SM3)
7150
0
        if (ssl->options.cipherSuite0 == CIPHER_BYTE &&
7151
0
                ssl->options.cipherSuite == TLS_SM4_GCM_SM3) {
7152
0
            ; /* Do nothing. */
7153
0
        }
7154
0
        else
7155
0
    #endif
7156
0
    #if defined(WOLFSSL_SM4_CCM) && defined(WOLFSSL_SM3)
7157
0
        if (ssl->options.cipherSuite0 == CIPHER_BYTE &&
7158
0
                ssl->options.cipherSuite == TLS_SM4_CCM_SM3) {
7159
0
            ; /* Do nothing. */
7160
0
        }
7161
0
        else
7162
0
    #endif
7163
0
        if (ssl->options.cipherSuite0 != TLS13_BYTE) {
7164
0
            WOLFSSL_MSG("Negotiated ciphersuite from lesser version than "
7165
0
                        "TLS v1.3");
7166
0
            ERROR_OUT(MATCH_SUITE_ERROR, exit_dch);
7167
0
        }
7168
7169
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
7170
        if (ssl->options.resuming) {
7171
            ssl->options.resuming = 0;
7172
            ssl->arrays->psk_keySz = 0;
7173
            XMEMSET(ssl->arrays->psk_key, 0, ssl->specs.hash_size);
7174
        }
7175
    #endif
7176
7177
        /* Derive early secret for handshake secret. */
7178
0
        if ((ret = DeriveEarlySecret(ssl)) != 0)
7179
0
            goto exit_dch;
7180
0
#endif /* !NO_CERTS */
7181
0
    }
7182
0
    break;
7183
0
    } /* case TLS_ASYNC_FINALIZE */
7184
0
    default:
7185
0
        ret = INPUT_CASE_ERROR;
7186
0
    } /* switch (ssl->options.asyncState) */
7187
7188
#ifdef WOLFSSL_SEND_HRR_COOKIE
7189
    if (ret == 0 && ssl->options.sendCookie) {
7190
        if (ssl->options.cookieGood &&
7191
                ssl->options.acceptState == TLS13_ACCEPT_FIRST_REPLY_DONE) {
7192
            /* Processing second ClientHello. Clear HRR state. */
7193
            ssl->options.serverState = NULL_STATE;
7194
        }
7195
7196
        if (ssl->options.cookieGood &&
7197
            ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
7198
            /* If we already verified the peer with a cookie then we can't
7199
             * do another HRR for cipher negotiation. Send alert and restart
7200
             * the entire handshake. */
7201
            ERROR_OUT(INVALID_PARAMETER, exit_dch);
7202
        }
7203
#ifdef WOLFSSL_DTLS13
7204
        if (ssl->options.dtls &&
7205
            ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
7206
            /* Cookie and key share negotiation should be handled in
7207
             * DoClientHelloStateless. If we enter here then something went
7208
             * wrong in our logic. */
7209
            ERROR_OUT(BAD_HELLO, exit_dch);
7210
        }
7211
#endif
7212
        /* Send a cookie */
7213
        if (!ssl->options.cookieGood &&
7214
            ssl->options.serverState != SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
7215
#ifdef WOLFSSL_DTLS13
7216
            if (ssl->options.dtls) {
7217
#ifdef WOLFSSL_DTLS13_NO_HRR_ON_RESUME
7218
                /* We can skip cookie on resumption */
7219
                if (!ssl->options.dtls || !ssl->options.dtls13NoHrrOnResume ||
7220
                        !args->usingPSK)
7221
#endif
7222
                    ERROR_OUT(BAD_HELLO, exit_dch);
7223
            }
7224
            else
7225
#endif
7226
            {
7227
                /* Need to remove the keyshare ext if we found a common group
7228
                 * and are not doing curve negotiation. */
7229
                TLSX_Remove(&ssl->extensions, TLSX_KEY_SHARE, ssl->heap);
7230
                ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
7231
            }
7232
7233
        }
7234
    }
7235
#endif /* WOLFSSL_DTLS13 */
7236
7237
#ifdef WOLFSSL_DTLS_CID
7238
    /* do not modify CID state if we are sending an HRR  */
7239
    if (ret == 0 && ssl->options.dtls && ssl->options.useDtlsCID &&
7240
            ssl->options.serverState != SERVER_HELLO_RETRY_REQUEST_COMPLETE)
7241
        DtlsCIDOnExtensionsParsed(ssl);
7242
#endif /* WOLFSSL_DTLS_CID */
7243
7244
7245
7246
0
exit_dch:
7247
7248
0
    WOLFSSL_LEAVE("DoTls13ClientHello", ret);
7249
7250
#ifdef WOLFSSL_ASYNC_CRYPT
7251
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
7252
        ssl->msgsReceived.got_client_hello = 0;
7253
        return ret;
7254
    }
7255
#endif
7256
7257
0
    FreeDch13Args(ssl, args);
7258
#ifdef WOLFSSL_ASYNC_CRYPT
7259
    FreeAsyncCtx(ssl, 0);
7260
#endif
7261
0
    WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
7262
7263
0
    if (ret != 0) {
7264
0
        WOLFSSL_ERROR_VERBOSE(ret);
7265
0
    }
7266
7267
#if defined(HAVE_ECH)
7268
    if (ret == 0 && echX != NULL &&
7269
        ((WOLFSSL_ECH*)echX->data)->state == ECH_WRITE_NONE) {
7270
7271
        /* add the header to the inner hello */
7272
        AddTls13HandShakeHeader(((WOLFSSL_ECH*)echX->data)->innerClientHello,
7273
            ((WOLFSSL_ECH*)echX->data)->innerClientHelloLen, 0, 0,
7274
            client_hello, ssl);
7275
    }
7276
#endif
7277
7278
0
    return ret;
7279
0
}
7280
7281
#ifdef HAVE_ECH
7282
/* replace the last acceptance field for either sever hello or hrr with the ech
7283
 * acceptance parameter, return status */
7284
static int EchWriteAcceptance(WOLFSSL* ssl, byte* label, word16 labelSz,
7285
    byte* output, int acceptOffset, int helloSz, byte msgType)
7286
{
7287
    int ret = 0;
7288
    int digestType = 0;
7289
    int digestSize = 0;
7290
    HS_Hashes* tmpHashes = NULL;
7291
    byte zeros[WC_MAX_DIGEST_SIZE];
7292
    byte transcriptEchConf[WC_MAX_DIGEST_SIZE];
7293
    byte expandLabelPrk[WC_MAX_DIGEST_SIZE];
7294
    XMEMSET(zeros, 0, sizeof(zeros));
7295
    XMEMSET(transcriptEchConf, 0, sizeof(transcriptEchConf));
7296
    XMEMSET(expandLabelPrk, 0, sizeof(expandLabelPrk));
7297
    /* store so we can restore regardless of the outcome */
7298
    tmpHashes = ssl->hsHashes;
7299
    ssl->hsHashes = ssl->hsHashesEch;
7300
    /* hash up to the acceptOffset */
7301
    ret = HashRaw(ssl, output, acceptOffset);
7302
    /* hash 8 zeros */
7303
    if (ret == 0)
7304
       ret = HashRaw(ssl, zeros, ECH_ACCEPT_CONFIRMATION_SZ);
7305
    /* hash the rest of the hello */
7306
    if (ret == 0) {
7307
        ret = HashRaw(ssl, output + acceptOffset + ECH_ACCEPT_CONFIRMATION_SZ,
7308
            helloSz - (acceptOffset + ECH_ACCEPT_CONFIRMATION_SZ));
7309
    }
7310
    /* get the modified transcript hash */
7311
    if (ret == 0)
7312
        ret = GetMsgHash(ssl, transcriptEchConf);
7313
    if (ret > 0)
7314
        ret = 0;
7315
    /* pick the right type and size based on mac_algorithm */
7316
    if (ret == 0) {
7317
        switch (ssl->specs.mac_algorithm) {
7318
#ifndef NO_SHA256
7319
            case sha256_mac:
7320
                digestType = WC_SHA256;
7321
                digestSize = WC_SHA256_DIGEST_SIZE;
7322
                break;
7323
#endif /* !NO_SHA256 */
7324
#ifdef WOLFSSL_SHA384
7325
            case sha384_mac:
7326
                digestType = WC_SHA384;
7327
                digestSize = WC_SHA384_DIGEST_SIZE;
7328
                break;
7329
#endif /* WOLFSSL_SHA384 */
7330
#ifdef WOLFSSL_TLS13_SHA512
7331
            case sha512_mac:
7332
                digestType = WC_SHA512;
7333
                digestSize = WC_SHA512_DIGEST_SIZE;
7334
                break;
7335
#endif /* WOLFSSL_TLS13_SHA512 */
7336
#ifdef WOLFSSL_SM3
7337
            case sm3_mac:
7338
                digestType = WC_SM3;
7339
                digestSize = WC_SM3_DIGEST_SIZE;
7340
                break;
7341
#endif /* WOLFSSL_SM3 */
7342
            default:
7343
                ret = WOLFSSL_FATAL_ERROR;
7344
                break;
7345
        }
7346
    }
7347
    /* extract clientRandom with a key of all zeros */
7348
    if (ret == 0) {
7349
        PRIVATE_KEY_UNLOCK();
7350
    #if !defined(HAVE_FIPS) || \
7351
        (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(6,0))
7352
        ret = wc_HKDF_Extract_ex(digestType, zeros, (word32)digestSize,
7353
            ssl->arrays->clientRandom, RAN_LEN, expandLabelPrk,
7354
            ssl->heap, ssl->devId);
7355
    #else
7356
        ret = wc_HKDF_Extract(digestType, zeros, digestSize,
7357
            ssl->arrays->clientRandom, RAN_LEN, expandLabelPrk);
7358
    #endif
7359
        PRIVATE_KEY_LOCK();
7360
    }
7361
    /* tls expand with the confirmation label */
7362
    if (ret == 0) {
7363
        PRIVATE_KEY_UNLOCK();
7364
        ret = Tls13HKDFExpandKeyLabel(ssl, output + acceptOffset,
7365
            ECH_ACCEPT_CONFIRMATION_SZ, expandLabelPrk, (word32)digestSize,
7366
            tls13ProtocolLabel, TLS13_PROTOCOL_LABEL_SZ, label, labelSz,
7367
            transcriptEchConf, (word32)digestSize, digestType,
7368
            WOLFSSL_SERVER_END);
7369
        PRIVATE_KEY_LOCK();
7370
    }
7371
    /* mark that ech was accepted */
7372
    if (ret == 0 && msgType != hello_retry_request)
7373
        ssl->options.echAccepted = 1;
7374
    /* free hsHashesEch, if this is an HRR we will start at client hello 2*/
7375
    FreeHandshakeHashes(ssl);
7376
    ssl->hsHashesEch = NULL;
7377
    ssl->hsHashes = tmpHashes;
7378
    return ret;
7379
}
7380
#endif
7381
7382
/* Send TLS v1.3 ServerHello message to client.
7383
 * Only a server will send this message.
7384
 *
7385
 * ssl  The SSL/TLS object.
7386
 * returns 0 on success, otherwise failure.
7387
 */
7388
/* handle generation of TLS 1.3 server_hello (2) */
7389
int SendTls13ServerHello(WOLFSSL* ssl, byte extMsgType)
7390
0
{
7391
0
    int    ret;
7392
0
    byte*  output;
7393
0
    word16 length;
7394
0
    word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
7395
0
    int    sendSz;
7396
#if defined(HAVE_ECH)
7397
    TLSX* echX = NULL;
7398
    byte* acceptLabel = (byte*)echAcceptConfirmationLabel;
7399
    word32 acceptOffset;
7400
    word16 acceptLabelSz = ECH_ACCEPT_CONFIRMATION_LABEL_SZ;
7401
#endif
7402
7403
0
    WOLFSSL_START(WC_FUNC_SERVER_HELLO_SEND);
7404
0
    WOLFSSL_ENTER("SendTls13ServerHello");
7405
7406
    /* When ssl->options.dtlsStateful is not set then cookie is calculated in
7407
     * dtls.c */
7408
0
    if (extMsgType == hello_retry_request
7409
#ifdef WOLFSSL_DTLS13
7410
            && (!ssl->options.dtls || ssl->options.dtlsStateful)
7411
#endif
7412
0
            ) {
7413
0
        WOLFSSL_MSG("wolfSSL Sending HelloRetryRequest");
7414
0
        if ((ret = RestartHandshakeHash(ssl)) < 0)
7415
0
            return ret;
7416
0
    }
7417
7418
0
    ssl->options.buildingMsg = 1;
7419
#ifdef WOLFSSL_DTLS13
7420
    if (ssl->options.dtls)
7421
        idx = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
7422
#endif /* WOLFSSL_DTLS13 */
7423
7424
    /* Protocol version, server random, session id, cipher suite, compression
7425
     * and extensions.
7426
     */
7427
0
    length = VERSION_SZ + RAN_LEN + ENUM_LEN + ssl->session->sessionIDSz +
7428
0
             SUITE_LEN + COMP_LEN;
7429
0
    ret = TLSX_GetResponseSize(ssl, extMsgType, &length);
7430
0
    if (ret != 0)
7431
0
        return ret;
7432
0
    sendSz = (int)(idx + length);
7433
7434
    /* Check buffers are big enough and grow if needed. */
7435
0
    if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
7436
0
        return ret;
7437
7438
    /* Get position in output buffer to write new message to. */
7439
0
    output = GetOutputBuffer(ssl);
7440
7441
    /* Put the record and handshake headers on. */
7442
0
    AddTls13Headers(output, length, server_hello, ssl);
7443
7444
    /* The protocol version must be TLS v1.2 for middleboxes. */
7445
0
    output[idx++] = ssl->version.major;
7446
0
    output[idx++] = ssl->options.dtls ? DTLSv1_2_MINOR : TLSv1_2_MINOR;
7447
7448
0
    if (extMsgType == server_hello) {
7449
        /* Generate server random. */
7450
0
        if ((ret = wc_RNG_GenerateBlock(ssl->rng, output + idx, RAN_LEN)) != 0)
7451
0
            return ret;
7452
0
    }
7453
0
    else {
7454
        /* HelloRetryRequest message has fixed value for random. */
7455
0
        XMEMCPY(output + idx, helloRetryRequestRandom, RAN_LEN);
7456
0
    }
7457
7458
#if defined(HAVE_ECH)
7459
    /* last 8 bytes of server random */
7460
    acceptOffset = idx + RAN_LEN - ECH_ACCEPT_CONFIRMATION_SZ;
7461
#endif
7462
7463
    /* Store in SSL for debugging. */
7464
0
    XMEMCPY(ssl->arrays->serverRandom, output + idx, RAN_LEN);
7465
0
    idx += RAN_LEN;
7466
7467
#ifdef WOLFSSL_DEBUG_TLS
7468
    WOLFSSL_MSG("Server random");
7469
    WOLFSSL_BUFFER(ssl->arrays->serverRandom, RAN_LEN);
7470
#endif
7471
7472
0
    output[idx++] = ssl->session->sessionIDSz;
7473
0
    if (ssl->session->sessionIDSz > 0) {
7474
0
        XMEMCPY(output + idx, ssl->session->sessionID, ssl->session->sessionIDSz);
7475
0
        idx += ssl->session->sessionIDSz;
7476
0
    }
7477
7478
    /* Chosen cipher suite */
7479
0
    output[idx++] = ssl->options.cipherSuite0;
7480
0
    output[idx++] = ssl->options.cipherSuite;
7481
#ifdef WOLFSSL_DEBUG_TLS
7482
    WOLFSSL_MSG("Chosen cipher suite:");
7483
    WOLFSSL_MSG(GetCipherNameInternal(ssl->options.cipherSuite0,
7484
                                      ssl->options.cipherSuite));
7485
#endif
7486
7487
    /* Compression not supported in TLS v1.3. */
7488
0
    output[idx++] = 0;
7489
7490
    /* Extensions */
7491
0
    ret = TLSX_WriteResponse(ssl, output + idx, extMsgType, NULL);
7492
0
    if (ret != 0)
7493
0
        return ret;
7494
7495
0
    if (extMsgType == hello_retry_request) {
7496
0
        TLSX* ksExt = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
7497
0
        if (ksExt != NULL) {
7498
0
            KeyShareEntry* kse = (KeyShareEntry*)ksExt->data;
7499
0
            if (kse != NULL)
7500
0
                ssl->hrr_keyshare_group = kse->group;
7501
0
        }
7502
0
    }
7503
7504
#ifdef WOLFSSL_SEND_HRR_COOKIE
7505
    if (ssl->options.sendCookie && extMsgType == hello_retry_request) {
7506
        /* Reset the hashes from here. We will be able to restart the hashes
7507
         * from the cookie in RestartHandshakeHashWithCookie */
7508
#ifdef WOLFSSL_DTLS13
7509
        /* When ssl->options.dtlsStateful is not set then cookie is calculated
7510
         * in dtls.c */
7511
        if (ssl->options.dtls && !ssl->options.dtlsStateful)
7512
            ret = 0;
7513
        else
7514
#endif
7515
            ret = InitHandshakeHashes(ssl);
7516
    }
7517
    else
7518
#endif
7519
0
    {
7520
#ifdef WOLFSSL_DTLS13
7521
        if (ssl->options.dtls) {
7522
            ret = Dtls13HashHandshake(
7523
                ssl,
7524
                output + Dtls13GetRlHeaderLength(ssl, 0) ,
7525
                (word16)sendSz - Dtls13GetRlHeaderLength(ssl, 0));
7526
        }
7527
        else
7528
#endif /* WOLFSSL_DTLS13 */
7529
0
        {
7530
#if defined(HAVE_ECH)
7531
            if (ssl->ctx->echConfigs != NULL && !ssl->options.disableECH) {
7532
                echX = TLSX_Find(ssl->extensions, TLSX_ECH);
7533
                if (echX == NULL)
7534
                    return WOLFSSL_FATAL_ERROR;
7535
                /* use hrr offset */
7536
                if (extMsgType == hello_retry_request) {
7537
                    acceptOffset =
7538
                        (word32)(((WOLFSSL_ECH*)echX->data)->confBuf - output);
7539
                    acceptLabel = (byte*)echHrrAcceptConfirmationLabel;
7540
                    acceptLabelSz = ECH_HRR_ACCEPT_CONFIRMATION_LABEL_SZ;
7541
                }
7542
                /* replace the last 8 bytes of server random with the accept */
7543
                if (((WOLFSSL_ECH*)echX->data)->state == ECH_PARSED_INTERNAL) {
7544
                    if (ret == 0) {
7545
                        ret = EchWriteAcceptance(ssl, acceptLabel,
7546
                            acceptLabelSz, output + RECORD_HEADER_SZ,
7547
                            acceptOffset - RECORD_HEADER_SZ,
7548
                            sendSz - RECORD_HEADER_SZ, extMsgType);
7549
                    }
7550
                    if (extMsgType == hello_retry_request) {
7551
                        /* reset the ech state for round 2 */
7552
                        ((WOLFSSL_ECH*)echX->data)->state = ECH_WRITE_NONE;
7553
                    }
7554
                    else {
7555
                        if (ret == 0) {
7556
                            /* update serverRandom on success */
7557
                            XMEMCPY(ssl->arrays->serverRandom,
7558
                                output + acceptOffset -
7559
                                (RAN_LEN -ECH_ACCEPT_CONFIRMATION_SZ), RAN_LEN);
7560
                        }
7561
                        /* remove ech so we don't keep sending it in write */
7562
                        TLSX_Remove(&ssl->extensions, TLSX_ECH, ssl->heap);
7563
                    }
7564
                }
7565
            }
7566
#endif
7567
0
            if (ret == 0)
7568
0
                ret = HashOutput(ssl, output, sendSz, 0);
7569
0
        }
7570
0
    }
7571
7572
0
    if (ret != 0)
7573
0
        return ret;
7574
7575
#if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
7576
    if (ssl->hsInfoOn)
7577
        AddPacketName(ssl, "ServerHello");
7578
    if (ssl->toInfoOn) {
7579
        ret = AddPacketInfo(ssl, "ServerHello", handshake, output, sendSz,
7580
                      WRITE_PROTO, 0, ssl->heap);
7581
        if (ret != 0)
7582
            return ret;
7583
    }
7584
    #endif
7585
7586
0
    if (extMsgType == server_hello)
7587
0
        ssl->options.serverState = SERVER_HELLO_COMPLETE;
7588
7589
0
    ssl->options.buildingMsg = 0;
7590
#ifdef WOLFSSL_DTLS13
7591
    if (ssl->options.dtls) {
7592
        ret = Dtls13HandshakeSend(ssl, output, (word16)sendSz, (word16)sendSz,
7593
            (enum HandShakeType)extMsgType, 0);
7594
7595
        WOLFSSL_LEAVE("SendTls13ServerHello", ret);
7596
        WOLFSSL_END(WC_FUNC_SERVER_HELLO_SEND);
7597
        return ret;
7598
    }
7599
#endif /* WOLFSSL_DTLS13 */
7600
7601
0
    ssl->buffers.outputBuffer.length += (word32)sendSz;
7602
7603
0
    if (!ssl->options.groupMessages || extMsgType != server_hello)
7604
0
        ret = SendBuffered(ssl);
7605
7606
0
    WOLFSSL_LEAVE("SendTls13ServerHello", ret);
7607
0
    WOLFSSL_END(WC_FUNC_SERVER_HELLO_SEND);
7608
7609
0
    return ret;
7610
0
}
7611
7612
/* handle generation of TLS 1.3 encrypted_extensions (8) */
7613
/* Send the rest of the extensions encrypted under the handshake key.
7614
 * This message is always encrypted in TLS v1.3.
7615
 * Only a server will send this message.
7616
 *
7617
 * ssl  The SSL/TLS object.
7618
 * returns 0 on success, otherwise failure.
7619
 */
7620
static int SendTls13EncryptedExtensions(WOLFSSL* ssl)
7621
0
{
7622
0
    int    ret;
7623
0
    byte*  output;
7624
0
    word16 length = 0;
7625
0
    word32 idx;
7626
0
    int    sendSz;
7627
7628
0
    WOLFSSL_START(WC_FUNC_ENCRYPTED_EXTENSIONS_SEND);
7629
0
    WOLFSSL_ENTER("SendTls13EncryptedExtensions");
7630
7631
0
    ssl->options.buildingMsg = 1;
7632
0
    ssl->keys.encryptionOn = 1;
7633
7634
#ifdef WOLFSSL_DTLS13
7635
    if (ssl->options.dtls) {
7636
        idx = Dtls13GetHeadersLength(ssl, encrypted_extensions);
7637
    }
7638
    else
7639
#endif /* WOLFSSL_DTLS13 */
7640
0
    {
7641
0
        idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
7642
0
    }
7643
7644
0
#if defined(HAVE_SUPPORTED_CURVES) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
7645
0
    if ((ret = TLSX_SupportedCurve_CheckPriority(ssl)) != 0)
7646
0
        return ret;
7647
0
#endif
7648
7649
    /* Derive the handshake secret now that we are at first message to be
7650
     * encrypted under the keys.
7651
     */
7652
0
    if ((ret = DeriveHandshakeSecret(ssl)) != 0)
7653
0
        return ret;
7654
0
    if ((ret = DeriveTls13Keys(ssl, handshake_key,
7655
0
                               ENCRYPT_AND_DECRYPT_SIDE, 1)) != 0)
7656
0
        return ret;
7657
7658
    /* Setup encrypt/decrypt keys for following messages. */
7659
#ifdef WOLFSSL_EARLY_DATA
7660
    if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
7661
        return ret;
7662
    if (ssl->earlyData != process_early_data) {
7663
        if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
7664
            return ret;
7665
    }
7666
#else
7667
0
    if ((ret = SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE)) != 0)
7668
0
        return ret;
7669
0
#endif
7670
#ifdef WOLFSSL_QUIC
7671
    if (IsAtLeastTLSv1_3(ssl->version) && WOLFSSL_IS_QUIC(ssl)) {
7672
        ret = wolfSSL_quic_add_transport_extensions(ssl, encrypted_extensions);
7673
        if (ret != 0)
7674
            return ret;
7675
    }
7676
#endif
7677
7678
#ifdef WOLFSSL_DTLS13
7679
    if (ssl->options.dtls) {
7680
        w64wrapper epochHandshake = w64From32(0, DTLS13_EPOCH_HANDSHAKE);
7681
        ssl->dtls13Epoch = epochHandshake;
7682
7683
        ret = Dtls13SetEpochKeys(
7684
            ssl, epochHandshake, ENCRYPT_AND_DECRYPT_SIDE);
7685
        if (ret != 0)
7686
            return ret;
7687
7688
    }
7689
#endif /* WOLFSSL_DTLS13 */
7690
7691
0
    ret = TLSX_GetResponseSize(ssl, encrypted_extensions, &length);
7692
0
    if (ret != 0)
7693
0
        return ret;
7694
7695
0
    sendSz = (int)(idx + length);
7696
    /* Encryption always on. */
7697
0
    sendSz += MAX_MSG_EXTRA;
7698
7699
    /* Check buffers are big enough and grow if needed. */
7700
0
    ret = CheckAvailableSize(ssl, sendSz);
7701
0
    if (ret != 0)
7702
0
        return ret;
7703
7704
    /* Get position in output buffer to write new message to. */
7705
0
    output = GetOutputBuffer(ssl);
7706
7707
    /* Put the record and handshake headers on. */
7708
0
    AddTls13Headers(output, length, encrypted_extensions, ssl);
7709
7710
0
    ret = TLSX_WriteResponse(ssl, output + idx, encrypted_extensions, NULL);
7711
0
    if (ret != 0)
7712
0
        return ret;
7713
0
    idx += length;
7714
7715
#if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
7716
    if (ssl->hsInfoOn)
7717
        AddPacketName(ssl, "EncryptedExtensions");
7718
    if (ssl->toInfoOn) {
7719
        ret = AddPacketInfo(ssl, "EncryptedExtensions", handshake, output,
7720
                      sendSz, WRITE_PROTO, 0, ssl->heap);
7721
        if (ret != 0)
7722
            return ret;
7723
    }
7724
#endif
7725
7726
#ifdef WOLFSSL_DTLS13
7727
    if (ssl->options.dtls) {
7728
        ssl->options.buildingMsg = 0;
7729
        ret = Dtls13HandshakeSend(ssl, output, (word16)sendSz, (word16)idx,
7730
                                  encrypted_extensions, 1);
7731
7732
        if (ret == 0)
7733
            ssl->options.serverState = SERVER_ENCRYPTED_EXTENSIONS_COMPLETE;
7734
7735
        WOLFSSL_LEAVE("SendTls13EncryptedExtensions", ret);
7736
        WOLFSSL_END(WC_FUNC_ENCRYPTED_EXTENSIONS_SEND);
7737
7738
        return ret;
7739
    }
7740
#endif /* WOLFSSL_DTLS13 */
7741
7742
    /* This handshake message is always encrypted. */
7743
0
    sendSz = BuildTls13Message(ssl, output, sendSz, output + RECORD_HEADER_SZ,
7744
0
                               (int)(idx - RECORD_HEADER_SZ),
7745
0
                               handshake, 1, 0, 0);
7746
0
    if (sendSz < 0)
7747
0
        return sendSz;
7748
7749
0
    ssl->buffers.outputBuffer.length += (word32)sendSz;
7750
0
    ssl->options.buildingMsg = 0;
7751
0
    ssl->options.serverState = SERVER_ENCRYPTED_EXTENSIONS_COMPLETE;
7752
7753
0
    if (!ssl->options.groupMessages)
7754
0
        ret = SendBuffered(ssl);
7755
7756
7757
0
    WOLFSSL_LEAVE("SendTls13EncryptedExtensions", ret);
7758
0
    WOLFSSL_END(WC_FUNC_ENCRYPTED_EXTENSIONS_SEND);
7759
7760
0
    return ret;
7761
0
}
7762
7763
#ifndef NO_CERTS
7764
/* handle generation TLS v1.3 certificate_request (13) */
7765
/* Send the TLS v1.3 CertificateRequest message.
7766
 * This message is always encrypted in TLS v1.3.
7767
 * Only a server will send this message.
7768
 *
7769
 * ssl        SSL/TLS object.
7770
 * reqCtx     Request context.
7771
 * reqCtxLen  Length of context. 0 when sending as part of handshake.
7772
 * returns 0 on success, otherwise failure.
7773
 */
7774
static int SendTls13CertificateRequest(WOLFSSL* ssl, byte* reqCtx,
7775
                                       word32 reqCtxLen)
7776
0
{
7777
0
    byte*   output;
7778
0
    int    ret;
7779
0
    int    sendSz;
7780
0
    word32 i;
7781
0
    word32 reqSz;
7782
0
    word16 hashSigAlgoSz = 0;
7783
0
    SignatureAlgorithms* sa;
7784
7785
0
    WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_SEND);
7786
0
    WOLFSSL_ENTER("SendTls13CertificateRequest");
7787
7788
0
    ssl->options.buildingMsg = 1;
7789
7790
0
    if (ssl->options.side != WOLFSSL_SERVER_END)
7791
0
        return SIDE_ERROR;
7792
7793
    /* Get the length of the hashSigAlgo buffer */
7794
0
    InitSuitesHashSigAlgo(NULL, SIG_ALL, 1, 1, ssl->buffers.keySz,
7795
0
        &hashSigAlgoSz);
7796
0
    sa = TLSX_SignatureAlgorithms_New(ssl, hashSigAlgoSz, ssl->heap);
7797
0
    if (sa == NULL)
7798
0
        return MEMORY_ERROR;
7799
0
    InitSuitesHashSigAlgo(sa->hashSigAlgo, SIG_ALL, 1, 1, ssl->buffers.keySz,
7800
0
        &hashSigAlgoSz);
7801
0
    ret = TLSX_Push(&ssl->extensions, TLSX_SIGNATURE_ALGORITHMS, sa, ssl->heap);
7802
0
    if (ret != 0) {
7803
0
        TLSX_SignatureAlgorithms_FreeAll(sa, ssl->heap);
7804
0
        return ret;
7805
0
    }
7806
7807
0
    i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
7808
#ifdef WOLFSSL_DTLS13
7809
    if (ssl->options.dtls)
7810
        i = Dtls13GetRlHeaderLength(ssl, 1) + DTLS_HANDSHAKE_HEADER_SZ;
7811
#endif /* WOLFSSL_DTLS13 */
7812
7813
0
    reqSz = (word16)(OPAQUE8_LEN + reqCtxLen);
7814
0
    ret = TLSX_GetRequestSize(ssl, certificate_request, &reqSz);
7815
0
    if (ret != 0)
7816
0
        return ret;
7817
7818
0
    sendSz = (int)(i + reqSz);
7819
    /* Always encrypted and make room for padding. */
7820
0
    sendSz += MAX_MSG_EXTRA;
7821
7822
    /* Check buffers are big enough and grow if needed. */
7823
0
    if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
7824
0
        return ret;
7825
7826
    /* Get position in output buffer to write new message to. */
7827
0
    output = GetOutputBuffer(ssl);
7828
7829
    /* Put the record and handshake headers on. */
7830
0
    AddTls13Headers(output, reqSz, certificate_request, ssl);
7831
7832
    /* Certificate request context. */
7833
0
    output[i++] = (byte)reqCtxLen;
7834
0
    if (reqCtxLen != 0) {
7835
0
        XMEMCPY(output + i, reqCtx, reqCtxLen);
7836
0
        i += reqCtxLen;
7837
0
    }
7838
7839
    /* Certificate extensions. */
7840
0
    reqSz = 0;
7841
0
    ret = TLSX_WriteRequest(ssl, output + i, certificate_request, &reqSz);
7842
0
    if (ret != 0)
7843
0
        return ret;
7844
0
    i += reqSz;
7845
7846
#ifdef WOLFSSL_DTLS13
7847
    if (ssl->options.dtls) {
7848
        ssl->options.buildingMsg = 0;
7849
        ret =
7850
            Dtls13HandshakeSend(ssl, output, (word16)sendSz, (word16)i,
7851
                                certificate_request, 1);
7852
7853
        WOLFSSL_LEAVE("SendTls13CertificateRequest", ret);
7854
        WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_SEND);
7855
7856
        return ret;
7857
7858
    }
7859
#endif /* WOLFSSL_DTLS13 */
7860
7861
    /* Always encrypted. */
7862
0
    sendSz = BuildTls13Message(ssl, output, sendSz, output + RECORD_HEADER_SZ,
7863
0
                               (int)(i - RECORD_HEADER_SZ), handshake, 1, 0, 0);
7864
0
    if (sendSz < 0)
7865
0
        return sendSz;
7866
7867
    #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
7868
        if (ssl->hsInfoOn)
7869
            AddPacketName(ssl, "CertificateRequest");
7870
        if (ssl->toInfoOn) {
7871
            ret = AddPacketInfo(ssl, "CertificateRequest", handshake, output,
7872
                          sendSz, WRITE_PROTO, 0, ssl->heap);
7873
            if (ret != 0)
7874
                return ret;
7875
        }
7876
    #endif
7877
7878
0
    ssl->buffers.outputBuffer.length += (word32)sendSz;
7879
0
    ssl->options.buildingMsg = 0;
7880
0
    if (!ssl->options.groupMessages)
7881
0
        ret = SendBuffered(ssl);
7882
7883
0
    WOLFSSL_LEAVE("SendTls13CertificateRequest", ret);
7884
0
    WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_SEND);
7885
7886
0
    return ret;
7887
0
}
7888
#endif /* NO_CERTS */
7889
#endif /* NO_WOLFSSL_SERVER */
7890
7891
#ifndef NO_CERTS
7892
#if (!defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)) && \
7893
    (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
7894
     defined(HAVE_ED448) || defined(HAVE_FALCON) || defined(HAVE_DILITHIUM))
7895
/* Encode the signature algorithm into buffer.
7896
 *
7897
 * hashalgo  The hash algorithm.
7898
 * hsType   The signature type.
7899
 * output    The buffer to encode into.
7900
 */
7901
static WC_INLINE void EncodeSigAlg(const WOLFSSL * ssl, byte hashAlgo,
7902
    byte hsType, byte* output)
7903
{
7904
    (void)ssl;
7905
    switch (hsType) {
7906
#ifdef HAVE_ECC
7907
        case ecc_dsa_sa_algo:
7908
            if (ssl->pkCurveOID == ECC_BRAINPOOLP256R1_OID) {
7909
                output[0] = NEW_SA_MAJOR;
7910
                output[1] = ECDSA_BRAINPOOLP256R1TLS13_SHA256_MINOR;
7911
            }
7912
            else if (ssl->pkCurveOID == ECC_BRAINPOOLP384R1_OID) {
7913
                output[0] = NEW_SA_MAJOR;
7914
                output[1] = ECDSA_BRAINPOOLP384R1TLS13_SHA384_MINOR;
7915
            }
7916
            else if (ssl->pkCurveOID == ECC_BRAINPOOLP512R1_OID) {
7917
                output[0] = NEW_SA_MAJOR;
7918
                output[1] = ECDSA_BRAINPOOLP512R1TLS13_SHA512_MINOR;
7919
            }
7920
            else {
7921
                output[0] = hashAlgo;
7922
                output[1] = ecc_dsa_sa_algo;
7923
            }
7924
            break;
7925
#endif
7926
#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
7927
        case sm2_sa_algo:
7928
            output[0] = SM2_SA_MAJOR;
7929
            output[1] = SM2_SA_MINOR;
7930
            break;
7931
#endif
7932
#ifdef HAVE_ED25519
7933
        /* ED25519: 0x0807 */
7934
        case ed25519_sa_algo:
7935
            output[0] = ED25519_SA_MAJOR;
7936
            output[1] = ED25519_SA_MINOR;
7937
            (void)hashAlgo;
7938
            break;
7939
#endif
7940
#ifdef HAVE_ED448
7941
        /* ED448: 0x0808 */
7942
        case ed448_sa_algo:
7943
            output[0] = ED448_SA_MAJOR;
7944
            output[1] = ED448_SA_MINOR;
7945
            (void)hashAlgo;
7946
            break;
7947
#endif
7948
#ifndef NO_RSA
7949
        /* PSS signatures: 0x080[4-6] or 0x080[9-B] */
7950
        case rsa_pss_sa_algo:
7951
            output[0] = rsa_pss_sa_algo;
7952
#ifdef WC_RSA_PSS
7953
            /* If the private key uses the RSA-PSS OID, and the peer supports
7954
             * the rsa_pss_pss_* signature algorithm in use, then report
7955
             * rsa_pss_pss_* rather than rsa_pss_rsae_*. */
7956
            if (ssl->useRsaPss &&
7957
                ((ssl->pssAlgo & (1U << hashAlgo)) != 0U) &&
7958
                (sha256_mac <= hashAlgo) && (hashAlgo <= sha512_mac))
7959
            {
7960
                output[1] = PSS_RSAE_TO_PSS_PSS(hashAlgo);
7961
            }
7962
            else
7963
#endif
7964
            {
7965
                output[1] = hashAlgo;
7966
            }
7967
            break;
7968
#endif
7969
#ifdef HAVE_FALCON
7970
        case falcon_level1_sa_algo:
7971
            output[0] = FALCON_LEVEL1_SA_MAJOR;
7972
            output[1] = FALCON_LEVEL1_SA_MINOR;
7973
            break;
7974
        case falcon_level5_sa_algo:
7975
            output[0] = FALCON_LEVEL5_SA_MAJOR;
7976
            output[1] = FALCON_LEVEL5_SA_MINOR;
7977
            break;
7978
#endif
7979
#ifdef HAVE_DILITHIUM
7980
        case dilithium_level2_sa_algo:
7981
            output[0] = DILITHIUM_LEVEL2_SA_MAJOR;
7982
            output[1] = DILITHIUM_LEVEL2_SA_MINOR;
7983
            break;
7984
        case dilithium_level3_sa_algo:
7985
            output[0] = DILITHIUM_LEVEL3_SA_MAJOR;
7986
            output[1] = DILITHIUM_LEVEL3_SA_MINOR;
7987
            break;
7988
        case dilithium_level5_sa_algo:
7989
            output[0] = DILITHIUM_LEVEL5_SA_MAJOR;
7990
            output[1] = DILITHIUM_LEVEL5_SA_MINOR;
7991
            break;
7992
#endif
7993
        default:
7994
            break;
7995
    }
7996
}
7997
#endif
7998
7999
#if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
8000
    defined(HAVE_ED448) || defined(HAVE_FALCON) || defined(HAVE_DILITHIUM)
8001
#ifdef WOLFSSL_DUAL_ALG_CERTS
8002
/* These match up with what the OQS team has defined. */
8003
#define HYBRID_SA_MAJOR 0xFE
8004
#define HYBRID_P256_DILITHIUM_LEVEL2_SA_MINOR    0xA1
8005
#define HYBRID_RSA3072_DILITHIUM_LEVEL2_SA_MINOR 0xA2
8006
#define HYBRID_P384_DILITHIUM_LEVEL3_SA_MINOR    0xA4
8007
#define HYBRID_P521_DILITHIUM_LEVEL5_SA_MINOR    0xA6
8008
#define HYBRID_P256_FALCON_LEVEL1_SA_MINOR       0xAF
8009
#define HYBRID_RSA3072_FALCON_LEVEL1_SA_MINOR    0xB0
8010
#define HYBRID_P521_FALCON_LEVEL5_SA_MINOR       0xB2
8011
8012
/* Custom defined ones for PQC first */
8013
#define HYBRID_DILITHIUM_LEVEL2_P256_SA_MINOR    0xD1
8014
#define HYBRID_DILITHIUM_LEVEL2_RSA3072_SA_MINOR 0xD2
8015
#define HYBRID_DILITHIUM_LEVEL3_P384_SA_MINOR    0xD3
8016
#define HYBRID_DILITHIUM_LEVEL5_P521_SA_MINOR    0xD4
8017
#define HYBRID_FALCON_LEVEL1_P256_SA_MINOR       0xD5
8018
#define HYBRID_FALCON_LEVEL1_RSA3072_SA_MINOR    0xD6
8019
#define HYBRID_FALCON_LEVEL5_P521_SA_MINOR       0xD7
8020
8021
8022
static void EncodeDualSigAlg(byte sigAlg, byte altSigAlg, byte* output)
8023
{
8024
    /* Initialize output to error indicator. */
8025
    output[0] = 0x0;
8026
    output[1] = 0x0;
8027
8028
    if (sigAlg == ecc_dsa_sa_algo && altSigAlg == dilithium_level2_sa_algo) {
8029
        output[1] = HYBRID_P256_DILITHIUM_LEVEL2_SA_MINOR;
8030
    }
8031
    else if (sigAlg == rsa_pss_sa_algo &&
8032
             altSigAlg == dilithium_level2_sa_algo) {
8033
        output[1] = HYBRID_RSA3072_DILITHIUM_LEVEL2_SA_MINOR;
8034
    }
8035
    else if (sigAlg == ecc_dsa_sa_algo &&
8036
             altSigAlg == dilithium_level3_sa_algo) {
8037
        output[1] = HYBRID_P384_DILITHIUM_LEVEL3_SA_MINOR;
8038
    }
8039
    else if (sigAlg == ecc_dsa_sa_algo &&
8040
             altSigAlg == dilithium_level5_sa_algo) {
8041
        output[1] = HYBRID_P521_DILITHIUM_LEVEL5_SA_MINOR;
8042
    }
8043
    else if (sigAlg == ecc_dsa_sa_algo &&
8044
             altSigAlg == falcon_level1_sa_algo) {
8045
        output[1] = HYBRID_P256_FALCON_LEVEL1_SA_MINOR;
8046
    }
8047
    else if (sigAlg == rsa_pss_sa_algo &&
8048
             altSigAlg == falcon_level1_sa_algo) {
8049
        output[1] = HYBRID_RSA3072_FALCON_LEVEL1_SA_MINOR;
8050
    }
8051
    else if (sigAlg == ecc_dsa_sa_algo &&
8052
             altSigAlg == falcon_level5_sa_algo) {
8053
        output[1] = HYBRID_P521_FALCON_LEVEL5_SA_MINOR;
8054
    }
8055
    else if (sigAlg == dilithium_level2_sa_algo &&
8056
             altSigAlg == ecc_dsa_sa_algo) {
8057
        output[1] = HYBRID_DILITHIUM_LEVEL2_P256_SA_MINOR;
8058
    }
8059
    else if (sigAlg == dilithium_level2_sa_algo &&
8060
             altSigAlg == rsa_pss_sa_algo) {
8061
        output[1] = HYBRID_DILITHIUM_LEVEL2_RSA3072_SA_MINOR;
8062
    }
8063
    else if (sigAlg == dilithium_level3_sa_algo &&
8064
             altSigAlg == ecc_dsa_sa_algo) {
8065
        output[1] = HYBRID_DILITHIUM_LEVEL3_P384_SA_MINOR;
8066
    }
8067
    else if (sigAlg == dilithium_level5_sa_algo &&
8068
             altSigAlg == ecc_dsa_sa_algo) {
8069
        output[1] = HYBRID_DILITHIUM_LEVEL5_P521_SA_MINOR;
8070
    }
8071
    else if (sigAlg == falcon_level1_sa_algo &&
8072
             altSigAlg == ecc_dsa_sa_algo) {
8073
        output[1] = HYBRID_FALCON_LEVEL1_P256_SA_MINOR;
8074
    }
8075
    else if (sigAlg == falcon_level1_sa_algo &&
8076
             altSigAlg == rsa_pss_sa_algo) {
8077
        output[1] = HYBRID_FALCON_LEVEL1_RSA3072_SA_MINOR;
8078
    }
8079
    else if (sigAlg == falcon_level5_sa_algo &&
8080
             altSigAlg == ecc_dsa_sa_algo) {
8081
        output[1] = HYBRID_FALCON_LEVEL5_P521_SA_MINOR;
8082
    }
8083
8084
    if (output[1] != 0x0) {
8085
        output[0] = HYBRID_SA_MAJOR;
8086
    }
8087
}
8088
#endif /* WOLFSSL_DUAL_ALG_CERTS */
8089
8090
static enum wc_MACAlgorithm GetNewSAHashAlgo(int typeIn)
8091
0
{
8092
0
    switch (typeIn) {
8093
0
        case RSA_PSS_RSAE_SHA256_MINOR:
8094
0
        case RSA_PSS_PSS_SHA256_MINOR:
8095
0
        case ECDSA_BRAINPOOLP256R1TLS13_SHA256_MINOR:
8096
0
            return sha256_mac;
8097
8098
0
        case RSA_PSS_RSAE_SHA384_MINOR:
8099
0
        case RSA_PSS_PSS_SHA384_MINOR:
8100
0
        case ECDSA_BRAINPOOLP384R1TLS13_SHA384_MINOR:
8101
0
            return sha384_mac;
8102
8103
0
        case RSA_PSS_RSAE_SHA512_MINOR:
8104
0
        case RSA_PSS_PSS_SHA512_MINOR:
8105
0
        case ED25519_SA_MINOR:
8106
0
        case ED448_SA_MINOR:
8107
0
        case ECDSA_BRAINPOOLP512R1TLS13_SHA512_MINOR:
8108
0
            return sha512_mac;
8109
0
        default:
8110
0
            return no_mac;
8111
0
    }
8112
0
}
8113
8114
/* Decode the signature algorithm.
8115
 *
8116
 * input     The encoded signature algorithm.
8117
 * hashalgo  The hash algorithm.
8118
 * hsType    The signature type.
8119
 * returns INVALID_PARAMETER if not recognized and 0 otherwise.
8120
 */
8121
static WC_INLINE int DecodeTls13SigAlg(byte* input, byte* hashAlgo,
8122
                                       byte* hsType)
8123
0
{
8124
0
    int ret = 0;
8125
8126
0
    switch (input[0]) {
8127
0
    #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
8128
0
        case SM2_SA_MAJOR:
8129
0
            if (input[1] == SM2_SA_MINOR) {
8130
0
                *hsType = sm2_sa_algo;
8131
0
                *hashAlgo = sm3_mac;
8132
0
            }
8133
0
            else
8134
0
                ret = INVALID_PARAMETER;
8135
0
            break;
8136
0
    #endif
8137
0
        case NEW_SA_MAJOR:
8138
0
            *hashAlgo = GetNewSAHashAlgo(input[1]);
8139
8140
            /* PSS encryption: 0x080[4-6] */
8141
0
            if (input[1] >= RSA_PSS_RSAE_SHA256_MINOR &&
8142
0
                    input[1] <= RSA_PSS_RSAE_SHA512_MINOR) {
8143
0
                *hsType   = input[0];
8144
0
            }
8145
            /* PSS signature: 0x080[9-B] */
8146
0
            else if (input[1] >= RSA_PSS_PSS_SHA256_MINOR &&
8147
0
                    input[1] <= RSA_PSS_PSS_SHA512_MINOR) {
8148
0
                *hsType   = input[0];
8149
0
            }
8150
0
    #ifdef HAVE_ED25519
8151
            /* ED25519: 0x0807 */
8152
0
            else if (input[1] == ED25519_SA_MINOR) {
8153
0
                *hsType = ed25519_sa_algo;
8154
                /* Hash performed as part of sign/verify operation. */
8155
0
            }
8156
0
    #endif
8157
0
    #ifdef HAVE_ED448
8158
            /* ED448: 0x0808 */
8159
0
            else if (input[1] == ED448_SA_MINOR) {
8160
0
                *hsType = ed448_sa_algo;
8161
                /* Hash performed as part of sign/verify operation. */
8162
0
            }
8163
0
    #endif
8164
0
    #ifdef HAVE_ECC_BRAINPOOL
8165
0
            else if ((input[1] == ECDSA_BRAINPOOLP256R1TLS13_SHA256_MINOR) ||
8166
0
                     (input[1] == ECDSA_BRAINPOOLP384R1TLS13_SHA384_MINOR) ||
8167
0
                     (input[1] == ECDSA_BRAINPOOLP512R1TLS13_SHA512_MINOR)) {
8168
0
                *hsType = ecc_dsa_sa_algo;
8169
0
            }
8170
0
    #endif
8171
0
            else
8172
0
                ret = INVALID_PARAMETER;
8173
0
            break;
8174
#if defined(HAVE_FALCON)
8175
        case FALCON_SA_MAJOR:
8176
            if (input[1] == FALCON_LEVEL1_SA_MINOR) {
8177
                *hsType = falcon_level1_sa_algo;
8178
                /* Hash performed as part of sign/verify operation. */
8179
                *hashAlgo = sha512_mac;
8180
            } else if (input[1] == FALCON_LEVEL5_SA_MINOR) {
8181
                *hsType = falcon_level5_sa_algo;
8182
                /* Hash performed as part of sign/verify operation. */
8183
                *hashAlgo = sha512_mac;
8184
            }
8185
            else
8186
                ret = INVALID_PARAMETER;
8187
            break;
8188
#endif /* HAVE_FALCON */
8189
#if defined(HAVE_DILITHIUM)
8190
        case DILITHIUM_SA_MAJOR:
8191
            if (input[1] == DILITHIUM_LEVEL2_SA_MINOR) {
8192
                *hsType = dilithium_level2_sa_algo;
8193
                /* Hash performed as part of sign/verify operation. */
8194
                *hashAlgo = sha512_mac;
8195
            } else if (input[1] == DILITHIUM_LEVEL3_SA_MINOR) {
8196
                *hsType = dilithium_level3_sa_algo;
8197
                /* Hash performed as part of sign/verify operation. */
8198
                *hashAlgo = sha512_mac;
8199
            } else if (input[1] == DILITHIUM_LEVEL5_SA_MINOR) {
8200
                *hsType = dilithium_level5_sa_algo;
8201
                /* Hash performed as part of sign/verify operation. */
8202
                *hashAlgo = sha512_mac;
8203
            }
8204
            else
8205
            {
8206
                ret = INVALID_PARAMETER;
8207
            }
8208
            break;
8209
#endif /* HAVE_DILITHIUM */
8210
0
        default:
8211
0
            *hashAlgo = input[0];
8212
0
            *hsType   = input[1];
8213
0
            break;
8214
0
    }
8215
8216
0
    return ret;
8217
0
}
8218
8219
#ifdef WOLFSSL_DUAL_ALG_CERTS
8220
/* Decode the hybrid signature algorithm.
8221
 *
8222
 * input     The encoded signature algorithm.
8223
 * hashalgo  The hash algorithm.
8224
 * hsType    The signature type.
8225
 * returns INVALID_PARAMETER if not recognized and 0 otherwise.
8226
 */
8227
static WC_INLINE int DecodeTls13HybridSigAlg(byte* input, byte* hashAlg,
8228
                                             byte *sigAlg, byte *altSigAlg)
8229
{
8230
8231
    if (input[0] != HYBRID_SA_MAJOR) {
8232
        return INVALID_PARAMETER;
8233
    }
8234
8235
    if (input[1] == HYBRID_P256_DILITHIUM_LEVEL2_SA_MINOR) {
8236
        *sigAlg = ecc_dsa_sa_algo;
8237
        *hashAlg = sha256_mac;
8238
        *altSigAlg = dilithium_level2_sa_algo;
8239
    }
8240
    else if (input[1] == HYBRID_RSA3072_DILITHIUM_LEVEL2_SA_MINOR) {
8241
        *sigAlg = rsa_pss_sa_algo;
8242
        *hashAlg = sha256_mac;
8243
        *altSigAlg = dilithium_level2_sa_algo;
8244
    }
8245
    else if (input[1] == HYBRID_P384_DILITHIUM_LEVEL3_SA_MINOR) {
8246
        *sigAlg = ecc_dsa_sa_algo;
8247
        *hashAlg = sha384_mac;
8248
        *altSigAlg = dilithium_level3_sa_algo;
8249
    }
8250
    else if (input[1] == HYBRID_P521_DILITHIUM_LEVEL5_SA_MINOR) {
8251
        *sigAlg = ecc_dsa_sa_algo;
8252
        *hashAlg = sha512_mac;
8253
        *altSigAlg = dilithium_level5_sa_algo;
8254
    }
8255
    else if (input[1] == HYBRID_P256_FALCON_LEVEL1_SA_MINOR) {
8256
        *sigAlg = ecc_dsa_sa_algo;
8257
        *hashAlg = sha256_mac;
8258
        *altSigAlg = falcon_level1_sa_algo;
8259
    }
8260
    else if (input[1] == HYBRID_RSA3072_FALCON_LEVEL1_SA_MINOR) {
8261
        *sigAlg = rsa_pss_sa_algo;
8262
        *hashAlg = sha256_mac;
8263
        *altSigAlg = falcon_level1_sa_algo;
8264
    }
8265
    else if (input[1] == HYBRID_P521_FALCON_LEVEL5_SA_MINOR) {
8266
        *sigAlg = ecc_dsa_sa_algo;
8267
        *hashAlg = sha512_mac;
8268
        *altSigAlg = falcon_level5_sa_algo;
8269
    }
8270
    else if (input[1] == HYBRID_DILITHIUM_LEVEL2_P256_SA_MINOR) {
8271
        *sigAlg = dilithium_level2_sa_algo;
8272
        *hashAlg = sha256_mac;
8273
        *altSigAlg = ecc_dsa_sa_algo;
8274
    }
8275
    else if (input[1] == HYBRID_DILITHIUM_LEVEL2_RSA3072_SA_MINOR) {
8276
        *sigAlg = dilithium_level2_sa_algo;
8277
        *hashAlg = sha256_mac;
8278
        *altSigAlg = rsa_pss_sa_algo;
8279
    }
8280
    else if (input[1] == HYBRID_DILITHIUM_LEVEL3_P384_SA_MINOR) {
8281
        *sigAlg = dilithium_level3_sa_algo;
8282
        *hashAlg = sha384_mac;
8283
        *altSigAlg = ecc_dsa_sa_algo;
8284
    }
8285
    else if (input[1] == HYBRID_DILITHIUM_LEVEL5_P521_SA_MINOR) {
8286
        *sigAlg = dilithium_level5_sa_algo;
8287
        *hashAlg = sha512_mac;
8288
        *altSigAlg = ecc_dsa_sa_algo;
8289
    }
8290
    else if (input[1] == HYBRID_FALCON_LEVEL1_P256_SA_MINOR) {
8291
        *sigAlg = falcon_level1_sa_algo;
8292
        *hashAlg = sha256_mac;
8293
        *altSigAlg = ecc_dsa_sa_algo;
8294
    }
8295
    else if (input[1] == HYBRID_FALCON_LEVEL1_RSA3072_SA_MINOR) {
8296
        *sigAlg = falcon_level1_sa_algo;
8297
        *hashAlg = sha256_mac;
8298
        *altSigAlg = rsa_pss_sa_algo;
8299
    }
8300
    else if (input[1] == HYBRID_FALCON_LEVEL5_P521_SA_MINOR) {
8301
        *sigAlg = falcon_level5_sa_algo;
8302
        *hashAlg = sha512_mac;
8303
        *altSigAlg = ecc_dsa_sa_algo;
8304
    }
8305
    else {
8306
        return INVALID_PARAMETER;
8307
    }
8308
8309
    return 0;
8310
}
8311
#endif /* WOLFSSL_DUAL_ALG_CERTS */
8312
8313
/* Get the hash of the messages so far.
8314
 *
8315
 * ssl   The SSL/TLS object.
8316
 * hash  The buffer to write the hash to.
8317
 * returns the length of the hash.
8318
 */
8319
static WC_INLINE int GetMsgHash(WOLFSSL* ssl, byte* hash)
8320
0
{
8321
0
    int ret = 0;
8322
0
    switch (ssl->specs.mac_algorithm) {
8323
0
    #ifndef NO_SHA256
8324
0
        case sha256_mac:
8325
0
            ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
8326
0
            if (ret == 0)
8327
0
                ret = WC_SHA256_DIGEST_SIZE;
8328
0
            break;
8329
0
    #endif /* !NO_SHA256 */
8330
0
    #ifdef WOLFSSL_SHA384
8331
0
        case sha384_mac:
8332
0
            ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
8333
0
            if (ret == 0)
8334
0
                ret = WC_SHA384_DIGEST_SIZE;
8335
0
            break;
8336
0
    #endif /* WOLFSSL_SHA384 */
8337
    #ifdef WOLFSSL_TLS13_SHA512
8338
        case sha512_mac:
8339
            ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512, hash);
8340
            if (ret == 0)
8341
                ret = WC_SHA512_DIGEST_SIZE;
8342
            break;
8343
    #endif /* WOLFSSL_TLS13_SHA512 */
8344
0
    #ifdef WOLFSSL_SM3
8345
0
        case sm3_mac:
8346
0
            ret = wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash);
8347
0
            if (ret == 0)
8348
0
                ret = WC_SM3_DIGEST_SIZE;
8349
0
            break;
8350
0
    #endif /* WOLFSSL_SM3 */
8351
0
        default:
8352
0
            break;
8353
0
    }
8354
0
    return ret;
8355
0
}
8356
8357
/* The server certificate verification label. */
8358
static const byte serverCertVfyLabel[CERT_VFY_LABEL_SZ] =
8359
    "TLS 1.3, server CertificateVerify";
8360
/* The client certificate verification label. */
8361
static const byte clientCertVfyLabel[CERT_VFY_LABEL_SZ] =
8362
    "TLS 1.3, client CertificateVerify";
8363
/* The prefix byte in the signature data. */
8364
#define SIGNING_DATA_PREFIX_BYTE   0x20
8365
8366
/* Create the signature data for TLS v1.3 certificate verification.
8367
 *
8368
 * ssl        The SSL/TLS object.
8369
 * sigData    The signature data.
8370
 * sigDataSz  The length of the signature data.
8371
 * check      Indicates this is a check not create.
8372
 */
8373
int CreateSigData(WOLFSSL* ssl, byte* sigData, word16* sigDataSz,
8374
                  int check)
8375
501
{
8376
501
    word16 idx;
8377
501
    int side = ssl->options.side;
8378
501
    int ret;
8379
8380
    /* Signature Data = Prefix | Label | Handshake Hash */
8381
501
    XMEMSET(sigData, SIGNING_DATA_PREFIX_BYTE, SIGNING_DATA_PREFIX_SZ);
8382
501
    idx = SIGNING_DATA_PREFIX_SZ;
8383
8384
501
    if ((side == WOLFSSL_SERVER_END && check) ||
8385
501
        (side == WOLFSSL_CLIENT_END && !check)) {
8386
0
        XMEMCPY(&sigData[idx], clientCertVfyLabel, CERT_VFY_LABEL_SZ);
8387
0
    }
8388
501
    if ((side == WOLFSSL_CLIENT_END && check) ||
8389
501
        (side == WOLFSSL_SERVER_END && !check)) {
8390
501
        XMEMCPY(&sigData[idx], serverCertVfyLabel, CERT_VFY_LABEL_SZ);
8391
501
    }
8392
501
    idx += CERT_VFY_LABEL_SZ;
8393
8394
501
    ret = GetMsgHash(ssl, &sigData[idx]);
8395
501
    if (ret < 0)
8396
3
        return ret;
8397
8398
498
    *sigDataSz = (word16)(idx + ret);
8399
498
    ret = 0;
8400
8401
498
    return ret;
8402
501
}
8403
8404
#ifndef NO_RSA
8405
/* Encode the PKCS #1.5 RSA signature.
8406
 *
8407
 * sig        The buffer to place the encoded signature into.
8408
 * sigData    The data to be signed.
8409
 * sigDataSz  The size of the data to be signed.
8410
 * hashAlgo   The hash algorithm to use when signing.
8411
 * returns the length of the encoded signature or negative on error.
8412
 */
8413
int CreateRSAEncodedSig(byte* sig, byte* sigData, int sigDataSz,
8414
                        int sigAlgo, int hashAlgo)
8415
496
{
8416
496
    Digest digest;
8417
496
    int    hashSz = 0;
8418
496
    int    ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
8419
496
    byte*  hash;
8420
8421
496
    (void)sigAlgo;
8422
8423
496
    hash = sig;
8424
8425
    /* Digest the signature data. */
8426
496
    switch (hashAlgo) {
8427
0
#ifndef NO_SHA256
8428
337
        case sha256_mac:
8429
337
            ret = wc_InitSha256(&digest.sha256);
8430
337
            if (ret == 0) {
8431
337
                ret = wc_Sha256Update(&digest.sha256, sigData, (word32)sigDataSz);
8432
337
                if (ret == 0)
8433
336
                    ret = wc_Sha256Final(&digest.sha256, hash);
8434
337
                wc_Sha256Free(&digest.sha256);
8435
337
            }
8436
337
            hashSz = WC_SHA256_DIGEST_SIZE;
8437
337
            break;
8438
0
#endif
8439
0
#ifdef WOLFSSL_SHA384
8440
66
        case sha384_mac:
8441
66
            ret = wc_InitSha384(&digest.sha384);
8442
66
            if (ret == 0) {
8443
66
                ret = wc_Sha384Update(&digest.sha384, sigData, (word32)sigDataSz);
8444
66
                if (ret == 0)
8445
65
                    ret = wc_Sha384Final(&digest.sha384, hash);
8446
66
                wc_Sha384Free(&digest.sha384);
8447
66
            }
8448
66
            hashSz = WC_SHA384_DIGEST_SIZE;
8449
66
            break;
8450
0
#endif
8451
0
#ifdef WOLFSSL_SHA512
8452
93
        case sha512_mac:
8453
93
            ret = wc_InitSha512(&digest.sha512);
8454
93
            if (ret == 0) {
8455
93
                ret = wc_Sha512Update(&digest.sha512, sigData, (word32)sigDataSz);
8456
93
                if (ret == 0)
8457
92
                    ret = wc_Sha512Final(&digest.sha512, hash);
8458
93
                wc_Sha512Free(&digest.sha512);
8459
93
            }
8460
93
            hashSz = WC_SHA512_DIGEST_SIZE;
8461
93
            break;
8462
0
#endif
8463
0
       default:
8464
0
            ret = BAD_FUNC_ARG;
8465
0
            break;
8466
8467
496
    }
8468
8469
496
    if (ret != 0)
8470
7
        return ret;
8471
8472
489
    return hashSz;
8473
496
}
8474
#endif /* !NO_RSA */
8475
8476
#ifdef HAVE_ECC
8477
/* Encode the ECC signature.
8478
 *
8479
 * sigData    The data to be signed.
8480
 * sigDataSz  The size of the data to be signed.
8481
 * hashAlgo   The hash algorithm to use when signing.
8482
 * returns the length of the encoded signature or negative on error.
8483
 */
8484
static int CreateECCEncodedSig(byte* sigData, int sigDataSz, int hashAlgo)
8485
0
{
8486
0
    Digest digest;
8487
0
    int    hashSz = 0;
8488
0
    int    ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
8489
8490
    /* Digest the signature data. */
8491
0
    switch (hashAlgo) {
8492
0
#ifndef NO_SHA256
8493
0
        case sha256_mac:
8494
0
            ret = wc_InitSha256(&digest.sha256);
8495
0
            if (ret == 0) {
8496
0
                ret = wc_Sha256Update(&digest.sha256, sigData, (word32)sigDataSz);
8497
0
                if (ret == 0)
8498
0
                    ret = wc_Sha256Final(&digest.sha256, sigData);
8499
0
                wc_Sha256Free(&digest.sha256);
8500
0
            }
8501
0
            hashSz = WC_SHA256_DIGEST_SIZE;
8502
0
            break;
8503
0
#endif
8504
0
#ifdef WOLFSSL_SHA384
8505
0
        case sha384_mac:
8506
0
            ret = wc_InitSha384(&digest.sha384);
8507
0
            if (ret == 0) {
8508
0
                ret = wc_Sha384Update(&digest.sha384, sigData, (word32)sigDataSz);
8509
0
                if (ret == 0)
8510
0
                    ret = wc_Sha384Final(&digest.sha384, sigData);
8511
0
                wc_Sha384Free(&digest.sha384);
8512
0
            }
8513
0
            hashSz = WC_SHA384_DIGEST_SIZE;
8514
0
            break;
8515
0
#endif
8516
0
#ifdef WOLFSSL_SHA512
8517
0
        case sha512_mac:
8518
0
            ret = wc_InitSha512(&digest.sha512);
8519
0
            if (ret == 0) {
8520
0
                ret = wc_Sha512Update(&digest.sha512, sigData, (word32)sigDataSz);
8521
0
                if (ret == 0)
8522
0
                    ret = wc_Sha512Final(&digest.sha512, sigData);
8523
0
                wc_Sha512Free(&digest.sha512);
8524
0
            }
8525
0
            hashSz = WC_SHA512_DIGEST_SIZE;
8526
0
            break;
8527
0
#endif
8528
0
        default:
8529
0
            ret = BAD_FUNC_ARG;
8530
0
            break;
8531
0
    }
8532
8533
0
    if (ret != 0)
8534
0
        return ret;
8535
8536
0
    return hashSz;
8537
0
}
8538
#endif /* HAVE_ECC */
8539
8540
#if !defined(NO_RSA) && defined(WC_RSA_PSS)
8541
/* Check that the decrypted signature matches the encoded signature
8542
 * based on the digest of the signature data.
8543
 *
8544
 * ssl       The SSL/TLS object.
8545
 * sigAlgo   The signature algorithm used to generate signature.
8546
 * hashAlgo  The hash algorithm used to generate signature.
8547
 * decSig    The decrypted signature.
8548
 * decSigSz  The size of the decrypted signature.
8549
 * returns 0 on success, otherwise failure.
8550
 */
8551
static int CheckRSASignature(WOLFSSL* ssl, int sigAlgo, int hashAlgo,
8552
                             byte* decSig, word32 decSigSz)
8553
0
{
8554
0
    int    ret = 0;
8555
0
    byte   sigData[MAX_SIG_DATA_SZ];
8556
0
    word16 sigDataSz;
8557
8558
0
    ret = CreateSigData(ssl, sigData, &sigDataSz, 1);
8559
0
    if (ret != 0)
8560
0
        return ret;
8561
8562
0
    if (sigAlgo == rsa_pss_sa_algo) {
8563
0
        enum wc_HashType hashType = WC_HASH_TYPE_NONE;
8564
0
        word32 sigSz;
8565
8566
0
        ret = ConvertHashPss(hashAlgo, &hashType, NULL);
8567
0
        if (ret < 0)
8568
0
            return ret;
8569
8570
        /* PSS signature can be done in-place */
8571
0
        ret = CreateRSAEncodedSig(sigData, sigData, sigDataSz,
8572
0
                                  sigAlgo, hashAlgo);
8573
0
        if (ret < 0)
8574
0
            return ret;
8575
0
        sigSz = (word32)ret;
8576
8577
0
        ret = wc_RsaPSS_CheckPadding(sigData, sigSz, decSig, decSigSz,
8578
0
                                     hashType);
8579
0
    }
8580
8581
0
    return ret;
8582
0
}
8583
#endif /* !NO_RSA && WC_RSA_PSS */
8584
#endif /* !NO_RSA || HAVE_ECC */
8585
8586
#if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)
8587
/* Get the next certificate from the list for writing into the TLS v1.3
8588
 * Certificate message.
8589
 *
8590
 * data    The certificate list.
8591
 * length  The length of the certificate data in the list.
8592
 * idx     The index of the next certificate.
8593
 * returns the length of the certificate data. 0 indicates no more certificates
8594
 * in the list.
8595
 */
8596
static word32 NextCert(byte* data, word32 length, word32* idx)
8597
0
{
8598
0
    word32 len;
8599
8600
    /* Is index at end of list. */
8601
0
    if (*idx == length)
8602
0
        return 0;
8603
8604
    /* Length of the current ASN.1 encoded certificate. */
8605
0
    c24to32(data + *idx, &len);
8606
    /* Include the length field. */
8607
0
    len += 3;
8608
8609
    /* Move index to next certificate and return the current certificate's
8610
     * length.
8611
     */
8612
0
    *idx += len;
8613
0
    return len;
8614
0
}
8615
8616
#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) && !defined(NO_WOLFSSL_SERVER)
8617
/* Write certificate status request into certificate to buffer.
8618
 *
8619
 * ssl       SSL/TLS object.
8620
 * certExts  DerBuffer array. buffers written
8621
 * extSz     word32 array.
8622
 *           Length of the certificate status request data for the certificate.
8623
 * extSz_num number of the CSR written
8624
 * extIdx    The index number of certificate status request data
8625
 *           for the certificate.
8626
 * offset    index offset
8627
 * returns   Total number of bytes written.
8628
 */
8629
static int WriteCSRToBuffer(WOLFSSL* ssl, DerBuffer** certExts,
8630
                                word16* extSz,  word16 extSz_num)
8631
{
8632
    int    ret = 0;
8633
    TLSX* ext;
8634
    CertificateStatusRequest* csr;
8635
    word32 ex_offset = HELLO_EXT_TYPE_SZ + OPAQUE16_LEN /* extension type */
8636
                    + OPAQUE16_LEN /* extension length */;
8637
    word32 totalSz = 0;
8638
    word32 tmpSz;
8639
    word32 extIdx;
8640
    DerBuffer* der;
8641
8642
    ext = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
8643
    csr = ext ? (CertificateStatusRequest*)ext->data : NULL;
8644
8645
    if (csr) {
8646
        for (extIdx = 0; extIdx < (word16)(extSz_num); extIdx++) {
8647
            tmpSz = TLSX_CSR_GetSize_ex(csr, 0, (int)extIdx);
8648
8649
            if (tmpSz > (OPAQUE8_LEN + OPAQUE24_LEN) &&
8650
                certExts[extIdx] == NULL) {
8651
                /* csr extension is not zero */
8652
                extSz[extIdx] = tmpSz;
8653
8654
                ret = AllocDer(&certExts[extIdx], extSz[extIdx] + ex_offset,
8655
                                                    CERT_TYPE, ssl->heap);
8656
                if (ret < 0)
8657
                    return ret;
8658
                der = certExts[extIdx];
8659
8660
                /* write extension type */
8661
                c16toa(ext->type, der->buffer
8662
                                + OPAQUE16_LEN);
8663
                /* writes extension data length. */
8664
                c16toa(extSz[extIdx], der->buffer
8665
                            + HELLO_EXT_TYPE_SZ + OPAQUE16_LEN);
8666
                /* write extension data */
8667
                extSz[extIdx] = (word16)TLSX_CSR_Write_ex(csr,
8668
                        der->buffer + ex_offset, 0, extIdx);
8669
                /* add extension offset */
8670
                extSz[extIdx] += (word16)ex_offset;
8671
                /* extension length */
8672
                c16toa(extSz[extIdx] - OPAQUE16_LEN,
8673
                            der->buffer);
8674
            }
8675
            totalSz += extSz[extIdx];
8676
        }
8677
    }
8678
    else {
8679
        /* chain cert empty extension size */
8680
        totalSz += OPAQUE16_LEN * extSz_num;
8681
    }
8682
    return (int)totalSz;
8683
}
8684
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
8685
/* Add certificate data and empty extension to output up to the fragment size.
8686
 *
8687
 * ssl     SSL/TLS object.
8688
 * cert    The certificate data to write out.
8689
 * len     The length of the certificate data.
8690
 * extSz   Length of the extension data with the certificate.
8691
 * idx     The start of the certificate data to write out.
8692
 * fragSz  The maximum size of this fragment.
8693
 * output  The buffer to write to.
8694
 * extIdx  The index number of the extension data with the certificate
8695
 * returns the number of bytes written.
8696
 */
8697
static word32 AddCertExt(WOLFSSL* ssl, byte* cert, word32 len, word16 extSz,
8698
                         word32 idx, word32 fragSz, byte* output, word16 extIdx)
8699
530
{
8700
530
    word32 i = 0;
8701
530
    word32 copySz = min(len - idx, fragSz);
8702
8703
530
    if (idx < len) {
8704
530
        XMEMCPY(output, cert + idx, copySz);
8705
530
        i = copySz;
8706
530
        if (copySz == fragSz)
8707
0
            return i;
8708
530
    }
8709
530
    copySz = len + extSz - idx - i;
8710
8711
530
    if (extSz == OPAQUE16_LEN) {
8712
530
        if (copySz <= fragSz) {
8713
            /* Empty extension */
8714
530
            output[i++] = 0;
8715
530
            output[i++] = 0;
8716
530
        }
8717
530
    }
8718
0
    else {
8719
0
        byte* certExts = ssl->buffers.certExts[extIdx]->buffer + idx + i - len;
8720
        /* Put out as much of the extensions' data as will fit in fragment. */
8721
0
        if (copySz > fragSz - i)
8722
0
            copySz = fragSz - i;
8723
0
        XMEMCPY(output + i, certExts, copySz);
8724
0
        i += copySz;
8725
0
    }
8726
8727
530
    return i;
8728
530
}
8729
8730
#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) && !defined(NO_WOLFSSL_SERVER)
8731
static int SetupOcspResp(WOLFSSL* ssl)
8732
{
8733
    DecodedCert* cert = NULL;
8734
    CertificateStatusRequest* csr = NULL;
8735
    TLSX* extension = NULL;
8736
    int ret = 0;
8737
    OcspRequest* request = NULL;
8738
8739
    extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
8740
    if (extension == NULL)
8741
        return 0; /* peer didn't signal ocsp support */
8742
    csr = (CertificateStatusRequest*)extension->data;
8743
    if (csr == NULL)
8744
        return MEMORY_ERROR;
8745
8746
    if (SSL_CM(ssl) != NULL &&
8747
            SSL_CM(ssl)->ocsp_stapling != NULL &&
8748
            SSL_CM(ssl)->ocsp_stapling->statusCb != NULL) {
8749
        return TLSX_CSR_SetResponseWithStatusCB(ssl);
8750
    }
8751
8752
    if (ssl->buffers.certificate == NULL) {
8753
        WOLFSSL_MSG("Certificate buffer not set!");
8754
        return BUFFER_ERROR;
8755
    }
8756
    cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
8757
                                 DYNAMIC_TYPE_DCERT);
8758
    if (cert == NULL) {
8759
        return MEMORY_E;
8760
    }
8761
    InitDecodedCert(cert, ssl->buffers.certificate->buffer,
8762
                    ssl->buffers.certificate->length, ssl->heap);
8763
    ret = ParseCert(cert, CERT_TYPE, NO_VERIFY, SSL_CM(ssl));
8764
    if (ret != 0) {
8765
        FreeDecodedCert(cert);
8766
        XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
8767
        return ret;
8768
    }
8769
    ret = TLSX_CSR_InitRequest(ssl->extensions, cert, ssl->heap);
8770
    FreeDecodedCert(cert);
8771
    XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
8772
    if (ret != 0 )
8773
        return ret;
8774
8775
    request = &csr->request.ocsp[0];
8776
    ret = CreateOcspResponse(ssl, &request, &csr->responses[0]);
8777
    if (request != &csr->request.ocsp[0] &&
8778
            ssl->buffers.weOwnCert) {
8779
        /* request will be allocated in CreateOcspResponse() */
8780
        FreeOcspRequest(request);
8781
        XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
8782
    }
8783
    if (ret != 0)
8784
        return ret;
8785
8786
    if (csr->responses[0].buffer)
8787
        extension->resp = 1;
8788
#if defined(WOLFSSL_TLS_OCSP_MULTI)
8789
    /* process OCSP request in certificate chain */
8790
    if ((ret = ProcessChainOCSPRequest(ssl)) != 0) {
8791
        WOLFSSL_MSG("Process Cert Chain OCSP request failed");
8792
        WOLFSSL_ERROR_VERBOSE(ret);
8793
        return ret;
8794
    }
8795
#endif
8796
    return ret;
8797
}
8798
#endif
8799
8800
/* handle generation TLS v1.3 certificate (11) */
8801
/* Send the certificate for this end and any CAs that help with validation.
8802
 * This message is always encrypted in TLS v1.3.
8803
 *
8804
 * ssl  The SSL/TLS object.
8805
 * returns 0 on success, otherwise failure.
8806
 */
8807
static int SendTls13Certificate(WOLFSSL* ssl)
8808
{
8809
    int    ret = 0;
8810
    word32 certSz, certChainSz, headerSz, listSz, payloadSz;
8811
    word16 extSz[MAX_CERT_EXTENSIONS];
8812
    word16 extIdx = 0;
8813
    word32 maxFragment;
8814
    word32 totalextSz = 0;
8815
    word32 len = 0;
8816
    word32 idx = 0;
8817
    word32 offset = OPAQUE16_LEN;
8818
    byte*  p = NULL;
8819
    byte   certReqCtxLen = 0;
8820
    sword32 length;
8821
#ifdef WOLFSSL_POST_HANDSHAKE_AUTH
8822
    byte*  certReqCtx = NULL;
8823
#endif
8824
8825
#ifdef OPENSSL_EXTRA
8826
    WOLFSSL_X509* x509 = NULL;
8827
    WOLFSSL_EVP_PKEY* pkey = NULL;
8828
#endif
8829
8830
    WOLFSSL_START(WC_FUNC_CERTIFICATE_SEND);
8831
    WOLFSSL_ENTER("SendTls13Certificate");
8832
8833
    XMEMSET(extSz, 0, sizeof(extSz));
8834
8835
    ssl->options.buildingMsg = 1;
8836
8837
#ifdef WOLFSSL_POST_HANDSHAKE_AUTH
8838
    if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->certReqCtx != NULL) {
8839
        certReqCtxLen = ssl->certReqCtx->len;
8840
        certReqCtx = &ssl->certReqCtx->ctx;
8841
    }
8842
#endif
8843
8844
#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_CERT_SETUP_CB)
8845
    /* call client cert callback if no cert has been loaded */
8846
    if ((ssl->ctx->CBClientCert != NULL) &&
8847
        (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer)) {
8848
        ret = ssl->ctx->CBClientCert(ssl, &x509, &pkey);
8849
        if (ret == 1) {
8850
            if ((wolfSSL_CTX_use_certificate(ssl->ctx, x509) == WOLFSSL_SUCCESS) &&
8851
                (wolfSSL_CTX_use_PrivateKey(ssl->ctx, pkey) == WOLFSSL_SUCCESS)) {
8852
                ssl->options.sendVerify = SEND_CERT;
8853
            }
8854
            wolfSSL_X509_free(x509);
8855
            x509 = NULL;
8856
            wolfSSL_EVP_PKEY_free(pkey);
8857
        }
8858
    }
8859
#endif
8860
8861
    if (ssl->options.sendVerify == SEND_BLANK_CERT) {
8862
        certSz = 0;
8863
        certChainSz = 0;
8864
        headerSz = OPAQUE8_LEN + certReqCtxLen + CERT_HEADER_SZ;
8865
        length = (sword32)headerSz;
8866
        listSz = 0;
8867
    }
8868
    else {
8869
        if (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer) {
8870
            WOLFSSL_MSG("Send Cert missing certificate buffer");
8871
            return NO_CERT_ERROR;
8872
        }
8873
        /* Certificate Data */
8874
        certSz = ssl->buffers.certificate->length;
8875
        /* Cert Req Ctx Len | Cert Req Ctx | Cert List Len | Cert Data Len */
8876
        headerSz = OPAQUE8_LEN + certReqCtxLen + CERT_HEADER_SZ +
8877
                   CERT_HEADER_SZ;
8878
        /* set empty extension as default */
8879
        for (extIdx = 0; extIdx < (word16)XELEM_CNT(extSz); extIdx++)
8880
            extSz[extIdx] = OPAQUE16_LEN;
8881
8882
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) && !defined(NO_WOLFSSL_SERVER)
8883
        /* We only send CSR on the server side. On client side, the CSR data
8884
         * is populated with the server response. We would be sending the server
8885
         * its own stapling data. */
8886
        if (ssl->options.side == WOLFSSL_SERVER_END) {
8887
            ret = SetupOcspResp(ssl);
8888
            if (ret != 0)
8889
                return ret;
8890
8891
            ret = WriteCSRToBuffer(ssl, &ssl->buffers.certExts[0], &extSz[0],
8892
                    1 /* +1 for leaf */ + ssl->buffers.certChainCnt);
8893
            if (ret < 0)
8894
                return ret;
8895
            totalextSz += ret;
8896
            ret = 0; /* Clear to signal no error */
8897
        }
8898
        else
8899
    #endif
8900
        {
8901
            /* Leaf cert empty extension size */
8902
            totalextSz += OPAQUE16_LEN;
8903
            /* chain cert empty extension size */
8904
            totalextSz += OPAQUE16_LEN * ssl->buffers.certChainCnt;
8905
        }
8906
8907
        /* Length of message data with one certificate and extensions. */
8908
        length = (sword32)(headerSz + certSz + totalextSz);
8909
        /* Length of list data with one certificate and extensions. */
8910
        listSz = CERT_HEADER_SZ + certSz + totalextSz;
8911
8912
        /* Send rest of chain if sending cert (chain has leading size/s). */
8913
        if (certSz > 0 && ssl->buffers.certChainCnt > 0) {
8914
            p = ssl->buffers.certChain->buffer;
8915
            /* Chain length including extensions. */
8916
            certChainSz = ssl->buffers.certChain->length;
8917
8918
            length += certChainSz;
8919
            listSz += certChainSz;
8920
        }
8921
        else
8922
            certChainSz = 0;
8923
    }
8924
8925
    payloadSz = (word32)length;
8926
8927
    if (ssl->fragOffset != 0)
8928
        length -= (ssl->fragOffset + headerSz);
8929
8930
    maxFragment = (word32)wolfssl_local_GetMaxPlaintextSize(ssl);
8931
8932
    extIdx = 0;
8933
8934
    while (length > 0 && ret == 0) {
8935
        byte*  output = NULL;
8936
        word32 fragSz = 0;
8937
        word32 i = RECORD_HEADER_SZ;
8938
        int    sendSz = RECORD_HEADER_SZ;
8939
8940
#ifdef WOLFSSL_DTLS13
8941
        if (ssl->options.dtls) {
8942
            i = Dtls13GetRlHeaderLength(ssl, 1);
8943
            sendSz = (int)i;
8944
        }
8945
#endif /* WOLFSSL_DTLS13 */
8946
8947
        if (ssl->fragOffset == 0) {
8948
            if (headerSz + certSz + totalextSz + certChainSz <=
8949
                                            maxFragment - HANDSHAKE_HEADER_SZ) {
8950
                fragSz = headerSz + certSz + totalextSz + certChainSz;
8951
            }
8952
#ifdef WOLFSSL_DTLS13
8953
            else if (ssl->options.dtls){
8954
                /* short-circuit the fragmentation logic here. DTLS
8955
                   fragmentation will be done in dtls13HandshakeSend() */
8956
                fragSz = headerSz + certSz + totalextSz + certChainSz;
8957
            }
8958
#endif /* WOLFSSL_DTLS13 */
8959
            else {
8960
                fragSz = maxFragment - HANDSHAKE_HEADER_SZ;
8961
            }
8962
8963
            sendSz += fragSz + HANDSHAKE_HEADER_SZ;
8964
            i += HANDSHAKE_HEADER_SZ;
8965
#ifdef WOLFSSL_DTLS13
8966
            if (ssl->options.dtls) {
8967
                sendSz += DTLS_HANDSHAKE_EXTRA;
8968
                i += DTLS_HANDSHAKE_EXTRA;
8969
            }
8970
#endif /* WOLFSSL_DTLS13 */
8971
        }
8972
        else {
8973
            fragSz = min((word32)length, maxFragment);
8974
            sendSz += fragSz;
8975
        }
8976
8977
        sendSz += MAX_MSG_EXTRA;
8978
8979
        /* Check buffers are big enough and grow if needed. */
8980
        if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
8981
            return ret;
8982
8983
        /* Get position in output buffer to write new message to. */
8984
        output = GetOutputBuffer(ssl);
8985
8986
        if (ssl->fragOffset == 0) {
8987
            AddTls13FragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
8988
8989
            /* Request context. */
8990
            output[i++] = certReqCtxLen;
8991
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
8992
            if (certReqCtxLen > 0) {
8993
                XMEMCPY(output + i, certReqCtx, certReqCtxLen);
8994
                i += certReqCtxLen;
8995
            }
8996
        #endif
8997
            length -= OPAQUE8_LEN + certReqCtxLen;
8998
            fragSz -= OPAQUE8_LEN + certReqCtxLen;
8999
            /* Certificate list length. */
9000
            c32to24(listSz, output + i);
9001
            i += CERT_HEADER_SZ;
9002
            length -= CERT_HEADER_SZ;
9003
            fragSz -= CERT_HEADER_SZ;
9004
            /* Leaf certificate data length. */
9005
            if (certSz > 0) {
9006
                c32to24(certSz, output + i);
9007
                i += CERT_HEADER_SZ;
9008
                length -= CERT_HEADER_SZ;
9009
                fragSz -= CERT_HEADER_SZ;
9010
            }
9011
        }
9012
        else
9013
            AddTls13RecordHeader(output, fragSz, handshake, ssl);
9014
9015
        if (extIdx == 0) {
9016
            if (certSz > 0 && ssl->fragOffset < certSz + extSz[0]) {
9017
                /* Put in the leaf certificate with extensions. */
9018
                word32 copySz = AddCertExt(ssl, ssl->buffers.certificate->buffer,
9019
                                certSz, extSz[0], ssl->fragOffset, fragSz,
9020
                                output + i, 0);
9021
                i += copySz;
9022
                ssl->fragOffset += copySz;
9023
                length -= copySz;
9024
                fragSz -= copySz;
9025
                if (ssl->fragOffset == certSz + extSz[0])
9026
                    FreeDer(&ssl->buffers.certExts[0]);
9027
            }
9028
        }
9029
        if (certChainSz > 0 && fragSz > 0) {
9030
             /* Put in the CA certificates with extensions. */
9031
             while (fragSz > 0) {
9032
                word32 l;
9033
9034
                if (offset == len + OPAQUE16_LEN) {
9035
                    /* Find next CA certificate to write out. */
9036
                    offset = 0;
9037
                    /* Point to the start of current cert in chain buffer. */
9038
                    p = ssl->buffers.certChain->buffer + idx;
9039
                    len = NextCert(ssl->buffers.certChain->buffer,
9040
                            ssl->buffers.certChain->length, &idx);
9041
                    if (len == 0)
9042
                        break;
9043
                #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) && \
9044
                        !defined(NO_WOLFSSL_SERVER)
9045
                    if (MAX_CERT_EXTENSIONS > extIdx)
9046
                        extIdx++;
9047
                #endif
9048
                }
9049
                /* Write out certificate and extension. */
9050
                l = AddCertExt(ssl, p, len, extSz[extIdx], offset, fragSz,
9051
                                                       output + i, extIdx);
9052
                i += l;
9053
                ssl->fragOffset += l;
9054
                length -= l;
9055
                fragSz -= l;
9056
                offset += l;
9057
9058
                if (extIdx != 0 && extIdx < MAX_CERT_EXTENSIONS &&
9059
                    ssl->buffers.certExts[extIdx] != NULL &&
9060
                                offset == len + extSz[extIdx])
9061
                    FreeDer(&ssl->buffers.certExts[extIdx]);
9062
                /* for next chain cert */
9063
                len += extSz[extIdx] - OPAQUE16_LEN;
9064
            }
9065
        }
9066
9067
        if ((int)i - RECORD_HEADER_SZ < 0) {
9068
            WOLFSSL_MSG("Send Cert bad inputSz");
9069
            return BUFFER_E;
9070
        }
9071
9072
#ifdef WOLFSSL_DTLS13
9073
        if (ssl->options.dtls) {
9074
            /* DTLS1.3 uses a separate variable and logic for fragments */
9075
            ssl->options.buildingMsg = 0;
9076
            ssl->fragOffset = 0;
9077
            ret = Dtls13HandshakeSend(ssl, output, (word16)sendSz, (word16)i,
9078
                                      certificate, 1);
9079
        }
9080
        else
9081
#endif /* WOLFSSL_DTLS13 */
9082
        {
9083
            /* This message is always encrypted. */
9084
            sendSz = BuildTls13Message(ssl, output, sendSz,
9085
                output + RECORD_HEADER_SZ, (int)(i - RECORD_HEADER_SZ),
9086
                handshake, 1,
9087
                0, 0);
9088
            if (sendSz < 0)
9089
                return sendSz;
9090
9091
#if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
9092
            if (ssl->hsInfoOn)
9093
                AddPacketName(ssl, "Certificate");
9094
            if (ssl->toInfoOn) {
9095
                ret = AddPacketInfo(ssl, "Certificate", handshake, output,
9096
                              sendSz, WRITE_PROTO, 0, ssl->heap);
9097
                if (ret != 0)
9098
                    return ret;
9099
            }
9100
#endif
9101
9102
            ssl->buffers.outputBuffer.length += (word32)sendSz;
9103
            ssl->options.buildingMsg = 0;
9104
            if (!ssl->options.groupMessages)
9105
                ret = SendBuffered(ssl);
9106
        }
9107
    }
9108
9109
    if (ret != WC_NO_ERR_TRACE(WANT_WRITE)) {
9110
        /* Clean up the fragment offset. */
9111
        ssl->options.buildingMsg = 0;
9112
        ssl->fragOffset = 0;
9113
        if (ssl->options.side == WOLFSSL_SERVER_END)
9114
            ssl->options.serverState = SERVER_CERT_COMPLETE;
9115
    }
9116
9117
#ifdef WOLFSSL_POST_HANDSHAKE_AUTH
9118
    if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->certReqCtx != NULL) {
9119
        CertReqCtx* ctx = ssl->certReqCtx;
9120
        ssl->certReqCtx = ssl->certReqCtx->next;
9121
        XFREE(ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
9122
    }
9123
#endif
9124
9125
    WOLFSSL_LEAVE("SendTls13Certificate", ret);
9126
    WOLFSSL_END(WC_FUNC_CERTIFICATE_SEND);
9127
9128
    return ret;
9129
}
9130
9131
#if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
9132
     defined(HAVE_ED448) || defined(HAVE_FALCON) || \
9133
     defined(HAVE_DILITHIUM)) && \
9134
    (!defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH))
9135
typedef struct Scv13Args {
9136
    byte*  output; /* not allocated */
9137
    byte*  verify; /* not allocated */
9138
    word32 idx;
9139
    word32 sigLen;
9140
    int    sendSz;
9141
    word16 length;
9142
9143
    byte   sigAlgo;
9144
    byte*  sigData;
9145
    word16 sigDataSz;
9146
#ifndef NO_RSA
9147
    byte*  toSign; /* not allocated */
9148
    word32 toSignSz;
9149
#endif
9150
#ifdef WOLFSSL_DUAL_ALG_CERTS
9151
    byte   altSigAlgo;
9152
    word32 altSigLen;    /* Only used in the case of both native and alt. */
9153
    byte*  altSigData;
9154
    word16 altSigDataSz;
9155
#endif
9156
} Scv13Args;
9157
9158
static void FreeScv13Args(WOLFSSL* ssl, void* pArgs)
9159
511
{
9160
511
    Scv13Args* args = (Scv13Args*)pArgs;
9161
9162
511
    (void)ssl;
9163
9164
511
    if (args && args->sigData) {
9165
501
        XFREE(args->sigData, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
9166
501
        args->sigData = NULL;
9167
501
    }
9168
#ifdef WOLFSSL_DUAL_ALG_CERTS
9169
    if (args && args->altSigData != NULL) {
9170
        XFREE(args->altSigData, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
9171
        args->altSigData = NULL;
9172
    }
9173
#endif
9174
511
}
9175
9176
/* handle generation TLS v1.3 certificate_verify (15) */
9177
/* Send the TLS v1.3 CertificateVerify message.
9178
 * A hash of all the message so far is used.
9179
 * The signed data is:
9180
 *     0x20 * 64 | context string | 0x00 | hash of messages
9181
 * This message is always encrypted in TLS v1.3.
9182
 *
9183
 * ssl  The SSL/TLS object.
9184
 * returns 0 on success, otherwise failure.
9185
 */
9186
static int SendTls13CertificateVerify(WOLFSSL* ssl)
9187
{
9188
    int ret = 0;
9189
#ifndef NO_RSA
9190
    /* Use this as a temporary buffer for RSA signature verification. */
9191
    buffer* rsaSigBuf = &ssl->buffers.sig;
9192
#endif
9193
#ifdef WOLFSSL_ASYNC_CRYPT
9194
    Scv13Args* args = NULL;
9195
    WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
9196
#else
9197
    Scv13Args  args[1];
9198
#endif
9199
9200
#ifdef WOLFSSL_DTLS13
9201
    int recordLayerHdrExtra;
9202
#endif /* WOLFSSL_DTLS13 */
9203
9204
    WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_SEND);
9205
    WOLFSSL_ENTER("SendTls13CertificateVerify");
9206
9207
#ifdef WOLFSSL_BLIND_PRIVATE_KEY
9208
    wolfssl_priv_der_blind_toggle(ssl->buffers.key, ssl->buffers.keyMask);
9209
#endif
9210
9211
    ssl->options.buildingMsg = 1;
9212
9213
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
9214
    ret = tsip_Tls13SendCertVerify(ssl);
9215
    if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
9216
        goto exit_scv;
9217
    }
9218
    ret = 0;
9219
#endif /* WOLFSSL_RENESAS_TSIP_TLS */
9220
9221
#ifdef WOLFSSL_DTLS13
9222
    /* can be negative */
9223
    if (ssl->options.dtls)
9224
        recordLayerHdrExtra = Dtls13GetRlHeaderLength(ssl, 1) - RECORD_HEADER_SZ;
9225
    else
9226
        recordLayerHdrExtra = 0;
9227
9228
#endif /* WOLFSSL_DTLS13 */
9229
9230
#ifdef WOLFSSL_ASYNC_CRYPT
9231
    if (ssl->async == NULL) {
9232
        ssl->async = (struct WOLFSSL_ASYNC*)
9233
                XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
9234
                        DYNAMIC_TYPE_ASYNC);
9235
        if (ssl->async == NULL)
9236
            ERROR_OUT(MEMORY_E, exit_scv);
9237
    }
9238
    args = (Scv13Args*)ssl->async->args;
9239
9240
    ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
9241
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
9242
        /* Check for error */
9243
        if (ret < 0)
9244
            goto exit_scv;
9245
    }
9246
    else
9247
#endif
9248
    {
9249
        /* Reset state */
9250
        ret = 0;
9251
        ssl->options.asyncState = TLS_ASYNC_BEGIN;
9252
        XMEMSET(args, 0, sizeof(Scv13Args));
9253
    #ifdef WOLFSSL_ASYNC_CRYPT
9254
        ssl->async->freeArgs = FreeScv13Args;
9255
    #endif
9256
    }
9257
9258
    switch(ssl->options.asyncState)
9259
    {
9260
        case TLS_ASYNC_BEGIN:
9261
        {
9262
            if (ssl->options.sendVerify == SEND_BLANK_CERT) {
9263
            #ifdef WOLFSSL_BLIND_PRIVATE_KEY
9264
                wolfssl_priv_der_blind_toggle(ssl->buffers.key,
9265
                    ssl->buffers.keyMask);
9266
            #endif
9267
                return 0;  /* sent blank cert, can't verify */
9268
            }
9269
9270
            args->sendSz = WC_MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA;
9271
            /* Always encrypted.  */
9272
            args->sendSz += MAX_MSG_EXTRA;
9273
9274
            /* check for available size */
9275
            if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
9276
                goto exit_scv;
9277
            }
9278
9279
            /* get output buffer */
9280
            args->output = GetOutputBuffer(ssl);
9281
9282
            /* Advance state and proceed */
9283
            ssl->options.asyncState = TLS_ASYNC_BUILD;
9284
        } /* case TLS_ASYNC_BEGIN */
9285
        FALL_THROUGH;
9286
9287
        case TLS_ASYNC_BUILD:
9288
        {
9289
            int rem = (int)(ssl->buffers.outputBuffer.bufferSize
9290
              - ssl->buffers.outputBuffer.length
9291
              - RECORD_HEADER_SZ - HANDSHAKE_HEADER_SZ);
9292
9293
            /* idx is used to track verify pointer offset to output */
9294
            args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
9295
            args->verify =
9296
                          &args->output[RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ];
9297
9298
#ifdef WOLFSSL_DTLS13
9299
            if (ssl->options.dtls) {
9300
                rem -= recordLayerHdrExtra + DTLS_HANDSHAKE_EXTRA;
9301
                args->idx += recordLayerHdrExtra + DTLS_HANDSHAKE_EXTRA;
9302
                args->verify += recordLayerHdrExtra + DTLS_HANDSHAKE_EXTRA;
9303
            }
9304
#endif /* WOLFSSL_DTLS13 */
9305
9306
            if (ssl->buffers.key == NULL) {
9307
            #ifdef HAVE_PK_CALLBACKS
9308
                if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
9309
                    args->sigLen = (word16)GetPrivateKeySigSize(ssl);
9310
                else
9311
            #endif
9312
                    ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
9313
            }
9314
            else {
9315
#ifdef WOLFSSL_DUAL_ALG_CERTS
9316
                if (ssl->sigSpec != NULL &&
9317
                    *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_ALTERNATIVE) {
9318
                    /* In the case of alternative, we swap in the alt. */
9319
                    if (ssl->buffers.altKey == NULL) {
9320
                        ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
9321
                    }
9322
                    ssl->buffers.keyType = ssl->buffers.altKeyType;
9323
                    ssl->buffers.keySz = ssl->buffers.altKeySz;
9324
                    /* If we own it, free key before overriding it. */
9325
                    if (ssl->buffers.weOwnKey) {
9326
                        FreeDer(&ssl->buffers.key);
9327
                    #ifdef WOLFSSL_BLIND_PRIVATE_KEY
9328
                        FreeDer(&ssl->buffers.keyMask);
9329
                    #endif
9330
                    }
9331
9332
                    /* Swap keys */
9333
                    ssl->buffers.key     = ssl->buffers.altKey;
9334
                    ssl->buffers.weOwnKey = ssl->buffers.weOwnAltKey;
9335
9336
                #ifdef WOLFSSL_BLIND_PRIVATE_KEY
9337
                    ssl->buffers.keyMask = ssl->buffers.altKeyMask;
9338
                    /* Unblind the alternative key before decoding */
9339
                    wolfssl_priv_der_blind_toggle(ssl->buffers.key, ssl->buffers.keyMask);
9340
                #endif
9341
                }
9342
#endif /* WOLFSSL_DUAL_ALG_CERTS */
9343
                ret = DecodePrivateKey(ssl, &args->sigLen);
9344
                if (ret != 0)
9345
                    goto exit_scv;
9346
            }
9347
9348
            if (rem < 0 || (int)args->sigLen > rem) {
9349
                ERROR_OUT(BUFFER_E, exit_scv);
9350
            }
9351
9352
            if (args->sigLen == 0) {
9353
                ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
9354
            }
9355
9356
            /* Add signature algorithm. */
9357
            if (ssl->hsType == DYNAMIC_TYPE_RSA)
9358
                args->sigAlgo = rsa_pss_sa_algo;
9359
        #ifdef HAVE_ECC
9360
            else if (ssl->hsType == DYNAMIC_TYPE_ECC) {
9361
        #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
9362
                if (ssl->buffers.keyType == sm2_sa_algo) {
9363
                    args->sigAlgo = sm2_sa_algo;
9364
                }
9365
                else
9366
        #endif
9367
                {
9368
                    args->sigAlgo = ecc_dsa_sa_algo;
9369
                }
9370
            }
9371
        #endif
9372
        #ifdef HAVE_ED25519
9373
            else if (ssl->hsType == DYNAMIC_TYPE_ED25519)
9374
                args->sigAlgo = ed25519_sa_algo;
9375
        #endif
9376
        #ifdef HAVE_ED448
9377
            else if (ssl->hsType == DYNAMIC_TYPE_ED448)
9378
                args->sigAlgo = ed448_sa_algo;
9379
        #endif
9380
        #if defined(HAVE_FALCON)
9381
            else if (ssl->hsType == DYNAMIC_TYPE_FALCON) {
9382
                args->sigAlgo = ssl->buffers.keyType;
9383
            }
9384
        #endif /* HAVE_FALCON */
9385
        #if defined(HAVE_DILITHIUM)
9386
            else if (ssl->hsType == DYNAMIC_TYPE_DILITHIUM) {
9387
                args->sigAlgo = ssl->buffers.keyType;
9388
            }
9389
        #endif /* HAVE_DILITHIUM */
9390
            else {
9391
                ERROR_OUT(ALGO_ID_E, exit_scv);
9392
            }
9393
9394
        #ifdef WOLFSSL_DUAL_ALG_CERTS
9395
            if (ssl->peerSigSpec == NULL) {
9396
                /* The peer did not respond. We didn't send CKS or they don't
9397
                 * support it. Either way, we do not need to handle dual
9398
                 * key/sig case. */
9399
                ssl->sigSpec = NULL;
9400
                ssl->sigSpecSz = 0;
9401
            }
9402
9403
            if (ssl->sigSpec != NULL &&
9404
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
9405
                /* The native was already decoded. Now we need to do the
9406
                 * alternative. Note that no swap was done because this case is
9407
                 * both native and alternative, not just alternative. */
9408
                if (ssl->buffers.altKey == NULL) {
9409
                    ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
9410
                }
9411
9412
                /* After this call, args->altSigLen has the length we need for
9413
                 * the alternative signature. */
9414
                ret = DecodeAltPrivateKey(ssl, &args->altSigLen);
9415
                if (ret != 0)
9416
                    goto exit_scv;
9417
9418
                if (ssl->buffers.altKeyType == ecc_dsa_sa_algo ||
9419
                    ssl->buffers.altKeyType == falcon_level1_sa_algo ||
9420
                    ssl->buffers.altKeyType == falcon_level5_sa_algo ||
9421
                    ssl->buffers.altKeyType == dilithium_level2_sa_algo ||
9422
                    ssl->buffers.altKeyType == dilithium_level3_sa_algo ||
9423
                    ssl->buffers.altKeyType == dilithium_level5_sa_algo) {
9424
                    args->altSigAlgo = ssl->buffers.altKeyType;
9425
                }
9426
                else if (ssl->buffers.altKeyType == rsa_sa_algo &&
9427
                         ssl->hsAltType == DYNAMIC_TYPE_RSA) {
9428
                    args->altSigAlgo = rsa_pss_sa_algo;
9429
                }
9430
                else {
9431
                    ERROR_OUT(ALGO_ID_E, exit_scv);
9432
                }
9433
9434
                EncodeDualSigAlg(args->sigAlgo, args->altSigAlgo, args->verify);
9435
                if (args->verify[0] == 0) {
9436
                    ERROR_OUT(ALGO_ID_E, exit_scv);
9437
                }
9438
            }
9439
            else
9440
        #endif /* WOLFSSL_DUAL_ALG_CERTS */
9441
                EncodeSigAlg(ssl, ssl->options.hashAlgo, args->sigAlgo,
9442
                             args->verify);
9443
9444
            if (args->sigData == NULL) {
9445
                word32 sigLen = MAX_SIG_DATA_SZ;
9446
                if ((ssl->hsType == DYNAMIC_TYPE_RSA) &&
9447
                    (args->sigLen > MAX_SIG_DATA_SZ)) {
9448
                    /* We store the RSA signature in the sigData buffer
9449
                     * temporarily, hence its size must be fitting. */
9450
                    sigLen = args->sigLen;
9451
                }
9452
                args->sigData = (byte*)XMALLOC(sigLen, ssl->heap,
9453
                                                    DYNAMIC_TYPE_SIGNATURE);
9454
                if (args->sigData == NULL) {
9455
                    ERROR_OUT(MEMORY_E, exit_scv);
9456
                }
9457
            }
9458
9459
        #ifdef WOLFSSL_DUAL_ALG_CERTS
9460
            if ((ssl->sigSpec != NULL) &&
9461
                (*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) &&
9462
                (args->altSigData == NULL)) {
9463
                word32 sigLen = MAX_SIG_DATA_SZ;
9464
                if (ssl->hsAltType == DYNAMIC_TYPE_RSA &&
9465
                    args->altSigLen > MAX_SIG_DATA_SZ) {
9466
                    /* We store the RSA signature in the sigData buffer
9467
                     * temporarily, hence its size must be fitting. */
9468
                    sigLen = args->altSigLen;
9469
                }
9470
                args->altSigData = (byte*)XMALLOC(sigLen, ssl->heap,
9471
                                                    DYNAMIC_TYPE_SIGNATURE);
9472
                if (args->altSigData == NULL) {
9473
                    ERROR_OUT(MEMORY_E, exit_scv);
9474
                }
9475
            }
9476
        #endif /* WOLFSSL_DUAL_ALG_CERTS */
9477
9478
            /* Create the data to be signed. */
9479
            ret = CreateSigData(ssl, args->sigData, &args->sigDataSz, 0);
9480
            if (ret != 0)
9481
                goto exit_scv;
9482
9483
        #ifdef WOLFSSL_DUAL_ALG_CERTS
9484
            if ((ssl->sigSpec != NULL) &&
9485
                (*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH)) {
9486
                XMEMCPY(args->altSigData, args->sigData, args->sigDataSz);
9487
                args->altSigDataSz = args->sigDataSz;
9488
            }
9489
        #endif /* WOLFSSL_DUAL_ALG_CERTS */
9490
9491
        #ifndef NO_RSA
9492
            if (ssl->hsType == DYNAMIC_TYPE_RSA) {
9493
                /* build encoded signature buffer */
9494
                rsaSigBuf->length = WC_MAX_DIGEST_SIZE;
9495
                rsaSigBuf->buffer = (byte*)XMALLOC(rsaSigBuf->length, ssl->heap,
9496
                                                   DYNAMIC_TYPE_SIGNATURE);
9497
                if (rsaSigBuf->buffer == NULL) {
9498
                    ERROR_OUT(MEMORY_E, exit_scv);
9499
                }
9500
9501
                ret = CreateRSAEncodedSig(rsaSigBuf->buffer, args->sigData,
9502
                    args->sigDataSz, args->sigAlgo, ssl->options.hashAlgo);
9503
                if (ret < 0)
9504
                    goto exit_scv;
9505
                rsaSigBuf->length = (unsigned int)ret;
9506
                ret = 0;
9507
            }
9508
        #endif /* !NO_RSA */
9509
        #ifdef HAVE_ECC
9510
            if (ssl->hsType == DYNAMIC_TYPE_ECC) {
9511
                args->sigLen = (word32)args->sendSz - args->idx -
9512
                               HASH_SIG_SIZE -
9513
                               VERIFY_HEADER;
9514
            #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
9515
                if (ssl->buffers.keyType != sm2_sa_algo)
9516
            #endif
9517
                {
9518
                    ret = CreateECCEncodedSig(args->sigData,
9519
                        args->sigDataSz, ssl->options.hashAlgo);
9520
                    if (ret < 0)
9521
                        goto exit_scv;
9522
                    args->sigDataSz = (word16)ret;
9523
                    ret = 0;
9524
                }
9525
            }
9526
        #endif /* HAVE_ECC */
9527
        #ifdef HAVE_ED25519
9528
            if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
9529
                ret = Ed25519CheckPubKey(ssl);
9530
                if (ret < 0) {
9531
                    ERROR_OUT(ret, exit_scv);
9532
                }
9533
                args->sigLen = ED25519_SIG_SIZE;
9534
            }
9535
        #endif /* HAVE_ED25519 */
9536
        #ifdef HAVE_ED448
9537
            if (ssl->hsType == DYNAMIC_TYPE_ED448) {
9538
                ret = Ed448CheckPubKey(ssl);
9539
                if (ret < 0) {
9540
                    ERROR_OUT(ret, exit_scv);
9541
                }
9542
                args->sigLen = ED448_SIG_SIZE;
9543
            }
9544
9545
        #endif /* HAVE_ED448 */
9546
        #if defined(HAVE_FALCON)
9547
            if (ssl->hsType == DYNAMIC_TYPE_FALCON) {
9548
                args->sigLen = FALCON_MAX_SIG_SIZE;
9549
            }
9550
        #endif /* HAVE_FALCON */
9551
        #if defined(HAVE_DILITHIUM)
9552
            if (ssl->hsType == DYNAMIC_TYPE_DILITHIUM) {
9553
                args->sigLen = DILITHIUM_MAX_SIG_SIZE;
9554
            }
9555
        #endif /* HAVE_DILITHIUM */
9556
9557
        #ifdef WOLFSSL_DUAL_ALG_CERTS
9558
            if (ssl->sigSpec != NULL &&
9559
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
9560
9561
            #ifndef NO_RSA
9562
                if (ssl->hsAltType == DYNAMIC_TYPE_RSA) {
9563
                    /* build encoded signature buffer */
9564
                    rsaSigBuf->length = WC_MAX_DIGEST_SIZE;
9565
                    rsaSigBuf->buffer = (byte*)XMALLOC(rsaSigBuf->length,
9566
                                                       ssl->heap,
9567
                                                       DYNAMIC_TYPE_SIGNATURE);
9568
                    if (rsaSigBuf->buffer == NULL) {
9569
                        ERROR_OUT(MEMORY_E, exit_scv);
9570
                    }
9571
9572
                    ret = CreateRSAEncodedSig(rsaSigBuf->buffer,
9573
                                    args->altSigData, args->altSigDataSz,
9574
                                    args->altSigAlgo, ssl->options.hashAlgo);
9575
                    if (ret < 0)
9576
                        goto exit_scv;
9577
                    rsaSigBuf->length = ret;
9578
                    ret = 0;
9579
                }
9580
            #endif /* !NO_RSA */
9581
            #ifdef HAVE_ECC
9582
                if (ssl->hsAltType == DYNAMIC_TYPE_ECC) {
9583
                    ret = CreateECCEncodedSig(args->altSigData,
9584
                            args->altSigDataSz, ssl->options.hashAlgo);
9585
                    if (ret < 0)
9586
                        goto exit_scv;
9587
                    args->altSigDataSz = (word16)ret;
9588
                    ret = 0;
9589
                }
9590
            #endif /* HAVE_ECC */
9591
            }
9592
        #endif /* WOLFSSL_DUAL_ALG_CERTS */
9593
9594
            /* Advance state and proceed */
9595
            ssl->options.asyncState = TLS_ASYNC_DO;
9596
        } /* case TLS_ASYNC_BUILD */
9597
        FALL_THROUGH;
9598
9599
        case TLS_ASYNC_DO:
9600
        {
9601
            byte* sigOut = args->verify + HASH_SIG_SIZE + VERIFY_HEADER;
9602
        #ifdef WOLFSSL_DUAL_ALG_CERTS
9603
            if (ssl->sigSpec != NULL &&
9604
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
9605
                /* As we have two signatures in the message, we store
9606
                 * the length of each before the actual signature. This
9607
                 * is necessary, as we could have two algorithms with
9608
                 * variable length signatures. */
9609
                sigOut += OPAQUE16_LEN;
9610
            }
9611
        #endif
9612
        #ifdef HAVE_ECC
9613
            if (ssl->hsType == DYNAMIC_TYPE_ECC) {
9614
            #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
9615
                if (ssl->buffers.keyType == sm2_sa_algo) {
9616
                    ret = Sm2wSm3Sign(ssl, TLS13_SM2_SIG_ID,
9617
                        TLS13_SM2_SIG_ID_SZ, args->sigData, args->sigDataSz,
9618
                        sigOut, &args->sigLen, (ecc_key*)ssl->hsKey, NULL);
9619
                }
9620
                else
9621
            #endif
9622
                {
9623
                    ret = EccSign(ssl, args->sigData, args->sigDataSz,
9624
                        sigOut, &args->sigLen, (ecc_key*)ssl->hsKey,
9625
                #ifdef HAVE_PK_CALLBACKS
9626
                        ssl->buffers.key
9627
                #else
9628
                        NULL
9629
                #endif
9630
                    );
9631
                }
9632
                args->length = (word16)args->sigLen;
9633
            }
9634
        #endif /* HAVE_ECC */
9635
        #ifdef HAVE_ED25519
9636
            if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
9637
                ret = Ed25519Sign(ssl, args->sigData, args->sigDataSz,
9638
                    sigOut, &args->sigLen, (ed25519_key*)ssl->hsKey,
9639
            #ifdef HAVE_PK_CALLBACKS
9640
                    ssl->buffers.key
9641
            #else
9642
                    NULL
9643
            #endif
9644
                );
9645
                args->length = (word16)args->sigLen;
9646
            }
9647
        #endif
9648
        #ifdef HAVE_ED448
9649
            if (ssl->hsType == DYNAMIC_TYPE_ED448) {
9650
                ret = Ed448Sign(ssl, args->sigData, args->sigDataSz,
9651
                    sigOut, &args->sigLen, (ed448_key*)ssl->hsKey,
9652
            #ifdef HAVE_PK_CALLBACKS
9653
                    ssl->buffers.key
9654
            #else
9655
                    NULL
9656
            #endif
9657
                );
9658
                args->length = (word16)args->sigLen;
9659
            }
9660
        #endif
9661
        #if defined(HAVE_FALCON)
9662
            if (ssl->hsType == DYNAMIC_TYPE_FALCON) {
9663
                ret = wc_falcon_sign_msg(args->sigData, args->sigDataSz,
9664
                                         sigOut, &args->sigLen,
9665
                                         (falcon_key*)ssl->hsKey, ssl->rng);
9666
                args->length = (word16)args->sigLen;
9667
            }
9668
        #endif /* HAVE_FALCON */
9669
        #if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_SIGN)
9670
            if (ssl->hsType == DYNAMIC_TYPE_DILITHIUM) {
9671
                ret = wc_dilithium_sign_ctx_msg(NULL, 0, args->sigData,
9672
                                                args->sigDataSz, sigOut,
9673
                                                &args->sigLen,
9674
                                                (dilithium_key*)ssl->hsKey,
9675
                                                ssl->rng);
9676
                args->length = (word16)args->sigLen;
9677
            }
9678
        #endif /* HAVE_DILITHIUM */
9679
        #if !defined(NO_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY) && \
9680
            !defined(WOLFSSL_RSA_VERIFY_ONLY)
9681
            if (ssl->hsType == DYNAMIC_TYPE_RSA) {
9682
                args->toSign = rsaSigBuf->buffer;
9683
                args->toSignSz = (word32)rsaSigBuf->length;
9684
            #if defined(HAVE_PK_CALLBACKS) && \
9685
                defined(TLS13_RSA_PSS_SIGN_CB_NO_PREHASH)
9686
                /* Pass full data to sign (args->sigData), not hash of */
9687
                if (ssl->ctx->RsaPssSignCb) {
9688
                    args->toSign = args->sigData;
9689
                    args->toSignSz = args->sigDataSz;
9690
                }
9691
            #endif
9692
                ret = RsaSign(ssl, (const byte*)args->toSign, args->toSignSz,
9693
                              sigOut, &args->sigLen, args->sigAlgo,
9694
                              ssl->options.hashAlgo, (RsaKey*)ssl->hsKey,
9695
                              ssl->buffers.key);
9696
                if (ret == 0) {
9697
                    args->length = (word16)args->sigLen;
9698
                    XMEMCPY(args->sigData, sigOut, args->sigLen);
9699
                }
9700
            }
9701
        #endif /* !NO_RSA && !WOLFSSL_RSA_PUBLIC_ONLY && !WOLFSSL_RSA_VERIFY_ONLY */
9702
9703
            /* Check for error */
9704
            if (ret != 0) {
9705
                goto exit_scv;
9706
            }
9707
9708
        #ifdef WOLFSSL_DUAL_ALG_CERTS
9709
            if (ssl->sigSpec != NULL &&
9710
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
9711
                /* Add signature length for the first signature. */
9712
                c16toa((word16)args->sigLen, sigOut - OPAQUE16_LEN);
9713
                args->length += OPAQUE16_LEN;
9714
9715
                /* Advance our pointer to where we store the alt signature.
9716
                 * We also add additional space for the length field of the
9717
                 * second signature. */
9718
                sigOut += args->sigLen + OPAQUE16_LEN;
9719
9720
                /* Generate the alternative signature */
9721
            #ifdef HAVE_ECC
9722
                if (ssl->hsAltType == DYNAMIC_TYPE_ECC) {
9723
                    ret = EccSign(ssl, args->altSigData, args->altSigDataSz,
9724
                                  sigOut, &args->altSigLen,
9725
                                  (ecc_key*)ssl->hsAltKey,
9726
                    #ifdef HAVE_PK_CALLBACKS
9727
                                  ssl->buffers.altKey
9728
                    #else
9729
                                  NULL
9730
                    #endif
9731
                                  );
9732
                }
9733
            #endif /* HAVE_ECC */
9734
            #if !defined(NO_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY) && \
9735
                !defined(WOLFSSL_RSA_VERIFY_ONLY)
9736
                if (ssl->hsAltType == DYNAMIC_TYPE_RSA) {
9737
                    args->toSign = rsaSigBuf->buffer;
9738
                    args->toSignSz = (word32)rsaSigBuf->length;
9739
                #if defined(HAVE_PK_CALLBACKS) && \
9740
                    defined(TLS13_RSA_PSS_SIGN_CB_NO_PREHASH)
9741
                    /* Pass full data to sign (args->altSigData), not hash of */
9742
                    if (ssl->ctx->RsaPssSignCb) {
9743
                        args->toSign = args->altSigData;
9744
                        args->toSignSz = (word32)args->altSigDataSz;
9745
                    }
9746
                #endif
9747
                    ret = RsaSign(ssl, (const byte*)args->toSign,
9748
                                  args->toSignSz, sigOut, &args->altSigLen,
9749
                                  args->altSigAlgo, ssl->options.hashAlgo,
9750
                                  (RsaKey*)ssl->hsAltKey,
9751
                                  ssl->buffers.altKey);
9752
9753
                    if (ret == 0) {
9754
                        XMEMCPY(args->altSigData, sigOut, args->altSigLen);
9755
                    }
9756
                }
9757
            #endif /* !NO_RSA && !WOLFSSL_RSA_PUBLIC_ONLY && !WOLFSSL_RSA_VERIFY_ONLY */
9758
            #if defined(HAVE_FALCON)
9759
                if (ssl->hsAltType == DYNAMIC_TYPE_FALCON) {
9760
                    ret = wc_falcon_sign_msg(args->altSigData,
9761
                                             args->altSigDataSz, sigOut,
9762
                                             &args->altSigLen,
9763
                                             (falcon_key*)ssl->hsAltKey,
9764
                                             ssl->rng);
9765
                }
9766
            #endif /* HAVE_FALCON */
9767
            #if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_SIGN)
9768
                if (ssl->hsAltType == DYNAMIC_TYPE_DILITHIUM) {
9769
                    ret = wc_dilithium_sign_ctx_msg(NULL, 0, args->altSigData,
9770
                                args->altSigDataSz, sigOut, &args->altSigLen,
9771
                                (dilithium_key*)ssl->hsAltKey, ssl->rng);
9772
                }
9773
            #endif /* HAVE_DILITHIUM */
9774
9775
                /* Check for error */
9776
                if (ret != 0) {
9777
                    goto exit_scv;
9778
                }
9779
9780
                /* Add signature length for the alternative signature. */
9781
                c16toa((word16)args->altSigLen, sigOut - OPAQUE16_LEN);
9782
9783
                /* Add length of the alt sig to the total length */
9784
                args->length += args->altSigLen + OPAQUE16_LEN;
9785
            }
9786
        #endif /* WOLFSSL_DUAL_ALG_CERTS */
9787
9788
            /* Add signature length. */
9789
            c16toa(args->length, args->verify + HASH_SIG_SIZE);
9790
9791
            /* Advance state and proceed */
9792
            ssl->options.asyncState = TLS_ASYNC_VERIFY;
9793
        } /* case TLS_ASYNC_DO */
9794
        FALL_THROUGH;
9795
9796
        case TLS_ASYNC_VERIFY:
9797
        {
9798
        #ifndef NO_RSA
9799
            if (ssl->hsType == DYNAMIC_TYPE_RSA) {
9800
                /* check for signature faults */
9801
                ret = VerifyRsaSign(ssl, args->sigData, args->sigLen,
9802
                    rsaSigBuf->buffer, (word32)rsaSigBuf->length, args->sigAlgo,
9803
                    ssl->options.hashAlgo, (RsaKey*)ssl->hsKey,
9804
                    ssl->buffers.key);
9805
            }
9806
        #ifdef WOLFSSL_DUAL_ALG_CERTS
9807
            if (ssl->sigSpec != NULL &&
9808
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH &&
9809
                ssl->hsAltType == DYNAMIC_TYPE_RSA) {
9810
                /* check for signature faults */
9811
                ret = VerifyRsaSign(ssl, args->altSigData, args->altSigLen,
9812
                        rsaSigBuf->buffer, (word32)rsaSigBuf->length,
9813
                        args->altSigAlgo, ssl->options.hashAlgo,
9814
                        (RsaKey*)ssl->hsAltKey, ssl->buffers.altKey);
9815
            }
9816
        #endif /* WOLFSSL_DUAL_ALG_CERTS */
9817
        #endif /* !NO_RSA */
9818
        #if defined(HAVE_ECC) && defined(WOLFSSL_CHECK_SIG_FAULTS)
9819
            if (ssl->hsType == DYNAMIC_TYPE_ECC) {
9820
                byte* sigOut = args->verify + HASH_SIG_SIZE + VERIFY_HEADER;
9821
            #ifdef WOLFSSL_DUAL_ALG_CERTS
9822
                if (ssl->sigSpec != NULL &&
9823
                    *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
9824
                    /* Add our length offset. */
9825
                    sigOut += OPAQUE16_LEN;
9826
                }
9827
            #endif
9828
            #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
9829
                if (ssl->buffers.keyType == sm2_sa_algo) {
9830
                    ret = Sm2wSm3Verify(ssl, TLS13_SM2_SIG_ID,
9831
                        TLS13_SM2_SIG_ID_SZ,
9832
                        sigOut, args->sigLen, args->sigData, args->sigDataSz,
9833
                        (ecc_key*)ssl->hsKey, NULL);
9834
                }
9835
                else
9836
            #endif
9837
                {
9838
                #ifdef HAVE_PK_CALLBACKS
9839
                    buffer tmp;
9840
9841
                    tmp.length = ssl->buffers.key->length;
9842
                    tmp.buffer = ssl->buffers.key->buffer;
9843
                #endif
9844
                    ret = EccVerify(ssl, sigOut, args->sigLen,
9845
                            args->sigData, args->sigDataSz,
9846
                            (ecc_key*)ssl->hsKey,
9847
                #ifdef HAVE_PK_CALLBACKS
9848
                            &tmp
9849
                #else
9850
                            NULL
9851
                #endif
9852
                            );
9853
                }
9854
            }
9855
        #ifdef WOLFSSL_DUAL_ALG_CERTS
9856
            if (ssl->sigSpec != NULL &&
9857
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH &&
9858
                ssl->hsAltType == DYNAMIC_TYPE_ECC) {
9859
                /* check for signature faults */
9860
                byte* sigOut = args->verify + HASH_SIG_SIZE + VERIFY_HEADER +
9861
                                args->sigLen + OPAQUE16_LEN + OPAQUE16_LEN;
9862
                ret = EccVerify(ssl, sigOut, args->altSigLen,
9863
                        args->altSigData, args->altSigDataSz,
9864
                        (ecc_key*)ssl->hsAltKey,
9865
            #ifdef HAVE_PK_CALLBACKS
9866
                        ssl->buffers.altKey
9867
            #else
9868
                        NULL
9869
            #endif
9870
                        );
9871
            }
9872
        #endif /* WOLFSSL_DUAL_ALG_CERTS */
9873
        #endif /* HAVE_ECC && WOLFSSL_CHECK_SIG_FAULTS */
9874
9875
            /* Check for error */
9876
            if (ret != 0) {
9877
                goto exit_scv;
9878
            }
9879
9880
            /* Advance state and proceed */
9881
            ssl->options.asyncState = TLS_ASYNC_FINALIZE;
9882
        } /* case TLS_ASYNC_VERIFY */
9883
        FALL_THROUGH;
9884
9885
        case TLS_ASYNC_FINALIZE:
9886
        {
9887
            /* Put the record and handshake headers on. */
9888
            AddTls13Headers(args->output, args->length + HASH_SIG_SIZE +
9889
                            VERIFY_HEADER, certificate_verify, ssl);
9890
9891
            args->sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ +
9892
                                args->length + HASH_SIG_SIZE + VERIFY_HEADER;
9893
#ifdef WOLFSSL_DTLS13
9894
            if (ssl->options.dtls)
9895
                args->sendSz += recordLayerHdrExtra + DTLS_HANDSHAKE_EXTRA;
9896
9897
#endif /* WOLFSSL_DTLS13 */
9898
            /* Advance state and proceed */
9899
            ssl->options.asyncState = TLS_ASYNC_END;
9900
        } /* case TLS_ASYNC_FINALIZE */
9901
        FALL_THROUGH;
9902
9903
        case TLS_ASYNC_END:
9904
        {
9905
#ifdef WOLFSSL_DTLS13
9906
            if (ssl->options.dtls) {
9907
                ssl->options.buildingMsg = 0;
9908
                ret = Dtls13HandshakeSend(ssl, args->output,
9909
                    WC_MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA + MAX_MSG_EXTRA,
9910
                    (word16)args->sendSz, certificate_verify, 1);
9911
                if (ret != 0)
9912
                    goto exit_scv;
9913
9914
                break;
9915
            }
9916
#endif /* WOLFSSL_DTLS13 */
9917
9918
            /* This message is always encrypted. */
9919
            ret = BuildTls13Message(ssl, args->output,
9920
                                    WC_MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA,
9921
                                    args->output + RECORD_HEADER_SZ,
9922
                                    args->sendSz - RECORD_HEADER_SZ, handshake,
9923
                                    1, 0, 0);
9924
9925
            if (ret < 0) {
9926
                goto exit_scv;
9927
            }
9928
            else {
9929
                args->sendSz = ret;
9930
                ret = 0;
9931
            }
9932
9933
        #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
9934
            if (ssl->hsInfoOn)
9935
                AddPacketName(ssl, "CertificateVerify");
9936
            if (ssl->toInfoOn) {
9937
                ret = AddPacketInfo(ssl, "CertificateVerify", handshake,
9938
                            args->output, args->sendSz, WRITE_PROTO, 0,
9939
                            ssl->heap);
9940
                if (ret != 0)
9941
                    goto exit_scv;
9942
            }
9943
        #endif
9944
9945
            ssl->buffers.outputBuffer.length += (word32)args->sendSz;
9946
            ssl->options.buildingMsg = 0;
9947
            if (!ssl->options.groupMessages)
9948
                ret = SendBuffered(ssl);
9949
            break;
9950
        }
9951
        default:
9952
            ret = INPUT_CASE_ERROR;
9953
    } /* switch(ssl->options.asyncState) */
9954
9955
exit_scv:
9956
#ifdef WOLFSSL_BLIND_PRIVATE_KEY
9957
    if (ret == 0) {
9958
        ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.key,
9959
            &ssl->buffers.keyMask);
9960
    }
9961
    else {
9962
        wolfssl_priv_der_blind_toggle(ssl->buffers.key, ssl->buffers.keyMask);
9963
    }
9964
#endif
9965
9966
    WOLFSSL_LEAVE("SendTls13CertificateVerify", ret);
9967
    WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_SEND);
9968
9969
#ifdef WOLFSSL_ASYNC_CRYPT
9970
    /* Handle async operation */
9971
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
9972
        return ret;
9973
    }
9974
#endif /* WOLFSSL_ASYNC_CRYPT */
9975
9976
    /* Final cleanup */
9977
    FreeScv13Args(ssl, args);
9978
    FreeKeyExchange(ssl);
9979
#ifdef WOLFSSL_ASYNC_IO
9980
    /* Cleanup async */
9981
    FreeAsyncCtx(ssl, 0);
9982
#endif
9983
9984
    if (ret != 0) {
9985
        WOLFSSL_ERROR_VERBOSE(ret);
9986
    }
9987
9988
    return ret;
9989
}
9990
#endif
9991
#endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */
9992
9993
#if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
9994
/* handle processing TLS v1.3 certificate (11) */
9995
/* Parse and handle a TLS v1.3 Certificate message.
9996
 *
9997
 * ssl       The SSL/TLS object.
9998
 * input     The message buffer.
9999
 * inOutIdx  On entry, the index into the message buffer of Certificate.
10000
 *           On exit, the index of byte after the Certificate message.
10001
 * totalSz   The length of the current handshake message.
10002
 * returns 0 on success and otherwise failure.
10003
 */
10004
static int DoTls13Certificate(WOLFSSL* ssl, byte* input, word32* inOutIdx,
10005
                              word32 totalSz)
10006
0
{
10007
0
    int ret = 0;
10008
10009
0
    WOLFSSL_START(WC_FUNC_CERTIFICATE_DO);
10010
0
    WOLFSSL_ENTER("DoTls13Certificate");
10011
10012
#ifdef WOLFSSL_DTLS13
10013
    if (ssl->options.dtls && ssl->options.handShakeDone) {
10014
        /* certificate needs some special care after the handshake */
10015
        ret = Dtls13RtxProcessingCertificate(
10016
            ssl, input + *inOutIdx, totalSz);
10017
    }
10018
#endif /* WOLFSSL_DTLS13 */
10019
10020
0
    if (ret == 0)
10021
0
        ret = ProcessPeerCerts(ssl, input, inOutIdx, totalSz);
10022
0
    if (ret == 0) {
10023
0
#if !defined(NO_WOLFSSL_CLIENT)
10024
0
        if (ssl->options.side == WOLFSSL_CLIENT_END)
10025
0
            ssl->options.serverState = SERVER_CERT_COMPLETE;
10026
0
#endif
10027
#if !defined(NO_WOLFSSL_SERVER) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
10028
        if (ssl->options.side == WOLFSSL_SERVER_END &&
10029
                                ssl->options.handShakeState == HANDSHAKE_DONE) {
10030
            /* reset handshake states */
10031
            ssl->options.serverState = SERVER_FINISHED_COMPLETE;
10032
            ssl->options.acceptState  = TICKET_SENT;
10033
            ssl->options.handShakeState = SERVER_FINISHED_COMPLETE;
10034
        }
10035
#endif
10036
0
    }
10037
10038
0
    WOLFSSL_LEAVE("DoTls13Certificate", ret);
10039
0
    WOLFSSL_END(WC_FUNC_CERTIFICATE_DO);
10040
10041
0
    return ret;
10042
0
}
10043
#endif
10044
10045
#if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
10046
                                                             defined(HAVE_ED448)
10047
10048
typedef struct Dcv13Args {
10049
    byte*  output; /* not allocated */
10050
    word32 sendSz;
10051
    word16 sz;
10052
    word32 sigSz;
10053
    word32 idx;
10054
    word32 begin;
10055
10056
    byte*  sigData;
10057
    word16 sigDataSz;
10058
#ifdef WOLFSSL_DUAL_ALG_CERTS
10059
    byte   altSigAlgo;
10060
    byte*  altSigData;
10061
    word32 altSigDataSz;
10062
    word32 altSignatureSz;
10063
    byte   altPeerAuthGood;
10064
#endif
10065
} Dcv13Args;
10066
10067
static void FreeDcv13Args(WOLFSSL* ssl, void* pArgs)
10068
0
{
10069
0
    Dcv13Args* args = (Dcv13Args*)pArgs;
10070
10071
0
    if (args && args->sigData != NULL) {
10072
0
        XFREE(args->sigData, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
10073
0
        args->sigData = NULL;
10074
0
    }
10075
#ifdef WOLFSSL_DUAL_ALG_CERTS
10076
    if (args && args->altSigData != NULL) {
10077
        XFREE(args->altSigData, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
10078
        args->altSigData = NULL;
10079
    }
10080
#endif
10081
0
    (void)ssl;
10082
0
}
10083
10084
#ifdef WOLFSSL_DUAL_ALG_CERTS
10085
#ifndef NO_RSA
10086
/* ssl->peerCert->sapkiDer is the alternative public key. Hopefully it is a
10087
 * RSA public key. Convert it into a usable public key. */
10088
static int decodeRsaKey(WOLFSSL* ssl)
10089
{
10090
    int keyRet;
10091
    word32 tmpIdx = 0;
10092
10093
    if (ssl->peerRsaKeyPresent)
10094
        return INVALID_PARAMETER;
10095
10096
    keyRet = AllocKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
10097
    if (keyRet != 0)
10098
        return PEER_KEY_ERROR;
10099
10100
    ssl->peerRsaKeyPresent = 1;
10101
    keyRet = wc_RsaPublicKeyDecode(ssl->peerCert.sapkiDer, &tmpIdx,
10102
                                   ssl->peerRsaKey,
10103
                                   ssl->peerCert.sapkiLen);
10104
    if (keyRet != 0)
10105
        return PEER_KEY_ERROR;
10106
10107
    return 0;
10108
}
10109
#endif /* !NO_RSA */
10110
10111
#ifdef HAVE_ECC
10112
/* ssl->peerCert->sapkiDer is the alternative public key. Hopefully it is a
10113
 * ECC public key. Convert it into a usable public key. */
10114
static int decodeEccKey(WOLFSSL* ssl)
10115
{
10116
    int keyRet;
10117
    word32 tmpIdx = 0;
10118
10119
    if (ssl->peerEccDsaKeyPresent)
10120
        return INVALID_PARAMETER;
10121
10122
    keyRet = AllocKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
10123
    if (keyRet != 0)
10124
        return PEER_KEY_ERROR;
10125
10126
    ssl->peerEccDsaKeyPresent = 1;
10127
    keyRet = wc_EccPublicKeyDecode(ssl->peerCert.sapkiDer, &tmpIdx,
10128
                                   ssl->peerEccDsaKey,
10129
                                   ssl->peerCert.sapkiLen);
10130
    if (keyRet != 0)
10131
        return PEER_KEY_ERROR;
10132
10133
    return 0;
10134
}
10135
#endif /* HAVE_ECC */
10136
10137
#ifdef HAVE_DILITHIUM
10138
/* ssl->peerCert->sapkiDer is the alternative public key. Hopefully it is a
10139
 * dilithium public key. Convert it into a usable public key. */
10140
static int decodeDilithiumKey(WOLFSSL* ssl, int level)
10141
{
10142
    int keyRet;
10143
    word32 tmpIdx = 0;
10144
10145
    if (ssl->peerDilithiumKeyPresent)
10146
        return INVALID_PARAMETER;
10147
10148
    keyRet = AllocKey(ssl, DYNAMIC_TYPE_DILITHIUM,
10149
                      (void**)&ssl->peerDilithiumKey);
10150
    if (keyRet != 0)
10151
        return PEER_KEY_ERROR;
10152
10153
    ssl->peerDilithiumKeyPresent = 1;
10154
    keyRet = wc_dilithium_set_level(ssl->peerDilithiumKey, level);
10155
    if (keyRet != 0)
10156
        return PEER_KEY_ERROR;
10157
10158
    keyRet = wc_Dilithium_PublicKeyDecode(ssl->peerCert.sapkiDer, &tmpIdx,
10159
                                          ssl->peerDilithiumKey,
10160
                                          ssl->peerCert.sapkiLen);
10161
    if (keyRet != 0)
10162
        return PEER_KEY_ERROR;
10163
10164
    return 0;
10165
}
10166
#endif /* HAVE_DILITHIUM */
10167
10168
#ifdef HAVE_FALCON
10169
/* ssl->peerCert->sapkiDer is the alternative public key. Hopefully it is a
10170
 * falcon public key. Convert it into a usable public key. */
10171
static int decodeFalconKey(WOLFSSL* ssl, int level)
10172
{
10173
    int keyRet;
10174
    word32 tmpIdx = 0;
10175
10176
    if (ssl->peerFalconKeyPresent)
10177
        return INVALID_PARAMETER;
10178
10179
    keyRet = AllocKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey);
10180
    if (keyRet != 0)
10181
        return PEER_KEY_ERROR;
10182
10183
    ssl->peerFalconKeyPresent = 1;
10184
    keyRet = wc_falcon_set_level(ssl->peerFalconKey, level);
10185
    if (keyRet != 0)
10186
        return PEER_KEY_ERROR;
10187
10188
    keyRet = wc_Falcon_PublicKeyDecode(ssl->peerCert.sapkiDer, &tmpIdx,
10189
                                       ssl->peerFalconKey,
10190
                                       ssl->peerCert.sapkiLen);
10191
    if (keyRet != 0)
10192
        return PEER_KEY_ERROR;
10193
10194
    return 0;
10195
}
10196
#endif /* HAVE_FALCON */
10197
#endif /* WOLFSSL_DUAL_ALG_CERTS */
10198
10199
/* handle processing TLS v1.3 certificate_verify (15) */
10200
/* Parse and handle a TLS v1.3 CertificateVerify message.
10201
 *
10202
 * ssl       The SSL/TLS object.
10203
 * input     The message buffer.
10204
 * inOutIdx  On entry, the index into the message buffer of
10205
 *           CertificateVerify.
10206
 *           On exit, the index of byte after the CertificateVerify message.
10207
 * totalSz   The length of the current handshake message.
10208
 * returns 0 on success and otherwise failure.
10209
 */
10210
static int DoTls13CertificateVerify(WOLFSSL* ssl, byte* input,
10211
                                    word32* inOutIdx, word32 totalSz)
10212
0
{
10213
0
    int         ret = 0;
10214
0
    byte*       sig = NULL;
10215
0
#ifndef NO_RSA
10216
    /* Use this as a temporary buffer for RSA signature verification. */
10217
0
    buffer*     rsaSigBuf = &ssl->buffers.sig;
10218
0
#endif
10219
#ifdef WOLFSSL_ASYNC_CRYPT
10220
    Dcv13Args* args = NULL;
10221
    WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
10222
#else
10223
0
    Dcv13Args  args[1];
10224
0
#endif
10225
10226
0
    WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_DO);
10227
0
    WOLFSSL_ENTER("DoTls13CertificateVerify");
10228
10229
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
10230
    ret = tsip_Tls13CertificateVerify(ssl, input, inOutIdx, totalSz);
10231
    if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
10232
        goto exit_dcv;
10233
    }
10234
    ret = 0;
10235
#endif
10236
10237
#ifdef WOLFSSL_ASYNC_CRYPT
10238
    if (ssl->async == NULL) {
10239
        ssl->async = (struct WOLFSSL_ASYNC*)
10240
                XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
10241
                        DYNAMIC_TYPE_ASYNC);
10242
        if (ssl->async == NULL)
10243
            ERROR_OUT(MEMORY_E, exit_dcv);
10244
    }
10245
    args = (Dcv13Args*)ssl->async->args;
10246
10247
    ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
10248
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
10249
        /* Check for error */
10250
        if (ret < 0)
10251
            goto exit_dcv;
10252
    }
10253
    else
10254
#endif
10255
0
    {
10256
        /* Reset state */
10257
0
        ret = 0;
10258
0
        ssl->options.asyncState = TLS_ASYNC_BEGIN;
10259
0
        XMEMSET(args, 0, sizeof(Dcv13Args));
10260
0
        ssl->options.peerHashAlgo = sha_mac;
10261
0
        ssl->options.peerSigAlgo = anonymous_sa_algo;
10262
0
        args->idx = *inOutIdx;
10263
0
        args->begin = *inOutIdx;
10264
    #ifdef WOLFSSL_ASYNC_CRYPT
10265
        ssl->async->freeArgs = FreeDcv13Args;
10266
    #endif
10267
0
    }
10268
10269
0
    switch(ssl->options.asyncState)
10270
0
    {
10271
0
        case TLS_ASYNC_BEGIN:
10272
0
        {
10273
        #ifdef WOLFSSL_CALLBACKS
10274
            if (ssl->hsInfoOn) AddPacketName(ssl, "CertificateVerify");
10275
            if (ssl->toInfoOn) AddLateName("CertificateVerify",
10276
                                           &ssl->timeoutInfo);
10277
        #endif
10278
10279
            /* Advance state and proceed */
10280
0
            ssl->options.asyncState = TLS_ASYNC_BUILD;
10281
0
        } /* case TLS_ASYNC_BEGIN */
10282
0
        FALL_THROUGH;
10283
10284
0
        case TLS_ASYNC_BUILD:
10285
0
        {
10286
0
            int validSigAlgo;
10287
0
            const Suites* suites = WOLFSSL_SUITES(ssl);
10288
0
            word16 i;
10289
10290
            /* Signature algorithm. */
10291
0
            if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN > totalSz) {
10292
0
                ERROR_OUT(BUFFER_ERROR, exit_dcv);
10293
0
            }
10294
10295
#ifdef WOLFSSL_DUAL_ALG_CERTS
10296
            if (ssl->peerSigSpec == NULL) {
10297
                /* The peer did not respond. We didn't send CKS or they don't
10298
                 * support it. Either way, we do not need to handle dual
10299
                 * key/sig case. */
10300
                ssl->sigSpec = NULL;
10301
                ssl->sigSpecSz = 0;
10302
            }
10303
10304
            /* If no CKS extension or either native or alternative, then just
10305
             * get a normal sigalgo.  But if BOTH, then get the native and alt
10306
             * sig algos. */
10307
            if (ssl->sigSpec == NULL ||
10308
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_NATIVE ||
10309
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_ALTERNATIVE) {
10310
#endif /* WOLFSSL_DUAL_ALG_CERTS */
10311
0
                validSigAlgo = 0;
10312
0
                for (i = 0; i < suites->hashSigAlgoSz; i += 2) {
10313
0
                     if ((suites->hashSigAlgo[i + 0] == input[args->idx + 0]) &&
10314
0
                             (suites->hashSigAlgo[i + 1] == input[args->idx + 1])) {
10315
0
                         validSigAlgo = 1;
10316
0
                         break;
10317
0
                     }
10318
0
                }
10319
0
                if (!validSigAlgo) {
10320
0
                    ERROR_OUT(INVALID_PARAMETER, exit_dcv);
10321
0
                }
10322
10323
0
                ret = DecodeTls13SigAlg(input + args->idx,
10324
0
                        &ssl->options.peerHashAlgo, &ssl->options.peerSigAlgo);
10325
#ifdef WOLFSSL_DUAL_ALG_CERTS
10326
            }
10327
            else {
10328
                ret = DecodeTls13HybridSigAlg(input + args->idx,
10329
                                              &ssl->options.peerHashAlgo,
10330
                                              &ssl->options.peerSigAlgo,
10331
                                              &args->altSigAlgo);
10332
            }
10333
#endif /* WOLFSSL_DUAL_ALG_CERTS */
10334
10335
0
            if (ret < 0)
10336
0
                goto exit_dcv;
10337
0
            args->idx += OPAQUE16_LEN;
10338
10339
            /* Signature length. */
10340
0
            if ((args->idx - args->begin) + OPAQUE16_LEN > totalSz) {
10341
0
                ERROR_OUT(BUFFER_ERROR, exit_dcv);
10342
0
            }
10343
0
            ato16(input + args->idx, &args->sz);
10344
0
            args->idx += OPAQUE16_LEN;
10345
10346
            /* Signature data. */
10347
0
            if ((args->idx - args->begin) + args->sz > totalSz) {
10348
0
                ERROR_OUT(BUFFER_ERROR, exit_dcv);
10349
0
            }
10350
10351
#ifdef WOLFSSL_DUAL_ALG_CERTS
10352
            if ((ssl->sigSpec != NULL) &&
10353
                (*ssl->sigSpec != WOLFSSL_CKS_SIGSPEC_NATIVE)) {
10354
10355
                word16 sa;
10356
                if (args->altSigAlgo == 0)
10357
                    sa = ssl->options.peerSigAlgo;
10358
                else
10359
                    sa = args->altSigAlgo;
10360
10361
                switch(sa) {
10362
            #ifndef NO_RSA
10363
                case rsa_pss_sa_algo:
10364
                    ret = decodeRsaKey(ssl);
10365
                    break;
10366
            #endif
10367
            #ifdef HAVE_ECC
10368
                case ecc_dsa_sa_algo:
10369
                    ret = decodeEccKey(ssl);
10370
                    break;
10371
            #endif
10372
            #ifdef HAVE_DILITHIUM
10373
                case dilithium_level2_sa_algo:
10374
                    ret = decodeDilithiumKey(ssl, WC_ML_DSA_44);
10375
                    break;
10376
                case dilithium_level3_sa_algo:
10377
                    ret = decodeDilithiumKey(ssl, WC_ML_DSA_65);
10378
                    break;
10379
                case dilithium_level5_sa_algo:
10380
                    ret = decodeDilithiumKey(ssl, WC_ML_DSA_87);
10381
                    break;
10382
            #endif
10383
            #ifdef HAVE_FALCON
10384
                case falcon_level1_sa_algo:
10385
                    ret = decodeFalconKey(ssl, 1);
10386
                    break;
10387
                case falcon_level5_sa_algo:
10388
                    ret = decodeFalconKey(ssl, 5);
10389
                    break;
10390
            #endif
10391
                default:
10392
                    ERROR_OUT(PEER_KEY_ERROR, exit_dcv);
10393
                }
10394
10395
                if (ret != 0)
10396
                    ERROR_OUT(ret, exit_dcv);
10397
10398
                if (*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_ALTERNATIVE) {
10399
                    /* Now swap in the alternative by removing the native.
10400
                     * sa contains the alternative signature type. */
10401
                #ifndef NO_RSA
10402
                    if (ssl->peerRsaKeyPresent && sa != rsa_pss_sa_algo) {
10403
                        FreeKey(ssl, DYNAMIC_TYPE_RSA,
10404
                                (void**)&ssl->peerRsaKey);
10405
                        ssl->peerRsaKeyPresent = 0;
10406
                    }
10407
                #endif
10408
                #ifdef HAVE_ECC
10409
                    else if (ssl->peerEccDsaKeyPresent &&
10410
                             sa != ecc_dsa_sa_algo) {
10411
                        FreeKey(ssl, DYNAMIC_TYPE_ECC,
10412
                                (void**)&ssl->peerEccDsaKey);
10413
                        ssl->peerEccDsaKeyPresent = 0;
10414
                    }
10415
                #endif
10416
                #ifdef HAVE_DILITHIUM
10417
                    else if (ssl->peerDilithiumKeyPresent &&
10418
                             sa != dilithium_level2_sa_algo &&
10419
                             sa != dilithium_level3_sa_algo &&
10420
                             sa != dilithium_level5_sa_algo) {
10421
                        FreeKey(ssl, DYNAMIC_TYPE_DILITHIUM,
10422
                                (void**)&ssl->peerDilithiumKey);
10423
                        ssl->peerDilithiumKeyPresent = 0;
10424
                    }
10425
                #endif
10426
                #ifdef HAVE_FALCON
10427
                    else if (ssl->peerFalconKeyPresent &&
10428
                             sa != falcon_level1_sa_algo &&
10429
                             sa != falcon_level5_sa_algo) {
10430
                        FreeKey(ssl, DYNAMIC_TYPE_FALCON,
10431
                                (void**)&ssl->peerFalconKey);
10432
                        ssl->peerFalconKeyPresent = 0;
10433
                    }
10434
                #endif
10435
                    else {
10436
                        ERROR_OUT(PEER_KEY_ERROR, exit_dcv);
10437
                    }
10438
                }
10439
            }
10440
#endif /* WOLFSSL_DUAL_ALG_CERTS */
10441
10442
            /* Check for public key of required type. */
10443
            /* Assume invalid unless signature algo matches the key provided */
10444
0
            validSigAlgo = 0;
10445
0
        #ifdef HAVE_ED25519
10446
0
            if (ssl->options.peerSigAlgo == ed25519_sa_algo) {
10447
0
                WOLFSSL_MSG("Peer sent ED25519 sig");
10448
0
                validSigAlgo = (ssl->peerEd25519Key != NULL) &&
10449
0
                                                     ssl->peerEd25519KeyPresent;
10450
0
            }
10451
0
        #endif
10452
0
        #ifdef HAVE_ED448
10453
0
            if (ssl->options.peerSigAlgo == ed448_sa_algo) {
10454
0
                WOLFSSL_MSG("Peer sent ED448 sig");
10455
0
                validSigAlgo = (ssl->peerEd448Key != NULL) &&
10456
0
                                                       ssl->peerEd448KeyPresent;
10457
0
            }
10458
0
        #endif
10459
0
        #ifdef HAVE_ECC
10460
0
            if (ssl->options.peerSigAlgo == ecc_dsa_sa_algo) {
10461
0
                WOLFSSL_MSG("Peer sent ECC sig");
10462
0
                validSigAlgo = (ssl->peerEccDsaKey != NULL) &&
10463
0
                                                      ssl->peerEccDsaKeyPresent;
10464
0
            }
10465
0
        #endif
10466
0
        #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
10467
0
            if (ssl->options.peerSigAlgo == sm2_sa_algo) {
10468
0
                WOLFSSL_MSG("Peer sent SM2 sig");
10469
0
                validSigAlgo = (ssl->peerEccDsaKey != NULL) &&
10470
0
                                                      ssl->peerEccDsaKeyPresent;
10471
0
            }
10472
0
        #endif
10473
        #ifdef HAVE_FALCON
10474
            if (ssl->options.peerSigAlgo == falcon_level1_sa_algo) {
10475
                WOLFSSL_MSG("Peer sent Falcon Level 1 sig");
10476
                validSigAlgo = (ssl->peerFalconKey != NULL) &&
10477
                               ssl->peerFalconKeyPresent;
10478
            }
10479
            if (ssl->options.peerSigAlgo == falcon_level5_sa_algo) {
10480
                WOLFSSL_MSG("Peer sent Falcon Level 5 sig");
10481
                validSigAlgo = (ssl->peerFalconKey != NULL) &&
10482
                               ssl->peerFalconKeyPresent;
10483
            }
10484
        #endif
10485
        #ifdef HAVE_DILITHIUM
10486
            if (ssl->options.peerSigAlgo == dilithium_level2_sa_algo) {
10487
                WOLFSSL_MSG("Peer sent Dilithium Level 2 sig");
10488
                validSigAlgo = (ssl->peerDilithiumKey != NULL) &&
10489
                               ssl->peerDilithiumKeyPresent;
10490
            }
10491
            if (ssl->options.peerSigAlgo == dilithium_level3_sa_algo) {
10492
                WOLFSSL_MSG("Peer sent Dilithium Level 3 sig");
10493
                validSigAlgo = (ssl->peerDilithiumKey != NULL) &&
10494
                               ssl->peerDilithiumKeyPresent;
10495
            }
10496
            if (ssl->options.peerSigAlgo == dilithium_level5_sa_algo) {
10497
                WOLFSSL_MSG("Peer sent Dilithium Level 5 sig");
10498
                validSigAlgo = (ssl->peerDilithiumKey != NULL) &&
10499
                               ssl->peerDilithiumKeyPresent;
10500
            }
10501
        #endif
10502
0
        #ifndef NO_RSA
10503
0
            if (ssl->options.peerSigAlgo == rsa_sa_algo) {
10504
0
                WOLFSSL_MSG("Peer sent PKCS#1.5 algo - not valid TLS 1.3");
10505
0
                ERROR_OUT(INVALID_PARAMETER, exit_dcv);
10506
0
            }
10507
0
            if (ssl->options.peerSigAlgo == rsa_pss_sa_algo) {
10508
0
                WOLFSSL_MSG("Peer sent RSA sig");
10509
0
                validSigAlgo = (ssl->peerRsaKey != NULL) &&
10510
0
                                                         ssl->peerRsaKeyPresent;
10511
0
            }
10512
0
        #endif
10513
0
            if (!validSigAlgo) {
10514
0
                WOLFSSL_MSG("Sig algo doesn't correspond to certificate");
10515
0
                ERROR_OUT(SIG_VERIFY_E, exit_dcv);
10516
0
            }
10517
10518
0
            args->sigSz = args->sz;
10519
#ifdef WOLFSSL_DUAL_ALG_CERTS
10520
            if (ssl->sigSpec != NULL &&
10521
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
10522
                /* In case we received two signatures, both of them are encoded
10523
                 * with their size as 16-bit integeter prior in memory. Hence,
10524
                 * we can decode both lengths here now. */
10525
                word32 tmpIdx = args->idx;
10526
                word16 tmpSz = 0;
10527
                ato16(input + tmpIdx, &tmpSz);
10528
                args->sigSz = tmpSz;
10529
10530
                tmpIdx += OPAQUE16_LEN + args->sigSz;
10531
                ato16(input + tmpIdx, &tmpSz);
10532
                args->altSignatureSz = tmpSz;
10533
10534
                if (args->sz != (args->sigSz + args->altSignatureSz +
10535
                                    OPAQUE16_LEN + OPAQUE16_LEN)) {
10536
                    ERROR_OUT(BUFFER_ERROR, exit_dcv);
10537
                }
10538
            }
10539
#endif /* WOLFSSL_DUAL_ALG_CERTS */
10540
10541
0
        #if !defined(NO_RSA) && defined(WC_RSA_PSS)
10542
            /* In case we have to verify an RSA signature, we have to store the
10543
             * signature in the 'rsaSigBuf' structure for further processing.
10544
             */
10545
0
            if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
10546
0
                word32 sigSz = args->sigSz;
10547
0
                sig = input + args->idx;
10548
            #ifdef WOLFSSL_DUAL_ALG_CERTS
10549
                /* Check if our alternative signature was RSA */
10550
                if (ssl->sigSpec != NULL &&
10551
                    *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
10552
                    if (ssl->options.peerSigAlgo != rsa_pss_sa_algo) {
10553
                        /* We have to skip the first signature (length field
10554
                         * and signature itself) and the length field of the
10555
                         * alternative signature. */
10556
                        sig += OPAQUE16_LEN + OPAQUE16_LEN + args->sigSz;
10557
                        sigSz = args->altSignatureSz;
10558
                    }
10559
                    else {
10560
                        /* We have to skip the length field */
10561
                        sig += OPAQUE16_LEN;
10562
                    }
10563
                }
10564
            #endif
10565
0
                rsaSigBuf->buffer = (byte*)XMALLOC(sigSz, ssl->heap,
10566
0
                                         DYNAMIC_TYPE_SIGNATURE);
10567
0
                if (rsaSigBuf->buffer == NULL) {
10568
0
                    ERROR_OUT(MEMORY_E, exit_dcv);
10569
0
                }
10570
0
                rsaSigBuf->length = sigSz;
10571
0
                XMEMCPY(rsaSigBuf->buffer, sig, rsaSigBuf->length);
10572
0
            }
10573
0
        #endif /* !NO_RSA && WC_RSA_PSS */
10574
10575
0
            args->sigData = (byte*)XMALLOC(MAX_SIG_DATA_SZ, ssl->heap,
10576
0
                                                    DYNAMIC_TYPE_SIGNATURE);
10577
0
            if (args->sigData == NULL) {
10578
0
                ERROR_OUT(MEMORY_E, exit_dcv);
10579
0
            }
10580
10581
0
            ret = CreateSigData(ssl, args->sigData, &args->sigDataSz, 1);
10582
0
            if (ret < 0)
10583
0
                goto exit_dcv;
10584
10585
        #ifdef WOLFSSL_DUAL_ALG_CERTS
10586
            if ((ssl->sigSpec != NULL) &&
10587
                (*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH)) {
10588
                args->altSigData = (byte*)XMALLOC(MAX_SIG_DATA_SZ, ssl->heap,
10589
                                                        DYNAMIC_TYPE_SIGNATURE);
10590
                if (args->altSigData == NULL) {
10591
                    ERROR_OUT(MEMORY_E, exit_dcv);
10592
                }
10593
                XMEMCPY(args->altSigData, args->sigData, args->sigDataSz);
10594
                args->altSigDataSz = args->sigDataSz;
10595
            }
10596
        #endif /* WOLFSSL_DUAL_ALG_CERTS */
10597
10598
0
        #ifdef HAVE_ECC
10599
0
            if ((ssl->options.peerSigAlgo == ecc_dsa_sa_algo) &&
10600
0
                (ssl->peerEccDsaKeyPresent)) {
10601
0
                ret = CreateECCEncodedSig(args->sigData,
10602
0
                    args->sigDataSz, ssl->options.peerHashAlgo);
10603
0
                if (ret < 0)
10604
0
                    goto exit_dcv;
10605
0
                args->sigDataSz = (word16)ret;
10606
0
                ret = 0;
10607
0
            }
10608
10609
        #ifdef WOLFSSL_DUAL_ALG_CERTS
10610
            if ((ssl->sigSpec != NULL) &&
10611
                (*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) &&
10612
                (args->altSigAlgo == ecc_dsa_sa_algo) &&
10613
                (ssl->peerEccDsaKeyPresent)) {
10614
                ret = CreateECCEncodedSig(args->altSigData,
10615
                        args->altSigDataSz, ssl->options.peerHashAlgo);
10616
                    if (ret < 0)
10617
                        goto exit_dcv;
10618
                    args->altSigDataSz = (word16)ret;
10619
                    ret = 0;
10620
            }
10621
        #endif /* WOLFSSL_DUAL_ALG_CERTS */
10622
0
        #endif /* HAVE_ECC */
10623
10624
            /* Advance state and proceed */
10625
0
            ssl->options.asyncState = TLS_ASYNC_DO;
10626
0
        } /* case TLS_ASYNC_BUILD */
10627
0
        FALL_THROUGH;
10628
10629
0
        case TLS_ASYNC_DO:
10630
0
        {
10631
0
            sig = input + args->idx;
10632
0
            (void)sig;
10633
        #ifdef WOLFSSL_DUAL_ALG_CERTS
10634
            if (ssl->sigSpec != NULL &&
10635
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
10636
                /* As we have two signatures in the message, we stored
10637
                 * the length of each before the actual signature. This
10638
                 * is necessary, as we could have two algorithms with
10639
                 * variable length signatures. */
10640
                sig += OPAQUE16_LEN;
10641
            }
10642
        #endif
10643
0
        #ifndef NO_RSA
10644
0
            if ((ssl->options.peerSigAlgo == rsa_pss_sa_algo) &&
10645
0
                (ssl->peerRsaKey != NULL) && (ssl->peerRsaKeyPresent != 0)) {
10646
0
                WOLFSSL_MSG("Doing RSA peer cert verify");
10647
0
                ret = RsaVerify(ssl, rsaSigBuf->buffer,
10648
0
                                (word32)rsaSigBuf->length, &args->output,
10649
0
                                ssl->options.peerSigAlgo,
10650
0
                                ssl->options.peerHashAlgo, ssl->peerRsaKey,
10651
                #ifdef HAVE_PK_CALLBACKS
10652
                                &ssl->buffers.peerRsaKey
10653
                #else
10654
0
                                NULL
10655
0
                #endif
10656
0
                                );
10657
0
                if (ret >= 0) {
10658
0
                    args->sendSz = (word32)ret;
10659
0
                    ret = 0;
10660
0
                }
10661
0
            }
10662
0
        #endif /* !NO_RSA */
10663
0
        #ifdef HAVE_ECC
10664
0
            if ((ssl->options.peerSigAlgo == ecc_dsa_sa_algo) &&
10665
0
                    ssl->peerEccDsaKeyPresent) {
10666
0
                WOLFSSL_MSG("Doing ECC peer cert verify");
10667
0
                ret = EccVerify(ssl, sig, args->sigSz,
10668
0
                    args->sigData, args->sigDataSz,
10669
0
                    ssl->peerEccDsaKey,
10670
                #ifdef HAVE_PK_CALLBACKS
10671
                    &ssl->buffers.peerEccDsaKey
10672
                #else
10673
0
                    NULL
10674
0
                #endif
10675
0
                    );
10676
10677
0
                if (ret >= 0) {
10678
                    /* CLIENT/SERVER: data verified with public key from
10679
                     * certificate. */
10680
0
                    ssl->options.peerAuthGood = 1;
10681
10682
0
                    FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
10683
0
                    ssl->peerEccDsaKeyPresent = 0;
10684
0
                }
10685
0
            }
10686
0
        #endif /* HAVE_ECC */
10687
0
        #if defined(HAVE_ECC) && defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
10688
0
            if ((ssl->options.peerSigAlgo == sm2_sa_algo) &&
10689
0
                   ssl->peerEccDsaKeyPresent) {
10690
0
                WOLFSSL_MSG("Doing SM2/SM3 peer cert verify");
10691
0
                ret = Sm2wSm3Verify(ssl, TLS13_SM2_SIG_ID, TLS13_SM2_SIG_ID_SZ,
10692
0
                    sig, args->sigSz, args->sigData, args->sigDataSz,
10693
0
                    ssl->peerEccDsaKey, NULL);
10694
0
                if (ret >= 0) {
10695
                    /* CLIENT/SERVER: data verified with public key from
10696
                     * certificate. */
10697
0
                    ssl->options.peerAuthGood = 1;
10698
10699
0
                    FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
10700
0
                    ssl->peerEccDsaKeyPresent = 0;
10701
0
                }
10702
0
            }
10703
0
        #endif
10704
0
        #ifdef HAVE_ED25519
10705
0
            if ((ssl->options.peerSigAlgo == ed25519_sa_algo) &&
10706
0
                (ssl->peerEd25519KeyPresent)) {
10707
0
                WOLFSSL_MSG("Doing ED25519 peer cert verify");
10708
0
                ret = Ed25519Verify(ssl, sig, args->sigSz,
10709
0
                    args->sigData, args->sigDataSz,
10710
0
                    ssl->peerEd25519Key,
10711
                #ifdef HAVE_PK_CALLBACKS
10712
                    &ssl->buffers.peerEd25519Key
10713
                #else
10714
0
                    NULL
10715
0
                #endif
10716
0
                    );
10717
10718
0
                if (ret >= 0) {
10719
                    /* CLIENT/SERVER: data verified with public key from
10720
                     * certificate. */
10721
0
                    ssl->options.peerAuthGood = 1;
10722
0
                    FreeKey(ssl, DYNAMIC_TYPE_ED25519,
10723
0
                                                  (void**)&ssl->peerEd25519Key);
10724
0
                    ssl->peerEd25519KeyPresent = 0;
10725
0
                }
10726
0
            }
10727
0
        #endif
10728
0
        #ifdef HAVE_ED448
10729
0
            if ((ssl->options.peerSigAlgo == ed448_sa_algo) &&
10730
0
                (ssl->peerEd448KeyPresent)) {
10731
0
                WOLFSSL_MSG("Doing ED448 peer cert verify");
10732
0
                ret = Ed448Verify(ssl, sig, args->sigSz,
10733
0
                    args->sigData, args->sigDataSz,
10734
0
                    ssl->peerEd448Key,
10735
                #ifdef HAVE_PK_CALLBACKS
10736
                    &ssl->buffers.peerEd448Key
10737
                #else
10738
0
                    NULL
10739
0
                #endif
10740
0
                );
10741
10742
0
                if (ret >= 0) {
10743
                    /* CLIENT/SERVER: data verified with public key from
10744
                     * certificate. */
10745
0
                    ssl->options.peerAuthGood = 1;
10746
0
                    FreeKey(ssl, DYNAMIC_TYPE_ED448,
10747
0
                                                    (void**)&ssl->peerEd448Key);
10748
0
                    ssl->peerEd448KeyPresent = 0;
10749
0
                }
10750
0
            }
10751
0
        #endif
10752
        #if defined(HAVE_FALCON)
10753
            if (((ssl->options.peerSigAlgo == falcon_level1_sa_algo) ||
10754
                 (ssl->options.peerSigAlgo == falcon_level5_sa_algo)) &&
10755
                (ssl->peerFalconKeyPresent)) {
10756
                int res = 0;
10757
                WOLFSSL_MSG("Doing Falcon peer cert verify");
10758
                ret = wc_falcon_verify_msg(sig, args->sigSz,
10759
                                           args->sigData, args->sigDataSz,
10760
                                           &res, ssl->peerFalconKey);
10761
10762
                if ((ret >= 0) && (res == 1)) {
10763
                    /* CLIENT/SERVER: data verified with public key from
10764
                     * certificate. */
10765
                    ssl->options.peerAuthGood = 1;
10766
10767
                    FreeKey(ssl, DYNAMIC_TYPE_FALCON,
10768
                                                   (void**)&ssl->peerFalconKey);
10769
                    ssl->peerFalconKeyPresent = 0;
10770
                }
10771
                else if ((ret >= 0) && (res == 0)) {
10772
                    WOLFSSL_MSG("Falcon signature verification failed");
10773
                    ret = SIG_VERIFY_E;
10774
                }
10775
            }
10776
        #endif /* HAVE_FALCON */
10777
        #if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_VERIFY)
10778
            if (((ssl->options.peerSigAlgo == dilithium_level2_sa_algo) ||
10779
                 (ssl->options.peerSigAlgo == dilithium_level3_sa_algo) ||
10780
                 (ssl->options.peerSigAlgo == dilithium_level5_sa_algo)) &&
10781
                (ssl->peerDilithiumKeyPresent)) {
10782
                int res = 0;
10783
                WOLFSSL_MSG("Doing Dilithium peer cert verify");
10784
                ret = wc_dilithium_verify_ctx_msg(sig, args->sigSz, NULL, 0,
10785
                                                  args->sigData, args->sigDataSz,
10786
                                                  &res, ssl->peerDilithiumKey);
10787
10788
                if ((ret >= 0) && (res == 1)) {
10789
                    /* CLIENT/SERVER: data verified with public key from
10790
                     * certificate. */
10791
                    ssl->options.peerAuthGood = 1;
10792
10793
                    FreeKey(ssl, DYNAMIC_TYPE_DILITHIUM,
10794
                            (void**)&ssl->peerDilithiumKey);
10795
                    ssl->peerDilithiumKeyPresent = 0;
10796
                }
10797
                else if ((ret >= 0) && (res == 0)) {
10798
                    WOLFSSL_MSG("Dilithium signature verification failed");
10799
                    ret = SIG_VERIFY_E;
10800
                }
10801
            }
10802
        #endif /* HAVE_DILITHIUM */
10803
10804
            /* Check for error */
10805
0
            if (ret != 0) {
10806
0
                goto exit_dcv;
10807
0
            }
10808
10809
        #ifdef WOLFSSL_DUAL_ALG_CERTS
10810
            if (ssl->sigSpec != NULL &&
10811
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
10812
                /* Move forward to the alternative signature. */
10813
                sig += args->sigSz + OPAQUE16_LEN;
10814
10815
                /* Verify the alternative signature */
10816
            #ifndef NO_RSA
10817
                if ((args->altSigAlgo == rsa_pss_sa_algo) &&
10818
                    (ssl->peerRsaKey != NULL) &&
10819
                    (ssl->peerRsaKeyPresent != 0)) {
10820
                    WOLFSSL_MSG("Doing RSA peer cert alt verify");
10821
                    ret = RsaVerify(ssl, rsaSigBuf->buffer,
10822
                                    (word32)rsaSigBuf->length,
10823
                                    &args->output, args->altSigAlgo,
10824
                                    ssl->options.peerHashAlgo, ssl->peerRsaKey,
10825
                    #ifdef HAVE_PK_CALLBACKS
10826
                                    &ssl->buffers.peerRsaKey
10827
                    #else
10828
                                    NULL
10829
                    #endif
10830
                                    );
10831
                    if (ret >= 0) {
10832
                        args->sendSz = ret;
10833
                        ret = 0;
10834
                    }
10835
                }
10836
            #endif /* !NO_RSA */
10837
            #ifdef HAVE_ECC
10838
                if ((args->altSigAlgo == ecc_dsa_sa_algo) &&
10839
                    (ssl->peerEccDsaKeyPresent)) {
10840
                    WOLFSSL_MSG("Doing ECC peer cert alt verify");
10841
                    ret = EccVerify(ssl, sig, args->altSignatureSz,
10842
                                args->altSigData, args->altSigDataSz,
10843
                                ssl->peerEccDsaKey,
10844
                    #ifdef HAVE_PK_CALLBACKS
10845
                                &ssl->buffers.peerEccDsaKey
10846
                    #else
10847
                                NULL
10848
                    #endif
10849
                                );
10850
10851
                    if (ret >= 0) {
10852
                        /* CLIENT/SERVER: data verified with public key from
10853
                        * certificate. */
10854
                        args->altPeerAuthGood = 1;
10855
10856
                        FreeKey(ssl, DYNAMIC_TYPE_ECC,
10857
                                                (void**)&ssl->peerEccDsaKey);
10858
                        ssl->peerEccDsaKeyPresent = 0;
10859
                    }
10860
                }
10861
            #endif /* HAVE_ECC */
10862
            #if defined(HAVE_FALCON)
10863
                if (((args->altSigAlgo == falcon_level1_sa_algo) ||
10864
                     (args->altSigAlgo == falcon_level5_sa_algo)) &&
10865
                    (ssl->peerFalconKeyPresent)) {
10866
                    int res = 0;
10867
                    WOLFSSL_MSG("Doing Falcon peer cert alt verify");
10868
                    ret = wc_falcon_verify_msg(sig, args->altSignatureSz,
10869
                                        args->altSigData, args->altSigDataSz,
10870
                                        &res, ssl->peerFalconKey);
10871
10872
                    if ((ret >= 0) && (res == 1)) {
10873
                        /* CLIENT/SERVER: data verified with public key from
10874
                        * certificate. */
10875
                        args->altPeerAuthGood = 1;
10876
10877
                        FreeKey(ssl, DYNAMIC_TYPE_FALCON,
10878
                                                (void**)&ssl->peerFalconKey);
10879
                        ssl->peerFalconKeyPresent = 0;
10880
                    }
10881
                    else if ((ret >= 0) && (res == 0)) {
10882
                        WOLFSSL_MSG("Falcon signature verification failed");
10883
                        ret = SIG_VERIFY_E;
10884
                    }
10885
                }
10886
            #endif /* HAVE_FALCON */
10887
            #if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_VERIFY)
10888
                if (((args->altSigAlgo == dilithium_level2_sa_algo) ||
10889
                     (args->altSigAlgo == dilithium_level3_sa_algo) ||
10890
                     (args->altSigAlgo == dilithium_level5_sa_algo)) &&
10891
                    (ssl->peerDilithiumKeyPresent)) {
10892
                    int res = 0;
10893
                    WOLFSSL_MSG("Doing Dilithium peer cert alt verify");
10894
                    ret = wc_dilithium_verify_ctx_msg(sig, args->altSignatureSz,
10895
                                        NULL, 0, args->altSigData,
10896
                                        args->altSigDataSz, &res,
10897
                                        ssl->peerDilithiumKey);
10898
10899
                    if ((ret >= 0) && (res == 1)) {
10900
                        /* CLIENT/SERVER: data verified with public key from
10901
                        * certificate. */
10902
                        args->altPeerAuthGood = 1;
10903
10904
                        FreeKey(ssl, DYNAMIC_TYPE_DILITHIUM,
10905
                                            (void**)&ssl->peerDilithiumKey);
10906
                        ssl->peerDilithiumKeyPresent = 0;
10907
                    }
10908
                    else if ((ret >= 0) && (res == 0)) {
10909
                        WOLFSSL_MSG("Dilithium signature verification failed");
10910
                        ret = SIG_VERIFY_E;
10911
                    }
10912
                }
10913
            #endif /* HAVE_DILITHIUM */
10914
10915
                /* Check for error */
10916
                if (ret != 0) {
10917
                    goto exit_dcv;
10918
                }
10919
            }
10920
        #endif /* WOLFSSL_DUAL_ALG_CERTS */
10921
10922
            /* Advance state and proceed */
10923
0
            ssl->options.asyncState = TLS_ASYNC_VERIFY;
10924
0
        } /* case TLS_ASYNC_DO */
10925
0
        FALL_THROUGH;
10926
10927
0
        case TLS_ASYNC_VERIFY:
10928
0
        {
10929
0
        #if !defined(NO_RSA) && defined(WC_RSA_PSS)
10930
0
            if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
10931
0
                int sigAlgo = ssl->options.peerSigAlgo;
10932
            #ifdef WOLFSSL_DUAL_ALG_CERTS
10933
                /* Check if our alternative signature was RSA */
10934
                if (ssl->sigSpec != NULL &&
10935
                    *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH &&
10936
                    ssl->options.peerSigAlgo != rsa_pss_sa_algo) {
10937
                    sigAlgo = args->altSigAlgo;
10938
                }
10939
            #endif
10940
0
                ret = CheckRSASignature(ssl, sigAlgo,
10941
0
                        ssl->options.peerHashAlgo, args->output, args->sendSz);
10942
0
                if (ret != 0)
10943
0
                    goto exit_dcv;
10944
10945
                /* CLIENT/SERVER: data verified with public key from
10946
                 * certificate. */
10947
0
                ssl->peerRsaKeyPresent = 0;
10948
0
                FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
10949
            #ifdef WOLFSSL_DUAL_ALG_CERTS
10950
                /* Check if our alternative signature was RSA */
10951
                if (ssl->sigSpec != NULL &&
10952
                    *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH &&
10953
                    ssl->options.peerSigAlgo != rsa_pss_sa_algo) {
10954
                    args->altPeerAuthGood = 1;
10955
                }
10956
                else
10957
            #endif
10958
0
                    ssl->options.peerAuthGood = 1;
10959
0
            }
10960
0
        #endif /* !NO_RSA && WC_RSA_PSS */
10961
10962
            /* Advance state and proceed */
10963
0
            ssl->options.asyncState = TLS_ASYNC_FINALIZE;
10964
0
        } /* case TLS_ASYNC_VERIFY */
10965
0
        FALL_THROUGH;
10966
10967
0
        case TLS_ASYNC_FINALIZE:
10968
0
        {
10969
#ifdef WOLFSSL_DUAL_ALG_CERTS
10970
            if (ssl->options.peerAuthGood &&
10971
                ssl->sigSpec != NULL &&
10972
                *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
10973
                ssl->options.peerAuthGood = args->altPeerAuthGood;
10974
            }
10975
#endif /* WOLFSSL_DUAL_ALG_CERTS */
10976
0
            ssl->options.havePeerVerify = 1;
10977
10978
            /* Set final index */
10979
0
            args->idx += args->sz;
10980
0
            *inOutIdx = args->idx;
10981
10982
            /* Encryption is always on: add padding */
10983
0
            *inOutIdx += ssl->keys.padSz;
10984
10985
            /* Advance state and proceed */
10986
0
            ssl->options.asyncState = TLS_ASYNC_END;
10987
10988
0
        #if !defined(NO_WOLFSSL_CLIENT)
10989
0
            if (ssl->options.side == WOLFSSL_CLIENT_END)
10990
0
                ssl->options.serverState = SERVER_CERT_VERIFY_COMPLETE;
10991
0
        #endif
10992
0
        } /* case TLS_ASYNC_FINALIZE */
10993
0
        FALL_THROUGH;
10994
10995
0
        case TLS_ASYNC_END:
10996
0
        {
10997
0
            break;
10998
0
        }
10999
11000
0
        default:
11001
0
            ret = INPUT_CASE_ERROR;
11002
0
    } /* switch(ssl->options.asyncState) */
11003
11004
0
exit_dcv:
11005
11006
0
    WOLFSSL_LEAVE("DoTls13CertificateVerify", ret);
11007
0
    WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_DO);
11008
11009
#ifdef WOLFSSL_ASYNC_CRYPT
11010
    /* Handle async operation */
11011
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11012
        /* Mark message as not received so it can process again */
11013
        ssl->msgsReceived.got_certificate_verify = 0;
11014
11015
        return ret;
11016
    }
11017
    else
11018
#endif /* WOLFSSL_ASYNC_CRYPT */
11019
0
    if (ret != 0) {
11020
0
        WOLFSSL_ERROR_VERBOSE(ret);
11021
11022
0
        if (ret != WC_NO_ERR_TRACE(INVALID_PARAMETER)) {
11023
0
            SendAlert(ssl, alert_fatal, decrypt_error);
11024
0
        }
11025
0
    }
11026
11027
    /* Final cleanup */
11028
0
    FreeDcv13Args(ssl, args);
11029
0
    FreeKeyExchange(ssl);
11030
0
#ifdef WOLFSSL_ASYNC_IO
11031
    /* Cleanup async */
11032
0
    FreeAsyncCtx(ssl, 0);
11033
0
#endif
11034
11035
0
    return ret;
11036
0
}
11037
#endif /* !NO_RSA || HAVE_ECC */
11038
#endif /* !NO_CERTS */
11039
11040
/* Parse and handle a TLS v1.3 Finished message.
11041
 *
11042
 * ssl       The SSL/TLS object.
11043
 * input     The message buffer.
11044
 * inOutIdx  On entry, the index into the message buffer of Finished.
11045
 *           On exit, the index of byte after the Finished message and padding.
11046
 * size      Length of message data.
11047
 * totalSz   Length of remaining data in the message buffer.
11048
 * sniff     Indicates whether we are sniffing packets.
11049
 * returns 0 on success and otherwise failure.
11050
 */
11051
int DoTls13Finished(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
11052
                           word32 size, word32 totalSz, int sniff)
11053
0
{
11054
0
    int    ret;
11055
0
    word32 finishedSz = 0;
11056
0
    byte*  secret;
11057
0
    byte   mac[WC_MAX_DIGEST_SIZE];
11058
11059
0
    WOLFSSL_START(WC_FUNC_FINISHED_DO);
11060
0
    WOLFSSL_ENTER("DoTls13Finished");
11061
11062
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
11063
    /* verify the client sent certificate if required */
11064
0
    if (ssl->options.side == WOLFSSL_SERVER_END && !ssl->options.resuming &&
11065
0
            (ssl->options.mutualAuth || ssl->options.failNoCert)) {
11066
#ifdef OPENSSL_COMPATIBLE_DEFAULTS
11067
        if (ssl->options.isPSK) {
11068
            WOLFSSL_MSG("TLS v1.3 client used PSK but cert required. Allowing "
11069
                        "for OpenSSL compatibility");
11070
        }
11071
        else
11072
#endif
11073
0
        if (
11074
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
11075
            !ssl->options.verifyPostHandshake &&
11076
        #endif
11077
0
            (!ssl->options.havePeerCert || !ssl->options.havePeerVerify)) {
11078
0
            ret = NO_PEER_CERT; /* NO_PEER_VERIFY */
11079
0
            WOLFSSL_MSG("TLS v1.3 client did not present peer cert");
11080
0
            DoCertFatalAlert(ssl, ret);
11081
0
            return ret;
11082
0
        }
11083
0
    }
11084
0
#endif
11085
11086
    /* check against totalSz */
11087
0
    if (*inOutIdx + size > totalSz)
11088
0
        return BUFFER_E;
11089
11090
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
11091
    ret = tsip_Tls13HandleFinished(ssl, input, inOutIdx, size, totalSz);
11092
    if (ret == 0) {
11093
        ssl->options.serverState = SERVER_FINISHED_COMPLETE;
11094
        return ret;
11095
    }
11096
    if (ret == WC_NO_ERR_TRACE(VERIFY_FINISHED_ERROR)) {
11097
        SendAlert(ssl, alert_fatal, decrypt_error);
11098
        return ret;
11099
    }
11100
    if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
11101
        /* other errors */
11102
        return ret;
11103
    }
11104
    ret = 0;
11105
#endif /* WOLFSSL_RENESAS_TSIP_TLS */
11106
11107
0
    if (ssl->options.handShakeDone) {
11108
0
        ret = DeriveFinishedSecret(ssl, ssl->clientSecret,
11109
0
                                   ssl->keys.client_write_MAC_secret,
11110
0
                                   WOLFSSL_CLIENT_END);
11111
0
        if (ret != 0)
11112
0
            return ret;
11113
11114
0
        secret = ssl->keys.client_write_MAC_secret;
11115
0
    }
11116
0
    else if (ssl->options.side == WOLFSSL_CLIENT_END) {
11117
        /* All the handshake messages have been received to calculate
11118
         * client and server finished keys.
11119
         */
11120
0
        ret = DeriveFinishedSecret(ssl, ssl->clientSecret,
11121
0
                                   ssl->keys.client_write_MAC_secret,
11122
0
                                   WOLFSSL_CLIENT_END);
11123
0
        if (ret != 0)
11124
0
            return ret;
11125
11126
0
        ret = DeriveFinishedSecret(ssl, ssl->serverSecret,
11127
0
                                   ssl->keys.server_write_MAC_secret,
11128
0
                                   WOLFSSL_SERVER_END);
11129
0
        if (ret != 0)
11130
0
            return ret;
11131
11132
0
        secret = ssl->keys.server_write_MAC_secret;
11133
0
    }
11134
0
    else {
11135
0
        secret = ssl->keys.client_write_MAC_secret;
11136
0
    }
11137
11138
0
    if (sniff == NO_SNIFF) {
11139
11140
0
        ret = BuildTls13HandshakeHmac(ssl, secret, mac, &finishedSz);
11141
    #ifdef WOLFSSL_HAVE_TLS_UNIQUE
11142
        if (finishedSz > TLS_FINISHED_SZ_MAX) {
11143
            return BUFFER_ERROR;
11144
        }
11145
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
11146
            XMEMCPY(ssl->serverFinished, mac, finishedSz);
11147
            ssl->serverFinished_len = (byte)finishedSz;
11148
        }
11149
        else {
11150
            XMEMCPY(ssl->clientFinished, mac, finishedSz);
11151
            ssl->clientFinished_len = (byte)finishedSz;
11152
        }
11153
    #endif /* WOLFSSL_HAVE_TLS_UNIQUE */
11154
0
        if (ret != 0)
11155
0
            return ret;
11156
0
        if (size != finishedSz)
11157
0
            return BUFFER_ERROR;
11158
0
    }
11159
11160
#ifdef WOLFSSL_CALLBACKS
11161
    if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
11162
    if (ssl->toInfoOn) AddLateName("Finished", &ssl->timeoutInfo);
11163
#endif
11164
11165
0
    if (sniff == NO_SNIFF) {
11166
        /* Actually check verify data. */
11167
0
        if (size > WC_MAX_DIGEST_SIZE ||
11168
0
                XMEMCMP(input + *inOutIdx, mac, size) != 0){
11169
0
            WOLFSSL_MSG("Verify finished error on hashes");
11170
0
            SendAlert(ssl, alert_fatal, decrypt_error);
11171
0
            WOLFSSL_ERROR_VERBOSE(VERIFY_FINISHED_ERROR);
11172
0
            return VERIFY_FINISHED_ERROR;
11173
0
        }
11174
0
    }
11175
11176
    /* Force input exhaustion at ProcessReply by consuming padSz. */
11177
0
    *inOutIdx += size + ssl->keys.padSz;
11178
11179
0
#ifndef NO_WOLFSSL_SERVER
11180
0
    if (ssl->options.side == WOLFSSL_SERVER_END &&
11181
0
                                                  !ssl->options.handShakeDone) {
11182
#ifdef WOLFSSL_EARLY_DATA
11183
        if (ssl->earlyData != no_early_data) {
11184
            if ((ret = DeriveTls13Keys(ssl, no_key, DECRYPT_SIDE_ONLY, 1)) != 0)
11185
                return ret;
11186
        }
11187
#endif
11188
        /* Setup keys for application data messages from client. */
11189
0
        if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
11190
0
            return ret;
11191
0
    }
11192
0
#endif
11193
11194
0
#ifndef NO_WOLFSSL_CLIENT
11195
0
    if (ssl->options.side == WOLFSSL_CLIENT_END)
11196
0
        ssl->options.serverState = SERVER_FINISHED_COMPLETE;
11197
0
#endif
11198
0
#ifndef NO_WOLFSSL_SERVER
11199
0
    if (ssl->options.side == WOLFSSL_SERVER_END) {
11200
0
        ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
11201
0
        ssl->options.handShakeState = HANDSHAKE_DONE;
11202
0
        ssl->options.handShakeDone  = 1;
11203
0
    }
11204
0
#endif
11205
11206
#if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_EARLY_DATA)
11207
    if (ssl->options.dtls && ssl->earlyData > early_data_ext) {
11208
        /* DTLSv1.3 has no EndOfearlydata messages. We stop processing EarlyData
11209
           as soon we receive the client's finished message */
11210
        ssl->earlyData = done_early_data;
11211
    }
11212
#endif /* WOLFSSL_DTLS13 && WOLFSSL_EARLY_DATA */
11213
#if defined(WOLFSSL_QUIC) && defined(WOLFSSL_EARLY_DATA)
11214
    if (WOLFSSL_IS_QUIC(ssl) && ssl->earlyData > early_data_ext) {
11215
        /* QUIC has no EndOfEarlyData messages. We stop processing EarlyData
11216
           as soon we receive the client's finished message */
11217
        ssl->earlyData = done_early_data;
11218
    }
11219
#endif /* WOLFSSL_QUIC && WOLFSSL_EARLY_DATA */
11220
11221
0
    WOLFSSL_LEAVE("DoTls13Finished", 0);
11222
0
    WOLFSSL_END(WC_FUNC_FINISHED_DO);
11223
11224
0
    return 0;
11225
0
}
11226
11227
#if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)
11228
/* Send the TLS v1.3 Finished message.
11229
 *
11230
 * ssl  The SSL/TLS object.
11231
 * returns 0 on success, otherwise failure.
11232
 */
11233
static int SendTls13Finished(WOLFSSL* ssl)
11234
{
11235
    byte  finishedSz = ssl->specs.hash_size;
11236
    byte* input;
11237
    byte* output;
11238
    int   ret;
11239
    int   headerSz = HANDSHAKE_HEADER_SZ;
11240
    int   outputSz;
11241
    byte* secret;
11242
11243
#ifdef WOLFSSL_DTLS13
11244
    int dtlsRet = 0, isDtls = 0;
11245
#endif /* WOLFSSL_DTLS13 */
11246
11247
    WOLFSSL_START(WC_FUNC_FINISHED_SEND);
11248
    WOLFSSL_ENTER("SendTls13Finished");
11249
11250
    ssl->options.buildingMsg = 1;
11251
#ifdef WOLFSSL_DTLS13
11252
    if (ssl->options.dtls) {
11253
        headerSz = DTLS_HANDSHAKE_HEADER_SZ;
11254
        /* using isDtls instead of ssl->options.dtls will abide clang static
11255
           analyzer on using an uninitialized value */
11256
        isDtls = 1;
11257
    }
11258
#endif /* WOLFSSL_DTLS13 */
11259
11260
    outputSz = WC_MAX_DIGEST_SIZE + DTLS_HANDSHAKE_HEADER_SZ + MAX_MSG_EXTRA;
11261
    /* Check buffers are big enough and grow if needed. */
11262
    if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
11263
        return ret;
11264
11265
    /* get output buffer */
11266
    output = GetOutputBuffer(ssl);
11267
    input = output + RECORD_HEADER_SZ;
11268
11269
#ifdef WOLFSSL_DTLS13
11270
    if (isDtls)
11271
        input = output + Dtls13GetRlHeaderLength(ssl, 1);
11272
#endif /* WOLFSSL_DTLS13 */
11273
11274
    AddTls13HandShakeHeader(input, (word32)finishedSz, 0, (word32)finishedSz,
11275
            finished, ssl);
11276
11277
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
11278
    if (ssl->options.side == WOLFSSL_CLIENT_END) {
11279
        ret = tsip_Tls13SendFinished(ssl, output, outputSz, input, 1);
11280
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
11281
            return ret;
11282
        }
11283
        ret = 0;
11284
    }
11285
#endif /* WOLFSSL_RENESAS_TSIP_TLS */
11286
11287
    /* make finished hashes */
11288
    if (ssl->options.handShakeDone) {
11289
        ret = DeriveFinishedSecret(ssl, ssl->clientSecret,
11290
                                   ssl->keys.client_write_MAC_secret,
11291
                                   WOLFSSL_CLIENT_END);
11292
        if (ret != 0)
11293
            return ret;
11294
11295
        secret = ssl->keys.client_write_MAC_secret;
11296
    }
11297
    else if (ssl->options.side == WOLFSSL_CLIENT_END)
11298
        secret = ssl->keys.client_write_MAC_secret;
11299
    else {
11300
        /* All the handshake messages have been done to calculate client and
11301
         * server finished keys.
11302
         */
11303
        ret = DeriveFinishedSecret(ssl, ssl->clientSecret,
11304
                                   ssl->keys.client_write_MAC_secret,
11305
                                   WOLFSSL_SERVER_END);
11306
        if (ret != 0)
11307
            return ret;
11308
11309
        ret = DeriveFinishedSecret(ssl, ssl->serverSecret,
11310
                                   ssl->keys.server_write_MAC_secret,
11311
                                   WOLFSSL_CLIENT_END);
11312
        if (ret != 0)
11313
            return ret;
11314
11315
        secret = ssl->keys.server_write_MAC_secret;
11316
    }
11317
    ret = BuildTls13HandshakeHmac(ssl, secret, &input[headerSz], NULL);
11318
    if (ret != 0)
11319
        return ret;
11320
    #ifdef WOLFSSL_HAVE_TLS_UNIQUE
11321
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
11322
            XMEMCPY(ssl->clientFinished, &input[headerSz], finishedSz);
11323
            ssl->clientFinished_len = finishedSz;
11324
        }
11325
        else {
11326
            XMEMCPY(ssl->serverFinished, &input[headerSz], finishedSz);
11327
            ssl->serverFinished_len = finishedSz;
11328
        }
11329
    #endif /* WOLFSSL_HAVE_TLS_UNIQUE */
11330
11331
#ifdef WOLFSSL_DTLS13
11332
    if (isDtls) {
11333
        dtlsRet = Dtls13HandshakeSend(ssl, output, (word16)outputSz,
11334
            (word16)(Dtls13GetRlHeaderLength(ssl, 1) + headerSz + finishedSz), finished,
11335
            1);
11336
        if (dtlsRet != 0 && dtlsRet != WC_NO_ERR_TRACE(WANT_WRITE))
11337
            return ret;
11338
11339
    } else
11340
#endif /* WOLFSSL_DTLS13 */
11341
    {
11342
        /* This message is always encrypted. */
11343
        int sendSz = BuildTls13Message(ssl, output, outputSz, input,
11344
                                   headerSz + finishedSz, handshake, 1, 0, 0);
11345
        if (sendSz < 0) {
11346
            WOLFSSL_ERROR_VERBOSE(BUILD_MSG_ERROR);
11347
            return BUILD_MSG_ERROR;
11348
        }
11349
11350
        #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
11351
            if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
11352
            if (ssl->toInfoOn) {
11353
                ret = AddPacketInfo(ssl, "Finished", handshake, output, sendSz,
11354
                              WRITE_PROTO, 0, ssl->heap);
11355
                if (ret != 0)
11356
                    return ret;
11357
            }
11358
        #endif
11359
11360
        ssl->buffers.outputBuffer.length += (word32)sendSz;
11361
        ssl->options.buildingMsg = 0;
11362
    }
11363
11364
    if (ssl->options.side == WOLFSSL_SERVER_END) {
11365
#ifdef WOLFSSL_EARLY_DATA
11366
        byte storeTrafficDecKeys = ssl->earlyData == no_early_data;
11367
#endif
11368
        /* Can send application data now. */
11369
        if ((ret = DeriveMasterSecret(ssl)) != 0)
11370
            return ret;
11371
        /* Last use of preMasterSecret - zeroize as soon as possible. */
11372
        ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
11373
#ifdef WOLFSSL_EARLY_DATA
11374
11375
#ifdef WOLFSSL_DTLS13
11376
        /* DTLS13 dynamically change keys and it needs all
11377
           the keys in ssl->keys to save the keying material */
11378
        if (isDtls)
11379
            storeTrafficDecKeys = 1;
11380
#endif /* WOLFSSL_DTLS13 */
11381
11382
        if ((ret = DeriveTls13Keys(ssl, traffic_key, ENCRYPT_SIDE_ONLY, 1))
11383
                                                                         != 0) {
11384
            return ret;
11385
        }
11386
        if ((ret = DeriveTls13Keys(ssl, traffic_key, DECRYPT_SIDE_ONLY,
11387
                                       storeTrafficDecKeys)) != 0) {
11388
            return ret;
11389
        }
11390
#else
11391
        if ((ret = DeriveTls13Keys(ssl, traffic_key, ENCRYPT_AND_DECRYPT_SIDE,
11392
                                                                     1)) != 0) {
11393
            return ret;
11394
        }
11395
#endif
11396
        if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
11397
            return ret;
11398
11399
#ifdef WOLFSSL_DTLS13
11400
        if (isDtls) {
11401
            w64wrapper epochTraffic0;
11402
            epochTraffic0 = w64From32(0, DTLS13_EPOCH_TRAFFIC0);
11403
            ssl->dtls13Epoch = epochTraffic0;
11404
            ssl->dtls13PeerEpoch = epochTraffic0;
11405
11406
            ret = Dtls13SetEpochKeys(
11407
                ssl, epochTraffic0, ENCRYPT_AND_DECRYPT_SIDE);
11408
            if (ret != 0)
11409
                return ret;
11410
11411
        }
11412
#endif /* WOLFSSL_DTLS13 */
11413
11414
    }
11415
11416
    if (ssl->options.side == WOLFSSL_CLIENT_END &&
11417
                                                  !ssl->options.handShakeDone) {
11418
#ifdef WOLFSSL_EARLY_DATA
11419
        if (ssl->earlyData != no_early_data) {
11420
            if ((ret = DeriveTls13Keys(ssl, no_key, ENCRYPT_SIDE_ONLY,
11421
                                                                     1)) != 0) {
11422
                    return ret;
11423
            }
11424
        }
11425
#endif
11426
        /* Setup keys for application data messages. */
11427
        if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
11428
            return ret;
11429
11430
#if defined(HAVE_SESSION_TICKET)
11431
        ret = DeriveResumptionSecret(ssl, ssl->session->masterSecret);
11432
        if (ret != 0)
11433
            return ret;
11434
#endif
11435
11436
#ifdef WOLFSSL_DTLS13
11437
        if (isDtls) {
11438
            w64wrapper epochTraffic0;
11439
            epochTraffic0 = w64From32(0, DTLS13_EPOCH_TRAFFIC0);
11440
            ssl->dtls13Epoch = epochTraffic0;
11441
            ssl->dtls13PeerEpoch = epochTraffic0;
11442
11443
            ret = Dtls13SetEpochKeys(
11444
                ssl, epochTraffic0, ENCRYPT_AND_DECRYPT_SIDE);
11445
            if (ret != 0)
11446
                return ret;
11447
11448
        }
11449
#endif /* WOLFSSL_DTLS13 */
11450
    }
11451
11452
#ifndef NO_WOLFSSL_CLIENT
11453
    if (ssl->options.side == WOLFSSL_CLIENT_END) {
11454
        ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
11455
        ssl->options.handShakeState = HANDSHAKE_DONE;
11456
        ssl->options.handShakeDone  = 1;
11457
    }
11458
#endif
11459
#ifndef NO_WOLFSSL_SERVER
11460
    if (ssl->options.side == WOLFSSL_SERVER_END) {
11461
        ssl->options.serverState = SERVER_FINISHED_COMPLETE;
11462
    }
11463
#endif
11464
11465
#ifdef WOLFSSL_DTLS13
11466
    if (isDtls) {
11467
        WOLFSSL_LEAVE("SendTls13Finished", ret);
11468
        WOLFSSL_END(WC_FUNC_FINISHED_SEND);
11469
11470
        return dtlsRet;
11471
    }
11472
#endif /* WOLFSSL_DTLS13 */
11473
11474
    if ((ret = SendBuffered(ssl)) != 0)
11475
        return ret;
11476
11477
    WOLFSSL_LEAVE("SendTls13Finished", ret);
11478
    WOLFSSL_END(WC_FUNC_FINISHED_SEND);
11479
11480
    return ret;
11481
}
11482
#endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */
11483
11484
/* handle generation TLS v1.3 key_update (24) */
11485
/* Send the TLS v1.3 KeyUpdate message.
11486
 *
11487
 * ssl  The SSL/TLS object.
11488
 * returns 0 on success, otherwise failure.
11489
 */
11490
int SendTls13KeyUpdate(WOLFSSL* ssl)
11491
0
{
11492
0
    byte*  input;
11493
0
    byte*  output;
11494
0
    int    ret;
11495
0
    int    headerSz = HANDSHAKE_HEADER_SZ;
11496
0
    int    outputSz;
11497
0
    word32 i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
11498
11499
0
    WOLFSSL_START(WC_FUNC_KEY_UPDATE_SEND);
11500
0
    WOLFSSL_ENTER("SendTls13KeyUpdate");
11501
11502
#ifdef WOLFSSL_DTLS13
11503
    if (ssl->options.dtls)
11504
        i = Dtls13GetRlHeaderLength(ssl, 1) + DTLS_HANDSHAKE_HEADER_SZ;
11505
#endif /* WOLFSSL_DTLS13 */
11506
11507
0
    outputSz = OPAQUE8_LEN + MAX_MSG_EXTRA;
11508
    /* Check buffers are big enough and grow if needed. */
11509
0
    if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
11510
0
        return ret;
11511
11512
    /* get output buffer */
11513
0
    output = GetOutputBuffer(ssl);
11514
0
    input = output + RECORD_HEADER_SZ;
11515
11516
#ifdef WOLFSSL_DTLS13
11517
    if (ssl->options.dtls)
11518
        input = output + Dtls13GetRlHeaderLength(ssl, 1);
11519
#endif /* WOLFSSL_DTLS13 */
11520
11521
0
    AddTls13Headers(output, OPAQUE8_LEN, key_update, ssl);
11522
11523
    /* If:
11524
     *   1. I haven't sent a KeyUpdate requesting a response and
11525
     *   2. This isn't responding to peer KeyUpdate requiring a response then,
11526
     * I want a response.
11527
     */
11528
0
    ssl->keys.updateResponseReq = output[i++] =
11529
0
         !ssl->keys.updateResponseReq && !ssl->keys.keyUpdateRespond;
11530
    /* Sent response, no longer need to respond. */
11531
0
    ssl->keys.keyUpdateRespond = 0;
11532
11533
#ifdef WOLFSSL_DTLS13
11534
    if (ssl->options.dtls) {
11535
        ret = Dtls13HandshakeSend(ssl, output, (word16)outputSz,
11536
            OPAQUE8_LEN + Dtls13GetRlHeaderLength(ssl, 1) +
11537
                DTLS_HANDSHAKE_HEADER_SZ,
11538
            key_update, 0);
11539
    }
11540
    else
11541
#endif /* WOLFSSL_DTLS13 */
11542
0
    {
11543
        /* This message is always encrypted. */
11544
0
        int sendSz = BuildTls13Message(ssl, output, outputSz, input,
11545
0
                                   headerSz + OPAQUE8_LEN, handshake, 0, 0, 0);
11546
0
        if (sendSz < 0)
11547
0
            return BUILD_MSG_ERROR;
11548
11549
        #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
11550
            if (ssl->hsInfoOn) AddPacketName(ssl, "KeyUpdate");
11551
            if (ssl->toInfoOn) {
11552
                ret = AddPacketInfo(ssl, "KeyUpdate", handshake, output, sendSz,
11553
                              WRITE_PROTO, 0, ssl->heap);
11554
                if (ret != 0)
11555
                    return ret;
11556
            }
11557
        #endif
11558
11559
0
        ssl->buffers.outputBuffer.length += (word32)sendSz;
11560
11561
0
        ret = SendBuffered(ssl);
11562
11563
11564
0
        if (ret != 0 && ret != WC_NO_ERR_TRACE(WANT_WRITE))
11565
0
            return ret;
11566
0
    }
11567
11568
    /* In DTLS we must wait for the ack before setting up the new keys */
11569
0
    if (!ssl->options.dtls) {
11570
11571
        /* Future traffic uses new encryption keys. */
11572
0
        if ((ret = DeriveTls13Keys(
11573
0
                       ssl, update_traffic_key, ENCRYPT_SIDE_ONLY, 1))
11574
0
            != 0)
11575
0
            return ret;
11576
0
        if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
11577
0
            return ret;
11578
0
    }
11579
11580
11581
0
    WOLFSSL_LEAVE("SendTls13KeyUpdate", ret);
11582
0
    WOLFSSL_END(WC_FUNC_KEY_UPDATE_SEND);
11583
11584
0
    return ret;
11585
0
}
11586
11587
/* handle processing TLS v1.3 key_update (24) */
11588
/* Parse and handle a TLS v1.3 KeyUpdate message.
11589
 *
11590
 * ssl       The SSL/TLS object.
11591
 * input     The message buffer.
11592
 * inOutIdx  On entry, the index into the message buffer of Finished.
11593
 *           On exit, the index of byte after the Finished message and padding.
11594
 * totalSz   The length of the current handshake message.
11595
 * returns 0 on success and otherwise failure.
11596
 */
11597
static int DoTls13KeyUpdate(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
11598
                            word32 totalSz)
11599
0
{
11600
0
    int    ret;
11601
0
    word32 i = *inOutIdx;
11602
11603
0
    WOLFSSL_START(WC_FUNC_KEY_UPDATE_DO);
11604
0
    WOLFSSL_ENTER("DoTls13KeyUpdate");
11605
11606
    /* check against totalSz */
11607
0
    if (OPAQUE8_LEN != totalSz)
11608
0
        return BUFFER_E;
11609
11610
0
    switch (input[i]) {
11611
0
        case update_not_requested:
11612
            /* This message in response to any outstanding request. */
11613
0
            ssl->keys.keyUpdateRespond = 0;
11614
0
            ssl->keys.updateResponseReq = 0;
11615
0
            break;
11616
0
        case update_requested:
11617
            /* New key update requiring a response. */
11618
0
            ssl->keys.keyUpdateRespond = 1;
11619
0
            break;
11620
0
        default:
11621
0
            WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
11622
0
            return INVALID_PARAMETER;
11623
0
    }
11624
11625
    /* Move index to byte after message. */
11626
0
    *inOutIdx += totalSz;
11627
    /* Always encrypted. */
11628
0
    *inOutIdx += ssl->keys.padSz;
11629
11630
    /* Future traffic uses new decryption keys. */
11631
0
    if ((ret = DeriveTls13Keys(ssl, update_traffic_key, DECRYPT_SIDE_ONLY, 1))
11632
0
                                                                         != 0) {
11633
0
        return ret;
11634
0
    }
11635
0
    if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
11636
0
        return ret;
11637
11638
#ifdef WOLFSSL_DTLS13
11639
    if (ssl->options.dtls) {
11640
        w64Increment(&ssl->dtls13PeerEpoch);
11641
11642
        ret = Dtls13SetEpochKeys(ssl, ssl->dtls13PeerEpoch, DECRYPT_SIDE_ONLY);
11643
        if (ret != 0)
11644
            return ret;
11645
    }
11646
#endif /* WOLFSSL_DTLS13 */
11647
11648
0
    if (ssl->keys.keyUpdateRespond) {
11649
11650
#ifdef WOLFSSL_DTLS13
11651
        /* we already sent a keyUpdate (either in response to a previous
11652
           KeyUpdate or initiated by the application) and we are waiting for the
11653
           ack. We can't send a new KeyUpdate right away but to honor the RFC we
11654
           should send another KeyUpdate after the one in-flight is acked. We
11655
           don't do that as it looks redundant, it will make the code more
11656
           complex and I don't see a good use case for that. */
11657
        if (ssl->options.dtls && ssl->dtls13WaitKeyUpdateAck) {
11658
            ssl->keys.keyUpdateRespond = 0;
11659
            return 0;
11660
        }
11661
#endif /* WOLFSSL_DTLS13 */
11662
11663
0
#ifndef WOLFSSL_RW_THREADED
11664
0
        return SendTls13KeyUpdate(ssl);
11665
#else
11666
        ssl->options.sendKeyUpdate = 1;
11667
        return 0;
11668
#endif
11669
0
    }
11670
11671
0
    WOLFSSL_LEAVE("DoTls13KeyUpdate", ret);
11672
0
    WOLFSSL_END(WC_FUNC_KEY_UPDATE_DO);
11673
11674
0
    return 0;
11675
0
}
11676
11677
#ifdef WOLFSSL_EARLY_DATA
11678
#ifndef NO_WOLFSSL_CLIENT
11679
/* Send the TLS v1.3 EndOfEarlyData message to indicate that there will be no
11680
 * more early application data.
11681
 * The encryption key now changes to the pre-calculated handshake key.
11682
 *
11683
 * ssl  The SSL/TLS object.
11684
 * returns 0 on success and otherwise failure.
11685
 */
11686
static int SendTls13EndOfEarlyData(WOLFSSL* ssl)
11687
{
11688
    byte*  output;
11689
    int    ret;
11690
    int    sendSz;
11691
    word32 length;
11692
    word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
11693
11694
    WOLFSSL_START(WC_FUNC_END_OF_EARLY_DATA_SEND);
11695
    WOLFSSL_ENTER("SendTls13EndOfEarlyData");
11696
11697
    length = 0;
11698
    sendSz = (int)(idx + length + MAX_MSG_EXTRA);
11699
    ssl->options.buildingMsg = 1;
11700
11701
    /* Check buffers are big enough and grow if needed. */
11702
    if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
11703
        return ret;
11704
11705
    /* Get position in output buffer to write new message to. */
11706
    output = GetOutputBuffer(ssl);
11707
11708
    /* Put the record and handshake headers on. */
11709
    AddTls13Headers(output, length, end_of_early_data, ssl);
11710
11711
    /* This message is always encrypted. */
11712
    sendSz = BuildTls13Message(ssl, output, sendSz, output + RECORD_HEADER_SZ,
11713
                               idx - RECORD_HEADER_SZ, handshake, 1, 0, 0);
11714
    if (sendSz < 0)
11715
        return sendSz;
11716
11717
    ssl->buffers.outputBuffer.length += sendSz;
11718
11719
    if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
11720
        return ret;
11721
11722
    ssl->options.buildingMsg = 0;
11723
    if (!ssl->options.groupMessages)
11724
        ret = SendBuffered(ssl);
11725
11726
    ssl->earlyData = done_early_data;
11727
11728
    WOLFSSL_LEAVE("SendTls13EndOfEarlyData", ret);
11729
    WOLFSSL_END(WC_FUNC_END_OF_EARLY_DATA_SEND);
11730
11731
    return ret;
11732
}
11733
#endif /* !NO_WOLFSSL_CLIENT */
11734
11735
#ifndef NO_WOLFSSL_SERVER
11736
/* handle processing of TLS 1.3 end_of_early_data (5) */
11737
/* Parse the TLS v1.3 EndOfEarlyData message that indicates that there will be
11738
 * no more early application data.
11739
 * The decryption key now changes to the pre-calculated handshake key.
11740
 *
11741
 * ssl  The SSL/TLS object.
11742
 * returns 0 on success and otherwise failure.
11743
 */
11744
static int DoTls13EndOfEarlyData(WOLFSSL* ssl, const byte* input,
11745
                                 word32* inOutIdx, word32 size)
11746
{
11747
    int    ret;
11748
    word32 begin = *inOutIdx;
11749
11750
    (void)input;
11751
11752
    WOLFSSL_START(WC_FUNC_END_OF_EARLY_DATA_DO);
11753
    WOLFSSL_ENTER("DoTls13EndOfEarlyData");
11754
11755
    if ((*inOutIdx - begin) != size)
11756
        return BUFFER_ERROR;
11757
11758
    if (ssl->earlyData == no_early_data) {
11759
        WOLFSSL_MSG("EndOfEarlyData received unexpectedly");
11760
        SendAlert(ssl, alert_fatal, unexpected_message);
11761
        WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
11762
        return OUT_OF_ORDER_E;
11763
    }
11764
11765
    ssl->earlyData = done_early_data;
11766
11767
    /* Always encrypted. */
11768
    *inOutIdx += ssl->keys.padSz;
11769
11770
    ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY);
11771
11772
    WOLFSSL_LEAVE("DoTls13EndOfEarlyData", ret);
11773
    WOLFSSL_END(WC_FUNC_END_OF_EARLY_DATA_DO);
11774
11775
    return ret;
11776
}
11777
#endif /* !NO_WOLFSSL_SERVER */
11778
#endif /* WOLFSSL_EARLY_DATA */
11779
11780
#if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TICKET_NONCE_MALLOC) &&    \
11781
    (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
11782
int SessionTicketNoncePopulate(WOLFSSL_SESSION *session, const byte *nonce,
11783
    byte len)
11784
{
11785
    if (session->ticketNonce.data
11786
            != session->ticketNonce.dataStatic) {
11787
         XFREE(session->ticketNonce.data, session->heap,
11788
             DYNAMIC_TYPE_SESSION_TICK);
11789
         session->ticketNonce.data = session->ticketNonce.dataStatic;
11790
         session->ticketNonce.len = 0;
11791
    }
11792
11793
    if (len > MAX_TICKET_NONCE_STATIC_SZ) {
11794
        WOLFSSL_MSG("Using dynamic nonce buffer");
11795
        session->ticketNonce.data = (byte*)XMALLOC(len,
11796
            session->heap, DYNAMIC_TYPE_SESSION_TICK);
11797
        if (session->ticketNonce.data == NULL)
11798
            return MEMORY_ERROR;
11799
    }
11800
    XMEMCPY(session->ticketNonce.data, nonce, len);
11801
    session->ticketNonce.len = len;
11802
    return 0;
11803
}
11804
#endif
11805
#ifndef NO_WOLFSSL_CLIENT
11806
/* Handle a New Session Ticket handshake message.
11807
 * Message contains the information required to perform resumption.
11808
 *
11809
 * ssl       The SSL/TLS object.
11810
 * input     The message buffer.
11811
 * inOutIdx  On entry, the index into the message buffer of Finished.
11812
 *           On exit, the index of byte after the Finished message and padding.
11813
 * size      The length of the current handshake message.
11814
 * returns 0 on success, otherwise failure.
11815
 */
11816
static int DoTls13NewSessionTicket(WOLFSSL* ssl, const byte* input,
11817
                                   word32* inOutIdx, word32 size)
11818
0
{
11819
#ifdef HAVE_SESSION_TICKET
11820
    int    ret;
11821
    word32 begin = *inOutIdx;
11822
    word32 lifetime;
11823
    word32 ageAdd;
11824
    word16 length;
11825
#ifdef WOLFSSL_32BIT_MILLI_TIME
11826
    word32 now;
11827
#else
11828
    sword64 now;
11829
#endif
11830
    const byte* nonce;
11831
    byte        nonceLength;
11832
11833
    WOLFSSL_START(WC_FUNC_NEW_SESSION_TICKET_DO);
11834
    WOLFSSL_ENTER("DoTls13NewSessionTicket");
11835
11836
    /* Lifetime hint. */
11837
    if ((*inOutIdx - begin) + SESSION_HINT_SZ > size)
11838
        return BUFFER_ERROR;
11839
    ato32(input + *inOutIdx, &lifetime);
11840
    *inOutIdx += SESSION_HINT_SZ;
11841
    if (lifetime > MAX_LIFETIME) {
11842
        WOLFSSL_ERROR_VERBOSE(SERVER_HINT_ERROR);
11843
        return SERVER_HINT_ERROR;
11844
    }
11845
11846
    /* Age add. */
11847
    if ((*inOutIdx - begin) + SESSION_ADD_SZ > size)
11848
        return BUFFER_ERROR;
11849
    ato32(input + *inOutIdx, &ageAdd);
11850
    *inOutIdx += SESSION_ADD_SZ;
11851
11852
    /* Ticket nonce. */
11853
    if ((*inOutIdx - begin) + 1 > size)
11854
        return BUFFER_ERROR;
11855
    nonceLength = input[*inOutIdx];
11856
#if !defined(WOLFSSL_TICKET_NONCE_MALLOC) &&                                   \
11857
    (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
11858
    if (nonceLength > MAX_TICKET_NONCE_STATIC_SZ) {
11859
        WOLFSSL_MSG("Nonce length not supported");
11860
        WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
11861
        return INVALID_PARAMETER;
11862
    }
11863
#endif /* WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3) */
11864
    *inOutIdx += 1;
11865
    if ((*inOutIdx - begin) + nonceLength > size)
11866
        return BUFFER_ERROR;
11867
    nonce = input + *inOutIdx;
11868
    *inOutIdx += nonceLength;
11869
11870
    /* Ticket length. */
11871
    if ((*inOutIdx - begin) + LENGTH_SZ > size)
11872
        return BUFFER_ERROR;
11873
    ato16(input + *inOutIdx, &length);
11874
    *inOutIdx += LENGTH_SZ;
11875
    if ((*inOutIdx - begin) + length > size)
11876
        return BUFFER_ERROR;
11877
11878
    if ((ret = SetTicket(ssl, input + *inOutIdx, length)) != 0)
11879
        return ret;
11880
    *inOutIdx += length;
11881
11882
    now = TimeNowInMilliseconds();
11883
    if (now == 0)
11884
        return GETTIME_ERROR;
11885
    /* Copy in ticket data (server identity). */
11886
    ssl->timeout                  = lifetime;
11887
    ssl->session->timeout         = lifetime;
11888
    ssl->session->cipherSuite0    = ssl->options.cipherSuite0;
11889
    ssl->session->cipherSuite     = ssl->options.cipherSuite;
11890
    ssl->session->ticketSeen      = now;
11891
    ssl->session->ticketAdd       = ageAdd;
11892
    #ifdef WOLFSSL_EARLY_DATA
11893
    ssl->session->maxEarlyDataSz  = ssl->options.maxEarlyDataSz;
11894
    #endif
11895
11896
#if defined(WOLFSSL_TICKET_NONCE_MALLOC) &&                                    \
11897
    (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
11898
    ret = SessionTicketNoncePopulate(ssl->session, nonce, nonceLength);
11899
    if (ret != 0)
11900
        return ret;
11901
#else
11902
    ssl->session->ticketNonce.len = nonceLength;
11903
    if (nonceLength > MAX_TICKET_NONCE_STATIC_SZ) {
11904
        ret = BUFFER_ERROR;
11905
        return ret;
11906
    }
11907
    if (nonceLength > 0)
11908
        XMEMCPY(ssl->session->ticketNonce.data, nonce, nonceLength);
11909
#endif /* defined(WOLFSSL_TICKET_NONCE_MALLOC) && FIPS_VERSION_GE(5,3) */
11910
11911
    ssl->session->namedGroup      = ssl->namedGroup;
11912
11913
    if ((*inOutIdx - begin) + EXTS_SZ > size)
11914
        return BUFFER_ERROR;
11915
    ato16(input + *inOutIdx, &length);
11916
    *inOutIdx += EXTS_SZ;
11917
    if ((*inOutIdx - begin) + length != size)
11918
        return BUFFER_ERROR;
11919
    #ifdef WOLFSSL_EARLY_DATA
11920
    ret = TLSX_Parse(ssl, (byte *)input + (*inOutIdx), length, session_ticket,
11921
                     NULL);
11922
    if (ret != 0)
11923
        return ret;
11924
    #endif
11925
    *inOutIdx += length;
11926
11927
    SetupSession(ssl);
11928
    #ifndef NO_SESSION_CACHE
11929
        AddSession(ssl);
11930
    #endif
11931
11932
    /* Always encrypted. */
11933
    *inOutIdx += ssl->keys.padSz;
11934
11935
    ssl->expect_session_ticket = 0;
11936
#else
11937
0
    (void)ssl;
11938
0
    (void)input;
11939
11940
0
    WOLFSSL_ENTER("DoTls13NewSessionTicket");
11941
11942
0
    *inOutIdx += size + ssl->keys.padSz;
11943
0
#endif /* HAVE_SESSION_TICKET */
11944
11945
0
    WOLFSSL_LEAVE("DoTls13NewSessionTicket", 0);
11946
0
    WOLFSSL_END(WC_FUNC_NEW_SESSION_TICKET_DO);
11947
11948
0
    return 0;
11949
0
}
11950
#endif /* NO_WOLFSSL_CLIENT */
11951
11952
#ifndef NO_WOLFSSL_SERVER
11953
    #ifdef HAVE_SESSION_TICKET
11954
11955
#ifdef WOLFSSL_TLS13_TICKET_BEFORE_FINISHED
11956
/* Offset of the MAC size in the finished message. */
11957
#define FINISHED_MSG_SIZE_OFFSET    3
11958
11959
/* Calculate the resumption secret which includes the unseen client finished
11960
 * message.
11961
 *
11962
 * ssl  The SSL/TLS object.
11963
 * returns 0 on success, otherwise failure.
11964
 */
11965
static int ExpectedResumptionSecret(WOLFSSL* ssl)
11966
{
11967
    int         ret;
11968
    word32      finishedSz = 0;
11969
    byte        mac[WC_MAX_DIGEST_SIZE];
11970
    Digest      digest;
11971
    static byte header[] = { 0x14, 0x00, 0x00, 0x00 };
11972
11973
    /* Copy the running hash so we can restore it after. */
11974
    switch (ssl->specs.mac_algorithm) {
11975
    #ifndef NO_SHA256
11976
        case sha256_mac:
11977
            ret = wc_Sha256Copy(&ssl->hsHashes->hashSha256, &digest.sha256);
11978
            if (ret != 0)
11979
                return ret;
11980
            break;
11981
    #endif
11982
    #ifdef WOLFSSL_SHA384
11983
        case sha384_mac:
11984
            ret = wc_Sha384Copy(&ssl->hsHashes->hashSha384, &digest.sha384);
11985
            if (ret != 0)
11986
                return ret;
11987
            break;
11988
    #endif
11989
    #ifdef WOLFSSL_TLS13_SHA512
11990
        case sha512_mac:
11991
            ret = wc_Sha512Copy(&ssl->hsHashes->hashSha512, &digest.sha512);
11992
            if (ret != 0)
11993
                return ret;
11994
            break;
11995
    #endif
11996
    #ifdef WOLFSSL_SM3
11997
        case sm3_mac:
11998
            ret = wc_Sm3Copy(&ssl->hsHashes->hashSm3, &digest.sm3);
11999
            if (ret != 0)
12000
                return ret;
12001
            break;
12002
    #endif
12003
    }
12004
12005
    /* Generate the Client's Finished message and hash it. */
12006
    ret = BuildTls13HandshakeHmac(ssl, ssl->keys.client_write_MAC_secret, mac,
12007
                                  &finishedSz);
12008
    if (ret != 0)
12009
        return ret;
12010
    header[FINISHED_MSG_SIZE_OFFSET] = finishedSz;
12011
#ifdef WOLFSSL_EARLY_DATA
12012
    if (ssl->earlyData != no_early_data) {
12013
        static byte endOfEarlyData[] = { 0x05, 0x00, 0x00, 0x00 };
12014
        ret = HashRaw(ssl, endOfEarlyData, sizeof(endOfEarlyData));
12015
        if (ret != 0)
12016
            return ret;
12017
    }
12018
#endif
12019
    if ((ret = HashRaw(ssl, header, sizeof(header))) != 0)
12020
        return ret;
12021
    if ((ret = HashRaw(ssl, mac, finishedSz)) != 0)
12022
        return ret;
12023
12024
    if ((ret = DeriveResumptionSecret(ssl, ssl->session->masterSecret)) != 0)
12025
        return ret;
12026
12027
    /* Restore the hash inline with currently seen messages. */
12028
    switch (ssl->specs.mac_algorithm) {
12029
    #ifndef NO_SHA256
12030
        case sha256_mac:
12031
            wc_Sha256Free(&ssl->hsHashes->hashSha256);
12032
            ret = wc_Sha256Copy(&digest.sha256, &ssl->hsHashes->hashSha256);
12033
            wc_Sha256Free(&digest.sha256);
12034
            if (ret != 0)
12035
                return ret;
12036
            break;
12037
    #endif
12038
    #ifdef WOLFSSL_SHA384
12039
        case sha384_mac:
12040
            wc_Sha384Free(&ssl->hsHashes->hashSha384);
12041
            ret = wc_Sha384Copy(&digest.sha384, &ssl->hsHashes->hashSha384);
12042
            wc_Sha384Free(&digest.sha384);
12043
            if (ret != 0)
12044
                return ret;
12045
            break;
12046
    #endif
12047
    #ifdef WOLFSSL_TLS13_SHA512
12048
        case sha512_mac:
12049
            wc_Sha512Free(&ssl->hsHashes->hashSha512);
12050
            ret = wc_Sha512Copy(&digest.sha512, &ssl->hsHashes->hashSha512);
12051
            wc_Sha512Free(&digest.sha512);
12052
            if (ret != 0)
12053
                return ret;
12054
            break;
12055
    #endif
12056
    #ifdef WOLFSSL_SM3
12057
        case sm3_mac:
12058
            wc_Sm3Free(&ssl->hsHashes->hashSm3);
12059
            ret = wc_Sm3Copy(&digest.sm3, &ssl->hsHashes->hashSm3);
12060
            wc_Sm3Free(&digest.sm3);
12061
            if (ret != 0)
12062
                return ret;
12063
            break;
12064
    #endif
12065
    }
12066
12067
    return ret;
12068
}
12069
#endif
12070
12071
/* Send New Session Ticket handshake message.
12072
 * Message contains the information required to perform resumption.
12073
 *
12074
 * ssl  The SSL/TLS object.
12075
 * returns 0 on success, otherwise failure.
12076
 */
12077
static int SendTls13NewSessionTicket(WOLFSSL* ssl)
12078
{
12079
    byte*  output;
12080
    int    ret;
12081
    word32 length;
12082
    int    sendSz;
12083
    word16 extSz;
12084
    word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
12085
12086
    WOLFSSL_START(WC_FUNC_NEW_SESSION_TICKET_SEND);
12087
    WOLFSSL_ENTER("SendTls13NewSessionTicket");
12088
12089
#ifdef WOLFSSL_DTLS13
12090
    if (ssl->options.dtls)
12091
        idx = Dtls13GetRlHeaderLength(ssl, 1) + DTLS_HANDSHAKE_HEADER_SZ;
12092
#endif /* WOLFSSL_DTLS13 */
12093
12094
#ifdef WOLFSSL_TLS13_TICKET_BEFORE_FINISHED
12095
    if (!ssl->msgsReceived.got_finished) {
12096
        if ((ret = ExpectedResumptionSecret(ssl)) != 0)
12097
            return ret;
12098
    }
12099
#endif
12100
12101
    /* Start ticket nonce at 0 and go up to 255. */
12102
    if (ssl->session->ticketNonce.len == 0) {
12103
        ssl->session->ticketNonce.len = DEF_TICKET_NONCE_SZ;
12104
        ssl->session->ticketNonce.data[0] = 0;
12105
    }
12106
    else
12107
    #ifdef WOLFSSL_ASYNC_CRYPT
12108
        if (ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E))
12109
    #endif
12110
    {
12111
            ssl->session->ticketNonce.data[0]++;
12112
    }
12113
12114
    if ((ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0) {
12115
        /* In this case we only send the ID as the ticket. Let's generate a new
12116
         * ID for the new ticket so that we don't overwrite any old ones */
12117
        ret = wc_RNG_GenerateBlock(ssl->rng, ssl->session->altSessionID,
12118
                                   ID_LEN);
12119
        if (ret != 0)
12120
            return ret;
12121
        ssl->session->haveAltSessionID = 1;
12122
    }
12123
12124
    if (!ssl->options.noTicketTls13) {
12125
        if ((ret = SetupTicket(ssl)) != 0)
12126
            return ret;
12127
        /* No need to create the ticket if we only send the ID */
12128
        if ((ssl->options.mask & WOLFSSL_OP_NO_TICKET) == 0) {
12129
            if ((ret = CreateTicket(ssl)) != 0)
12130
                return ret;
12131
        }
12132
    }
12133
12134
#ifdef WOLFSSL_EARLY_DATA
12135
    ssl->session->maxEarlyDataSz = ssl->options.maxEarlyDataSz;
12136
    if (ssl->session->maxEarlyDataSz > 0)
12137
        TLSX_EarlyData_Use(ssl, ssl->session->maxEarlyDataSz, 1);
12138
    extSz = 0;
12139
    ret = TLSX_GetResponseSize(ssl, session_ticket, &extSz);
12140
    if (ret != 0)
12141
        return ret;
12142
#else
12143
    extSz = EXTS_SZ;
12144
#endif
12145
    /* Lifetime | Age Add | Ticket session ID | Extensions */
12146
    length = SESSION_HINT_SZ + SESSION_ADD_SZ + LENGTH_SZ;
12147
    if ((ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0)
12148
        length += ID_LEN + extSz;
12149
    else
12150
        length += ssl->session->ticketLen + extSz;
12151
    /* Nonce */
12152
    length += TICKET_NONCE_LEN_SZ + DEF_TICKET_NONCE_SZ;
12153
12154
    sendSz = (word16)(idx + length + MAX_MSG_EXTRA);
12155
12156
    /* Check buffers are big enough and grow if needed. */
12157
    if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
12158
        return ret;
12159
12160
    /* Get position in output buffer to write new message to. */
12161
    output = GetOutputBuffer(ssl);
12162
12163
    /* Put the record and handshake headers on. */
12164
    AddTls13Headers(output, length, session_ticket, ssl);
12165
12166
    /* Lifetime hint */
12167
    c32toa(ssl->ctx->ticketHint, output + idx);
12168
    idx += SESSION_HINT_SZ;
12169
    /* Age add - obfuscator */
12170
    c32toa(ssl->session->ticketAdd, output + idx);
12171
    idx += SESSION_ADD_SZ;
12172
12173
    output[idx++] = ssl->session->ticketNonce.len;
12174
    output[idx++] = ssl->session->ticketNonce.data[0];
12175
12176
    /* length */
12177
    if ((ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0) {
12178
        c16toa(ID_LEN, output + idx);
12179
    }
12180
    else {
12181
        c16toa(ssl->session->ticketLen, output + idx);
12182
    }
12183
12184
    idx += LENGTH_SZ;
12185
    /* ticket */
12186
    if ((ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0) {
12187
        if (ssl->session->haveAltSessionID)
12188
            XMEMCPY(output + idx, ssl->session->altSessionID, ID_LEN);
12189
        else
12190
            return BAD_FUNC_ARG; /* Should not happen */
12191
        idx += ID_LEN;
12192
    }
12193
    else {
12194
        XMEMCPY(output + idx, ssl->session->ticket, ssl->session->ticketLen);
12195
        idx += ssl->session->ticketLen;
12196
    }
12197
12198
#ifdef WOLFSSL_EARLY_DATA
12199
    extSz = 0;
12200
    ret = TLSX_WriteResponse(ssl, output + idx, session_ticket, &extSz);
12201
    if (ret != 0)
12202
        return ret;
12203
    idx += extSz;
12204
#else
12205
    /* No extension support - empty extensions. */
12206
    c16toa(0, output + idx);
12207
    idx += EXTS_SZ;
12208
#endif
12209
12210
    if (idx > WOLFSSL_MAX_16BIT) {
12211
        return BAD_LENGTH_E;
12212
    }
12213
12214
    ssl->options.haveSessionId = 1;
12215
12216
    SetupSession(ssl);
12217
    /* Only add to cache when support built in and when the ticket contains
12218
     * an ID. Otherwise we have no way to actually retrieve the ticket from the
12219
     * cache. */
12220
#if !defined(NO_SESSION_CACHE) && defined(WOLFSSL_TICKET_HAVE_ID)
12221
    AddSession(ssl);
12222
#endif
12223
12224
#ifdef WOLFSSL_DTLS13
12225
    if (ssl->options.dtls)
12226
        return Dtls13HandshakeSend(ssl, output, (word16)sendSz,
12227
                                   (word16)idx, session_ticket, 0);
12228
#endif /* WOLFSSL_DTLS13 */
12229
12230
    /* This message is always encrypted. */
12231
    sendSz = BuildTls13Message(ssl, output, sendSz,
12232
                               output + RECORD_HEADER_SZ,
12233
                               (word16)idx - RECORD_HEADER_SZ,
12234
                               handshake, 0, 0, 0);
12235
    if (sendSz < 0)
12236
        return sendSz;
12237
12238
    ssl->buffers.outputBuffer.length += sendSz;
12239
12240
    /* Always send as this is either directly after server's Finished or only
12241
     * message after client's Finished.
12242
     */
12243
    ret = SendBuffered(ssl);
12244
12245
    WOLFSSL_LEAVE("SendTls13NewSessionTicket", 0);
12246
    WOLFSSL_END(WC_FUNC_NEW_SESSION_TICKET_SEND);
12247
12248
    return ret;
12249
}
12250
    #endif /* HAVE_SESSION_TICKET */
12251
#endif /* NO_WOLFSSL_SERVER */
12252
12253
/* Make sure no duplicates, no fast forward, or other problems
12254
 *
12255
 * ssl   The SSL/TLS object.
12256
 * type  Type of handshake message received.
12257
 * returns 0 on success, otherwise failure.
12258
 */
12259
static int SanityCheckTls13MsgReceived(WOLFSSL* ssl, byte type)
12260
0
{
12261
    /* verify not a duplicate, mark received, check state */
12262
0
    switch (type) {
12263
12264
0
#ifndef NO_WOLFSSL_SERVER
12265
0
        case client_hello:
12266
0
        #ifndef NO_WOLFSSL_CLIENT
12267
            /* Only valid when received on SERVER side. */
12268
0
            if (ssl->options.side == WOLFSSL_CLIENT_END) {
12269
0
                WOLFSSL_MSG("ClientHello received by client");
12270
0
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
12271
0
                return SIDE_ERROR;
12272
0
            }
12273
0
        #endif
12274
            /* Check state. */
12275
0
            if (ssl->options.clientState >= CLIENT_HELLO_COMPLETE) {
12276
0
                WOLFSSL_MSG("ClientHello received out of order");
12277
0
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12278
0
                return OUT_OF_ORDER_E;
12279
0
            }
12280
            /* Check previously seen. */
12281
            /* Initial and after HelloRetryRequest - no more than 2. */
12282
0
            if (ssl->msgsReceived.got_client_hello == 2) {
12283
0
                WOLFSSL_MSG("Too many ClientHello received");
12284
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
12285
0
                return DUPLICATE_MSG_E;
12286
0
            }
12287
            /* Second only after HelloRetryRequest seen. */
12288
0
            if (ssl->msgsReceived.got_client_hello == 1 &&
12289
0
                ssl->options.serverState !=
12290
0
                                          SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
12291
0
                WOLFSSL_MSG("Duplicate ClientHello received");
12292
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
12293
0
                return DUPLICATE_MSG_E;
12294
0
            }
12295
0
            ssl->msgsReceived.got_client_hello++;
12296
12297
0
            break;
12298
0
#endif
12299
12300
0
#ifndef NO_WOLFSSL_CLIENT
12301
0
        case server_hello:
12302
0
        #ifndef NO_WOLFSSL_SERVER
12303
            /* Only valid when received on CLIENT side. */
12304
0
            if (ssl->options.side == WOLFSSL_SERVER_END) {
12305
0
                WOLFSSL_MSG("ServerHello received by server");
12306
0
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
12307
0
                return SIDE_ERROR;
12308
0
            }
12309
0
        #endif
12310
            /* Check state. */
12311
0
            if (ssl->options.serverState >= SERVER_HELLO_COMPLETE) {
12312
0
                WOLFSSL_MSG("ServerHello received out of order");
12313
0
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12314
0
                return OUT_OF_ORDER_E;
12315
0
            }
12316
            /* Check previously seen. */
12317
            /* Only once after ClientHello.
12318
             * HelloRetryRequest has ServerHello type but count fixed up later
12319
             * - see DoTls13ServerHello().
12320
             */
12321
0
            if (ssl->msgsReceived.got_server_hello) {
12322
0
                WOLFSSL_MSG("Duplicate ServerHello received");
12323
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
12324
0
                return DUPLICATE_MSG_E;
12325
0
            }
12326
0
            ssl->msgsReceived.got_server_hello = 1;
12327
12328
0
            break;
12329
0
#endif
12330
12331
0
#ifndef NO_WOLFSSL_CLIENT
12332
0
        case session_ticket:
12333
0
        #ifndef NO_WOLFSSL_SERVER
12334
            /* Only valid when received on CLIENT side. */
12335
0
            if (ssl->options.side == WOLFSSL_SERVER_END) {
12336
0
                WOLFSSL_MSG("NewSessionTicket received by server");
12337
0
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
12338
0
                return SIDE_ERROR;
12339
0
            }
12340
0
        #endif
12341
            /* Check state. */
12342
        #ifdef WOLFSSL_TLS13_TICKET_BEFORE_FINISHED
12343
            /* Only allowed after server's Finished message. */
12344
            if (ssl->options.serverState < SERVER_FINISHED_COMPLETE) {
12345
                WOLFSSL_MSG("NewSessionTicket received out of order");
12346
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12347
                return OUT_OF_ORDER_E;
12348
            }
12349
        #else
12350
            /* Only allowed after client's Finished message. */
12351
0
            if (ssl->options.clientState < CLIENT_FINISHED_COMPLETE) {
12352
0
                WOLFSSL_MSG("NewSessionTicket received out of order");
12353
0
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12354
0
                return OUT_OF_ORDER_E;
12355
0
            }
12356
0
        #endif
12357
            /* Many SessionTickets can be sent. */
12358
0
            ssl->msgsReceived.got_session_ticket = 1;
12359
12360
0
            break;
12361
0
#endif
12362
12363
0
#ifndef NO_WOLFSSL_SERVER
12364
    #ifdef WOLFSSL_EARLY_DATA
12365
        case end_of_early_data:
12366
        #ifndef NO_WOLFSSL_CLIENT
12367
            /* Only valid when received on SERVER side. */
12368
            if (ssl->options.side == WOLFSSL_CLIENT_END) {
12369
                WOLFSSL_MSG("EndOfEarlyData received by client");
12370
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
12371
                return SIDE_ERROR;
12372
            }
12373
        #endif
12374
            /* Check state. */
12375
            /* Only after server's Finished and before client's Finished. */
12376
            if (ssl->options.serverState < SERVER_FINISHED_COMPLETE) {
12377
                WOLFSSL_MSG("EndOfEarlyData received out of order");
12378
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12379
                return OUT_OF_ORDER_E;
12380
            }
12381
            if (ssl->options.clientState >= CLIENT_FINISHED_COMPLETE) {
12382
                WOLFSSL_MSG("EndOfEarlyData received out of order");
12383
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12384
                return OUT_OF_ORDER_E;
12385
            }
12386
            /* Check previously seen. */
12387
            if (ssl->msgsReceived.got_end_of_early_data) {
12388
                WOLFSSL_MSG("Too many EndOfEarlyData received");
12389
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
12390
                return DUPLICATE_MSG_E;
12391
            }
12392
            ssl->msgsReceived.got_end_of_early_data = 1;
12393
12394
            break;
12395
    #endif
12396
0
#endif
12397
12398
0
#ifndef NO_WOLFSSL_CLIENT
12399
0
        case encrypted_extensions:
12400
0
        #ifndef NO_WOLFSSL_SERVER
12401
            /* Only valid when received on CLIENT side. */
12402
0
            if (ssl->options.side == WOLFSSL_SERVER_END) {
12403
0
                WOLFSSL_MSG("EncryptedExtensions received by server");
12404
0
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
12405
0
                return SIDE_ERROR;
12406
0
            }
12407
0
        #endif
12408
            /* Check state. */
12409
            /* Must be received directly after ServerHello.
12410
             * DoTls13EncryptedExtensions() changes state to:
12411
             *   SERVER_ENCRYPTED_EXTENSIONS_COMPLETE.
12412
             */
12413
0
            if (ssl->options.serverState != SERVER_HELLO_COMPLETE) {
12414
0
                WOLFSSL_MSG("EncryptedExtensions received out of order");
12415
0
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12416
0
                return OUT_OF_ORDER_E;
12417
0
            }
12418
            /* Check previously seen. */
12419
0
            if (ssl->msgsReceived.got_encrypted_extensions) {
12420
0
                WOLFSSL_MSG("Duplicate EncryptedExtensions received");
12421
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
12422
0
                return DUPLICATE_MSG_E;
12423
0
            }
12424
0
            ssl->msgsReceived.got_encrypted_extensions = 1;
12425
12426
0
            break;
12427
0
#endif
12428
12429
0
        case certificate:
12430
            /* Valid on both sides. */
12431
0
    #ifndef NO_WOLFSSL_CLIENT
12432
            /* Check state. */
12433
            /* On client, seen after EncryptedExtension and CertificateRequest
12434
             * (if sent) and before CertificateVerify and Finished.
12435
             * DoTls13Certificate() sets serverState to SERVER_CERT_COMPLETE.
12436
             */
12437
0
            if (ssl->options.side == WOLFSSL_CLIENT_END &&
12438
0
                ssl->options.serverState !=
12439
0
                                         SERVER_ENCRYPTED_EXTENSIONS_COMPLETE) {
12440
0
                WOLFSSL_MSG("Certificate received out of order - Client");
12441
0
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12442
0
                return OUT_OF_ORDER_E;
12443
0
            }
12444
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12445
            /* Server's authenticating with PSK must not send this. */
12446
            if (ssl->options.side == WOLFSSL_CLIENT_END &&
12447
                             ssl->options.serverState == SERVER_CERT_COMPLETE &&
12448
                             ssl->options.pskNegotiated) {
12449
                WOLFSSL_MSG("Certificate received while using PSK");
12450
                WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12451
                return SANITY_MSG_E;
12452
            }
12453
        #endif
12454
0
    #endif
12455
0
    #ifndef NO_WOLFSSL_SERVER
12456
            /* Check state. */
12457
            /* On Server, valid after ClientHello received and ServerFinished
12458
             * sent. */
12459
0
            if (ssl->options.side == WOLFSSL_SERVER_END &&
12460
0
                ssl->options.clientState != CLIENT_HELLO_COMPLETE &&
12461
0
                ssl->options.serverState < SERVER_FINISHED_COMPLETE) {
12462
0
                WOLFSSL_MSG("Certificate received out of order - Server");
12463
0
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12464
0
                return OUT_OF_ORDER_E;
12465
0
            }
12466
0
    #endif
12467
            /* Check previously seen. */
12468
0
            if (ssl->msgsReceived.got_certificate) {
12469
0
                WOLFSSL_MSG("Duplicate Certificate received");
12470
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
12471
0
                return DUPLICATE_MSG_E;
12472
0
            }
12473
0
            ssl->msgsReceived.got_certificate = 1;
12474
12475
0
            break;
12476
12477
0
#ifndef NO_WOLFSSL_CLIENT
12478
0
        case certificate_request:
12479
0
        #ifndef NO_WOLFSSL_SERVER
12480
            /* Only valid when received on CLIENT side. */
12481
0
            if (ssl->options.side == WOLFSSL_SERVER_END) {
12482
0
                WOLFSSL_MSG("CertificateRequest received by server");
12483
0
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
12484
0
                return SIDE_ERROR;
12485
0
            }
12486
0
        #endif
12487
            /* Check state. */
12488
0
        #ifndef WOLFSSL_POST_HANDSHAKE_AUTH
12489
            /* Only valid when sent after EncryptedExtensions and before
12490
             * Certificate. */
12491
0
            if (ssl->options.serverState !=
12492
0
                                         SERVER_ENCRYPTED_EXTENSIONS_COMPLETE) {
12493
0
                WOLFSSL_MSG("CertificateRequest received out of order");
12494
0
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12495
0
                return OUT_OF_ORDER_E;
12496
0
            }
12497
        #else
12498
            /* Valid when sent after EncryptedExtensions and before Certificate
12499
             * and after both client and server have sent Finished (Post
12500
             * Handshake Authentication). */
12501
            if (ssl->options.serverState !=
12502
                                         SERVER_ENCRYPTED_EXTENSIONS_COMPLETE &&
12503
                       (ssl->options.serverState < SERVER_FINISHED_COMPLETE ||
12504
                        ssl->options.clientState != CLIENT_FINISHED_COMPLETE)) {
12505
                WOLFSSL_MSG("CertificateRequest received out of order");
12506
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12507
                return OUT_OF_ORDER_E;
12508
            }
12509
        #endif
12510
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12511
            /* Server's authenticating with PSK must not send this. */
12512
            if (ssl->options.pskNegotiated) {
12513
                WOLFSSL_MSG("CertificateRequest received while using PSK");
12514
                WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12515
                return SANITY_MSG_E;
12516
            }
12517
        #endif
12518
            /* Check previously seen. */
12519
0
        #ifndef WOLFSSL_POST_HANDSHAKE_AUTH
12520
            /* Only once during handshake. */
12521
0
            if (ssl->msgsReceived.got_certificate_request) {
12522
0
                WOLFSSL_MSG("Duplicate CertificateRequest received");
12523
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
12524
0
                return DUPLICATE_MSG_E;
12525
0
            }
12526
        #else
12527
            /* Only once during handshake. */
12528
            if (ssl->msgsReceived.got_certificate_request &&
12529
                ssl->options.clientState != CLIENT_FINISHED_COMPLETE) {
12530
                WOLFSSL_MSG("Duplicate CertificateRequest received");
12531
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
12532
                return DUPLICATE_MSG_E;
12533
            }
12534
        #endif
12535
0
            ssl->msgsReceived.got_certificate_request = 1;
12536
12537
0
            break;
12538
0
#endif
12539
12540
0
        case certificate_verify:
12541
            /* Valid on both sides. */
12542
0
    #ifndef NO_WOLFSSL_CLIENT
12543
            /* Check state on client.
12544
             * Valid only directly after a Certificate message. */
12545
0
            if (ssl->options.side == WOLFSSL_CLIENT_END) {
12546
0
                if (ssl->options.serverState != SERVER_CERT_COMPLETE) {
12547
0
                    WOLFSSL_MSG("No Cert before CertVerify");
12548
0
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12549
0
                    return OUT_OF_ORDER_E;
12550
0
                }
12551
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12552
                /* Server's authenticating with PSK must not send this. */
12553
                if (ssl->options.pskNegotiated) {
12554
                    WOLFSSL_MSG("CertificateVerify received while using PSK");
12555
                    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12556
                    return SANITY_MSG_E;
12557
                }
12558
            #endif
12559
0
            }
12560
0
    #endif
12561
0
    #ifndef NO_WOLFSSL_SERVER
12562
            /* Check state on server. */
12563
0
            if (ssl->options.side == WOLFSSL_SERVER_END) {
12564
                /* Server must have sent Finished message. */
12565
0
                if (ssl->options.serverState < SERVER_FINISHED_COMPLETE) {
12566
0
                    WOLFSSL_MSG("CertificateVerify received out of order");
12567
0
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12568
0
                    return OUT_OF_ORDER_E;
12569
0
                }
12570
                /* Valid only directly after a Certificate message. */
12571
0
                if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
12572
0
                    WOLFSSL_MSG("CertificateVerify before ClientHello done");
12573
0
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12574
0
                    return OUT_OF_ORDER_E;
12575
0
                }
12576
0
                if (!ssl->msgsReceived.got_certificate) {
12577
0
                    WOLFSSL_MSG("No Cert before CertificateVerify");
12578
0
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12579
0
                    return OUT_OF_ORDER_E;
12580
0
                }
12581
0
            }
12582
0
    #endif
12583
            /* Check previously seen. */
12584
0
            if (ssl->msgsReceived.got_certificate_verify) {
12585
0
                WOLFSSL_MSG("Duplicate CertificateVerify received");
12586
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
12587
0
                return DUPLICATE_MSG_E;
12588
0
            }
12589
0
            ssl->msgsReceived.got_certificate_verify = 1;
12590
12591
0
            break;
12592
12593
0
        case finished:
12594
            /* Valid on both sides. */
12595
0
        #ifndef NO_WOLFSSL_CLIENT
12596
            /* Check state on client. */
12597
0
            if (ssl->options.side == WOLFSSL_CLIENT_END) {
12598
                /* After sending ClientHello */
12599
0
                if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
12600
0
                    WOLFSSL_MSG("Finished received out of order - clientState");
12601
0
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12602
0
                    return OUT_OF_ORDER_E;
12603
0
                }
12604
                /* Must have seen certificate and verify from server except when
12605
                 * using PSK. */
12606
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12607
                if (ssl->options.pskNegotiated) {
12608
                    if (ssl->options.serverState !=
12609
                                         SERVER_ENCRYPTED_EXTENSIONS_COMPLETE) {
12610
                        WOLFSSL_MSG("Finished received out of order - PSK");
12611
                        WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12612
                        return OUT_OF_ORDER_E;
12613
                    }
12614
                }
12615
                else
12616
            #endif
12617
0
                if (ssl->options.serverState != SERVER_CERT_VERIFY_COMPLETE) {
12618
0
                    WOLFSSL_MSG("Finished received out of order - serverState");
12619
0
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12620
0
                    return OUT_OF_ORDER_E;
12621
0
                }
12622
0
            }
12623
0
        #endif
12624
0
        #ifndef NO_WOLFSSL_SERVER
12625
            /* Check state on server. */
12626
0
            if (ssl->options.side == WOLFSSL_SERVER_END) {
12627
0
                if (ssl->options.serverState < SERVER_FINISHED_COMPLETE) {
12628
0
                    WOLFSSL_MSG("Finished received out of order - serverState");
12629
0
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12630
0
                    return OUT_OF_ORDER_E;
12631
0
                }
12632
0
                if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
12633
0
                    WOLFSSL_MSG("Finished received out of order - clientState");
12634
0
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12635
0
                    return OUT_OF_ORDER_E;
12636
0
                }
12637
            #ifdef WOLFSSL_EARLY_DATA
12638
                if (ssl->earlyData == process_early_data &&
12639
                    /* early data may be lost when using DTLS */
12640
                    !ssl->options.dtls
12641
                    /* QUIC does not use EndOfEarlyData records */
12642
                    && !WOLFSSL_IS_QUIC(ssl)) {
12643
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12644
                    return OUT_OF_ORDER_E;
12645
                }
12646
            #endif
12647
0
            }
12648
0
        #endif
12649
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12650
            if (!ssl->options.pskNegotiated)
12651
        #endif
12652
0
            {
12653
                /* Must have received a Certificate message from client if
12654
                 * verifying the peer. Empty certificate message indicates
12655
                 * no certificate available.
12656
                 */
12657
0
                if (ssl->options.verifyPeer &&
12658
                #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
12659
                    !ssl->options.verifyPostHandshake &&
12660
                #endif
12661
0
                                           !ssl->msgsReceived.got_certificate) {
12662
0
                    WOLFSSL_MSG("Finished received out of order - "
12663
0
                                "missing Certificate message");
12664
0
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12665
0
                    return OUT_OF_ORDER_E;
12666
0
                }
12667
                /* Mutual authentication on server requires a certificate from
12668
                 * peer. Verify peer set on client side requires a certificate
12669
                 * from peer as not doing PSK.
12670
                 */
12671
0
                if ((ssl->options.mutualAuth ||
12672
0
                    (ssl->options.side == WOLFSSL_CLIENT_END &&
12673
0
                     ssl->options.verifyPeer)) && !ssl->options.havePeerCert) {
12674
0
                    WOLFSSL_MSG("Finished received out of order - "
12675
0
                                "no valid certificate");
12676
0
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12677
0
                    return OUT_OF_ORDER_E;
12678
0
                }
12679
                /* Must have received a valid CertificateVerify if verifying
12680
                 * peer and got a peer certificate.
12681
                 */
12682
0
                if ((ssl->options.mutualAuth || ssl->options.verifyPeer) &&
12683
0
                    ssl->options.havePeerCert && !ssl->options.havePeerVerify) {
12684
0
                    WOLFSSL_MSG("Finished received out of order - "
12685
0
                                "Certificate message but no CertificateVerify");
12686
0
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12687
0
                    return OUT_OF_ORDER_E;
12688
0
                }
12689
0
            }
12690
            /* Check previously seen. */
12691
0
            if (ssl->msgsReceived.got_finished) {
12692
0
                WOLFSSL_MSG("Duplicate Finished received");
12693
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
12694
0
                return DUPLICATE_MSG_E;
12695
0
            }
12696
0
            ssl->msgsReceived.got_finished = 1;
12697
12698
0
            break;
12699
12700
0
        case key_update:
12701
            /* Valid on both sides. */
12702
            /* Check state.
12703
             * Client and server must have received finished message from other
12704
             * side.
12705
             */
12706
0
            if (!ssl->msgsReceived.got_finished) {
12707
0
                WOLFSSL_MSG("No KeyUpdate before Finished");
12708
0
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12709
0
                return OUT_OF_ORDER_E;
12710
0
            }
12711
            /* Multiple KeyUpdates can be sent. */
12712
0
            break;
12713
#if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_NO_TLS12)
12714
        case hello_verify_request:
12715
            if (!ssl->options.dtls) {
12716
                WOLFSSL_MSG("HelloVerifyRequest when not in DTLS");
12717
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12718
                return OUT_OF_ORDER_E;
12719
            }
12720
            if (ssl->msgsReceived.got_hello_verify_request) {
12721
                WOLFSSL_MSG("Duplicate HelloVerifyRequest received");
12722
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
12723
                return DUPLICATE_MSG_E;
12724
            }
12725
            ssl->msgsReceived.got_hello_verify_request = 1;
12726
            if (ssl->msgsReceived.got_hello_retry_request) {
12727
                WOLFSSL_MSG(
12728
                    "Both HelloVerifyRequest and HelloRetryRequest received");
12729
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
12730
                return DUPLICATE_MSG_E;
12731
            }
12732
            if (ssl->options.serverState >=
12733
                    SERVER_HELLO_RETRY_REQUEST_COMPLETE ||
12734
                ssl->options.connectState != CLIENT_HELLO_SENT) {
12735
                WOLFSSL_MSG("HelloVerifyRequest received out of order");
12736
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12737
                return OUT_OF_ORDER_E;
12738
            }
12739
            if (ssl->options.side == WOLFSSL_SERVER_END) {
12740
                WOLFSSL_MSG("HelloVerifyRequest received on the server");
12741
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
12742
                return SIDE_ERROR;
12743
            }
12744
            if (!ssl->options.downgrade ||
12745
                ssl->options.minDowngrade < DTLSv1_2_MINOR) {
12746
                WOLFSSL_MSG(
12747
                    "HelloVerifyRequest received but not DTLSv1.2 allowed");
12748
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
12749
                return VERSION_ERROR;
12750
            }
12751
            break;
12752
#endif /* WOLFSSL_DTLS13 && !WOLFSSL_NO_TLS12*/
12753
12754
0
        default:
12755
0
            WOLFSSL_MSG("Unknown message type");
12756
0
            WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12757
0
            return SANITY_MSG_E;
12758
0
    }
12759
12760
0
    return 0;
12761
0
}
12762
12763
/* Handle a type of handshake message that has been received.
12764
 *
12765
 * ssl       The SSL/TLS object.
12766
 * input     The message buffer.
12767
 * inOutIdx  On entry, the index into the buffer of the current message.
12768
 *           On exit, the index into the buffer of the next message.
12769
 * size      The length of the current handshake message.
12770
 * totalSz   Length of remaining data in the message buffer.
12771
 * returns 0 on success and otherwise failure.
12772
 */
12773
int DoTls13HandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx,
12774
                            byte type, word32 size, word32 totalSz)
12775
{
12776
    int ret = 0, tmp;
12777
    word32 inIdx = *inOutIdx;
12778
    int alertType;
12779
#if defined(HAVE_ECH) && !defined(NO_WOLFSSL_SERVER)
12780
    TLSX* echX = NULL;
12781
    word32 echInOutIdx;
12782
#endif
12783
12784
    (void)totalSz;
12785
12786
    WOLFSSL_ENTER("DoTls13HandShakeMsgType");
12787
12788
    /* make sure we can read the message */
12789
    if (*inOutIdx + size > totalSz)
12790
        return INCOMPLETE_DATA;
12791
12792
    /* sanity check msg received */
12793
    if ((ret = SanityCheckTls13MsgReceived(ssl, type)) != 0) {
12794
        WOLFSSL_MSG("Sanity Check on handshake message type received failed");
12795
        if (ret == WC_NO_ERR_TRACE(VERSION_ERROR))
12796
            SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
12797
        else
12798
            SendAlert(ssl, alert_fatal, unexpected_message);
12799
        return ret;
12800
    }
12801
12802
#if defined(WOLFSSL_CALLBACKS)
12803
    /* add name later, add on record and handshake header part back on */
12804
    if (ssl->toInfoOn) {
12805
        ret = AddPacketInfo(ssl, 0, handshake, input + *inOutIdx -
12806
            HANDSHAKE_HEADER_SZ, size + HANDSHAKE_HEADER_SZ, READ_PROTO,
12807
            RECORD_HEADER_SZ, ssl->heap);
12808
        if (ret != 0)
12809
            return ret;
12810
        AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
12811
    }
12812
#endif
12813
12814
    if (ssl->options.handShakeState == HANDSHAKE_DONE &&
12815
            type != session_ticket && type != certificate_request &&
12816
            type != certificate && type != key_update && type != finished) {
12817
        WOLFSSL_MSG("HandShake message after handshake complete");
12818
        SendAlert(ssl, alert_fatal, unexpected_message);
12819
        WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12820
        return OUT_OF_ORDER_E;
12821
    }
12822
12823
    if (ssl->options.side == WOLFSSL_CLIENT_END &&
12824
               ssl->options.serverState == NULL_STATE &&
12825
               type != server_hello && type != hello_retry_request
12826
#if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_NO_TLS12)
12827
        && (!ssl->options.dtls || type != hello_verify_request)
12828
#endif /* defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_NO_TLS12) */
12829
        ) {
12830
        WOLFSSL_MSG("First server message not server hello");
12831
        SendAlert(ssl, alert_fatal, unexpected_message);
12832
        WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12833
        return OUT_OF_ORDER_E;
12834
    }
12835
12836
    if (ssl->options.side == WOLFSSL_SERVER_END &&
12837
               ssl->options.clientState == NULL_STATE && type != client_hello) {
12838
        WOLFSSL_MSG("First client message not client hello");
12839
        SendAlert(ssl, alert_fatal, unexpected_message);
12840
        WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
12841
        return OUT_OF_ORDER_E;
12842
    }
12843
12844
    /* above checks handshake state */
12845
    switch (type) {
12846
#ifndef NO_WOLFSSL_CLIENT
12847
    /* Messages only received by client. */
12848
    case server_hello:
12849
        WOLFSSL_MSG("processing server hello");
12850
        ret = DoTls13ServerHello(ssl, input, inOutIdx, size, &type);
12851
    #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
12852
               ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
12853
                (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
12854
        if (ssl->options.resuming || !IsAtLeastTLSv1_2(ssl) ||
12855
                                               IsAtLeastTLSv1_3(ssl->version)) {
12856
            ssl->options.cacheMessages = 0;
12857
            if ((ssl->hsHashes != NULL) && (ssl->hsHashes->messages != NULL)) {
12858
                ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
12859
                XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
12860
                ssl->hsHashes->messages = NULL;
12861
            }
12862
        }
12863
    #endif
12864
        break;
12865
12866
    case encrypted_extensions:
12867
        WOLFSSL_MSG("processing encrypted extensions");
12868
        ret = DoTls13EncryptedExtensions(ssl, input, inOutIdx, size);
12869
        break;
12870
12871
    #ifndef NO_CERTS
12872
    case certificate_request:
12873
        WOLFSSL_MSG("processing certificate request");
12874
        ret = DoTls13CertificateRequest(ssl, input, inOutIdx, size);
12875
        break;
12876
    #endif
12877
12878
    case session_ticket:
12879
        WOLFSSL_MSG("processing new session ticket");
12880
        ret = DoTls13NewSessionTicket(ssl, input, inOutIdx, size);
12881
        break;
12882
#endif /* !NO_WOLFSSL_CLIENT */
12883
12884
#ifndef NO_WOLFSSL_SERVER
12885
    /* Messages only received by server. */
12886
    case client_hello:
12887
        WOLFSSL_MSG("processing client hello");
12888
#if defined(HAVE_ECH)
12889
        /* keep the start idx so we can restore it for the inner call */
12890
        echInOutIdx = *inOutIdx;
12891
#endif
12892
        ret = DoTls13ClientHello(ssl, input, inOutIdx, size);
12893
    #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
12894
               ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
12895
                (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
12896
        if ((ssl->options.resuming || !ssl->options.verifyPeer ||
12897
               !IsAtLeastTLSv1_2(ssl) || IsAtLeastTLSv1_3(ssl->version))
12898
        #ifdef WOLFSSL_DTLS13
12899
               && (!ssl->options.dtls)
12900
        #endif
12901
               ) {
12902
        #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
12903
            if (ret != WC_NO_ERR_TRACE(WC_PENDING_E) &&
12904
                ret != WC_NO_ERR_TRACE(OCSP_WANT_READ))
12905
        #endif
12906
            {
12907
                ssl->options.cacheMessages = 0;
12908
                if ((ssl->hsHashes != NULL) &&
12909
                        (ssl->hsHashes->messages != NULL)) {
12910
                    ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
12911
                    XFREE(ssl->hsHashes->messages, ssl->heap,
12912
                        DYNAMIC_TYPE_HASHES);
12913
                    ssl->hsHashes->messages = NULL;
12914
                }
12915
            }
12916
        }
12917
    #endif
12918
#if defined(HAVE_ECH)
12919
        if (ret == 0) {
12920
            echX = TLSX_Find(ssl->extensions, TLSX_ECH);
12921
12922
            if (echX != NULL &&
12923
                ((WOLFSSL_ECH*)echX->data)->state == ECH_WRITE_NONE) {
12924
                /* reset the inOutIdx to the outer start */
12925
                *inOutIdx = echInOutIdx;
12926
                /* call again with the inner hello */
12927
                if (ret == 0) {
12928
                    ret = DoTls13ClientHello(ssl,
12929
                        ((WOLFSSL_ECH*)echX->data)->innerClientHello,
12930
                        &echInOutIdx,
12931
                        ((WOLFSSL_ECH*)echX->data)->innerClientHelloLen);
12932
                }
12933
                /* if the inner ech parsed successfully we have successfully
12934
                 * handled the hello and can skip the whole message */
12935
                if (ret == 0)
12936
                    *inOutIdx += size;
12937
            }
12938
        }
12939
#endif /* HAVE_ECH */
12940
        break;
12941
12942
    #ifdef WOLFSSL_EARLY_DATA
12943
    case end_of_early_data:
12944
        WOLFSSL_MSG("processing end of early data");
12945
        ret = DoTls13EndOfEarlyData(ssl, input, inOutIdx, size);
12946
        break;
12947
    #endif
12948
#endif /* !NO_WOLFSSL_SERVER */
12949
12950
    /* Messages received by both client and server. */
12951
#if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \
12952
                           !defined(WOLFSSL_NO_CLIENT_AUTH))
12953
    case certificate:
12954
        WOLFSSL_MSG("processing certificate");
12955
        ret = DoTls13Certificate(ssl, input, inOutIdx, size);
12956
        break;
12957
#endif
12958
12959
#if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
12960
    defined(HAVE_ED448) || defined(HAVE_FALCON) || defined(HAVE_DILITHIUM)
12961
    case certificate_verify:
12962
        WOLFSSL_MSG("processing certificate verify");
12963
        ret = DoTls13CertificateVerify(ssl, input, inOutIdx, size);
12964
        break;
12965
#endif
12966
    case finished:
12967
        WOLFSSL_MSG("processing finished");
12968
        ret = DoTls13Finished(ssl, input, inOutIdx, size, totalSz, NO_SNIFF);
12969
        break;
12970
12971
    case key_update:
12972
        WOLFSSL_MSG("processing key update");
12973
        ret = DoTls13KeyUpdate(ssl, input, inOutIdx, size);
12974
        break;
12975
12976
#if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_NO_TLS12) && \
12977
    !defined(NO_WOLFSSL_CLIENT)
12978
    case hello_verify_request:
12979
        WOLFSSL_MSG("processing hello verify request");
12980
        ret = DoHelloVerifyRequest(ssl, input, inOutIdx, size);
12981
        break;
12982
#endif
12983
    default:
12984
        WOLFSSL_MSG("Unknown handshake message type");
12985
        ret = UNKNOWN_HANDSHAKE_TYPE;
12986
        break;
12987
    }
12988
12989
#if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_ASYNC_IO)
12990
    /* if async, offset index so this msg will be processed again */
12991
    /* NOTE: check this now before other calls can overwrite ret */
12992
    if ((ret == WC_NO_ERR_TRACE(WC_PENDING_E) ||
12993
         ret == WC_NO_ERR_TRACE(OCSP_WANT_READ)) && *inOutIdx > 0) {
12994
        /* DTLS always stores a message in a buffer when async is enable, so we
12995
         * don't need to adjust for the extra bytes here (*inOutIdx is always
12996
         * == 0) */
12997
        *inOutIdx -= HANDSHAKE_HEADER_SZ;
12998
    }
12999
13000
    /* make sure async error is cleared */
13001
    if (ret == 0 &&
13002
        (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E) ||
13003
         ssl->error == WC_NO_ERR_TRACE(OCSP_WANT_READ))) {
13004
        ssl->error = 0;
13005
    }
13006
#endif
13007
    if (ret == 0 && type != client_hello && type != session_ticket &&
13008
                                                           type != key_update) {
13009
        ret = HashInput(ssl, input + inIdx, (int)size);
13010
    }
13011
13012
    alertType = TranslateErrorToAlert(ret);
13013
13014
    if (alertType != invalid_alert) {
13015
#ifdef WOLFSSL_DTLS13
13016
        if (type == client_hello && ssl->options.dtls)
13017
            DtlsSetSeqNumForReply(ssl);
13018
#endif
13019
        tmp = SendAlert(ssl, alert_fatal, alertType);
13020
        /* propagate socket error instead of tls error to be sure the error is
13021
         * not ignored by DTLS code */
13022
        if (tmp == WC_NO_ERR_TRACE(SOCKET_ERROR_E))
13023
            ret = SOCKET_ERROR_E;
13024
    }
13025
13026
    if (ret == 0 && ssl->options.tls1_3) {
13027
        /* Need to hash input message before deriving secrets. */
13028
    #ifndef NO_WOLFSSL_CLIENT
13029
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
13030
            if (type == server_hello) {
13031
                if ((ret = DeriveEarlySecret(ssl)) != 0)
13032
                    return ret;
13033
                if ((ret = DeriveHandshakeSecret(ssl)) != 0)
13034
                    return ret;
13035
13036
                if ((ret = DeriveTls13Keys(ssl, handshake_key,
13037
                                        ENCRYPT_AND_DECRYPT_SIDE, 1)) != 0) {
13038
                    return ret;
13039
                }
13040
        #ifdef WOLFSSL_EARLY_DATA
13041
                if (ssl->earlyData != no_early_data) {
13042
                    if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
13043
                        return ret;
13044
                }
13045
                else
13046
        #endif
13047
                if ((ret = SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE)) != 0)
13048
                    return ret;
13049
13050
#ifdef WOLFSSL_DTLS13
13051
                if (ssl->options.dtls) {
13052
                    w64wrapper epochHandshake;
13053
                    epochHandshake = w64From32(0, DTLS13_EPOCH_HANDSHAKE);
13054
                    ssl->dtls13Epoch = epochHandshake;
13055
                    ssl->dtls13PeerEpoch = epochHandshake;
13056
13057
                    ret = Dtls13SetEpochKeys(
13058
                        ssl, epochHandshake, ENCRYPT_AND_DECRYPT_SIDE);
13059
                    if (ret != 0)
13060
                        return ret;
13061
13062
                }
13063
#endif /* WOLFSSL_DTLS13 */
13064
            }
13065
13066
            if (type == finished) {
13067
                if ((ret = DeriveMasterSecret(ssl)) != 0)
13068
                    return ret;
13069
                /* Last use of preMasterSecret - zeroize as soon as possible. */
13070
                ForceZero(ssl->arrays->preMasterSecret,
13071
                    ssl->arrays->preMasterSz);
13072
        #ifdef WOLFSSL_EARLY_DATA
13073
        #ifdef WOLFSSL_QUIC
13074
                if (WOLFSSL_IS_QUIC(ssl) && ssl->earlyData != no_early_data) {
13075
                    /* QUIC never sends/receives EndOfEarlyData, but having
13076
                     * early data means the last encryption keys had not been
13077
                     * set yet. */
13078
                    if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
13079
                        return ret;
13080
                }
13081
        #endif
13082
                if ((ret = DeriveTls13Keys(ssl, traffic_key,
13083
                                    ENCRYPT_AND_DECRYPT_SIDE,
13084
                                    ssl->earlyData == no_early_data)) != 0) {
13085
                    return ret;
13086
                }
13087
                if (ssl->earlyData != no_early_data) {
13088
                    if ((ret = DeriveTls13Keys(ssl, no_key, DECRYPT_SIDE_ONLY,
13089
                                                                  1)) != 0) {
13090
                            return ret;
13091
                    }
13092
                }
13093
        #else
13094
                if ((ret = DeriveTls13Keys(ssl, traffic_key,
13095
                                        ENCRYPT_AND_DECRYPT_SIDE, 1)) != 0) {
13096
                    return ret;
13097
                }
13098
        #endif
13099
                /* Setup keys for application data messages. */
13100
                if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
13101
                    return ret;
13102
            }
13103
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
13104
            if (type == certificate_request &&
13105
                                ssl->options.handShakeState == HANDSHAKE_DONE) {
13106
                /* reset handshake states */
13107
                ssl->options.clientState = CLIENT_HELLO_COMPLETE;
13108
                ssl->options.connectState  = FIRST_REPLY_DONE;
13109
                ssl->options.handShakeState = CLIENT_HELLO_COMPLETE;
13110
                ssl->options.processReply = 0; /* doProcessInit */
13111
13112
                /*
13113
                   DTLSv1.3 note: We can't reset serverState to
13114
                   SERVER_FINISHED_COMPLETE with the goal that this connect
13115
                   blocks until the cert/cert_verify/finished flight gets ACKed
13116
                   by the server. The problem is that we will invoke
13117
                   ProcessReplyEx() in that case, but we came here from
13118
                   ProcessReplyEx() and it is not re-entrant safe (the input
13119
                   buffer would still have the certificate_request message). */
13120
13121
                if (wolfSSL_connect_TLSv13(ssl) != WOLFSSL_SUCCESS) {
13122
                    ret = ssl->error;
13123
                    if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
13124
                        ret = POST_HAND_AUTH_ERROR;
13125
                }
13126
            }
13127
        #endif
13128
        }
13129
    #endif /* NO_WOLFSSL_CLIENT */
13130
13131
#ifndef NO_WOLFSSL_SERVER
13132
    #if defined(HAVE_SESSION_TICKET)
13133
        if (ssl->options.side == WOLFSSL_SERVER_END && type == finished) {
13134
            ret = DeriveResumptionSecret(ssl, ssl->session->masterSecret);
13135
            if (ret != 0)
13136
                return ret;
13137
        }
13138
    #endif
13139
#endif /* NO_WOLFSSL_SERVER */
13140
    }
13141
13142
#ifdef WOLFSSL_DTLS13
13143
    if (ssl->options.dtls && !ssl->options.dtlsStateful) {
13144
        DtlsResetState(ssl);
13145
        if (DtlsIgnoreError(ret))
13146
            ret = 0;
13147
    }
13148
#endif
13149
13150
    WOLFSSL_LEAVE("DoTls13HandShakeMsgType()", ret);
13151
    return ret;
13152
}
13153
13154
13155
/* Handle a handshake message that has been received.
13156
 *
13157
 * ssl       The SSL/TLS object.
13158
 * input     The message buffer.
13159
 * inOutIdx  On entry, the index into the buffer of the current message.
13160
 *           On exit, the index into the buffer of the next message.
13161
 * totalSz   Length of remaining data in the message buffer.
13162
 * returns 0 on success and otherwise failure.
13163
 */
13164
int DoTls13HandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
13165
                        word32 totalSz)
13166
18.4k
{
13167
18.4k
    int    ret = 0;
13168
18.4k
    word32 inputLength;
13169
18.4k
    byte   type;
13170
18.4k
    word32 size = 0;
13171
13172
18.4k
    WOLFSSL_ENTER("DoTls13HandShakeMsg");
13173
13174
18.4k
    if (ssl->arrays == NULL) {
13175
0
        if (GetHandshakeHeader(ssl, input, inOutIdx, &type, &size,
13176
0
                                                                totalSz) != 0) {
13177
0
            SendAlert(ssl, alert_fatal, unexpected_message);
13178
0
            WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
13179
0
            return PARSE_ERROR;
13180
0
        }
13181
13182
0
        ret = EarlySanityCheckMsgReceived(ssl, type, size);
13183
0
        if (ret != 0) {
13184
0
            WOLFSSL_ERROR(ret);
13185
0
            return ret;
13186
0
        }
13187
13188
0
        return DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
13189
0
                                       totalSz);
13190
0
    }
13191
13192
18.4k
    inputLength = ssl->buffers.inputBuffer.length - *inOutIdx - ssl->keys.padSz;
13193
13194
    /* If there is a pending fragmented handshake message,
13195
     * pending message size will be non-zero. */
13196
18.4k
    if (ssl->arrays->pendingMsgSz == 0) {
13197
13198
11.3k
        if (GetHandshakeHeader(ssl, input, inOutIdx, &type, &size,
13199
11.3k
                               totalSz) != 0) {
13200
15
            WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
13201
15
            return PARSE_ERROR;
13202
15
        }
13203
13204
11.3k
        ret = EarlySanityCheckMsgReceived(ssl, type,
13205
11.3k
                min(inputLength - HANDSHAKE_HEADER_SZ, size));
13206
11.3k
        if (ret != 0) {
13207
85
            WOLFSSL_ERROR(ret);
13208
85
            return ret;
13209
85
        }
13210
13211
        /* Cap the maximum size of a handshake message to something reasonable.
13212
         * By default is the maximum size of a certificate message assuming
13213
         * nine 2048-bit RSA certificates in the chain. */
13214
11.2k
        if (size > MAX_HANDSHAKE_SZ) {
13215
61
            WOLFSSL_MSG("Handshake message too large");
13216
61
            WOLFSSL_ERROR_VERBOSE(HANDSHAKE_SIZE_ERROR);
13217
61
            return HANDSHAKE_SIZE_ERROR;
13218
61
        }
13219
13220
        /* size is the size of the certificate message payload */
13221
11.2k
        if (inputLength - HANDSHAKE_HEADER_SZ < size) {
13222
555
            ssl->arrays->pendingMsgType = type;
13223
555
            ssl->arrays->pendingMsgSz = size + HANDSHAKE_HEADER_SZ;
13224
555
            ssl->arrays->pendingMsg = (byte*)XMALLOC(size + HANDSHAKE_HEADER_SZ,
13225
555
                                                     ssl->heap,
13226
555
                                                     DYNAMIC_TYPE_ARRAYS);
13227
555
            if (ssl->arrays->pendingMsg == NULL)
13228
22
                return MEMORY_E;
13229
533
            XMEMCPY(ssl->arrays->pendingMsg,
13230
533
                    input + *inOutIdx - HANDSHAKE_HEADER_SZ,
13231
533
                    inputLength);
13232
533
            ssl->arrays->pendingMsgOffset = inputLength;
13233
533
            *inOutIdx += inputLength + ssl->keys.padSz - HANDSHAKE_HEADER_SZ;
13234
533
            return 0;
13235
555
        }
13236
13237
10.6k
        ret = DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
13238
10.6k
                                      totalSz);
13239
10.6k
    }
13240
7.09k
    else {
13241
7.09k
        if (inputLength + ssl->arrays->pendingMsgOffset >
13242
7.09k
                                                    ssl->arrays->pendingMsgSz) {
13243
52
            inputLength = ssl->arrays->pendingMsgSz -
13244
52
                                                  ssl->arrays->pendingMsgOffset;
13245
52
        }
13246
13247
7.09k
        ret = EarlySanityCheckMsgReceived(ssl, ssl->arrays->pendingMsgType,
13248
7.09k
                inputLength);
13249
7.09k
        if (ret != 0) {
13250
28
            WOLFSSL_ERROR(ret);
13251
28
            return ret;
13252
28
        }
13253
13254
7.06k
        XMEMCPY(ssl->arrays->pendingMsg + ssl->arrays->pendingMsgOffset,
13255
7.06k
                input + *inOutIdx, inputLength);
13256
7.06k
        ssl->arrays->pendingMsgOffset += inputLength;
13257
7.06k
        *inOutIdx += inputLength + ssl->keys.padSz;
13258
13259
7.06k
        if (ssl->arrays->pendingMsgOffset == ssl->arrays->pendingMsgSz)
13260
53
        {
13261
53
            word32 idx = 0;
13262
53
            ret = DoTls13HandShakeMsgType(ssl,
13263
53
                                ssl->arrays->pendingMsg + HANDSHAKE_HEADER_SZ,
13264
53
                                &idx, ssl->arrays->pendingMsgType,
13265
53
                                ssl->arrays->pendingMsgSz - HANDSHAKE_HEADER_SZ,
13266
53
                                ssl->arrays->pendingMsgSz);
13267
        #ifdef WOLFSSL_ASYNC_CRYPT
13268
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
13269
                /* setup to process fragment again */
13270
                ssl->arrays->pendingMsgOffset -= inputLength;
13271
                *inOutIdx -= inputLength + ssl->keys.padSz;
13272
            }
13273
            else
13274
        #endif
13275
53
            {
13276
53
                XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
13277
53
                ssl->arrays->pendingMsg = NULL;
13278
53
                ssl->arrays->pendingMsgSz = 0;
13279
53
            }
13280
53
        }
13281
7.06k
    }
13282
13283
17.7k
    WOLFSSL_LEAVE("DoTls13HandShakeMsg", ret);
13284
17.7k
    return ret;
13285
18.4k
}
13286
13287
#ifndef NO_WOLFSSL_CLIENT
13288
13289
/* The client connecting to the server.
13290
 * The protocol version is expecting to be TLS v1.3.
13291
 * If the server downgrades, and older versions of the protocol are compiled
13292
 * in, the client will fallback to wolfSSL_connect().
13293
 * Please see note at top of README if you get an error from connect.
13294
 *
13295
 * ssl  The SSL/TLS object.
13296
 * returns WOLFSSL_SUCCESS on successful handshake, WOLFSSL_FATAL_ERROR when
13297
 * unrecoverable error occurs and 0 otherwise.
13298
 * For more error information use wolfSSL_get_error().
13299
 */
13300
int wolfSSL_connect_TLSv13(WOLFSSL* ssl)
13301
0
{
13302
0
    int advanceState;
13303
0
    int ret = 0;
13304
13305
0
    WOLFSSL_ENTER("wolfSSL_connect_TLSv13");
13306
13307
0
#ifdef HAVE_ERRNO_H
13308
0
    errno = 0;
13309
0
#endif
13310
13311
0
    if (ssl == NULL)
13312
0
        return BAD_FUNC_ARG;
13313
13314
0
    if (ssl->options.side != WOLFSSL_CLIENT_END) {
13315
0
        ssl->error = SIDE_ERROR;
13316
0
        WOLFSSL_ERROR(ssl->error);
13317
0
        return WOLFSSL_FATAL_ERROR;
13318
0
    }
13319
13320
    /* make sure this wolfSSL object has arrays and rng setup. Protects
13321
     * case where the WOLFSSL object is reused via wolfSSL_clear() */
13322
0
    if ((ret = ReinitSSL(ssl, ssl->ctx, 0)) != 0) {
13323
0
        return ret;
13324
0
    }
13325
13326
#ifdef WOLFSSL_DTLS
13327
    if (ssl->version.major == DTLS_MAJOR) {
13328
        ssl->options.dtls   = 1;
13329
        ssl->options.dtlsStateful = 1;
13330
    }
13331
#endif
13332
13333
#ifdef WOLFSSL_WOLFSENTRY_HOOKS
13334
    if ((ssl->ConnectFilter != NULL) &&
13335
        (ssl->options.connectState == CONNECT_BEGIN))
13336
    {
13337
        wolfSSL_netfilter_decision_t res;
13338
        if ((ssl->ConnectFilter(ssl, ssl->ConnectFilter_arg, &res) ==
13339
             WOLFSSL_SUCCESS) &&
13340
            (res == WOLFSSL_NETFILTER_REJECT)) {
13341
            ssl->error = SOCKET_FILTERED_E;
13342
            WOLFSSL_ERROR(ssl->error);
13343
            return WOLFSSL_FATAL_ERROR;
13344
        }
13345
    }
13346
#endif /* WOLFSSL_WOLFSENTRY_HOOKS */
13347
13348
    /* fragOffset is non-zero when sending fragments. On the last
13349
     * fragment, fragOffset is zero again, and the state can be
13350
     * advanced. Also, only advance from states in which we send data */
13351
0
    advanceState = (ssl->options.connectState == CONNECT_BEGIN ||
13352
0
            ssl->options.connectState == HELLO_AGAIN ||
13353
0
            (ssl->options.connectState >= FIRST_REPLY_DONE &&
13354
0
             ssl->options.connectState <= FIRST_REPLY_FOURTH));
13355
13356
#ifdef WOLFSSL_DTLS13
13357
    if (ssl->options.dtls)
13358
        advanceState = advanceState && !ssl->dtls13SendingFragments
13359
            && !ssl->dtls13SendingAckOrRtx;
13360
#endif /* WOLFSSL_DTLS13 */
13361
13362
0
    if (ssl->buffers.outputBuffer.length > 0
13363
    #ifdef WOLFSSL_ASYNC_CRYPT
13364
        /* do not send buffered or advance state if last error was an
13365
            async pending operation */
13366
        && ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E)
13367
    #endif
13368
0
    ) {
13369
0
        if ((ret = SendBuffered(ssl)) == 0) {
13370
0
            if (ssl->fragOffset == 0 && !ssl->options.buildingMsg) {
13371
0
                if (advanceState) {
13372
#ifdef WOLFSSL_DTLS13
13373
                    if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version) &&
13374
                        ssl->options.connectState == FIRST_REPLY_FOURTH) {
13375
                    /* WAIT_FINISHED_ACK is a state added afterwards, but it
13376
                       can't follow FIRST_REPLY_FOURTH in the enum order. Indeed
13377
                       the value of the enum ConnectState is stored in
13378
                       serialized session. This would make importing serialized
13379
                       session from other wolfSSL version incompatible */
13380
                        ssl->options.connectState = WAIT_FINISHED_ACK;
13381
                    }
13382
                    else
13383
#endif /* WOLFSSL_DTLS13 */
13384
0
                    {
13385
0
                        ssl->options.connectState++;
13386
0
                    }
13387
0
                    WOLFSSL_MSG("connect state: "
13388
0
                                "Advanced from last buffered fragment send");
13389
0
#ifdef WOLFSSL_ASYNC_IO
13390
0
                    FreeAsyncCtx(ssl, 0);
13391
0
#endif
13392
13393
0
                }
13394
0
            }
13395
0
            else {
13396
0
                WOLFSSL_MSG("connect state: "
13397
0
                            "Not advanced, more fragments to send");
13398
0
            }
13399
#ifdef WOLFSSL_DTLS13
13400
            if (ssl->options.dtls)
13401
                ssl->dtls13SendingAckOrRtx = 0;
13402
#endif /* WOLFSSL_DTLS13 */
13403
13404
0
        }
13405
0
        else {
13406
0
            ssl->error = ret;
13407
0
            WOLFSSL_ERROR(ssl->error);
13408
0
            return WOLFSSL_FATAL_ERROR;
13409
0
        }
13410
0
    }
13411
13412
0
    ret = RetrySendAlert(ssl);
13413
0
    if (ret != 0) {
13414
0
        ssl->error = ret;
13415
0
        WOLFSSL_ERROR(ssl->error);
13416
0
        return WOLFSSL_FATAL_ERROR;
13417
0
    }
13418
13419
#ifdef WOLFSSL_DTLS13
13420
    if (ssl->options.dtls && ssl->dtls13SendingFragments) {
13421
        if ((ssl->error = Dtls13FragmentsContinue(ssl)) != 0) {
13422
                WOLFSSL_ERROR(ssl->error);
13423
                return WOLFSSL_FATAL_ERROR;
13424
        }
13425
13426
        /* we sent all the fragments. Advance state. */
13427
        ssl->options.connectState++;
13428
    }
13429
#endif /* WOLFSSL_DTLS13 */
13430
13431
0
    switch (ssl->options.connectState) {
13432
13433
0
        case CONNECT_BEGIN:
13434
            /* Always send client hello first. */
13435
0
            if ((ssl->error = SendTls13ClientHello(ssl)) != 0) {
13436
0
                WOLFSSL_ERROR(ssl->error);
13437
0
                return WOLFSSL_FATAL_ERROR;
13438
0
            }
13439
13440
0
            ssl->options.connectState = CLIENT_HELLO_SENT;
13441
0
            WOLFSSL_MSG("TLSv13 connect state: CLIENT_HELLO_SENT");
13442
0
            FALL_THROUGH;
13443
13444
0
        case CLIENT_HELLO_SENT:
13445
    #ifdef WOLFSSL_EARLY_DATA
13446
            if (ssl->earlyData != no_early_data &&
13447
                ssl->options.handShakeState != CLIENT_HELLO_COMPLETE) {
13448
        #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
13449
                    if (!ssl->options.dtls &&
13450
                           ssl->options.tls13MiddleBoxCompat) {
13451
                        if ((ssl->error = SendChangeCipher(ssl)) != 0) {
13452
                            WOLFSSL_ERROR(ssl->error);
13453
                            return WOLFSSL_FATAL_ERROR;
13454
                        }
13455
                        ssl->options.sentChangeCipher = 1;
13456
                    }
13457
        #endif
13458
                ssl->options.handShakeState = CLIENT_HELLO_COMPLETE;
13459
                return WOLFSSL_SUCCESS;
13460
            }
13461
    #endif
13462
            /* Get the response/s from the server. */
13463
0
            while (ssl->options.serverState <
13464
0
                    SERVER_HELLOVERIFYREQUEST_COMPLETE) {
13465
0
                if ((ssl->error = ProcessReply(ssl)) < 0) {
13466
0
                        WOLFSSL_ERROR(ssl->error);
13467
0
                        return WOLFSSL_FATAL_ERROR;
13468
0
                }
13469
13470
#ifdef WOLFSSL_DTLS13
13471
                if (ssl->options.dtls) {
13472
                    if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
13473
                        WOLFSSL_ERROR(ssl->error);
13474
                        return WOLFSSL_FATAL_ERROR;
13475
                    }
13476
                }
13477
#endif /* WOLFSSL_DTLS13 */
13478
0
            }
13479
13480
0
            if (!ssl->options.tls1_3) {
13481
0
    #ifndef WOLFSSL_NO_TLS12
13482
0
                if (ssl->options.downgrade)
13483
0
                    return wolfSSL_connect(ssl);
13484
0
    #endif
13485
0
                WOLFSSL_MSG("Client using higher version, fatal error");
13486
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
13487
0
                return VERSION_ERROR;
13488
0
            }
13489
13490
0
            ssl->options.connectState = HELLO_AGAIN;
13491
0
            WOLFSSL_MSG("connect state: HELLO_AGAIN");
13492
0
            FALL_THROUGH;
13493
13494
0
        case HELLO_AGAIN:
13495
13496
0
            if (ssl->options.serverState ==
13497
0
                                          SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
13498
        #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
13499
                if (!ssl->options.dtls && !ssl->options.sentChangeCipher
13500
                    && ssl->options.tls13MiddleBoxCompat) {
13501
                    if ((ssl->error = SendChangeCipher(ssl)) != 0) {
13502
                        WOLFSSL_ERROR(ssl->error);
13503
                        return WOLFSSL_FATAL_ERROR;
13504
                    }
13505
                    ssl->options.sentChangeCipher = 1;
13506
                }
13507
        #endif
13508
                /* Try again with different security parameters. */
13509
0
                if ((ssl->error = SendTls13ClientHello(ssl)) != 0) {
13510
0
                    WOLFSSL_ERROR(ssl->error);
13511
0
                    return WOLFSSL_FATAL_ERROR;
13512
0
                }
13513
0
            }
13514
13515
0
            ssl->options.connectState = HELLO_AGAIN_REPLY;
13516
0
            WOLFSSL_MSG("connect state: HELLO_AGAIN_REPLY");
13517
0
            FALL_THROUGH;
13518
13519
0
        case HELLO_AGAIN_REPLY:
13520
            /* Get the response/s from the server. */
13521
0
            while (ssl->options.serverState < SERVER_FINISHED_COMPLETE) {
13522
#ifdef WOLFSSL_DTLS13
13523
                if (!IsAtLeastTLSv1_3(ssl->version)) {
13524
        #ifndef WOLFSSL_NO_TLS12
13525
                    if (ssl->options.downgrade)
13526
                        return wolfSSL_connect(ssl);
13527
        #endif
13528
                }
13529
#endif /* WOLFSSL_DTLS13 */
13530
0
                if ((ssl->error = ProcessReply(ssl)) < 0) {
13531
0
                        WOLFSSL_ERROR(ssl->error);
13532
0
                        return WOLFSSL_FATAL_ERROR;
13533
0
                }
13534
13535
#ifdef WOLFSSL_DTLS13
13536
                if (ssl->options.dtls) {
13537
                    if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
13538
                        WOLFSSL_ERROR(ssl->error);
13539
                        return WOLFSSL_FATAL_ERROR;
13540
                    }
13541
                }
13542
#endif /* WOLFSSL_DTLS13 */
13543
0
            }
13544
13545
0
            ssl->options.connectState = FIRST_REPLY_DONE;
13546
0
            WOLFSSL_MSG("connect state: FIRST_REPLY_DONE");
13547
0
            FALL_THROUGH;
13548
13549
0
        case FIRST_REPLY_DONE:
13550
0
            if (ssl->options.certOnly)
13551
0
                return WOLFSSL_SUCCESS;
13552
        #ifdef WOLFSSL_EARLY_DATA
13553
            if (!ssl->options.dtls && ssl->earlyData != no_early_data
13554
                && !WOLFSSL_IS_QUIC(ssl)) {
13555
                if ((ssl->error = SendTls13EndOfEarlyData(ssl)) != 0) {
13556
                    WOLFSSL_ERROR(ssl->error);
13557
                    return WOLFSSL_FATAL_ERROR;
13558
                }
13559
                WOLFSSL_MSG("sent: end_of_early_data");
13560
            }
13561
        #endif
13562
13563
0
            ssl->options.connectState = FIRST_REPLY_FIRST;
13564
0
            WOLFSSL_MSG("connect state: FIRST_REPLY_FIRST");
13565
0
            FALL_THROUGH;
13566
13567
0
        case FIRST_REPLY_FIRST:
13568
        #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
13569
            if (!ssl->options.sentChangeCipher && !ssl->options.dtls
13570
                && ssl->options.tls13MiddleBoxCompat) {
13571
                if ((ssl->error = SendChangeCipher(ssl)) != 0) {
13572
                    WOLFSSL_ERROR(ssl->error);
13573
                    return WOLFSSL_FATAL_ERROR;
13574
                }
13575
                ssl->options.sentChangeCipher = 1;
13576
            }
13577
        #endif
13578
13579
0
            ssl->options.connectState = FIRST_REPLY_SECOND;
13580
0
            WOLFSSL_MSG("connect state: FIRST_REPLY_SECOND");
13581
0
            FALL_THROUGH;
13582
13583
0
        case FIRST_REPLY_SECOND:
13584
            /* CLIENT: check peer authentication. */
13585
0
            if (!ssl->options.peerAuthGood) {
13586
0
                WOLFSSL_MSG("Server authentication did not happen");
13587
0
                WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
13588
0
                return WOLFSSL_FATAL_ERROR;
13589
0
            }
13590
0
        #ifndef NO_CERTS
13591
0
            if (!ssl->options.resuming && ssl->options.sendVerify) {
13592
0
                ssl->error = SendTls13Certificate(ssl);
13593
0
                if (ssl->error != 0) {
13594
0
                    wolfssl_local_MaybeCheckAlertOnErr(ssl, ssl->error);
13595
0
                    WOLFSSL_ERROR(ssl->error);
13596
0
                    return WOLFSSL_FATAL_ERROR;
13597
0
                }
13598
0
                WOLFSSL_MSG("sent: certificate");
13599
0
            }
13600
0
        #endif
13601
13602
0
            ssl->options.connectState = FIRST_REPLY_THIRD;
13603
0
            WOLFSSL_MSG("connect state: FIRST_REPLY_THIRD");
13604
0
            FALL_THROUGH;
13605
13606
0
        case FIRST_REPLY_THIRD:
13607
0
        #if (!defined(NO_CERTS) && (!defined(NO_RSA) || defined(HAVE_ECC) || \
13608
0
             defined(HAVE_ED25519) || defined(HAVE_ED448) || \
13609
0
             defined(HAVE_FALCON) || defined(HAVE_DILITHIUM))) && \
13610
0
             (!defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH))
13611
0
            if (!ssl->options.resuming && ssl->options.sendVerify) {
13612
0
                ssl->error = SendTls13CertificateVerify(ssl);
13613
0
                if (ssl->error != 0) {
13614
0
                    wolfssl_local_MaybeCheckAlertOnErr(ssl, ssl->error);
13615
0
                    WOLFSSL_ERROR(ssl->error);
13616
0
                    return WOLFSSL_FATAL_ERROR;
13617
0
                }
13618
0
                WOLFSSL_MSG("sent: certificate verify");
13619
0
            }
13620
0
        #endif
13621
13622
0
            ssl->options.connectState = FIRST_REPLY_FOURTH;
13623
0
            WOLFSSL_MSG("connect state: FIRST_REPLY_FOURTH");
13624
0
            FALL_THROUGH;
13625
13626
0
        case FIRST_REPLY_FOURTH:
13627
0
            if ((ssl->error = SendTls13Finished(ssl)) != 0) {
13628
0
                wolfssl_local_MaybeCheckAlertOnErr(ssl, ssl->error);
13629
0
                WOLFSSL_ERROR(ssl->error);
13630
0
                return WOLFSSL_FATAL_ERROR;
13631
0
            }
13632
0
            WOLFSSL_MSG("sent: finished");
13633
13634
#ifdef WOLFSSL_DTLS13
13635
            ssl->options.connectState = WAIT_FINISHED_ACK;
13636
            WOLFSSL_MSG("connect state: WAIT_FINISHED_ACK");
13637
            FALL_THROUGH;
13638
13639
        case WAIT_FINISHED_ACK:
13640
            if (ssl->options.dtls) {
13641
                while (ssl->options.serverState != SERVER_FINISHED_ACKED) {
13642
                    if ((ssl->error = ProcessReply(ssl)) < 0) {
13643
                        WOLFSSL_ERROR(ssl->error);
13644
                        return WOLFSSL_FATAL_ERROR;
13645
                    }
13646
13647
                    if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
13648
                        WOLFSSL_ERROR(ssl->error);
13649
                        return WOLFSSL_FATAL_ERROR;
13650
                    }
13651
                }
13652
            }
13653
#endif /* WOLFSSL_DTLS13 */
13654
0
            ssl->options.connectState = FINISHED_DONE;
13655
0
            WOLFSSL_MSG("connect state: FINISHED_DONE");
13656
0
            FALL_THROUGH;
13657
13658
0
        case FINISHED_DONE:
13659
0
        #ifndef NO_HANDSHAKE_DONE_CB
13660
0
            if (ssl->hsDoneCb != NULL) {
13661
0
                int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
13662
0
                if (cbret < 0) {
13663
0
                    ssl->error = cbret;
13664
0
                    WOLFSSL_ERROR_VERBOSE(ssl->error);
13665
0
                    WOLFSSL_MSG("HandShake Done Cb don't continue error");
13666
0
                    return WOLFSSL_FATAL_ERROR;
13667
0
                }
13668
0
            }
13669
0
        #endif /* NO_HANDSHAKE_DONE_CB */
13670
13671
0
            if (!ssl->options.keepResources) {
13672
0
                FreeHandshakeResources(ssl);
13673
0
            }
13674
0
        #if defined(WOLFSSL_ASYNC_IO) && !defined(WOLFSSL_ASYNC_CRYPT)
13675
            /* Free the remaining async context if not using it for crypto */
13676
0
            FreeAsyncCtx(ssl, 1);
13677
0
        #endif
13678
13679
0
            ssl->error = 0; /* clear the error */
13680
13681
0
            WOLFSSL_LEAVE("wolfSSL_connect_TLSv13", WOLFSSL_SUCCESS);
13682
0
            return WOLFSSL_SUCCESS;
13683
13684
0
        default:
13685
0
            WOLFSSL_MSG("Unknown connect state ERROR");
13686
0
            return WOLFSSL_FATAL_ERROR; /* unknown connect state */
13687
0
    }
13688
0
}
13689
#endif
13690
13691
#if defined(WOLFSSL_SEND_HRR_COOKIE)
13692
/* Send a cookie with the HelloRetryRequest to avoid storing state.
13693
 *
13694
 * ssl       SSL/TLS object.
13695
 * secret    Secret to use when generating integrity check for cookie.
13696
 *           A value of NULL indicates to generate a new random secret.
13697
 * secretSz  Size of secret data in bytes.
13698
 *           Use a value of 0 to indicate use of default size.
13699
 * returns BAD_FUNC_ARG when ssl is NULL or not using TLS v1.3, SIDE_ERROR when
13700
 * called on a client; WOLFSSL_SUCCESS on success and otherwise failure.
13701
 */
13702
int wolfSSL_send_hrr_cookie(WOLFSSL* ssl, const unsigned char* secret,
13703
                            unsigned int secretSz)
13704
{
13705
    int ret;
13706
13707
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
13708
        return BAD_FUNC_ARG;
13709
 #ifndef NO_WOLFSSL_SERVER
13710
    if (ssl->options.side == WOLFSSL_CLIENT_END)
13711
        return SIDE_ERROR;
13712
13713
    if (secretSz == 0) {
13714
    #ifndef NO_SHA256
13715
        secretSz = WC_SHA256_DIGEST_SIZE;
13716
    #elif defined(WOLFSSL_SHA384)
13717
        secretSz = WC_SHA384_DIGEST_SIZE;
13718
    #elif defined(WOLFSSL_TLS13_SHA512)
13719
        secretSz = WC_SHA512_DIGEST_SIZE;
13720
    #elif defined(WOLFSSL_SM3)
13721
        secretSz = WC_SM3_DIGEST_SIZE;
13722
    #else
13723
        #error "No digest to available to use with HMAC for cookies."
13724
    #endif /* NO_SHA */
13725
    }
13726
13727
    if (secretSz != ssl->buffers.tls13CookieSecret.length) {
13728
        byte* newSecret;
13729
13730
        if (ssl->buffers.tls13CookieSecret.buffer != NULL) {
13731
            ForceZero(ssl->buffers.tls13CookieSecret.buffer,
13732
                      ssl->buffers.tls13CookieSecret.length);
13733
            XFREE(ssl->buffers.tls13CookieSecret.buffer,
13734
                  ssl->heap, DYNAMIC_TYPE_COOKIE_PWD);
13735
        }
13736
13737
        newSecret = (byte*)XMALLOC(secretSz, ssl->heap,
13738
                                   DYNAMIC_TYPE_COOKIE_PWD);
13739
        if (newSecret == NULL) {
13740
            ssl->buffers.tls13CookieSecret.buffer = NULL;
13741
            ssl->buffers.tls13CookieSecret.length = 0;
13742
            WOLFSSL_MSG("couldn't allocate new cookie secret");
13743
            return MEMORY_ERROR;
13744
        }
13745
        ssl->buffers.tls13CookieSecret.buffer = newSecret;
13746
        ssl->buffers.tls13CookieSecret.length = secretSz;
13747
    #ifdef WOLFSSL_CHECK_MEM_ZERO
13748
        wc_MemZero_Add("wolfSSL_send_hrr_cookie secret",
13749
            ssl->buffers.tls13CookieSecret.buffer,
13750
            ssl->buffers.tls13CookieSecret.length);
13751
    #endif
13752
    }
13753
13754
    /* If the supplied secret is NULL, randomly generate a new secret. */
13755
    if (secret == NULL) {
13756
        ret = wc_RNG_GenerateBlock(ssl->rng,
13757
                               ssl->buffers.tls13CookieSecret.buffer, secretSz);
13758
        if (ret < 0)
13759
            return ret;
13760
    }
13761
    else
13762
        XMEMCPY(ssl->buffers.tls13CookieSecret.buffer, secret, secretSz);
13763
13764
    ssl->options.sendCookie = 1;
13765
13766
    ret = WOLFSSL_SUCCESS;
13767
#else
13768
    (void)secret;
13769
    (void)secretSz;
13770
13771
    ret = SIDE_ERROR;
13772
#endif
13773
13774
    return ret;
13775
}
13776
13777
int wolfSSL_disable_hrr_cookie(WOLFSSL* ssl)
13778
{
13779
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
13780
        return BAD_FUNC_ARG;
13781
13782
#ifdef NO_WOLFSSL_SERVER
13783
    return SIDE_ERROR;
13784
#else
13785
    if (ssl->options.side == WOLFSSL_CLIENT_END)
13786
        return SIDE_ERROR;
13787
13788
    if (ssl->buffers.tls13CookieSecret.buffer != NULL) {
13789
        ForceZero(ssl->buffers.tls13CookieSecret.buffer,
13790
            ssl->buffers.tls13CookieSecret.length);
13791
        XFREE(ssl->buffers.tls13CookieSecret.buffer, ssl->heap,
13792
            DYNAMIC_TYPE_COOKIE_PWD);
13793
        ssl->buffers.tls13CookieSecret.buffer = NULL;
13794
        ssl->buffers.tls13CookieSecret.length = 0;
13795
    }
13796
13797
    ssl->options.sendCookie = 0;
13798
    return WOLFSSL_SUCCESS;
13799
#endif /* NO_WOLFSSL_SERVER */
13800
}
13801
13802
#endif /* defined(WOLFSSL_SEND_HRR_COOKIE) */
13803
13804
#ifdef HAVE_SUPPORTED_CURVES
13805
/* Create a key share entry from group.
13806
 * Generates a key pair.
13807
 *
13808
 * ssl    The SSL/TLS object.
13809
 * group  The named group.
13810
 * returns 0 on success, otherwise failure.
13811
 *   for async can return WC_PENDING_E and should be called again
13812
 */
13813
int wolfSSL_UseKeyShare(WOLFSSL* ssl, word16 group)
13814
0
{
13815
0
    int ret;
13816
13817
0
    if (ssl == NULL)
13818
0
        return BAD_FUNC_ARG;
13819
13820
#ifdef WOLFSSL_ASYNC_CRYPT
13821
    ret = wolfSSL_AsyncPop(ssl, NULL);
13822
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
13823
        /* Check for error */
13824
        if (ret < 0)
13825
            return ret;
13826
    }
13827
#endif
13828
13829
#if defined(WOLFSSL_HAVE_MLKEM)
13830
    if (WOLFSSL_NAMED_GROUP_IS_PQC(group) ||
13831
        WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(group)) {
13832
13833
        if (ssl->ctx != NULL && ssl->ctx->method != NULL &&
13834
            !IsAtLeastTLSv1_3(ssl->version)) {
13835
            return BAD_FUNC_ARG;
13836
        }
13837
13838
        if (ssl->options.side == WOLFSSL_SERVER_END) {
13839
            /* If I am the server of a KEM connection, do not do keygen because
13840
             * I'm going to encapsulate with the client's public key. Note that
13841
             * I might be the client and ssl->option.side has not been properly
13842
             * set yet. In that case the KeyGen operation will be deferred to
13843
             * connection time. */
13844
            return WOLFSSL_SUCCESS;
13845
        }
13846
    }
13847
#endif
13848
#if defined(NO_TLS)
13849
    (void)ret;
13850
    (void)group;
13851
#else
13852
0
    ret = TLSX_KeyShare_Use(ssl, group, 0, NULL, NULL, &ssl->extensions);
13853
0
    if (ret != 0)
13854
0
        return ret;
13855
0
#endif /* NO_TLS */
13856
0
    return WOLFSSL_SUCCESS;
13857
0
}
13858
13859
/* Send no key share entries - use HelloRetryRequest to negotiate shared group.
13860
 *
13861
 * ssl    The SSL/TLS object.
13862
 * returns 0 on success, otherwise failure.
13863
 */
13864
int wolfSSL_NoKeyShares(WOLFSSL* ssl)
13865
0
{
13866
0
    int ret;
13867
13868
0
    if (ssl == NULL)
13869
0
        return BAD_FUNC_ARG;
13870
0
    if (ssl->options.side == WOLFSSL_SERVER_END)
13871
0
        return SIDE_ERROR;
13872
#if defined(NO_TLS)
13873
    (void)ret;
13874
#else
13875
0
    ret = TLSX_KeyShare_Empty(ssl);
13876
0
    if (ret != 0)
13877
0
        return ret;
13878
0
#endif /* NO_TLS */
13879
0
    return WOLFSSL_SUCCESS;
13880
0
}
13881
#endif
13882
13883
#ifdef WOLFSSL_DUAL_ALG_CERTS
13884
int wolfSSL_UseCKS(WOLFSSL* ssl, byte *sigSpec, word16 sigSpecSz)
13885
{
13886
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->ctx->method->version) ||
13887
        sigSpec == NULL || sigSpecSz == 0)
13888
        return BAD_FUNC_ARG;
13889
13890
    ssl->sigSpec = sigSpec;
13891
    ssl->sigSpecSz = sigSpecSz;
13892
    return WOLFSSL_SUCCESS;
13893
}
13894
13895
int wolfSSL_CTX_UseCKS(WOLFSSL_CTX* ctx, byte *sigSpec, word16 sigSpecSz)
13896
{
13897
    if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version) ||
13898
        sigSpec == NULL || sigSpecSz == 0)
13899
        return BAD_FUNC_ARG;
13900
13901
    ctx->sigSpec = sigSpec;
13902
    ctx->sigSpecSz = sigSpecSz;
13903
    return WOLFSSL_SUCCESS;
13904
}
13905
#endif /* WOLFSSL_DUAL_ALG_CERTS */
13906
13907
/* Do not send a ticket after TLS v1.3 handshake for resumption.
13908
 *
13909
 * ctx  The SSL/TLS CTX object.
13910
 * returns BAD_FUNC_ARG when ctx is NULL and 0 on success.
13911
 */
13912
int wolfSSL_CTX_no_ticket_TLSv13(WOLFSSL_CTX* ctx)
13913
0
{
13914
0
    if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version))
13915
0
        return BAD_FUNC_ARG;
13916
0
    if (ctx->method->side == WOLFSSL_CLIENT_END)
13917
0
        return SIDE_ERROR;
13918
13919
#ifdef HAVE_SESSION_TICKET
13920
    ctx->noTicketTls13 = 1;
13921
#endif
13922
13923
0
    return 0;
13924
0
}
13925
13926
/* Do not send a ticket after TLS v1.3 handshake for resumption.
13927
 *
13928
 * ssl  The SSL/TLS object.
13929
 * returns BAD_FUNC_ARG when ssl is NULL, not using TLS v1.3, or called on
13930
 * a client and 0 on success.
13931
 */
13932
int wolfSSL_no_ticket_TLSv13(WOLFSSL* ssl)
13933
0
{
13934
0
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
13935
0
        return BAD_FUNC_ARG;
13936
0
    if (ssl->options.side == WOLFSSL_CLIENT_END)
13937
0
        return SIDE_ERROR;
13938
13939
#ifdef HAVE_SESSION_TICKET
13940
    ssl->options.noTicketTls13 = 1;
13941
#endif
13942
13943
0
    return 0;
13944
0
}
13945
13946
/* Disallow (EC)DHE key exchange when using pre-shared keys.
13947
 *
13948
 * ctx  The SSL/TLS CTX object.
13949
 * returns BAD_FUNC_ARG when ctx is NULL and 0 on success.
13950
 */
13951
int wolfSSL_CTX_no_dhe_psk(WOLFSSL_CTX* ctx)
13952
0
{
13953
0
    if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version))
13954
0
        return BAD_FUNC_ARG;
13955
13956
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13957
    ctx->noPskDheKe = 1;
13958
#endif
13959
13960
0
    return 0;
13961
0
}
13962
13963
/* Disallow (EC)DHE key exchange when using pre-shared keys.
13964
 *
13965
 * ssl  The SSL/TLS object.
13966
 * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3 and 0 on
13967
 * success.
13968
 */
13969
int wolfSSL_no_dhe_psk(WOLFSSL* ssl)
13970
0
{
13971
0
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
13972
0
        return BAD_FUNC_ARG;
13973
13974
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13975
    ssl->options.noPskDheKe = 1;
13976
#endif
13977
13978
0
    return 0;
13979
0
}
13980
13981
#ifdef HAVE_SUPPORTED_CURVES
13982
/* Only allow (EC)DHE key exchange when using pre-shared keys.
13983
 *
13984
 * ctx  The SSL/TLS CTX object.
13985
 * returns BAD_FUNC_ARG when ctx is NULL and 0 on success.
13986
 */
13987
int wolfSSL_CTX_only_dhe_psk(WOLFSSL_CTX* ctx)
13988
0
{
13989
0
    if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version))
13990
0
        return BAD_FUNC_ARG;
13991
13992
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13993
    ctx->onlyPskDheKe = 1;
13994
#endif
13995
13996
0
    return 0;
13997
0
}
13998
13999
/* Only allow (EC)DHE key exchange when using pre-shared keys.
14000
 *
14001
 * ssl  The SSL/TLS object.
14002
 * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3 and 0 on
14003
 * success.
14004
 */
14005
int wolfSSL_only_dhe_psk(WOLFSSL* ssl)
14006
0
{
14007
0
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
14008
0
        return BAD_FUNC_ARG;
14009
14010
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14011
    ssl->options.onlyPskDheKe = 1;
14012
#endif
14013
14014
0
    return 0;
14015
0
}
14016
#endif /* HAVE_SUPPORTED_CURVES */
14017
14018
int Tls13UpdateKeys(WOLFSSL* ssl)
14019
0
{
14020
0
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
14021
0
        return BAD_FUNC_ARG;
14022
14023
#ifdef WOLFSSL_DTLS13
14024
    /* we are already waiting for the ack of a sent key update message. We can't
14025
       send another one before receiving its ack. Either wolfSSL_update_keys()
14026
       was invoked multiple times over a short period of time or we replied to a
14027
       KeyUpdate with update request. We'll just ignore sending this
14028
       KeyUpdate. */
14029
    /* TODO: add WOLFSSL_ERROR_ALREADY_IN_PROGRESS type of error here */
14030
    if (ssl->options.dtls && ssl->dtls13WaitKeyUpdateAck)
14031
        return 0;
14032
#endif /* WOLFSSL_DTLS13 */
14033
14034
0
    return SendTls13KeyUpdate(ssl);
14035
0
}
14036
14037
/* Update the keys for encryption and decryption.
14038
 * If using non-blocking I/O and WOLFSSL_ERROR_WANT_WRITE is returned then
14039
 * calling wolfSSL_write() will have the message sent when ready.
14040
 *
14041
 * ssl  The SSL/TLS object.
14042
 * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
14043
 * WOLFSSL_ERROR_WANT_WRITE when non-blocking I/O is not ready to write,
14044
 * WOLFSSL_SUCCESS on success and otherwise failure.
14045
 */
14046
int wolfSSL_update_keys(WOLFSSL* ssl)
14047
0
{
14048
0
    int ret;
14049
0
    ret = Tls13UpdateKeys(ssl);
14050
0
    if (ret == WC_NO_ERR_TRACE(WANT_WRITE))
14051
0
        ret = WOLFSSL_ERROR_WANT_WRITE;
14052
0
    else if (ret == 0)
14053
0
        ret = WOLFSSL_SUCCESS;
14054
0
    return ret;
14055
0
}
14056
14057
/* Whether a response is waiting for key update request.
14058
 *
14059
 * ssl        The SSL/TLS object.
14060
 * required   0 when no key update response required.
14061
 *            1 when no key update response required.
14062
 * return  0 on success.
14063
 * return  BAD_FUNC_ARG when ssl is NULL or not using TLS v1.3
14064
 */
14065
int wolfSSL_key_update_response(WOLFSSL* ssl, int* required)
14066
0
{
14067
0
    if (required == NULL || ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
14068
0
        return BAD_FUNC_ARG;
14069
14070
0
    *required = ssl->keys.updateResponseReq;
14071
14072
0
    return 0;
14073
0
}
14074
14075
#if !defined(NO_CERTS) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
14076
/* Allow post-handshake authentication in TLS v1.3 connections.
14077
 *
14078
 * ctx  The SSL/TLS CTX object.
14079
 * returns BAD_FUNC_ARG when ctx is NULL, SIDE_ERROR when not a client and
14080
 * 0 on success.
14081
 */
14082
int wolfSSL_CTX_allow_post_handshake_auth(WOLFSSL_CTX* ctx)
14083
{
14084
    if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version))
14085
        return BAD_FUNC_ARG;
14086
    if (ctx->method->side == WOLFSSL_SERVER_END)
14087
        return SIDE_ERROR;
14088
14089
    ctx->postHandshakeAuth = 1;
14090
14091
    return 0;
14092
}
14093
14094
/* Allow post-handshake authentication in TLS v1.3 connection.
14095
 *
14096
 * ssl  The SSL/TLS object.
14097
 * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
14098
 * SIDE_ERROR when not a client and 0 on success.
14099
 */
14100
int wolfSSL_allow_post_handshake_auth(WOLFSSL* ssl)
14101
{
14102
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
14103
        return BAD_FUNC_ARG;
14104
    if (ssl->options.side == WOLFSSL_SERVER_END)
14105
        return SIDE_ERROR;
14106
14107
    ssl->options.postHandshakeAuth = 1;
14108
14109
    return 0;
14110
}
14111
14112
/* Request a certificate of the client.
14113
 * Can be called any time after handshake completion.
14114
 * A maximum of 256 requests can be sent on a connection.
14115
 *
14116
 * ssl  SSL/TLS object.
14117
 */
14118
int wolfSSL_request_certificate(WOLFSSL* ssl)
14119
{
14120
    int         ret;
14121
#ifndef NO_WOLFSSL_SERVER
14122
    CertReqCtx* certReqCtx;
14123
#endif
14124
14125
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
14126
        return BAD_FUNC_ARG;
14127
#ifndef NO_WOLFSSL_SERVER
14128
    if (ssl->options.side == WOLFSSL_CLIENT_END)
14129
        return SIDE_ERROR;
14130
    if (ssl->options.handShakeState != HANDSHAKE_DONE)
14131
        return NOT_READY_ERROR;
14132
    if (!ssl->options.postHandshakeAuth)
14133
        return POST_HAND_AUTH_ERROR;
14134
14135
    certReqCtx = (CertReqCtx*)XMALLOC(sizeof(CertReqCtx), ssl->heap,
14136
                                                       DYNAMIC_TYPE_TMP_BUFFER);
14137
    if (certReqCtx == NULL)
14138
        return MEMORY_E;
14139
    XMEMSET(certReqCtx, 0, sizeof(CertReqCtx));
14140
    certReqCtx->next = ssl->certReqCtx;
14141
    certReqCtx->len = 1;
14142
    if (certReqCtx->next != NULL)
14143
        certReqCtx->ctx = certReqCtx->next->ctx + 1;
14144
    ssl->certReqCtx = certReqCtx;
14145
14146
    ssl->msgsReceived.got_certificate = 0;
14147
    ssl->msgsReceived.got_certificate_verify = 0;
14148
    ssl->msgsReceived.got_finished = 0;
14149
14150
    ret = SendTls13CertificateRequest(ssl, &certReqCtx->ctx, certReqCtx->len);
14151
    if (ret == WC_NO_ERR_TRACE(WANT_WRITE))
14152
        ret = WOLFSSL_ERROR_WANT_WRITE;
14153
    else if (ret == 0)
14154
        ret = WOLFSSL_SUCCESS;
14155
#else
14156
    ret = SIDE_ERROR;
14157
#endif
14158
14159
    return ret;
14160
}
14161
#endif /* !NO_CERTS && WOLFSSL_POST_HANDSHAKE_AUTH */
14162
14163
#if !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
14164
/* Get the preferred key exchange group.
14165
 *
14166
 * ssl  The SSL/TLS object.
14167
 * returns BAD_FUNC_ARG when ssl is NULL or not using TLS v1.3,
14168
 * SIDE_ERROR when not a client, NOT_READY_ERROR when handshake not complete
14169
 * and group number on success.
14170
 */
14171
int wolfSSL_preferred_group(WOLFSSL* ssl)
14172
0
{
14173
0
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
14174
0
        return BAD_FUNC_ARG;
14175
0
#ifndef NO_WOLFSSL_CLIENT
14176
0
    if (ssl->options.side == WOLFSSL_SERVER_END)
14177
0
        return SIDE_ERROR;
14178
0
    if (ssl->options.handShakeState != HANDSHAKE_DONE)
14179
0
        return NOT_READY_ERROR;
14180
14181
0
#ifdef HAVE_SUPPORTED_CURVES
14182
    /* Return supported groups only. */
14183
0
    return TLSX_SupportedCurve_Preferred(ssl, 1);
14184
#else
14185
    return 0;
14186
#endif
14187
#else
14188
    return SIDE_ERROR;
14189
#endif
14190
0
}
14191
#endif
14192
14193
#ifndef NO_PSK
14194
/* Set the PSK callback, that is passed the cipher suite, for a client to use
14195
 * against context object.
14196
 *
14197
 * @param [in, out] ctx  SSL/TLS context object.
14198
 * @param [in]      cb   Client PSK callback passed a cipher suite.
14199
 */
14200
void wolfSSL_CTX_set_psk_client_cs_callback(WOLFSSL_CTX* ctx,
14201
                                            wc_psk_client_cs_callback cb)
14202
{
14203
    WOLFSSL_ENTER("wolfSSL_CTX_set_psk_client_cs_callback");
14204
14205
    if (ctx == NULL)
14206
        return;
14207
14208
    ctx->havePSK = 1;
14209
    ctx->client_psk_cs_cb = cb;
14210
}
14211
14212
/* Set the PSK callback, that is passed the cipher suite, for a client to use
14213
 * against SSL object.
14214
 *
14215
 * @param [in, out] ssl  SSL/TLS object.
14216
 * @param [in]      cb   Client PSK callback passed a cipher suite.
14217
 */
14218
void wolfSSL_set_psk_client_cs_callback(WOLFSSL* ssl,
14219
                                        wc_psk_client_cs_callback cb)
14220
{
14221
    byte haveRSA = 1;
14222
    int  keySz   = 0;
14223
14224
    WOLFSSL_ENTER("wolfSSL_set_psk_client_cs_callback");
14225
14226
    if (ssl == NULL)
14227
        return;
14228
14229
    ssl->options.havePSK = 1;
14230
    ssl->options.client_psk_cs_cb = cb;
14231
14232
    #ifdef NO_RSA
14233
        haveRSA = 0;
14234
    #endif
14235
    #ifndef NO_CERTS
14236
        keySz = ssl->buffers.keySz;
14237
    #endif
14238
    if (AllocateSuites(ssl) != 0)
14239
        return;
14240
    InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
14241
               ssl->options.haveDH, ssl->options.haveECDSAsig,
14242
               ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
14243
               ssl->options.useAnon, TRUE, TRUE, TRUE, TRUE, ssl->options.side);
14244
}
14245
14246
/* Set the PSK callback that returns the cipher suite for a client to use
14247
 * against context object.
14248
 *
14249
 * @param [in, out] ctx  SSL/TLS context object.
14250
 * @param [in]      cb   Client PSK callback returning cipher suite.
14251
 */
14252
void wolfSSL_CTX_set_psk_client_tls13_callback(WOLFSSL_CTX* ctx,
14253
                                               wc_psk_client_tls13_callback cb)
14254
{
14255
    WOLFSSL_ENTER("wolfSSL_CTX_set_psk_client_tls13_callback");
14256
14257
    if (ctx == NULL)
14258
        return;
14259
14260
    ctx->havePSK = 1;
14261
    ctx->client_psk_tls13_cb = cb;
14262
}
14263
14264
/* Set the PSK callback that returns the cipher suite for a client to use
14265
 * against SSL object.
14266
 *
14267
 * @param [in, out] ssl  SSL/TLS object.
14268
 * @param [in]      cb   Client PSK callback returning cipher suite.
14269
 */
14270
void wolfSSL_set_psk_client_tls13_callback(WOLFSSL* ssl,
14271
                                           wc_psk_client_tls13_callback cb)
14272
{
14273
    byte haveRSA = 1;
14274
    int  keySz   = 0;
14275
14276
    WOLFSSL_ENTER("wolfSSL_set_psk_client_tls13_callback");
14277
14278
    if (ssl == NULL)
14279
        return;
14280
14281
    ssl->options.havePSK = 1;
14282
    ssl->options.client_psk_tls13_cb = cb;
14283
14284
    #ifdef NO_RSA
14285
        haveRSA = 0;
14286
    #endif
14287
    #ifndef NO_CERTS
14288
        keySz = ssl->buffers.keySz;
14289
    #endif
14290
    if (AllocateSuites(ssl) != 0)
14291
        return;
14292
    InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
14293
               ssl->options.haveDH, ssl->options.haveECDSAsig,
14294
               ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
14295
               ssl->options.useAnon, TRUE, TRUE, TRUE, TRUE, ssl->options.side);
14296
}
14297
14298
/* Set the PSK callback that returns the cipher suite for a server to use
14299
 * against context object.
14300
 *
14301
 * @param [in, out] ctx  SSL/TLS context object.
14302
 * @param [in]      cb   Server PSK callback returning cipher suite.
14303
 */
14304
void wolfSSL_CTX_set_psk_server_tls13_callback(WOLFSSL_CTX* ctx,
14305
                                               wc_psk_server_tls13_callback cb)
14306
{
14307
    WOLFSSL_ENTER("wolfSSL_CTX_set_psk_server_tls13_callback");
14308
    if (ctx == NULL)
14309
        return;
14310
    ctx->havePSK = 1;
14311
    ctx->server_psk_tls13_cb = cb;
14312
}
14313
14314
/* Set the PSK callback that returns the cipher suite for a server to use
14315
 * against SSL object.
14316
 *
14317
 * @param [in, out] ssl  SSL/TLS object.
14318
 * @param [in]      cb   Server PSK callback returning cipher suite.
14319
 */
14320
void wolfSSL_set_psk_server_tls13_callback(WOLFSSL* ssl,
14321
                                           wc_psk_server_tls13_callback cb)
14322
{
14323
    byte haveRSA = 1;
14324
    int  keySz   = 0;
14325
14326
    WOLFSSL_ENTER("wolfSSL_set_psk_server_tls13_callback");
14327
    if (ssl == NULL)
14328
        return;
14329
14330
    ssl->options.havePSK = 1;
14331
    ssl->options.server_psk_tls13_cb = cb;
14332
14333
    #ifdef NO_RSA
14334
        haveRSA = 0;
14335
    #endif
14336
    #ifndef NO_CERTS
14337
        keySz = ssl->buffers.keySz;
14338
    #endif
14339
    if (AllocateSuites(ssl) != 0)
14340
        return;
14341
    InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
14342
               ssl->options.haveDH, ssl->options.haveECDSAsig,
14343
               ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
14344
               ssl->options.useAnon, TRUE, TRUE, TRUE, TRUE, ssl->options.side);
14345
}
14346
14347
/* Get name of first supported cipher suite that uses the hash indicated.
14348
 *
14349
 * @param [in] ssl   SSL/TLS object.
14350
 * @param [in] hash  Name of hash algorithm. e.g. "SHA256", "SHA384"
14351
 * @return  Name of cipher suite.
14352
 * @return  NULL on failure.
14353
 */
14354
const char* wolfSSL_get_cipher_name_by_hash(WOLFSSL* ssl, const char* hash)
14355
{
14356
    const char* name = NULL;
14357
    byte mac = no_mac;
14358
    int i;
14359
    const Suites* suites = WOLFSSL_SUITES(ssl);
14360
14361
    if (XSTRCMP(hash, "SHA256") == 0) {
14362
        mac = sha256_mac;
14363
    }
14364
    else if (XSTRCMP(hash, "SHA384") == 0) {
14365
        mac = sha384_mac;
14366
    }
14367
    if (mac != no_mac) {
14368
        for (i = 0; i < suites->suiteSz; i += 2) {
14369
            if (SuiteMac(suites->suites + i) == mac) {
14370
                name = GetCipherNameInternal(suites->suites[i + 0],
14371
                                             suites->suites[i + 1]);
14372
                break;
14373
            }
14374
        }
14375
    }
14376
    return name;
14377
}
14378
#endif /* !NO_PSK */
14379
14380
14381
#ifndef NO_WOLFSSL_SERVER
14382
14383
/* The server accepting a connection from a client.
14384
 * The protocol version is expecting to be TLS v1.3.
14385
 * If the client downgrades, and older versions of the protocol are compiled
14386
 * in, the server will fallback to wolfSSL_accept().
14387
 * Please see note at top of README if you get an error from accept.
14388
 *
14389
 * ssl  The SSL/TLS object.
14390
 * returns WOLFSSL_SUCCESS on successful handshake, WOLFSSL_FATAL_ERROR when
14391
 * unrecoverable error occurs and 0 otherwise.
14392
 * For more error information use wolfSSL_get_error().
14393
 */
14394
int wolfSSL_accept_TLSv13(WOLFSSL* ssl)
14395
{
14396
#if !defined(NO_CERTS) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
14397
    word16 havePSK = 0;
14398
#endif
14399
    int ret = 0;
14400
14401
    WOLFSSL_ENTER("wolfSSL_accept_TLSv13");
14402
14403
#ifdef HAVE_ERRNO_H
14404
    errno = 0;
14405
#endif
14406
14407
    if (ssl == NULL)
14408
        return WOLFSSL_FATAL_ERROR;
14409
14410
#if !defined(NO_CERTS) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
14411
    havePSK = ssl->options.havePSK;
14412
#endif
14413
14414
    if (ssl->options.side != WOLFSSL_SERVER_END) {
14415
        ssl->error = SIDE_ERROR;
14416
        WOLFSSL_ERROR(ssl->error);
14417
        return WOLFSSL_FATAL_ERROR;
14418
    }
14419
14420
    /* make sure this wolfSSL object has arrays and rng setup. Protects
14421
     * case where the WOLFSSL object is reused via wolfSSL_clear() */
14422
    if ((ret = ReinitSSL(ssl, ssl->ctx, 0)) != 0) {
14423
        return ret;
14424
    }
14425
14426
#ifdef WOLFSSL_DTLS
14427
    if (ssl->version.major == DTLS_MAJOR) {
14428
        ssl->options.dtls   = 1;
14429
        if (!IsDtlsNotSctpMode(ssl) || !ssl->options.sendCookie)
14430
            ssl->options.dtlsStateful = 1;
14431
    }
14432
#endif
14433
14434
#ifdef WOLFSSL_WOLFSENTRY_HOOKS
14435
    if ((ssl->AcceptFilter != NULL) &&
14436
            ((ssl->options.acceptState == TLS13_ACCEPT_BEGIN)
14437
#ifdef HAVE_SECURE_RENEGOTIATION
14438
             || (ssl->options.acceptState == TLS13_ACCEPT_BEGIN_RENEG)
14439
#endif
14440
                ))
14441
    {
14442
        wolfSSL_netfilter_decision_t res;
14443
        if ((ssl->AcceptFilter(ssl, ssl->AcceptFilter_arg, &res) ==
14444
             WOLFSSL_SUCCESS) &&
14445
            (res == WOLFSSL_NETFILTER_REJECT)) {
14446
            ssl->error = SOCKET_FILTERED_E;
14447
            WOLFSSL_ERROR(ssl->error);
14448
            return WOLFSSL_FATAL_ERROR;
14449
        }
14450
    }
14451
#endif /* WOLFSSL_WOLFSENTRY_HOOKS */
14452
14453
#ifndef NO_CERTS
14454
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14455
    if (!havePSK)
14456
#endif
14457
    {
14458
    #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || \
14459
        defined(WOLFSSL_NGINX) || defined (WOLFSSL_HAPROXY)
14460
        if (ssl->ctx->certSetupCb != NULL) {
14461
            WOLFSSL_MSG("CertSetupCb set. server cert and "
14462
                        "key not checked");
14463
        }
14464
        else
14465
    #endif
14466
        {
14467
            if (!ssl->buffers.certificate ||
14468
                !ssl->buffers.certificate->buffer) {
14469
14470
                WOLFSSL_MSG("accept error: server cert required");
14471
                ssl->error = NO_PRIVATE_KEY;
14472
                WOLFSSL_ERROR(ssl->error);
14473
                return WOLFSSL_FATAL_ERROR;
14474
            }
14475
14476
            if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
14477
                /* allow no private key if using existing key */
14478
            #ifdef WOLF_PRIVATE_KEY_ID
14479
                if (ssl->devId != INVALID_DEVID
14480
                #ifdef HAVE_PK_CALLBACKS
14481
                    || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
14482
                #endif
14483
                ) {
14484
                    WOLFSSL_MSG("Allowing no server private key (external)");
14485
                }
14486
                else
14487
            #endif
14488
                {
14489
                    WOLFSSL_MSG("accept error: server key required");
14490
                    ssl->error = NO_PRIVATE_KEY;
14491
                    WOLFSSL_ERROR(ssl->error);
14492
                    return WOLFSSL_FATAL_ERROR;
14493
                }
14494
            }
14495
        }
14496
    }
14497
#endif /* NO_CERTS */
14498
14499
    if (ssl->buffers.outputBuffer.length > 0
14500
    #ifdef WOLFSSL_ASYNC_CRYPT
14501
        /* do not send buffered or advance state if last error was an
14502
            async pending operation */
14503
        && ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E)
14504
    #endif
14505
    ) {
14506
14507
        /* fragOffset is non-zero when sending fragments. On the last
14508
         * fragment, fragOffset is zero again, and the state can be
14509
         * advanced. */
14510
        int advanceState =
14511
            (ssl->options.acceptState == TLS13_ACCEPT_CLIENT_HELLO_DONE ||
14512
                ssl->options.acceptState ==
14513
                    TLS13_ACCEPT_HELLO_RETRY_REQUEST_DONE ||
14514
                ssl->options.acceptState == TLS13_ACCEPT_SECOND_REPLY_DONE ||
14515
                ssl->options.acceptState == TLS13_SERVER_HELLO_SENT ||
14516
                ssl->options.acceptState == TLS13_ACCEPT_THIRD_REPLY_DONE ||
14517
                ssl->options.acceptState == TLS13_SERVER_EXTENSIONS_SENT ||
14518
                ssl->options.acceptState == TLS13_CERT_REQ_SENT ||
14519
                ssl->options.acceptState == TLS13_CERT_SENT ||
14520
                ssl->options.acceptState == TLS13_CERT_VERIFY_SENT ||
14521
                ssl->options.acceptState == TLS13_ACCEPT_FINISHED_SENT ||
14522
                ssl->options.acceptState == TLS13_ACCEPT_FINISHED_DONE);
14523
14524
#ifdef WOLFSSL_DTLS13
14525
        if (ssl->options.dtls)
14526
            advanceState = advanceState && !ssl->dtls13SendingFragments
14527
                && !ssl->dtls13SendingAckOrRtx;
14528
#endif /* WOLFSSL_DTLS13 */
14529
14530
        ret = SendBuffered(ssl);
14531
        if (ret == 0) {
14532
            if (ssl->fragOffset == 0 && !ssl->options.buildingMsg) {
14533
                if (advanceState) {
14534
                    ssl->options.acceptState++;
14535
                    WOLFSSL_MSG("accept state: "
14536
                                "Advanced from last buffered fragment send");
14537
#ifdef WOLFSSL_ASYNC_IO
14538
                    FreeAsyncCtx(ssl, 0);
14539
#endif
14540
                }
14541
            }
14542
            else {
14543
                WOLFSSL_MSG("accept state: "
14544
                            "Not advanced, more fragments to send");
14545
            }
14546
14547
#ifdef WOLFSSL_DTLS13
14548
            if (ssl->options.dtls)
14549
                ssl->dtls13SendingAckOrRtx = 0;
14550
#endif /* WOLFSSL_DTLS13 */
14551
14552
        }
14553
        else {
14554
            ssl->error = ret;
14555
            WOLFSSL_ERROR(ssl->error);
14556
            return WOLFSSL_FATAL_ERROR;
14557
        }
14558
    }
14559
14560
    ret = RetrySendAlert(ssl);
14561
    if (ret != 0) {
14562
        ssl->error = ret;
14563
        WOLFSSL_ERROR(ssl->error);
14564
        return WOLFSSL_FATAL_ERROR;
14565
    }
14566
#ifdef WOLFSSL_DTLS13
14567
    if (ssl->options.dtls && ssl->dtls13SendingFragments) {
14568
        if ((ssl->error = Dtls13FragmentsContinue(ssl)) != 0) {
14569
                WOLFSSL_ERROR(ssl->error);
14570
                return WOLFSSL_FATAL_ERROR;
14571
        }
14572
14573
        /* we sent all the fragments. Advance state. */
14574
        ssl->options.acceptState++;
14575
    }
14576
#endif /* WOLFSSL_DTLS13 */
14577
14578
    switch (ssl->options.acceptState) {
14579
14580
#ifdef HAVE_SECURE_RENEGOTIATION
14581
        case TLS13_ACCEPT_BEGIN_RENEG:
14582
#endif
14583
        case TLS13_ACCEPT_BEGIN :
14584
            /* get client_hello */
14585
14586
            while (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
14587
                if ((ssl->error = ProcessReply(ssl)) < 0) {
14588
                    WOLFSSL_ERROR(ssl->error);
14589
                    return WOLFSSL_FATAL_ERROR;
14590
                }
14591
14592
#ifdef WOLFSSL_DTLS13
14593
                if (ssl->options.dtls) {
14594
                    if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
14595
                        WOLFSSL_ERROR(ssl->error);
14596
                        return WOLFSSL_FATAL_ERROR;
14597
                    }
14598
                }
14599
#endif /* WOLFSSL_DTLS13 */
14600
14601
            }
14602
14603
            ssl->options.acceptState = TLS13_ACCEPT_CLIENT_HELLO_DONE;
14604
            WOLFSSL_MSG("accept state ACCEPT_CLIENT_HELLO_DONE");
14605
            if (!IsAtLeastTLSv1_3(ssl->version))
14606
                return wolfSSL_accept(ssl);
14607
            FALL_THROUGH;
14608
14609
        case TLS13_ACCEPT_CLIENT_HELLO_DONE :
14610
            if (ssl->options.serverState ==
14611
                                          SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
14612
                if ((ssl->error = SendTls13ServerHello(ssl,
14613
                                                   hello_retry_request)) != 0) {
14614
                    WOLFSSL_ERROR(ssl->error);
14615
                    return WOLFSSL_FATAL_ERROR;
14616
                }
14617
            }
14618
14619
            ssl->options.acceptState = TLS13_ACCEPT_HELLO_RETRY_REQUEST_DONE;
14620
            WOLFSSL_MSG("accept state ACCEPT_HELLO_RETRY_REQUEST_DONE");
14621
            FALL_THROUGH;
14622
14623
        case TLS13_ACCEPT_HELLO_RETRY_REQUEST_DONE :
14624
    #ifdef WOLFSSL_TLS13_MIDDLEBOX_COMPAT
14625
            if (!ssl->options.dtls && ssl->options.tls13MiddleBoxCompat
14626
                && ssl->options.serverState ==
14627
                                          SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
14628
                if ((ssl->error = SendChangeCipher(ssl)) != 0) {
14629
                    WOLFSSL_ERROR(ssl->error);
14630
                    return WOLFSSL_FATAL_ERROR;
14631
                }
14632
                ssl->options.sentChangeCipher = 1;
14633
                ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
14634
            }
14635
    #endif
14636
            ssl->options.acceptState = TLS13_ACCEPT_FIRST_REPLY_DONE;
14637
            WOLFSSL_MSG("accept state ACCEPT_FIRST_REPLY_DONE");
14638
            FALL_THROUGH;
14639
14640
        case TLS13_ACCEPT_FIRST_REPLY_DONE :
14641
            if (ssl->options.serverState ==
14642
                                          SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
14643
                ssl->options.clientState = CLIENT_HELLO_RETRY;
14644
                while (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
14645
                    if ((ssl->error = ProcessReply(ssl)) < 0) {
14646
                        WOLFSSL_ERROR(ssl->error);
14647
                        return WOLFSSL_FATAL_ERROR;
14648
                    }
14649
14650
#ifdef WOLFSSL_DTLS13
14651
                if (ssl->options.dtls) {
14652
                    if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
14653
                        WOLFSSL_ERROR(ssl->error);
14654
                        return WOLFSSL_FATAL_ERROR;
14655
                    }
14656
                }
14657
#endif /* WOLFSSL_DTLS13 */
14658
14659
                }
14660
            }
14661
14662
            ssl->options.acceptState = TLS13_ACCEPT_SECOND_REPLY_DONE;
14663
            WOLFSSL_MSG("accept state ACCEPT_SECOND_REPLY_DONE");
14664
            FALL_THROUGH;
14665
14666
        case TLS13_ACCEPT_SECOND_REPLY_DONE :
14667
            if (ssl->options.returnOnGoodCh) {
14668
                /* Higher level in stack wants us to return. Simulate a
14669
                 * WANT_WRITE to accomplish this. */
14670
                ssl->error = WANT_WRITE;
14671
                return WOLFSSL_FATAL_ERROR;
14672
            }
14673
14674
            if ((ssl->error = SendTls13ServerHello(ssl, server_hello)) != 0) {
14675
                WOLFSSL_ERROR(ssl->error);
14676
                return WOLFSSL_FATAL_ERROR;
14677
            }
14678
            ssl->options.acceptState = TLS13_SERVER_HELLO_SENT;
14679
            WOLFSSL_MSG("accept state SERVER_HELLO_SENT");
14680
            FALL_THROUGH;
14681
14682
        case TLS13_SERVER_HELLO_SENT :
14683
    #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
14684
            if (!ssl->options.dtls && ssl->options.tls13MiddleBoxCompat
14685
                          && !ssl->options.sentChangeCipher && !ssl->options.dtls) {
14686
                if ((ssl->error = SendChangeCipher(ssl)) != 0) {
14687
                    WOLFSSL_ERROR(ssl->error);
14688
                    return WOLFSSL_FATAL_ERROR;
14689
                }
14690
                ssl->options.sentChangeCipher = 1;
14691
            }
14692
    #endif
14693
14694
            ssl->options.acceptState = TLS13_ACCEPT_THIRD_REPLY_DONE;
14695
            WOLFSSL_MSG("accept state ACCEPT_THIRD_REPLY_DONE");
14696
            FALL_THROUGH;
14697
14698
        case TLS13_ACCEPT_THIRD_REPLY_DONE :
14699
    #ifdef HAVE_SUPPORTED_CURVES
14700
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14701
            if (!ssl->options.noPskDheKe)
14702
        #endif
14703
            {
14704
                ssl->error = TLSX_KeyShare_DeriveSecret(ssl);
14705
                if (ssl->error != 0)
14706
                    return WOLFSSL_FATAL_ERROR;
14707
            }
14708
    #endif
14709
14710
            if ((ssl->error = SendTls13EncryptedExtensions(ssl)) != 0) {
14711
                WOLFSSL_ERROR(ssl->error);
14712
                return WOLFSSL_FATAL_ERROR;
14713
            }
14714
            ssl->options.acceptState = TLS13_SERVER_EXTENSIONS_SENT;
14715
            WOLFSSL_MSG("accept state SERVER_EXTENSIONS_SENT");
14716
            FALL_THROUGH;
14717
14718
        case TLS13_SERVER_EXTENSIONS_SENT :
14719
#ifndef NO_CERTS
14720
            if (!ssl->options.resuming) {
14721
                if (ssl->options.verifyPeer
14722
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
14723
                    && !ssl->options.verifyPostHandshake
14724
    #endif
14725
                   ) {
14726
                    ssl->error = SendTls13CertificateRequest(ssl, NULL, 0);
14727
                    if (ssl->error != 0) {
14728
                        WOLFSSL_ERROR(ssl->error);
14729
                        return WOLFSSL_FATAL_ERROR;
14730
                    }
14731
                }
14732
                else {
14733
                    /* SERVER: Peer auth good if not verifying client. */
14734
                    ssl->options.peerAuthGood = 1;
14735
                }
14736
            }
14737
#endif
14738
            ssl->options.acceptState = TLS13_CERT_REQ_SENT;
14739
            WOLFSSL_MSG("accept state CERT_REQ_SENT");
14740
            FALL_THROUGH;
14741
14742
        case TLS13_CERT_REQ_SENT :
14743
#ifndef NO_CERTS
14744
            if (!ssl->options.resuming && ssl->options.sendVerify) {
14745
                if ((ssl->error = SendTls13Certificate(ssl)) != 0) {
14746
                    WOLFSSL_ERROR(ssl->error);
14747
                    return WOLFSSL_FATAL_ERROR;
14748
                }
14749
            }
14750
#endif
14751
            ssl->options.acceptState = TLS13_CERT_SENT;
14752
            WOLFSSL_MSG("accept state CERT_SENT");
14753
            FALL_THROUGH;
14754
14755
        case TLS13_CERT_SENT :
14756
#if !defined(NO_CERTS) && (!defined(NO_RSA) || defined(HAVE_ECC) || \
14757
     defined(HAVE_ED25519) || defined(HAVE_ED448) || defined(HAVE_FALCON) || \
14758
     defined(HAVE_DILITHIUM))
14759
            if (!ssl->options.resuming && ssl->options.sendVerify) {
14760
                if ((ssl->error = SendTls13CertificateVerify(ssl)) != 0) {
14761
                    WOLFSSL_ERROR(ssl->error);
14762
                    return WOLFSSL_FATAL_ERROR;
14763
                }
14764
            }
14765
#endif
14766
            ssl->options.acceptState = TLS13_CERT_VERIFY_SENT;
14767
            WOLFSSL_MSG("accept state CERT_VERIFY_SENT");
14768
            FALL_THROUGH;
14769
14770
        case TLS13_CERT_VERIFY_SENT :
14771
            if ((ssl->error = SendTls13Finished(ssl)) != 0) {
14772
                WOLFSSL_ERROR(ssl->error);
14773
                return WOLFSSL_FATAL_ERROR;
14774
            }
14775
14776
            ssl->options.acceptState = TLS13_ACCEPT_FINISHED_SENT;
14777
            WOLFSSL_MSG("accept state ACCEPT_FINISHED_SENT");
14778
            FALL_THROUGH;
14779
14780
        case TLS13_ACCEPT_FINISHED_SENT:
14781
#ifdef WOLFSSL_EARLY_DATA
14782
            if (ssl->earlyData != no_early_data &&
14783
                    ssl->options.handShakeState != SERVER_FINISHED_COMPLETE) {
14784
                ssl->options.handShakeState = SERVER_FINISHED_COMPLETE;
14785
                return WOLFSSL_SUCCESS;
14786
            }
14787
#endif
14788
#ifdef HAVE_SESSION_TICKET
14789
    #ifdef WOLFSSL_TLS13_TICKET_BEFORE_FINISHED
14790
            if (!ssl->options.verifyPeer && !ssl->options.noTicketTls13 &&
14791
                                                ssl->ctx->ticketEncCb != NULL) {
14792
                if ((ssl->error = SendTls13NewSessionTicket(ssl)) != 0) {
14793
                    WOLFSSL_ERROR(ssl->error);
14794
                    return WOLFSSL_FATAL_ERROR;
14795
                }
14796
                ssl->options.ticketsSent = 1;
14797
            }
14798
    #endif
14799
#endif /* HAVE_SESSION_TICKET */
14800
            ssl->options.acceptState = TLS13_PRE_TICKET_SENT;
14801
            WOLFSSL_MSG("accept state  TICKET_SENT");
14802
            FALL_THROUGH;
14803
14804
        case TLS13_PRE_TICKET_SENT :
14805
            while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE) {
14806
                if ( (ssl->error = ProcessReply(ssl)) < 0) {
14807
                        WOLFSSL_ERROR(ssl->error);
14808
                        return WOLFSSL_FATAL_ERROR;
14809
                    }
14810
14811
#ifdef WOLFSSL_DTLS13
14812
                if (ssl->options.dtls) {
14813
                    if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
14814
                        WOLFSSL_ERROR(ssl->error);
14815
                        return WOLFSSL_FATAL_ERROR;
14816
                    }
14817
                }
14818
#endif /* WOLFSSL_DTLS13 */
14819
            }
14820
14821
            ssl->options.acceptState = TLS13_ACCEPT_FINISHED_DONE;
14822
            WOLFSSL_MSG("accept state ACCEPT_FINISHED_DONE");
14823
            FALL_THROUGH;
14824
14825
        case TLS13_ACCEPT_FINISHED_DONE :
14826
            /* SERVER: When not resuming and verifying peer but no certificate
14827
             * received and not failing when not received then peer auth good.
14828
             */
14829
            if (!ssl->options.resuming && ssl->options.verifyPeer &&
14830
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
14831
                !ssl->options.verifyPostHandshake &&
14832
        #endif
14833
                !ssl->options.havePeerCert && !ssl->options.failNoCert) {
14834
                ssl->options.peerAuthGood = 1;
14835
            }
14836
            /* SERVER: check peer authentication. */
14837
            if (!ssl->options.peerAuthGood) {
14838
                WOLFSSL_MSG("Client authentication did not happen");
14839
                return WOLFSSL_FATAL_ERROR;
14840
            }
14841
#ifdef HAVE_SESSION_TICKET
14842
            while (ssl->options.ticketsSent < ssl->options.maxTicketTls13) {
14843
                if (!ssl->options.noTicketTls13 && ssl->ctx->ticketEncCb
14844
                        != NULL) {
14845
                    if ((ssl->error = SendTls13NewSessionTicket(ssl)) != 0) {
14846
                        WOLFSSL_ERROR(ssl->error);
14847
                        return WOLFSSL_FATAL_ERROR;
14848
                    }
14849
                }
14850
                ssl->options.ticketsSent++;
14851
14852
                /* only one session ticket is sent on session resumption */
14853
                if (ssl->options.resuming) {
14854
                    break;
14855
                }
14856
            }
14857
#endif /* HAVE_SESSION_TICKET */
14858
            ssl->options.acceptState = TLS13_TICKET_SENT;
14859
            WOLFSSL_MSG("accept state TICKET_SENT");
14860
            FALL_THROUGH;
14861
14862
        case TLS13_TICKET_SENT :
14863
#ifndef NO_HANDSHAKE_DONE_CB
14864
            if (ssl->hsDoneCb) {
14865
                int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
14866
                if (cbret < 0) {
14867
                    ssl->error = cbret;
14868
                    WOLFSSL_MSG("HandShake Done Cb don't continue error");
14869
                    return WOLFSSL_FATAL_ERROR;
14870
                }
14871
            }
14872
#endif /* NO_HANDSHAKE_DONE_CB */
14873
14874
            if (!ssl->options.keepResources) {
14875
                FreeHandshakeResources(ssl);
14876
            }
14877
14878
#if defined(WOLFSSL_ASYNC_IO) && !defined(WOLFSSL_ASYNC_CRYPT)
14879
            /* Free the remaining async context if not using it for crypto */
14880
            FreeAsyncCtx(ssl, 1);
14881
#endif
14882
14883
            ssl->error = 0; /* clear the error */
14884
14885
            WOLFSSL_LEAVE("wolfSSL_accept", WOLFSSL_SUCCESS);
14886
            return WOLFSSL_SUCCESS;
14887
14888
        default:
14889
            WOLFSSL_MSG("Unknown accept state ERROR");
14890
            return WOLFSSL_FATAL_ERROR;
14891
    }
14892
}
14893
#endif
14894
14895
#if !defined(NO_WOLFSSL_SERVER) && defined(HAVE_SESSION_TICKET)
14896
/* Server sends a session ticket to the peer.
14897
 *
14898
 * RFC 8446, section 4.6.1, para 1.
14899
 *
14900
 * ssl  The SSL/TLS object.
14901
 * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
14902
 *         SIDE_ERROR when not a server,
14903
 *         NOT_READY_ERROR when handshake not complete,
14904
 *         WOLFSSL_FATAL_ERROR when creating or sending message fails, and
14905
 *         WOLFSSL_SUCCESS on success.
14906
 */
14907
int wolfSSL_send_SessionTicket(WOLFSSL* ssl)
14908
{
14909
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
14910
        return BAD_FUNC_ARG;
14911
    if (ssl->options.side == WOLFSSL_CLIENT_END)
14912
        return SIDE_ERROR;
14913
    if (ssl->options.handShakeState != HANDSHAKE_DONE)
14914
        return NOT_READY_ERROR;
14915
14916
    if ((ssl->error = SendTls13NewSessionTicket(ssl)) != 0) {
14917
        WOLFSSL_ERROR(ssl->error);
14918
        return WOLFSSL_FATAL_ERROR;
14919
    }
14920
    ssl->options.ticketsSent++;
14921
14922
    return WOLFSSL_SUCCESS;
14923
}
14924
#endif
14925
14926
#ifdef WOLFSSL_EARLY_DATA
14927
/* Sets the maximum amount of early data that can be seen by server when using
14928
 * session tickets for resumption.
14929
 * A value of zero indicates no early data is to be sent by client using session
14930
 * tickets.
14931
 *
14932
 * ctx  The SSL/TLS CTX object.
14933
 * sz   Maximum size of the early data.
14934
 * returns BAD_FUNC_ARG when ctx is NULL, SIDE_ERROR when not a server and
14935
 * 0 on success.
14936
 */
14937
int wolfSSL_CTX_set_max_early_data(WOLFSSL_CTX* ctx, unsigned int sz)
14938
{
14939
    if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version))
14940
        return BAD_FUNC_ARG;
14941
    if (ctx->method->side == WOLFSSL_CLIENT_END)
14942
        return SIDE_ERROR;
14943
14944
    ctx->maxEarlyDataSz = sz;
14945
14946
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_ERROR_CODE_OPENSSL)
14947
    /* 1 on success in OpenSSL*/
14948
    return WOLFSSL_SUCCESS;
14949
#else
14950
    return 0;
14951
#endif
14952
}
14953
14954
/* Sets the maximum amount of early data that a client or server would like
14955
 * to exchange. Servers will advertise this value in session tickets sent
14956
 * to a client.
14957
 * A value of zero indicates no early data will be sent by a client, or
14958
 * no early data is accepted by a server (and announced as such in send out
14959
 * session tickets).
14960
 *
14961
 * ssl  The SSL/TLS object.
14962
 * sz   Maximum size of the early data.
14963
 * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
14964
 * and 0 on success.
14965
 */
14966
int wolfSSL_set_max_early_data(WOLFSSL* ssl, unsigned int sz)
14967
{
14968
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
14969
        return BAD_FUNC_ARG;
14970
14971
    ssl->options.maxEarlyDataSz = sz;
14972
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_ERROR_CODE_OPENSSL)
14973
    /* 1 on success in OpenSSL*/
14974
    return WOLFSSL_SUCCESS;
14975
#else
14976
    return 0;
14977
#endif
14978
}
14979
14980
/* Gets the maximum amount of early data that can be seen by server when using
14981
 * session tickets for resumption.
14982
 * A value of zero indicates no early data is to be sent by client using session
14983
 * tickets.
14984
 *
14985
 * ctx  The SSL/TLS CTX object.
14986
 * returns BAD_FUNC_ARG when ctx is NULL, SIDE_ERROR when not a server and
14987
 * returns the maximum amount of early data to be set
14988
 */
14989
int wolfSSL_CTX_get_max_early_data(WOLFSSL_CTX* ctx)
14990
{
14991
    if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version))
14992
        return BAD_FUNC_ARG;
14993
    if (ctx->method->side == WOLFSSL_CLIENT_END)
14994
        return SIDE_ERROR;
14995
14996
    return ctx->maxEarlyDataSz;
14997
}
14998
14999
/* Gets the maximum amount of early data that can be seen by server when using
15000
 * session tickets for resumption.
15001
 * A value of zero indicates no early data is to be sent by client using session
15002
 * tickets.
15003
 *
15004
 * ssl  The SSL/TLS object.
15005
 * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
15006
 * SIDE_ERROR when not a server and
15007
 * returns the maximum amount of early data to be set
15008
 */
15009
int wolfSSL_get_max_early_data(WOLFSSL* ssl)
15010
{
15011
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
15012
        return BAD_FUNC_ARG;
15013
15014
    return ssl->options.maxEarlyDataSz;
15015
}
15016
15017
/* Write early data to the server.
15018
 *
15019
 * ssl    The SSL/TLS object.
15020
 * data   Early data to write
15021
 * sz     The size of the early data in bytes.
15022
 * outSz  The number of early data bytes written.
15023
 * returns BAD_FUNC_ARG when: ssl, data or outSz is NULL; sz is negative;
15024
 * or not using TLS v1.3. SIDE ERROR when not a server. BAD_STATE_E if invoked
15025
 * without a valid session or without a valid PSK CB.
15026
 * Otherwise the number of early data bytes written.
15027
 */
15028
int wolfSSL_write_early_data(WOLFSSL* ssl, const void* data, int sz, int* outSz)
15029
{
15030
    int ret = 0;
15031
15032
    WOLFSSL_ENTER("wolfSSL_write_early_data");
15033
15034
    if (ssl == NULL || data == NULL || sz < 0 || outSz == NULL)
15035
        return BAD_FUNC_ARG;
15036
    if (!IsAtLeastTLSv1_3(ssl->version))
15037
        return BAD_FUNC_ARG;
15038
15039
#ifndef NO_WOLFSSL_CLIENT
15040
    if (ssl->options.side == WOLFSSL_SERVER_END)
15041
        return SIDE_ERROR;
15042
15043
    /* Early data requires PSK or session resumption */
15044
    if (!EarlyDataPossible(ssl)) {
15045
        return BAD_STATE_E;
15046
    }
15047
15048
    if (ssl->options.handShakeState == NULL_STATE) {
15049
        /* avoid re-setting ssl->earlyData if we re-enter the function because
15050
         * of WC_PENDING_E, WANT_WRITE or WANT_READ */
15051
        if (ssl->error == 0)
15052
            ssl->earlyData = expecting_early_data;
15053
        ret = wolfSSL_connect_TLSv13(ssl);
15054
        if (ret != WOLFSSL_SUCCESS)
15055
            return WOLFSSL_FATAL_ERROR;
15056
        /* on client side, status is set to rejected        */
15057
        /* until sever accepts the early data extension.    */
15058
        ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_REJECTED;
15059
    }
15060
    if (ssl->options.handShakeState == CLIENT_HELLO_COMPLETE) {
15061
#ifdef OPENSSL_EXTRA
15062
        /* when processed early data exceeds max size */
15063
        if (ssl->session->maxEarlyDataSz > 0 &&
15064
            (ssl->earlyDataSz + sz > ssl->session->maxEarlyDataSz)) {
15065
            ssl->error = TOO_MUCH_EARLY_DATA;
15066
            return WOLFSSL_FATAL_ERROR;
15067
        }
15068
#endif
15069
        ret = SendData(ssl, data, sz);
15070
        if (ret > 0) {
15071
            *outSz = ret;
15072
            /* store amount of processed early data from client */
15073
            ssl->earlyDataSz += ret;
15074
        }
15075
    }
15076
#else
15077
    return SIDE_ERROR;
15078
#endif
15079
15080
    WOLFSSL_LEAVE("wolfSSL_write_early_data", ret);
15081
15082
    if (ret < 0)
15083
        ret = WOLFSSL_FATAL_ERROR;
15084
    return ret;
15085
}
15086
15087
/* Read the any early data from the client.
15088
 *
15089
 * ssl    The SSL/TLS object.
15090
 * data   Buffer to put the early data into.
15091
 * sz     The size of the buffer in bytes.
15092
 * outSz  The number of early data bytes read.
15093
 * returns BAD_FUNC_ARG when: ssl, data or outSz is NULL; sz is negative;
15094
 * or not using TLS v1.3. SIDE ERROR when not a server. Otherwise the number of
15095
 * early data bytes read.
15096
 */
15097
int wolfSSL_read_early_data(WOLFSSL* ssl, void* data, int sz, int* outSz)
15098
{
15099
    int ret = 0;
15100
15101
    WOLFSSL_ENTER("wolfSSL_read_early_data");
15102
15103
15104
    if (ssl == NULL || data == NULL || sz < 0 || outSz == NULL)
15105
        return BAD_FUNC_ARG;
15106
    if (!IsAtLeastTLSv1_3(ssl->version))
15107
        return BAD_FUNC_ARG;
15108
15109
    *outSz = 0;
15110
#ifndef NO_WOLFSSL_SERVER
15111
    if (ssl->options.side == WOLFSSL_CLIENT_END)
15112
        return SIDE_ERROR;
15113
15114
    if (ssl->options.handShakeState == NULL_STATE) {
15115
        /* the server flight can return WANT_WRITE and we re-enter here after
15116
         * setting ssl->earlyData = process_early_data, set earlyData to
15117
         * expecting_early_data just once */
15118
        if (ssl->earlyData < expecting_early_data)
15119
            ssl->earlyData = expecting_early_data;
15120
        /* this used to be: ret = wolfSSL_accept_TLSv13(ssl);
15121
         * However, wolfSSL_accept_TLSv13() expects a certificate to
15122
         * be installed already, which is not the case in servers
15123
         * such as HAProxy. They do it after inspecting the ClientHello.
15124
         * The common wolfssl_accept() allows that. */
15125
        ret = wolfSSL_accept(ssl);
15126
        if (ret <= 0)
15127
            return WOLFSSL_FATAL_ERROR;
15128
    }
15129
    if (ssl->options.handShakeState == SERVER_FINISHED_COMPLETE) {
15130
        ssl->options.clientInEarlyData = 1;
15131
        ret = ReceiveData(ssl, (byte*)data, (size_t)sz, FALSE);
15132
        ssl->options.clientInEarlyData = 0;
15133
        if (ret > 0)
15134
            *outSz = ret;
15135
        if (ssl->error == WC_NO_ERR_TRACE(APP_DATA_READY)) {
15136
            ret = 0;
15137
            ssl->error = WOLFSSL_ERROR_NONE;
15138
#ifdef WOLFSSL_DTLS13
15139
            if (ssl->options.dtls) {
15140
                ret = Dtls13DoScheduledWork(ssl);
15141
                if (ret  < 0) {
15142
                    ssl->error = ret;
15143
                    WOLFSSL_ERROR(ssl->error);
15144
                    return WOLFSSL_FATAL_ERROR;
15145
                }
15146
            }
15147
#endif /* WOLFSSL_DTLS13 */
15148
        }
15149
    }
15150
#ifdef WOLFSSL_DTLS13
15151
    else if (ssl->buffers.outputBuffer.length > 0 &&
15152
        ssl->options.dtls && ssl->dtls13SendingAckOrRtx) {
15153
        ret = SendBuffered(ssl);
15154
        if (ret == 0) {
15155
            ssl->dtls13SendingAckOrRtx = 0;
15156
        }
15157
        else {
15158
            ssl->error = ret;
15159
            WOLFSSL_ERROR(ssl->error);
15160
            return WOLFSSL_FATAL_ERROR;
15161
        }
15162
    }
15163
#endif /* WOLFSSL_DTLS13 */
15164
    else
15165
        ret = 0;
15166
#else
15167
    return SIDE_ERROR;
15168
#endif
15169
15170
    WOLFSSL_LEAVE("wolfSSL_read_early_data", ret);
15171
15172
    if (ret < 0)
15173
        ret = WOLFSSL_FATAL_ERROR;
15174
    return ret;
15175
}
15176
15177
/* Returns early data status
15178
 *
15179
 * ssl    The SSL/TLS object.
15180
 * returns WOLFSSL_EARLY_DATA_ACCEPTED if the data was accepted
15181
 *         WOLFSSL_EARLY_DATA_REJECTED if the data was rejected
15182
 *         WOLFSSL_EARLY_DATA_NOT_SENT if no early data was sent
15183
 */
15184
int wolfSSL_get_early_data_status(const WOLFSSL* ssl)
15185
{
15186
    if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
15187
        return BAD_FUNC_ARG;
15188
15189
    return ssl->earlyDataStatus;
15190
}
15191
#endif
15192
15193
#ifdef HAVE_SECRET_CALLBACK
15194
int wolfSSL_set_tls13_secret_cb(WOLFSSL* ssl, Tls13SecretCb cb, void* ctx)
15195
{
15196
    WOLFSSL_ENTER("wolfSSL_set_tls13_secret_cb");
15197
    if (ssl == NULL)
15198
        return WOLFSSL_FATAL_ERROR;
15199
15200
    ssl->tls13SecretCb = cb;
15201
    ssl->tls13SecretCtx = ctx;
15202
15203
    return WOLFSSL_SUCCESS;
15204
}
15205
15206
#if defined(SHOW_SECRETS) && defined(WOLFSSL_SSLKEYLOGFILE)
15207
int tls13ShowSecrets(WOLFSSL* ssl, int id, const unsigned char* secret,
15208
    int secretSz, void* ctx)
15209
{
15210
    int i;
15211
    const char* str = NULL;
15212
    byte clientRandom[RAN_LEN];
15213
    int clientRandomSz;
15214
    XFILE fp;
15215
15216
    (void) ctx;
15217
#ifdef WOLFSSL_SSLKEYLOGFILE_OUTPUT
15218
    fp = XFOPEN(WOLFSSL_SSLKEYLOGFILE_OUTPUT, "ab");
15219
    if (fp == XBADFILE) {
15220
        return BAD_FUNC_ARG;
15221
    }
15222
#else
15223
    fp = stderr;
15224
#endif
15225
15226
    clientRandomSz = (int)wolfSSL_get_client_random(ssl, clientRandom,
15227
        sizeof(clientRandom));
15228
15229
    if (clientRandomSz <= 0) {
15230
        printf("Error getting server random %d\n", clientRandomSz);
15231
        return BAD_FUNC_ARG;
15232
    }
15233
15234
#if 0
15235
    printf("TLS Server Secret CB: Rand %d, Secret %d\n",
15236
        serverRandomSz, secretSz);
15237
#endif
15238
15239
    switch (id) {
15240
        case CLIENT_EARLY_TRAFFIC_SECRET:
15241
            str = "CLIENT_EARLY_TRAFFIC_SECRET"; break;
15242
        case EARLY_EXPORTER_SECRET:
15243
            str = "EARLY_EXPORTER_SECRET"; break;
15244
        case CLIENT_HANDSHAKE_TRAFFIC_SECRET:
15245
            str = "CLIENT_HANDSHAKE_TRAFFIC_SECRET"; break;
15246
        case SERVER_HANDSHAKE_TRAFFIC_SECRET:
15247
            str = "SERVER_HANDSHAKE_TRAFFIC_SECRET"; break;
15248
        case CLIENT_TRAFFIC_SECRET:
15249
            str = "CLIENT_TRAFFIC_SECRET_0"; break;
15250
        case SERVER_TRAFFIC_SECRET:
15251
            str = "SERVER_TRAFFIC_SECRET_0"; break;
15252
        case EXPORTER_SECRET:
15253
            str = "EXPORTER_SECRET"; break;
15254
        default:
15255
#ifdef WOLFSSL_SSLKEYLOGFILE_OUTPUT
15256
            XFCLOSE(fp);
15257
#endif
15258
            return BAD_FUNC_ARG;
15259
            break;
15260
    }
15261
15262
    fprintf(fp, "%s ", str);
15263
    for (i = 0; i < (int)clientRandomSz; i++) {
15264
        fprintf(fp, "%02x", clientRandom[i]);
15265
    }
15266
    fprintf(fp, " ");
15267
    for (i = 0; i < secretSz; i++) {
15268
        fprintf(fp, "%02x", secret[i]);
15269
    }
15270
    fprintf(fp, "\n");
15271
15272
#ifdef WOLFSSL_SSLKEYLOGFILE_OUTPUT
15273
    XFCLOSE(fp);
15274
#endif
15275
15276
    return 0;
15277
}
15278
#endif
15279
#endif
15280
15281
#undef ERROR_OUT
15282
15283
#endif /* !WOLFCRYPT_ONLY */
15284
15285
#endif /* !NO_TLS && WOLFSSL_TLS13 */