Coverage Report

Created: 2025-07-23 06:59

/src/wolfssl-fastmath/src/internal.c
Line
Count
Source (jump to first uncovered line)
1
/* internal.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
 * WOLFSSL_SMALL_CERT_VERIFY:
26
 *     Verify the certificate signature without using DecodedCert. Doubles up
27
 *     on some code but allows smaller peak heap memory usage.
28
 *     Cannot be used with WOLFSSL_NONBLOCK_OCSP.
29
 * WOLFSSL_ALT_CERT_CHAINS:
30
 *     Allows CA's to be presented by peer, but not part of a valid chain.
31
 *     Default wolfSSL behavior is to require validation of all presented peer
32
 *     certificates. This also allows loading intermediate CA's as trusted
33
 *     and ignoring no signer failures for CA's up the chain to root.
34
 * WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT:
35
 *     Enable resending the previous DTLS handshake flight only on a network
36
 *     read timeout. By default we resend in two more cases, when we receive:
37
 *     - an out of order last msg of the peer's flight
38
 *     - a duplicate of the first msg from the peer's flight
39
 * WOLFSSL_NO_DEF_TICKET_ENC_CB:
40
 *     No default ticket encryption callback.
41
 *     Server only.
42
 *     Application must set its own callback to use session tickets.
43
 * WOLFSSL_TICKET_ENC_CHACHA20_POLY1305
44
 *     Use ChaCha20-Poly1305 to encrypt/decrypt session tickets in default
45
 *     callback. Default algorithm if none defined and algorithms compiled in.
46
 *     Server only.
47
 * WOLFSSL_TICKET_ENC_AES128_GCM
48
 *     Use AES128-GCM to encrypt/decrypt session tickets in default callback.
49
 *     Server only. Default algorithm if ChaCha20/Poly1305 not compiled in.
50
 * WOLFSSL_TICKET_ENC_AES256_GCM
51
 *     Use AES256-GCM to encrypt/decrypt session tickets in default callback.
52
 *     Server only.
53
 * WOLFSSL_TICKET_DECRYPT_NO_CREATE
54
 *     Default callback will not request creation of new ticket on successful
55
 *     decryption.
56
 *     Server only.
57
 * WOLFSSL_TLS13_NO_PEEK_HANDSHAKE_DONE
58
 *     Once a normal TLS 1.3 handshake is complete, a session ticket message
59
 *     may be received by a client. To support detecting this, peek will
60
 *     return WOLFSSL_ERROR_WANT_READ.
61
 *     This define turns off this behaviour.
62
 * WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY
63
 *     Verify hostname/ip address using alternate name (SAN) only and do not
64
 *     use the common name. Forces use of the alternate name, so certificates
65
 *     missing SAN will be rejected during the handshake
66
 * WOLFSSL_CHECK_SIG_FAULTS
67
 *     Verifies the ECC signature after signing in case of faults in the
68
 *     calculation of the signature. Useful when signature fault injection is a
69
 *     possible attack.
70
 * WOLFSSL_TLS13_IGNORE_AEAD_LIMITS
71
 *     Ignore the AEAD limits for messages specified in the RFC. After
72
 *     reaching the limit, we initiate a key update. We enforce the AEAD limits
73
 *     by default.
74
 *     https://www.rfc-editor.org/rfc/rfc8446#section-5.5
75
 *     https://www.rfc-editor.org/rfc/rfc9147.html#name-aead-limits
76
 * WOLFSSL_HARDEN_TLS
77
 *     Implement the recommendations specified in RFC9325. This macro needs to
78
 *     be defined to the desired number of bits of security. The currently
79
 *     implemented values are 112 and 128 bits. The following macros disable
80
 *     certain checks.
81
 *     - WOLFSSL_HARDEN_TLS_ALLOW_TRUNCATED_HMAC
82
 *     - WOLFSSL_HARDEN_TLS_ALLOW_OLD_TLS
83
 *     - WOLFSSL_HARDEN_TLS_NO_SCR_CHECK
84
 *     - WOLFSSL_HARDEN_TLS_NO_PKEY_CHECK
85
 *     - WOLFSSL_HARDEN_TLS_ALLOW_ALL_CIPHERSUITES
86
 * WOLFSSL_NO_INIT_CTX_KEY
87
 *      Allows SSL objects to be created from a CTX without a loaded key/cert
88
 *      pair
89
 * WOLFSSL_DTLS_RECORDS_CAN_SPAN_DATAGRAMS:
90
 *     When defined, allows DTLS records to span across multiple datagrams.
91
 */
92
93
#ifndef WOLFCRYPT_ONLY
94
95
#include <wolfssl/internal.h>
96
#include <wolfssl/error-ssl.h>
97
#include <wolfssl/wolfcrypt/asn.h>
98
#include <wolfssl/wolfcrypt/dh.h>
99
#ifdef NO_INLINE
100
    #include <wolfssl/wolfcrypt/misc.h>
101
#else
102
    #define WOLFSSL_MISC_INCLUDED
103
    #include <wolfcrypt/src/misc.c>
104
#endif
105
#if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA)
106
    #include <wolfssl/wolfcrypt/srp.h>
107
#endif
108
109
#if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
110
    #include <wolfssl/wolfcrypt/coding.h>
111
#endif
112
#ifdef HAVE_LIBZ
113
    #include "zlib.h"
114
#endif
115
116
#ifdef WOLFSSL_QNX_CAAM
117
    /* included to get CAAM devId value */
118
    #include <wolfssl/wolfcrypt/port/caam/wolfcaam.h>
119
#endif
120
121
#ifdef HAVE_ARIA
122
    /* included to get ARIA devId value */
123
    #include <wolfssl/wolfcrypt/port/aria/aria-cryptocb.h>
124
#endif
125
126
#if defined(DEBUG_WOLFSSL) || defined(SHOW_SECRETS) || \
127
    defined(CHACHA_AEAD_TEST) || defined(WOLFSSL_SESSION_EXPORT_DEBUG)
128
    #ifndef NO_STDIO_FILESYSTEM
129
        #ifdef FUSION_RTOS
130
            #include <fclstdio.h>
131
        #else
132
            #include <stdio.h>
133
        #endif
134
    #endif
135
#endif
136
137
#ifdef __sun
138
    #include <sys/filio.h>
139
#endif
140
141
142
151
#define ERROR_OUT(err, eLabel) { ret = (int)(err); goto eLabel; }
143
144
#ifdef _MSC_VER
145
    /* disable for while(0) cases at the .c level for now */
146
    #pragma warning(disable:4127)
147
#endif
148
149
#if defined(WOLFSSL_CALLBACKS) && !defined(LARGE_STATIC_BUFFERS)
150
    #error \
151
WOLFSSL_CALLBACKS needs LARGE_STATIC_BUFFERS, please add LARGE_STATIC_BUFFERS
152
#endif
153
154
#if defined(HAVE_SECURE_RENEGOTIATION) && defined(HAVE_RENEGOTIATION_INDICATION)
155
    #error Cannot use both secure-renegotiation and renegotiation-indication
156
#endif
157
158
#if !defined(NO_TLS) && !defined(WOLFSSL_NO_TLS12)
159
160
#ifndef NO_WOLFSSL_CLIENT
161
    static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input,
162
                                   word32* inOutIdx, word32 size);
163
    #ifndef NO_CERTS
164
        static int DoCertificateRequest(WOLFSSL* ssl, const byte* input,
165
                                        word32* inOutIdx, word32 size);
166
    #endif
167
    #ifdef HAVE_SESSION_TICKET
168
        static int DoSessionTicket(WOLFSSL* ssl, const byte* input,
169
                                   word32* inOutIdx, word32 size);
170
    #endif
171
#endif /* !NO_WOLFSSL_CLIENT */
172
173
174
#ifndef NO_WOLFSSL_SERVER
175
    static int DoClientKeyExchange(WOLFSSL* ssl, byte* input,
176
                                   word32* inOutIdx, word32 size);
177
    #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
178
                        defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
179
        static int DoCertificateVerify(WOLFSSL* ssl, byte* input,
180
                                       word32* inOutIdx, word32 size);
181
    #endif
182
#endif /* !NO_WOLFSSL_SERVER */
183
184
#endif /* !NO_TLS && !WOLFSSL_NO_TLS12 */
185
186
#if !defined(NO_WOLFSSL_SERVER) && defined(HAVE_SESSION_TICKET)
187
    #if defined(WOLFSSL_HAPROXY)
188
        #define SSL_TICKET_CTX(ssl) ssl->initial_ctx->ticketEncCtx
189
    #else
190
        #define SSL_TICKET_CTX(ssl) ssl->ctx->ticketEncCtx
191
    #endif
192
    #if !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && !defined(NO_TLS)
193
        static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx,
194
                                       TicketEncCbCtx* keyCtx);
195
        static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx);
196
        static int DefTicketEncCb(WOLFSSL* ssl,
197
                                  byte key_name[WOLFSSL_TICKET_NAME_SZ],
198
                                  byte iv[WOLFSSL_TICKET_IV_SZ],
199
                                  byte mac[WOLFSSL_TICKET_MAC_SZ],
200
                                  int enc, byte* ticket, int inLen, int* outLen,
201
                                  void* userCtx);
202
    #endif
203
#endif /* !NO_WOLFSSL_SERVER && HAVE_SESSION_TICKET */
204
205
int writeAeadAuthData(WOLFSSL* ssl, word16 sz, byte type, byte* additional,
206
                      byte dec, byte** seq, int verifyOrder);
207
208
#ifdef WOLFSSL_DTLS
209
    static int _DtlsCheckWindow(WOLFSSL* ssl);
210
#endif
211
212
#if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS)
213
#include <Security/SecCertificate.h>
214
#include <Security/SecTrust.h>
215
#include <Security/SecPolicy.h>
216
static int DoAppleNativeCertValidation(WOLFSSL* ssl, const WOLFSSL_BUFFER_INFO* certs,
217
                                            int totalCerts);
218
#endif /* #if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) */
219
220
#ifdef WOLFSSL_DTLS13
221
#ifndef WOLFSSL_DTLS13_SEND_MOREACK_DEFAULT
222
#define WOLFSSL_DTLS13_SEND_MOREACK_DEFAULT 0
223
#endif
224
#endif /* WOLFSSL_DTLS13 */
225
226
enum processReply {
227
    doProcessInit = 0,
228
#ifndef NO_WOLFSSL_SERVER
229
    runProcessOldClientHello,
230
#endif
231
    getRecordLayerHeader,
232
    getData,
233
    verifyEncryptedMessage,
234
    decryptMessage,
235
    verifyMessage,
236
    runProcessingOneRecord,
237
    runProcessingOneMessage
238
};
239
240
241
#if !defined(NO_TLS) && !defined(WOLFSSL_NO_TLS12)
242
#if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
243
244
/* Server random bytes for TLS v1.3 described downgrade protection mechanism. */
245
static const byte tls13Downgrade[7] = {
246
    0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x44
247
};
248
249
0
#define TLS13_DOWNGRADE_SZ  sizeof(tls13Downgrade)
250
251
#endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
252
253
#if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
254
static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
255
                    int padLen, int content, int verify, int epochOrder);
256
257
#endif
258
259
#endif /* !NO_TLS && !WOLFSSL_NO_TLS12 */
260
261
262
#if !defined(NO_CERT) && defined(WOLFSSL_BLIND_PRIVATE_KEY)
263
int wolfssl_priv_der_blind(WC_RNG* rng, DerBuffer* key, DerBuffer** mask)
264
{
265
    int ret = 0;
266
    WC_RNG local_rng;
267
268
    if (key != NULL) {
269
        if (*mask != NULL) {
270
            FreeDer(mask);
271
        }
272
        ret = AllocDer(mask, key->length, key->type, key->heap);
273
        if ((ret == 0) && (rng == NULL)) {
274
            if (wc_InitRng(&local_rng) != 0) {
275
                ret = RNG_FAILURE_E;
276
            }
277
            else {
278
                rng = &local_rng;
279
            }
280
        }
281
        if (ret == 0) {
282
             ret = wc_RNG_GenerateBlock(rng, (*mask)->buffer, (*mask)->length);
283
        }
284
        if (ret == 0) {
285
            xorbuf(key->buffer, (*mask)->buffer, (*mask)->length);
286
        }
287
288
        if (rng == &local_rng) {
289
            wc_FreeRng(rng);
290
        }
291
    }
292
293
    return ret;
294
}
295
296
void wolfssl_priv_der_unblind(DerBuffer* key, DerBuffer* mask)
297
{
298
    if (key != NULL) {
299
        xorbuf(key->buffer, mask->buffer, mask->length);
300
    }
301
}
302
#endif /* !NO_CERT && WOLFSSL_BLIND_PRIVATE_KEY */
303
304
305
#if defined(WOLFSSL_RENESAS_FSPSM_TLS) || defined(WOLFSSL_RENESAS_TSIP_TLS)
306
#include <wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h>
307
#endif
308
309
#if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
310
311
    static int  SessionSecret_callback(WOLFSSL* ssl, void* secret,
312
                                                  int* secretSz, void* ctx);
313
#ifdef WOLFSSL_TLS13
314
    static int  SessionSecret_callback_Tls13(WOLFSSL* ssl, int id,
315
                       const unsigned char* secret, int secretSz, void* ctx);
316
#endif
317
318
319
    /* Label string for client random. */
320
    #define SSC_CR      "CLIENT_RANDOM"
321
322
    /*
323
     * This function builds up string for key-logging then call user's
324
     * key-log-callback to pass the string for TLS1.2 and older.
325
     * The user's key-logging callback has been set via
326
     * wolfSSL_CTX_set_keylog_callback function. The logging string format is:
327
     * "CLIENT_RANDOM <hex-encoded client random> <hex-encoded master-secret>"
328
     * parameter
329
     *  - ssl: WOLFSSL object
330
     *  - secret: pointer to the buffer holding master-secret
331
     *  - secretSz: size of secret
332
     *  - ctx: not used
333
     * returns 0 on success, negative value on failure.
334
     */
335
    static int SessionSecret_callback(WOLFSSL* ssl, void* secret,
336
                    int* secretSz, void* ctx)
337
    {
338
        wolfSSL_CTX_keylog_cb_func logCb = NULL;
339
        int msSz;
340
        int invalidCount;
341
        int i;
342
        const char* label = SSC_CR;
343
        int labelSz = sizeof(SSC_CR);
344
        int buffSz;
345
        byte* log = NULL;
346
        word32 outSz;
347
        int idx;
348
        int ret;
349
        (void)ctx;
350
351
        if (ssl == NULL || secret == NULL || secretSz == NULL || *secretSz == 0)
352
            return BAD_FUNC_ARG;
353
        if (ssl->arrays == NULL)
354
            return BAD_FUNC_ARG;
355
356
        /* get the user-callback func from CTX */
357
        logCb = ssl->ctx->keyLogCb;
358
        if (logCb == NULL) {
359
            return 0; /* no logging callback */
360
        }
361
362
        /* make sure the given master-secret has a meaningful value */
363
        msSz   = *secretSz;
364
        invalidCount = 0;
365
        for (i = 0; i < msSz; i++) {
366
            if (((byte*)secret)[i] == 0) {
367
                invalidCount++;
368
            }
369
        }
370
        if (invalidCount == *secretSz) {
371
            WOLFSSL_MSG("master-secret is not valid");
372
            return 0; /* ignore error */
373
        }
374
375
        /* build up a hex-decoded keylog string
376
         * "CLIENT_RANDOM <hex-encoded client rand> <hex-encoded master-secret>"
377
         * note that each keylog string does not have CR/LF.
378
         */
379
        buffSz  = labelSz + (RAN_LEN * 2) + 1 + ((*secretSz) * 2) + 1;
380
        log     = XMALLOC(buffSz, ssl->heap, DYNAMIC_TYPE_SECRET);
381
        if (log == NULL)
382
            return MEMORY_E;
383
#ifdef WOLFSSL_CHECK_MEM_ZERO
384
        wc_MemZero_Add("SessionSecret log", log, buffSz);
385
#endif
386
387
        XMEMSET(log, 0, buffSz);
388
        XMEMCPY(log, label, labelSz -1);     /* put label w/o terminator */
389
        log[labelSz - 1] = ' ';              /* '\0' -> ' ' */
390
        idx = labelSz;
391
        outSz = buffSz - idx;
392
        if ((ret = Base16_Encode(ssl->arrays->clientRandom, RAN_LEN,
393
                                            log + idx, &outSz)) == 0) {
394
            idx += (outSz - 1); /* reduce terminator byte */
395
            outSz = buffSz - idx;
396
397
            if (outSz > 1) {
398
                log[idx++] = ' ';  /* add space*/
399
                outSz = buffSz - idx;
400
401
                if ((ret = Base16_Encode((byte*)secret, *secretSz,
402
                                             log + idx, &outSz)) == 0) {
403
                    /* pass the log to the client callback*/
404
                    logCb(ssl, (char*)log);
405
                    ret = 0;
406
                }
407
            }
408
            else {
409
                ret = BUFFER_E;
410
            }
411
        }
412
        /* Zero out Base16 encoded secret and other data. */
413
        ForceZero(log, buffSz);
414
        XFREE(log, ssl->heap, DYNAMIC_TYPE_SECRET);
415
        return ret;
416
    }
417
418
#if defined(WOLFSSL_TLS13)
419
420
     /* Label string for client early traffic secret. */
421
     #define SSC_TLS13_CETS     "CLIENT_EARLY_TRAFFIC_SECRET"
422
     /* Label string for client handshake traffic secret. */
423
     #define SSC_TLS13_CHTS     "CLIENT_HANDSHAKE_TRAFFIC_SECRET"
424
     /* Label string for server handshake traffic secret. */
425
     #define SSC_TLS13_SHTS     "SERVER_HANDSHAKE_TRAFFIC_SECRET"
426
     /* Label string for client traffic secret. */
427
     #define SSC_TLS13_CTS      "CLIENT_TRAFFIC_SECRET_0"
428
     /* Label string for server traffic secret. */
429
     #define SSC_TLS13_STS      "SERVER_TRAFFIC_SECRET_0"
430
     /* Label string for early exporter secret. */
431
     #define SSC_TLS13_EES      "EARLY_EXPORTER_SECRET"
432
     /* Label string for exporter secret. */
433
     #define SSC_TLS13_ES       "EXPORTER_SECRET"
434
435
    /*
436
     * This function builds up string for key-logging then call user's
437
     * key-log-callback to pass the string for TLS1.3.
438
     * The user's key-logging callback has been set via
439
     * wolfSSL_CTX_set_keylog_callback function. The logging string format is:
440
     * "<Label> <hex-encoded client random> <hex-encoded secret>"
441
     *
442
     * parameter
443
     *  - ssl: WOLFSSL object
444
     *  - id: type of secret for logging
445
     *  - secret: pointer to the buffer holding secret
446
     *  - secretSz: size of secret
447
     *  - ctx: not used
448
     * returns 0 on success, negative value on failure.
449
     */
450
    static int SessionSecret_callback_Tls13(WOLFSSL* ssl, int id,
451
        const unsigned char* secret, int secretSz, void* ctx)
452
    {
453
        wolfSSL_CTX_keylog_cb_func logCb = NULL;
454
        const char* label;
455
        int         labelSz = 0;
456
        int         buffSz  = 0;
457
        byte*       log     = NULL;
458
        word32 outSz;
459
        int idx;
460
        int ret;
461
462
        (void)ctx;
463
464
        if (ssl == NULL || secret == NULL || secretSz == 0)
465
            return BAD_FUNC_ARG;
466
        if (ssl->arrays == NULL)
467
            return BAD_FUNC_ARG;
468
469
        /* get the user-callback func from CTX*/
470
        logCb = ssl->ctx->keyLogCb;
471
        if (logCb == NULL)
472
            return 0;
473
474
        switch (id) {
475
            case CLIENT_EARLY_TRAFFIC_SECRET:
476
                labelSz = sizeof(SSC_TLS13_CETS);
477
                label = SSC_TLS13_CETS;
478
                break;
479
480
            case CLIENT_HANDSHAKE_TRAFFIC_SECRET:
481
                labelSz = sizeof(SSC_TLS13_CHTS);
482
                label = SSC_TLS13_CHTS;
483
                break;
484
485
            case SERVER_HANDSHAKE_TRAFFIC_SECRET:
486
                labelSz = sizeof(SSC_TLS13_SHTS);
487
                label = SSC_TLS13_SHTS;
488
                break;
489
490
            case CLIENT_TRAFFIC_SECRET:
491
                labelSz = sizeof(SSC_TLS13_CTS);
492
                label = SSC_TLS13_CTS;
493
                break;
494
495
            case SERVER_TRAFFIC_SECRET:
496
                labelSz = sizeof(SSC_TLS13_STS);
497
                label = SSC_TLS13_STS;
498
                break;
499
500
            case EARLY_EXPORTER_SECRET:
501
                labelSz = sizeof(SSC_TLS13_EES);
502
                label = SSC_TLS13_EES;
503
                break;
504
505
            case EXPORTER_SECRET:
506
                labelSz = sizeof(SSC_TLS13_ES);
507
                label = SSC_TLS13_ES;
508
                break;
509
510
            default:
511
                return BAD_FUNC_ARG;
512
        }
513
        /* prepare a log string for passing user callback
514
         * "<Label> <hex-encoded client random> <hex-encoded secret>" */
515
        buffSz = labelSz + (RAN_LEN * 2) + 1 + secretSz * 2 + 1;
516
        log    = XMALLOC(buffSz, ssl->heap, DYNAMIC_TYPE_SECRET);
517
        if (log == NULL)
518
            return MEMORY_E;
519
#ifdef WOLFSSL_CHECK_MEM_ZERO
520
        wc_MemZero_Add("SessionSecret log", log, buffSz);
521
#endif
522
523
        XMEMSET(log, 0, buffSz);
524
        XMEMCPY(log, label, labelSz - 1);     /* put label w/o terminator */
525
        log[labelSz - 1] = ' ';               /* '\0' -> ' ' */
526
527
        idx = labelSz;
528
        outSz = buffSz - idx;
529
        if ((ret = Base16_Encode(ssl->arrays->clientRandom, RAN_LEN,
530
                                            log + idx, &outSz)) == 0) {
531
            idx  += (outSz - 1); /* reduce terminator byte */
532
            outSz = buffSz - idx;
533
534
            if (outSz >1) {
535
                log[idx++] = ' ';        /* add space*/
536
                outSz = buffSz - idx;
537
538
                if ((ret = Base16_Encode((byte*)secret, secretSz,
539
                                log + idx, &outSz)) == 0) {
540
                    logCb(ssl, (char*)log);
541
                    ret = 0;
542
                }
543
            }
544
            else
545
                ret = MEMORY_E;
546
        }
547
        /* Zero out Base16 encoded secret and other data. */
548
        ForceZero(log, buffSz);
549
        XFREE(log, ssl->heap, DYNAMIC_TYPE_SECRET);
550
        return ret;
551
    }
552
#endif /* WOLFSSL_TLS13*/
553
#endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK*/
554
555
int IsTLS(const WOLFSSL* ssl)
556
{
557
    if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_MINOR)
558
        return 1;
559
#ifdef WOLFSSL_DTLS
560
    if (ssl->version.major == DTLS_MAJOR)
561
        return 1;
562
#endif
563
564
    return 0;
565
}
566
567
int IsTLS_ex(const ProtocolVersion pv)
568
0
{
569
0
    if (pv.major == SSLv3_MAJOR && pv.minor >=TLSv1_MINOR)
570
0
        return 1;
571
#ifdef WOLFSSL_DTLS
572
    if (pv.major == DTLS_MAJOR)
573
        return 1;
574
#endif
575
576
0
    return 0;
577
0
}
578
579
580
int IsAtLeastTLSv1_2(const WOLFSSL* ssl)
581
0
{
582
0
    if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_2_MINOR)
583
0
        return 1;
584
#ifdef WOLFSSL_DTLS
585
    if (ssl->version.major == DTLS_MAJOR && ssl->version.minor <= DTLSv1_2_MINOR)
586
        return 1;
587
#endif
588
589
0
    return 0;
590
0
}
591
592
int IsAtLeastTLSv1_3(const ProtocolVersion pv)
593
0
{
594
0
    int ret;
595
0
    ret = (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR);
596
597
#ifdef WOLFSSL_DTLS13
598
    if (ret == 0 && pv.major == DTLS_MAJOR && pv.minor <= DTLSv1_3_MINOR)
599
        return 1;
600
#endif
601
602
0
    return ret;
603
0
}
604
605
int IsEncryptionOn(const WOLFSSL* ssl, int isSend)
606
{
607
#ifdef WOLFSSL_DTLS
608
    /* For DTLS, epoch 0 is always not encrypted. */
609
    if (ssl->options.dtls && !isSend) {
610
        if (!IsAtLeastTLSv1_3(ssl->version) && ssl->keys.curEpoch == 0)
611
            return 0;
612
    #ifdef WOLFSSL_DTLS13
613
        else if (IsAtLeastTLSv1_3(ssl->version)
614
                     && w64IsZero(ssl->keys.curEpoch64))
615
            return 0;
616
    #endif /* WOLFSSL_DTLS13 */
617
618
    }
619
#endif /* WOLFSSL_DTLS */
620
#ifdef WOLFSSL_QUIC
621
        if (WOLFSSL_IS_QUIC(ssl) && IsAtLeastTLSv1_3(ssl->version)) {
622
            return 0;
623
        }
624
#endif /* WOLFSSL_QUIC */
625
    return ssl->keys.encryptionOn &&
626
        (isSend ? ssl->encrypt.setup : ssl->decrypt.setup);
627
}
628
629
630
#ifdef WOLFSSL_DTLS
631
/* Stream Control Transmission Protocol */
632
/* If SCTP is not enabled returns the state of the dtls option.
633
 * If SCTP is enabled returns dtls && !sctp. */
634
int IsDtlsNotSctpMode(WOLFSSL* ssl)
635
{
636
#ifdef WOLFSSL_SCTP
637
    return ssl->options.dtls && !ssl->options.dtlsSctp;
638
#else
639
    return ssl->options.dtls;
640
#endif
641
}
642
643
#if !defined(WOLFSSL_NO_TLS12) && !defined(NO_WOLFSSL_SERVER)
644
/* Secure Real-time Transport Protocol */
645
/* If SRTP is not enabled returns the state of the dtls option.
646
 * If SRTP is enabled returns dtls && !dtlsSrtpProfiles. */
647
int IsDtlsNotSrtpMode(WOLFSSL* ssl)
648
{
649
#ifdef WOLFSSL_SRTP
650
    return ssl->options.dtls && !ssl->dtlsSrtpProfiles;
651
#else
652
    return ssl->options.dtls;
653
#endif
654
}
655
#endif /* !WOLFSSL_NO_TLS12 && !NO_WOLFSSL_SERVER */
656
#endif /* WOLFSSL_DTLS */
657
658
659
#ifdef HAVE_LIBZ
660
661
    /* alloc user allocs to work with zlib */
662
    static void* myAlloc(void* opaque, unsigned int item, unsigned int size)
663
    {
664
        (void)opaque;
665
        return (void *)XMALLOC(item * size, opaque, DYNAMIC_TYPE_LIBZ);
666
    }
667
668
669
    static void myFree(void* opaque, void* memory)
670
    {
671
        (void)opaque;
672
        XFREE(memory, opaque, DYNAMIC_TYPE_LIBZ);
673
    }
674
675
676
    /* init zlib comp/decomp streams, 0 on success */
677
    static int InitStreams(WOLFSSL* ssl)
678
    {
679
        ssl->c_stream.zalloc = (alloc_func)myAlloc;
680
        ssl->c_stream.zfree  = (free_func)myFree;
681
        ssl->c_stream.opaque = (voidpf)ssl->heap;
682
683
        if (deflateInit(&ssl->c_stream, Z_DEFAULT_COMPRESSION) != Z_OK)
684
            return ZLIB_INIT_ERROR;
685
686
        ssl->didStreamInit = 1;
687
688
        ssl->d_stream.zalloc = (alloc_func)myAlloc;
689
        ssl->d_stream.zfree  = (free_func)myFree;
690
        ssl->d_stream.opaque = (voidpf)ssl->heap;
691
692
        if (inflateInit(&ssl->d_stream) != Z_OK) return ZLIB_INIT_ERROR;
693
694
        return 0;
695
    }
696
697
698
    static void FreeStreams(WOLFSSL* ssl)
699
    {
700
        if (ssl->didStreamInit) {
701
            deflateEnd(&ssl->c_stream);
702
            inflateEnd(&ssl->d_stream);
703
        }
704
    }
705
706
707
    /* compress in to out, return out size or error */
708
    static int myCompress(WOLFSSL* ssl, byte* in, int inSz, byte* out, int outSz)
709
    {
710
        int    err;
711
        int    currTotal = (int)ssl->c_stream.total_out;
712
713
        ssl->c_stream.next_in   = in;
714
        ssl->c_stream.avail_in  = inSz;
715
        ssl->c_stream.next_out  = out;
716
        ssl->c_stream.avail_out = outSz;
717
718
        err = deflate(&ssl->c_stream, Z_SYNC_FLUSH);
719
        if (err != Z_OK && err != Z_STREAM_END) return ZLIB_COMPRESS_ERROR;
720
721
        return (int)ssl->c_stream.total_out - currTotal;
722
    }
723
724
725
    /* decompress in to out, return out size or error */
726
    static int myDeCompress(WOLFSSL* ssl, byte* in,int inSz, byte* out,int outSz)
727
    {
728
        int    err;
729
        int    currTotal = (int)ssl->d_stream.total_out;
730
731
        ssl->d_stream.next_in   = in;
732
        ssl->d_stream.avail_in  = inSz;
733
        ssl->d_stream.next_out  = out;
734
        ssl->d_stream.avail_out = outSz;
735
736
        err = inflate(&ssl->d_stream, Z_SYNC_FLUSH);
737
        if (err != Z_OK && err != Z_STREAM_END) return ZLIB_DECOMPRESS_ERROR;
738
739
        return (int)ssl->d_stream.total_out - currTotal;
740
    }
741
742
#endif /* HAVE_LIBZ */
743
744
745
#ifdef WOLFSSL_SESSION_EXPORT
746
/**
747
 * serializes the cipher specs struct for exporting
748
 * @return the amount written to 'exp' buffer
749
 */
750
static int ExportCipherSpecState(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
751
        int type)
752
{
753
    word32 idx = 0;
754
    CipherSpecs* specs;
755
756
    WOLFSSL_ENTER("ExportCipherSpecState");
757
758
    if (exp == NULL || ssl == NULL) {
759
        return BAD_FUNC_ARG;
760
    }
761
762
    specs = &ssl->specs;
763
    if (WOLFSSL_EXPORT_SPC_SZ > len) {
764
        return BUFFER_E;
765
    }
766
767
    XMEMSET(exp, 0, WOLFSSL_EXPORT_SPC_SZ);
768
769
    c16toa(specs->key_size, exp + idx);      idx += OPAQUE16_LEN;
770
    c16toa(specs->iv_size, exp + idx);       idx += OPAQUE16_LEN;
771
    c16toa(specs->block_size, exp + idx);    idx += OPAQUE16_LEN;
772
    c16toa(specs->aead_mac_size, exp + idx); idx += OPAQUE16_LEN;
773
    exp[idx++] = specs->bulk_cipher_algorithm;
774
    exp[idx++] = specs->cipher_type;
775
    exp[idx++] = specs->mac_algorithm;
776
    exp[idx++] = specs->kea;
777
    exp[idx++] = specs->sig_algo;
778
    exp[idx++] = specs->hash_size;
779
    exp[idx++] = specs->pad_size;
780
    exp[idx++] = specs->static_ecdh;
781
782
    if (idx != WOLFSSL_EXPORT_SPC_SZ) {
783
        WOLFSSL_MSG("WOLFSSL_EXPORT_SPC_SZ needs updated and export version");
784
        return DTLS_EXPORT_VER_E;
785
    }
786
787
    /* send over state of AES too */
788
    if (type == WOLFSSL_EXPORT_TLS &&
789
            ssl->specs.bulk_cipher_algorithm == wolfssl_aes) {
790
        byte *pt = (byte*)ssl->encrypt.aes->reg;
791
792
        if ((idx + 2*WC_AES_BLOCK_SIZE) > len) {
793
            WOLFSSL_MSG("Can not fit AES state into buffer");
794
            return BUFFER_E;
795
        }
796
        XMEMCPY(exp + idx, pt, WC_AES_BLOCK_SIZE);
797
        idx += WC_AES_BLOCK_SIZE;
798
799
        pt = (byte*)ssl->decrypt.aes->reg;
800
        XMEMCPY(exp + idx, pt, WC_AES_BLOCK_SIZE);
801
        idx += WC_AES_BLOCK_SIZE;
802
    }
803
804
    WOLFSSL_LEAVE("ExportCipherSpecState", idx);
805
    (void)ver;
806
    return idx;
807
}
808
809
810
/* serializes the key struct for exporting */
811
static int ExportKeyState(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
812
        byte small, int type)
813
{
814
    word32 idx = 0;
815
    byte   sz;
816
    Keys* keys;
817
818
    WOLFSSL_ENTER("ExportKeyState");
819
820
    if (exp == NULL || ssl == NULL) {
821
        return BAD_FUNC_ARG;
822
    }
823
824
    keys = &(ssl->keys);
825
826
    if (DTLS_EXPORT_MIN_KEY_SZ > len) {
827
        WOLFSSL_MSG("Buffer not large enough for minimum key struct size");
828
        return BUFFER_E;
829
    }
830
831
    XMEMSET(exp, 0, DTLS_EXPORT_MIN_KEY_SZ);
832
833
    c32toa(keys->peer_sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
834
    c32toa(keys->peer_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
835
    c32toa(keys->sequence_number_hi, exp + idx);      idx += OPAQUE32_LEN;
836
    c32toa(keys->sequence_number_lo, exp + idx);      idx += OPAQUE32_LEN;
837
838
    #if defined(WOLFSSL_DTLS)
839
    if (type == WOLFSSL_EXPORT_DTLS) {
840
        c16toa(keys->peerSeq[0].nextEpoch, exp + idx);  idx += OPAQUE16_LEN;
841
        c16toa(keys->peerSeq[0].nextSeq_hi, exp + idx); idx += OPAQUE16_LEN;
842
        c32toa(keys->peerSeq[0].nextSeq_lo, exp + idx); idx += OPAQUE32_LEN;
843
        c16toa(keys->curEpoch, exp + idx);   idx += OPAQUE16_LEN;
844
        c16toa(keys->curSeq_hi, exp + idx);  idx += OPAQUE16_LEN;
845
        c32toa(keys->curSeq_lo, exp + idx);  idx += OPAQUE32_LEN;
846
        c16toa(keys->peerSeq[0].prevSeq_hi, exp + idx); idx += OPAQUE16_LEN;
847
        c32toa(keys->peerSeq[0].prevSeq_lo, exp + idx); idx += OPAQUE32_LEN;
848
849
        c16toa(keys->dtls_peer_handshake_number, exp + idx);
850
        idx += OPAQUE16_LEN;
851
        c16toa(keys->dtls_expected_peer_handshake_number, exp + idx);
852
        idx += OPAQUE16_LEN;
853
854
        c16toa(keys->dtls_sequence_number_hi, exp + idx); idx += OPAQUE16_LEN;
855
        c32toa(keys->dtls_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
856
        c16toa(keys->dtls_prev_sequence_number_hi, exp + idx);
857
        idx += OPAQUE16_LEN;
858
        c32toa(keys->dtls_prev_sequence_number_lo, exp + idx);
859
        idx += OPAQUE32_LEN;
860
        c16toa(keys->dtls_epoch, exp + idx);              idx += OPAQUE16_LEN;
861
        c16toa(keys->dtls_handshake_number, exp + idx);   idx += OPAQUE16_LEN;
862
    }
863
    #endif
864
    c32toa(keys->encryptSz, exp + idx);                   idx += OPAQUE32_LEN;
865
    c32toa(keys->padSz, exp + idx);                       idx += OPAQUE32_LEN;
866
    exp[idx++] = keys->encryptionOn;
867
    exp[idx++] = keys->decryptedCur;
868
869
    /* from here on the buffer needs checked because is variable length that
870
     * can be larger than DTLS_EXPORT_MIN_KEY_SZ */
871
#ifdef WOLFSSL_DTLS
872
    if (type == WOLFSSL_EXPORT_DTLS) {
873
        word32 i;
874
        if ((OPAQUE16_LEN * 2) + idx +
875
                (2 * (WOLFSSL_DTLS_WINDOW_WORDS * OPAQUE32_LEN)) > len) {
876
            WOLFSSL_MSG("Buffer not large enough for WOLFSSL_DTLS_WINDOW_WORDS");
877
            return BUFFER_E;
878
        }
879
880
        c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
881
        for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
882
            c32toa(keys->peerSeq[0].window[i], exp + idx);
883
            idx += OPAQUE32_LEN;
884
        }
885
        c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
886
        for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
887
            c32toa(keys->peerSeq[0].prevWindow[i], exp + idx);
888
            idx += OPAQUE32_LEN;
889
        }
890
    }
891
#endif
892
893
    if (idx >= len) {
894
        WOLFSSL_MSG("Buffer not large enough for truncated hmac flag");
895
        return BUFFER_E;
896
    }
897
898
#ifdef HAVE_TRUNCATED_HMAC
899
    sz         = ssl->truncated_hmac ? TRUNCATED_HMAC_SZ: ssl->specs.hash_size;
900
    exp[idx++] = ssl->truncated_hmac;
901
#else
902
    sz         = ssl->specs.hash_size;
903
    exp[idx++] = 0; /* no truncated hmac */
904
#endif
905
906
    sz = (small)? 0: sz;
907
    if (idx + (sz * 2) + OPAQUE8_LEN > len) {
908
        WOLFSSL_MSG("Buffer not large enough for MAC secret");
909
        return BUFFER_E;
910
    }
911
912
    exp[idx++] = sz;
913
    if (sz > 0) {
914
    #ifndef WOLFSSL_AEAD_ONLY
915
        XMEMCPY(exp + idx, keys->client_write_MAC_secret, sz); idx += sz;
916
        XMEMCPY(exp + idx, keys->server_write_MAC_secret, sz); idx += sz;
917
    #else
918
        XMEMSET(exp + idx, 0, sz); idx += sz;
919
        XMEMSET(exp + idx, 0, sz); idx += sz;
920
    #endif
921
    }
922
923
    sz = (small)? 0: ssl->specs.key_size;
924
    if (idx + (sz * 2) + OPAQUE8_LEN > len) {
925
        WOLFSSL_MSG("Buffer not large enough for write key");
926
        return BUFFER_E;
927
    }
928
929
    exp[idx++] = sz;
930
    if (sz > 0) {
931
        XMEMCPY(exp + idx, keys->client_write_key, sz); idx += sz;
932
        XMEMCPY(exp + idx, keys->server_write_key, sz); idx += sz;
933
    }
934
935
    sz = (small)? 0: ssl->specs.iv_size;
936
    if (idx + (sz * 2) + OPAQUE8_LEN + AEAD_MAX_EXP_SZ > len) {
937
        WOLFSSL_MSG("Buffer not large enough for IVs");
938
        return BUFFER_E;
939
    }
940
941
    exp[idx++] = sz;
942
    if (sz > 0) {
943
        XMEMCPY(exp + idx, keys->client_write_IV, sz); idx += sz;
944
        XMEMCPY(exp + idx, keys->server_write_IV, sz); idx += sz;
945
    }
946
    XMEMCPY(exp + idx, keys->aead_exp_IV, AEAD_MAX_EXP_SZ);
947
    idx += AEAD_MAX_EXP_SZ;
948
949
    sz = (small)? 0: AEAD_MAX_IMP_SZ;
950
    if (idx + (sz * 2) + OPAQUE8_LEN > len) {
951
        WOLFSSL_MSG("Buffer not large enough for imp IVs");
952
        return BUFFER_E;
953
    }
954
    exp[idx++] = sz;
955
    if (sz > 0) {
956
        XMEMCPY(exp + idx, keys->aead_enc_imp_IV, sz); idx += sz;
957
        XMEMCPY(exp + idx, keys->aead_dec_imp_IV, sz); idx += sz;
958
    }
959
960
    /* DTLS_EXPORT_KEY_SZ is max value. idx size can vary */
961
    if (idx > DTLS_EXPORT_KEY_SZ) {
962
        WOLFSSL_MSG("DTLS_EXPORT_KEY_SZ needs updated and export version");
963
        return DTLS_EXPORT_VER_E;
964
    }
965
966
    WOLFSSL_LEAVE("ExportKeyState", idx);
967
    (void)ver;
968
    (void)type;
969
    return idx;
970
}
971
972
973
/**
974
 * Imports the buffer 'exp' into the 'ssl' CipherSpec structure.
975
 * @param ssl WOLFSSL structure to import into
976
 * @param exp input buffer to read from
977
 * @param len length of exp buffer
978
 * @param ver version of import buffer found
979
 * @param type flag for importing a TLS session or DTLS
980
 *
981
 * @return size of exp buffer consumed on success and negative value on fail
982
 */
983
static int ImportCipherSpecState(WOLFSSL* ssl, const byte* exp, word32 len,
984
        byte ver, int type)
985
{
986
    word32 idx = 0;
987
    CipherSpecs* specs;
988
    word32 tmp_seq_peer_lo;
989
    word32 tmp_seq_peer_hi;
990
    word32 tmp_seq_lo;
991
    word32 tmp_seq_hi;
992
    int ret;
993
994
    WOLFSSL_ENTER("ImportCipherSpecState");
995
996
    if (exp == NULL || ssl == NULL) {
997
        return BAD_FUNC_ARG;
998
    }
999
1000
    specs= &(ssl->specs);
1001
1002
    if (WOLFSSL_EXPORT_SPC_SZ > len) {
1003
        WOLFSSL_MSG("Buffer not large enough for max spec struct size");
1004
        return BUFFER_E;
1005
    }
1006
1007
    ato16(exp + idx, &specs->key_size);      idx += OPAQUE16_LEN;
1008
    ato16(exp + idx, &specs->iv_size);       idx += OPAQUE16_LEN;
1009
    ato16(exp + idx, &specs->block_size);    idx += OPAQUE16_LEN;
1010
    ato16(exp + idx, &specs->aead_mac_size); idx += OPAQUE16_LEN;
1011
    specs->bulk_cipher_algorithm = exp[idx++];
1012
    specs->cipher_type           = exp[idx++];
1013
    specs->mac_algorithm         = exp[idx++];
1014
    specs->kea                   = exp[idx++];
1015
    specs->sig_algo              = exp[idx++];
1016
    specs->hash_size             = exp[idx++];
1017
    specs->pad_size              = exp[idx++];
1018
    specs->static_ecdh           = exp[idx++];
1019
1020
    if (specs->pad_size != PAD_MD5 && specs->pad_size != PAD_SHA) {
1021
        WOLFSSL_MSG("Importing bad or unknown pad size");
1022
        return BAD_STATE_E;
1023
    }
1024
1025
    /* temporarily save the sequence numbers */
1026
    tmp_seq_peer_lo = ssl->keys.peer_sequence_number_lo;
1027
    tmp_seq_peer_hi = ssl->keys.peer_sequence_number_hi;
1028
    tmp_seq_lo = ssl->keys.sequence_number_lo;
1029
    tmp_seq_hi = ssl->keys.sequence_number_hi;
1030
1031
    if ((ret = SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE)) < 0) {
1032
        return ret;
1033
    }
1034
1035
    /* reset sequence numbers after setting keys */
1036
    ssl->keys.peer_sequence_number_lo = tmp_seq_peer_lo;
1037
    ssl->keys.peer_sequence_number_hi = tmp_seq_peer_hi;
1038
    ssl->keys.sequence_number_lo = tmp_seq_lo;
1039
    ssl->keys.sequence_number_hi = tmp_seq_hi;
1040
1041
    if (type == WOLFSSL_EXPORT_TLS &&
1042
            ssl->specs.bulk_cipher_algorithm == wolfssl_aes) {
1043
        byte *pt = (byte*)ssl->encrypt.aes->reg;
1044
        XMEMCPY(pt, exp + idx, WC_AES_BLOCK_SIZE);
1045
        idx += WC_AES_BLOCK_SIZE;
1046
1047
        pt = (byte*)ssl->decrypt.aes->reg;
1048
        XMEMCPY(pt, exp + idx, WC_AES_BLOCK_SIZE);
1049
        idx += WC_AES_BLOCK_SIZE;
1050
    }
1051
1052
    WOLFSSL_LEAVE("ImportCipherSpecState", idx);
1053
    (void)ver;
1054
    return idx;
1055
}
1056
1057
1058
/**
1059
 * Import the Key structure
1060
 *
1061
 * @param ssl WOLFSSL structure to import into
1062
 * @param exp buffer to read Key values from
1063
 * @param len max length of buffer 'exp'
1064
 * @param ver version of import buffer found
1065
 * @param type flag for TLS vs DTLS
1066
 *
1067
 * @return amount of data read from exp on success or negative on fail
1068
 */
1069
static int ImportKeyState(WOLFSSL* ssl, const byte* exp, word32 len, byte ver,
1070
        int type)
1071
{
1072
    word32 idx = 0;
1073
    byte   sz;
1074
    Keys  *keys;
1075
1076
    WOLFSSL_ENTER("ImportKeyState");
1077
1078
    if (exp == NULL || ssl == NULL) {
1079
        return BAD_FUNC_ARG;
1080
    }
1081
1082
    keys = &(ssl->keys);
1083
1084
    /* check minimum length -- includes byte used for size indicators */
1085
    if (len < DTLS_EXPORT_MIN_KEY_SZ) {
1086
        WOLFSSL_MSG("Buffer not large enough for minimum expected size");
1087
        return BUFFER_E;
1088
    }
1089
    ato32(exp + idx, &keys->peer_sequence_number_hi); idx += OPAQUE32_LEN;
1090
    ato32(exp + idx, &keys->peer_sequence_number_lo); idx += OPAQUE32_LEN;
1091
    ato32(exp + idx, &keys->sequence_number_hi);      idx += OPAQUE32_LEN;
1092
    ato32(exp + idx, &keys->sequence_number_lo);      idx += OPAQUE32_LEN;
1093
1094
    #if defined(WOLFSSL_DTLS)
1095
    if (type == WOLFSSL_EXPORT_DTLS) {
1096
        ato16(exp + idx, &keys->peerSeq[0].nextEpoch);  idx += OPAQUE16_LEN;
1097
        ato16(exp + idx, &keys->peerSeq[0].nextSeq_hi); idx += OPAQUE16_LEN;
1098
        ato32(exp + idx, &keys->peerSeq[0].nextSeq_lo); idx += OPAQUE32_LEN;
1099
        ato16(exp + idx, &keys->curEpoch);   idx += OPAQUE16_LEN;
1100
        ato16(exp + idx, &keys->curSeq_hi);  idx += OPAQUE16_LEN;
1101
        ato32(exp + idx, &keys->curSeq_lo);  idx += OPAQUE32_LEN;
1102
        ato16(exp + idx, &keys->peerSeq[0].prevSeq_hi); idx += OPAQUE16_LEN;
1103
        ato32(exp + idx, &keys->peerSeq[0].prevSeq_lo); idx += OPAQUE32_LEN;
1104
1105
        ato16(exp + idx, &keys->dtls_peer_handshake_number);
1106
        idx += OPAQUE16_LEN;
1107
        ato16(exp + idx, &keys->dtls_expected_peer_handshake_number);
1108
        idx += OPAQUE16_LEN;
1109
1110
        ato16(exp + idx, &keys->dtls_sequence_number_hi); idx += OPAQUE16_LEN;
1111
        ato32(exp + idx, &keys->dtls_sequence_number_lo); idx += OPAQUE32_LEN;
1112
        ato16(exp + idx, &keys->dtls_prev_sequence_number_hi);
1113
        idx += OPAQUE16_LEN;
1114
        ato32(exp + idx, &keys->dtls_prev_sequence_number_lo);
1115
        idx += OPAQUE32_LEN;
1116
        ato16(exp + idx, &keys->dtls_epoch);              idx += OPAQUE16_LEN;
1117
        ato16(exp + idx, &keys->dtls_handshake_number);   idx += OPAQUE16_LEN;
1118
    }
1119
    #endif
1120
    ato32(exp + idx, &keys->encryptSz);                   idx += OPAQUE32_LEN;
1121
    ato32(exp + idx, &keys->padSz);                       idx += OPAQUE32_LEN;
1122
    keys->encryptionOn = exp[idx++];
1123
    keys->decryptedCur = exp[idx++];
1124
1125
    #if defined(WOLFSSL_DTLS)
1126
    if (type == WOLFSSL_EXPORT_DTLS) {
1127
        word16 i, wordCount, wordAdj = 0;
1128
1129
        /* do window */
1130
        ato16(exp + idx, &wordCount);
1131
        idx += OPAQUE16_LEN;
1132
1133
        if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
1134
            wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
1135
            wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
1136
        }
1137
1138
        XMEMSET(keys->peerSeq[0].window, 0xFF, DTLS_SEQ_SZ);
1139
        for (i = 0; i < wordCount; i++) {
1140
            ato32(exp + idx, &keys->peerSeq[0].window[i]);
1141
            idx += OPAQUE32_LEN;
1142
        }
1143
        idx += wordAdj;
1144
1145
        /* do prevWindow */
1146
        ato16(exp + idx, &wordCount);
1147
        idx += OPAQUE16_LEN;
1148
1149
        if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
1150
            wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
1151
            wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
1152
        }
1153
1154
        XMEMSET(keys->peerSeq[0].prevWindow, 0xFF, DTLS_SEQ_SZ);
1155
        for (i = 0; i < wordCount; i++) {
1156
            ato32(exp + idx, &keys->peerSeq[0].prevWindow[i]);
1157
            idx += OPAQUE32_LEN;
1158
        }
1159
        idx += wordAdj;
1160
1161
    }
1162
    #endif
1163
1164
#ifdef HAVE_TRUNCATED_HMAC
1165
    ssl->truncated_hmac = exp[idx++];
1166
#else
1167
    idx++; /* no truncated hmac */
1168
#endif
1169
    sz = exp[idx++];
1170
#ifndef WOLFSSL_AEAD_ONLY
1171
    if (sz > sizeof(keys->client_write_MAC_secret) || (sz * 2) + idx > len) {
1172
        WOLFSSL_MSG("Buffer not large enough for MAC import");
1173
        return BUFFER_E;
1174
    }
1175
    if (sz > 0) {
1176
        XMEMCPY(keys->client_write_MAC_secret, exp + idx, sz); idx += sz;
1177
        XMEMCPY(keys->server_write_MAC_secret, exp + idx, sz); idx += sz;
1178
    }
1179
#else
1180
    if (sz + idx > len) {
1181
        return BUFFER_E;
1182
    }
1183
    idx += sz; idx += sz;
1184
#endif
1185
1186
    sz = exp[idx++];
1187
    if (sz > sizeof(keys->client_write_key) || (sz * 2) + idx > len) {
1188
        WOLFSSL_MSG("Buffer not large enough for key import");
1189
        return BUFFER_E;
1190
    }
1191
    if (sz > 0) {
1192
        XMEMCPY(keys->client_write_key, exp + idx, sz); idx += sz;
1193
        XMEMCPY(keys->server_write_key, exp + idx, sz); idx += sz;
1194
    }
1195
1196
    sz = exp[idx++];
1197
    if (sz > sizeof(keys->client_write_IV) || (sz * 2) + idx > len) {
1198
        WOLFSSL_MSG("Buffer not large enough for write IV import");
1199
        return BUFFER_E;
1200
    }
1201
    if (sz > 0) {
1202
        XMEMCPY(keys->client_write_IV, exp + idx, sz); idx += sz;
1203
        XMEMCPY(keys->server_write_IV, exp + idx, sz); idx += sz;
1204
    }
1205
    XMEMCPY(keys->aead_exp_IV, exp + idx, AEAD_MAX_EXP_SZ);
1206
    idx += AEAD_MAX_EXP_SZ;
1207
1208
    sz = exp[idx++];
1209
    if (sz > sizeof(keys->aead_enc_imp_IV) || (sz * 2) + idx > len) {
1210
        WOLFSSL_MSG("Buffer not large enough for imp IV import");
1211
        return BUFFER_E;
1212
    }
1213
    if (sz > 0) {
1214
        XMEMCPY(keys->aead_enc_imp_IV, exp + idx, sz); idx += sz;
1215
        XMEMCPY(keys->aead_dec_imp_IV, exp + idx, sz); idx += sz;
1216
    }
1217
1218
    WOLFSSL_LEAVE("ImportKeyState", idx);
1219
    (void)ver;
1220
    (void)type;
1221
    return idx;
1222
}
1223
1224
1225
/* copy over necessary information from Options struct to buffer
1226
 * On success returns size of buffer used on failure returns a negative value */
1227
static int ExportOptions(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
1228
        int type)
1229
{
1230
    int      idx  = 0;
1231
    word16   zero = 0;
1232
    Options *options;
1233
1234
    WOLFSSL_ENTER("ExportOptions");
1235
1236
    if (ssl == NULL || exp == NULL || len < DTLS_EXPORT_OPT_SZ) {
1237
        return BAD_FUNC_ARG;
1238
    }
1239
1240
    options = &ssl->options;
1241
    if (options == NULL) {
1242
        return BAD_FUNC_ARG;
1243
    }
1244
1245
    XMEMSET(exp, 0, DTLS_EXPORT_OPT_SZ);
1246
1247
    /* these options are kept and sent to indicate verify status and strength
1248
     * of handshake */
1249
    exp[idx++] = options->sendVerify;
1250
    exp[idx++] = options->verifyPeer;
1251
    exp[idx++] = options->verifyNone;
1252
    exp[idx++] = options->downgrade;
1253
#ifndef NO_DH
1254
    c16toa(options->minDhKeySz, exp + idx); idx += OPAQUE16_LEN;
1255
    c16toa(options->maxDhKeySz, exp + idx); idx += OPAQUE16_LEN;
1256
    c16toa(options->dhKeySz, exp + idx);    idx += OPAQUE16_LEN;
1257
#else
1258
    c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
1259
    c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
1260
    c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
1261
#endif
1262
#ifndef NO_RSA
1263
    c16toa((word16)(options->minRsaKeySz), exp + idx); idx += OPAQUE16_LEN;
1264
#else
1265
    c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
1266
#endif
1267
#ifdef HAVE_ECC
1268
    c16toa((word16)(options->minEccKeySz), exp + idx); idx += OPAQUE16_LEN;
1269
#else
1270
    c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
1271
#endif
1272
1273
    /* these options are kept to indicate state and behavior */
1274
#ifndef NO_PSK
1275
    exp[idx++] = options->havePSK;
1276
#else
1277
    exp[idx++] = 0;
1278
#endif
1279
    exp[idx++] = options->sessionCacheOff;
1280
    exp[idx++] = options->sessionCacheFlushOff;
1281
    exp[idx++] = options->side;
1282
    exp[idx++] = options->resuming;
1283
    exp[idx++] = options->haveSessionId;
1284
    exp[idx++] = options->tls;
1285
    exp[idx++] = options->tls1_1;
1286
    exp[idx++] = options->dtls;
1287
    exp[idx++] = options->connReset;
1288
    exp[idx++] = options->isClosed;
1289
    exp[idx++] = options->closeNotify;
1290
    exp[idx++] = options->sentNotify;
1291
    exp[idx++] = options->usingCompression;
1292
    exp[idx++] = options->haveRSA;
1293
    exp[idx++] = options->haveECC;
1294
    exp[idx++] = options->haveDH;
1295
    exp[idx++] = 0; /* Historical: haveNTRU */
1296
    exp[idx++] = 0; /* Historical: haveQSH */
1297
    exp[idx++] = options->haveECDSAsig;
1298
    exp[idx++] = options->haveStaticECC;
1299
    exp[idx++] = options->havePeerVerify;
1300
    exp[idx++] = options->usingPSK_cipher;
1301
    exp[idx++] = options->usingAnon_cipher;
1302
    exp[idx++] = 0; /* Historical: options->sendAlertState */
1303
    exp[idx++] = options->partialWrite;
1304
    exp[idx++] = options->quietShutdown;
1305
    exp[idx++] = options->groupMessages;
1306
#ifdef HAVE_POLY1305
1307
    exp[idx++] = options->oldPoly;
1308
#else
1309
    exp[idx++] = 0;
1310
#endif
1311
#ifdef HAVE_ANON
1312
    exp[idx++] = options->useAnon;
1313
#else
1314
    exp[idx++] = 0;
1315
#endif
1316
#ifdef HAVE_SESSION_TICKET
1317
    exp[idx++] = options->createTicket;
1318
    exp[idx++] = options->useTicket;
1319
    exp[idx++] = options->noTicketTls12;
1320
#ifdef WOLFSSL_TLS13
1321
    if (ver > WOLFSSL_EXPORT_VERSION_3) {
1322
        exp[idx++] = options->noTicketTls13;
1323
    }
1324
#else
1325
    if (ver > WOLFSSL_EXPORT_VERSION_3) {
1326
        exp[idx++] = 0;
1327
    }
1328
#endif
1329
#else
1330
    exp[idx++] = 0;
1331
    exp[idx++] = 0;
1332
    exp[idx++] = 0;
1333
    if (ver > WOLFSSL_EXPORT_VERSION_3) {
1334
        exp[idx++] = 0;
1335
    }
1336
#endif
1337
    exp[idx++] = options->processReply;
1338
    exp[idx++] = options->cipherSuite0;
1339
    exp[idx++] = options->cipherSuite;
1340
    exp[idx++] = options->serverState;
1341
    exp[idx++] = options->clientState;
1342
    exp[idx++] = options->handShakeState;
1343
    exp[idx++] = options->handShakeDone;
1344
    exp[idx++] = options->minDowngrade;
1345
    exp[idx++] = options->connectState;
1346
    exp[idx++] = options->acceptState;
1347
    exp[idx++] = options->asyncState;
1348
1349
    if (type == WOLFSSL_EXPORT_TLS) {
1350
#ifdef HAVE_ENCRYPT_THEN_MAC
1351
        exp[idx++] = options->disallowEncThenMac;
1352
        exp[idx++] = options->encThenMac;
1353
        exp[idx++] = options->startedETMRead;
1354
        exp[idx++] = options->startedETMWrite;
1355
#else
1356
        exp[idx++] = 0;
1357
        exp[idx++] = 0;
1358
        exp[idx++] = 0;
1359
        exp[idx++] = 0;
1360
#endif
1361
    }
1362
1363
    if (ver > WOLFSSL_EXPORT_VERSION_4) {
1364
#ifdef WOLFSSL_DTLS
1365
        exp[idx++] = options->dtlsStateful;
1366
#else
1367
        exp[idx++] = 0;
1368
#endif
1369
    }
1370
1371
    /* version of connection */
1372
    exp[idx++] = ssl->version.major;
1373
    exp[idx++] = ssl->version.minor;
1374
1375
    (void)zero;
1376
1377
    /* check if changes were made and notify of need to update export version */
1378
    switch (ver) {
1379
        case WOLFSSL_EXPORT_VERSION_3:
1380
            if (idx != DTLS_EXPORT_OPT_SZ_3) {
1381
                WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
1382
                return DTLS_EXPORT_VER_E;
1383
            }
1384
            break;
1385
1386
        case WOLFSSL_EXPORT_VERSION_4:
1387
            if (idx != DTLS_EXPORT_OPT_SZ_4 && type == WOLFSSL_EXPORT_DTLS) {
1388
                WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
1389
                return DTLS_EXPORT_VER_E;
1390
            }
1391
            break;
1392
1393
        case WOLFSSL_EXPORT_VERSION:
1394
            if (idx != DTLS_EXPORT_OPT_SZ && type == WOLFSSL_EXPORT_DTLS) {
1395
                WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
1396
                return DTLS_EXPORT_VER_E;
1397
            }
1398
            break;
1399
1400
       default:
1401
            WOLFSSL_MSG("New version case needs added to wolfSSL export");
1402
            return DTLS_EXPORT_VER_E;
1403
    }
1404
1405
    WOLFSSL_LEAVE("ExportOptions", idx);
1406
1407
    (void)type;
1408
    return idx;
1409
}
1410
1411
1412
/* copy items from Export struct to Options struct
1413
 * On success returns size of buffer used on failure returns a negative value */
1414
static int ImportOptions(WOLFSSL* ssl, const byte* exp, word32 len, byte ver,
1415
        int type)
1416
{
1417
    int idx = 0;
1418
    Options* options = &ssl->options;
1419
1420
    switch (ver) {
1421
        case WOLFSSL_EXPORT_VERSION:
1422
            if (len < DTLS_EXPORT_OPT_SZ) {
1423
                WOLFSSL_MSG("Sanity check on buffer size failed");
1424
                return BAD_FUNC_ARG;
1425
            }
1426
            break;
1427
1428
        case WOLFSSL_EXPORT_VERSION_4:
1429
            if (len < DTLS_EXPORT_OPT_SZ_4) {
1430
                WOLFSSL_MSG("Sanity check on buffer size failed");
1431
                return BAD_FUNC_ARG;
1432
            }
1433
            break;
1434
1435
        case WOLFSSL_EXPORT_VERSION_3:
1436
            if (len < DTLS_EXPORT_OPT_SZ_3) {
1437
                WOLFSSL_MSG("Sanity check on buffer size failed");
1438
                return BAD_FUNC_ARG;
1439
            }
1440
            break;
1441
1442
        default:
1443
            WOLFSSL_MSG("Export version not supported");
1444
            return BAD_FUNC_ARG;
1445
    }
1446
1447
    if (exp == NULL || options == NULL) {
1448
        return BAD_FUNC_ARG;
1449
    }
1450
1451
1452
    /* these options are kept and sent to indicate verify status and strength
1453
     * of handshake */
1454
    options->sendVerify = exp[idx++];
1455
    options->verifyPeer = exp[idx++];
1456
    options->verifyNone = exp[idx++];
1457
    options->downgrade  = exp[idx++];
1458
#ifndef NO_DH
1459
    ato16(exp + idx, &(options->minDhKeySz)); idx += OPAQUE16_LEN;
1460
    ato16(exp + idx, &(options->maxDhKeySz)); idx += OPAQUE16_LEN;
1461
    ato16(exp + idx, &(options->dhKeySz));    idx += OPAQUE16_LEN;
1462
#else
1463
    idx += OPAQUE16_LEN;
1464
    idx += OPAQUE16_LEN;
1465
    idx += OPAQUE16_LEN;
1466
#endif
1467
#ifndef NO_RSA
1468
    ato16(exp + idx, (word16*)&(options->minRsaKeySz)); idx += OPAQUE16_LEN;
1469
#else
1470
    idx += OPAQUE16_LEN;
1471
#endif
1472
#ifdef HAVE_ECC
1473
    ato16(exp + idx, (word16*)&(options->minEccKeySz)); idx += OPAQUE16_LEN;
1474
#else
1475
    idx += OPAQUE16_LEN;
1476
#endif
1477
1478
    /* these options are kept to indicate state and behavior */
1479
#ifndef NO_PSK
1480
    options->havePSK = exp[idx++];
1481
#else
1482
    idx++;
1483
#endif
1484
    options->sessionCacheOff      = exp[idx++];
1485
    options->sessionCacheFlushOff = exp[idx++];
1486
    options->side                 = exp[idx++];
1487
    options->resuming             = exp[idx++];
1488
    options->haveSessionId    = exp[idx++];
1489
    options->tls              = exp[idx++];
1490
    options->tls1_1           = exp[idx++];
1491
    options->dtls             = exp[idx++];
1492
    options->connReset        = exp[idx++];
1493
    options->isClosed         = exp[idx++];
1494
    options->closeNotify      = exp[idx++];
1495
    options->sentNotify       = exp[idx++];
1496
    options->usingCompression = exp[idx++];
1497
    options->haveRSA          = exp[idx++];
1498
    options->haveECC          = exp[idx++];
1499
    options->haveDH           = exp[idx++];
1500
    idx++; /* Historical: haveNTRU */
1501
    idx++; /* Historical: haveQSH */
1502
    options->haveECDSAsig     = exp[idx++];
1503
    options->haveStaticECC    = exp[idx++];
1504
    options->havePeerVerify   = exp[idx++];
1505
    options->usingPSK_cipher  = exp[idx++];
1506
    options->usingAnon_cipher = exp[idx++];
1507
    idx++; /* Historical: options->sendAlertState */
1508
    options->partialWrite     = exp[idx++];
1509
    options->quietShutdown    = exp[idx++];
1510
    options->groupMessages    = exp[idx++];
1511
#ifdef HAVE_POLY1305
1512
    options->oldPoly = exp[idx++];      /* set when to use old rfc way of poly*/
1513
#else
1514
    idx++;
1515
#endif
1516
#ifdef HAVE_ANON
1517
    options->useAnon = exp[idx++];     /* User wants to allow Anon suites */
1518
#else
1519
    idx++;
1520
#endif
1521
#ifdef HAVE_SESSION_TICKET
1522
    options->createTicket  = exp[idx++]; /* Server to create new Ticket */
1523
    options->useTicket     = exp[idx++]; /* Use Ticket not session cache */
1524
    options->noTicketTls12 = exp[idx++]; /* Server won't create new Ticket */
1525
#ifdef WOLFSSL_TLS13
1526
    if (ver > WOLFSSL_EXPORT_VERSION_3) {
1527
        options->noTicketTls13 = exp[idx++];/* Server won't create new Ticket */
1528
    }
1529
#else
1530
    if (ver > WOLFSSL_EXPORT_VERSION_3) {
1531
        idx++;
1532
    }
1533
#endif
1534
#else
1535
    idx++;
1536
    idx++;
1537
    idx++;
1538
    if (ver > WOLFSSL_EXPORT_VERSION_3) {
1539
        idx++;
1540
    }
1541
#endif
1542
    options->processReply   = exp[idx++];
1543
    options->cipherSuite0   = exp[idx++];
1544
    options->cipherSuite    = exp[idx++];
1545
    options->serverState    = exp[idx++];
1546
    options->clientState    = exp[idx++];
1547
    options->handShakeState = exp[idx++];
1548
    options->handShakeDone  = exp[idx++];
1549
    options->minDowngrade   = exp[idx++];
1550
    options->connectState   = exp[idx++];
1551
    options->acceptState    = exp[idx++];
1552
    options->asyncState     = exp[idx++];
1553
1554
    if (type == WOLFSSL_EXPORT_TLS) {
1555
#ifdef HAVE_ENCRYPT_THEN_MAC
1556
        options->disallowEncThenMac = exp[idx++];
1557
        options->encThenMac         = exp[idx++];
1558
        options->startedETMRead     = exp[idx++];
1559
        options->startedETMWrite    = exp[idx++];
1560
#else
1561
        idx++;
1562
        idx++;
1563
        idx++;
1564
        idx++;
1565
#endif
1566
    }
1567
1568
    /* If we had a connection established, let's assume that we can act
1569
     * statefully */
1570
    options->dtlsStateful = 1;
1571
    if (ver > WOLFSSL_EXPORT_VERSION_4) {
1572
#ifdef WOLFSSL_DTLS
1573
        options->dtlsStateful = exp[idx++];
1574
#else
1575
        idx++;
1576
#endif
1577
    }
1578
1579
    /* version of connection */
1580
    if (ssl->version.major != exp[idx++] || ssl->version.minor != exp[idx++]) {
1581
        WOLFSSL_MSG("Version mismatch ie DTLS v1 vs v1.2");
1582
        return VERSION_ERROR;
1583
    }
1584
1585
    /* set TLS 1.3 flag in options if this was a TLS 1.3 connection */
1586
    if (ssl->version.major == SSLv3_MAJOR &&
1587
            ssl->version.minor == TLSv1_3_MINOR) {
1588
        options->tls1_3 = 1;
1589
    }
1590
1591
    return idx;
1592
}
1593
1594
1595
#ifndef WOLFSSL_SESSION_EXPORT_NOPEER
1596
static int ExportPeerInfo(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
1597
{
1598
    int    idx  = 0;
1599
    int    ipSz = MAX_EXPORT_IP; /* start as max size */
1600
    int    fam  = 0;
1601
    word16 port = 0;
1602
    char   ip[MAX_EXPORT_IP];
1603
1604
    if (ver != WOLFSSL_EXPORT_VERSION) {
1605
        WOLFSSL_MSG("Export version not supported");
1606
        return BAD_FUNC_ARG;
1607
    }
1608
1609
    if (ssl == NULL || exp == NULL ||
1610
            len < (sizeof(ip) + 3 * WOLFSSL_EXPORT_LEN)) {
1611
        return BAD_FUNC_ARG;
1612
    }
1613
1614
    if (ssl->ctx->CBGetPeer == NULL) {
1615
        WOLFSSL_MSG("No get peer call back set");
1616
        return BAD_FUNC_ARG;
1617
    }
1618
    if (ssl->ctx->CBGetPeer(ssl, ip, &ipSz, &port, &fam) != WOLFSSL_SUCCESS) {
1619
        WOLFSSL_MSG("Get peer callback error");
1620
        return SOCKET_ERROR_E;
1621
    }
1622
1623
    /* check that ipSz/fam is not negative or too large since user can set cb */
1624
    if (ipSz < 0 || ipSz > MAX_EXPORT_IP || fam < 0) {
1625
        WOLFSSL_MSG("Bad ipSz or fam returned from get peer callback");
1626
        return SOCKET_ERROR_E;
1627
    }
1628
1629
    c16toa((word16)fam, exp + idx);  idx += WOLFSSL_EXPORT_LEN;
1630
    c16toa((word16)ipSz, exp + idx); idx += WOLFSSL_EXPORT_LEN;
1631
    XMEMCPY(exp + idx, ip, ipSz);    idx += ipSz;
1632
    c16toa(port, exp + idx);         idx += WOLFSSL_EXPORT_LEN;
1633
1634
    return idx;
1635
}
1636
#endif /* !WOLFSSL_SESSION_EXPORT_NOPEER */
1637
1638
1639
static int ImportPeerInfo(WOLFSSL* ssl, const byte* buf, word32 len, byte ver)
1640
{
1641
    word16 idx = 0;
1642
    word16 ipSz;
1643
    word16 fam;
1644
    word16 port;
1645
    char   ip[MAX_EXPORT_IP];
1646
1647
    if (ver != WOLFSSL_EXPORT_VERSION && ver != WOLFSSL_EXPORT_VERSION_4 &&
1648
            ver != WOLFSSL_EXPORT_VERSION_3) {
1649
        WOLFSSL_MSG("Export version not supported");
1650
        return BAD_FUNC_ARG;
1651
    }
1652
1653
    if (len == 0) {
1654
        WOLFSSL_MSG("No peer info sent");
1655
        return 0;
1656
    }
1657
1658
    if (ssl == NULL || buf == NULL || len < 3 * WOLFSSL_EXPORT_LEN) {
1659
        return BAD_FUNC_ARG;
1660
    }
1661
1662
    /* import sin family */
1663
    ato16(buf + idx, &fam); idx += WOLFSSL_EXPORT_LEN;
1664
1665
    /* import ip address idx, and ipSz are unsigned but cast for enum */
1666
    ato16(buf + idx, &ipSz); idx += WOLFSSL_EXPORT_LEN;
1667
    if (ipSz >= sizeof(ip) || (word16)(idx + ipSz + WOLFSSL_EXPORT_LEN) > len) {
1668
        return BUFFER_E;
1669
    }
1670
    XMEMSET(ip, 0, sizeof(ip));
1671
    XMEMCPY(ip, buf + idx, ipSz); idx += ipSz;
1672
    ip[ipSz] = '\0'; /* with check that ipSz less than ip this is valid */
1673
    ato16(buf + idx, &port); idx += WOLFSSL_EXPORT_LEN;
1674
1675
    /* sanity check for a function to call, then use it to import peer info */
1676
    if (ssl->ctx->CBSetPeer == NULL) {
1677
        WOLFSSL_MSG("No set peer function");
1678
        return BAD_FUNC_ARG;
1679
    }
1680
    if (ssl->ctx->CBSetPeer(ssl, ip, ipSz, port, fam) != WOLFSSL_SUCCESS) {
1681
        WOLFSSL_MSG("Error setting peer info");
1682
        return SOCKET_ERROR_E;
1683
    }
1684
1685
    return idx;
1686
}
1687
1688
1689
#ifdef WOLFSSL_DTLS
1690
/* WOLFSSL_LOCAL function that serializes the current WOLFSSL session state only
1691
 * buf is used to hold the serialized WOLFSSL struct and sz is the size of buf
1692
 * passed in.
1693
 * On success returns the size of serialized session state.*/
1694
int wolfSSL_dtls_export_state_internal(WOLFSSL* ssl, byte* buf, word32 sz)
1695
{
1696
    int ret;
1697
    word32 idx      = 0;
1698
    word32 totalLen = 0;
1699
1700
    WOLFSSL_ENTER("wolfSSL_dtls_export_state_internal");
1701
1702
    if (buf == NULL || ssl == NULL) {
1703
        WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BAD_FUNC_ARG);
1704
        return BAD_FUNC_ARG;
1705
    }
1706
1707
    totalLen += WOLFSSL_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
1708
    /* each of the following have a 2 byte length before data */
1709
    totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_MIN_KEY_SZ;
1710
    if (totalLen > sz) {
1711
        WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BUFFER_E);
1712
        return BUFFER_E;
1713
    }
1714
1715
    buf[idx++] =  (byte)DTLS_EXPORT_STATE_PRO;
1716
    buf[idx++] = ((byte)DTLS_EXPORT_STATE_PRO & 0xF0) |
1717
                 ((byte)WOLFSSL_EXPORT_VERSION & 0X0F);
1718
    idx += WOLFSSL_EXPORT_LEN; /* leave room for total length */
1719
1720
    /* export keys struct and dtls state -- variable length stored in ret */
1721
    idx += WOLFSSL_EXPORT_LEN; /* leave room for length */
1722
    if ((ret = ExportKeyState(ssl, buf + idx, sz - idx,
1723
                    WOLFSSL_EXPORT_VERSION, 1, WOLFSSL_EXPORT_DTLS)) < 0) {
1724
        WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", ret);
1725
        return ret;
1726
    }
1727
    c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN); idx += ret;
1728
1729
    /* place total length of exported buffer minus 2 bytes protocol/version */
1730
    c16toa((word16)(idx - WOLFSSL_EXPORT_LEN), buf + WOLFSSL_EXPORT_LEN);
1731
1732
#ifdef WOLFSSL_SESSION_EXPORT_DEBUG
1733
    /* if compiled with debug options then print the version, protocol, size */
1734
    {
1735
        char debug[256];
1736
        XSNPRINTF(debug, sizeof(debug), "Exporting DTLS session state\n"
1737
                   "\tVersion  : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
1738
               , (int)WOLFSSL_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
1739
        WOLFSSL_MSG(debug);
1740
    }
1741
#endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
1742
1743
    WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", idx);
1744
    return idx;
1745
}
1746
1747
1748
/* On success return amount of buffer consumed */
1749
int wolfSSL_dtls_import_state_internal(WOLFSSL* ssl, const byte* buf, word32 sz)
1750
{
1751
    word32 idx    = 0;
1752
    word16 length = 0;
1753
    int version;
1754
    int ret;
1755
1756
    WOLFSSL_ENTER("wolfSSL_dtls_import_state_internal");
1757
    /* check at least enough room for protocol and length */
1758
    if (sz < WOLFSSL_EXPORT_LEN * 2 || ssl == NULL) {
1759
        WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", BAD_FUNC_ARG);
1760
        return BAD_FUNC_ARG;
1761
    }
1762
1763
    if (buf[idx++] !=  (byte)DTLS_EXPORT_STATE_PRO ||
1764
            (buf[idx] & 0xF0) != ((byte)DTLS_EXPORT_PRO & 0xF0)) {
1765
        WOLFSSL_MSG("Incorrect protocol");
1766
        return BAD_FUNC_ARG;
1767
    }
1768
    version = buf[idx++] & 0x0F;
1769
1770
    ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
1771
    if (length > sz - WOLFSSL_EXPORT_LEN) { /* subtract 2 for protocol */
1772
        WOLFSSL_MSG("Buffer size sanity check failed");
1773
        return BUFFER_E;
1774
    }
1775
1776
#ifdef WOLFSSL_SESSION_EXPORT_DEBUG
1777
    /* if compiled with debug options then print the version, protocol, size */
1778
    {
1779
        char debug[256];
1780
        XSNPRINTF(debug, sizeof(debug), "Importing DTLS session state\n"
1781
                   "\tVersion  : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
1782
               , (int)version, buf[0], (buf[1] >> 4), length);
1783
        WOLFSSL_MSG(debug);
1784
    }
1785
#endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
1786
1787
    /* perform sanity checks and extract Options information used */
1788
    switch (version) {
1789
        case WOLFSSL_EXPORT_VERSION:
1790
            break;
1791
1792
        default:
1793
            WOLFSSL_MSG("Bad export state version");
1794
            return BAD_FUNC_ARG;
1795
1796
    }
1797
1798
    /* perform sanity checks and extract Keys struct */
1799
    if (WOLFSSL_EXPORT_LEN + idx > sz) {
1800
        WOLFSSL_MSG("Import Key struct error");
1801
        return BUFFER_E;
1802
    }
1803
    ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
1804
    if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
1805
        WOLFSSL_MSG("Import Key struct error");
1806
        return BUFFER_E;
1807
    }
1808
    if ((ret = ImportKeyState(ssl, buf + idx, length, version,
1809
                    WOLFSSL_EXPORT_DTLS)) < 0) {
1810
        WOLFSSL_MSG("Import Key struct error");
1811
        WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
1812
        return ret;
1813
    }
1814
    idx += ret;
1815
1816
    WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
1817
    return idx;
1818
}
1819
#endif /* WOLFSSL_DTLS */
1820
1821
1822
/**
1823
 * Imports a serialized buffer (both TLS and DTLS)
1824
 *
1825
 * @param ssl WOLFSSL structure to import into
1826
 * @param buf buffer containing serialized session
1827
 * @param sz  size of buffer 'buf'
1828
 * @param type flag for TLS or DTLS
1829
 *
1830
 * @return the size of serialized buffer on success
1831
 */
1832
int wolfSSL_session_import_internal(WOLFSSL* ssl, const unsigned char* buf,
1833
        unsigned int sz, int type)
1834
{
1835
    word32 idx    = 0;
1836
    word16 length = 0;
1837
    int version   = 0;
1838
    int ret = 0;
1839
    int optSz = 0;
1840
    int rc;
1841
1842
    WOLFSSL_ENTER("wolfSSL_session_import_internal");
1843
    /* check at least enough room for protocol and length */
1844
    if (sz < WOLFSSL_EXPORT_LEN * 2 || ssl == NULL) {
1845
        ret = BAD_FUNC_ARG;
1846
    }
1847
1848
    /* Check if is TLS export protocol */
1849
    if (ret == 0) {
1850
        byte validProto = 0; /* did we find a valid protocol */
1851
1852
        if (buf[idx]             ==  (byte)TLS_EXPORT_PRO &&
1853
           (buf[idx + 1] & 0xF0) == ((byte)TLS_EXPORT_PRO & 0xF0)) {
1854
            validProto = 1;
1855
        }
1856
1857
        /* Check if is DTLS export protocol */
1858
        if (buf[idx]             ==  (byte)DTLS_EXPORT_PRO &&
1859
           (buf[idx + 1] & 0xF0) == ((byte)DTLS_EXPORT_PRO & 0xF0)) {
1860
            validProto = 1;
1861
        }
1862
1863
        if (validProto == 0) {
1864
        #ifdef WOLFSSL_DTLS
1865
            /* check if importing state only */
1866
            return wolfSSL_dtls_import_state_internal(ssl, buf, sz);
1867
        #else
1868
            WOLFSSL_MSG("Invalid serialized session protocol value");
1869
            ret = BAD_FUNC_ARG;
1870
        #endif
1871
        }
1872
        idx += 1;
1873
    }
1874
1875
    if (ret == 0) {
1876
        version = buf[idx++] & 0x0F;
1877
        ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
1878
        if (length > sz - WOLFSSL_EXPORT_LEN) { /* subtract 2 for protocol */
1879
            ret = BUFFER_E;
1880
        }
1881
    }
1882
1883
    /* if compiled with debug options then print the version, protocol, size */
1884
#ifdef WOLFSSL_SESSION_EXPORT_DEBUG
1885
    {
1886
        char debug[256];
1887
        XSNPRINTF(debug, sizeof(debug), "Importing DTLS session\n"
1888
                   "\tVersion  : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
1889
               , (int)version, buf[0], (buf[1] >> 4), length);
1890
        WOLFSSL_MSG(debug);
1891
    }
1892
#endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
1893
1894
    /* perform sanity checks and extract Options information used */
1895
    if (ret == 0) {
1896
        switch (version) {
1897
            case WOLFSSL_EXPORT_VERSION:
1898
                if (type == WOLFSSL_EXPORT_DTLS) {
1899
                    optSz = DTLS_EXPORT_OPT_SZ;
1900
                }
1901
                else {
1902
                    optSz = TLS_EXPORT_OPT_SZ;
1903
                }
1904
                break;
1905
1906
            case WOLFSSL_EXPORT_VERSION_4:
1907
                if (type == WOLFSSL_EXPORT_DTLS) {
1908
                    optSz = DTLS_EXPORT_OPT_SZ_4;
1909
                }
1910
                else {
1911
                    optSz = TLS_EXPORT_OPT_SZ;
1912
                }
1913
                break;
1914
1915
            case WOLFSSL_EXPORT_VERSION_3:
1916
                WOLFSSL_MSG("Importing older version 3");
1917
                optSz = DTLS_EXPORT_OPT_SZ_3;
1918
                break;
1919
1920
            default:
1921
                WOLFSSL_MSG("Bad export version");
1922
                ret = BAD_FUNC_ARG;
1923
        }
1924
    }
1925
1926
    if (ret == 0 && (WOLFSSL_EXPORT_LEN + optSz + idx > sz)) {
1927
        WOLFSSL_MSG("Import Options struct error");
1928
        ret = BUFFER_E;
1929
    }
1930
1931
    if (ret == 0) {
1932
        ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
1933
        if (length != optSz) {
1934
            WOLFSSL_MSG("Import Options struct error");
1935
            ret = BUFFER_E;
1936
        }
1937
    }
1938
1939
    if (ret == 0) {
1940
        rc = ImportOptions(ssl, buf + idx, length, version, type);
1941
        if (rc < 0) {
1942
            WOLFSSL_MSG("Import Options struct error");
1943
            ret = rc;
1944
        }
1945
        else {
1946
            idx += length;
1947
        }
1948
    }
1949
1950
    /* perform sanity checks and extract Keys struct */
1951
    if (ret == 0 && (WOLFSSL_EXPORT_LEN + idx > sz)) {
1952
        WOLFSSL_MSG("Import Key struct error");
1953
        ret = BUFFER_E;
1954
    }
1955
1956
    if (ret == 0) {
1957
        ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
1958
        if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
1959
            WOLFSSL_MSG("Import Key struct error");
1960
            ret = BUFFER_E;
1961
        }
1962
    }
1963
1964
    if (ret == 0) {
1965
        rc = ImportKeyState(ssl, buf + idx, length, version, type);
1966
        if (rc < 0) {
1967
            WOLFSSL_MSG("Import Key struct error");
1968
            ret = rc;
1969
        }
1970
        else {
1971
            idx += rc;
1972
        }
1973
    }
1974
1975
    /* perform sanity checks and extract CipherSpecs struct */
1976
    if (ret == 0 && (WOLFSSL_EXPORT_LEN + WOLFSSL_EXPORT_SPC_SZ + idx > sz)) {
1977
        WOLFSSL_MSG("Import CipherSpecs struct error");
1978
        ret = BUFFER_E;
1979
    }
1980
1981
    if (ret == 0) {
1982
        ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
1983
        if (length != WOLFSSL_EXPORT_SPC_SZ) {
1984
            WOLFSSL_MSG("Import CipherSpecs struct error");
1985
            ret = BUFFER_E;
1986
        }
1987
    }
1988
1989
    if (ret == 0) {
1990
        rc = ImportCipherSpecState(ssl, buf + idx, length, version, type);
1991
        if (rc < 0) {
1992
            WOLFSSL_MSG("Import CipherSpecs struct error");
1993
            ret = rc;
1994
        }
1995
        else {
1996
            idx += rc;
1997
        }
1998
    }
1999
2000
    /* perform sanity checks and extract DTLS peer info */
2001
    if (ret == 0 && (WOLFSSL_EXPORT_LEN + idx > sz)) {
2002
        WOLFSSL_MSG("Import DTLS peer info error");
2003
        ret = BUFFER_E;
2004
    }
2005
2006
    if (ret == 0) {
2007
        ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
2008
        if (idx + length > sz) {
2009
            WOLFSSL_MSG("Import DTLS peer info error");
2010
            ret = BUFFER_E;
2011
        }
2012
    }
2013
2014
    if (ret == 0) {
2015
        rc = ImportPeerInfo(ssl, buf + idx, length, version);
2016
        if (rc < 0) {
2017
            WOLFSSL_MSG("Import Peer Addr error");
2018
            ret = rc;
2019
        }
2020
        else {
2021
            idx += rc;
2022
        }
2023
    }
2024
2025
    /* make sure is a valid suite used */
2026
    if (ret == 0 && wolfSSL_get_cipher(ssl) == NULL) {
2027
        WOLFSSL_MSG("Can not match cipher suite imported");
2028
        ret = MATCH_SUITE_ERROR;
2029
    }
2030
2031
#ifndef WOLFSSL_AEAD_ONLY
2032
    /* set hmac function to use when verifying */
2033
    if (ret == 0 && (ssl->options.tls == 1 || ssl->options.tls1_1 == 1 ||
2034
                     ssl->options.dtls == 1)) {
2035
    #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \
2036
        !defined(WOLFSSL_RENESAS_TSIP_TLS)
2037
        ssl->hmac = TLS_hmac;
2038
    #else
2039
        ssl->hmac = Renesas_cmn_TLS_hmac;
2040
    #endif
2041
    }
2042
2043
    /* do not allow stream ciphers with DTLS, except for NULL cipher */
2044
    if (ret == 0 && ssl->specs.cipher_type == stream &&
2045
        ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) {
2046
        WOLFSSL_MSG("Can not import stream ciphers for DTLS");
2047
        ret = SANITY_CIPHER_E;
2048
    }
2049
#endif /* !WOLFSSL_AEAD_ONLY */
2050
2051
    if (ret != 0) {
2052
        idx = ret;
2053
    }
2054
    WOLFSSL_LEAVE("wolfSSL_session_import_internal", idx);
2055
    return idx;
2056
}
2057
2058
2059
/**
2060
 * Handles serializing the session information.
2061
 *
2062
 * @param ssl WOLFSSL structure to serialize session from
2063
 * @param buf output buffer to hold serialized session
2064
 * @param sz  the size of buffer 'buf', if too small then gets updated
2065
 * @param type if the input WOLFSSL structure is expected to be TLS or DTLS
2066
 *              1 for yes is TLS and 0 for no is DTLS
2067
 *
2068
 * @return the size of serialized buffer on success and negative values on fail
2069
 */
2070
int wolfSSL_session_export_internal(WOLFSSL* ssl, byte* buf, word32* sz,
2071
        int type)
2072
{
2073
    int ret = 0;
2074
    word32 idx      = 0;
2075
    word32 totalLen = 0;
2076
2077
    WOLFSSL_ENTER("wolfSSL_session_export_internal");
2078
2079
    if (ssl == NULL) {
2080
        WOLFSSL_MSG("unexpected null argument");
2081
        ret = BAD_FUNC_ARG;
2082
    }
2083
2084
    if (ret == 0) {
2085
        totalLen += WOLFSSL_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
2086
        /* each of the following have a 2 byte length before data */
2087
        totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_OPT_SZ;
2088
        totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_KEY_SZ;
2089
        totalLen += WOLFSSL_EXPORT_LEN + WOLFSSL_EXPORT_SPC_SZ;
2090
        #ifdef WOLFSSL_DTLS
2091
        if (type == WOLFSSL_EXPORT_DTLS) {
2092
            totalLen += WOLFSSL_EXPORT_LEN + ssl->buffers.dtlsCtx.peer.sz;
2093
        }
2094
        #endif
2095
    }
2096
2097
    /* check is at least the minimum size needed, TLS cipher states add more */
2098
    if (ret == 0 && (totalLen > *sz || buf == NULL)) {
2099
        WOLFSSL_MSG("export buffer was too small or null");
2100
        *sz = totalLen;
2101
2102
        /* possible AES state needed */
2103
        if (type == WOLFSSL_EXPORT_TLS) {
2104
            *sz += WC_AES_BLOCK_SIZE*2;
2105
        }
2106
        ret = WC_NO_ERR_TRACE(LENGTH_ONLY_E);
2107
    }
2108
2109
    if (ret == 0) {
2110
        buf[idx++] =  (byte)(type == WOLFSSL_EXPORT_TLS)? TLS_EXPORT_PRO :
2111
                    DTLS_EXPORT_PRO;
2112
        buf[idx++] = ((byte)((type == WOLFSSL_EXPORT_TLS)? TLS_EXPORT_PRO :
2113
                    DTLS_EXPORT_PRO) & 0xF0)
2114
                    | ((byte)WOLFSSL_EXPORT_VERSION & 0X0F);
2115
2116
        idx += WOLFSSL_EXPORT_LEN; /* leave spot for length of total buffer  */
2117
2118
        idx += WOLFSSL_EXPORT_LEN;
2119
        ret = ExportOptions(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION,
2120
                type);
2121
        if (ret >= 0) {
2122
            c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN);
2123
            idx += ret;
2124
            ret  = 0;
2125
        }
2126
    }
2127
2128
    /* export keys struct and dtls state -- variable length stored in ret */
2129
    if (ret == 0) {
2130
        idx += WOLFSSL_EXPORT_LEN; /* leave room for length */
2131
        ret = ExportKeyState(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION,
2132
                0, type);
2133
        if (ret >= 0) {
2134
            c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN); idx += ret;
2135
            ret = 0;
2136
        }
2137
    }
2138
2139
    /* export of cipher specs struct */
2140
    if (ret == 0) {
2141
        c16toa((word16)WOLFSSL_EXPORT_SPC_SZ, buf + idx);
2142
        idx += WOLFSSL_EXPORT_LEN;
2143
        ret = ExportCipherSpecState(ssl, buf + idx, *sz - idx,
2144
                                                 WOLFSSL_EXPORT_VERSION, type);
2145
        if (ret >= 0) {
2146
            idx += ret;
2147
            ret  = 0;
2148
        }
2149
    }
2150
2151
    /* export of peer information */
2152
    if (ret == 0) {
2153
        idx += WOLFSSL_EXPORT_LEN;
2154
    #ifdef WOLFSSL_SESSION_EXPORT_NOPEER
2155
        ret = 0; /* not saving peer port/ip information */
2156
    #else
2157
        ret = ExportPeerInfo(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION);
2158
    #endif
2159
        if (ret >= 0) {
2160
            c16toa(ret, buf + idx - WOLFSSL_EXPORT_LEN);
2161
            idx += ret;
2162
            ret  = 0;
2163
        }
2164
    }
2165
2166
    if (ret != 0 && ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E) && buf != NULL) {
2167
        /*in a fail case clear the buffer which could contain partial key info*/
2168
        XMEMSET(buf, 0, *sz);
2169
    }
2170
2171
    /* place total length of exported buffer minus 2 bytes protocol/version */
2172
    if (ret == 0) {
2173
        c16toa((word16)(idx - WOLFSSL_EXPORT_LEN), buf + WOLFSSL_EXPORT_LEN);
2174
        ret = idx;
2175
2176
    #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
2177
        {
2178
            char debug[256];
2179
            XSNPRINTF(debug, sizeof(debug), "Exporting TLS session\n"
2180
                   "\tVersion  : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
2181
                  ,(int)WOLFSSL_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
2182
            WOLFSSL_MSG(debug);
2183
        }
2184
    #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
2185
    }
2186
2187
    if (ret >= 0) {
2188
        *sz = ret;
2189
    }
2190
2191
    WOLFSSL_LEAVE("wolfSSL_session_export_internal", ret);
2192
    return ret;
2193
}
2194
#endif /* WOLFSSL_SESSION_EXPORT */
2195
2196
2197
void InitSSL_Method(WOLFSSL_METHOD* method, ProtocolVersion pv)
2198
4.92k
{
2199
4.92k
    method->version    = pv;
2200
4.92k
    method->side       = WOLFSSL_CLIENT_END;
2201
4.92k
    method->downgrade  = 0;
2202
4.92k
}
2203
2204
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) || \
2205
    defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
2206
int InitSSL_Side(WOLFSSL* ssl, word16 side)
2207
{
2208
    if (ssl == NULL)
2209
        return BAD_FUNC_ARG;
2210
2211
    /* set side */
2212
    ssl->options.side = side;
2213
2214
    /* reset options that are side specific */
2215
#ifdef HAVE_ECC
2216
    if (ssl->options.side == WOLFSSL_CLIENT_END) {
2217
        ssl->options.haveECDSAsig  = 1; /* always on client side */
2218
        ssl->options.haveECC = 1;       /* server turns on with ECC key cert */
2219
        ssl->options.haveStaticECC = 1; /* server can turn on by loading key */
2220
    }
2221
#elif defined(HAVE_ED25519) || defined(HAVE_ED448)
2222
    if (ssl->options.side == WOLFSSL_CLIENT_END) {
2223
        ssl->options.haveECDSAsig  = 1; /* always on client side */
2224
        ssl->options.haveECC  = 1;      /* server turns on with ECC key cert */
2225
    }
2226
#endif
2227
#ifdef HAVE_FALCON
2228
    if (ssl->options.side == WOLFSSL_CLIENT_END) {
2229
        ssl->options.haveFalconSig  = 1; /* always on client side */
2230
    }
2231
#endif /* HAVE_FALCON */
2232
#ifdef HAVE_DILITHIUM
2233
    if (ssl->options.side == WOLFSSL_CLIENT_END) {
2234
        ssl->options.haveDilithiumSig  = 1; /* always on client side */
2235
    }
2236
#endif /* HAVE_DILITHIUM */
2237
2238
#if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
2239
    if (ssl->options.side == WOLFSSL_CLIENT_END) {
2240
        if ((ssl->ctx->method->version.major == SSLv3_MAJOR) &&
2241
             (ssl->ctx->method->version.minor >= TLSv1_MINOR)) {
2242
            ssl->options.haveEMS = 1;
2243
        }
2244
    #ifdef WOLFSSL_DTLS
2245
        if (ssl->ctx->method->version.major == DTLS_MAJOR)
2246
            ssl->options.haveEMS = 1;
2247
    #endif /* WOLFSSL_DTLS */
2248
    }
2249
#endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
2250
2251
#if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
2252
    if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
2253
        int ret;
2254
        ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
2255
        if (ret != 0) {
2256
            WOLFSSL_MSG("DTLS Cookie Secret error");
2257
            return ret;
2258
        }
2259
    }
2260
#endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
2261
2262
    return InitSSL_Suites(ssl);
2263
}
2264
#endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE ||
2265
        * WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
2266
2267
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
2268
/* Check the wolfssl method meets minimum requirements for
2269
 * the given security level.
2270
 *
2271
 * Returns  0 if method meets security level.
2272
 * Returns  CRYPTO_POLICY_FORBIDDEN otherwise.
2273
 * */
2274
static int wolfSSL_crypto_policy_method_allowed(WOLFSSL_METHOD * method,
2275
                                                int level)
2276
{
2277
    if (level == 0) {
2278
        /* permissive, no restrictions. */
2279
        return 0;
2280
    }
2281
2282
    #ifdef WOLFSSL_DTLS
2283
    if (method->version.major == DTLS_MAJOR) {
2284
        if (method->version.minor == DTLS_MINOR) {
2285
            /* sec level must be 1 or lower. */
2286
            if (level > 1) {
2287
                return CRYPTO_POLICY_FORBIDDEN;
2288
            }
2289
        }
2290
    }
2291
    else
2292
    #endif /* WOLFSSL_DTLS */
2293
    {
2294
        if (method->version.minor == SSLv3_MINOR) {
2295
            /* sec level must be 0. */
2296
            if (level > 0) {
2297
                return CRYPTO_POLICY_FORBIDDEN;
2298
            }
2299
        }
2300
        else if (method->version.minor == TLSv1_MINOR ||
2301
                 method->version.minor == TLSv1_1_MINOR) {
2302
            /* sec level must be 1 or lower. */
2303
            if (level > 1) {
2304
                return CRYPTO_POLICY_FORBIDDEN;
2305
            }
2306
        }
2307
    }
2308
2309
    /* nothing else to check, all other combinations ok. */
2310
2311
    return 0;
2312
}
2313
2314
/* Configure the CTX to conform to the security policy.
2315
 *
2316
 * Also, check the WOLFSSL_METHOD against the supplied security
2317
 * level.
2318
 *
2319
 * Returns  CRYPTO_POLICY_FORBIDDEN if not allowed per policy.
2320
 * Returns  BAD_FUNC_ARG on null args.
2321
 * Returns  0 if ok.
2322
 * */
2323
int wolfSSL_crypto_policy_init_ctx(WOLFSSL_CTX * ctx,
2324
                                   WOLFSSL_METHOD * method)
2325
{
2326
    byte         minDowngrade = 0x00;
2327
    #ifdef WOLFSSL_DTLS
2328
    int          dtls = 0;
2329
    #endif /* WOLFSSL_DTLS */
2330
    int          level = 0;
2331
    #if !defined(NO_DH) || !defined(NO_RSA)
2332
    word16       minKeySz = 0; /* minimum DH or RSA key size */
2333
    #endif /* !NO_DH || !NO_RSA*/
2334
    #ifdef HAVE_ECC
2335
    short        minEccKeySz = 0; /* minimum allowed ECC key size */
2336
    #endif /* HAVE_ECC */
2337
2338
2339
    if (ctx == NULL || method == NULL) {
2340
        return BAD_FUNC_ARG;
2341
    }
2342
2343
    #ifdef WOLFSSL_DTLS
2344
    dtls = (method->version.major == DTLS_MAJOR);
2345
    #endif /* WOLFSSL_DTLS */
2346
2347
    /* get the crypto policy security level. */
2348
    level = wolfSSL_crypto_policy_get_level();
2349
2350
    if (level < 0 || level > 5) {
2351
        WOLFSSL_MSG_EX("crypto_policy_init_ctx: invalid level: %d", level);
2352
        return BAD_FUNC_ARG;
2353
    }
2354
2355
    /* Check requested method per security level. */
2356
    if (wolfSSL_crypto_policy_method_allowed(method, level) != 0) {
2357
        WOLFSSL_MSG_EX("crypto_policy_init_ctx: "
2358
                       "method=%d, SECLEVEL=%d combination not allowed",
2359
                       method->version.minor, level);
2360
        return CRYPTO_POLICY_FORBIDDEN;
2361
    }
2362
2363
    /* Set appropriate min downgrade per security level. */
2364
    #ifdef WOLFSSL_DTLS
2365
    if (dtls) {
2366
        switch (level) {
2367
        case 1:
2368
            minDowngrade = DTLS_MINOR;
2369
            break;
2370
        case 2:
2371
        case 3:
2372
        case 4:
2373
        case 5:
2374
            minDowngrade = DTLSv1_2_MINOR;
2375
            break;
2376
        case 0:
2377
        default:
2378
            /* Permissive, no restrictions. Allow defaults. */
2379
            minDowngrade = WOLFSSL_MIN_DTLS_DOWNGRADE;
2380
            break;
2381
        }
2382
    }
2383
    else
2384
    #endif /* WOLFSSL_DTLS */
2385
    {
2386
        switch (level) {
2387
        case 1:
2388
            /* prohibit SSLv3 and lower. */
2389
            minDowngrade = TLSv1_MINOR;
2390
            break;
2391
        case 2:
2392
        case 3:
2393
        case 4:
2394
        case 5:
2395
            /* prohibit TLSv1_1 and lower. */
2396
            minDowngrade = TLSv1_2_MINOR;
2397
            break;
2398
        case 0:
2399
        default:
2400
            ctx->minDowngrade = WOLFSSL_MIN_DOWNGRADE;
2401
            break;
2402
        }
2403
    }
2404
2405
    /* Set min RSA and DH key size. */
2406
    #if !defined(NO_DH) || !defined(NO_RSA)
2407
    switch (level) {
2408
    case 1:
2409
        minKeySz = 128; /* 1024 bits / 8 */
2410
        break;
2411
    case 2:
2412
        minKeySz = 256; /* 2048 bits / 8 */
2413
        break;
2414
    case 3:
2415
        minKeySz = 384; /* 3072 bits / 8 */
2416
        break;
2417
    case 4:
2418
        minKeySz = 960; /* 7680 bits / 8 */
2419
        break;
2420
    case 5:
2421
        minKeySz = 1920; /* 15360 bits / 8 */
2422
        break;
2423
    case 0:
2424
    default:
2425
        break;
2426
    }
2427
    #endif /* !NO_DH || !NO_RSA*/
2428
2429
    /* Set min ECC key size. */
2430
    #ifdef HAVE_ECC
2431
    switch (level) {
2432
    case 1:
2433
        minEccKeySz = 20; /* 160 bits / 8 */
2434
        break;
2435
    case 2:
2436
        minEccKeySz = 28; /* 224 bits / 8 */
2437
        break;
2438
    case 3:
2439
        minEccKeySz = 32; /* 256 bits / 8 */
2440
        break;
2441
    case 4:
2442
        minEccKeySz = 48; /* 384 bits / 8 */
2443
        break;
2444
    case 5:
2445
        minEccKeySz = 64; /* 512 bits / 8 */
2446
        break;
2447
    default:
2448
    case 0:
2449
        break;
2450
    }
2451
    #endif /* HAVE_ECC */
2452
2453
    /* Finally set the ctx values. */
2454
    ctx->minDowngrade = minDowngrade;
2455
    ctx->secLevel = level;
2456
    ctx->method = method;
2457
2458
    #if !defined(NO_DH) || !defined(NO_RSA)
2459
    if (minKeySz > 0) {
2460
        #ifndef NO_DH
2461
        if (minKeySz > MAX_DHKEY_SZ) {
2462
            WOLFSSL_MSG_EX("crypto_policy_init_ctx: minKeySz=%d, "
2463
                           "but MAX_DHKEY_SZ=%d",
2464
                           minKeySz, MAX_DHKEY_SZ);
2465
            return CRYPTO_POLICY_FORBIDDEN;
2466
        }
2467
        ctx->minDhKeySz  = minKeySz;
2468
        ctx->maxDhKeySz  = MAX_DHKEY_SZ;
2469
        #endif /* NO_DH */
2470
        #ifndef NO_RSA
2471
        ctx->minRsaKeySz = minKeySz;
2472
        #endif /* NO_RSA */
2473
    }
2474
    #endif /* !NO_DH || !NO_RSA*/
2475
2476
    #ifdef HAVE_ECC
2477
    if (minEccKeySz > 0) {
2478
        ctx->minEccKeySz  = minEccKeySz;
2479
    }
2480
    #endif /* HAVE_ECC */
2481
2482
    return 0;
2483
}
2484
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
2485
2486
/* Initialize SSL context, return 0 on success */
2487
int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap)
2488
4.87k
{
2489
4.87k
    int ret = 0;
2490
2491
4.87k
    XMEMSET(ctx, 0, sizeof(WOLFSSL_CTX));
2492
2493
4.87k
    ctx->method   = method;
2494
4.87k
    if (heap == NULL) {
2495
4.87k
        ctx->heap = ctx;  /* defaults to self */
2496
4.87k
    }
2497
0
    else {
2498
0
        ctx->heap = heap; /* wolfSSL_CTX_load_static_memory sets */
2499
0
    }
2500
4.87k
    ctx->timeout  = WOLFSSL_SESSION_TIMEOUT;
2501
2502
#ifdef WOLFSSL_DTLS
2503
    if (method->version.major == DTLS_MAJOR) {
2504
        ctx->minDowngrade = WOLFSSL_MIN_DTLS_DOWNGRADE;
2505
    }
2506
    else
2507
#endif /* WOLFSSL_DTLS */
2508
4.87k
    {
2509
        /* current default: TLSv1_MINOR */
2510
4.87k
        ctx->minDowngrade = WOLFSSL_MIN_DOWNGRADE;
2511
4.87k
    }
2512
2513
4.87k
    wolfSSL_RefWithMutexInit(&ctx->ref, &ret);
2514
#ifdef WOLFSSL_REFCNT_ERROR_RETURN
2515
    if (ret < 0) {
2516
        WOLFSSL_MSG("Mutex error on CTX init");
2517
        ctx->err = CTX_INIT_MUTEX_E;
2518
        WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
2519
        return BAD_MUTEX_E;
2520
    }
2521
#else
2522
4.87k
    (void)ret;
2523
4.87k
#endif
2524
2525
4.87k
#ifndef NO_CERTS
2526
4.87k
    ctx->privateKeyDevId = INVALID_DEVID;
2527
#ifdef WOLFSSL_DUAL_ALG_CERTS
2528
    ctx->altPrivateKeyDevId = INVALID_DEVID;
2529
#endif
2530
4.87k
#endif
2531
2532
4.87k
#ifndef NO_DH
2533
4.87k
    ctx->minDhKeySz  = MIN_DHKEY_SZ;
2534
4.87k
    ctx->maxDhKeySz  = MAX_DHKEY_SZ;
2535
4.87k
#endif
2536
4.87k
#ifndef NO_RSA
2537
4.87k
    ctx->minRsaKeySz = MIN_RSAKEY_SZ;
2538
4.87k
#endif
2539
2540
4.87k
#ifdef HAVE_ECC
2541
4.87k
    ctx->minEccKeySz  = MIN_ECCKEY_SZ;
2542
4.87k
    ctx->eccTempKeySz = ECDHE_SIZE;
2543
4.87k
#endif
2544
#ifdef HAVE_FALCON
2545
    ctx->minFalconKeySz = MIN_FALCONKEY_SZ;
2546
#endif /* HAVE_FALCON */
2547
#ifdef HAVE_DILITHIUM
2548
    ctx->minDilithiumKeySz = MIN_DILITHIUMKEY_SZ;
2549
#endif /* HAVE_DILITHIUM */
2550
4.87k
    ctx->verifyDepth = MAX_CHAIN_DEPTH;
2551
#ifdef OPENSSL_EXTRA
2552
    ctx->cbioFlag = WOLFSSL_CBIO_NONE;
2553
#endif
2554
2555
#ifdef HAVE_NETX
2556
    ctx->CBIORecv = NetX_Receive;
2557
    ctx->CBIOSend = NetX_Send;
2558
#elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
2559
    ctx->CBIORecv = Mynewt_Receive;
2560
    ctx->CBIOSend = Mynewt_Send;
2561
#elif defined WOLFSSL_LWIP_NATIVE
2562
    ctx->CBIORecv = LwIPNativeReceive;
2563
    ctx->CBIOSend = LwIPNativeSend;
2564
#elif defined(WOLFSSL_GNRC)
2565
    ctx->CBIORecv = GNRC_ReceiveFrom;
2566
    ctx->CBIOSend = GNRC_SendTo;
2567
#elif defined WOLFSSL_ISOTP
2568
    ctx->CBIORecv = ISOTP_Receive;
2569
    ctx->CBIOSend = ISOTP_Send;
2570
#elif !defined(WOLFSSL_USER_IO)
2571
    #ifdef MICRIUM
2572
        ctx->CBIORecv = MicriumReceive;
2573
        ctx->CBIOSend = MicriumSend;
2574
        #ifdef WOLFSSL_DTLS
2575
            if (method->version.major == DTLS_MAJOR) {
2576
                ctx->CBIORecv   = MicriumReceiveFrom;
2577
                ctx->CBIOSend   = MicriumSendTo;
2578
            }
2579
            #ifdef WOLFSSL_SESSION_EXPORT
2580
                #error Micrium port does not support DTLS session export yet
2581
            #endif
2582
        #endif
2583
    #elif defined WOLFSSL_UIP
2584
        ctx->CBIORecv = uIPReceive;
2585
        ctx->CBIOSend = uIPSend;
2586
        #ifdef WOLFSSL_DTLS
2587
        if (method->version.major == DTLS_MAJOR) {
2588
            ctx->CBIOSendTo = uIPSendTo;
2589
            ctx->CBIORecvFrom = uIPRecvFrom;
2590
        }
2591
        #endif
2592
    #else
2593
4.87k
        ctx->CBIORecv = EmbedReceive;
2594
4.87k
        ctx->CBIOSend = EmbedSend;
2595
        #ifdef WOLFSSL_SESSION_EXPORT
2596
            ctx->CBGetPeer = EmbedGetPeer;
2597
            ctx->CBSetPeer = EmbedSetPeer;
2598
        #endif
2599
        #ifdef WOLFSSL_DTLS
2600
            if (method->version.major == DTLS_MAJOR) {
2601
                ctx->CBIORecv   = EmbedReceiveFrom;
2602
                ctx->CBIOSend   = EmbedSendTo;
2603
            }
2604
        #endif
2605
4.87k
    #endif /* MICRIUM */
2606
4.87k
#endif /* WOLFSSL_USER_IO */
2607
2608
#if defined(HAVE_RPK)
2609
    wolfSSL_CTX_set_client_cert_type(ctx, NULL, 0); /* set to default */
2610
    wolfSSL_CTX_set_server_cert_type(ctx, NULL, 0); /* set to default */
2611
#endif /* HAVE_RPK */
2612
2613
#ifdef HAVE_FALCON
2614
    if (method->side == WOLFSSL_CLIENT_END)
2615
        ctx->haveFalconSig = 1;        /* always on client side */
2616
                                       /* server can turn on by loading key */
2617
#endif /* HAVE_FALCON */
2618
#ifdef HAVE_DILITHIUM
2619
    if (method->side == WOLFSSL_CLIENT_END)
2620
        ctx->haveDilithiumSig = 1;     /* always on client side */
2621
                                       /* server can turn on by loading key */
2622
#endif /* HAVE_DILITHIUM */
2623
4.87k
#ifdef HAVE_ECC
2624
4.87k
    if (method->side == WOLFSSL_CLIENT_END) {
2625
0
        ctx->haveECDSAsig  = 1;        /* always on client side */
2626
0
        ctx->haveECC  = 1;             /* server turns on with ECC key cert */
2627
0
        ctx->haveStaticECC = 1;        /* server can turn on by loading key */
2628
0
    }
2629
#elif defined(HAVE_ED25519) || defined(HAVE_ED448)
2630
    if (method->side == WOLFSSL_CLIENT_END) {
2631
        ctx->haveECDSAsig  = 1;        /* always on client side */
2632
        ctx->haveECC  = 1;             /* server turns on with ECC key cert */
2633
    }
2634
#endif
2635
2636
#ifdef WOLFSSL_QNX_CAAM
2637
    /* default to try using CAAM when built */
2638
    ctx->devId = WOLFSSL_CAAM_DEVID;
2639
#elif defined(HAVE_ARIA) && defined(WOLF_CRYPTO_CB)
2640
    ctx->devId = WOLFSSL_ARIA_DEVID;
2641
#else
2642
4.87k
    ctx->devId = INVALID_DEVID;
2643
4.87k
#endif
2644
2645
#if defined(WOLFSSL_DTLS)
2646
    #ifdef WOLFSSL_SCTP
2647
        ctx->dtlsMtuSz = MAX_RECORD_SIZE;
2648
    #elif defined(WOLFSSL_DTLS_MTU)
2649
        ctx->dtlsMtuSz = MAX_MTU;
2650
    #endif
2651
#endif
2652
2653
4.87k
#ifndef NO_CERTS
2654
4.87k
    ctx->cm = wolfSSL_CertManagerNew_ex(heap);
2655
4.87k
    if (ctx->cm == NULL) {
2656
0
        WOLFSSL_MSG("Bad Cert Manager New");
2657
0
        WOLFSSL_ERROR_VERBOSE(BAD_CERT_MANAGER_ERROR);
2658
0
        return BAD_CERT_MANAGER_ERROR;
2659
0
    }
2660
    #ifdef OPENSSL_EXTRA
2661
    /* setup WOLFSSL_X509_STORE */
2662
    ctx->x509_store.cm = ctx->cm;
2663
    /* set pointer back to x509 store */
2664
    ctx->cm->x509_store_p = &ctx->x509_store;
2665
2666
    /* WOLFSSL_X509_VERIFY_PARAM */
2667
    if ((ctx->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
2668
                           sizeof(WOLFSSL_X509_VERIFY_PARAM),
2669
                           heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
2670
        WOLFSSL_MSG("ctx->param memory error");
2671
        return MEMORY_E;
2672
    }
2673
    XMEMSET(ctx->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
2674
2675
    /* WOLFSSL_X509_LOOKUP */
2676
    if ((ctx->x509_store.lookup.dirs = (WOLFSSL_BY_DIR*)XMALLOC(
2677
                           sizeof(WOLFSSL_BY_DIR),
2678
                           heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
2679
        WOLFSSL_MSG("ctx->x509_store.lookup.dirs: allocation error");
2680
        return MEMORY_E;
2681
    }
2682
    XMEMSET(ctx->x509_store.lookup.dirs, 0, sizeof(WOLFSSL_BY_DIR));
2683
2684
    /* param */
2685
    if ((ctx->x509_store.param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
2686
                           sizeof(WOLFSSL_X509_VERIFY_PARAM),
2687
                           heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
2688
        WOLFSSL_MSG("ctx->x509_store.param: allocation error");
2689
        return MEMORY_E;
2690
    }
2691
    XMEMSET(ctx->x509_store.param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
2692
2693
    if (wc_InitMutex(&ctx->x509_store.lookup.dirs->lock) != 0) {
2694
        WOLFSSL_MSG("Bad mutex init");
2695
        WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
2696
        return BAD_MUTEX_E;
2697
    }
2698
    #endif
2699
4.87k
#endif
2700
2701
4.87k
#if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
2702
4.87k
    if (method->side == WOLFSSL_CLIENT_END) {
2703
0
        if ((method->version.major == SSLv3_MAJOR) &&
2704
0
             (method->version.minor >= TLSv1_MINOR)) {
2705
2706
0
            ctx->haveEMS = 1;
2707
0
        }
2708
#ifdef WOLFSSL_DTLS
2709
        if (method->version.major == DTLS_MAJOR)
2710
            ctx->haveEMS = 1;
2711
#endif /* WOLFSSL_DTLS */
2712
0
    }
2713
4.87k
#endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
2714
2715
#if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
2716
#if !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && !defined(NO_TLS)
2717
    ret = TicketEncCbCtx_Init(ctx, &ctx->ticketKeyCtx);
2718
    if (ret != 0) return ret;
2719
    ctx->ticketEncCb = DefTicketEncCb;
2720
    ctx->ticketEncCtx = (void*)&ctx->ticketKeyCtx;
2721
#endif
2722
    ctx->ticketHint = SESSION_TICKET_HINT_DEFAULT;
2723
#if defined(WOLFSSL_TLS13)
2724
    ctx->maxTicketTls13 = 1; /* default to sending a session ticket if compiled
2725
                                in */
2726
#endif
2727
#endif
2728
2729
#ifdef WOLFSSL_EARLY_DATA
2730
    ctx->maxEarlyDataSz = MAX_EARLY_DATA_SZ;
2731
#endif
2732
2733
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
2734
#if defined(WOLFSSL_TLS13) && !defined(HAVE_SUPPORTED_CURVES)
2735
    ctx->noPskDheKe = 1;
2736
#endif
2737
#endif
2738
2739
#if defined(WOLFSSL_QT) && !defined(NO_PSK)
2740
    /* Qt retrieves supported cipher list at initialization
2741
     * from get_cipher_compat().
2742
     * Qt doesn't allow to use a cipher if it is not in the supported list.
2743
     * Therefore, we need to enable PSK cipher at the beginning.
2744
     */
2745
    ctx->havePSK = 1;
2746
#endif
2747
4.87k
    ctx->heap = heap; /* wolfSSL_CTX_load_static_memory sets */
2748
2749
#ifdef HAVE_WOLF_EVENT
2750
    ret = wolfEventQueue_Init(&ctx->event_queue);
2751
#endif /* HAVE_WOLF_EVENT */
2752
2753
#ifdef WOLFSSL_MAXQ10XX_TLS
2754
    /* Let maxq10xx know what TLS version we are using. */
2755
    ctx->devId = MAXQ_DEVICE_ID;
2756
    maxq10xx_SetupPkCallbacks(ctx, &method->version);
2757
#endif /* WOLFSSL_MAXQ10XX_TLS */
2758
2759
#if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS)
2760
    /* Should only be set when wolfSSL_CTX_load_system_CA_certs() is called */
2761
    ctx->doAppleNativeCertValidationFlag = 0;
2762
#endif /* defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) */
2763
2764
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
2765
    ret = wolfSSL_crypto_policy_init_ctx(ctx, method);
2766
    if (ret != 0) {
2767
        WOLFSSL_MSG_EX("crypto_policy_init_ctx returned %d", ret);
2768
        return ret;
2769
    }
2770
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
2771
2772
4.87k
    return ret;
2773
4.87k
}
2774
2775
2776
#ifdef HAVE_EX_DATA_CLEANUP_HOOKS
2777
void wolfSSL_CRYPTO_cleanup_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data)
2778
{
2779
    int n_ex_data = (int)(sizeof ex_data->ex_data / sizeof ex_data->ex_data[0]);
2780
    for (--n_ex_data; n_ex_data >= 0; --n_ex_data) {
2781
        if (ex_data->ex_data[n_ex_data] != NULL)
2782
            (void)wolfSSL_CRYPTO_set_ex_data_with_cleanup(ex_data, n_ex_data,
2783
                                                          NULL, NULL);
2784
    }
2785
}
2786
#endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
2787
2788
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2789
/* free all ech configs in the list */
2790
void FreeEchConfigs(WOLFSSL_EchConfig* configs, void* heap)
2791
{
2792
    WOLFSSL_EchConfig* working_config = configs;
2793
    WOLFSSL_EchConfig* next_config;
2794
2795
    while (working_config != NULL) {
2796
        next_config = working_config->next;
2797
2798
        XFREE(working_config->cipherSuites, heap, DYNAMIC_TYPE_TMP_BUFFER);
2799
        XFREE(working_config->publicName, heap, DYNAMIC_TYPE_TMP_BUFFER);
2800
2801
        XFREE(working_config->raw, heap, DYNAMIC_TYPE_TMP_BUFFER);
2802
2803
        if (working_config->receiverPrivkey != NULL) {
2804
            wc_HpkeFreeKey(NULL, working_config->kemId,
2805
                working_config->receiverPrivkey, heap);
2806
        }
2807
2808
        XFREE(working_config, heap, DYNAMIC_TYPE_TMP_BUFFER);
2809
2810
        working_config = next_config;
2811
    }
2812
2813
    (void)heap;
2814
}
2815
#endif /* WOLFSSL_TLS13 && HAVE_ECH */
2816
2817
/* In case contexts are held in array and don't want to free actual ctx. */
2818
2819
/* The allocations done in InitSSL_Ctx must be free'd with ctx->onHeapHint
2820
 * logic. A WOLFSSL_CTX can be assigned a static memory heap hint using
2821
 * wolfSSL_CTX_load_static_memory after CTX creation, which means variables
2822
 * allocated in InitSSL_Ctx were allocated from heap and should be free'd with
2823
 * a NULL heap hint. */
2824
void SSL_CtxResourceFree(WOLFSSL_CTX* ctx)
2825
4.87k
{
2826
#if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && \
2827
                     defined(HAVE_TLS_EXTENSIONS) && !defined(NO_WOLFSSL_SERVER)
2828
    int i;
2829
#endif
2830
4.87k
    void* heapAtCTXInit = ctx->heap;
2831
#ifdef WOLFSSL_STATIC_MEMORY
2832
    if (ctx->onHeapHint == 0) {
2833
        heapAtCTXInit = NULL;
2834
    }
2835
#endif
2836
2837
#ifdef HAVE_EX_DATA_CLEANUP_HOOKS
2838
    wolfSSL_CRYPTO_cleanup_ex_data(&ctx->ex_data);
2839
#endif
2840
2841
#ifdef HAVE_WOLF_EVENT
2842
    wolfEventQueue_Free(&ctx->event_queue);
2843
#endif /* HAVE_WOLF_EVENT */
2844
2845
4.87k
#ifndef NO_TLS /* its a static global see ssl.c "gNoTlsMethod" */
2846
4.87k
    XFREE(ctx->method, heapAtCTXInit, DYNAMIC_TYPE_METHOD);
2847
4.87k
#endif
2848
4.87k
    ctx->method = NULL;
2849
2850
4.87k
    XFREE(ctx->suites, ctx->heap, DYNAMIC_TYPE_SUITES);
2851
4.87k
    ctx->suites = NULL;
2852
2853
4.87k
#ifndef NO_DH
2854
4.87k
    XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
2855
4.87k
    ctx->serverDH_G.buffer = NULL;
2856
4.87k
    XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
2857
4.87k
    ctx->serverDH_P.buffer = NULL;
2858
4.87k
#endif /* !NO_DH */
2859
2860
#ifdef SINGLE_THREADED
2861
    if (ctx->rng) {
2862
        wc_FreeRng(ctx->rng);
2863
        XFREE(ctx->rng, ctx->heap, DYNAMIC_TYPE_RNG);
2864
        ctx->rng = NULL;
2865
    }
2866
#endif /* SINGLE_THREADED */
2867
2868
4.87k
#ifndef NO_CERTS
2869
4.87k
    if (ctx->privateKey != NULL && ctx->privateKey->buffer != NULL) {
2870
0
        ForceZero(ctx->privateKey->buffer, ctx->privateKey->length);
2871
0
    }
2872
4.87k
    FreeDer(&ctx->privateKey);
2873
#ifdef WOLFSSL_BLIND_PRIVATE_KEY
2874
    FreeDer(&ctx->privateKeyMask);
2875
#endif
2876
#ifdef WOLFSSL_DUAL_ALG_CERTS
2877
    if (ctx->altPrivateKey != NULL && ctx->altPrivateKey->buffer != NULL) {
2878
        ForceZero(ctx->altPrivateKey->buffer, ctx->altPrivateKey->length);
2879
    }
2880
    FreeDer(&ctx->altPrivateKey);
2881
#ifdef WOLFSSL_BLIND_PRIVATE_KEY
2882
    FreeDer(&ctx->altPrivateKeyMask);
2883
#endif
2884
#endif /* WOLFSSL_DUAL_ALG_CERTS */
2885
#ifdef OPENSSL_ALL
2886
    wolfSSL_EVP_PKEY_free(ctx->privateKeyPKey);
2887
#endif
2888
4.87k
    FreeDer(&ctx->certificate);
2889
    #ifdef KEEP_OUR_CERT
2890
        if (ctx->ourCert && ctx->ownOurCert) {
2891
            wolfSSL_X509_free(ctx->ourCert);
2892
            ctx->ourCert = NULL;
2893
        }
2894
    #endif /* KEEP_OUR_CERT */
2895
4.87k
    FreeDer(&ctx->certChain);
2896
4.87k
    wolfSSL_CertManagerFree(ctx->cm);
2897
4.87k
    ctx->cm = NULL;
2898
    #ifdef OPENSSL_ALL
2899
        if (ctx->x509_store.objs != NULL) {
2900
            wolfSSL_sk_X509_OBJECT_pop_free(ctx->x509_store.objs, NULL);
2901
            ctx->x509_store.objs = NULL;
2902
        }
2903
    #endif
2904
    #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
2905
        defined(WOLFSSL_WPAS_SMALL)
2906
        wolfSSL_X509_STORE_free(ctx->x509_store_pt);
2907
    #endif
2908
    #ifndef WOLFSSL_NO_CA_NAMES
2909
        wolfSSL_sk_X509_NAME_pop_free(ctx->client_ca_names, NULL);
2910
        ctx->client_ca_names = NULL;
2911
    #endif
2912
    #ifdef OPENSSL_EXTRA
2913
        if (ctx->x509Chain) {
2914
            wolfSSL_sk_X509_pop_free(ctx->x509Chain, NULL);
2915
            ctx->x509Chain = NULL;
2916
        }
2917
    #endif
2918
    #ifdef WOLFSSL_TEST_APPLE_NATIVE_CERT_VALIDATION
2919
        if (ctx->testTrustedCAs != NULL) {
2920
            CFRelease(ctx->testTrustedCAs);
2921
            ctx->testTrustedCAs = NULL;
2922
        }
2923
    #endif /* WOLFSSL_TEST_APPLE_NATIVE_CERT_VALIDATION */
2924
4.87k
#endif /* !NO_CERTS */
2925
2926
4.87k
#ifdef HAVE_TLS_EXTENSIONS
2927
4.87k
#if !defined(NO_TLS)
2928
4.87k
    TLSX_FreeAll(ctx->extensions, ctx->heap);
2929
4.87k
#endif /* !NO_TLS */
2930
4.87k
#ifndef NO_WOLFSSL_SERVER
2931
#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
2932
 || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
2933
    if (ctx->certOcspRequest) {
2934
        FreeOcspRequest(ctx->certOcspRequest);
2935
        XFREE(ctx->certOcspRequest, ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
2936
    }
2937
#endif
2938
2939
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
2940
    for (i = 0; i < MAX_CHAIN_DEPTH; i++) {
2941
        if (ctx->chainOcspRequest[i]) {
2942
            FreeOcspRequest(ctx->chainOcspRequest[i]);
2943
            XFREE(ctx->chainOcspRequest[i], ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
2944
            ctx->chainOcspRequest[i] = NULL;
2945
        }
2946
    }
2947
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
2948
4.87k
#endif /* !NO_WOLFSSL_SERVER */
2949
2950
4.87k
#endif /* HAVE_TLS_EXTENSIONS */
2951
#ifdef OPENSSL_EXTRA
2952
    if (ctx->alpn_cli_protos) {
2953
        XFREE((void*)ctx->alpn_cli_protos, ctx->heap, DYNAMIC_TYPE_OPENSSL);
2954
        ctx->alpn_cli_protos = NULL;
2955
    }
2956
    XFREE(ctx->param, heapAtCTXInit, DYNAMIC_TYPE_OPENSSL);
2957
    ctx->param = NULL;
2958
2959
    if (ctx->x509_store.param) {
2960
        XFREE(ctx->x509_store.param, heapAtCTXInit, DYNAMIC_TYPE_OPENSSL);
2961
        ctx->x509_store.param = NULL;
2962
    }
2963
2964
    if (ctx->x509_store.lookup.dirs) {
2965
#if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
2966
        if (ctx->x509_store.lookup.dirs->dir_entry) {
2967
            wolfSSL_sk_BY_DIR_entry_free(ctx->x509_store.lookup.dirs->dir_entry);
2968
        }
2969
2970
#endif
2971
        wc_FreeMutex(&ctx->x509_store.lookup.dirs->lock);
2972
        XFREE(ctx->x509_store.lookup.dirs, heapAtCTXInit, DYNAMIC_TYPE_OPENSSL);
2973
    }
2974
#endif
2975
#ifdef WOLFSSL_STATIC_EPHEMERAL
2976
    #ifndef NO_DH
2977
    FreeDer(&ctx->staticKE.dhKey);
2978
    #endif
2979
    #ifdef HAVE_ECC
2980
    FreeDer(&ctx->staticKE.ecKey);
2981
    #endif
2982
    #ifdef HAVE_CURVE25519
2983
    FreeDer(&ctx->staticKE.x25519Key);
2984
    #endif
2985
    #ifdef HAVE_CURVE448
2986
    FreeDer(&ctx->staticKE.x448Key);
2987
    #endif
2988
    #ifndef SINGLE_THREADED
2989
    if (ctx->staticKELockInit) {
2990
        wc_FreeMutex(&ctx->staticKELock);
2991
        ctx->staticKELockInit = 0;
2992
    }
2993
    #endif
2994
#endif
2995
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2996
    FreeEchConfigs(ctx->echConfigs, ctx->heap);
2997
    ctx->echConfigs = NULL;
2998
#endif
2999
4.87k
    (void)heapAtCTXInit;
3000
4.87k
}
3001
3002
3003
void FreeSSL_Ctx(WOLFSSL_CTX* ctx)
3004
4.87k
{
3005
4.87k
    int isZero;
3006
4.87k
    int ret;
3007
4.87k
    void* heap = ctx->heap;
3008
#ifdef WOLFSSL_STATIC_MEMORY
3009
    if (ctx->onHeapHint == 0) {
3010
        heap = NULL;
3011
    }
3012
#endif
3013
3014
    /* decrement CTX reference count */
3015
4.87k
    wolfSSL_RefWithMutexDec(&ctx->ref, &isZero, &ret);
3016
#ifdef WOLFSSL_REFCNT_ERROR_RETURN
3017
    if (ret < 0) {
3018
        /* check error state, if mutex error code then mutex init failed but
3019
         * CTX was still malloc'd */
3020
        if (ctx->err == WC_NO_ERR_TRACE(CTX_INIT_MUTEX_E)) {
3021
            SSL_CtxResourceFree(ctx);
3022
            XFREE(ctx, heap, DYNAMIC_TYPE_CTX);
3023
        }
3024
        return;
3025
    }
3026
#else
3027
4.87k
    (void)ret;
3028
4.87k
#endif
3029
3030
4.87k
    if (isZero) {
3031
4.87k
        WOLFSSL_MSG("CTX ref count down to 0, doing full free");
3032
#if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) && \
3033
    !defined(NO_SHA256) && !defined(WC_NO_RNG)
3034
        if (ctx->srp != NULL) {
3035
            XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
3036
            ctx->srp_password = NULL;
3037
            wc_SrpTerm(ctx->srp);
3038
            XFREE(ctx->srp, ctx->heap, DYNAMIC_TYPE_SRP);
3039
            ctx->srp = NULL;
3040
        }
3041
#endif
3042
4.87k
        SSL_CtxResourceFree(ctx);
3043
#if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \
3044
    !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && !defined(NO_TLS)
3045
        TicketEncCbCtx_Free(&ctx->ticketKeyCtx);
3046
#endif
3047
4.87k
        wolfSSL_RefFree(&ctx->ref);
3048
4.87k
        XFREE(ctx, heap, DYNAMIC_TYPE_CTX);
3049
4.87k
    }
3050
0
    else {
3051
0
        WOLFSSL_MSG("CTX ref count not 0 yet, no free");
3052
0
    }
3053
4.87k
    (void)heap; /* not used in some builds */
3054
4.87k
}
3055
3056
3057
/* Set cipher pointers to null */
3058
void InitCiphers(WOLFSSL* ssl)
3059
86.5k
{
3060
86.5k
#ifdef BUILD_ARC4
3061
86.5k
    ssl->encrypt.arc4 = NULL;
3062
86.5k
    ssl->decrypt.arc4 = NULL;
3063
86.5k
#endif
3064
86.5k
#ifdef BUILD_DES3
3065
86.5k
    ssl->encrypt.des3 = NULL;
3066
86.5k
    ssl->decrypt.des3 = NULL;
3067
86.5k
#endif
3068
86.5k
#ifdef BUILD_AES
3069
86.5k
    ssl->encrypt.aes = NULL;
3070
86.5k
    ssl->decrypt.aes = NULL;
3071
86.5k
#endif
3072
#ifdef HAVE_ARIA
3073
    ssl->encrypt.aria = NULL;
3074
    ssl->decrypt.aria = NULL;
3075
#endif
3076
86.5k
#ifdef HAVE_CAMELLIA
3077
86.5k
    ssl->encrypt.cam = NULL;
3078
86.5k
    ssl->decrypt.cam = NULL;
3079
86.5k
#endif
3080
86.5k
#ifdef HAVE_CHACHA
3081
86.5k
    ssl->encrypt.chacha = NULL;
3082
86.5k
    ssl->decrypt.chacha = NULL;
3083
86.5k
#endif
3084
86.5k
#if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
3085
86.5k
    ssl->auth.poly1305 = NULL;
3086
86.5k
#endif
3087
86.5k
    ssl->encrypt.setup = 0;
3088
86.5k
    ssl->decrypt.setup = 0;
3089
86.5k
#ifdef HAVE_ONE_TIME_AUTH
3090
86.5k
    ssl->auth.setup    = 0;
3091
86.5k
#endif
3092
3093
#ifdef WOLFSSL_DTLS13
3094
    XMEMSET(&ssl->dtlsRecordNumberEncrypt, 0,
3095
        sizeof(ssl->dtlsRecordNumberEncrypt));
3096
    XMEMSET(&ssl->dtlsRecordNumberDecrypt, 0,
3097
         sizeof(ssl->dtlsRecordNumberEncrypt));
3098
#endif /* WOLFSSL_DTLS13 */
3099
3100
86.5k
}
3101
3102
static void FreeCiphersSide(Ciphers *cipher, void* heap)
3103
0
{
3104
0
#ifdef BUILD_ARC4
3105
0
    wc_Arc4Free(cipher->arc4);
3106
0
    XFREE(cipher->arc4, heap, DYNAMIC_TYPE_CIPHER);
3107
0
    cipher->arc4 = NULL;
3108
0
#endif
3109
0
#ifdef BUILD_DES3
3110
0
    wc_Des3Free(cipher->des3);
3111
0
    XFREE(cipher->des3, heap, DYNAMIC_TYPE_CIPHER);
3112
0
    cipher->des3 = NULL;
3113
0
#endif
3114
0
#if defined(BUILD_AES) || defined(BUILD_AESGCM) || defined(HAVE_ARIA)
3115
    /* See: InitKeys() in keys.c on addition of BUILD_AESGCM check (enc->aes,
3116
     * dec->aes) */
3117
0
    wc_AesFree(cipher->aes);
3118
0
    XFREE(cipher->aes, heap, DYNAMIC_TYPE_CIPHER);
3119
0
    cipher->aes = NULL;
3120
0
#endif
3121
0
#if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
3122
0
    wc_Sm4Free(cipher->sm4);
3123
0
    XFREE(cipher->sm4, heap, DYNAMIC_TYPE_CIPHER);
3124
0
    cipher->sm4 = NULL;
3125
0
#endif
3126
0
#if (defined(BUILD_AESGCM) || defined(BUILD_AESCCM) || defined(HAVE_ARIA)) && \
3127
0
    !defined(WOLFSSL_NO_TLS12)
3128
0
    XFREE(cipher->additional, heap, DYNAMIC_TYPE_CIPHER);
3129
0
    cipher->additional = NULL;
3130
0
#endif
3131
0
#ifdef CIPHER_NONCE
3132
0
    XFREE(cipher->nonce, heap, DYNAMIC_TYPE_CIPHER);
3133
0
    cipher->nonce = NULL;
3134
0
#endif
3135
#ifdef HAVE_ARIA
3136
    wc_AriaFreeCrypt(cipher->aria);
3137
    XFREE(cipher->aria, heap, DYNAMIC_TYPE_CIPHER);
3138
    cipher->aria = NULL;
3139
#endif
3140
0
#ifdef HAVE_CAMELLIA
3141
0
    XFREE(cipher->cam, heap, DYNAMIC_TYPE_CIPHER);
3142
0
    cipher->cam = NULL;
3143
0
#endif
3144
0
#ifdef HAVE_CHACHA
3145
0
    if (cipher->chacha)
3146
0
        ForceZero(cipher->chacha, sizeof(ChaCha));
3147
0
    XFREE(cipher->chacha, heap, DYNAMIC_TYPE_CIPHER);
3148
0
    cipher->chacha = NULL;
3149
0
#endif
3150
#if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
3151
    wc_HmacFree(cipher->hmac);
3152
    XFREE(cipher->hmac, heap, DYNAMIC_TYPE_CIPHER);
3153
    cipher->hmac = NULL;
3154
#endif
3155
0
}
3156
3157
/* Free ciphers */
3158
void FreeCiphers(WOLFSSL* ssl)
3159
{
3160
    FreeCiphersSide(&ssl->encrypt, ssl->heap);
3161
    FreeCiphersSide(&ssl->decrypt, ssl->heap);
3162
3163
#if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
3164
    if (ssl->auth.poly1305)
3165
        ForceZero(ssl->auth.poly1305, sizeof(Poly1305));
3166
    XFREE(ssl->auth.poly1305, ssl->heap, DYNAMIC_TYPE_CIPHER);
3167
    ssl->auth.poly1305 = NULL;
3168
#endif
3169
3170
#ifdef WOLFSSL_DTLS13
3171
#ifdef BUILD_AES
3172
    wc_AesFree(ssl->dtlsRecordNumberEncrypt.aes);
3173
    wc_AesFree(ssl->dtlsRecordNumberDecrypt.aes);
3174
    XFREE(ssl->dtlsRecordNumberEncrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
3175
    XFREE(ssl->dtlsRecordNumberDecrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
3176
    ssl->dtlsRecordNumberEncrypt.aes = NULL;
3177
    ssl->dtlsRecordNumberDecrypt.aes = NULL;
3178
#endif /* BUILD_AES */
3179
#ifdef HAVE_CHACHA
3180
    XFREE(ssl->dtlsRecordNumberEncrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
3181
    XFREE(ssl->dtlsRecordNumberDecrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
3182
    ssl->dtlsRecordNumberEncrypt.chacha = NULL;
3183
    ssl->dtlsRecordNumberDecrypt.chacha = NULL;
3184
#endif /* HAVE_CHACHA */
3185
#endif /* WOLFSSL_DTLS13 */
3186
}
3187
3188
void InitCipherSpecs(CipherSpecs* cs)
3189
86.5k
{
3190
86.5k
    XMEMSET(cs, 0, sizeof(CipherSpecs));
3191
3192
86.5k
    cs->bulk_cipher_algorithm = INVALID_BYTE;
3193
86.5k
    cs->cipher_type           = INVALID_BYTE;
3194
86.5k
    cs->mac_algorithm         = INVALID_BYTE;
3195
86.5k
    cs->kea                   = INVALID_BYTE;
3196
86.5k
    cs->sig_algo              = INVALID_BYTE;
3197
86.5k
}
3198
3199
#if defined(USE_ECDSA_KEYSZ_HASH_ALGO) || (defined(WOLFSSL_TLS13) && \
3200
                                                              defined(HAVE_ECC))
3201
static int GetMacDigestSize(byte macAlgo)
3202
0
{
3203
0
    switch (macAlgo) {
3204
0
    #ifndef NO_SHA
3205
0
        case sha_mac:
3206
0
            return WC_SHA_DIGEST_SIZE;
3207
0
    #endif
3208
0
    #ifndef NO_SHA256
3209
0
        case sha256_mac:
3210
0
            return WC_SHA256_DIGEST_SIZE;
3211
0
    #endif
3212
0
    #ifdef WOLFSSL_SHA384
3213
0
        case sha384_mac:
3214
0
            return WC_SHA384_DIGEST_SIZE;
3215
0
    #endif
3216
0
    #ifdef WOLFSSL_SHA512
3217
0
        case sha512_mac:
3218
0
            return WC_SHA512_DIGEST_SIZE;
3219
0
    #endif
3220
0
    #ifdef WOLFSSL_SM3
3221
0
        case sm3_mac:
3222
0
            return WC_SM3_DIGEST_SIZE;
3223
0
    #endif
3224
0
        default:
3225
0
            break;
3226
0
    }
3227
0
    return NOT_COMPILED_IN;
3228
0
}
3229
#endif /* USE_ECDSA_KEYSZ_HASH_ALGO || (WOLFSSL_TLS13 && HAVE_ECC) */
3230
3231
#define ADD_HASH_SIG_ALGO(out, inOutIdx, major, minor)  \
3232
0
    do {                                                \
3233
0
        if ((out) != NULL) {                            \
3234
0
            (out)[*(inOutIdx)    ] = (major);           \
3235
0
            (out)[*(inOutIdx) + 1] = (minor);           \
3236
0
        }                                               \
3237
0
        *(inOutIdx) += 2;                               \
3238
0
    } while (0)
3239
3240
static WC_INLINE void AddSuiteHashSigAlgo(byte* hashSigAlgo, byte macAlgo,
3241
    byte sigAlgo, int keySz, word16* inOutIdx)
3242
0
{
3243
0
    int addSigAlgo = 1;
3244
3245
#ifdef USE_ECDSA_KEYSZ_HASH_ALGO
3246
    if (sigAlgo == ecc_dsa_sa_algo) {
3247
        int digestSz = GetMacDigestSize(macAlgo);
3248
        /* do not add sig/algos with digest size larger than key size */
3249
        if (digestSz <= 0 || (keySz > 0 && digestSz > keySz)) {
3250
            addSigAlgo = 0;
3251
        }
3252
    }
3253
#else
3254
0
    (void)keySz;
3255
0
#endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
3256
3257
0
    if (addSigAlgo) {
3258
0
    #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
3259
0
        if (sigAlgo == sm2_sa_algo) {
3260
0
            ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
3261
0
                SM2_SA_MAJOR, SM2_SA_MINOR);
3262
0
        }
3263
0
        else
3264
0
    #endif
3265
0
    #ifdef HAVE_ED25519
3266
0
        if (sigAlgo == ed25519_sa_algo) {
3267
0
            ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
3268
0
                ED25519_SA_MAJOR, ED25519_SA_MINOR);
3269
0
        }
3270
0
        else
3271
0
    #endif
3272
0
    #ifdef HAVE_ED448
3273
0
        if (sigAlgo == ed448_sa_algo) {
3274
0
            ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
3275
0
                ED448_SA_MAJOR, ED448_SA_MINOR);
3276
0
        }
3277
0
        else
3278
0
    #endif
3279
    #ifdef HAVE_FALCON
3280
        if (sigAlgo == falcon_level1_sa_algo) {
3281
            ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
3282
                FALCON_LEVEL1_SA_MAJOR, FALCON_LEVEL1_SA_MINOR);
3283
        }
3284
        else
3285
        if (sigAlgo == falcon_level5_sa_algo) {
3286
            ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
3287
                FALCON_LEVEL5_SA_MAJOR, FALCON_LEVEL5_SA_MINOR);
3288
        }
3289
        else
3290
    #endif /* HAVE_FALCON */
3291
    #ifdef HAVE_DILITHIUM
3292
        if (sigAlgo == dilithium_level2_sa_algo) {
3293
            ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
3294
                DILITHIUM_LEVEL2_SA_MAJOR, DILITHIUM_LEVEL2_SA_MINOR);
3295
        }
3296
        else
3297
        if (sigAlgo == dilithium_level3_sa_algo) {
3298
            ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
3299
                DILITHIUM_LEVEL3_SA_MAJOR, DILITHIUM_LEVEL3_SA_MINOR);
3300
        }
3301
        else
3302
        if (sigAlgo == dilithium_level5_sa_algo) {
3303
            ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
3304
                DILITHIUM_LEVEL5_SA_MAJOR, DILITHIUM_LEVEL5_SA_MINOR);
3305
        }
3306
        else
3307
    #endif /* HAVE_DILITHIUM */
3308
0
#ifdef WC_RSA_PSS
3309
0
        if (sigAlgo == rsa_pss_sa_algo) {
3310
            /* RSA PSS is sig then mac */
3311
0
            ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx, sigAlgo, macAlgo);
3312
0
    #ifdef WOLFSSL_TLS13
3313
            /* Add the certificate algorithm as well */
3314
0
            ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx, sigAlgo,
3315
0
                PSS_RSAE_TO_PSS_PSS(macAlgo));
3316
0
    #endif
3317
0
        }
3318
0
        else
3319
0
#endif
3320
0
        {
3321
0
            ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx, macAlgo, sigAlgo);
3322
0
        }
3323
0
    }
3324
0
}
3325
3326
void InitSuitesHashSigAlgo(byte* hashSigAlgo, int haveSig, int tls1_2,
3327
    int keySz, word16* len)
3328
{
3329
    word16 idx = 0;
3330
3331
    (void)tls1_2;
3332
    (void)keySz;
3333
3334
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
3335
    if (haveSig & SIG_ECDSA) {
3336
#ifdef HAVE_ECC
3337
    #ifdef WOLFSSL_SHA512
3338
        AddSuiteHashSigAlgo(hashSigAlgo, sha512_mac, ecc_dsa_sa_algo, keySz,
3339
            &idx);
3340
    #endif
3341
    #ifdef WOLFSSL_SHA384
3342
        AddSuiteHashSigAlgo(hashSigAlgo, sha384_mac, ecc_dsa_sa_algo, keySz,
3343
            &idx);
3344
    #endif
3345
    #ifndef NO_SHA256
3346
        AddSuiteHashSigAlgo(hashSigAlgo, sha256_mac, ecc_dsa_sa_algo, keySz,
3347
            &idx);
3348
    #endif
3349
    #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
3350
                                            defined(WOLFSSL_ALLOW_TLS_SHA1))
3351
        AddSuiteHashSigAlgo(hashSigAlgo, sha_mac, ecc_dsa_sa_algo, keySz, &idx);
3352
    #endif
3353
#endif
3354
    #ifdef HAVE_ED25519
3355
        AddSuiteHashSigAlgo(hashSigAlgo, no_mac, ed25519_sa_algo, keySz, &idx);
3356
    #endif
3357
    #ifdef HAVE_ED448
3358
        AddSuiteHashSigAlgo(hashSigAlgo, no_mac, ed448_sa_algo, keySz, &idx);
3359
    #endif
3360
    }
3361
#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
3362
#if defined(HAVE_ECC) && defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
3363
    if (haveSig & SIG_SM2) {
3364
        AddSuiteHashSigAlgo(hashSigAlgo, sm3_mac, sm2_sa_algo, keySz,
3365
            &idx);
3366
    }
3367
#endif
3368
#ifdef HAVE_FALCON
3369
    if (haveSig & SIG_FALCON) {
3370
        AddSuiteHashSigAlgo(hashSigAlgo, no_mac, falcon_level1_sa_algo, keySz,
3371
            &idx);
3372
        AddSuiteHashSigAlgo(hashSigAlgo, no_mac, falcon_level5_sa_algo, keySz,
3373
            &idx);
3374
    }
3375
#endif /* HAVE_FALCON */
3376
#ifdef HAVE_DILITHIUM
3377
    if (haveSig & SIG_DILITHIUM) {
3378
        AddSuiteHashSigAlgo(hashSigAlgo, no_mac, dilithium_level2_sa_algo,
3379
            keySz, &idx);
3380
        AddSuiteHashSigAlgo(hashSigAlgo, no_mac, dilithium_level3_sa_algo,
3381
            keySz, &idx);
3382
        AddSuiteHashSigAlgo(hashSigAlgo, no_mac, dilithium_level5_sa_algo,
3383
            keySz, &idx);
3384
    }
3385
#endif /* HAVE_DILITHIUM */
3386
    if (haveSig & SIG_RSA) {
3387
    #ifdef WC_RSA_PSS
3388
        if (tls1_2) {
3389
        #ifdef WOLFSSL_SHA512
3390
            AddSuiteHashSigAlgo(hashSigAlgo, sha512_mac, rsa_pss_sa_algo, keySz,
3391
                &idx);
3392
        #endif
3393
        #ifdef WOLFSSL_SHA384
3394
            AddSuiteHashSigAlgo(hashSigAlgo, sha384_mac, rsa_pss_sa_algo, keySz,
3395
                &idx);
3396
        #endif
3397
        #ifndef NO_SHA256
3398
            AddSuiteHashSigAlgo(hashSigAlgo, sha256_mac, rsa_pss_sa_algo, keySz,
3399
                &idx);
3400
        #endif
3401
        }
3402
    #endif
3403
    #ifdef WOLFSSL_SHA512
3404
        AddSuiteHashSigAlgo(hashSigAlgo, sha512_mac, rsa_sa_algo, keySz, &idx);
3405
    #endif
3406
    #ifdef WOLFSSL_SHA384
3407
        AddSuiteHashSigAlgo(hashSigAlgo, sha384_mac, rsa_sa_algo, keySz, &idx);
3408
    #endif
3409
    #ifndef NO_SHA256
3410
        AddSuiteHashSigAlgo(hashSigAlgo, sha256_mac, rsa_sa_algo, keySz, &idx);
3411
    #endif
3412
    #ifdef WOLFSSL_SHA224
3413
        AddSuiteHashSigAlgo(hashSigAlgo, sha224_mac, rsa_sa_algo, keySz, &idx);
3414
    #endif
3415
    #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
3416
                                            defined(WOLFSSL_ALLOW_TLS_SHA1))
3417
        AddSuiteHashSigAlgo(hashSigAlgo, sha_mac, rsa_sa_algo, keySz, &idx);
3418
    #endif
3419
    }
3420
3421
#ifdef HAVE_ANON
3422
    if (haveSig & SIG_ANON) {
3423
        AddSuiteHashSigAlgo(hashSigAlgo, sha_mac, anonymous_sa_algo, keySz,
3424
            &idx);
3425
    }
3426
#endif
3427
3428
    *len = idx;
3429
}
3430
3431
int AllocateCtxSuites(WOLFSSL_CTX* ctx)
3432
68
{
3433
68
    if (ctx->suites == NULL) {
3434
48
        ctx->suites = (Suites*)XMALLOC(sizeof(Suites), ctx->heap,
3435
48
                                       DYNAMIC_TYPE_SUITES);
3436
48
        if (ctx->suites == NULL) {
3437
0
            WOLFSSL_MSG("Memory alloc for Suites failed");
3438
0
            return MEMORY_ERROR;
3439
0
        }
3440
48
        XMEMSET(ctx->suites, 0, sizeof(Suites));
3441
48
    }
3442
68
    return 0;
3443
68
}
3444
3445
/* Call this when the ssl object needs to have its own ssl->suites object */
3446
int AllocateSuites(WOLFSSL* ssl)
3447
312
{
3448
312
    if (ssl->suites == NULL) {
3449
312
        ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
3450
312
                                       DYNAMIC_TYPE_SUITES);
3451
312
        if (ssl->suites == NULL) {
3452
4
            WOLFSSL_MSG("Suites Memory error");
3453
4
            return MEMORY_ERROR;
3454
4
        }
3455
308
        if (ssl->ctx != NULL && ssl->ctx->suites != NULL)
3456
308
            XMEMCPY(ssl->suites, ssl->ctx->suites, sizeof(Suites));
3457
0
        else
3458
0
            XMEMSET(ssl->suites, 0, sizeof(Suites));
3459
308
    }
3460
308
    return 0;
3461
312
}
3462
3463
void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
3464
                word16 havePSK, word16 haveDH, word16 haveECDSAsig,
3465
                word16 haveECC, word16 haveStaticRSA, word16 haveStaticECC,
3466
                word16 haveAnon, word16 haveNull, word16 haveAES128,
3467
                word16 haveSHA1, word16 haveRC4, int side)
3468
0
{
3469
0
    word16 idx = 0;
3470
0
    int    tls    = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_MINOR;
3471
0
    int    tls1_2 = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_2_MINOR;
3472
0
#ifdef WOLFSSL_TLS13
3473
0
    int    tls1_3 = IsAtLeastTLSv1_3(pv);
3474
0
#endif
3475
0
    int    dtls   = 0;
3476
0
    int    haveRSAsig = 1;
3477
3478
#ifdef WOLFSSL_DTLS
3479
    if (pv.major == DTLS_MAJOR) {
3480
        dtls   = 1;
3481
        tls    = 1;
3482
        /* May be dead assignments dependent upon configuration */
3483
        (void) dtls;
3484
        (void) tls;
3485
        tls1_2 = pv.minor <= DTLSv1_2_MINOR;
3486
    }
3487
#endif /* WOLFSSL_DTLS */
3488
3489
0
    (void)tls;  /* shut up compiler */
3490
0
    (void)tls1_2;
3491
0
    (void)dtls;
3492
0
    (void)haveDH;
3493
0
    (void)havePSK;
3494
0
    (void)haveStaticRSA;
3495
0
    (void)haveStaticECC;
3496
0
    (void)haveECC;
3497
0
    (void)haveECDSAsig;
3498
0
    (void)side;
3499
0
    (void)haveRSA;    /* some builds won't read */
3500
0
    (void)haveRSAsig; /* non ecc builds won't read */
3501
0
    (void)haveAnon;   /* anon ciphers optional */
3502
0
    (void)haveNull;
3503
0
    (void)haveAES128;
3504
0
    (void)haveSHA1;
3505
0
    (void)haveRC4;
3506
3507
0
    if (suites == NULL) {
3508
0
        WOLFSSL_MSG("InitSuites pointer error");
3509
0
        return;
3510
0
    }
3511
3512
0
    if (suites->setSuites)
3513
0
        return;      /* trust user settings, don't override */
3514
3515
0
#ifdef WOLFSSL_TLS13
3516
0
#ifdef BUILD_TLS_AES_256_GCM_SHA384
3517
0
    if (tls1_3) {
3518
0
        suites->suites[idx++] = TLS13_BYTE;
3519
0
        suites->suites[idx++] = TLS_AES_256_GCM_SHA384;
3520
0
    }
3521
0
#endif
3522
3523
0
#ifdef BUILD_TLS_AES_128_GCM_SHA256
3524
0
    if (tls1_3 && haveAES128) {
3525
0
        suites->suites[idx++] = TLS13_BYTE;
3526
0
        suites->suites[idx++] = TLS_AES_128_GCM_SHA256;
3527
0
    }
3528
0
#endif
3529
3530
0
#ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
3531
0
    if (tls1_3) {
3532
0
        suites->suites[idx++] = TLS13_BYTE;
3533
0
        suites->suites[idx++] = TLS_CHACHA20_POLY1305_SHA256;
3534
0
    }
3535
0
#endif
3536
3537
0
#ifdef BUILD_TLS_AES_128_CCM_SHA256
3538
0
    if (tls1_3 && haveAES128) {
3539
0
        suites->suites[idx++] = TLS13_BYTE;
3540
0
        suites->suites[idx++] = TLS_AES_128_CCM_SHA256;
3541
0
    }
3542
0
#endif
3543
3544
0
#ifdef BUILD_TLS_AES_128_CCM_8_SHA256
3545
0
    if (tls1_3 && haveAES128) {
3546
0
        suites->suites[idx++] = TLS13_BYTE;
3547
0
        suites->suites[idx++] = TLS_AES_128_CCM_8_SHA256;
3548
0
    }
3549
0
#endif
3550
3551
0
#ifdef BUILD_TLS_SM4_GCM_SM3
3552
0
    if (tls1_3) {
3553
0
        suites->suites[idx++] = CIPHER_BYTE;
3554
0
        suites->suites[idx++] = TLS_SM4_GCM_SM3;
3555
0
    }
3556
0
#endif
3557
3558
0
#ifdef BUILD_TLS_SM4_CCM_SM3
3559
0
    if (tls1_3) {
3560
0
        suites->suites[idx++] = CIPHER_BYTE;
3561
0
        suites->suites[idx++] = TLS_SM4_CCM_SM3;
3562
0
    }
3563
0
#endif
3564
3565
#ifdef HAVE_NULL_CIPHER
3566
    #ifdef BUILD_TLS_SHA256_SHA256
3567
        if (tls1_3 && haveNull) {
3568
            suites->suites[idx++] = ECC_BYTE;
3569
            suites->suites[idx++] = TLS_SHA256_SHA256;
3570
        }
3571
    #endif
3572
3573
    #ifdef BUILD_TLS_SHA384_SHA384
3574
        if (tls1_3 && haveNull) {
3575
            suites->suites[idx++] = ECC_BYTE;
3576
            suites->suites[idx++] = TLS_SHA384_SHA384;
3577
        }
3578
    #endif
3579
#endif
3580
0
#endif /* WOLFSSL_TLS13 */
3581
3582
0
#ifndef WOLFSSL_NO_TLS12
3583
3584
0
#if !defined(NO_WOLFSSL_SERVER) && !defined(NO_RSA)
3585
0
    if (side == WOLFSSL_SERVER_END && haveStaticECC) {
3586
0
        haveRSA = 0;   /* can't do RSA with ECDSA key */
3587
0
    }
3588
3589
0
    if (side == WOLFSSL_SERVER_END && haveECDSAsig) {
3590
0
        haveRSAsig = 0;     /* can't have RSA sig if signed by ECDSA */
3591
0
    }
3592
0
#endif /* !NO_WOLFSSL_SERVER */
3593
3594
#ifdef NO_RSA
3595
    haveRSAsig = 0;    /* can't have RSA sig if don't have RSA */
3596
#endif
3597
3598
#ifdef HAVE_RENEGOTIATION_INDICATION
3599
    if (side == WOLFSSL_CLIENT_END) {
3600
        suites->suites[idx++] = CIPHER_BYTE;
3601
        suites->suites[idx++] = TLS_EMPTY_RENEGOTIATION_INFO_SCSV;
3602
    }
3603
#endif
3604
3605
0
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
3606
0
    if (tls1_2 && haveECC) {
3607
0
        suites->suites[idx++] = ECC_BYTE;
3608
0
        suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384;
3609
0
    }
3610
0
#endif
3611
3612
0
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
3613
0
    if (tls1_2 && haveECC && haveAES128) {
3614
0
        suites->suites[idx++] = ECC_BYTE;
3615
0
        suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256;
3616
0
    }
3617
0
#endif
3618
3619
0
#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
3620
    /* OpenSSL enables ECDHE when using ECDHE aliases without RSA */
3621
    #ifdef OPENSSL_EXTRA
3622
    if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
3623
    #else
3624
0
    if (tls1_2 && haveRSA) {
3625
0
    #endif
3626
0
        suites->suites[idx++] = ECC_BYTE;
3627
0
        suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384;
3628
0
    }
3629
0
#endif
3630
3631
0
#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
3632
    #ifdef OPENSSL_EXTRA
3633
    if ((tls1_2 && haveRSA && haveAES128) ||
3634
        (tls1_2 && haveECDSAsig && haveAES128)) {
3635
    #else
3636
0
    if (tls1_2 && haveRSA && haveAES128) {
3637
0
    #endif
3638
0
        suites->suites[idx++] = ECC_BYTE;
3639
0
        suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256;
3640
0
    }
3641
0
#endif
3642
3643
0
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
3644
0
    if (tls1_2 && haveDH && haveRSA) {
3645
0
        suites->suites[idx++] = CIPHER_BYTE;
3646
0
        suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_GCM_SHA384;
3647
0
    }
3648
0
#endif
3649
3650
0
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
3651
0
    if (tls1_2 && haveDH && haveRSA && haveAES128) {
3652
0
        suites->suites[idx++] = CIPHER_BYTE;
3653
0
        suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_GCM_SHA256;
3654
0
    }
3655
0
#endif
3656
3657
#ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
3658
    if (tls1_2 && haveRSA && haveStaticRSA) {
3659
        suites->suites[idx++] = CIPHER_BYTE;
3660
        suites->suites[idx++] = TLS_RSA_WITH_AES_256_GCM_SHA384;
3661
    }
3662
#endif
3663
3664
#ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
3665
    if (tls1_2 && haveRSA && haveStaticRSA && haveAES128) {
3666
        suites->suites[idx++] = CIPHER_BYTE;
3667
        suites->suites[idx++] = TLS_RSA_WITH_AES_128_GCM_SHA256;
3668
    }
3669
#endif
3670
3671
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
3672
    if (tls1_2 && haveECC && haveStaticECC) {
3673
        suites->suites[idx++] = ECC_BYTE;
3674
        suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384;
3675
    }
3676
#endif
3677
3678
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
3679
    if (tls1_2 && haveECC && haveStaticECC && haveAES128) {
3680
        suites->suites[idx++] = ECC_BYTE;
3681
        suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256;
3682
    }
3683
#endif
3684
3685
#ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
3686
    if (tls1_2 && haveRSAsig && haveStaticECC) {
3687
        suites->suites[idx++] = ECC_BYTE;
3688
        suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384;
3689
    }
3690
#endif
3691
3692
#ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
3693
    if (tls1_2 && haveRSAsig && haveStaticECC && haveAES128) {
3694
        suites->suites[idx++] = ECC_BYTE;
3695
        suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256;
3696
    }
3697
#endif
3698
3699
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384
3700
    if (tls1_2 && haveECC) {
3701
        suites->suites[idx++] = ECC_BYTE;
3702
        suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384;
3703
    }
3704
#endif
3705
3706
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256
3707
    if (tls1_2 && haveECC && haveAES128) {
3708
        suites->suites[idx++] = ECC_BYTE;
3709
        suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256;
3710
    }
3711
#endif
3712
3713
#ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
3714
    if (tls1_2 && haveDH && havePSK) {
3715
        suites->suites[idx++] = CIPHER_BYTE;
3716
        suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_GCM_SHA384;
3717
    }
3718
#endif
3719
3720
#ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
3721
    if (tls1_2 && haveDH && haveAnon && haveAES128 && haveSHA1) {
3722
      suites->suites[idx++] = CIPHER_BYTE;
3723
      suites->suites[idx++] = TLS_DH_anon_WITH_AES_128_CBC_SHA;
3724
    }
3725
#endif
3726
3727
#ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
3728
    if (tls1_2 && haveDH && haveAnon) {
3729
      suites->suites[idx++] = CIPHER_BYTE;
3730
      suites->suites[idx++] = TLS_DH_anon_WITH_AES_256_GCM_SHA384;
3731
    }
3732
#endif
3733
3734
#ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
3735
    if (tls1_2 && haveDH && havePSK && haveAES128) {
3736
        suites->suites[idx++] = CIPHER_BYTE;
3737
        suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_GCM_SHA256;
3738
    }
3739
#endif
3740
3741
#ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
3742
    if (tls1_2 && havePSK) {
3743
        suites->suites[idx++] = CIPHER_BYTE;
3744
        suites->suites[idx++] = TLS_PSK_WITH_AES_256_GCM_SHA384;
3745
    }
3746
#endif
3747
3748
#ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
3749
    if (tls1_2 && havePSK && haveAES128) {
3750
        suites->suites[idx++] = CIPHER_BYTE;
3751
        suites->suites[idx++] = TLS_PSK_WITH_AES_128_GCM_SHA256;
3752
    }
3753
#endif
3754
3755
0
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
3756
0
    if (tls1_2 && haveECC) {
3757
0
        suites->suites[idx++] = CHACHA_BYTE;
3758
0
        suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256;
3759
0
    }
3760
0
#endif
3761
3762
0
#ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
3763
    #ifdef OPENSSL_EXTRA
3764
    if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
3765
    #else
3766
0
    if (tls1_2 && haveRSA) {
3767
0
    #endif
3768
0
        suites->suites[idx++] = CHACHA_BYTE;
3769
0
        suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
3770
0
    }
3771
0
#endif
3772
3773
0
#ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
3774
0
    if (tls1_2 && haveRSA) {
3775
0
        suites->suites[idx++] = CHACHA_BYTE;
3776
0
        suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
3777
0
    }
3778
0
#endif
3779
3780
/* Place as higher priority for MYSQL */
3781
#if defined(WOLFSSL_MYSQL_COMPATIBLE)
3782
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
3783
    if (tls && haveDH && haveRSA && haveSHA1) {
3784
        suites->suites[idx++] = CIPHER_BYTE;
3785
        suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
3786
    }
3787
#endif
3788
#endif /* WOLFSSL_MYSQL_COMPATIBLE */
3789
3790
0
#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
3791
    #ifdef OPENSSL_EXTRA
3792
    if ((tls1_2 && haveRSA && haveAES128) ||
3793
        (tls1_2 && haveECDSAsig && haveAES128)) {
3794
    #else
3795
0
    if (tls1_2 && haveRSA && haveAES128) {
3796
0
    #endif
3797
0
        suites->suites[idx++] = ECC_BYTE;
3798
0
        suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256;
3799
0
    }
3800
0
#endif
3801
3802
0
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
3803
0
    if (tls1_2 && haveECC && haveAES128) {
3804
0
        suites->suites[idx++] = ECC_BYTE;
3805
0
        suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256;
3806
0
    }
3807
0
#endif
3808
3809
#ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
3810
    if (tls1_2 && haveRSAsig && haveStaticECC && haveAES128) {
3811
        suites->suites[idx++] = ECC_BYTE;
3812
        suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256;
3813
    }
3814
#endif
3815
3816
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
3817
    if (tls1_2 && haveECC && haveStaticECC && haveAES128) {
3818
        suites->suites[idx++] = ECC_BYTE;
3819
        suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256;
3820
    }
3821
#endif
3822
3823
0
#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
3824
    #ifdef OPENSSL_EXTRA
3825
    if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
3826
    #else
3827
0
    if (tls1_2 && haveRSA) {
3828
0
    #endif
3829
0
        suites->suites[idx++] = ECC_BYTE;
3830
0
        suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384;
3831
0
    }
3832
0
#endif
3833
3834
0
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
3835
0
    if (tls1_2 && haveECC) {
3836
0
        suites->suites[idx++] = ECC_BYTE;
3837
0
        suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384;
3838
0
    }
3839
0
#endif
3840
3841
#ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
3842
    if (tls1_2 && haveRSAsig && haveStaticECC) {
3843
        suites->suites[idx++] = ECC_BYTE;
3844
        suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384;
3845
    }
3846
#endif
3847
3848
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
3849
    if (tls1_2 && haveECC && haveStaticECC) {
3850
        suites->suites[idx++] = ECC_BYTE;
3851
        suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384;
3852
    }
3853
#endif
3854
3855
0
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
3856
0
    if (tls && haveECC && haveSHA1) {
3857
0
        suites->suites[idx++] = ECC_BYTE;
3858
0
        suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA;
3859
0
    }
3860
0
#endif
3861
3862
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
3863
    if (tls && haveECC && haveStaticECC && haveSHA1) {
3864
        suites->suites[idx++] = ECC_BYTE;
3865
        suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA;
3866
    }
3867
#endif
3868
3869
0
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
3870
0
    if (tls && haveECC && haveAES128 && haveSHA1) {
3871
0
        suites->suites[idx++] = ECC_BYTE;
3872
0
        suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA;
3873
0
    }
3874
0
#endif
3875
3876
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
3877
    if (tls && haveECC && haveStaticECC && haveAES128 && haveSHA1) {
3878
        suites->suites[idx++] = ECC_BYTE;
3879
        suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA;
3880
    }
3881
#endif
3882
3883
0
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
3884
0
    if (!dtls && tls && haveECC && haveSHA1 && haveRC4) {
3885
0
        suites->suites[idx++] = ECC_BYTE;
3886
0
        suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_RC4_128_SHA;
3887
0
    }
3888
0
#endif
3889
3890
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
3891
    if (!dtls && tls && haveECC && haveStaticECC && haveSHA1 && haveRC4) {
3892
        suites->suites[idx++] = ECC_BYTE;
3893
        suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_RC4_128_SHA;
3894
    }
3895
#endif
3896
3897
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
3898
    if (tls && haveECC && haveSHA1) {
3899
        suites->suites[idx++] = ECC_BYTE;
3900
        suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA;
3901
    }
3902
#endif
3903
3904
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
3905
    if (tls && haveECC && haveStaticECC && haveSHA1) {
3906
        suites->suites[idx++] = ECC_BYTE;
3907
        suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA;
3908
    }
3909
#endif
3910
3911
0
#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
3912
    #ifdef OPENSSL_EXTRA
3913
    if ((tls && haveRSA && haveSHA1) || (tls && haveECDSAsig && haveSHA1)) {
3914
    #else
3915
0
    if (tls && haveRSA && haveSHA1) {
3916
0
    #endif
3917
0
        suites->suites[idx++] = ECC_BYTE;
3918
0
        suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA;
3919
0
    }
3920
0
#endif
3921
3922
#ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
3923
    if (tls && haveRSAsig && haveStaticECC && haveSHA1) {
3924
        suites->suites[idx++] = ECC_BYTE;
3925
        suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA;
3926
    }
3927
#endif
3928
3929
0
#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
3930
    #ifdef OPENSSL_EXTRA
3931
    if ((tls && haveRSA && haveAES128 && haveSHA1) ||
3932
        (tls && haveECDSAsig && haveAES128 && haveSHA1)) {
3933
    #else
3934
0
    if (tls && haveRSA && haveAES128 && haveSHA1) {
3935
0
    #endif
3936
0
        suites->suites[idx++] = ECC_BYTE;
3937
0
        suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA;
3938
0
    }
3939
0
#endif
3940
3941
#ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
3942
    if (tls && haveRSAsig && haveStaticECC && haveAES128 && haveSHA1) {
3943
        suites->suites[idx++] = ECC_BYTE;
3944
        suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA;
3945
    }
3946
#endif
3947
3948
0
#ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
3949
0
    if (!dtls && tls && haveRSA && haveSHA1 && haveRC4) {
3950
0
        suites->suites[idx++] = ECC_BYTE;
3951
0
        suites->suites[idx++] = TLS_ECDHE_RSA_WITH_RC4_128_SHA;
3952
0
    }
3953
0
#endif
3954
3955
#ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
3956
    if (!dtls && tls && haveRSAsig && haveStaticECC && haveSHA1 && haveRC4) {
3957
        suites->suites[idx++] = ECC_BYTE;
3958
        suites->suites[idx++] = TLS_ECDH_RSA_WITH_RC4_128_SHA;
3959
    }
3960
#endif
3961
3962
#ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
3963
    #ifdef OPENSSL_EXTRA
3964
    if ((tls && haveRSA && haveSHA1) || (tls && haveECDSAsig && haveSHA1)) {
3965
    #else
3966
    if (tls && haveRSA && haveSHA1) {
3967
    #endif
3968
        suites->suites[idx++] = ECC_BYTE;
3969
        suites->suites[idx++] = TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA;
3970
    }
3971
#endif
3972
3973
#ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
3974
    if (tls && haveRSAsig && haveStaticECC && haveSHA1) {
3975
        suites->suites[idx++] = ECC_BYTE;
3976
        suites->suites[idx++] = TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA;
3977
    }
3978
#endif
3979
3980
0
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
3981
0
    if (tls1_2 && haveECC && haveAES128) {
3982
0
        suites->suites[idx++] = ECC_BYTE;
3983
0
        suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM;
3984
0
    }
3985
0
#endif
3986
3987
0
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
3988
0
    if (tls1_2 && haveECC && haveAES128) {
3989
0
        suites->suites[idx++] = ECC_BYTE;
3990
0
        suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8;
3991
0
    }
3992
0
#endif
3993
3994
0
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
3995
0
    if (tls1_2 && haveECC) {
3996
0
        suites->suites[idx++] = ECC_BYTE;
3997
0
        suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8;
3998
0
    }
3999
0
#endif
4000
4001
#ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
4002
    if (tls1_2 && haveRSA && haveStaticRSA && haveAES128) {
4003
        suites->suites[idx++] = ECC_BYTE;
4004
        suites->suites[idx++] = TLS_RSA_WITH_AES_128_CCM_8;
4005
    }
4006
#endif
4007
4008
#ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
4009
    if (tls1_2 && haveRSA && haveStaticRSA) {
4010
        suites->suites[idx++] = ECC_BYTE;
4011
        suites->suites[idx++] = TLS_RSA_WITH_AES_256_CCM_8;
4012
    }
4013
#endif
4014
4015
0
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
4016
0
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4017
0
    if (tls1_2 && haveDH && haveRSA)
4018
#else
4019
    if (tls && haveDH && haveRSA)
4020
#endif
4021
0
    {
4022
0
        suites->suites[idx++] = CIPHER_BYTE;
4023
0
        suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA256;
4024
0
    }
4025
0
#endif /* BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 */
4026
4027
0
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
4028
0
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4029
0
    if (tls1_2 && haveDH && haveRSA && haveAES128)
4030
#else
4031
    if (tls && haveDH && haveRSA && haveAES128)
4032
#endif
4033
0
    {
4034
0
        suites->suites[idx++] = CIPHER_BYTE;
4035
0
        suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA256;
4036
0
    }
4037
0
#endif /* BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 */
4038
4039
/* Place as higher priority for MYSQL testing */
4040
0
#if !defined(WOLFSSL_MYSQL_COMPATIBLE)
4041
0
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
4042
0
    if (tls && haveDH && haveRSA && haveSHA1) {
4043
0
        suites->suites[idx++] = CIPHER_BYTE;
4044
0
        suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
4045
0
    }
4046
0
#endif
4047
0
#endif /* !WOLFSSL_MYSQL_COMPATIBLE */
4048
4049
0
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
4050
0
    if (tls && haveDH && haveRSA && haveAES128 && haveSHA1) {
4051
0
        suites->suites[idx++] = CIPHER_BYTE;
4052
0
        suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA;
4053
0
    }
4054
0
#endif
4055
4056
#ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
4057
    if (tls && haveDH && haveRSA && haveSHA1) {
4058
        suites->suites[idx++] = CIPHER_BYTE;
4059
        suites->suites[idx++] = TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA;
4060
    }
4061
#endif
4062
4063
#ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
4064
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4065
    if (tls1_2 && haveRSA && haveStaticRSA)
4066
#else
4067
    if (tls && haveRSA && haveStaticRSA)
4068
#endif
4069
    {
4070
        suites->suites[idx++] = CIPHER_BYTE;
4071
        suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA256;
4072
    }
4073
#endif
4074
4075
#ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
4076
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4077
    if (tls1_2 && haveRSA && haveStaticRSA && haveAES128)
4078
#else
4079
    if (tls && haveRSA && haveStaticRSA && haveAES128)
4080
#endif
4081
    {
4082
        suites->suites[idx++] = CIPHER_BYTE;
4083
        suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA256;
4084
    }
4085
#endif
4086
4087
#ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
4088
    if (tls && haveRSA && haveStaticRSA && haveSHA1) {
4089
        suites->suites[idx++] = CIPHER_BYTE;
4090
        suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA;
4091
    }
4092
#endif
4093
4094
#ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
4095
    if (tls && haveRSA && haveStaticRSA && haveAES128 && haveSHA1) {
4096
        suites->suites[idx++] = CIPHER_BYTE;
4097
        suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA;
4098
    }
4099
#endif
4100
4101
0
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
4102
0
    if (tls1_2 && haveECC) {
4103
0
        suites->suites[idx++] = CHACHA_BYTE;
4104
0
        suites->suites[idx++] =
4105
0
                              TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
4106
0
    }
4107
0
#endif
4108
4109
0
#ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
4110
    #ifdef OPENSSL_EXTRA
4111
    if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
4112
    #else
4113
0
    if (tls1_2 && haveRSA) {
4114
0
    #endif
4115
0
        suites->suites[idx++] = CHACHA_BYTE;
4116
0
        suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
4117
0
    }
4118
0
#endif
4119
4120
0
#ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
4121
    #ifdef OPENSSL_EXTRA
4122
    if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
4123
    #else
4124
0
    if (tls1_2 && haveRSA) {
4125
0
    #endif
4126
0
        suites->suites[idx++] = CHACHA_BYTE;
4127
0
        suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
4128
0
    }
4129
0
#endif /* BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 */
4130
4131
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
4132
    if (tls && haveECC && haveNull && haveSHA1) {
4133
        suites->suites[idx++] = ECC_BYTE;
4134
        suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_NULL_SHA;
4135
    }
4136
#endif
4137
4138
#ifdef BUILD_TLS_RSA_WITH_NULL_MD5
4139
    if (tls && haveRSA && haveNull && haveStaticRSA) {
4140
        suites->suites[idx++] = CIPHER_BYTE;
4141
        suites->suites[idx++] = TLS_RSA_WITH_NULL_MD5;
4142
    }
4143
#endif
4144
4145
#ifdef BUILD_TLS_RSA_WITH_NULL_SHA
4146
    if (tls && haveRSA && haveNull && haveStaticRSA && haveSHA1) {
4147
        suites->suites[idx++] = CIPHER_BYTE;
4148
        suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA;
4149
    }
4150
#endif
4151
4152
#ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
4153
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4154
    if (tls1_2 && haveRSA && haveNull && haveStaticRSA)
4155
#else
4156
    if (tls && haveRSA && haveNull && haveStaticRSA)
4157
#endif
4158
    {
4159
        suites->suites[idx++] = CIPHER_BYTE;
4160
        suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA256;
4161
    }
4162
#endif /* BUILD_TLS_RSA_WITH_NULL_SHA256 */
4163
4164
#ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
4165
    if (tls && havePSK && haveSHA1) {
4166
        suites->suites[idx++] = CIPHER_BYTE;
4167
        suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA;
4168
    }
4169
#endif
4170
4171
#ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
4172
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4173
    if (tls1_2 && haveDH && havePSK)
4174
#else
4175
    if (tls && haveDH && havePSK)
4176
#endif
4177
    {
4178
        suites->suites[idx++] = CIPHER_BYTE;
4179
        suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CBC_SHA384;
4180
    }
4181
#endif /* BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 */
4182
4183
#ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
4184
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4185
    if (tls1_2 && havePSK)
4186
#else
4187
    if (tls && havePSK)
4188
#endif
4189
    {
4190
        suites->suites[idx++] = CIPHER_BYTE;
4191
        suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA384;
4192
    }
4193
#endif /* BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384 */
4194
4195
#ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
4196
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4197
    if (tls1_2 && haveDH && havePSK && haveAES128)
4198
#else
4199
    if (tls && haveDH && havePSK && haveAES128)
4200
#endif
4201
    {
4202
        suites->suites[idx++] = CIPHER_BYTE;
4203
        suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CBC_SHA256;
4204
    }
4205
#endif /* BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 */
4206
4207
#ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
4208
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4209
    if (tls1_2 && havePSK && haveAES128)
4210
#else
4211
    if (tls1 && havePSK && haveAES128)
4212
#endif
4213
    {
4214
        suites->suites[idx++] = CIPHER_BYTE;
4215
        suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA256;
4216
    }
4217
#endif
4218
4219
#ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
4220
    if (tls && havePSK && haveAES128 && haveSHA1) {
4221
        suites->suites[idx++] = CIPHER_BYTE;
4222
        suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA;
4223
    }
4224
#endif
4225
4226
#ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
4227
    if (tls && haveDH && havePSK && haveAES128) {
4228
        suites->suites[idx++] = ECC_BYTE;
4229
        suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CCM;
4230
    }
4231
#endif
4232
4233
#ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
4234
    if (tls && haveDH && havePSK) {
4235
        suites->suites[idx++] = ECC_BYTE;
4236
        suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CCM;
4237
    }
4238
#endif
4239
4240
#ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
4241
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4242
    if (tls1_2 && havePSK)
4243
#else
4244
    if (tls && havePSK)
4245
#endif
4246
    {
4247
        suites->suites[idx++] = CHACHA_BYTE;
4248
        suites->suites[idx++] = TLS_PSK_WITH_CHACHA20_POLY1305_SHA256;
4249
    }
4250
#endif /* BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 */
4251
4252
#ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
4253
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4254
    if (tls1_2 && havePSK)
4255
#else
4256
    if (tls && havePSK)
4257
#endif
4258
    {
4259
        suites->suites[idx++] = CHACHA_BYTE;
4260
        suites->suites[idx++] = TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
4261
    }
4262
#endif /* BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 */
4263
4264
#ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
4265
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4266
    if (tls1_2 && havePSK)
4267
#else
4268
    if (tls && havePSK)
4269
#endif
4270
    {
4271
        suites->suites[idx++] = CHACHA_BYTE;
4272
        suites->suites[idx++] = TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
4273
    }
4274
#endif /* BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 */
4275
4276
#ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
4277
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4278
    if (tls1_2 && havePSK && haveAES128)
4279
#else
4280
    if (tls && havePSK && haveAES128)
4281
#endif
4282
    {
4283
        suites->suites[idx++] = ECC_BYTE;
4284
        suites->suites[idx++] = TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256;
4285
    }
4286
#endif /* BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 */
4287
4288
#ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256
4289
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4290
    if (tls1_2 && havePSK && haveAES128)
4291
#else
4292
    if (tls && havePSK && haveAES128)
4293
#endif
4294
    {
4295
        suites->suites[idx++] = ECDHE_PSK_BYTE;
4296
        suites->suites[idx++] = TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256;
4297
    }
4298
#endif /* BUILD_TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256 */
4299
4300
#ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
4301
    if (tls && havePSK && haveAES128) {
4302
        suites->suites[idx++] = ECC_BYTE;
4303
        suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM;
4304
    }
4305
#endif
4306
4307
#ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
4308
    if (tls && havePSK) {
4309
        suites->suites[idx++] = ECC_BYTE;
4310
        suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM;
4311
    }
4312
#endif
4313
4314
#ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
4315
    if (tls && havePSK && haveAES128) {
4316
        suites->suites[idx++] = ECC_BYTE;
4317
        suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM_8;
4318
    }
4319
#endif
4320
4321
#ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
4322
    if (tls && havePSK) {
4323
        suites->suites[idx++] = ECC_BYTE;
4324
        suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM_8;
4325
    }
4326
#endif
4327
4328
#ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
4329
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4330
    if (tls1_2 && haveDH && havePSK)
4331
#else
4332
    if (tls && haveDH && havePSK && haveNull)
4333
#endif
4334
    {
4335
        suites->suites[idx++] = CIPHER_BYTE;
4336
        suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA384;
4337
    }
4338
#endif /* BUILD_TLS_DHE_PSK_WITH_NULL_SHA384 */
4339
4340
#ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
4341
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4342
    if (tls1_2 && havePSK && haveNull)
4343
#else
4344
    if (tls && havePSK && haveNull)
4345
#endif
4346
    {
4347
        suites->suites[idx++] = CIPHER_BYTE;
4348
        suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA384;
4349
    }
4350
#endif /* BUILD_TLS_PSK_WITH_NULL_SHA384 */
4351
4352
#ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
4353
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4354
    if (tls1_2 && havePSK && haveNull)
4355
#else
4356
    if (tls && havePSK && haveNull)
4357
#endif
4358
    {
4359
        suites->suites[idx++] = ECC_BYTE;
4360
        suites->suites[idx++] = TLS_ECDHE_PSK_WITH_NULL_SHA256;
4361
    }
4362
#endif /* BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256 */
4363
4364
#ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
4365
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4366
    if (tls1_2 && haveDH && havePSK && haveNull)
4367
#else
4368
    if (tls && haveDH && havePSK && haveNull)
4369
#endif
4370
    {
4371
        suites->suites[idx++] = CIPHER_BYTE;
4372
        suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA256;
4373
    }
4374
#endif /* BUILD_TLS_DHE_PSK_WITH_NULL_SHA256 */
4375
4376
#ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
4377
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4378
    if (tls1_2 && havePSK && haveNull)
4379
#else
4380
    if (tls && havePSK && haveNull)
4381
#endif
4382
    {
4383
        suites->suites[idx++] = CIPHER_BYTE;
4384
        suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA256;
4385
    }
4386
#endif /* BUILD_TLS_PSK_WITH_NULL_SHA256 */
4387
4388
#ifdef BUILD_TLS_PSK_WITH_NULL_SHA
4389
    if (tls && havePSK && haveNull) {
4390
        suites->suites[idx++] = CIPHER_BYTE;
4391
        suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA;
4392
    }
4393
#endif
4394
4395
#ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
4396
    if (!dtls && haveRSA && haveStaticRSA && haveSHA1 && haveRC4) {
4397
        suites->suites[idx++] = CIPHER_BYTE;
4398
        suites->suites[idx++] = SSL_RSA_WITH_RC4_128_SHA;
4399
    }
4400
#endif
4401
4402
#ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
4403
    if (!dtls && haveRSA && haveStaticRSA && haveRC4) {
4404
        suites->suites[idx++] = CIPHER_BYTE;
4405
        suites->suites[idx++] = SSL_RSA_WITH_RC4_128_MD5;
4406
    }
4407
#endif
4408
4409
#ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
4410
    if (haveRSA && haveStaticRSA && haveSHA1) {
4411
        suites->suites[idx++] = CIPHER_BYTE;
4412
        suites->suites[idx++] = SSL_RSA_WITH_3DES_EDE_CBC_SHA;
4413
    }
4414
#endif
4415
4416
#ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
4417
    if (tls && haveRSA && haveStaticRSA && haveSHA1) {
4418
        suites->suites[idx++] = CIPHER_BYTE;
4419
        suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA;
4420
    }
4421
#endif
4422
4423
0
#ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
4424
0
    if (tls && haveDH && haveRSA && haveStaticRSA && haveSHA1) {
4425
0
        suites->suites[idx++] = CIPHER_BYTE;
4426
0
        suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA;
4427
0
    }
4428
0
#endif
4429
4430
#ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
4431
    if (tls && haveRSA && haveStaticRSA && haveSHA1) {
4432
        suites->suites[idx++] = CIPHER_BYTE;
4433
        suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA;
4434
    }
4435
#endif
4436
4437
0
#ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
4438
0
    if (tls && haveDH && haveRSA && haveStaticRSA && haveSHA1) {
4439
0
        suites->suites[idx++] = CIPHER_BYTE;
4440
0
        suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA;
4441
0
    }
4442
0
#endif
4443
4444
#ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
4445
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4446
    if (tls1_2 && haveRSA && haveStaticRSA)
4447
#else
4448
    if (tls && haveRSA && haveStaticRSA)
4449
#endif
4450
    {
4451
        suites->suites[idx++] = CIPHER_BYTE;
4452
        suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256;
4453
    }
4454
#endif /* BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 */
4455
4456
0
#ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
4457
0
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4458
0
    if (tls1_2 && haveDH && haveRSA && haveStaticRSA)
4459
#else
4460
    if (tls && haveDH && haveRSA && haveStaticRSA)
4461
#endif
4462
0
    {
4463
0
        suites->suites[idx++] = CIPHER_BYTE;
4464
0
        suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256;
4465
0
    }
4466
0
#endif /* BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 */
4467
4468
#ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
4469
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4470
    if (tls1_2 && haveRSA && haveStaticRSA)
4471
#else
4472
    if (tls && haveRSA && haveStaticRSA)
4473
#endif
4474
    {
4475
        suites->suites[idx++] = CIPHER_BYTE;
4476
        suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256;
4477
    }
4478
#endif /* BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 */
4479
4480
0
#ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
4481
0
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
4482
0
    if (tls1_2 && haveDH && haveRSA && haveStaticRSA)
4483
#else
4484
    if (tls && haveDH && haveRSA && haveStaticRSA)
4485
#endif
4486
0
    {
4487
0
        suites->suites[idx++] = CIPHER_BYTE;
4488
0
        suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256;
4489
0
    }
4490
0
#endif /* BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 */
4491
4492
0
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
4493
0
    if (tls && haveECC) {
4494
0
        suites->suites[idx++] = SM_BYTE;
4495
0
        suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3;
4496
0
    }
4497
0
#endif
4498
4499
0
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
4500
0
    if (tls && haveECC) {
4501
0
        suites->suites[idx++] = SM_BYTE;
4502
0
        suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3;
4503
0
    }
4504
0
#endif
4505
4506
0
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
4507
0
    if (tls && haveECC) {
4508
0
        suites->suites[idx++] = SM_BYTE;
4509
0
        suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3;
4510
0
    }
4511
0
#endif
4512
4513
0
#endif /* !WOLFSSL_NO_TLS12 */
4514
4515
0
    suites->suiteSz = idx;
4516
4517
0
    if (suites->hashSigAlgoSz == 0) {
4518
0
        InitSuitesHashSigAlgo(suites->hashSigAlgo, SIG_ALL, tls1_2, keySz,
4519
0
            &suites->hashSigAlgoSz);
4520
0
    }
4521
4522
    /* Moved to the end as we set some of the vars but never use them */
4523
0
    (void)tls;  /* shut up compiler */
4524
0
    (void)tls1_2;
4525
0
    (void)dtls;
4526
0
    (void)haveDH;
4527
0
    (void)havePSK;
4528
0
    (void)haveStaticRSA;
4529
0
    (void)haveStaticECC;
4530
0
    (void)haveECC;
4531
0
    (void)haveECDSAsig;
4532
0
    (void)side;
4533
0
    (void)haveRSA;    /* some builds won't read */
4534
0
    (void)haveRSAsig; /* non ecc builds won't read */
4535
0
    (void)haveAnon;   /* anon ciphers optional */
4536
0
    (void)haveNull;
4537
0
}
4538
4539
#if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) || \
4540
    (!defined(NO_WOLFSSL_CLIENT) && (!defined(NO_DH) || defined(HAVE_ECC)))
4541
4542
/* Decode the signature algorithm.
4543
 *
4544
 * input     The encoded signature algorithm.
4545
 * hashalgo  The hash algorithm.
4546
 * hsType    The signature type.
4547
 */
4548
void DecodeSigAlg(const byte* input, byte* hashAlgo, byte* hsType)
4549
{
4550
    *hsType = invalid_sa_algo;
4551
    switch (input[0]) {
4552
        case NEW_SA_MAJOR:
4553
    #ifdef HAVE_ED25519
4554
            /* ED25519: 0x0807 */
4555
            if (input[1] == ED25519_SA_MINOR) {
4556
                *hsType = ed25519_sa_algo;
4557
                /* Hash performed as part of sign/verify operation. */
4558
                *hashAlgo = sha512_mac;
4559
            }
4560
            else
4561
    #endif
4562
    #ifdef HAVE_ED448
4563
            /* ED448: 0x0808 */
4564
            if (input[1] == ED448_SA_MINOR) {
4565
                *hsType = ed448_sa_algo;
4566
                /* Hash performed as part of sign/verify operation. */
4567
                *hashAlgo = sha512_mac;
4568
            }
4569
            else
4570
    #endif
4571
    #ifdef WC_RSA_PSS
4572
            /* PSS PSS signatures: 0x080[9-b] */
4573
            if (input[1] >= pss_sha256 && input[1] <= pss_sha512) {
4574
                *hsType   = rsa_pss_pss_algo;
4575
                *hashAlgo = PSS_PSS_HASH_TO_MAC(input[1]);
4576
            }
4577
            else
4578
    #endif
4579
            {
4580
                *hsType   = input[0];
4581
                *hashAlgo = input[1];
4582
            }
4583
            break;
4584
    #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
4585
        case SM2_SA_MAJOR:
4586
            /* SM2: 0x0708 */
4587
            if (input[1] == SM2_SA_MINOR) {
4588
                *hsType = sm2_sa_algo;
4589
                /* Hash performed as part of sign/verify operation. */
4590
                *hashAlgo = sm3_mac;
4591
            }
4592
            break;
4593
    #endif
4594
    /* Hash performed as part of sign/verify operation.
4595
     * However, if we want a dual alg signature with a classic algorithm as
4596
     * alternative, we need an explicit hash algo here. */
4597
    #ifdef HAVE_FALCON
4598
        case FALCON_SA_MAJOR:
4599
            if (input[1] == FALCON_LEVEL1_SA_MINOR) {
4600
                *hsType = falcon_level1_sa_algo;
4601
                *hashAlgo = sha256_mac;
4602
            }
4603
            else if (input[1] == FALCON_LEVEL5_SA_MINOR) {
4604
                *hsType = falcon_level5_sa_algo;
4605
                *hashAlgo = sha512_mac;
4606
            }
4607
            break;
4608
    #endif /* HAVE_FALCON */
4609
    #ifdef HAVE_DILITHIUM
4610
        case DILITHIUM_SA_MAJOR:
4611
            if (input[1] == DILITHIUM_LEVEL2_SA_MINOR) {
4612
                *hsType = dilithium_level2_sa_algo;
4613
                *hashAlgo = sha256_mac;
4614
            }
4615
            else if (input[1] == DILITHIUM_LEVEL3_SA_MINOR) {
4616
                *hsType = dilithium_level3_sa_algo;
4617
                *hashAlgo = sha384_mac;
4618
            }
4619
            else if (input[1] == DILITHIUM_LEVEL5_SA_MINOR) {
4620
                *hsType = dilithium_level5_sa_algo;
4621
                *hashAlgo = sha512_mac;
4622
            }
4623
            break;
4624
    #endif /* HAVE_DILITHIUM */
4625
        default:
4626
            *hashAlgo = input[0];
4627
            *hsType   = input[1];
4628
            break;
4629
    }
4630
}
4631
#endif /* !NO_WOLFSSL_SERVER || !NO_CERTS  ||
4632
        * ( !NO_WOLFSSL_CLIENT && (!NO_DH || HAVE_ECC) ) */
4633
4634
#ifndef WOLFSSL_NO_TLS12
4635
#if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
4636
#if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4637
             defined(HAVE_CURVE448) || (!defined(NO_RSA) && defined(WC_RSA_PSS))
4638
4639
enum wc_HashType HashAlgoToType(int hashAlgo)
4640
5.53k
{
4641
5.53k
    switch (hashAlgo) {
4642
0
    #ifdef WOLFSSL_SHA512
4643
216
        case sha512_mac:
4644
216
            return WC_HASH_TYPE_SHA512;
4645
0
    #endif
4646
0
    #ifdef WOLFSSL_SHA384
4647
188
        case sha384_mac:
4648
188
            return WC_HASH_TYPE_SHA384;
4649
0
    #endif
4650
0
    #ifdef WOLFSSL_SM3
4651
5.00k
        case sm3_mac:
4652
5.00k
            return WC_HASH_TYPE_SM3;
4653
0
    #endif
4654
0
    #ifndef NO_SHA256
4655
26
        case sha256_mac:
4656
26
            return WC_HASH_TYPE_SHA256;
4657
0
    #endif
4658
0
    #ifdef WOLFSSL_SHA224
4659
98
        case sha224_mac:
4660
98
            return WC_HASH_TYPE_SHA224;
4661
0
    #endif
4662
    #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
4663
                             defined(WOLFSSL_ALLOW_TLS_SHA1))
4664
        case sha_mac:
4665
            return WC_HASH_TYPE_SHA;
4666
    #endif
4667
0
        default:
4668
0
            WOLFSSL_MSG("Bad hash sig algo");
4669
0
            break;
4670
5.53k
    }
4671
4672
0
    return WC_HASH_TYPE_NONE;
4673
5.53k
}
4674
#endif /* !NO_DH || HAVE_ECC || (!NO_RSA && WC_RSA_PSS) */
4675
#endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
4676
#endif /* !WOLFSSL_NO_TLS12 */
4677
4678
#ifndef NO_CERTS
4679
4680
void InitX509Name(WOLFSSL_X509_NAME* name, int dynamicFlag, void* heap)
4681
236k
{
4682
236k
    (void)dynamicFlag;
4683
4684
236k
    if (name != NULL) {
4685
236k
        XMEMSET(name, 0, sizeof(WOLFSSL_X509_NAME));
4686
236k
        name->name        = name->staticName;
4687
236k
        name->heap = heap;
4688
236k
        name->dynamicName = 0;
4689
236k
    }
4690
236k
}
4691
4692
4693
void FreeX509Name(WOLFSSL_X509_NAME* name)
4694
0
{
4695
0
    if (name != NULL) {
4696
0
        if (name->dynamicName) {
4697
0
            XFREE(name->name, name->heap, DYNAMIC_TYPE_SUBJECT_CN);
4698
0
            name->name = NULL;
4699
0
        }
4700
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
4701
        {
4702
            int i;
4703
            for (i = 0; i < MAX_NAME_ENTRIES; i++) {
4704
                if (name->entry[i].object != NULL)
4705
                    wolfSSL_ASN1_OBJECT_free(name->entry[i].object);
4706
                if (name->entry[i].value != NULL)
4707
                    wolfSSL_ASN1_STRING_free(name->entry[i].value);
4708
                XMEMSET(&name->entry[i], 0, sizeof(WOLFSSL_X509_NAME_ENTRY));
4709
            }
4710
        }
4711
#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
4712
#ifdef OPENSSL_ALL
4713
        if (name->entries) {
4714
            wolfSSL_sk_X509_NAME_ENTRY_free(name->entries);
4715
            name->entries = NULL;
4716
        }
4717
#endif
4718
0
    }
4719
0
}
4720
4721
4722
/* Initialize wolfSSL X509 type */
4723
void InitX509(WOLFSSL_X509* x509, int dynamicFlag, void* heap)
4724
{
4725
    if (x509 == NULL) {
4726
        WOLFSSL_MSG("Null parameter passed in!");
4727
        return;
4728
    }
4729
4730
    XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
4731
4732
    x509->heap = heap;
4733
    InitX509Name(&x509->issuer, 0, heap);
4734
    InitX509Name(&x509->subject, 0, heap);
4735
    x509->dynamicMemory  = (byte)dynamicFlag;
4736
#if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
4737
    {
4738
        int ret;
4739
        wolfSSL_RefInit(&x509->ref, &ret);
4740
        (void)ret;
4741
    }
4742
#endif
4743
}
4744
4745
4746
/* Free wolfSSL X509 type */
4747
void FreeX509(WOLFSSL_X509* x509)
4748
0
{
4749
    #if defined(WOLFSSL_CERT_REQ) && defined(OPENSSL_ALL) \
4750
    &&  defined( WOLFSSL_CUSTOM_OID)
4751
    int idx;
4752
    #endif /* WOLFSSL_CERT_REQ && OPENSSL_ALL && WOLFSSL_CUSTOM_OID */
4753
0
    if (x509 == NULL)
4754
0
        return;
4755
4756
0
    FreeX509Name(&x509->issuer);
4757
0
    FreeX509Name(&x509->subject);
4758
0
    if (x509->pubKey.buffer) {
4759
0
        XFREE(x509->pubKey.buffer, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
4760
0
        x509->pubKey.buffer = NULL;
4761
0
    }
4762
0
    FreeDer(&x509->derCert);
4763
0
    XFREE(x509->sig.buffer, x509->heap, DYNAMIC_TYPE_SIGNATURE);
4764
0
    x509->sig.buffer = NULL;
4765
    #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
4766
        if (x509->authKeyIdSrc != NULL) {
4767
            XFREE(x509->authKeyIdSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
4768
        }
4769
        else {
4770
            XFREE(x509->authKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
4771
        }
4772
        x509->authKeyIdSrc = NULL;
4773
        x509->authKeyId = NULL;
4774
        XFREE(x509->subjKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
4775
        x509->subjKeyId = NULL;
4776
        wolfSSL_ASN1_STRING_free(x509->subjKeyIdStr);
4777
        x509->subjKeyIdStr = NULL;
4778
        XFREE(x509->authInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
4779
        x509->authInfo = NULL;
4780
        XFREE(x509->rawCRLInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
4781
        x509->rawCRLInfo = NULL;
4782
        XFREE(x509->CRLInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
4783
        x509->CRLInfo = NULL;
4784
        #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || \
4785
            defined(WOLFSSL_QT)
4786
        XFREE(x509->authInfoCaIssuer, x509->heap, DYNAMIC_TYPE_X509_EXT);
4787
        if (x509->ext_sk != NULL) {
4788
            wolfSSL_sk_X509_EXTENSION_pop_free(x509->ext_sk, NULL);
4789
        }
4790
        if (x509->ext_sk_full != NULL) {
4791
            wolfSSL_sk_X509_EXTENSION_pop_free(x509->ext_sk_full, NULL);
4792
        }
4793
        #endif /* OPENSSL_ALL || WOLFSSL_QT */
4794
        #ifdef OPENSSL_EXTRA
4795
        /* Free serialNumber that was set by wolfSSL_X509_get_serialNumber */
4796
        if (x509->serialNumber != NULL) {
4797
            wolfSSL_ASN1_INTEGER_free(x509->serialNumber);
4798
        }
4799
        #endif
4800
        if (x509->extKeyUsageSrc != NULL) {
4801
            XFREE(x509->extKeyUsageSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
4802
            x509->extKeyUsageSrc= NULL;
4803
        }
4804
    #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
4805
    #if defined(OPENSSL_ALL)
4806
        if (x509->algor.algorithm) {
4807
            wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
4808
            x509->algor.algorithm = NULL;
4809
        }
4810
        if (x509->key.algor) {
4811
            wolfSSL_X509_ALGOR_free(x509->key.algor);
4812
            x509->key.algor = NULL;
4813
        }
4814
        if (x509->key.pkey) {
4815
            wolfSSL_EVP_PKEY_free(x509->key.pkey);
4816
            x509->key.pkey = NULL;
4817
        }
4818
        if (x509->subjAltNameSrc != NULL) {
4819
            XFREE(x509->subjAltNameSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
4820
            x509->subjAltNameSrc= NULL;
4821
        }
4822
    #endif /* OPENSSL_ALL */
4823
    #if defined(WOLFSSL_CERT_REQ) && defined(OPENSSL_ALL)
4824
        if (x509->reqAttributes) {
4825
            wolfSSL_sk_pop_free(x509->reqAttributes, NULL);
4826
        }
4827
    #ifdef WOLFSSL_CUSTOM_OID
4828
        for (idx = 0; idx < x509->customExtCount; idx++) {
4829
            XFREE(x509->custom_exts[idx].oid, x509->heap,
4830
                  DYNAMIC_TYPE_X509_EXT);
4831
            XFREE(x509->custom_exts[idx].val, x509->heap,
4832
                  DYNAMIC_TYPE_X509_EXT);
4833
        }
4834
    #endif /* WOLFSSL_CUSTOM_OID */
4835
    #endif /* WOLFSSL_CERT_REQ && OPENSSL_ALL */
4836
0
    if (x509->altNames) {
4837
0
        FreeAltNames(x509->altNames, x509->heap);
4838
0
        x509->altNames = NULL;
4839
0
    }
4840
4841
    #ifdef WOLFSSL_DUAL_ALG_CERTS
4842
    XFREE(x509->sapkiDer, x509->heap, DYNAMIC_TYPE_X509_EXT);
4843
    x509->sapkiDer = NULL;
4844
    XFREE(x509->altSigAlgDer, x509->heap, DYNAMIC_TYPE_X509_EXT);
4845
    x509->altSigAlgDer = NULL;
4846
    if (x509->altSigValDer) {
4847
        XFREE(x509->altSigValDer, x509->heap, DYNAMIC_TYPE_X509_EXT);
4848
        x509->altSigValDer= NULL;
4849
    }
4850
    #endif /* WOLFSSL_DUAL_ALG_CERTS */
4851
4852
    #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
4853
        wolfSSL_RefFree(&x509->ref);
4854
    #endif
4855
0
}
4856
4857
4858
#if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
4859
#if !defined(WOLFSSL_NO_TLS12)
4860
/* Encode the signature algorithm into buffer.
4861
 *
4862
 * hashalgo  The hash algorithm.
4863
 * hsType   The signature type.
4864
 * output    The buffer to encode into.
4865
 */
4866
static WC_INLINE void EncodeSigAlg(byte hashAlgo, byte hsType, byte* output)
4867
0
{
4868
0
    switch (hsType) {
4869
0
#ifdef HAVE_ECC
4870
0
        case ecc_dsa_sa_algo:
4871
0
            output[0] = hashAlgo;
4872
0
            output[1] = ecc_dsa_sa_algo;
4873
0
            break;
4874
0
#endif
4875
0
#ifdef HAVE_ED25519
4876
0
        case ed25519_sa_algo:
4877
0
            output[0] = ED25519_SA_MAJOR;
4878
0
            output[1] = ED25519_SA_MINOR;
4879
0
            (void)hashAlgo;
4880
0
            break;
4881
0
#endif
4882
0
#ifdef HAVE_ED448
4883
0
        case ed448_sa_algo:
4884
0
            output[0] = ED448_SA_MAJOR;
4885
0
            output[1] = ED448_SA_MINOR;
4886
0
            (void)hashAlgo;
4887
0
            break;
4888
0
#endif
4889
0
#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
4890
0
        case sm2_sa_algo:
4891
0
            output[0] = SM2_SA_MAJOR;
4892
0
            output[1] = SM2_SA_MINOR;
4893
0
            (void)hashAlgo;
4894
0
            break;
4895
0
#endif
4896
0
#ifndef NO_RSA
4897
0
        case rsa_sa_algo:
4898
0
            output[0] = hashAlgo;
4899
0
            output[1] = rsa_sa_algo;
4900
0
            break;
4901
0
    #ifdef WC_RSA_PSS
4902
        /* PSS signatures: 0x080[4-6] */
4903
0
        case rsa_pss_sa_algo:
4904
0
            output[0] = rsa_pss_sa_algo;
4905
0
            output[1] = hashAlgo;
4906
0
            break;
4907
0
    #endif
4908
0
#endif
4909
0
        default:
4910
0
            break;
4911
0
    }
4912
0
    (void)hashAlgo;
4913
0
    (void)output;
4914
0
}
4915
#endif
4916
4917
#if !defined(NO_TLS) && !defined(WOLFSSL_NO_TLS12) && \
4918
    !defined(WOLFSSL_NO_CLIENT_AUTH)
4919
static void SetDigest(WOLFSSL* ssl, int hashAlgo)
4920
0
{
4921
0
    switch (hashAlgo) {
4922
    #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
4923
                              defined(WOLFSSL_ALLOW_TLS_SHA1))
4924
        case sha_mac:
4925
            ssl->options.dontFreeDigest = 1;
4926
            ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha;
4927
            ssl->buffers.digest.length = WC_SHA_DIGEST_SIZE;
4928
            break;
4929
    #endif /* !NO_SHA */
4930
0
    #ifndef NO_SHA256
4931
0
        case sha256_mac:
4932
0
            ssl->options.dontFreeDigest = 1;
4933
0
            ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha256;
4934
0
            ssl->buffers.digest.length = WC_SHA256_DIGEST_SIZE;
4935
0
            break;
4936
0
    #endif /* !NO_SHA256 */
4937
0
    #ifdef WOLFSSL_SM3
4938
0
        case sm3_mac:
4939
0
            ssl->options.dontFreeDigest = 1;
4940
0
            ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sm3;
4941
0
            ssl->buffers.digest.length = WC_SM3_DIGEST_SIZE;
4942
0
            break;
4943
0
    #endif /* WOLFSSL_SM2 */
4944
0
    #ifdef WOLFSSL_SHA384
4945
0
        case sha384_mac:
4946
0
            ssl->options.dontFreeDigest = 1;
4947
0
            ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha384;
4948
0
            ssl->buffers.digest.length = WC_SHA384_DIGEST_SIZE;
4949
0
            break;
4950
0
    #endif /* WOLFSSL_SHA384 */
4951
0
    #ifdef WOLFSSL_SHA512
4952
0
        case sha512_mac:
4953
0
            ssl->options.dontFreeDigest = 1;
4954
0
            ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha512;
4955
0
            ssl->buffers.digest.length = WC_SHA512_DIGEST_SIZE;
4956
0
            break;
4957
0
    #endif /* WOLFSSL_SHA512 */
4958
0
        default:
4959
0
            break;
4960
0
    } /* switch */
4961
0
}
4962
#endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_NO_CLIENT_AUTH */
4963
#endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
4964
#endif /* !NO_CERTS */
4965
4966
word32 MacSize(const WOLFSSL* ssl)
4967
{
4968
#ifdef HAVE_TRUNCATED_HMAC
4969
    word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
4970
                                          : ssl->specs.hash_size;
4971
#else
4972
    word32 digestSz = ssl->specs.hash_size;
4973
#endif
4974
4975
    return digestSz;
4976
}
4977
4978
#ifndef NO_RSA
4979
#if !defined(NO_TLS) && !defined(WOLFSSL_NO_TLS12) || \
4980
    (defined(WC_RSA_PSS) && defined(HAVE_PK_CALLBACKS))
4981
#if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
4982
static int TypeHash(int hashAlgo)
4983
4.57k
{
4984
4.57k
    switch (hashAlgo) {
4985
0
    #ifdef WOLFSSL_SHA512
4986
9
        case sha512_mac:
4987
9
            return SHA512h;
4988
0
    #endif
4989
0
    #ifdef WOLFSSL_SHA384
4990
24
        case sha384_mac:
4991
24
            return SHA384h;
4992
0
    #endif
4993
0
    #ifndef NO_SHA256
4994
4.54k
        case sha256_mac:
4995
4.54k
            return SHA256h;
4996
0
    #endif
4997
0
    #ifdef WOLFSSL_SHA224
4998
0
        case sha224_mac:
4999
0
            return SHA224h;
5000
0
    #endif
5001
0
    #ifndef NO_SHA
5002
0
        case sha_mac:
5003
0
            return SHAh;
5004
0
    #endif
5005
0
        default:
5006
0
            break;
5007
4.57k
    }
5008
5009
0
    return 0;
5010
4.57k
}
5011
#endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
5012
#endif /* !WOLFSSL_NO_TLS12 */
5013
5014
#if defined(WC_RSA_PSS)
5015
int ConvertHashPss(int hashAlgo, enum wc_HashType* hashType, int* mgf)
5016
1.93k
{
5017
1.93k
    switch (hashAlgo) {
5018
0
        #ifdef WOLFSSL_SHA512
5019
328
        case sha512_mac:
5020
328
            *hashType = WC_HASH_TYPE_SHA512;
5021
328
            if (mgf != NULL)
5022
328
                *mgf = WC_MGF1SHA512;
5023
328
            break;
5024
0
        #endif
5025
0
        #ifdef WOLFSSL_SHA384
5026
312
        case sha384_mac:
5027
312
            *hashType = WC_HASH_TYPE_SHA384;
5028
312
            if (mgf != NULL)
5029
312
                *mgf = WC_MGF1SHA384;
5030
312
            break;
5031
0
        #endif
5032
0
        #ifndef NO_SHA256
5033
1.29k
        case sha256_mac:
5034
1.29k
            *hashType = WC_HASH_TYPE_SHA256;
5035
1.29k
            if (mgf != NULL)
5036
1.29k
                *mgf = WC_MGF1SHA256;
5037
1.29k
            break;
5038
0
        #endif
5039
0
        default:
5040
0
            return BAD_FUNC_ARG;
5041
1.93k
    }
5042
5043
1.93k
    return 0;
5044
1.93k
}
5045
#endif
5046
5047
#if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
5048
int RsaSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
5049
            word32* outSz, int sigAlgo, int hashAlgo, RsaKey* key,
5050
            DerBuffer* keyBufInfo)
5051
7.98k
{
5052
7.98k
    int ret;
5053
#ifdef HAVE_PK_CALLBACKS
5054
    const byte* keyBuf = NULL;
5055
    word32 keySz = 0;
5056
5057
    if (keyBufInfo) {
5058
        keyBuf = keyBufInfo->buffer;
5059
        keySz = keyBufInfo->length;
5060
    }
5061
#endif
5062
5063
7.98k
    (void)ssl;
5064
7.98k
    (void)keyBufInfo;
5065
7.98k
    (void)sigAlgo;
5066
7.98k
    (void)hashAlgo;
5067
5068
7.98k
    WOLFSSL_ENTER("RsaSign");
5069
5070
#ifdef WOLFSSL_ASYNC_CRYPT
5071
    /* initialize event */
5072
    if (key) {
5073
        ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
5074
        if (ret != 0)
5075
            return ret;
5076
    }
5077
#endif
5078
5079
7.98k
#if defined(WC_RSA_PSS)
5080
7.98k
    if (sigAlgo == rsa_pss_sa_algo) {
5081
1.13k
        enum wc_HashType hashType = WC_HASH_TYPE_NONE;
5082
1.13k
        int mgf = 0;
5083
5084
1.13k
        ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
5085
1.13k
        if (ret != 0)
5086
0
            return ret;
5087
5088
    #if defined(HAVE_PK_CALLBACKS)
5089
        if (ssl->ctx->RsaPssSignCb) {
5090
            void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
5091
            ret = ssl->ctx->RsaPssSignCb(ssl, in, inSz, out, outSz,
5092
                                         TypeHash(hashAlgo), mgf,
5093
                                         keyBuf, keySz, ctx);
5094
        }
5095
        else
5096
    #endif
5097
1.13k
        {
5098
1.13k
            ret = wc_RsaPSS_Sign(in, inSz, out, *outSz, hashType, mgf, key,
5099
1.13k
                                                                      ssl->rng);
5100
1.13k
        }
5101
1.13k
    }
5102
6.84k
    else
5103
6.84k
#endif
5104
#if defined(HAVE_PK_CALLBACKS)
5105
    if (ssl->ctx->RsaSignCb) {
5106
        void* ctx = wolfSSL_GetRsaSignCtx(ssl);
5107
        ret = ssl->ctx->RsaSignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
5108
                                                                          ctx);
5109
    }
5110
    else
5111
#endif /*HAVE_PK_CALLBACKS */
5112
6.84k
        ret = wc_RsaSSL_Sign(in, inSz, out, *outSz, key, ssl->rng);
5113
5114
    /* Handle async pending response */
5115
#ifdef WOLFSSL_ASYNC_CRYPT
5116
    if (key && ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
5117
        ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
5118
    }
5119
#endif /* WOLFSSL_ASYNC_CRYPT */
5120
5121
    /* For positive response return in outSz */
5122
7.98k
    if (ret > 0) {
5123
7.00k
        *outSz = (word32)ret;
5124
7.00k
        ret = 0;
5125
7.00k
    }
5126
5127
7.98k
    WOLFSSL_LEAVE("RsaSign", ret);
5128
5129
7.98k
    return ret;
5130
7.98k
}
5131
#endif
5132
5133
int RsaVerify(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, int sigAlgo,
5134
              int hashAlgo, RsaKey* key, buffer* keyBufInfo)
5135
105
{
5136
105
    int ret = WC_NO_ERR_TRACE(SIG_VERIFY_E);
5137
5138
#ifdef HAVE_PK_CALLBACKS
5139
    const byte* keyBuf = NULL;
5140
    word32 keySz = 0;
5141
5142
    if (keyBufInfo) {
5143
        keyBuf = keyBufInfo->buffer;
5144
        keySz = keyBufInfo->length;
5145
    }
5146
#endif
5147
5148
105
    (void)ssl;
5149
105
    (void)keyBufInfo;
5150
105
    (void)sigAlgo;
5151
105
    (void)hashAlgo;
5152
5153
105
    WOLFSSL_ENTER("RsaVerify");
5154
5155
#ifdef WOLFSSL_ASYNC_CRYPT
5156
    /* initialize event */
5157
    ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
5158
    if (ret != 0)
5159
        return ret;
5160
#endif
5161
5162
105
#if defined(WC_RSA_PSS)
5163
105
    if (sigAlgo == rsa_pss_sa_algo || sigAlgo == rsa_pss_pss_algo) {
5164
15
        enum wc_HashType hashType = WC_HASH_TYPE_NONE;
5165
15
        int mgf = 0;
5166
5167
15
        ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
5168
15
        if (ret != 0)
5169
0
            return ret;
5170
#ifdef HAVE_PK_CALLBACKS
5171
        if (ssl->ctx->RsaPssVerifyCb) {
5172
            void* ctx = wolfSSL_GetRsaPssVerifyCtx(ssl);
5173
            ret = ssl->ctx->RsaPssVerifyCb(ssl, in, inSz, out,
5174
                                           TypeHash(hashAlgo), mgf,
5175
                                           keyBuf, keySz, ctx);
5176
        }
5177
        else
5178
#endif /*HAVE_PK_CALLBACKS */
5179
15
            ret = wc_RsaPSS_VerifyInline(in, inSz, out, hashType, mgf, key);
5180
15
    }
5181
90
    else
5182
90
#endif
5183
#ifdef HAVE_PK_CALLBACKS
5184
    if (ssl->ctx->RsaVerifyCb) {
5185
        void* ctx = wolfSSL_GetRsaVerifyCtx(ssl);
5186
        ret = ssl->ctx->RsaVerifyCb(ssl, in, inSz, out, keyBuf, keySz, ctx);
5187
    }
5188
    #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \
5189
        !defined(WOLFSSL_RENESAS_TSIP_TLS)
5190
    else
5191
    #else
5192
    if (!ssl->ctx->RsaVerifyCb || ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
5193
    #endif
5194
#endif /*HAVE_PK_CALLBACKS */
5195
90
    {
5196
90
        ret = wc_RsaSSL_VerifyInline(in, inSz, out, key);
5197
90
    }
5198
5199
    /* Handle async pending response */
5200
#ifdef WOLFSSL_ASYNC_CRYPT
5201
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
5202
        ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
5203
    }
5204
#endif /* WOLFSSL_ASYNC_CRYPT */
5205
5206
105
    WOLFSSL_LEAVE("RsaVerify", ret);
5207
5208
105
    return ret;
5209
105
}
5210
5211
/* Verify RSA signature, 0 on success */
5212
/* This function is used to check the sign result */
5213
int VerifyRsaSign(WOLFSSL* ssl, byte* verifySig, word32 sigSz,
5214
    const byte* plain, word32 plainSz, int sigAlgo, int hashAlgo, RsaKey* key,
5215
    DerBuffer* keyBufInfo)
5216
6.95k
{
5217
6.95k
    byte* out = NULL;  /* inline result */
5218
6.95k
    int   ret;
5219
#ifdef HAVE_PK_CALLBACKS
5220
    const byte* keyBuf = NULL;
5221
    word32 keySz = 0;
5222
5223
    if (keyBufInfo) {
5224
        keyBuf = keyBufInfo->buffer;
5225
        keySz = keyBufInfo->length;
5226
    }
5227
#endif
5228
5229
6.95k
    (void)ssl;
5230
6.95k
    (void)keyBufInfo;
5231
6.95k
    (void)sigAlgo;
5232
6.95k
    (void)hashAlgo;
5233
5234
6.95k
    WOLFSSL_ENTER("VerifyRsaSign");
5235
5236
6.95k
    if (verifySig == NULL || plain == NULL) {
5237
0
        return BAD_FUNC_ARG;
5238
0
    }
5239
5240
6.95k
    if (sigSz > ENCRYPT_LEN) {
5241
0
        WOLFSSL_MSG("Signature buffer too big");
5242
0
        return BUFFER_E;
5243
0
    }
5244
5245
#ifdef WOLFSSL_ASYNC_CRYPT
5246
    /* initialize event */
5247
    if (key) {
5248
        ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
5249
        if (ret != 0)
5250
            return ret;
5251
    }
5252
#endif
5253
5254
6.95k
#if defined(WC_RSA_PSS)
5255
6.95k
    if (sigAlgo == rsa_pss_sa_algo) {
5256
776
        enum wc_HashType hashType = WC_HASH_TYPE_NONE;
5257
776
        int mgf = 0;
5258
5259
776
        ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
5260
776
        if (ret != 0)
5261
0
            return ret;
5262
    #ifdef HAVE_PK_CALLBACKS
5263
        if (ssl->ctx->RsaPssSignCheckCb) {
5264
            /* The key buffer includes private/public portion,
5265
                but only public is used */
5266
            /* If HSM hardware is checking the signature result you can
5267
                optionally skip the sign check and return 0 */
5268
            /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
5269
            void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
5270
            ret = ssl->ctx->RsaPssSignCheckCb(ssl, verifySig, sigSz, &out,
5271
                                           TypeHash(hashAlgo), mgf,
5272
                                           keyBuf, keySz, ctx);
5273
            if (ret > 0) {
5274
                ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, (word32)ret,
5275
                                             hashType);
5276
                if (ret != 0) {
5277
                    ret = VERIFY_CERT_ERROR;
5278
                    WOLFSSL_ERROR_VERBOSE(ret);
5279
                }
5280
            }
5281
        }
5282
        else
5283
    #endif /* HAVE_PK_CALLBACKS */
5284
776
        {
5285
776
            ret = wc_RsaPSS_VerifyInline(verifySig, sigSz, &out, hashType, mgf,
5286
776
                                         key);
5287
776
            if (ret > 0) {
5288
    #ifdef HAVE_SELFTEST
5289
                ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
5290
                                             hashType);
5291
    #else
5292
757
                ret = wc_RsaPSS_CheckPadding_ex(plain, plainSz, out, (word32)ret,
5293
757
                                                hashType, -1,
5294
757
                                                mp_count_bits(&key->n));
5295
757
    #endif
5296
757
                if (ret != 0) {
5297
0
                    ret = VERIFY_CERT_ERROR;
5298
0
                    WOLFSSL_ERROR_VERBOSE(ret);
5299
0
                }
5300
757
            }
5301
776
        }
5302
5303
776
    }
5304
6.17k
    else
5305
6.17k
#endif /* WC_RSA_PSS */
5306
6.17k
    {
5307
    #ifdef HAVE_PK_CALLBACKS
5308
        if (ssl->ctx->RsaSignCheckCb) {
5309
            /* The key buffer includes private/public portion,
5310
                but only public is used */
5311
            /* If HSM hardware is checking the signature result you can
5312
                optionally skip the sign check and return 0 */
5313
            /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
5314
            void* ctx = wolfSSL_GetRsaSignCtx(ssl);
5315
            ret = ssl->ctx->RsaSignCheckCb(ssl, verifySig, sigSz, &out,
5316
                keyBuf, keySz, ctx);
5317
        }
5318
        else
5319
    #endif /* HAVE_PK_CALLBACKS */
5320
6.17k
        {
5321
6.17k
            ret = wc_RsaSSL_VerifyInline(verifySig, sigSz, &out, key);
5322
6.17k
        }
5323
5324
6.17k
        if (ret > 0) {
5325
6.17k
            if (ret != (int)plainSz || !out ||
5326
6.17k
                                            XMEMCMP(plain, out, plainSz) != 0) {
5327
0
                WOLFSSL_MSG("RSA Signature verification failed");
5328
0
                ret = RSA_SIGN_FAULT;
5329
0
                WOLFSSL_ERROR_VERBOSE(ret);
5330
0
            }
5331
6.17k
            else {
5332
6.17k
                ret = 0;  /* RSA reset */
5333
6.17k
            }
5334
6.17k
        }
5335
6.17k
    }
5336
5337
    /* Handle async pending response */
5338
#ifdef WOLFSSL_ASYNC_CRYPT
5339
    if (key && ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
5340
        ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
5341
    }
5342
#endif /* WOLFSSL_ASYNC_CRYPT */
5343
5344
6.95k
    WOLFSSL_LEAVE("VerifyRsaSign", ret);
5345
5346
6.95k
    return ret;
5347
6.95k
}
5348
5349
#ifndef WOLFSSL_NO_TLS12
5350
5351
#if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
5352
int RsaDec(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, word32* outSz,
5353
    RsaKey* key, DerBuffer* keyBufInfo)
5354
0
{
5355
0
    byte *outTmp;
5356
0
    byte mask;
5357
0
    int ret;
5358
#ifdef HAVE_PK_CALLBACKS
5359
    const byte* keyBuf = NULL;
5360
    word32 keySz = 0;
5361
5362
    if (keyBufInfo) {
5363
        keyBuf = keyBufInfo->buffer;
5364
        keySz = keyBufInfo->length;
5365
    }
5366
#endif
5367
5368
0
    (void)ssl;
5369
0
    (void)keyBufInfo;
5370
5371
0
    WOLFSSL_ENTER("RsaDec");
5372
5373
0
    outTmp = *out;
5374
#ifdef WOLFSSL_ASYNC_CRYPT
5375
    /* initialize event */
5376
    ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
5377
    if (ret != 0)
5378
        return ret;
5379
#endif
5380
5381
#ifdef HAVE_PK_CALLBACKS
5382
    if (ssl->ctx->RsaDecCb) {
5383
        void* ctx = wolfSSL_GetRsaDecCtx(ssl);
5384
        ret = ssl->ctx->RsaDecCb(ssl, in, inSz, &outTmp, keyBuf, keySz, ctx);
5385
    }
5386
    else
5387
#endif /* HAVE_PK_CALLBACKS */
5388
0
    {
5389
0
        #ifdef WC_RSA_BLINDING
5390
0
            ret = wc_RsaSetRNG(key, ssl->rng);
5391
0
            if (ret != 0)
5392
0
                return ret;
5393
0
        #endif
5394
0
        ret = wc_RsaPrivateDecryptInline(in, inSz, &outTmp, key);
5395
0
    }
5396
5397
    /* Handle async pending response */
5398
#ifdef WOLFSSL_ASYNC_CRYPT
5399
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
5400
        ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
5401
    }
5402
#endif /* WOLFSSL_ASYNC_CRYPT */
5403
5404
0
    mask = ctMaskGT(ret, 0);
5405
0
    *outSz = (word32)(ret & (int)(sword8)mask);
5406
0
    ret &= (int)(sword8)(~mask);
5407
    /* Copy pointer */
5408
0
    ctMaskCopy(mask, (byte*)out, (byte*)&outTmp, sizeof(*out));
5409
5410
0
    WOLFSSL_LEAVE("RsaDec", ret);
5411
5412
0
    return ret;
5413
0
}
5414
#endif /* !NO_WOLFSSL_SERVER) || !WOLFSSL_NO_CLIENT_AUTH */
5415
5416
int RsaEnc(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out, word32* outSz,
5417
    RsaKey* key, buffer* keyBufInfo)
5418
0
{
5419
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
5420
#ifdef HAVE_PK_CALLBACKS
5421
    const byte* keyBuf = NULL;
5422
    word32 keySz = 0;
5423
5424
    if (keyBufInfo) {
5425
        keyBuf = keyBufInfo->buffer;
5426
        keySz = keyBufInfo->length;
5427
    }
5428
#endif
5429
5430
0
    (void)ssl;
5431
0
    (void)keyBufInfo;
5432
5433
0
    WOLFSSL_ENTER("RsaEnc");
5434
5435
#ifdef WOLFSSL_ASYNC_CRYPT
5436
    /* initialize event */
5437
    ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
5438
    if (ret != 0)
5439
        return ret;
5440
#endif
5441
5442
#ifdef HAVE_PK_CALLBACKS
5443
    if (ssl->ctx->RsaEncCb) {
5444
        void* ctx = wolfSSL_GetRsaEncCtx(ssl);
5445
        ret = ssl->ctx->RsaEncCb(ssl, in, inSz, out, outSz, keyBuf, keySz, ctx);
5446
    }
5447
    #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \
5448
        !defined(WOLFSSL_RENESAS_TSIP_TLS)
5449
    else
5450
    #else
5451
    if (!ssl->ctx->RsaEncCb || ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
5452
    #endif
5453
#endif /* HAVE_PK_CALLBACKS */
5454
0
    {
5455
0
        ret = wc_RsaPublicEncrypt(in, inSz, out, *outSz, key, ssl->rng);
5456
0
    }
5457
5458
    /* Handle async pending response */
5459
#ifdef WOLFSSL_ASYNC_CRYPT
5460
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
5461
        ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
5462
    }
5463
#endif /* WOLFSSL_ASYNC_CRYPT */
5464
5465
    /* For positive response return in outSz */
5466
0
    if (ret > 0) {
5467
0
        *outSz = (word32)ret;
5468
0
        ret = 0;
5469
0
    }
5470
5471
0
    WOLFSSL_LEAVE("RsaEnc", ret);
5472
5473
0
    return ret;
5474
0
}
5475
5476
#endif /* !WOLFSSL_NO_TLS12 */
5477
5478
#endif /* NO_RSA */
5479
5480
#ifdef HAVE_ECC
5481
5482
int EccSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
5483
    word32* outSz, ecc_key* key, DerBuffer* keyBufInfo)
5484
0
{
5485
0
    int ret;
5486
#ifdef HAVE_PK_CALLBACKS
5487
    const byte* keyBuf = NULL;
5488
    word32 keySz = 0;
5489
5490
    if (keyBufInfo) {
5491
        keyBuf = keyBufInfo->buffer;
5492
        keySz = keyBufInfo->length;
5493
    }
5494
#endif
5495
5496
0
    (void)ssl;
5497
0
    (void)keyBufInfo;
5498
5499
0
    WOLFSSL_ENTER("EccSign");
5500
5501
#ifdef WOLFSSL_ASYNC_CRYPT
5502
    /* initialize event */
5503
    if (key) {
5504
        ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
5505
        if (ret != 0)
5506
            return ret;
5507
    }
5508
#endif
5509
5510
#if defined(HAVE_PK_CALLBACKS)
5511
    if (ssl->ctx->EccSignCb) {
5512
        void* ctx = wolfSSL_GetEccSignCtx(ssl);
5513
        if (ctx == NULL) {
5514
            /* Try to get the WOLFSSL_CTX EccSignCtx*/
5515
            ctx = wolfSSL_CTX_GetEccSignCtx(ssl->ctx);
5516
        }
5517
        ret = ssl->ctx->EccSignCb(ssl, in, inSz, out, outSz, keyBuf,
5518
            keySz, ctx);
5519
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
5520
        if (ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
5521
            ret = wc_ecc_sign_hash(in, inSz, out, outSz, ssl->rng, key);
5522
        }
5523
#endif /* WOLFSSL_RENESAS_TSIP_TLS */
5524
    }
5525
    else
5526
#endif /* HAVE_PK_CALLBACKS */
5527
0
    {
5528
0
        ret = wc_ecc_sign_hash(in, inSz, out, outSz, ssl->rng, key);
5529
0
    }
5530
5531
    /* Handle async pending response */
5532
#ifdef WOLFSSL_ASYNC_CRYPT
5533
    if (key && ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
5534
        ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
5535
    }
5536
#endif /* WOLFSSL_ASYNC_CRYPT */
5537
5538
0
    WOLFSSL_LEAVE("EccSign", ret);
5539
5540
0
    return ret;
5541
0
}
5542
5543
int EccVerify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* out,
5544
    word32 outSz, ecc_key* key, buffer* keyBufInfo)
5545
0
{
5546
0
    int ret = WC_NO_ERR_TRACE(SIG_VERIFY_E);
5547
#ifdef HAVE_PK_CALLBACKS
5548
    const byte* keyBuf = NULL;
5549
    word32 keySz = 0;
5550
5551
    if (keyBufInfo) {
5552
        keyBuf = keyBufInfo->buffer;
5553
        keySz = keyBufInfo->length;
5554
    }
5555
#endif
5556
5557
0
    (void)ssl;
5558
0
    (void)keyBufInfo;
5559
5560
0
    WOLFSSL_ENTER("EccVerify");
5561
5562
#ifdef WOLFSSL_ASYNC_CRYPT
5563
    /* initialize event */
5564
    ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
5565
    if (ret != 0)
5566
        return ret;
5567
#endif
5568
5569
#ifdef HAVE_PK_CALLBACKS
5570
    if (ssl->ctx->EccVerifyCb) {
5571
        void* ctx = wolfSSL_GetEccVerifyCtx(ssl);
5572
        ret = ssl->ctx->EccVerifyCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
5573
            &ssl->eccVerifyRes, ctx);
5574
    }
5575
    #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \
5576
        !defined(WOLFSSL_RENESAS_TSIP_TLS) && \
5577
        !defined(WOLFSSL_MAXQ108X)
5578
    else
5579
    #else
5580
    if (!ssl->ctx->EccVerifyCb || ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
5581
    #endif
5582
#endif /* HAVE_PK_CALLBACKS  */
5583
0
    {
5584
0
        ret = wc_ecc_verify_hash(in, inSz, out, outSz, &ssl->eccVerifyRes, key);
5585
0
    }
5586
5587
    /* Handle async pending response */
5588
#ifdef WOLFSSL_ASYNC_CRYPT
5589
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
5590
        ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
5591
    }
5592
    else
5593
#endif /* WOLFSSL_ASYNC_CRYPT */
5594
0
    {
5595
0
        if (ret != 0 || ssl->eccVerifyRes == 0) {
5596
0
            if (ret == 0) {
5597
0
                ret = VERIFY_SIGN_ERROR;
5598
0
            }
5599
0
            WOLFSSL_ERROR_VERBOSE(ret);
5600
0
        }
5601
0
        else {
5602
0
            ret = 0;
5603
0
        }
5604
0
    }
5605
5606
0
    WOLFSSL_LEAVE("EccVerify", ret);
5607
5608
0
    return ret;
5609
0
}
5610
5611
int EccSharedSecret(WOLFSSL* ssl, ecc_key* priv_key, ecc_key* pub_key,
5612
        byte* pubKeyDer, word32* pubKeySz, byte* out, word32* outlen,
5613
        int side)
5614
897
{
5615
897
    int ret;
5616
#ifdef WOLFSSL_ASYNC_CRYPT
5617
    WC_ASYNC_DEV* asyncDev = NULL;
5618
#endif
5619
5620
897
    (void)ssl;
5621
897
    (void)pubKeyDer;
5622
897
    (void)pubKeySz;
5623
897
    (void)side;
5624
5625
897
    WOLFSSL_ENTER("EccSharedSecret");
5626
5627
#ifdef WOLFSSL_ASYNC_CRYPT
5628
    /* initialize event */
5629
    if (priv_key != NULL) {
5630
        asyncDev = &priv_key->asyncDev;
5631
        ret = wolfSSL_AsyncInit(ssl, asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
5632
        if (ret != 0)
5633
            return ret;
5634
    }
5635
#endif
5636
5637
#ifdef HAVE_PK_CALLBACKS
5638
    if (ssl->ctx->EccSharedSecretCb) {
5639
        void* ctx = wolfSSL_GetEccSharedSecretCtx(ssl);
5640
        ecc_key* otherKey = (side == WOLFSSL_CLIENT_END) ? pub_key : priv_key;
5641
        ret = ssl->ctx->EccSharedSecretCb(ssl, otherKey, pubKeyDer,
5642
            pubKeySz, out, outlen, side, ctx);
5643
    }
5644
    else
5645
#endif
5646
897
    {
5647
897
#if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \
5648
897
    !defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2)) && \
5649
897
    !defined(HAVE_SELFTEST)
5650
897
        ret = wc_ecc_set_rng(priv_key, ssl->rng);
5651
897
        if (ret == 0)
5652
897
#endif
5653
897
        {
5654
897
            PRIVATE_KEY_UNLOCK();
5655
897
            ret = wc_ecc_shared_secret(priv_key, pub_key, out, outlen);
5656
897
            PRIVATE_KEY_LOCK();
5657
897
        }
5658
897
    }
5659
5660
    /* Handle async pending response */
5661
#ifdef WOLFSSL_ASYNC_CRYPT
5662
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
5663
        ret = wolfSSL_AsyncPush(ssl, asyncDev);
5664
    }
5665
#endif /* WOLFSSL_ASYNC_CRYPT */
5666
5667
897
    WOLFSSL_LEAVE("EccSharedSecret", ret);
5668
5669
897
    return ret;
5670
897
}
5671
5672
int EccMakeKey(WOLFSSL* ssl, ecc_key* key, ecc_key* peer)
5673
0
{
5674
0
    int ret = 0;
5675
0
    int keySz = 0;
5676
0
    int ecc_curve = ECC_CURVE_DEF;
5677
5678
0
    WOLFSSL_ENTER("EccMakeKey");
5679
5680
#ifdef WOLFSSL_ASYNC_CRYPT
5681
    /* initialize event */
5682
    ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
5683
    if (ret != 0)
5684
        return ret;
5685
#endif
5686
5687
    /* get key size */
5688
0
    if (peer == NULL || peer->dp == NULL) {
5689
0
        keySz = ssl->eccTempKeySz;
5690
        /* get curve type */
5691
0
        if (ssl->ecdhCurveOID > 0) {
5692
0
            ecc_curve = wc_ecc_get_oid(ssl->ecdhCurveOID, NULL, NULL);
5693
0
        }
5694
0
    #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && \
5695
0
        (defined(WOLFSSL_SM4_CBC) || defined(WOLFSSL_SM4_GCM) || \
5696
0
         defined(WOLFSSL_SM4_CCM))
5697
0
        if ((ssl->options.cipherSuite0 == SM_BYTE) && (0
5698
0
        #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
5699
0
            || (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3)
5700
0
        #endif
5701
0
        #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
5702
0
            || (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3)
5703
0
        #endif
5704
0
        #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
5705
0
            || (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3)
5706
0
        #endif
5707
0
            )) {
5708
0
            keySz = 32;
5709
0
            ecc_curve = ECC_SM2P256V1;
5710
0
        }
5711
0
    #endif
5712
0
    }
5713
0
    else {
5714
0
        keySz = peer->dp->size;
5715
0
        ecc_curve = peer->dp->id;
5716
0
    }
5717
5718
#ifdef HAVE_PK_CALLBACKS
5719
    if (ssl->ctx->EccKeyGenCb) {
5720
        void* ctx = wolfSSL_GetEccKeyGenCtx(ssl);
5721
        ret = ssl->ctx->EccKeyGenCb(ssl, key, (unsigned int)keySz, ecc_curve, ctx);
5722
    }
5723
    else
5724
#endif
5725
0
    {
5726
0
        ret = wc_ecc_make_key_ex(ssl->rng, keySz, key, ecc_curve);
5727
0
    }
5728
5729
    /* make sure the curve is set for TLS */
5730
0
    if (ret == 0 && key->dp) {
5731
0
        ssl->ecdhCurveOID = key->dp->oidSum;
5732
0
    #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
5733
0
        ssl->namedGroup = 0;
5734
0
    #endif
5735
0
    }
5736
5737
    /* Handle async pending response */
5738
#ifdef WOLFSSL_ASYNC_CRYPT
5739
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
5740
        ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
5741
    }
5742
#endif /* WOLFSSL_ASYNC_CRYPT */
5743
5744
0
    WOLFSSL_LEAVE("EccMakeKey", ret);
5745
5746
0
    return ret;
5747
0
}
5748
#endif /* HAVE_ECC */
5749
5750
#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
5751
5752
int Sm2wSm3Sign(WOLFSSL* ssl, const byte* id, word32 idSz, const byte* in,
5753
    word32 inSz, byte* out, word32* outSz, ecc_key* key, DerBuffer* keyBufInfo)
5754
0
{
5755
0
    int ret;
5756
0
    byte hash[WC_SM3_DIGEST_SIZE];
5757
5758
0
    (void)ssl;
5759
0
    (void)keyBufInfo;
5760
5761
0
    WOLFSSL_ENTER("Sm2wSm3Sign");
5762
5763
0
    ret = wc_ecc_sm2_create_digest(id, idSz, in, inSz, WC_HASH_TYPE_SM3, hash,
5764
0
        sizeof(hash), key);
5765
0
    if (ret == 0) {
5766
0
        ret = wc_ecc_sm2_sign_hash(hash, sizeof(hash), out, outSz, ssl->rng,
5767
0
            key);
5768
0
    }
5769
5770
0
    WOLFSSL_LEAVE("Sm2wSm3Sign", ret);
5771
5772
0
    return ret;
5773
0
}
5774
5775
int Sm2wSm3Verify(WOLFSSL* ssl, const byte* id, word32 idSz, const byte* sig,
5776
    word32 sigSz, const byte* msg, word32 msgSz, ecc_key* key,
5777
    buffer* keyBufInfo)
5778
0
{
5779
0
    int ret = WC_NO_ERR_TRACE(SIG_VERIFY_E);
5780
0
    byte hash[WC_SM3_DIGEST_SIZE];
5781
5782
0
    (void)ssl;
5783
0
    (void)keyBufInfo;
5784
5785
0
    WOLFSSL_ENTER("Sm2wSm3Verify");
5786
5787
0
    ret = wc_ecc_sm2_create_digest(id, idSz, msg, msgSz, WC_HASH_TYPE_SM3, hash,
5788
0
        sizeof(hash), key);
5789
0
    if (ret == 0) {
5790
0
        ret = wc_ecc_sm2_verify_hash(sig, sigSz, hash, sizeof(hash),
5791
0
            &ssl->eccVerifyRes, key);
5792
0
        if (ret == 0 && ssl->eccVerifyRes == 0) {
5793
0
            ret = VERIFY_SIGN_ERROR;
5794
0
        }
5795
0
    }
5796
0
    if (ret != 0) {
5797
0
        WOLFSSL_ERROR_VERBOSE(ret);
5798
0
    }
5799
5800
0
    WOLFSSL_LEAVE("Sm2wSm3Verify", ret);
5801
5802
0
    return ret;
5803
0
}
5804
5805
#endif /* WOLFSSL_SM2 && WOLFSSL_SM3 */
5806
5807
#ifdef HAVE_ED25519
5808
/* Check whether the key contains a public key.
5809
 * If not then pull it out of the leaf certificate.
5810
 *
5811
 * ssl  SSL/TLS object.
5812
 * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
5813
 * 0 on success.
5814
 */
5815
int Ed25519CheckPubKey(WOLFSSL* ssl)
5816
0
{
5817
#ifndef HAVE_ED25519_KEY_IMPORT
5818
    (void)ssl;
5819
    return NOT_COMPILED_IN;
5820
#else /* HAVE_ED25519_KEY_IMPORT */
5821
0
    ed25519_key* key = (ed25519_key*)ssl->hsKey;
5822
0
    int ret = 0;
5823
5824
    /* Public key required for signing. */
5825
0
    if (key != NULL && !key->pubKeySet) {
5826
0
        const unsigned char* pubKey;
5827
0
        word32 pubKeySz;
5828
5829
0
        ret = wc_CertGetPubKey(ssl->buffers.certificate->buffer,
5830
0
            ssl->buffers.certificate->length, &pubKey, &pubKeySz);
5831
0
        if (ret == 0) {
5832
0
            ret = wc_ed25519_import_public(pubKey, pubKeySz, key);
5833
0
        }
5834
0
    }
5835
5836
0
    return ret;
5837
0
#endif /* HAVE_ED25519_KEY_IMPORT */
5838
0
}
5839
5840
/* Sign the data using EdDSA and key using Ed25519.
5841
 *
5842
 * ssl    SSL object.
5843
 * in     Data or message to sign.
5844
 * inSz   Length of the data.
5845
 * out    Buffer to hold signature.
5846
 * outSz  On entry, size of the buffer. On exit, the size of the signature.
5847
 * key    The private Ed25519 key data.
5848
 * keySz  The length of the private key data in bytes.
5849
 * ctx    The callback context.
5850
 * returns 0 on success, otherwise the value is an error.
5851
 */
5852
int Ed25519Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
5853
                word32* outSz, ed25519_key* key, DerBuffer* keyBufInfo)
5854
0
{
5855
#ifndef HAVE_ED25519_SIGN
5856
    (void)ssl;
5857
    (void)in;
5858
    (void)inSz;
5859
    (void)out;
5860
    (void)outSz;
5861
    (void)key;
5862
    (void)keyBufInfo;
5863
    return NOT_COMPILED_IN;
5864
#else /* HAVE_ED25519_SIGN */
5865
0
    int ret;
5866
#ifdef HAVE_PK_CALLBACKS
5867
    const byte* keyBuf = NULL;
5868
    word32 keySz = 0;
5869
5870
    if (keyBufInfo) {
5871
        keyBuf = keyBufInfo->buffer;
5872
        keySz = keyBufInfo->length;
5873
    }
5874
#endif
5875
5876
0
    (void)ssl;
5877
0
    (void)keyBufInfo;
5878
5879
0
    WOLFSSL_ENTER("Ed25519Sign");
5880
5881
#ifdef WOLFSSL_ASYNC_CRYPT
5882
    /* initialize event */
5883
    ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
5884
    if (ret != 0)
5885
        return ret;
5886
#endif
5887
5888
#if defined(HAVE_PK_CALLBACKS)
5889
    if (ssl->ctx->Ed25519SignCb) {
5890
        void* ctx = wolfSSL_GetEd25519SignCtx(ssl);
5891
        ret = ssl->ctx->Ed25519SignCb(ssl, in, inSz, out, outSz, keyBuf,
5892
            keySz, ctx);
5893
    }
5894
    else
5895
#endif /* HAVE_PK_CALLBACKS */
5896
0
    {
5897
0
        ret = wc_ed25519_sign_msg(in, inSz, out, outSz, key);
5898
0
    }
5899
5900
    /* Handle async pending response */
5901
#ifdef WOLFSSL_ASYNC_CRYPT
5902
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
5903
        ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
5904
    }
5905
#endif /* WOLFSSL_ASYNC_CRYPT */
5906
5907
0
    WOLFSSL_LEAVE("Ed25519Sign", ret);
5908
5909
0
    return ret;
5910
0
#endif /* HAVE_ED25519_SIGN */
5911
0
}
5912
5913
/* Verify the data using EdDSA and key using Ed25519.
5914
 *
5915
 * ssl    SSL object.
5916
 * in     Signature data.
5917
 * inSz   Length of the signature data in bytes.
5918
 * msg    Message to verify.
5919
 * outSz  Length of message in bytes.
5920
 * key    The public Ed25519 key data.
5921
 * keySz  The length of the private key data in bytes.
5922
 * ctx    The callback context.
5923
 * returns 0 on success, otherwise the value is an error.
5924
 */
5925
int Ed25519Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
5926
                  word32 msgSz, ed25519_key* key, buffer* keyBufInfo)
5927
0
{
5928
#ifndef HAVE_ED25519_VERIFY
5929
    (void)ssl;
5930
    (void)in;
5931
    (void)inSz;
5932
    (void)msg;
5933
    (void)msgSz;
5934
    (void)key;
5935
    (void)keyBufInfo;
5936
    return NOT_COMPILED_IN;
5937
#else /* HAVE_ED25519_VERIFY */
5938
0
    int ret;
5939
#ifdef HAVE_PK_CALLBACKS
5940
    const byte* keyBuf = NULL;
5941
    word32 keySz = 0;
5942
5943
    if (keyBufInfo) {
5944
        keyBuf = keyBufInfo->buffer;
5945
        keySz = keyBufInfo->length;
5946
    }
5947
#endif
5948
5949
0
    (void)ssl;
5950
0
    (void)keyBufInfo;
5951
5952
0
    WOLFSSL_ENTER("Ed25519Verify");
5953
5954
#ifdef WOLFSSL_ASYNC_CRYPT
5955
    /* initialize event */
5956
    ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
5957
    if (ret != 0)
5958
        return ret;
5959
#endif
5960
5961
#ifdef HAVE_PK_CALLBACKS
5962
    if (ssl->ctx->Ed25519VerifyCb) {
5963
        void* ctx = wolfSSL_GetEd25519VerifyCtx(ssl);
5964
        ret = ssl->ctx->Ed25519VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf,
5965
                                        keySz, &ssl->eccVerifyRes, ctx);
5966
    }
5967
    else
5968
#endif /* HAVE_PK_CALLBACKS  */
5969
0
    {
5970
0
        ret = wc_ed25519_verify_msg(in, inSz, msg, msgSz,
5971
0
                                    &ssl->eccVerifyRes, key);
5972
0
    }
5973
5974
    /* Handle async pending response */
5975
#ifdef WOLFSSL_ASYNC_CRYPT
5976
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
5977
        ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
5978
    }
5979
    else
5980
#endif /* WOLFSSL_ASYNC_CRYPT */
5981
0
    {
5982
0
        ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
5983
0
    }
5984
5985
0
    WOLFSSL_LEAVE("Ed25519Verify", ret);
5986
5987
0
    return ret;
5988
0
#endif /* HAVE_ED25519_VERIFY */
5989
0
}
5990
#endif /* HAVE_ED25519 */
5991
5992
#if !defined(NO_TLS) && !defined(WOLFSSL_NO_TLS12)
5993
5994
#ifdef HAVE_CURVE25519
5995
#ifdef HAVE_PK_CALLBACKS
5996
    /* Gets X25519 key for shared secret callback testing
5997
     * Client side: returns peer key
5998
     * Server side: returns private key
5999
     */
6000
    static int X25519GetKey(WOLFSSL* ssl, curve25519_key** otherKey)
6001
    {
6002
        struct curve25519_key* tmpKey = NULL;
6003
6004
        if (ssl == NULL || otherKey == NULL) {
6005
            return BAD_FUNC_ARG;
6006
        }
6007
6008
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
6009
            if (!ssl->peerX25519Key || !ssl->peerX25519KeyPresent ||
6010
                                       !ssl->peerX25519Key->dp) {
6011
                return NO_PEER_KEY;
6012
            }
6013
            tmpKey = (struct curve25519_key*)ssl->peerX25519Key;
6014
        }
6015
        else if (ssl->options.side == WOLFSSL_SERVER_END) {
6016
            if (!ssl->eccTempKeyPresent) {
6017
                return NO_PRIVATE_KEY;
6018
            }
6019
            tmpKey = (struct curve25519_key*)ssl->eccTempKey;
6020
        }
6021
6022
        if (tmpKey) {
6023
            *otherKey = (curve25519_key *)tmpKey;
6024
            return 0;
6025
        }
6026
        else {
6027
            return NO_PEER_KEY;
6028
        }
6029
    }
6030
#endif /* HAVE_PK_CALLBACKS */
6031
6032
static int X25519SharedSecret(WOLFSSL* ssl, curve25519_key* priv_key,
6033
        curve25519_key* pub_key, byte* pubKeyDer, word32* pubKeySz,
6034
        byte* out, word32* outlen, int side)
6035
131
{
6036
131
    int ret;
6037
6038
131
    (void)ssl;
6039
131
    (void)pubKeyDer;
6040
131
    (void)pubKeySz;
6041
131
    (void)side;
6042
6043
131
    WOLFSSL_ENTER("X25519SharedSecret");
6044
6045
#ifdef WOLFSSL_ASYNC_CRYPT
6046
    /* initialize event */
6047
    ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
6048
    if (ret != 0)
6049
        return ret;
6050
#endif
6051
6052
#ifdef HAVE_PK_CALLBACKS
6053
    if (ssl->ctx->X25519SharedSecretCb) {
6054
        curve25519_key* otherKey = NULL;
6055
6056
        ret = X25519GetKey(ssl, &otherKey);
6057
        if (ret == 0) {
6058
            void* ctx = wolfSSL_GetX25519SharedSecretCtx(ssl);
6059
            ret = ssl->ctx->X25519SharedSecretCb(ssl, otherKey, pubKeyDer,
6060
                pubKeySz, out, outlen, side, ctx);
6061
        }
6062
    }
6063
    else
6064
#endif
6065
131
    {
6066
131
    #ifdef WOLFSSL_CURVE25519_BLINDING
6067
131
        ret = wc_curve25519_set_rng(priv_key, ssl->rng);
6068
131
        if (ret == 0)
6069
131
    #endif
6070
131
        {
6071
131
            ret = wc_curve25519_shared_secret_ex(priv_key, pub_key, out, outlen,
6072
131
                                                 EC25519_LITTLE_ENDIAN);
6073
131
        }
6074
131
    }
6075
6076
    /* Handle async pending response */
6077
#ifdef WOLFSSL_ASYNC_CRYPT
6078
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
6079
        ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
6080
    }
6081
#endif /* WOLFSSL_ASYNC_CRYPT */
6082
6083
131
    WOLFSSL_LEAVE("X25519SharedSecret", ret);
6084
6085
131
    return ret;
6086
131
}
6087
6088
static int X25519MakeKey(WOLFSSL* ssl, curve25519_key* key,
6089
        curve25519_key* peer)
6090
1.43k
{
6091
1.43k
    int ret = 0;
6092
6093
1.43k
    (void)peer;
6094
6095
1.43k
    WOLFSSL_ENTER("X25519MakeKey");
6096
6097
#ifdef WOLFSSL_ASYNC_CRYPT
6098
    /* initialize event */
6099
    ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
6100
    if (ret != 0)
6101
        return ret;
6102
#endif
6103
6104
#ifdef HAVE_PK_CALLBACKS
6105
    if (ssl->ctx->X25519KeyGenCb) {
6106
        void* ctx = wolfSSL_GetX25519KeyGenCtx(ssl);
6107
        ret = ssl->ctx->X25519KeyGenCb(ssl, key, CURVE25519_KEYSIZE, ctx);
6108
    }
6109
    else
6110
#endif
6111
1.43k
    {
6112
1.43k
        ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
6113
1.43k
    }
6114
6115
1.43k
    if (ret == 0) {
6116
1.35k
        ssl->ecdhCurveOID = ECC_X25519_OID;
6117
1.35k
    #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
6118
1.35k
        ssl->namedGroup = 0;
6119
1.35k
    #endif
6120
1.35k
    }
6121
6122
    /* Handle async pending response */
6123
#ifdef WOLFSSL_ASYNC_CRYPT
6124
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
6125
        ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
6126
    }
6127
#endif /* WOLFSSL_ASYNC_CRYPT */
6128
6129
1.43k
    WOLFSSL_LEAVE("X25519MakeKey", ret);
6130
6131
1.43k
    return ret;
6132
1.43k
}
6133
#endif /* HAVE_CURVE25519 */
6134
6135
#endif /* !NO_TLS && !WOLFSSL_NO_TLS12 */
6136
6137
#ifdef HAVE_ED448
6138
/* Check whether the key contains a public key.
6139
 * If not then pull it out of the leaf certificate.
6140
 *
6141
 * ssl  SSL/TLS object.
6142
 * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
6143
 * 0 on success.
6144
 */
6145
int Ed448CheckPubKey(WOLFSSL* ssl)
6146
0
{
6147
#ifndef HAVE_ED448_KEY_IMPORT
6148
    (void)ssl;
6149
    return NOT_COMPILED_IN;
6150
#else /* HAVE_ED448_KEY_IMPORT */
6151
0
    ed448_key* key = (ed448_key*)ssl->hsKey;
6152
0
    int ret = 0;
6153
6154
    /* Public key required for signing. */
6155
0
    if (key != NULL && !key->pubKeySet) {
6156
0
        const unsigned char* pubKey;
6157
0
        word32 pubKeySz;
6158
6159
0
        ret = wc_CertGetPubKey(ssl->buffers.certificate->buffer,
6160
0
            ssl->buffers.certificate->length, &pubKey, &pubKeySz);
6161
0
        if (ret == 0) {
6162
0
            ret = wc_ed448_import_public(pubKey, pubKeySz, key);
6163
0
        }
6164
0
    }
6165
6166
0
    return ret;
6167
0
#endif /* HAVE_ED448_KEY_IMPORT */
6168
0
}
6169
6170
/* Sign the data using EdDSA and key using Ed448.
6171
 *
6172
 * ssl    SSL object.
6173
 * in     Data or message to sign.
6174
 * inSz   Length of the data.
6175
 * out    Buffer to hold signature.
6176
 * outSz  On entry, size of the buffer. On exit, the size of the signature.
6177
 * key    The private Ed448 key data.
6178
 * keySz  The length of the private key data in bytes.
6179
 * ctx    The callback context.
6180
 * returns 0 on success, otherwise the value is an error.
6181
 */
6182
int Ed448Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
6183
              word32* outSz, ed448_key* key, DerBuffer* keyBufInfo)
6184
0
{
6185
#ifndef HAVE_ED448_SIGN
6186
    (void)ssl;
6187
    (void)in;
6188
    (void)inSz;
6189
    (void)out;
6190
    (void)outSz;
6191
    (void)key;
6192
    (void)keyBufInfo;
6193
    return NOT_COMPILED_IN;
6194
#else /* HAVE_ED448_SIGN */
6195
0
    int ret;
6196
#ifdef HAVE_PK_CALLBACKS
6197
    const byte* keyBuf = NULL;
6198
    word32 keySz = 0;
6199
6200
    if (keyBufInfo) {
6201
        keyBuf = keyBufInfo->buffer;
6202
        keySz = keyBufInfo->length;
6203
    }
6204
#endif
6205
6206
0
    (void)ssl;
6207
0
    (void)keyBufInfo;
6208
6209
0
    WOLFSSL_ENTER("Ed448Sign");
6210
6211
#ifdef WOLFSSL_ASYNC_CRYPT
6212
    /* initialize event */
6213
    ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
6214
    if (ret != 0)
6215
        return ret;
6216
#endif
6217
6218
#if defined(HAVE_PK_CALLBACKS)
6219
    if (ssl->ctx->Ed448SignCb) {
6220
        void* ctx = wolfSSL_GetEd448SignCtx(ssl);
6221
        ret = ssl->ctx->Ed448SignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
6222
            ctx);
6223
    }
6224
    else
6225
#endif /* HAVE_PK_CALLBACKS */
6226
0
    {
6227
0
        ret = wc_ed448_sign_msg(in, inSz, out, outSz, key, NULL, 0);
6228
0
    }
6229
6230
    /* Handle async pending response */
6231
#ifdef WOLFSSL_ASYNC_CRYPT
6232
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
6233
        ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
6234
    }
6235
#endif /* WOLFSSL_ASYNC_CRYPT */
6236
6237
0
    WOLFSSL_LEAVE("Ed448Sign", ret);
6238
6239
0
    return ret;
6240
0
#endif /* HAVE_ED448_SIGN */
6241
0
}
6242
6243
/* Verify the data using EdDSA and key using Ed448.
6244
 *
6245
 * ssl    SSL object.
6246
 * in     Signature data.
6247
 * inSz   Length of the signature data in bytes.
6248
 * msg    Message to verify.
6249
 * outSz  Length of message in bytes.
6250
 * key    The public Ed448 key data.
6251
 * keySz  The length of the private key data in bytes.
6252
 * ctx    The callback context.
6253
 * returns 0 on success, otherwise the value is an error.
6254
 */
6255
int Ed448Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
6256
                word32 msgSz, ed448_key* key, buffer* keyBufInfo)
6257
0
{
6258
#ifndef HAVE_ED448_VERIFY
6259
    (void)ssl;
6260
    (void)in;
6261
    (void)inSz;
6262
    (void)msg;
6263
    (void)msgSz;
6264
    (void)key;
6265
    (void)keyBufInfo;
6266
    return NOT_COMPILED_IN;
6267
#else /* HAVE_ED448_VERIFY */
6268
0
    int ret;
6269
#ifdef HAVE_PK_CALLBACKS
6270
    const byte* keyBuf = NULL;
6271
    word32 keySz = 0;
6272
6273
    if (keyBufInfo) {
6274
        keyBuf = keyBufInfo->buffer;
6275
        keySz = keyBufInfo->length;
6276
    }
6277
#endif
6278
6279
0
    (void)ssl;
6280
0
    (void)keyBufInfo;
6281
6282
0
    WOLFSSL_ENTER("Ed448Verify");
6283
6284
#ifdef WOLFSSL_ASYNC_CRYPT
6285
    /* initialize event */
6286
    ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
6287
    if (ret != 0)
6288
        return ret;
6289
#endif
6290
6291
#ifdef HAVE_PK_CALLBACKS
6292
    if (ssl->ctx->Ed448VerifyCb) {
6293
        void* ctx = wolfSSL_GetEd448VerifyCtx(ssl);
6294
        ret = ssl->ctx->Ed448VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf, keySz,
6295
             &ssl->eccVerifyRes, ctx);
6296
    }
6297
    else
6298
#endif /* HAVE_PK_CALLBACKS  */
6299
0
    {
6300
0
        ret = wc_ed448_verify_msg(in, inSz, msg, msgSz, &ssl->eccVerifyRes, key,
6301
0
            NULL, 0);
6302
0
    }
6303
6304
    /* Handle async pending response */
6305
#ifdef WOLFSSL_ASYNC_CRYPT
6306
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
6307
        ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
6308
    }
6309
    else
6310
#endif /* WOLFSSL_ASYNC_CRYPT */
6311
0
    {
6312
0
        ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
6313
0
    }
6314
6315
0
    WOLFSSL_LEAVE("Ed448Verify", ret);
6316
6317
0
    return ret;
6318
0
#endif /* HAVE_ED448_VERIFY */
6319
0
}
6320
#endif /* HAVE_ED448 */
6321
6322
#ifndef WOLFSSL_NO_TLS12
6323
6324
#ifdef HAVE_CURVE448
6325
#ifdef HAVE_PK_CALLBACKS
6326
    /* Gets X448 key for shared secret callback testing
6327
     * Client side: returns peer key
6328
     * Server side: returns private key
6329
     */
6330
    static int X448GetKey(WOLFSSL* ssl, curve448_key** otherKey)
6331
    {
6332
        struct curve448_key* tmpKey = NULL;
6333
6334
        if (ssl == NULL || otherKey == NULL) {
6335
            return BAD_FUNC_ARG;
6336
        }
6337
6338
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
6339
            if (!ssl->peerX448Key || !ssl->peerX448KeyPresent) {
6340
                return NO_PEER_KEY;
6341
            }
6342
            tmpKey = (struct curve448_key*)ssl->peerX448Key;
6343
        }
6344
        else if (ssl->options.side == WOLFSSL_SERVER_END) {
6345
            if (!ssl->eccTempKeyPresent) {
6346
                return NO_PRIVATE_KEY;
6347
            }
6348
            tmpKey = (struct curve448_key*)ssl->eccTempKey;
6349
        }
6350
6351
        if (tmpKey) {
6352
            *otherKey = (curve448_key *)tmpKey;
6353
            return 0;
6354
        }
6355
        else {
6356
            return NO_PEER_KEY;
6357
        }
6358
    }
6359
#endif /* HAVE_PK_CALLBACKS */
6360
6361
static int X448SharedSecret(WOLFSSL* ssl, curve448_key* priv_key,
6362
                            curve448_key* pub_key, byte* pubKeyDer,
6363
                            word32* pubKeySz, byte* out, word32* outlen,
6364
                            int side)
6365
32
{
6366
32
    int ret;
6367
6368
32
    (void)ssl;
6369
32
    (void)pubKeyDer;
6370
32
    (void)pubKeySz;
6371
32
    (void)side;
6372
6373
32
    WOLFSSL_ENTER("X448SharedSecret");
6374
6375
#ifdef WOLFSSL_ASYNC_CRYPT
6376
    /* initialize event */
6377
    ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
6378
    if (ret != 0)
6379
        return ret;
6380
#endif
6381
6382
#ifdef HAVE_PK_CALLBACKS
6383
    if (ssl->ctx->X448SharedSecretCb) {
6384
        curve448_key* otherKey = NULL;
6385
6386
        ret = X448GetKey(ssl, &otherKey);
6387
        if (ret == 0) {
6388
            void* ctx = wolfSSL_GetX448SharedSecretCtx(ssl);
6389
            ret = ssl->ctx->X448SharedSecretCb(ssl, otherKey, pubKeyDer,
6390
                pubKeySz, out, outlen, side, ctx);
6391
        }
6392
    }
6393
    else
6394
#endif
6395
32
    {
6396
32
        ret = wc_curve448_shared_secret_ex(priv_key, pub_key, out, outlen,
6397
32
            EC448_LITTLE_ENDIAN);
6398
32
    }
6399
6400
    /* Handle async pending response */
6401
#ifdef WOLFSSL_ASYNC_CRYPT
6402
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
6403
        ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
6404
    }
6405
#endif /* WOLFSSL_ASYNC_CRYPT */
6406
6407
32
    WOLFSSL_LEAVE("X448SharedSecret", ret);
6408
6409
32
    return ret;
6410
32
}
6411
6412
static int X448MakeKey(WOLFSSL* ssl, curve448_key* key, curve448_key* peer)
6413
570
{
6414
570
    int ret = 0;
6415
6416
570
    (void)peer;
6417
6418
570
    WOLFSSL_ENTER("X448MakeKey");
6419
6420
#ifdef WOLFSSL_ASYNC_CRYPT
6421
    /* initialize event */
6422
    ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
6423
    if (ret != 0)
6424
        return ret;
6425
#endif
6426
6427
#ifdef HAVE_PK_CALLBACKS
6428
    if (ssl->ctx->X448KeyGenCb) {
6429
        void* ctx = wolfSSL_GetX448KeyGenCtx(ssl);
6430
        ret = ssl->ctx->X448KeyGenCb(ssl, key, CURVE448_KEY_SIZE, ctx);
6431
    }
6432
    else
6433
#endif
6434
570
    {
6435
570
        ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
6436
570
    }
6437
6438
570
    if (ret == 0) {
6439
538
        ssl->ecdhCurveOID = ECC_X448_OID;
6440
538
    #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
6441
538
        ssl->namedGroup = 0;
6442
538
    #endif
6443
538
    }
6444
6445
    /* Handle async pending response */
6446
#ifdef WOLFSSL_ASYNC_CRYPT
6447
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
6448
        ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
6449
    }
6450
#endif /* WOLFSSL_ASYNC_CRYPT */
6451
6452
570
    WOLFSSL_LEAVE("X448MakeKey", ret);
6453
6454
570
    return ret;
6455
570
}
6456
#endif /* HAVE_CURVE448 */
6457
6458
#endif /* !WOLFSSL_NO_TLS12 */
6459
6460
#if !defined(NO_CERTS) || !defined(NO_PSK)
6461
#if !defined(NO_DH)
6462
6463
int DhGenKeyPair(WOLFSSL* ssl, DhKey* dhKey,
6464
    byte* priv, word32* privSz,
6465
    byte* pub, word32* pubSz)
6466
1.39k
{
6467
1.39k
    int ret;
6468
6469
1.39k
    WOLFSSL_ENTER("DhGenKeyPair");
6470
6471
1.39k
    if (ssl == NULL || dhKey == NULL) {
6472
0
        return BAD_FUNC_ARG;
6473
0
    }
6474
6475
#ifdef WOLFSSL_ASYNC_CRYPT
6476
    /* initialize event */
6477
    ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
6478
    if (ret != 0)
6479
        return ret;
6480
#endif
6481
6482
#if defined(HAVE_PK_CALLBACKS)
6483
    ret = NOT_COMPILED_IN;
6484
    if (ssl && ssl->ctx && ssl->ctx->DhGenerateKeyPairCb) {
6485
        ret = ssl->ctx->DhGenerateKeyPairCb(dhKey, ssl->rng, priv, privSz,
6486
                                            pub, pubSz);
6487
    }
6488
    if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN))
6489
#endif
6490
1.39k
    {
6491
1.39k
        PRIVATE_KEY_UNLOCK();
6492
1.39k
        ret = wc_DhGenerateKeyPair(dhKey, ssl->rng, priv, privSz, pub, pubSz);
6493
1.39k
        PRIVATE_KEY_LOCK();
6494
1.39k
    }
6495
6496
    /* Handle async pending response */
6497
#ifdef WOLFSSL_ASYNC_CRYPT
6498
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
6499
        ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
6500
    }
6501
#endif /* WOLFSSL_ASYNC_CRYPT */
6502
6503
1.39k
    WOLFSSL_LEAVE("DhGenKeyPair", ret);
6504
6505
1.39k
    return ret;
6506
1.39k
}
6507
6508
int DhAgree(WOLFSSL* ssl, DhKey* dhKey,
6509
    const byte* priv, word32 privSz,
6510
    const byte* otherPub, word32 otherPubSz,
6511
    byte* agree, word32* agreeSz,
6512
    const byte* prime, word32 primeSz)
6513
486
{
6514
486
    int ret;
6515
6516
486
    (void)ssl;
6517
6518
486
    WOLFSSL_ENTER("DhAgree");
6519
6520
#ifdef WOLFSSL_ASYNC_CRYPT
6521
    /* initialize event */
6522
    ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
6523
    if (ret != 0)
6524
        return ret;
6525
#endif
6526
6527
#ifdef HAVE_PK_CALLBACKS
6528
    if (ssl->ctx->DhAgreeCb) {
6529
        void* ctx = wolfSSL_GetDhAgreeCtx(ssl);
6530
6531
        WOLFSSL_MSG("Calling DhAgree Callback Function");
6532
        ret = ssl->ctx->DhAgreeCb(ssl, dhKey, priv, privSz,
6533
                    otherPub, otherPubSz, agree, agreeSz, ctx);
6534
    }
6535
    else
6536
#endif
6537
486
    {
6538
486
#if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
6539
        /* check the public key has valid number */
6540
486
        if (dhKey != NULL && (prime == NULL || primeSz == 0)) {
6541
            /* wc_DhCheckPubKey does not do exponentiation */
6542
107
            ret = wc_DhCheckPubKey(dhKey, otherPub, otherPubSz);
6543
107
        }
6544
379
        else {
6545
379
            ret = wc_DhCheckPubValue(prime, primeSz, otherPub, otherPubSz);
6546
379
        }
6547
486
        if (ret != 0) {
6548
            /* translate to valid error (wc_DhCheckPubValue returns MP_VAL -1) */
6549
253
            ret = PEER_KEY_ERROR;
6550
253
            WOLFSSL_ERROR_VERBOSE(ret);
6551
6552
    #ifdef OPENSSL_EXTRA
6553
            SendAlert(ssl, alert_fatal, illegal_parameter);
6554
    #endif
6555
253
        }
6556
233
        else
6557
233
#endif
6558
233
        {
6559
233
            PRIVATE_KEY_UNLOCK();
6560
233
            ret = wc_DhAgree(dhKey, agree, agreeSz, priv, privSz, otherPub,
6561
233
                    otherPubSz);
6562
233
            PRIVATE_KEY_LOCK();
6563
233
        }
6564
486
    }
6565
6566
    /* Handle async pending response */
6567
#ifdef WOLFSSL_ASYNC_CRYPT
6568
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
6569
        ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
6570
    }
6571
#endif /* WOLFSSL_ASYNC_CRYPT */
6572
6573
486
    WOLFSSL_LEAVE("DhAgree", ret);
6574
6575
486
    (void)prime;
6576
486
    (void)primeSz;
6577
6578
486
    return ret;
6579
486
}
6580
#endif /* !NO_DH */
6581
#endif /* !NO_CERTS || !NO_PSK */
6582
6583
6584
#ifdef HAVE_PK_CALLBACKS
6585
int wolfSSL_IsPrivatePkSet(WOLFSSL* ssl)
6586
{
6587
    int pkcbset = 0;
6588
    (void)ssl;
6589
6590
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
6591
                                                                !defined(NO_RSA)
6592
    if (0
6593
    #ifdef HAVE_ECC
6594
        || (ssl->ctx->EccSignCb != NULL &&
6595
                                        ssl->buffers.keyType == ecc_dsa_sa_algo)
6596
    #endif
6597
    #ifdef HAVE_ED25519
6598
        || (ssl->ctx->Ed25519SignCb != NULL &&
6599
                                        ssl->buffers.keyType == ed25519_sa_algo)
6600
    #endif
6601
    #ifdef HAVE_ED448
6602
        || (ssl->ctx->Ed448SignCb != NULL &&
6603
                                          ssl->buffers.keyType == ed448_sa_algo)
6604
    #endif
6605
    #ifndef NO_RSA
6606
        || (ssl->ctx->RsaSignCb != NULL && ssl->buffers.keyType == rsa_sa_algo)
6607
        || (ssl->ctx->RsaDecCb != NULL && ssl->buffers.keyType == rsa_kea)
6608
        #ifdef WC_RSA_PSS
6609
        || (ssl->ctx->RsaPssSignCb != NULL &&
6610
                                        ssl->buffers.keyType == rsa_pss_sa_algo)
6611
        #endif
6612
    #endif
6613
    ) {
6614
        pkcbset = 1;
6615
    }
6616
#endif
6617
    return pkcbset;
6618
}
6619
6620
int wolfSSL_CTX_IsPrivatePkSet(WOLFSSL_CTX* ctx)
6621
{
6622
    int pkcbset = 0;
6623
    (void)ctx;
6624
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
6625
                                                                !defined(NO_RSA)
6626
    if (0
6627
    #ifdef HAVE_ECC
6628
        || ctx->EccSignCb != NULL
6629
    #endif
6630
    #ifdef HAVE_ED25519
6631
        || ctx->Ed25519SignCb != NULL
6632
    #endif
6633
    #ifdef HAVE_ED448
6634
        || ctx->Ed448SignCb != NULL
6635
    #endif
6636
    #ifndef NO_RSA
6637
        || ctx->RsaSignCb != NULL
6638
        || ctx->RsaDecCb != NULL
6639
        #ifdef WC_RSA_PSS
6640
        || ctx->RsaPssSignCb != NULL
6641
        #endif
6642
    #endif
6643
    ) {
6644
        pkcbset = 1;
6645
    }
6646
#endif
6647
    return pkcbset;
6648
}
6649
#endif /* HAVE_PK_CALLBACKS */
6650
6651
static void InitSuites_EitherSide(Suites* suites, ProtocolVersion pv, int keySz,
6652
        word16 haveRSA, word16 havePSK, word16 haveDH, word16 haveECDSAsig,
6653
        word16 haveECC, word16 haveStaticECC,
6654
        word16 haveAnon,
6655
        int side)
6656
0
{
6657
    /* make sure server has DH params, and add PSK if there */
6658
0
    if (side == WOLFSSL_SERVER_END) {
6659
0
        InitSuites(suites, pv, keySz, haveRSA, havePSK, haveDH, haveECDSAsig,
6660
0
                   haveECC, TRUE, haveStaticECC,
6661
0
                   haveAnon, TRUE, TRUE, TRUE, TRUE, side);
6662
0
    }
6663
0
    else {
6664
0
        InitSuites(suites, pv, keySz, haveRSA, havePSK, TRUE, haveECDSAsig,
6665
0
                   haveECC, TRUE, haveStaticECC,
6666
0
                   haveAnon, TRUE, TRUE, TRUE, TRUE, side);
6667
0
    }
6668
0
}
6669
6670
void InitSSL_CTX_Suites(WOLFSSL_CTX* ctx)
6671
0
{
6672
0
    int keySz = 0;
6673
0
    byte havePSK = 0;
6674
0
    byte haveAnon = 0;
6675
0
    byte haveRSA = 0;
6676
0
#ifndef NO_RSA
6677
0
    haveRSA = 1;
6678
0
#endif
6679
#ifndef NO_PSK
6680
    havePSK = ctx->havePSK;
6681
#endif /* NO_PSK */
6682
#ifdef HAVE_ANON
6683
    haveAnon = ctx->useAnon;
6684
#endif /* HAVE_ANON*/
6685
0
#ifndef NO_CERTS
6686
0
    keySz = ctx->privateKeySz;
6687
0
#endif
6688
0
    InitSuites_EitherSide(ctx->suites, ctx->method->version, keySz,
6689
0
            haveRSA, havePSK, ctx->haveDH, ctx->haveECDSAsig, ctx->haveECC,
6690
0
            ctx->haveStaticECC,
6691
0
            haveAnon, ctx->method->side);
6692
0
}
6693
6694
int InitSSL_Suites(WOLFSSL* ssl)
6695
0
{
6696
0
    int keySz = 0;
6697
0
    byte havePSK = 0;
6698
0
    byte haveAnon = 0;
6699
0
    byte haveRSA = 0;
6700
0
    byte haveMcast = 0;
6701
6702
0
    (void)haveAnon; /* Squash unused var warnings */
6703
0
    (void)haveMcast;
6704
6705
0
    if (!ssl)
6706
0
        return BAD_FUNC_ARG;
6707
6708
0
#ifndef NO_RSA
6709
0
    haveRSA = 1;
6710
0
#endif
6711
#ifndef NO_PSK
6712
    havePSK = (byte)ssl->options.havePSK;
6713
#endif /* NO_PSK */
6714
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT)
6715
#ifdef HAVE_ANON
6716
    haveAnon = (byte)ssl->options.useAnon;
6717
#endif /* HAVE_ANON*/
6718
#ifdef WOLFSSL_MULTICAST
6719
    haveMcast = (byte)ssl->options.haveMcast;
6720
#endif /* WOLFSSL_MULTICAST */
6721
0
#endif /* !NO_CERTS && !WOLFSSL_SESSION_EXPORT */
6722
6723
#ifdef WOLFSSL_EARLY_DATA
6724
    if (ssl->options.side == WOLFSSL_SERVER_END)
6725
        ssl->options.maxEarlyDataSz = ssl->ctx->maxEarlyDataSz;
6726
#endif
6727
0
#if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
6728
0
               ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \
6729
0
                (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
6730
0
                (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
6731
0
    ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
6732
0
                                      ssl->buffers.keyType == ed25519_sa_algo ||
6733
0
                                      ssl->buffers.keyType == ed448_sa_algo ||
6734
0
                                      ssl->buffers.keyType == sm2_sa_algo;
6735
0
#endif
6736
6737
0
#ifndef NO_CERTS
6738
0
    keySz = ssl->buffers.keySz;
6739
0
#endif
6740
6741
0
    if (ssl->suites != NULL) {
6742
0
        InitSuites_EitherSide(ssl->suites, ssl->version, keySz, haveRSA,
6743
0
                havePSK, ssl->options.haveDH, ssl->options.haveECDSAsig,
6744
0
                ssl->options.haveECC, ssl->options.haveStaticECC,
6745
0
                ssl->options.useAnon, ssl->options.side);
6746
0
    }
6747
6748
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT)
6749
    /* make sure server has cert and key unless using PSK, Anon, or
6750
     * Multicast. This should be true even if just switching ssl ctx */
6751
0
    if (ssl->options.side == WOLFSSL_SERVER_END &&
6752
0
            !havePSK && !haveAnon && !haveMcast) {
6753
6754
        /* server certificate must be loaded */
6755
0
        if (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer) {
6756
0
            WOLFSSL_MSG("Server missing certificate");
6757
0
            WOLFSSL_ERROR_VERBOSE(NO_PRIVATE_KEY);
6758
0
            return NO_PRIVATE_KEY;
6759
0
        }
6760
6761
0
        if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
6762
            /* allow no private key if using existing key */
6763
0
        #ifdef WOLF_PRIVATE_KEY_ID
6764
0
            if (ssl->devId != INVALID_DEVID
6765
            #ifdef HAVE_PK_CALLBACKS
6766
                || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
6767
            #endif
6768
0
            ) {
6769
0
                WOLFSSL_MSG("Allowing no server private key (external)");
6770
0
            }
6771
0
            else
6772
0
        #endif
6773
0
            {
6774
0
                WOLFSSL_MSG("Server missing private key");
6775
0
                WOLFSSL_ERROR_VERBOSE(NO_PRIVATE_KEY);
6776
0
                return NO_PRIVATE_KEY;
6777
0
            }
6778
0
        }
6779
0
    }
6780
0
#endif
6781
6782
0
    return WOLFSSL_SUCCESS;
6783
0
}
6784
6785
/* This function inherits a WOLFSSL_CTX's fields into an SSL object.
6786
   It is used during initialization and to switch an ssl's CTX with
6787
   wolfSSL_Set_SSL_CTX.  Requires ssl->suites alloc and ssl-arrays with PSK
6788
   unless writeDup is on.
6789
6790
   ssl      object to initialize
6791
   ctx      parent factory
6792
   writeDup flag indicating this is a write dup only
6793
6794
   WOLFSSL_SUCCESS return value on success */
6795
int SetSSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
6796
0
{
6797
0
    int ret = WOLFSSL_SUCCESS; /* set default ret */
6798
0
    byte newSSL;
6799
6800
0
    WOLFSSL_ENTER("SetSSL_CTX");
6801
0
    if (!ssl || !ctx)
6802
0
        return BAD_FUNC_ARG;
6803
6804
0
    newSSL = ssl->ctx == NULL; /* Assign after null check */
6805
6806
#ifndef NO_PSK
6807
    if (ctx->server_hint[0] && ssl->arrays == NULL && !writeDup) {
6808
        return BAD_FUNC_ARG;  /* needed for copy below */
6809
    }
6810
#endif
6811
6812
    /* decrement previous CTX reference count if exists.
6813
     * This should only happen if switching ctxs!*/
6814
0
    if (!newSSL) {
6815
0
        WOLFSSL_MSG("freeing old ctx to decrement reference count. Switching ctx.");
6816
0
        wolfSSL_CTX_free(ssl->ctx);
6817
0
    }
6818
6819
    /* increment CTX reference count */
6820
0
    ret = wolfSSL_CTX_up_ref(ctx);
6821
#ifdef WOLFSSL_REFCNT_ERROR_RETURN
6822
    if (ret != WOLFSSL_SUCCESS) {
6823
        return ret;
6824
    }
6825
#else
6826
0
    (void)ret;
6827
0
#endif
6828
6829
0
    ssl->ctx     = ctx; /* only for passing to calls, options could change */
6830
    /* Don't change version on a SSL object that has already started a
6831
     * handshake */
6832
#if defined(WOLFSSL_HAPROXY)
6833
    if (ssl->initial_ctx == NULL) {
6834
        ret = wolfSSL_CTX_up_ref(ctx);
6835
        if (ret == WOLFSSL_SUCCESS) {
6836
            ssl->initial_ctx = ctx; /* Save access to session key materials */
6837
        }
6838
        else {
6839
        #ifdef WOLFSSL_REFCNT_ERROR_RETURN
6840
            return ret;
6841
        #else
6842
            (void)ret;
6843
        #endif
6844
        }
6845
    }
6846
#endif
6847
0
    if (!ssl->msgsReceived.got_client_hello &&
6848
0
            !ssl->msgsReceived.got_server_hello)
6849
0
        ssl->version = ctx->method->version;
6850
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
6851
    ssl->options.mask = ctx->mask;
6852
    ssl->options.minProto = ctx->minProto;
6853
    ssl->options.maxProto = ctx->maxProto;
6854
#endif
6855
#ifdef OPENSSL_EXTRA
6856
    #ifdef WOLFSSL_TLS13
6857
    if (ssl->version.minor == TLSv1_3_MINOR &&
6858
     (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == WOLFSSL_OP_NO_TLSv1_3) {
6859
        if (!ctx->method->downgrade) {
6860
            WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.3 set but not "
6861
                        "allowed and downgrading disabled.");
6862
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
6863
            return VERSION_ERROR;
6864
        }
6865
        WOLFSSL_MSG("\tOption set to not allow TLSv1.3, Downgrading");
6866
        ssl->version.minor = TLSv1_2_MINOR;
6867
    }
6868
    #endif
6869
    if (ssl->version.minor == TLSv1_2_MINOR &&
6870
     (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == WOLFSSL_OP_NO_TLSv1_2) {
6871
        if (!ctx->method->downgrade) {
6872
            WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.2 set but not "
6873
                        "allowed and downgrading disabled.");
6874
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
6875
            return VERSION_ERROR;
6876
        }
6877
        WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
6878
        ssl->version.minor = TLSv1_1_MINOR;
6879
    }
6880
    if (ssl->version.minor == TLSv1_1_MINOR &&
6881
     (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) == WOLFSSL_OP_NO_TLSv1_1) {
6882
        if (!ctx->method->downgrade) {
6883
            WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.1 set but not "
6884
                        "allowed and downgrading disabled.");
6885
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
6886
            return VERSION_ERROR;
6887
        }
6888
        WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
6889
        ssl->options.tls1_1 = 0;
6890
        ssl->version.minor = TLSv1_MINOR;
6891
    }
6892
    if (ssl->version.minor == TLSv1_MINOR &&
6893
        (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) == WOLFSSL_OP_NO_TLSv1) {
6894
        if (!ctx->method->downgrade) {
6895
            WOLFSSL_MSG("\tInconsistent protocol options. TLS 1 set but not "
6896
                        "allowed and downgrading disabled.");
6897
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
6898
            return VERSION_ERROR;
6899
        }
6900
        WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
6901
        ssl->options.tls    = 0;
6902
        ssl->options.tls1_1 = 0;
6903
        ssl->version.minor = SSLv3_MINOR;
6904
    }
6905
    if (ssl->version.minor == SSLv3_MINOR &&
6906
        (ssl->options.mask & WOLFSSL_OP_NO_SSLv3) == WOLFSSL_OP_NO_SSLv3) {
6907
        WOLFSSL_MSG("\tError, option set to not allow SSLv3");
6908
        WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
6909
        return VERSION_ERROR;
6910
    }
6911
6912
    if (ssl->version.minor < ssl->options.minDowngrade) {
6913
        WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
6914
        WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
6915
        return VERSION_ERROR;
6916
    }
6917
#endif
6918
6919
0
#ifdef HAVE_ECC
6920
0
    ssl->eccTempKeySz = ctx->eccTempKeySz;
6921
0
    ssl->ecdhCurveOID = ctx->ecdhCurveOID;
6922
0
#endif
6923
0
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
6924
0
    ssl->pkCurveOID = ctx->pkCurveOID;
6925
0
#endif
6926
6927
#ifdef OPENSSL_EXTRA
6928
    ssl->CBIS         = ctx->CBIS;
6929
#endif
6930
0
    ssl->timeout = ctx->timeout;
6931
0
    ssl->verifyCallback    = ctx->verifyCallback;
6932
    /* If we are setting the ctx on an already initialized SSL object
6933
     * then we possibly already have a side defined. Don't overwrite unless
6934
     * the context has a well defined role. */
6935
0
    if (newSSL || ctx->method->side != WOLFSSL_NEITHER_END) {
6936
0
        ssl->options.side  = (word16)(ctx->method->side);
6937
0
    }
6938
0
    ssl->options.downgrade        = (word16)(ctx->method->downgrade);
6939
0
    ssl->options.minDowngrade     = ctx->minDowngrade;
6940
0
    ssl->options.haveRSA          = ctx->haveRSA;
6941
0
    ssl->options.haveDH           = ctx->haveDH;
6942
0
#if  !defined(NO_CERTS) && !defined(NO_DH)
6943
    /* Its possible that DH algorithm parameters were set in the ctx, recalc
6944
     * cipher suites. */
6945
0
    if (ssl->options.haveDH && ctx->serverDH_P.buffer != NULL &&
6946
0
        ctx->serverDH_G.buffer != NULL) {
6947
0
        if (ssl->suites == NULL) {
6948
0
            if (AllocateSuites(ssl) != 0) {
6949
0
                return MEMORY_E;
6950
0
            }
6951
0
        }
6952
0
        InitSuites(ssl->suites, ssl->version, ssl->buffers.keySz,
6953
0
                   ssl->options.haveRSA,
6954
0
#ifdef NO_PSK
6955
0
                   0,
6956
#else
6957
                   ctx->havePSK,
6958
#endif
6959
0
                   ssl->options.haveDH,
6960
0
                   ssl->options.haveECDSAsig, ssl->options.haveECC, TRUE,
6961
0
                   ssl->options.haveStaticECC, ssl->options.useAnon,
6962
0
                   TRUE, TRUE, TRUE, TRUE, ssl->options.side);
6963
0
    }
6964
0
#endif /* !NO_CERTS && !NO_DH */
6965
0
    ssl->options.haveECDSAsig     = ctx->haveECDSAsig;
6966
0
    ssl->options.haveECC          = ctx->haveECC;
6967
0
    ssl->options.haveStaticECC    = ctx->haveStaticECC;
6968
0
    ssl->options.haveFalconSig    = ctx->haveFalconSig;
6969
0
    ssl->options.haveDilithiumSig = ctx->haveDilithiumSig;
6970
6971
#ifndef NO_PSK
6972
    ssl->options.havePSK       = (word16)(ctx->havePSK);
6973
    ssl->options.client_psk_cb = ctx->client_psk_cb;
6974
    ssl->options.server_psk_cb = ctx->server_psk_cb;
6975
    ssl->options.psk_ctx       = ctx->psk_ctx;
6976
#ifdef WOLFSSL_TLS13
6977
    ssl->options.client_psk_cs_cb    = ctx->client_psk_cs_cb;
6978
    ssl->options.client_psk_tls13_cb = ctx->client_psk_tls13_cb;
6979
    ssl->options.server_psk_tls13_cb = ctx->server_psk_tls13_cb;
6980
#endif
6981
#endif /* NO_PSK */
6982
#ifdef WOLFSSL_EARLY_DATA
6983
    if (ssl->options.side == WOLFSSL_SERVER_END)
6984
        ssl->options.maxEarlyDataSz = ctx->maxEarlyDataSz;
6985
#endif
6986
6987
#ifdef HAVE_ANON
6988
    ssl->options.useAnon = ctx->useAnon;
6989
#endif
6990
0
#ifndef NO_DH
6991
0
    ssl->options.minDhKeySz = ctx->minDhKeySz;
6992
0
    ssl->options.maxDhKeySz = ctx->maxDhKeySz;
6993
0
#endif
6994
0
#ifndef NO_RSA
6995
0
    ssl->options.minRsaKeySz = ctx->minRsaKeySz;
6996
0
#endif
6997
0
#ifdef HAVE_ECC
6998
0
    ssl->options.minEccKeySz = ctx->minEccKeySz;
6999
0
#endif
7000
#ifdef HAVE_FALCON
7001
    ssl->options.minFalconKeySz = ctx->minFalconKeySz;
7002
#endif /* HAVE_FALCON */
7003
#ifdef HAVE_DILITHIUM
7004
    ssl->options.minDilithiumKeySz = ctx->minDilithiumKeySz;
7005
#endif /* HAVE_DILITHIUM */
7006
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
7007
    ssl->options.verifyDepth = ctx->verifyDepth;
7008
#endif
7009
7010
0
    ssl->options.sessionCacheOff      = ctx->sessionCacheOff;
7011
0
    ssl->options.sessionCacheFlushOff = ctx->sessionCacheFlushOff;
7012
#ifdef HAVE_EXT_CACHE
7013
    ssl->options.internalCacheOff     = ctx->internalCacheOff;
7014
    ssl->options.internalCacheLookupOff = ctx->internalCacheLookupOff;
7015
#endif
7016
7017
0
    ssl->options.verifyPeer     = ctx->verifyPeer;
7018
0
    ssl->options.verifyNone     = ctx->verifyNone;
7019
0
    ssl->options.failNoCert     = ctx->failNoCert;
7020
0
    ssl->options.failNoCertxPSK = ctx->failNoCertxPSK;
7021
0
    ssl->options.sendVerify     = ctx->sendVerify;
7022
7023
0
    ssl->options.partialWrite  = ctx->partialWrite;
7024
0
    ssl->options.quietShutdown = ctx->quietShutdown;
7025
0
    ssl->options.groupMessages = ctx->groupMessages;
7026
7027
0
#ifndef NO_DH
7028
0
    #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
7029
0
        !defined(HAVE_SELFTEST)
7030
0
        ssl->options.dhKeyTested = ctx->dhKeyTested;
7031
0
    #endif
7032
0
    ssl->buffers.serverDH_P = ctx->serverDH_P;
7033
0
    ssl->buffers.serverDH_G = ctx->serverDH_G;
7034
0
#endif
7035
7036
#if defined(HAVE_RPK)
7037
    ssl->options.rpkConfig  = ctx->rpkConfig;
7038
    ssl->options.rpkState   = ctx->rpkState;
7039
#endif /* HAVE_RPK */
7040
7041
0
#ifndef NO_CERTS
7042
#ifdef WOLFSSL_COPY_CERT
7043
    /* If WOLFSSL_COPY_CERT is defined, always copy the cert */
7044
    if (ctx->certificate != NULL) {
7045
        ret = AllocCopyDer(&ssl->buffers.certificate, ctx->certificate->buffer,
7046
            ctx->certificate->length, ctx->certificate->type,
7047
            ctx->certificate->heap);
7048
        if (ret != 0) {
7049
            return ret;
7050
        }
7051
7052
        ssl->buffers.weOwnCert = 1;
7053
        ret = WOLFSSL_SUCCESS;
7054
    }
7055
    if (ctx->certChain != NULL) {
7056
        ret = AllocCopyDer(&ssl->buffers.certChain, ctx->certChain->buffer,
7057
            ctx->certChain->length, ctx->certChain->type,
7058
            ctx->certChain->heap);
7059
        if (ret != 0) {
7060
            return ret;
7061
        }
7062
7063
        ssl->buffers.weOwnCertChain = 1;
7064
        ret = WOLFSSL_SUCCESS;
7065
    }
7066
#else
7067
    /* ctx still owns certificate, certChain, key, dh, and cm */
7068
0
    ssl->buffers.certificate = ctx->certificate;
7069
0
    ssl->buffers.certChain = ctx->certChain;
7070
0
#endif
7071
0
#ifdef WOLFSSL_TLS13
7072
0
    ssl->buffers.certChainCnt = ctx->certChainCnt;
7073
0
#endif
7074
0
#ifndef WOLFSSL_BLIND_PRIVATE_KEY
7075
#ifdef WOLFSSL_COPY_KEY
7076
    if (ctx->privateKey != NULL) {
7077
        if (ssl->buffers.key != NULL) {
7078
            FreeDer(&ssl->buffers.key);
7079
        }
7080
        ret = AllocCopyDer(&ssl->buffers.key, ctx->privateKey->buffer,
7081
            ctx->privateKey->length, ctx->privateKey->type,
7082
            ctx->privateKey->heap);
7083
        if (ret != 0) {
7084
            return ret;
7085
        }
7086
        ssl->buffers.weOwnKey = 1;
7087
        ret = WOLFSSL_SUCCESS;
7088
    }
7089
    else {
7090
        ssl->buffers.key      = ctx->privateKey;
7091
    }
7092
#else
7093
0
    ssl->buffers.key      = ctx->privateKey;
7094
0
#endif
7095
#else
7096
    if (ctx->privateKey != NULL) {
7097
        ret = AllocCopyDer(&ssl->buffers.key, ctx->privateKey->buffer,
7098
            ctx->privateKey->length, ctx->privateKey->type,
7099
            ctx->privateKey->heap);
7100
        if (ret != 0) {
7101
            return ret;
7102
        }
7103
        ssl->buffers.weOwnKey = 1;
7104
        /* Blind the private key for the SSL with new random mask. */
7105
        wolfssl_priv_der_unblind(ssl->buffers.key, ctx->privateKeyMask);
7106
        ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.key,
7107
            &ssl->buffers.keyMask);
7108
        if (ret != 0) {
7109
            return ret;
7110
        }
7111
    }
7112
#endif
7113
0
    ssl->buffers.keyType  = ctx->privateKeyType;
7114
0
    ssl->buffers.keyId    = ctx->privateKeyId;
7115
0
    ssl->buffers.keyLabel = ctx->privateKeyLabel;
7116
0
    ssl->buffers.keySz    = ctx->privateKeySz;
7117
0
    ssl->buffers.keyDevId = ctx->privateKeyDevId;
7118
#ifdef WOLFSSL_DUAL_ALG_CERTS
7119
#ifndef WOLFSSL_BLIND_PRIVATE_KEY
7120
    ssl->buffers.altKey   = ctx->altPrivateKey;
7121
#else
7122
    if (ctx->altPrivateKey != NULL) {
7123
        ret = AllocCopyDer(&ssl->buffers.altkey, ctx->altPrivateKey->buffer,
7124
            ctx->altPrivateKey->length, ctx->altPrivateKey->type,
7125
            ctx->altPrivateKey->heap);
7126
        if (ret != 0) {
7127
            return ret;
7128
        }
7129
        /* Blind the private key for the SSL with new random mask. */
7130
        wolfssl_priv_der_unblind(ssl->buffers.altKey, ctx->altPrivateKeyMask);
7131
        ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.altKey,
7132
            &ssl->buffers.altKeyMask);
7133
        if (ret != 0) {
7134
            return ret;
7135
        }
7136
        ret = WOLFSSL_SUCCESS;
7137
    }
7138
#endif
7139
    ssl->buffers.altKeyType  = ctx->altPrivateKeyType;
7140
    ssl->buffers.altKeyId    = ctx->altPrivateKeyId;
7141
    ssl->buffers.altKeyLabel = ctx->altPrivateKeyLabel;
7142
    ssl->buffers.altKeySz    = ctx->altPrivateKeySz;
7143
    ssl->buffers.altKeyDevId = ctx->altPrivateKeyDevId;
7144
#endif /* WOLFSSL_DUAL_ALG_CERTS */
7145
0
#endif
7146
0
#if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
7147
0
               ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \
7148
0
                (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
7149
0
                (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
7150
0
    ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
7151
0
                                      ssl->buffers.keyType == ed25519_sa_algo ||
7152
0
                                      ssl->buffers.keyType == ed448_sa_algo ||
7153
0
                                      ssl->buffers.keyType == sm2_sa_algo;
7154
0
#endif
7155
7156
7157
#ifdef WOLFSSL_ASYNC_CRYPT
7158
    ssl->devId = ctx->devId;
7159
#endif
7160
7161
0
    if (writeDup == 0) {
7162
#ifndef NO_PSK
7163
        if (ctx->server_hint[0]) {   /* set in CTX */
7164
            XSTRNCPY(ssl->arrays->server_hint, ctx->server_hint,
7165
                                    sizeof(ssl->arrays->server_hint));
7166
            ssl->arrays->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
7167
        }
7168
#endif /* NO_PSK */
7169
7170
0
        if (ssl->suites != NULL) {
7171
0
            if (ctx->suites == NULL)
7172
0
                XMEMSET(ssl->suites, 0, sizeof(Suites));
7173
0
            else
7174
0
                XMEMCPY(ssl->suites, ctx->suites, sizeof(Suites));
7175
0
        }
7176
7177
0
        if (ssl->options.side != WOLFSSL_NEITHER_END) {
7178
            /* Defer initializing suites until accept or connect */
7179
0
            ret = InitSSL_Suites(ssl);
7180
0
        }
7181
0
    }  /* writeDup check */
7182
7183
0
    if (ctx->mask != 0 && wolfSSL_set_options(ssl, (long)ctx->mask) == 0) {
7184
0
        WOLFSSL_MSG("wolfSSL_set_options error");
7185
0
        return BAD_FUNC_ARG;
7186
0
    }
7187
7188
#ifdef WOLFSSL_SESSION_EXPORT
7189
    #ifdef WOLFSSL_DTLS
7190
    ssl->dtls_export = ctx->dtls_export; /* export function for session */
7191
    #endif
7192
#endif
7193
7194
#ifdef WOLFSSL_WOLFSENTRY_HOOKS
7195
    ssl->AcceptFilter = ctx->AcceptFilter;
7196
    ssl->AcceptFilter_arg = ctx->AcceptFilter_arg;
7197
    ssl->ConnectFilter = ctx->ConnectFilter;
7198
    ssl->ConnectFilter_arg = ctx->ConnectFilter_arg;
7199
#endif
7200
7201
#ifdef OPENSSL_EXTRA
7202
    ssl->readAhead = ctx->readAhead;
7203
#endif
7204
#if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
7205
    /* Don't change recv callback if currently using BIO's */
7206
    if (ssl->CBIORecv != SslBioReceive)
7207
#endif
7208
0
        ssl->CBIORecv = ctx->CBIORecv;
7209
#if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
7210
    /* Don't change send callback if currently using BIO's */
7211
    if (ssl->CBIOSend != SslBioSend)
7212
#endif
7213
0
        ssl->CBIOSend = ctx->CBIOSend;
7214
0
    ssl->verifyDepth = ctx->verifyDepth;
7215
7216
0
    return ret;
7217
0
}
7218
7219
int InitHandshakeHashes(WOLFSSL* ssl)
7220
0
{
7221
0
    int ret;
7222
7223
    /* make sure existing handshake hashes are free'd */
7224
0
    if (ssl->hsHashes != NULL) {
7225
0
        FreeHandshakeHashes(ssl);
7226
0
    }
7227
7228
    /* allocate handshake hashes */
7229
0
    ssl->hsHashes = (HS_Hashes*)XMALLOC(sizeof(HS_Hashes), ssl->heap,
7230
0
                                                           DYNAMIC_TYPE_HASHES);
7231
0
    if (ssl->hsHashes == NULL) {
7232
0
        WOLFSSL_MSG("HS_Hashes Memory error");
7233
0
        return MEMORY_E;
7234
0
    }
7235
0
    XMEMSET(ssl->hsHashes, 0, sizeof(HS_Hashes));
7236
7237
#if !defined(NO_MD5) && !defined(NO_OLD_TLS)
7238
    ret = wc_InitMd5_ex(&ssl->hsHashes->hashMd5, ssl->heap, ssl->devId);
7239
    if (ret != 0)
7240
        return ret;
7241
    #ifdef WOLFSSL_HASH_FLAGS
7242
        wc_Md5SetFlags(&ssl->hsHashes->hashMd5, WC_HASH_FLAG_WILLCOPY);
7243
    #endif
7244
#endif
7245
#if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
7246
                          defined(WOLFSSL_ALLOW_TLS_SHA1))
7247
    ret = wc_InitSha_ex(&ssl->hsHashes->hashSha, ssl->heap, ssl->devId);
7248
    if (ret != 0)
7249
        return ret;
7250
    #ifdef WOLFSSL_HASH_FLAGS
7251
        wc_ShaSetFlags(&ssl->hsHashes->hashSha, WC_HASH_FLAG_WILLCOPY);
7252
    #endif
7253
#endif
7254
0
#ifndef NO_SHA256
7255
0
    ret = wc_InitSha256_ex(&ssl->hsHashes->hashSha256, ssl->heap, ssl->devId);
7256
0
    if (ret != 0)
7257
0
        return ret;
7258
0
    #ifdef WOLFSSL_HASH_FLAGS
7259
0
        wc_Sha256SetFlags(&ssl->hsHashes->hashSha256, WC_HASH_FLAG_WILLCOPY);
7260
0
    #endif
7261
0
#endif
7262
0
#ifdef WOLFSSL_SHA384
7263
0
    ret = wc_InitSha384_ex(&ssl->hsHashes->hashSha384, ssl->heap, ssl->devId);
7264
0
    if (ret != 0)
7265
0
        return ret;
7266
0
    #ifdef WOLFSSL_HASH_FLAGS
7267
0
        wc_Sha384SetFlags(&ssl->hsHashes->hashSha384, WC_HASH_FLAG_WILLCOPY);
7268
0
    #endif
7269
0
#endif
7270
0
#ifdef WOLFSSL_SHA512
7271
0
    ret = wc_InitSha512_ex(&ssl->hsHashes->hashSha512, ssl->heap, ssl->devId);
7272
0
    if (ret != 0)
7273
0
        return ret;
7274
0
    #ifdef WOLFSSL_HASH_FLAGS
7275
0
        wc_Sha512SetFlags(&ssl->hsHashes->hashSha512, WC_HASH_FLAG_WILLCOPY);
7276
0
    #endif
7277
0
#endif
7278
0
#ifdef WOLFSSL_SM3
7279
0
    ret = wc_InitSm3(&ssl->hsHashes->hashSm3, ssl->heap, ssl->devId);
7280
0
    if (ret != 0)
7281
0
        return ret;
7282
0
    #ifdef WOLFSSL_HASH_FLAGS
7283
0
        wc_Sm3SetFlags(&ssl->hsHashes->hashSm3, WC_HASH_FLAG_WILLCOPY);
7284
0
    #endif
7285
0
#endif
7286
7287
0
    return ret;
7288
0
}
7289
7290
void FreeHandshakeHashes(WOLFSSL* ssl)
7291
95.8k
{
7292
95.8k
    if (ssl->hsHashes) {
7293
    #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
7294
        wc_Md5Free(&ssl->hsHashes->hashMd5);
7295
    #endif
7296
    #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
7297
                              defined(WOLFSSL_ALLOW_TLS_SHA1))
7298
        wc_ShaFree(&ssl->hsHashes->hashSha);
7299
    #endif
7300
95.5k
    #ifndef NO_SHA256
7301
95.5k
        wc_Sha256Free(&ssl->hsHashes->hashSha256);
7302
95.5k
    #endif
7303
95.5k
    #ifdef WOLFSSL_SHA384
7304
95.5k
        wc_Sha384Free(&ssl->hsHashes->hashSha384);
7305
95.5k
    #endif
7306
95.5k
    #ifdef WOLFSSL_SHA512
7307
95.5k
        wc_Sha512Free(&ssl->hsHashes->hashSha512);
7308
95.5k
    #endif
7309
95.5k
    #ifdef WOLFSSL_SM3
7310
95.5k
        wc_Sm3Free(&ssl->hsHashes->hashSm3);
7311
95.5k
    #endif
7312
95.5k
    #if (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
7313
95.5k
         (defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3))) && \
7314
95.5k
        !defined(WOLFSSL_NO_CLIENT_AUTH)
7315
95.5k
        if (ssl->hsHashes->messages != NULL) {
7316
214
            ForceZero(ssl->hsHashes->messages, (word32)ssl->hsHashes->length);
7317
214
            XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
7318
214
            ssl->hsHashes->messages = NULL;
7319
214
         }
7320
95.5k
    #endif
7321
7322
95.5k
        XFREE(ssl->hsHashes, ssl->heap, DYNAMIC_TYPE_HASHES);
7323
95.5k
        ssl->hsHashes = NULL;
7324
95.5k
    }
7325
95.8k
}
7326
7327
/* copy the hashes from source to a newly made destination return status */
7328
int InitHandshakeHashesAndCopy(WOLFSSL* ssl, HS_Hashes* source,
7329
  HS_Hashes** destination)
7330
0
{
7331
0
    int ret;
7332
0
    HS_Hashes* tmpHashes;
7333
7334
0
    if (source == NULL)
7335
0
        return BAD_FUNC_ARG;
7336
7337
    /* save the original so we can put it back afterward */
7338
0
    tmpHashes = ssl->hsHashes;
7339
0
    ssl->hsHashes = *destination;
7340
7341
0
    ret = InitHandshakeHashes(ssl);
7342
0
    if (ret != 0) {
7343
0
        WOLFSSL_MSG_EX("InitHandshakeHashes failed. err = %d", ret);
7344
0
        ssl->hsHashes = tmpHashes; /* restore hsHashes pointer to original
7345
                                    * before returning */
7346
0
        return ret;
7347
0
    }
7348
7349
0
    *destination = ssl->hsHashes;
7350
0
    ssl->hsHashes = tmpHashes;
7351
7352
  /* now copy the source contents to the destination */
7353
#ifndef NO_OLD_TLS
7354
    #ifndef NO_SHA
7355
    ret = wc_ShaCopy(&source->hashSha, &(*destination)->hashSha);
7356
    #endif
7357
    #ifndef NO_MD5
7358
    if (ret == 0)
7359
        ret = wc_Md5Copy(&source->hashMd5, &(*destination)->hashMd5);
7360
    #endif
7361
    #endif /* !NO_OLD_TLS */
7362
0
    #ifndef NO_SHA256
7363
0
    if (ret == 0)
7364
0
        ret = wc_Sha256Copy(&source->hashSha256,
7365
0
            &(*destination)->hashSha256);
7366
0
    #endif
7367
0
    #ifdef WOLFSSL_SHA384
7368
0
    if (ret == 0)
7369
0
        ret = wc_Sha384Copy(&source->hashSha384,
7370
0
            &(*destination)->hashSha384);
7371
0
    #endif
7372
0
    #ifdef WOLFSSL_SHA512
7373
0
    if (ret == 0)
7374
0
        ret = wc_Sha512Copy(&source->hashSha512,
7375
0
            &(*destination)->hashSha512);
7376
0
    #endif
7377
0
    #ifdef WOLFSSL_SM3
7378
0
    if (ret == 0)
7379
0
        ret = wc_Sm3Copy(&source->hashSm3,
7380
0
            &(*destination)->hashSm3);
7381
0
    #endif
7382
0
    #if (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
7383
0
         (defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3))) && \
7384
0
        !defined(WOLFSSL_NO_CLIENT_AUTH)
7385
0
    if (ret == 0 && source->messages != NULL) {
7386
0
        (*destination)->messages = (byte*)XMALLOC((size_t)source->length,
7387
0
        ssl->heap,
7388
0
        (int)DYNAMIC_TYPE_HASHES);
7389
0
        (*destination)->length = source->length;
7390
0
        (*destination)->prevLen = source->prevLen;
7391
7392
0
        if ((*destination)->messages == NULL) {
7393
0
            ret = MEMORY_E;
7394
0
        }
7395
0
        else {
7396
0
            XMEMCPY((*destination)->messages, source->messages,
7397
0
                (size_t)source->length);
7398
0
        }
7399
0
    }
7400
0
    #endif
7401
7402
0
    return ret;
7403
0
}
7404
7405
/* called if user attempts to reuse WOLFSSL object for a new session.
7406
 * For example wolfSSL_clear() is called then wolfSSL_connect or accept */
7407
int ReinitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
7408
171k
{
7409
171k
    int ret = 0;
7410
7411
171k
    WOLFSSL_ENTER("ReinitSSL");
7412
7413
    /* arrays */
7414
171k
    if (!writeDup && ssl->arrays == NULL) {
7415
86.5k
        ssl->arrays = (Arrays*)XMALLOC(sizeof(Arrays), ssl->heap,
7416
86.5k
                                                           DYNAMIC_TYPE_ARRAYS);
7417
86.5k
        if (ssl->arrays == NULL) {
7418
2
            WOLFSSL_MSG("Arrays Memory error");
7419
2
            return MEMORY_E;
7420
2
        }
7421
#ifdef WOLFSSL_CHECK_MEM_ZERO
7422
        wc_MemZero_Add("SSL Arrays", ssl->arrays, sizeof(*ssl->arrays));
7423
#endif
7424
86.5k
        XMEMSET(ssl->arrays, 0, sizeof(Arrays));
7425
86.5k
#if defined(WOLFSSL_TLS13) || defined(WOLFSSL_SNIFFER)
7426
86.5k
        ssl->arrays->preMasterSz = ENCRYPT_LEN;
7427
86.5k
        ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN, ssl->heap,
7428
86.5k
            DYNAMIC_TYPE_SECRET);
7429
86.5k
        if (ssl->arrays->preMasterSecret == NULL) {
7430
3
            return MEMORY_E;
7431
3
        }
7432
#ifdef WOLFSSL_CHECK_MEM_ZERO
7433
        wc_MemZero_Add("SSL Arrays", ssl->arrays->preMasterSecret, ENCRYPT_LEN);
7434
#endif
7435
86.5k
        XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
7436
86.5k
#endif
7437
86.5k
    }
7438
7439
    /* RNG */
7440
#ifdef SINGLE_THREADED
7441
    if (ssl->rng == NULL) {
7442
        ssl->rng = ctx->rng; /* CTX may have one, if so use it */
7443
    }
7444
#endif
7445
171k
    if (ssl->rng == NULL) {
7446
86.5k
        ssl->rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ssl->heap,DYNAMIC_TYPE_RNG);
7447
86.5k
        if (ssl->rng == NULL) {
7448
2
            WOLFSSL_MSG("RNG Memory error");
7449
2
            return MEMORY_E;
7450
2
        }
7451
86.5k
        XMEMSET(ssl->rng, 0, sizeof(WC_RNG));
7452
86.5k
        ssl->options.weOwnRng = 1;
7453
7454
        /* FIPS RNG API does not accept a heap hint */
7455
86.5k
#ifndef HAVE_FIPS
7456
86.5k
        if ( (ret = wc_InitRng_ex(ssl->rng, ssl->heap, ssl->devId)) != 0) {
7457
180
            WOLFSSL_MSG("RNG Init error");
7458
180
            return ret;
7459
180
        }
7460
#else
7461
        if ( (ret = wc_InitRng(ssl->rng)) != 0) {
7462
            WOLFSSL_MSG("RNG Init error");
7463
            return ret;
7464
        }
7465
#endif
7466
86.5k
    }
7467
171k
    (void)ctx;
7468
7469
171k
    ssl->options.shutdownDone = 0;
7470
171k
    if (ssl->session != NULL)
7471
84.6k
        ssl->session->side = (byte)ssl->options.side;
7472
7473
171k
    return ret;
7474
171k
}
7475
7476
/* init everything to 0, NULL, default values before calling anything that may
7477
   fail so that destructor has a "good" state to cleanup
7478
7479
   ssl      object to initialize
7480
   ctx      parent factory
7481
   writeDup flag indicating this is a write dup only
7482
7483
   0 on success */
7484
int InitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
7485
0
{
7486
0
    int  ret;
7487
7488
0
    XMEMSET(ssl, 0, sizeof(WOLFSSL));
7489
#ifdef WOLFSSL_CHECK_MEM_ZERO
7490
    wc_MemZero_Add("SSL Keys", &ssl->keys, sizeof(ssl->keys));
7491
#ifdef WOLFSSL_TLS13
7492
    wc_MemZero_Add("SSL client secret", &ssl->clientSecret,
7493
        sizeof(ssl->clientSecret));
7494
    wc_MemZero_Add("SSL client secret", &ssl->serverSecret,
7495
        sizeof(ssl->serverSecret));
7496
#endif
7497
#ifdef WOLFSSL_HAVE_TLS_UNIQUE
7498
    wc_MemZero_Add("ClientFinished hash", &ssl->clientFinished,
7499
        TLS_FINISHED_SZ_MAX);
7500
    wc_MemZero_Add("ServerFinished hash", &ssl->serverFinished,
7501
        TLS_FINISHED_SZ_MAX);
7502
#endif
7503
#endif /* WOLFSSL_CHECK_MEM_ZERO */
7504
7505
#if defined(WOLFSSL_STATIC_MEMORY)
7506
    if (ctx->heap != NULL) {
7507
        WOLFSSL_HEAP_HINT* ssl_hint;
7508
        WOLFSSL_HEAP_HINT* ctx_hint;
7509
7510
        /* avoid dereferencing a test value */
7511
    #ifdef WOLFSSL_HEAP_TEST
7512
        if (ctx->heap == (void*)WOLFSSL_HEAP_TEST) {
7513
            ssl->heap = ctx->heap;
7514
        }
7515
        else {
7516
    #endif
7517
        ssl->heap = (WOLFSSL_HEAP_HINT*)XMALLOC(sizeof(WOLFSSL_HEAP_HINT),
7518
                                               ctx->heap, DYNAMIC_TYPE_SSL);
7519
        if (ssl->heap == NULL) {
7520
            return MEMORY_E;
7521
        }
7522
        XMEMSET(ssl->heap, 0, sizeof(WOLFSSL_HEAP_HINT));
7523
        ssl_hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
7524
        ctx_hint = ((WOLFSSL_HEAP_HINT*)(ctx->heap));
7525
7526
        ssl_hint->memory = ctx_hint->memory;
7527
    #ifndef WOLFSSL_STATIC_MEMORY_LEAN
7528
    #ifndef SINGLE_THREADED
7529
        /* lock and check IO count / handshake count */
7530
        if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
7531
            WOLFSSL_MSG("Bad memory_mutex lock");
7532
            XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
7533
            ssl->heap = NULL; /* free and set to NULL for IO counter */
7534
            WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
7535
            return BAD_MUTEX_E;
7536
        }
7537
    #endif
7538
        if (ctx_hint->memory->maxHa > 0 &&
7539
                           ctx_hint->memory->maxHa <= ctx_hint->memory->curHa) {
7540
            WOLFSSL_MSG("At max number of handshakes for static memory");
7541
        #ifndef SINGLE_THREADED
7542
            wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
7543
        #endif
7544
            XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
7545
            ssl->heap = NULL; /* free and set to NULL for IO counter */
7546
            return MEMORY_E;
7547
        }
7548
7549
        if (ctx_hint->memory->maxIO > 0 &&
7550
                           ctx_hint->memory->maxIO <= ctx_hint->memory->curIO) {
7551
            WOLFSSL_MSG("At max number of IO allowed for static memory");
7552
        #ifndef SINGLE_THREADED
7553
            wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
7554
        #endif
7555
            XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
7556
            ssl->heap = NULL; /* free and set to NULL for IO counter */
7557
            return MEMORY_E;
7558
        }
7559
        ctx_hint->memory->curIO++;
7560
        ctx_hint->memory->curHa++;
7561
        ssl_hint->haFlag = 1;
7562
    #ifndef SINGLE_THREADED
7563
        wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
7564
    #endif
7565
7566
        /* check if tracking stats */
7567
        if (ctx_hint->memory->flag & WOLFMEM_TRACK_STATS) {
7568
            ssl_hint->stats = (WOLFSSL_MEM_CONN_STATS*)XMALLOC(
7569
               sizeof(WOLFSSL_MEM_CONN_STATS), ctx->heap, DYNAMIC_TYPE_SSL);
7570
            if (ssl_hint->stats == NULL) {
7571
                return MEMORY_E;
7572
            }
7573
            XMEMSET(ssl_hint->stats, 0, sizeof(WOLFSSL_MEM_CONN_STATS));
7574
        }
7575
7576
        /* check if using fixed IO buffers */
7577
        if (ctx_hint->memory->flag & WOLFMEM_IO_POOL_FIXED) {
7578
        #ifndef SINGLE_THREADED
7579
            if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
7580
                WOLFSSL_MSG("Bad memory_mutex lock");
7581
                WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
7582
                return BAD_MUTEX_E;
7583
            }
7584
        #endif
7585
            if (SetFixedIO(ctx_hint->memory, &(ssl_hint->inBuf)) != 1) {
7586
            #ifndef SINGLE_THREADED
7587
                wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
7588
            #endif
7589
                return MEMORY_E;
7590
            }
7591
            if (SetFixedIO(ctx_hint->memory, &(ssl_hint->outBuf)) != 1) {
7592
            #ifndef SINGLE_THREADED
7593
                wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
7594
            #endif
7595
                return MEMORY_E;
7596
            }
7597
            if (ssl_hint->outBuf == NULL || ssl_hint->inBuf == NULL) {
7598
                WOLFSSL_MSG("Not enough memory to create fixed IO buffers");
7599
            #ifndef SINGLE_THREADED
7600
                wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
7601
            #endif
7602
                return MEMORY_E;
7603
            }
7604
       #ifndef SINGLE_THREADED
7605
            wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
7606
        #endif
7607
        }
7608
    #endif /* !WOLFSSL_STATIC_MEMORY_LEAN */
7609
    #ifdef WOLFSSL_HEAP_TEST
7610
        }
7611
    #endif
7612
    }
7613
    else {
7614
        ssl->heap = ctx->heap;
7615
    }
7616
#else
7617
0
    ssl->heap = ctx->heap; /* carry over user heap without static memory */
7618
0
#endif /* WOLFSSL_STATIC_MEMORY */
7619
7620
0
    ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
7621
0
    ssl->buffers.inputBuffer.bufferSize  = STATIC_BUFFER_LEN;
7622
7623
0
    ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
7624
0
    ssl->buffers.outputBuffer.bufferSize  = STATIC_BUFFER_LEN;
7625
7626
#ifdef WOLFSSL_THREADED_CRYPT
7627
    {
7628
        int i;
7629
        for (i = 0; i < WOLFSSL_THREADED_CRYPT_CNT; i++) {
7630
            ssl->buffers.encrypt[i].avail = 1;
7631
        }
7632
    }
7633
#endif
7634
7635
#ifdef KEEP_PEER_CERT
7636
    InitX509(&ssl->peerCert, 0, ssl->heap);
7637
#endif
7638
7639
0
    ssl->rfd = -1;   /* set to invalid descriptor */
7640
0
    ssl->wfd = -1;
7641
0
    ssl->devId = ctx->devId; /* device for async HW (from wolfAsync_DevOpen) */
7642
7643
    /* initialize states */
7644
0
    ssl->options.serverState = NULL_STATE;
7645
0
    ssl->options.clientState = NULL_STATE;
7646
0
    ssl->options.connectState = CONNECT_BEGIN;
7647
0
    ssl->options.acceptState  = ACCEPT_BEGIN;
7648
0
    ssl->options.handShakeState  = NULL_STATE;
7649
0
    ssl->options.processReply = doProcessInit;
7650
0
    ssl->options.asyncState = TLS_ASYNC_BEGIN;
7651
0
    ssl->options.buildMsgState = BUILD_MSG_BEGIN;
7652
0
    ssl->encrypt.state = CIPHER_STATE_BEGIN;
7653
0
    ssl->decrypt.state = CIPHER_STATE_BEGIN;
7654
0
#ifndef NO_DH
7655
0
    #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
7656
0
        !defined(HAVE_SELFTEST)
7657
0
        ssl->options.dhDoKeyTest = 1;
7658
0
    #endif
7659
0
#endif /* !NO_DH */
7660
7661
#ifdef WOLFSSL_DTLS
7662
    #ifdef WOLFSSL_SCTP
7663
        ssl->options.dtlsSctp           = ctx->dtlsSctp;
7664
    #endif
7665
    #ifdef WOLFSSL_SRTP
7666
        ssl->dtlsSrtpProfiles           = ctx->dtlsSrtpProfiles;
7667
    #endif
7668
    #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
7669
        ssl->dtlsMtuSz                  = ctx->dtlsMtuSz;
7670
    #endif
7671
    ssl->dtls_timeout_init              = DTLS_TIMEOUT_INIT;
7672
    ssl->dtls_timeout_max               = DTLS_TIMEOUT_MAX;
7673
    ssl->dtls_timeout                   = ssl->dtls_timeout_init;
7674
7675
    ssl->buffers.dtlsCtx.rfd            = -1;
7676
    ssl->buffers.dtlsCtx.wfd            = -1;
7677
7678
#ifdef WOLFSSL_RW_THREADED
7679
    if (wc_InitRwLock(&ssl->buffers.dtlsCtx.peerLock) != 0)
7680
        return BAD_MUTEX_E;
7681
#endif
7682
7683
    ssl->IOCB_ReadCtx  = &ssl->buffers.dtlsCtx;  /* prevent invalid pointer access if not */
7684
    ssl->IOCB_WriteCtx = &ssl->buffers.dtlsCtx;  /* correctly set */
7685
#else
7686
#ifdef HAVE_NETX
7687
    ssl->IOCB_ReadCtx  = &ssl->nxCtx;  /* default NetX IO ctx, same for read */
7688
    ssl->IOCB_WriteCtx = &ssl->nxCtx;  /* and write */
7689
#elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
7690
    ssl->mnCtx = mynewt_ctx_new();
7691
    if(!ssl->mnCtx) {
7692
        return MEMORY_E;
7693
    }
7694
    ssl->IOCB_ReadCtx  = ssl->mnCtx;  /* default Mynewt IO ctx, same for read */
7695
    ssl->IOCB_WriteCtx = ssl->mnCtx;  /* and write */
7696
#elif defined (WOLFSSL_GNRC)
7697
    ssl->IOCB_ReadCtx = ssl->gnrcCtx;
7698
    ssl->IOCB_WriteCtx = ssl->gnrcCtx;
7699
#else
7700
0
    ssl->IOCB_ReadCtx  = &ssl->rfd;  /* prevent invalid pointer access if not */
7701
0
    ssl->IOCB_WriteCtx = &ssl->wfd;  /* correctly set */
7702
0
#endif
7703
0
#endif /* WOLFSSL_DTLS */
7704
7705
7706
0
#ifndef WOLFSSL_AEAD_ONLY
7707
    #ifndef NO_OLD_TLS
7708
        ssl->hmac = SSL_hmac; /* default to SSLv3 */
7709
    #elif !defined(WOLFSSL_NO_TLS12) && !defined(NO_TLS)
7710
      #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \
7711
0
          !defined(WOLFSSL_RENESAS_TSIP_TLS)
7712
0
        ssl->hmac = TLS_hmac;
7713
      #else
7714
        ssl->hmac = Renesas_cmn_TLS_hmac;
7715
      #endif
7716
0
    #endif
7717
0
#endif /* WOLFSSL_AEAD_ONLY */
7718
7719
#if defined(WOLFSSL_OPENVPN) && defined(HAVE_KEYING_MATERIAL)
7720
    /* Save arrays by default for OpenVPN */
7721
    ssl->options.saveArrays = 1;
7722
#endif
7723
7724
0
    ssl->cipher.ssl = ssl;
7725
7726
0
#ifdef HAVE_EXTENDED_MASTER
7727
0
    ssl->options.haveEMS = ctx->haveEMS;
7728
0
#endif
7729
0
    ssl->options.useClientOrder = ctx->useClientOrder;
7730
0
    ssl->options.mutualAuth = ctx->mutualAuth;
7731
7732
0
#ifdef WOLFSSL_TLS13
7733
    #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
7734
        ssl->options.maxTicketTls13 = ctx->maxTicketTls13;
7735
    #endif
7736
    #ifdef HAVE_SESSION_TICKET
7737
        ssl->options.noTicketTls13  = ctx->noTicketTls13;
7738
    #endif
7739
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
7740
        ssl->options.noPskDheKe = ctx->noPskDheKe;
7741
    #ifdef HAVE_SUPPORTED_CURVES
7742
        ssl->options.onlyPskDheKe = ctx->onlyPskDheKe;
7743
    #endif /* HAVE_SUPPORTED_CURVES */
7744
    #endif /* HAVE_SESSION_TICKET || !NO_PSK */
7745
    #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
7746
        ssl->options.postHandshakeAuth = ctx->postHandshakeAuth;
7747
        ssl->options.verifyPostHandshake = ctx->verifyPostHandshake;
7748
    #endif
7749
7750
0
    if (ctx->numGroups > 0) {
7751
0
        XMEMCPY(ssl->group, ctx->group, sizeof(*ctx->group) * ctx->numGroups);
7752
0
        ssl->numGroups = ctx->numGroups;
7753
0
    }
7754
7755
    #ifdef WOLFSSL_TLS13_MIDDLEBOX_COMPAT
7756
        ssl->options.tls13MiddleBoxCompat = 1;
7757
    #endif
7758
0
#endif /* WOLFSSL_TLS13 */
7759
7760
0
#ifdef HAVE_TLS_EXTENSIONS
7761
#ifdef HAVE_MAX_FRAGMENT
7762
    ssl->max_fragment = MAX_RECORD_SIZE;
7763
#endif
7764
#ifdef HAVE_ALPN
7765
    ssl->alpn_peer_requested = NULL;
7766
    ssl->alpn_peer_requested_length = 0;
7767
    #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
7768
        ssl->alpnSelect    = ctx->alpnSelect;
7769
        ssl->alpnSelectArg = ctx->alpnSelectArg;
7770
    #endif
7771
    #if !defined(NO_BIO) && defined(OPENSSL_EXTRA)
7772
        if (ctx->alpn_cli_protos != NULL && ctx->alpn_cli_protos_len > 0) {
7773
            ret = wolfSSL_set_alpn_protos(ssl, ctx->alpn_cli_protos,
7774
                                            ctx->alpn_cli_protos_len);
7775
        #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
7776
            if (ret) {
7777
        #else
7778
            if (!ret) {
7779
        #endif
7780
                WOLFSSL_MSG("failed to set alpn protos to ssl object");
7781
                return ret;
7782
            }
7783
        }
7784
    #endif
7785
#endif
7786
0
#ifdef HAVE_SUPPORTED_CURVES
7787
0
    ssl->options.userCurves = ctx->userCurves;
7788
0
#endif
7789
0
#endif /* HAVE_TLS_EXTENSIONS */
7790
7791
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
7792
0
    ssl->options.disallowEncThenMac = ctx->disallowEncThenMac;
7793
0
#endif
7794
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
7795
    ssl->options.disableECH         = ctx->disableECH;
7796
#endif
7797
7798
    /* default alert state (none) */
7799
0
    ssl->alert_history.last_rx.code  = -1;
7800
0
    ssl->alert_history.last_rx.level = -1;
7801
0
    ssl->alert_history.last_tx.code  = -1;
7802
0
    ssl->alert_history.last_tx.level = -1;
7803
7804
#ifdef WOLFSSL_SESSION_ID_CTX
7805
    /* copy over application session context ID */
7806
    ssl->sessionCtxSz = ctx->sessionCtxSz;
7807
    XMEMCPY(ssl->sessionCtx, ctx->sessionCtx, ctx->sessionCtxSz);
7808
#endif
7809
#ifdef OPENSSL_EXTRA
7810
    ssl->cbioFlag = ctx->cbioFlag;
7811
7812
    ssl->protoMsgCb  = ctx->protoMsgCb;
7813
    ssl->protoMsgCtx = ctx->protoMsgCtx;
7814
7815
    /* follow default behavior of setting toInfoOn similar to
7816
     * wolfSSL_set_msg_callback when the callback is set */
7817
    if (ctx->protoMsgCb != NULL) {
7818
        ssl->toInfoOn = 1;
7819
    }
7820
7821
    ssl->disabledCurves = ctx->disabledCurves;
7822
#endif
7823
7824
0
    InitCiphers(ssl);
7825
0
    InitCipherSpecs(&ssl->specs);
7826
7827
    /* all done with init, now can return errors, call other stuff */
7828
0
    if ((ret = ReinitSSL(ssl, ctx, writeDup)) != 0) {
7829
0
        WOLFSSL_MSG_EX("ReinitSSL failed. err = %d", ret);
7830
0
        return ret;
7831
0
    }
7832
7833
0
    if (!writeDup) {
7834
#ifdef OPENSSL_EXTRA
7835
        if ((ssl->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
7836
                                    sizeof(WOLFSSL_X509_VERIFY_PARAM),
7837
                                    ssl->heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
7838
            WOLFSSL_MSG("ssl->param memory error");
7839
            return MEMORY_E;
7840
        }
7841
        XMEMSET(ssl->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
7842
7843
        /* pass on PARAM flags value from ctx to ssl */
7844
        if (wolfSSL_X509_VERIFY_PARAM_set_flags(wolfSSL_get0_param(ssl),
7845
            (unsigned long)wolfSSL_X509_VERIFY_PARAM_get_flags(
7846
            wolfSSL_CTX_get0_param(ctx))) != WOLFSSL_SUCCESS) {
7847
            WOLFSSL_MSG("ssl->param set flags error");
7848
            return WOLFSSL_FAILURE;
7849
        }
7850
#endif
7851
7852
0
        if (ctx->suites == NULL) {
7853
            /* suites */
7854
0
            ret = AllocateCtxSuites(ctx);
7855
0
            if (ret != 0)
7856
0
                return ret;
7857
0
            InitSSL_CTX_Suites(ctx);
7858
0
        }
7859
#ifdef OPENSSL_ALL
7860
        ssl->suitesStack = NULL;
7861
#endif
7862
0
    } /* !writeDup */
7863
7864
    /* Initialize SSL with the appropriate fields from it's ctx */
7865
    /* requires valid arrays and suites unless writeDup ing */
7866
0
    if ((ret = SetSSL_CTX(ssl, ctx, writeDup)) != WOLFSSL_SUCCESS
7867
#ifdef WOLFSSL_NO_INIT_CTX_KEY
7868
        && ret != WC_NO_ERR_TRACE(NO_PRIVATE_KEY)
7869
#endif
7870
0
        ) {
7871
0
        WOLFSSL_MSG_EX("SetSSL_CTX failed. err = %d", ret);
7872
0
        return ret;
7873
0
    }
7874
0
    ssl->options.dtls = ssl->version.major == DTLS_MAJOR;
7875
7876
#ifdef HAVE_WRITE_DUP
7877
    if (writeDup) {
7878
        /* all done */
7879
        return 0;
7880
    }
7881
#endif
7882
7883
    /* hsHashes */
7884
0
    ret = InitHandshakeHashes(ssl);
7885
0
    if (ret != 0) {
7886
0
        WOLFSSL_MSG_EX("InitHandshakeHashes failed. err = %d", ret);
7887
0
        return ret;
7888
0
    }
7889
7890
#if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
7891
    if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
7892
        /* Initialize both in case we allow downgrading. */
7893
        ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
7894
        if (ret != 0) {
7895
            WOLFSSL_MSG("DTLS Cookie Secret error");
7896
            return ret;
7897
        }
7898
#if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
7899
        if (IsAtLeastTLSv1_3(ssl->version)) {
7900
            ret = wolfSSL_send_hrr_cookie(ssl, NULL, 0);
7901
            if (ret != WOLFSSL_SUCCESS) {
7902
                WOLFSSL_MSG("DTLS1.3 Cookie secret error");
7903
                return ret;
7904
            }
7905
        }
7906
#endif /* WOLFSSL_DTLS13 && WOLFSSL_SEND_HRR_COOKIE */
7907
    }
7908
#endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
7909
7910
#ifdef HAVE_SECRET_CALLBACK
7911
    ssl->sessionSecretCb  = NULL;
7912
    ssl->sessionSecretCtx = NULL;
7913
#ifdef WOLFSSL_TLS13
7914
    ssl->tls13SecretCb  = NULL;
7915
    ssl->tls13SecretCtx = NULL;
7916
#endif
7917
#endif
7918
#if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
7919
    if (ctx->keyLogCb != NULL) {
7920
        ssl->keyLogCb = SessionSecret_callback;
7921
#if defined(WOLFSSL_TLS13)
7922
        ssl->tls13KeyLogCb = SessionSecret_callback_Tls13;
7923
#endif /*WOLFSSL_TLS13*/
7924
    }
7925
#endif /*OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
7926
7927
0
    ssl->session = wolfSSL_NewSession(ssl->heap);
7928
0
    if (ssl->session == NULL) {
7929
0
        WOLFSSL_MSG_EX("SSL Session Memory error. wolfSSL_NewSession "
7930
0
                       "err = %d", ret);
7931
0
        return MEMORY_E;
7932
0
    }
7933
#ifdef HAVE_SESSION_TICKET
7934
    ssl->options.noTicketTls12 = ctx->noTicketTls12;
7935
#endif
7936
7937
#ifdef WOLFSSL_MULTICAST
7938
    if (ctx->haveMcast) {
7939
        int i;
7940
7941
        ssl->options.haveMcast = 1;
7942
        ssl->options.mcastID = ctx->mcastID;
7943
7944
        /* Force the state to look like handshake has completed. */
7945
        /* Keying material is supplied externally. */
7946
        ssl->options.serverState = SERVER_FINISHED_COMPLETE;
7947
        ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
7948
        ssl->options.connectState = SECOND_REPLY_DONE;
7949
        ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
7950
        ssl->options.handShakeState = HANDSHAKE_DONE;
7951
        ssl->options.handShakeDone = 1;
7952
7953
        for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++)
7954
            ssl->keys.peerSeq[i].peerId = INVALID_PEER_ID;
7955
    }
7956
#endif
7957
7958
0
#if defined(HAVE_SECURE_RENEGOTIATION) || \
7959
0
    defined(HAVE_SERVER_RENEGOTIATION_INFO)
7960
0
    if (ssl->options.side == WOLFSSL_CLIENT_END) {
7961
0
        int useSecureReneg = ssl->ctx->useSecureReneg;
7962
        /* use secure renegotiation by default (not recommend) */
7963
    #if defined(WOLFSSL_SECURE_RENEGOTIATION_ON_BY_DEFAULT) || \
7964
        (defined(WOLFSSL_HARDEN_TLS) && !defined(WOLFSSL_NO_TLS12) && \
7965
                !defined(WOLFSSL_HARDEN_TLS_NO_SCR_CHECK))
7966
        useSecureReneg = 1;
7967
    #endif
7968
0
        if (useSecureReneg) {
7969
0
            ret = wolfSSL_UseSecureRenegotiation(ssl);
7970
0
            if (ret != WOLFSSL_SUCCESS)
7971
0
                return ret;
7972
0
        }
7973
0
    }
7974
0
#endif /* HAVE_SECURE_RENEGOTIATION */
7975
7976
7977
#ifdef WOLFSSL_DTLS13
7978
    /* setup 0 (un-protected) epoch */
7979
    ssl->dtls13Epochs[0].isValid = 1;
7980
    ssl->dtls13Epochs[0].side = ENCRYPT_AND_DECRYPT_SIDE;
7981
    ssl->dtls13EncryptEpoch = &ssl->dtls13Epochs[0];
7982
    ssl->dtls13DecryptEpoch = &ssl->dtls13Epochs[0];
7983
    ssl->options.dtls13SendMoreAcks = WOLFSSL_DTLS13_SEND_MOREACK_DEFAULT;
7984
    ssl->dtls13Rtx.rtxRecordTailPtr = &ssl->dtls13Rtx.rtxRecords;
7985
7986
#ifdef WOLFSSL_RW_THREADED
7987
    ret = wc_InitMutex(&ssl->dtls13Rtx.mutex);
7988
    if (ret < 0) {
7989
        return ret;
7990
    }
7991
#endif
7992
#endif /* WOLFSSL_DTLS13 */
7993
7994
#ifdef WOLFSSL_QUIC
7995
    if (ctx->quic.method) {
7996
        ret = wolfSSL_set_quic_method(ssl, ctx->quic.method);
7997
        if (ret != WOLFSSL_SUCCESS)
7998
            return ret;
7999
    }
8000
#endif
8001
8002
#if defined(WOLFSSL_MAXQ10XX_TLS)
8003
    ret = wolfSSL_maxq10xx_load_certificate(ssl);
8004
    if (ret != WOLFSSL_SUCCESS)
8005
        return ret;
8006
#endif
8007
8008
#if defined(HAVE_SECRET_CALLBACK) && defined(SHOW_SECRETS) && \
8009
    defined(WOLFSSL_SSLKEYLOGFILE) && defined(WOLFSSL_TLS13)
8010
    (void)wolfSSL_set_tls13_secret_cb(ssl, tls13ShowSecrets, NULL);
8011
#endif
8012
#if defined(HAVE_SECRET_CALLBACK) && defined(SHOW_SECRETS)
8013
    (void)wolfSSL_set_secret_cb(ssl, tlsShowSecrets, NULL);
8014
#endif
8015
#ifdef WOLFSSL_DUAL_ALG_CERTS
8016
    ssl->sigSpec = ctx->sigSpec;
8017
    ssl->sigSpecSz = ctx->sigSpecSz;
8018
#endif /* WOLFSSL_DUAL_ALG_CERTS */
8019
#ifdef HAVE_OCSP
8020
#if defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST)
8021
    ssl->response_idx = 0;
8022
#endif
8023
#endif
8024
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
8025
    ssl->secLevel = ctx->secLevel;
8026
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
8027
    /* Returns 0 on success, not WOLFSSL_SUCCESS (1) */
8028
0
    WOLFSSL_MSG_EX("InitSSL done. return 0 (success)");
8029
0
    return 0;
8030
0
}
8031
8032
8033
/* free use of temporary arrays */
8034
void FreeArrays(WOLFSSL* ssl, int keep)
8035
86.5k
{
8036
86.5k
    if (ssl->arrays) {
8037
86.5k
        if (keep && !IsAtLeastTLSv1_3(ssl->version)) {
8038
            /* keeps session id for user retrieval */
8039
0
            XMEMCPY(ssl->session->sessionID, ssl->arrays->sessionID, ID_LEN);
8040
0
            ssl->session->sessionIDSz = ssl->arrays->sessionIDSz;
8041
0
        }
8042
86.5k
        if (ssl->arrays->preMasterSecret) {
8043
86.5k
            ForceZero(ssl->arrays->preMasterSecret, ENCRYPT_LEN);
8044
86.5k
            XFREE(ssl->arrays->preMasterSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
8045
86.5k
            ssl->arrays->preMasterSecret = NULL;
8046
86.5k
        }
8047
86.5k
        XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
8048
86.5k
        ssl->arrays->pendingMsg = NULL;
8049
86.5k
        ForceZero(ssl->arrays, sizeof(Arrays)); /* clear arrays struct */
8050
86.5k
    }
8051
86.5k
    XFREE(ssl->arrays, ssl->heap, DYNAMIC_TYPE_ARRAYS);
8052
86.5k
    ssl->arrays = NULL;
8053
86.5k
}
8054
8055
void FreeKey(WOLFSSL* ssl, int type, void** pKey)
8056
915k
{
8057
915k
    if (ssl && pKey && *pKey) {
8058
22.8k
        switch (type) {
8059
0
        #ifndef NO_RSA
8060
8.81k
            case DYNAMIC_TYPE_RSA:
8061
8.81k
                wc_FreeRsaKey((RsaKey*)*pKey);
8062
8.81k
                break;
8063
0
        #endif /* ! NO_RSA */
8064
0
        #ifdef HAVE_ECC
8065
10.0k
            case DYNAMIC_TYPE_ECC:
8066
            #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8067
                defined(WC_ASYNC_ENABLE_ECC)
8068
                if (((ecc_key*)*pKey)->nb_ctx != NULL) {
8069
                    XFREE(((ecc_key*)*pKey)->nb_ctx, ((ecc_key*)*pKey)->heap,
8070
                          DYNAMIC_TYPE_TMP_BUFFER);
8071
                }
8072
            #endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
8073
                      WC_ASYNC_ENABLE_ECC */
8074
10.0k
                wc_ecc_free((ecc_key*)*pKey);
8075
10.0k
                break;
8076
0
        #endif /* HAVE_ECC */
8077
0
        #ifdef HAVE_ED25519
8078
0
            case DYNAMIC_TYPE_ED25519:
8079
0
                wc_ed25519_free((ed25519_key*)*pKey);
8080
0
                break;
8081
0
        #endif /* HAVE_ED25519 */
8082
0
        #ifdef HAVE_CURVE25519
8083
1.75k
            case DYNAMIC_TYPE_CURVE25519:
8084
1.75k
                wc_curve25519_free((curve25519_key*)*pKey);
8085
1.75k
                break;
8086
0
        #endif /* HAVE_CURVE25519 */
8087
0
        #ifdef HAVE_ED448
8088
0
            case DYNAMIC_TYPE_ED448:
8089
0
                wc_ed448_free((ed448_key*)*pKey);
8090
0
                break;
8091
0
        #endif /* HAVE_ED448 */
8092
0
        #ifdef HAVE_CURVE448
8093
734
            case DYNAMIC_TYPE_CURVE448:
8094
734
                wc_curve448_free((curve448_key*)*pKey);
8095
734
                break;
8096
0
        #endif /* HAVE_CURVE448 */
8097
        #if defined(HAVE_FALCON)
8098
            case DYNAMIC_TYPE_FALCON:
8099
                wc_falcon_free((falcon_key*)*pKey);
8100
                break;
8101
        #endif /* HAVE_FALCON */
8102
        #if defined(HAVE_DILITHIUM)
8103
            case DYNAMIC_TYPE_DILITHIUM:
8104
                wc_dilithium_free((dilithium_key*)*pKey);
8105
                break;
8106
        #endif /* HAVE_DILITHIUM */
8107
0
        #ifndef NO_DH
8108
1.48k
            case DYNAMIC_TYPE_DH:
8109
1.48k
                wc_FreeDhKey((DhKey*)*pKey);
8110
1.48k
                break;
8111
0
        #endif /* !NO_DH */
8112
0
            default:
8113
0
                break;
8114
22.8k
        }
8115
22.8k
        XFREE(*pKey, ssl->heap, type);
8116
8117
        /* Reset pointer */
8118
22.8k
        *pKey = NULL;
8119
22.8k
    }
8120
915k
}
8121
8122
int AllocKey(WOLFSSL* ssl, int type, void** pKey)
8123
22.9k
{
8124
22.9k
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
8125
22.9k
    size_t sz = 0;
8126
22.9k
#ifdef HAVE_ECC
8127
22.9k
    ecc_key* eccKey;
8128
22.9k
#endif /* HAVE_ECC */
8129
#if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8130
    defined(WC_ASYNC_ENABLE_ECC)
8131
    ecc_nb_ctx_t* nbCtx;
8132
#endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW && WC_ASYNC_ENABLE_ECC*/
8133
8134
22.9k
    if (ssl == NULL || pKey == NULL) {
8135
0
        return BAD_FUNC_ARG;
8136
0
    }
8137
8138
    /* Sanity check key destination */
8139
22.9k
    if (*pKey != NULL) {
8140
0
        WOLFSSL_MSG("Key already present!");
8141
    #ifdef WOLFSSL_ASYNC_CRYPT
8142
        /* allow calling this again for async reentry */
8143
        if (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E)) {
8144
            return 0;
8145
        }
8146
    #endif
8147
0
        return BAD_STATE_E;
8148
0
    }
8149
8150
    /* Determine size */
8151
22.9k
    switch (type) {
8152
0
    #ifndef NO_RSA
8153
8.83k
        case DYNAMIC_TYPE_RSA:
8154
8.83k
            sz = sizeof(RsaKey);
8155
8.83k
            break;
8156
0
    #endif /* ! NO_RSA */
8157
0
    #ifdef HAVE_ECC
8158
10.0k
        case DYNAMIC_TYPE_ECC:
8159
10.0k
            sz = sizeof(ecc_key);
8160
10.0k
            break;
8161
0
    #endif /* HAVE_ECC */
8162
0
    #ifdef HAVE_ED25519
8163
0
        case DYNAMIC_TYPE_ED25519:
8164
0
            sz = sizeof(ed25519_key);
8165
0
            break;
8166
0
    #endif /* HAVE_ED25519 */
8167
0
    #ifdef HAVE_CURVE25519
8168
1.77k
        case DYNAMIC_TYPE_CURVE25519:
8169
1.77k
            sz = sizeof(curve25519_key);
8170
1.77k
            break;
8171
0
    #endif /* HAVE_CURVE25519 */
8172
0
    #ifdef HAVE_ED448
8173
0
        case DYNAMIC_TYPE_ED448:
8174
0
            sz = sizeof(ed448_key);
8175
0
            break;
8176
0
    #endif /* HAVE_ED448 */
8177
0
    #ifdef HAVE_CURVE448
8178
744
        case DYNAMIC_TYPE_CURVE448:
8179
744
            sz = sizeof(curve448_key);
8180
744
            break;
8181
0
    #endif /* HAVE_CURVE448 */
8182
    #if defined(HAVE_FALCON)
8183
        case DYNAMIC_TYPE_FALCON:
8184
            sz = sizeof(falcon_key);
8185
            break;
8186
    #endif /* HAVE_FALCON */
8187
    #if defined(HAVE_DILITHIUM)
8188
        case DYNAMIC_TYPE_DILITHIUM:
8189
            sz = sizeof(dilithium_key);
8190
            break;
8191
    #endif /* HAVE_DILITHIUM */
8192
0
    #ifndef NO_DH
8193
1.49k
        case DYNAMIC_TYPE_DH:
8194
1.49k
            sz = sizeof(DhKey);
8195
1.49k
            break;
8196
0
    #endif /* !NO_DH */
8197
0
        default:
8198
0
            return BAD_FUNC_ARG;
8199
22.9k
    }
8200
8201
    /* Allocate memory for key */
8202
22.9k
    *pKey = (void *)XMALLOC(sz, ssl->heap, type);
8203
22.9k
    if (*pKey == NULL) {
8204
91
        return MEMORY_E;
8205
91
    }
8206
8207
    /* Initialize key */
8208
22.8k
    switch (type) {
8209
0
    #ifndef NO_RSA
8210
8.81k
        case DYNAMIC_TYPE_RSA:
8211
8.81k
            ret = wc_InitRsaKey_ex((RsaKey*)*pKey, ssl->heap, ssl->devId);
8212
8.81k
            break;
8213
0
    #endif /* ! NO_RSA */
8214
0
    #ifdef HAVE_ECC
8215
10.0k
        case DYNAMIC_TYPE_ECC:
8216
10.0k
            eccKey = (ecc_key*)*pKey;
8217
10.0k
            ret = wc_ecc_init_ex(eccKey, ssl->heap, ssl->devId);
8218
10.0k
            if (ret == 0) {
8219
            #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8220
                defined(WC_ASYNC_ENABLE_ECC)
8221
                nbCtx = (ecc_nb_ctx_t*)XMALLOC(sizeof(ecc_nb_ctx_t),
8222
                            eccKey->heap, DYNAMIC_TYPE_TMP_BUFFER);
8223
                if (nbCtx == NULL) {
8224
                    ret = MEMORY_E;
8225
                }
8226
                else {
8227
                    ret = wc_ecc_set_nonblock(eccKey, nbCtx);
8228
                    if (ret != 0) {
8229
                        XFREE(nbCtx, eccKey->heap, DYNAMIC_TYPE_TMP_BUFFER);
8230
                    }
8231
                }
8232
            #endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
8233
                      WC_ASYNC_ENABLE_ECC */
8234
10.0k
            }
8235
10.0k
            break;
8236
0
    #endif /* HAVE_ECC */
8237
0
    #ifdef HAVE_ED25519
8238
0
        case DYNAMIC_TYPE_ED25519:
8239
0
            wc_ed25519_init_ex((ed25519_key*)*pKey, ssl->heap, ssl->devId);
8240
0
            ret = 0;
8241
0
            break;
8242
0
    #endif /* HAVE_CURVE25519 */
8243
0
    #ifdef HAVE_CURVE25519
8244
1.75k
        case DYNAMIC_TYPE_CURVE25519:
8245
1.75k
            wc_curve25519_init_ex((curve25519_key*)*pKey, ssl->heap, ssl->devId);
8246
1.75k
            ret = 0;
8247
1.75k
            break;
8248
0
    #endif /* HAVE_CURVE25519 */
8249
0
    #ifdef HAVE_ED448
8250
0
        case DYNAMIC_TYPE_ED448:
8251
0
            wc_ed448_init_ex((ed448_key*)*pKey, ssl->heap, ssl->devId);
8252
0
            ret = 0;
8253
0
            break;
8254
0
    #endif /* HAVE_CURVE448 */
8255
    #if defined(HAVE_FALCON)
8256
        case DYNAMIC_TYPE_FALCON:
8257
            wc_falcon_init_ex((falcon_key*)*pKey, ssl->heap, ssl->devId);
8258
            ret = 0;
8259
            break;
8260
    #endif /* HAVE_FALCON */
8261
    #if defined(HAVE_DILITHIUM)
8262
        case DYNAMIC_TYPE_DILITHIUM:
8263
            wc_dilithium_init_ex((dilithium_key*)*pKey, ssl->heap, ssl->devId);
8264
            ret = 0;
8265
            break;
8266
    #endif /* HAVE_DILITHIUM */
8267
0
    #ifdef HAVE_CURVE448
8268
734
        case DYNAMIC_TYPE_CURVE448:
8269
734
            wc_curve448_init((curve448_key*)*pKey);
8270
734
            ret = 0;
8271
734
            break;
8272
0
    #endif /* HAVE_CURVE448 */
8273
0
    #ifndef NO_DH
8274
1.48k
        case DYNAMIC_TYPE_DH:
8275
1.48k
            ret = wc_InitDhKey_ex((DhKey*)*pKey, ssl->heap, ssl->devId);
8276
1.48k
            break;
8277
0
    #endif /* !NO_DH */
8278
0
        default:
8279
0
            return BAD_FUNC_ARG;
8280
22.8k
    }
8281
8282
    /* On error free handshake key */
8283
22.8k
    if (ret != 0) {
8284
0
        FreeKey(ssl, type, pKey);
8285
0
    }
8286
8287
22.8k
    return ret;
8288
22.8k
}
8289
8290
#if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
8291
    defined(HAVE_CURVE25519) || defined(HAVE_ED448) || \
8292
    defined(HAVE_CURVE448) || defined(HAVE_FALCON) || defined(HAVE_DILITHIUM)
8293
static int ReuseKey(WOLFSSL* ssl, int type, void* pKey)
8294
0
{
8295
0
    int ret = 0;
8296
8297
0
    (void)ssl;
8298
8299
0
    switch (type) {
8300
0
    #ifndef NO_RSA
8301
0
        case DYNAMIC_TYPE_RSA:
8302
0
            wc_FreeRsaKey((RsaKey*)pKey);
8303
0
            ret = wc_InitRsaKey_ex((RsaKey*)pKey, ssl->heap, ssl->devId);
8304
0
            break;
8305
0
    #endif /* ! NO_RSA */
8306
0
    #ifdef HAVE_ECC
8307
0
        case DYNAMIC_TYPE_ECC:
8308
0
            wc_ecc_free((ecc_key*)pKey);
8309
0
            ret = wc_ecc_init_ex((ecc_key*)pKey, ssl->heap, ssl->devId);
8310
0
            break;
8311
0
    #endif /* HAVE_ECC */
8312
0
    #ifdef HAVE_ED25519
8313
0
        case DYNAMIC_TYPE_ED25519:
8314
0
            wc_ed25519_free((ed25519_key*)pKey);
8315
0
            ret = wc_ed25519_init_ex((ed25519_key*)pKey, ssl->heap,
8316
0
                ssl->devId);
8317
0
            break;
8318
0
    #endif /* HAVE_CURVE25519 */
8319
0
    #ifdef HAVE_CURVE25519
8320
0
        case DYNAMIC_TYPE_CURVE25519:
8321
0
            wc_curve25519_free((curve25519_key*)pKey);
8322
0
            ret = wc_curve25519_init_ex((curve25519_key*)pKey, ssl->heap,
8323
0
                ssl->devId);
8324
0
            break;
8325
0
    #endif /* HAVE_CURVE25519 */
8326
0
    #ifdef HAVE_ED448
8327
0
        case DYNAMIC_TYPE_ED448:
8328
0
            wc_ed448_free((ed448_key*)pKey);
8329
0
            ret = wc_ed448_init_ex((ed448_key*)pKey, ssl->heap, ssl->devId);
8330
0
            break;
8331
0
    #endif /* HAVE_CURVE448 */
8332
0
    #ifdef HAVE_CURVE448
8333
0
        case DYNAMIC_TYPE_CURVE448:
8334
0
            wc_curve448_free((curve448_key*)pKey);
8335
0
            ret = wc_curve448_init((curve448_key*)pKey);
8336
0
            break;
8337
0
    #endif /* HAVE_CURVE448 */
8338
    #if defined(HAVE_FALCON)
8339
        case DYNAMIC_TYPE_FALCON:
8340
            wc_falcon_free((falcon_key*)pKey);
8341
            ret = wc_falcon_init((falcon_key*)pKey);
8342
            break;
8343
    #endif /* HAVE_FALCON */
8344
    #if defined(HAVE_DILITHIUM)
8345
        case DYNAMIC_TYPE_DILITHIUM:
8346
            wc_dilithium_free((dilithium_key*)pKey);
8347
            ret = wc_dilithium_init((dilithium_key*)pKey);
8348
            break;
8349
    #endif /* HAVE_DILITHIUM */
8350
0
    #ifndef NO_DH
8351
0
        case DYNAMIC_TYPE_DH:
8352
0
            wc_FreeDhKey((DhKey*)pKey);
8353
0
            ret = wc_InitDhKey_ex((DhKey*)pKey, ssl->heap, ssl->devId);
8354
0
            break;
8355
0
    #endif /* !NO_DH */
8356
0
        default:
8357
0
            return BAD_FUNC_ARG;
8358
0
    }
8359
8360
0
    return ret;
8361
0
}
8362
#endif
8363
8364
#ifdef WOLFSSL_ASYNC_IO
8365
void FreeAsyncCtx(WOLFSSL* ssl, byte freeAsync)
8366
97.9k
{
8367
97.9k
    if (ssl->async != NULL) {
8368
21.3k
        if (ssl->async->freeArgs != NULL) {
8369
10.6k
            ssl->async->freeArgs(ssl, ssl->async->args);
8370
10.6k
            ssl->async->freeArgs = NULL;
8371
10.6k
        }
8372
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WOLFSSL_NO_TLS12)
8373
        if (ssl->options.buildArgsSet) {
8374
            FreeBuildMsgArgs(ssl, &ssl->async->buildArgs);
8375
            ssl->options.buildArgsSet = 0;
8376
        }
8377
#endif
8378
21.3k
        if (freeAsync) {
8379
10.6k
            XFREE(ssl->async, ssl->heap, DYNAMIC_TYPE_ASYNC);
8380
10.6k
            ssl->async = NULL;
8381
10.6k
        }
8382
21.3k
    }
8383
97.9k
}
8384
#endif
8385
8386
void FreeKeyExchange(WOLFSSL* ssl)
8387
111k
{
8388
    /* Cleanup signature buffer */
8389
111k
    if (ssl->buffers.sig.buffer) {
8390
1.01k
        XFREE(ssl->buffers.sig.buffer, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
8391
1.01k
        ssl->buffers.sig.buffer = NULL;
8392
1.01k
        ssl->buffers.sig.length = 0;
8393
1.01k
    }
8394
8395
    /* Cleanup digest buffer */
8396
111k
    if (ssl->buffers.digest.buffer) {
8397
        /* Only free if digest buffer was not set using SetDigest */
8398
7.73k
        if (!ssl->options.dontFreeDigest) {
8399
7.73k
            XFREE(ssl->buffers.digest.buffer, ssl->heap, DYNAMIC_TYPE_DIGEST);
8400
7.73k
        }
8401
7.73k
        ssl->buffers.digest.buffer = NULL;
8402
7.73k
        ssl->buffers.digest.length = 0;
8403
7.73k
        ssl->options.dontFreeDigest = 0;
8404
7.73k
    }
8405
8406
    /* Free handshake key */
8407
111k
    FreeKey(ssl, (int)ssl->hsType, &ssl->hsKey);
8408
#ifdef WOLFSSL_DUAL_ALG_CERTS
8409
    FreeKey(ssl, ssl->hsAltType, &ssl->hsAltKey);
8410
#endif /* WOLFSSL_DUAL_ALG_CERTS */
8411
8412
111k
#ifndef NO_DH
8413
    /* Free temp DH key */
8414
111k
    FreeKey(ssl, DYNAMIC_TYPE_DH, (void**)&ssl->buffers.serverDH_Key);
8415
111k
#endif
8416
111k
}
8417
8418
8419
/* Free up all memory used by Suites structure from WOLFSSL */
8420
void FreeSuites(WOLFSSL* ssl)
8421
{
8422
#ifdef OPENSSL_EXTRA
8423
    if (ssl->suitesStack != NULL) {
8424
        /* Enough to free stack structure since WOLFSSL_CIPHER
8425
         * isn't allocated separately. */
8426
        wolfSSL_sk_SSL_CIPHER_free(ssl->suitesStack);
8427
        ssl->suitesStack = NULL;
8428
    }
8429
    if (ssl->clSuitesStack != NULL) {
8430
        /* Enough to free stack structure since WOLFSSL_CIPHER
8431
         * isn't allocated separately. */
8432
        wolfSSL_sk_SSL_CIPHER_free(ssl->clSuitesStack);
8433
        ssl->clSuitesStack = NULL;
8434
    }
8435
    XFREE(ssl->clSuites, ssl->heap, DYNAMIC_TYPE_SUITES);
8436
    ssl->clSuites = NULL;
8437
#endif
8438
    XFREE(ssl->suites, ssl->heap, DYNAMIC_TYPE_SUITES);
8439
    ssl->suites = NULL;
8440
}
8441
8442
8443
/* In case holding SSL object in array and don't want to free actual ssl */
8444
void wolfSSL_ResourceFree(WOLFSSL* ssl)
8445
{
8446
    /* Note: any resources used during the handshake should be released in the
8447
     * function FreeHandshakeResources(). Be careful with the special cases
8448
     * like the RNG which may optionally be kept for the whole session. (For
8449
     * example with the RNG, it isn't used beyond the handshake except when
8450
     * using stream ciphers where it is retained. */
8451
8452
    if (ssl->options.side == WOLFSSL_SERVER_END) {
8453
        WOLFSSL_MSG("Free'ing server ssl");
8454
    }
8455
    else {
8456
        WOLFSSL_MSG("Free'ing client ssl");
8457
    }
8458
8459
#ifdef HAVE_EX_DATA_CLEANUP_HOOKS
8460
    wolfSSL_CRYPTO_cleanup_ex_data(&ssl->ex_data);
8461
#endif
8462
8463
    FreeCiphers(ssl);
8464
    FreeArrays(ssl, 0);
8465
    FreeKeyExchange(ssl);
8466
#ifdef WOLFSSL_ASYNC_IO
8467
    /* Cleanup async */
8468
    FreeAsyncCtx(ssl, 1);
8469
#endif
8470
    if (ssl->options.weOwnRng) {
8471
        wc_FreeRng(ssl->rng);
8472
        XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
8473
        ssl->rng = NULL;
8474
        ssl->options.weOwnRng = 0;
8475
    }
8476
    FreeSuites(ssl);
8477
    FreeHandshakeHashes(ssl);
8478
#ifdef HAVE_ECH
8479
    /* try to free the ech hashes in case we errored out */
8480
    ssl->hsHashes = ssl->hsHashesEch;
8481
    FreeHandshakeHashes(ssl);
8482
    ssl->hsHashes = ssl->hsHashesEchInner;
8483
    FreeHandshakeHashes(ssl);
8484
#endif
8485
    XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
8486
8487
    /* clear keys struct after session */
8488
    ForceZero(&ssl->keys, sizeof(Keys));
8489
8490
#ifdef WOLFSSL_TLS13
8491
    ForceZero(&ssl->clientSecret, sizeof(ssl->clientSecret));
8492
    ForceZero(&ssl->serverSecret, sizeof(ssl->serverSecret));
8493
8494
#if defined(HAVE_ECH)
8495
    if (ssl->options.useEch == 1) {
8496
        FreeEchConfigs(ssl->echConfigs, ssl->heap);
8497
        ssl->echConfigs = NULL;
8498
        ssl->options.useEch = 0;
8499
    }
8500
#endif /* HAVE_ECH */
8501
#endif /* WOLFSSL_TLS13 */
8502
#ifdef WOLFSSL_HAVE_TLS_UNIQUE
8503
    ForceZero(&ssl->clientFinished, TLS_FINISHED_SZ_MAX);
8504
    ForceZero(&ssl->serverFinished, TLS_FINISHED_SZ_MAX);
8505
    ssl->serverFinished_len = 0;
8506
    ssl->clientFinished_len = 0;
8507
#endif
8508
#ifndef NO_DH
8509
    if (ssl->buffers.serverDH_Priv.buffer != NULL) {
8510
        ForceZero(ssl->buffers.serverDH_Priv.buffer,
8511
                                             ssl->buffers.serverDH_Priv.length);
8512
    }
8513
    XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8514
    XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8515
    /* parameters (p,g) may be owned by ctx */
8516
    if (ssl->buffers.weOwnDH) {
8517
        XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8518
        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8519
    }
8520
#endif /* !NO_DH */
8521
#ifndef NO_CERTS
8522
    ssl->keepCert = 0; /* make sure certificate is free'd */
8523
    wolfSSL_UnloadCertsKeys(ssl);
8524
#endif
8525
#ifndef NO_RSA
8526
    FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
8527
    ssl->peerRsaKeyPresent = 0;
8528
#endif
8529
#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS)
8530
    XFREE(ssl->peerSceTsipEncRsaKeyIndex, ssl->heap, DYNAMIC_TYPE_RSA);
8531
    Renesas_cmn_Cleanup(ssl);
8532
#endif
8533
#ifndef NO_TLS
8534
    if (ssl->buffers.inputBuffer.dynamicFlag)
8535
        ShrinkInputBuffer(ssl, FORCED_FREE);
8536
    if (ssl->buffers.outputBuffer.dynamicFlag)
8537
        ShrinkOutputBuffer(ssl);
8538
#endif
8539
#ifdef WOLFSSL_THREADED_CRYPT
8540
    {
8541
        int i;
8542
        for (i = 0; i < WOLFSSL_THREADED_CRYPT_CNT; i++) {
8543
            bufferStatic* buff = &ssl->buffers.encrypt[i].buffer;
8544
8545
            ssl->buffers.encrypt[i].stop = 1;
8546
            FreeCiphersSide(&ssl->buffers.encrypt[i].encrypt, ssl->heap);
8547
            if (buff->dynamicFlag) {
8548
                XFREE(buff->buffer - buff->offset, ssl->heap,
8549
                    DYNAMIC_TYPE_OUT_BUFFER);
8550
                buff->buffer      = buff->staticBuffer;
8551
                buff->bufferSize  = STATIC_BUFFER_LEN;
8552
                buff->offset      = 0;
8553
                buff->dynamicFlag = 0;
8554
            }
8555
        }
8556
    }
8557
#endif
8558
#if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
8559
    if (ssl->buffers.tls13CookieSecret.buffer != NULL) {
8560
        ForceZero(ssl->buffers.tls13CookieSecret.buffer,
8561
            ssl->buffers.tls13CookieSecret.length);
8562
    }
8563
    XFREE(ssl->buffers.tls13CookieSecret.buffer, ssl->heap,
8564
          DYNAMIC_TYPE_COOKIE_PWD);
8565
#endif
8566
#ifdef WOLFSSL_DTLS
8567
    DtlsMsgPoolReset(ssl);
8568
    if (ssl->dtls_rx_msg_list != NULL) {
8569
        DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
8570
        ssl->dtls_rx_msg_list = NULL;
8571
        ssl->dtls_rx_msg_list_sz = 0;
8572
    }
8573
    XFREE(ssl->buffers.dtlsCtx.peer.sa, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
8574
    ssl->buffers.dtlsCtx.peer.sa = NULL;
8575
#ifdef WOLFSSL_RW_THREADED
8576
    wc_FreeRwLock(&ssl->buffers.dtlsCtx.peerLock);
8577
#endif
8578
#ifdef WOLFSSL_DTLS_CID
8579
    XFREE(ssl->buffers.dtlsCtx.pendingPeer.sa, ssl->heap,
8580
            DYNAMIC_TYPE_SOCKADDR);
8581
    ssl->buffers.dtlsCtx.pendingPeer.sa = NULL;
8582
#endif
8583
#ifndef NO_WOLFSSL_SERVER
8584
    if (ssl->buffers.dtlsCookieSecret.buffer != NULL) {
8585
        ForceZero(ssl->buffers.dtlsCookieSecret.buffer,
8586
            ssl->buffers.dtlsCookieSecret.length);
8587
    }
8588
    XFREE(ssl->buffers.dtlsCookieSecret.buffer, ssl->heap,
8589
          DYNAMIC_TYPE_COOKIE_PWD);
8590
#endif
8591
8592
#ifdef WOLFSSL_DTLS13
8593
    if (ssl->dtls13ClientHello != NULL) {
8594
        XFREE(ssl->dtls13ClientHello, ssl->heap, DYNAMIC_TYPE_DTLS_MSG);
8595
        ssl->dtls13ClientHello = NULL;
8596
        ssl->dtls13ClientHelloSz = 0;
8597
    }
8598
#endif /* WOLFSSL_DTLS13 */
8599
8600
#endif /* WOLFSSL_DTLS */
8601
#ifdef OPENSSL_EXTRA
8602
#ifndef NO_BIO
8603
    /* Don't free if there was/is a previous element in the chain.
8604
     * This means that this BIO was part of a chain that will be
8605
     * free'd separately. */
8606
    if (ssl->biord != ssl->biowr)        /* only free write if different */
8607
        if (ssl->biowr != NULL && ssl->biowr->prev == NULL)
8608
            wolfSSL_BIO_free(ssl->biowr);
8609
    if (ssl->biord != NULL && ssl->biord->prev == NULL)
8610
        wolfSSL_BIO_free(ssl->biord);
8611
    ssl->biowr = NULL;
8612
    ssl->biord = NULL;
8613
#endif
8614
#endif
8615
#ifdef HAVE_LIBZ
8616
    FreeStreams(ssl);
8617
#endif
8618
#ifdef HAVE_ECC
8619
    FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
8620
    ssl->peerEccKeyPresent = 0;
8621
    FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
8622
    ssl->peerEccDsaKeyPresent = 0;
8623
#endif
8624
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) ||defined(HAVE_CURVE448)
8625
    {
8626
        int dtype = 0;
8627
    #ifdef HAVE_ECC
8628
        dtype = DYNAMIC_TYPE_ECC;
8629
    #endif
8630
    #ifdef HAVE_CURVE25519
8631
        if (ssl->peerX25519KeyPresent
8632
    #ifdef HAVE_ECC
8633
                           || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519
8634
    #endif /* HAVE_ECC */
8635
           )
8636
        {
8637
            dtype = DYNAMIC_TYPE_CURVE25519;
8638
        }
8639
    #endif /* HAVE_CURVE25519 */
8640
    #ifdef HAVE_CURVE448
8641
        if (ssl->peerX448KeyPresent
8642
    #ifdef HAVE_ECC
8643
                             || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448
8644
    #endif /* HAVE_ECC */
8645
           )
8646
        {
8647
            dtype = DYNAMIC_TYPE_CURVE448;
8648
        }
8649
    #endif /* HAVE_CURVE448 */
8650
        FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
8651
        ssl->eccTempKeyPresent = 0;
8652
    }
8653
#endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
8654
#ifdef HAVE_CURVE25519
8655
    FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
8656
    ssl->peerX25519KeyPresent = 0;
8657
#endif
8658
#ifdef HAVE_ED25519
8659
    FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
8660
    ssl->peerEd25519KeyPresent = 0;
8661
    #ifdef HAVE_PK_CALLBACKS
8662
        if (ssl->buffers.peerEd25519Key.buffer != NULL) {
8663
            XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
8664
                                                          DYNAMIC_TYPE_ED25519);
8665
            ssl->buffers.peerEd25519Key.buffer = NULL;
8666
        }
8667
    #endif
8668
#endif
8669
#ifdef HAVE_CURVE448
8670
    FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
8671
    ssl->peerX448KeyPresent = 0;
8672
#endif
8673
#ifdef HAVE_ED448
8674
    FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
8675
    ssl->peerEd448KeyPresent = 0;
8676
    #ifdef HAVE_PK_CALLBACKS
8677
        if (ssl->buffers.peerEd448Key.buffer != NULL) {
8678
            XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap,
8679
                                                            DYNAMIC_TYPE_ED448);
8680
            ssl->buffers.peerEd448Key.buffer = NULL;
8681
        }
8682
    #endif
8683
#endif
8684
#if defined(HAVE_FALCON)
8685
    FreeKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey);
8686
    ssl->peerFalconKeyPresent = 0;
8687
#endif
8688
#ifdef HAVE_PK_CALLBACKS
8689
    #ifdef HAVE_ECC
8690
        XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
8691
    #endif /* HAVE_ECC */
8692
    #ifndef NO_RSA
8693
        XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
8694
    #endif /* NO_RSA */
8695
#endif /* HAVE_PK_CALLBACKS */
8696
#ifdef HAVE_TLS_EXTENSIONS
8697
#if !defined(NO_TLS)
8698
    TLSX_FreeAll(ssl->extensions, ssl->heap);
8699
#endif /* !NO_TLS */
8700
#ifdef HAVE_ALPN
8701
    if (ssl->alpn_peer_requested != NULL) {
8702
        XFREE(ssl->alpn_peer_requested, ssl->heap, DYNAMIC_TYPE_ALPN);
8703
        ssl->alpn_peer_requested = NULL;
8704
        ssl->alpn_peer_requested_length = 0;
8705
    }
8706
#endif
8707
#endif /* HAVE_TLS_EXTENSIONS */
8708
#if defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
8709
    if (ssl->mnCtx) {
8710
        mynewt_ctx_clear(ssl->mnCtx);
8711
        ssl->mnCtx = NULL;
8712
    }
8713
#endif
8714
#ifdef HAVE_NETX
8715
    if (ssl->nxCtx.nxPacket)
8716
        nx_packet_release(ssl->nxCtx.nxPacket);
8717
#endif
8718
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
8719
    if (ssl->x509_store_pt)
8720
        wolfSSL_X509_STORE_free(ssl->x509_store_pt);
8721
#endif
8722
#ifdef KEEP_PEER_CERT
8723
    FreeX509(&ssl->peerCert);
8724
#endif
8725
8726
    if (ssl->session != NULL)
8727
        wolfSSL_FreeSession(ssl->ctx, ssl->session);
8728
#ifdef HAVE_WRITE_DUP
8729
    if (ssl->dupWrite) {
8730
        FreeWriteDup(ssl);
8731
    }
8732
#endif
8733
#ifdef OPENSSL_EXTRA
8734
    XFREE(ssl->param, ssl->heap, DYNAMIC_TYPE_OPENSSL);
8735
#endif
8736
#if defined(HAVE_OCSP) && (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY))
8737
    if (ssl->ocspResp) {
8738
        XFREE(ssl->ocspResp, NULL, 0);
8739
        ssl->ocspResp = NULL;
8740
        ssl->ocspRespSz = 0;
8741
    }
8742
#endif /* defined(HAVE_OCSP) && (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)) */
8743
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
8744
    while (ssl->certReqCtx != NULL) {
8745
        CertReqCtx* curr = ssl->certReqCtx;
8746
        ssl->certReqCtx = curr->next;
8747
        XFREE(curr, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8748
    }
8749
#endif
8750
#ifdef WOLFSSL_STATIC_EPHEMERAL
8751
    #ifndef NO_DH
8752
    FreeDer(&ssl->staticKE.dhKey);
8753
    #endif
8754
    #ifdef HAVE_ECC
8755
    FreeDer(&ssl->staticKE.ecKey);
8756
    #endif
8757
    #ifdef HAVE_CURVE25519
8758
    FreeDer(&ssl->staticKE.x25519Key);
8759
    #endif
8760
    #ifdef HAVE_CURVE448
8761
    FreeDer(&ssl->staticKE.x448Key);
8762
    #endif
8763
#endif
8764
8765
#ifdef WOLFSSL_STATIC_MEMORY
8766
    /* check if using fixed io buffers and free them */
8767
    if (ssl->heap != NULL) {
8768
    #ifdef WOLFSSL_HEAP_TEST
8769
    /* avoid dereferencing a test value */
8770
    if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
8771
    #endif
8772
        void* heap = ssl->ctx ? ssl->ctx->heap : ssl->heap;
8773
    #ifndef WOLFSSL_STATIC_MEMORY_LEAN
8774
        WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
8775
        WOLFSSL_HEAP*      ctx_heap;
8776
8777
        ctx_heap = ssl_hint->memory;
8778
    #ifndef SINGLE_THREADED
8779
        if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
8780
            WOLFSSL_MSG("Bad memory_mutex lock");
8781
        }
8782
    #endif
8783
        ctx_heap->curIO--;
8784
        if (FreeFixedIO(ctx_heap, &(ssl_hint->outBuf)) != 1) {
8785
            WOLFSSL_MSG("Error freeing fixed output buffer");
8786
        }
8787
        if (FreeFixedIO(ctx_heap, &(ssl_hint->inBuf)) != 1) {
8788
            WOLFSSL_MSG("Error freeing fixed output buffer");
8789
        }
8790
8791
        /* check if handshake count has been decreased*/
8792
        if (ssl_hint->haFlag && ctx_heap->curHa > 0) {
8793
            ctx_heap->curHa--;
8794
        }
8795
    #ifndef SINGLE_THREADED
8796
        wc_UnLockMutex(&(ctx_heap->memory_mutex));
8797
    #endif
8798
8799
        /* check if tracking stats */
8800
        if (ctx_heap->flag & WOLFMEM_TRACK_STATS) {
8801
            XFREE(ssl_hint->stats, heap, DYNAMIC_TYPE_SSL);
8802
        }
8803
    #endif /* !WOLFSSL_STATIC_MEMORY_LEAN */
8804
        XFREE(ssl->heap, heap, DYNAMIC_TYPE_SSL);
8805
    #ifdef WOLFSSL_HEAP_TEST
8806
    }
8807
    #endif
8808
    }
8809
#endif /* WOLFSSL_STATIC_MEMORY */
8810
#ifdef OPENSSL_EXTRA
8811
    /* Enough to free stack structure since WOLFSSL_CIPHER
8812
     * isn't allocated separately. */
8813
    wolfSSL_sk_CIPHER_free(ssl->supportedCiphers);
8814
    wolfSSL_sk_X509_pop_free(ssl->peerCertChain, NULL);
8815
    wolfSSL_sk_X509_pop_free(ssl->verifiedChain, NULL);
8816
    #ifdef KEEP_OUR_CERT
8817
    wolfSSL_sk_X509_pop_free(ssl->ourCertChain, NULL);
8818
    #endif
8819
#endif
8820
#ifndef WOLFSSL_NO_CA_NAMES
8821
    wolfSSL_sk_X509_NAME_pop_free(ssl->client_ca_names, NULL);
8822
    ssl->client_ca_names = NULL;
8823
#endif
8824
#ifdef WOLFSSL_DTLS13
8825
    Dtls13FreeFsmResources(ssl);
8826
8827
#ifdef WOLFSSL_RW_THREADED
8828
    wc_FreeMutex(&ssl->dtls13Rtx.mutex);
8829
#endif
8830
#endif /* WOLFSSL_DTLS13 */
8831
#ifdef WOLFSSL_QUIC
8832
    wolfSSL_quic_free(ssl);
8833
#endif
8834
#if defined(WOLFSSL_HAPROXY)
8835
    wolfSSL_CTX_free(ssl->initial_ctx);
8836
    ssl->initial_ctx = NULL;
8837
#endif
8838
#ifdef WOLFSSL_DUAL_ALG_CERTS
8839
    XFREE(ssl->peerSigSpec, ssl->heap, DYNAMIC_TYPE_TLSX);
8840
#endif
8841
}
8842
8843
/* Free any handshake resources no longer needed */
8844
void FreeHandshakeResources(WOLFSSL* ssl)
8845
0
{
8846
0
    WOLFSSL_ENTER("FreeHandshakeResources");
8847
8848
#ifdef WOLFSSL_DTLS
8849
    if (ssl->options.dtls) {
8850
        /* DTLS_POOL (DTLSv1.3 flushes the queue autonomously) */
8851
        if(!IsAtLeastTLSv1_3(ssl->version)) {
8852
            DtlsMsgPoolReset(ssl);
8853
            DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
8854
            ssl->dtls_rx_msg_list = NULL;
8855
            ssl->dtls_rx_msg_list_sz = 0;
8856
        }
8857
#ifdef WOLFSSL_DTLS13
8858
        if (ssl->dtls13ClientHello != NULL) {
8859
            XFREE(ssl->dtls13ClientHello, ssl->heap, DYNAMIC_TYPE_DTLS_MSG);
8860
            ssl->dtls13ClientHello = NULL;
8861
            ssl->dtls13ClientHelloSz = 0;
8862
        }
8863
#endif /* WOLFSSL_DTLS13 */
8864
    }
8865
#endif
8866
8867
#ifdef HAVE_SECURE_RENEGOTIATION
8868
    if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
8869
        WOLFSSL_MSG("Secure Renegotiation needs to retain handshake resources");
8870
        return;
8871
    }
8872
#endif
8873
8874
0
#ifndef NO_TLS
8875
    /* input buffer */
8876
0
    if (ssl->buffers.inputBuffer.dynamicFlag)
8877
0
        ShrinkInputBuffer(ssl, NO_FORCED_FREE);
8878
0
#endif
8879
8880
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
8881
    if (!ssl->options.tls1_3)
8882
#endif
8883
0
    {
8884
0
    #ifndef OPENSSL_EXTRA
8885
        /* free suites unless using compatibility layer */
8886
0
        FreeSuites(ssl);
8887
0
    #endif
8888
        /* hsHashes */
8889
0
        FreeHandshakeHashes(ssl);
8890
0
    }
8891
8892
    /* RNG */
8893
0
    if (ssl->options.tls1_1 == 0
8894
0
#ifndef WOLFSSL_AEAD_ONLY
8895
0
        || ssl->specs.cipher_type == stream
8896
0
#endif
8897
0
#if defined(WOLFSSL_TLS13)
8898
    /* Post-handshake auth requires random on client side for TLS 1.3.
8899
     * Session ticket requires random on server side.
8900
     */
8901
0
    #if !defined(WOLFSSL_POST_HANDSHAKE_AUTH) && !defined(HAVE_SESSION_TICKET)
8902
0
        || ssl->options.tls1_3
8903
    #elif !defined(WOLFSSL_POST_HANDSHAKE_AUTH) && defined(HAVE_SESSION_TICKET)
8904
        || (ssl->options.tls1_3 && ssl->options.side == WOLFSSL_CLIENT_END)
8905
    #elif !defined(HAVE_SESSION_TICKET)
8906
        || (ssl->options.tls1_3 && ssl->options.side == WOLFSSL_SERVER_END)
8907
    #endif
8908
0
#endif
8909
0
    ) {
8910
0
        if (ssl->options.weOwnRng) {
8911
0
            wc_FreeRng(ssl->rng);
8912
0
            XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
8913
0
            ssl->rng = NULL;
8914
0
            ssl->options.weOwnRng = 0;
8915
0
        }
8916
0
    }
8917
8918
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH) && \
8919
                                                    defined(HAVE_SESSION_TICKET)
8920
    if (!ssl->options.tls1_3)
8921
#endif
8922
        /* arrays */
8923
0
        if (ssl->options.saveArrays == 0)
8924
0
            FreeArrays(ssl, 1);
8925
8926
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
8927
    if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
8928
#endif
8929
0
    {
8930
0
#ifndef NO_RSA
8931
        /* peerRsaKey */
8932
0
        FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
8933
0
        ssl->peerRsaKeyPresent = 0;
8934
0
#endif
8935
0
#ifdef HAVE_ECC
8936
0
        FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
8937
0
        ssl->peerEccDsaKeyPresent = 0;
8938
0
#endif /* HAVE_ECC */
8939
0
#ifdef HAVE_ED25519
8940
0
        FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
8941
0
        ssl->peerEd25519KeyPresent = 0;
8942
0
#endif /* HAVE_ED25519 */
8943
0
#ifdef HAVE_ED448
8944
0
        FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
8945
0
        ssl->peerEd448KeyPresent = 0;
8946
0
#endif /* HAVE_ED448 */
8947
#if defined(HAVE_FALCON)
8948
        FreeKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey);
8949
        ssl->peerFalconKeyPresent = 0;
8950
#endif /* HAVE_FALCON */
8951
#if defined(HAVE_DILITHIUM)
8952
        FreeKey(ssl, DYNAMIC_TYPE_DILITHIUM, (void**)&ssl->peerDilithiumKey);
8953
        ssl->peerDilithiumKeyPresent = 0;
8954
#endif /* HAVE_DILITHIUM */
8955
0
    }
8956
8957
0
#ifdef HAVE_ECC
8958
0
    FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
8959
0
    ssl->peerEccKeyPresent = 0;
8960
0
#endif
8961
0
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
8962
0
    {
8963
0
        int dtype;
8964
0
    #ifdef HAVE_ECC
8965
0
        dtype = DYNAMIC_TYPE_ECC;
8966
    #elif defined(HAVE_CURVE25519)
8967
        dtype = DYNAMIC_TYPE_CURVE25519;
8968
    #else
8969
        dtype = DYNAMIC_TYPE_CURVE448;
8970
    #endif
8971
0
    #if defined(HAVE_ECC) && defined(HAVE_CURVE25519)
8972
0
        if (ssl->peerX25519KeyPresent ||
8973
0
                              ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519)
8974
0
         {
8975
0
            dtype = DYNAMIC_TYPE_CURVE25519;
8976
0
         }
8977
0
    #endif
8978
0
    #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
8979
0
                                                          defined(HAVE_CURVE448)
8980
0
        if (ssl->peerX448KeyPresent ||
8981
0
                                ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448)
8982
0
         {
8983
0
            dtype = DYNAMIC_TYPE_CURVE448;
8984
0
         }
8985
0
    #endif
8986
0
        FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
8987
0
        ssl->eccTempKeyPresent = 0;
8988
0
    }
8989
0
#endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
8990
0
#ifdef HAVE_CURVE25519
8991
0
    FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
8992
0
    ssl->peerX25519KeyPresent = 0;
8993
0
#endif
8994
0
#ifdef HAVE_CURVE448
8995
0
    FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
8996
0
    ssl->peerX448KeyPresent = 0;
8997
0
#endif
8998
8999
0
#ifndef NO_DH
9000
0
    if (ssl->buffers.serverDH_Priv.buffer) {
9001
0
        ForceZero(ssl->buffers.serverDH_Priv.buffer,
9002
0
                                             ssl->buffers.serverDH_Priv.length);
9003
0
    }
9004
0
    XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9005
0
    ssl->buffers.serverDH_Priv.buffer = NULL;
9006
0
    XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9007
0
    ssl->buffers.serverDH_Pub.buffer = NULL;
9008
    /* parameters (p,g) may be owned by ctx */
9009
0
    if (ssl->buffers.weOwnDH) {
9010
0
        XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9011
0
        ssl->buffers.serverDH_G.buffer = NULL;
9012
0
        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9013
0
        ssl->buffers.serverDH_P.buffer = NULL;
9014
0
    }
9015
0
#endif /* !NO_DH */
9016
9017
0
#if !defined(NO_CERTS) && !defined(OPENSSL_EXTRA) && \
9018
0
    !defined(WOLFSSL_WPAS_SMALL)
9019
0
#ifndef WOLFSSL_POST_HANDSHAKE_AUTH
9020
0
    if (ssl->options.side != WOLFSSL_CLIENT_END)
9021
0
#endif
9022
0
    {
9023
0
        wolfSSL_UnloadCertsKeys(ssl);
9024
0
    }
9025
0
#endif
9026
#ifdef HAVE_PK_CALLBACKS
9027
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
9028
    if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
9029
#endif
9030
    {
9031
    #ifdef HAVE_ECC
9032
        XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
9033
        ssl->buffers.peerEccDsaKey.buffer = NULL;
9034
    #endif /* HAVE_ECC */
9035
    #ifndef NO_RSA
9036
        XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
9037
        ssl->buffers.peerRsaKey.buffer = NULL;
9038
    #endif /* NO_RSA */
9039
    #ifdef HAVE_ED25519
9040
        XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
9041
                                                          DYNAMIC_TYPE_ED25519);
9042
        ssl->buffers.peerEd25519Key.buffer = NULL;
9043
    #endif
9044
    #ifdef HAVE_ED448
9045
        XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap, DYNAMIC_TYPE_ED448);
9046
        ssl->buffers.peerEd448Key.buffer = NULL;
9047
    #endif
9048
    }
9049
#endif /* HAVE_PK_CALLBACKS */
9050
9051
0
#if defined(HAVE_TLS_EXTENSIONS) && !defined(NO_TLS)
9052
#if !defined(HAVE_SNI) && !defined(HAVE_ALPN) && !defined(WOLFSSL_DTLS_CID) && \
9053
    !defined(WOLFSSL_POST_HANDSHAKE_AUTH)
9054
    /* Some extensions need to be kept for post-handshake querying. */
9055
    TLSX_FreeAll(ssl->extensions, ssl->heap);
9056
    ssl->extensions = NULL;
9057
#else
9058
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
9059
0
    TLSX_Remove(&ssl->extensions, TLSX_SIGNATURE_ALGORITHMS, ssl->heap);
9060
0
#endif
9061
0
    TLSX_Remove(&ssl->extensions, TLSX_EC_POINT_FORMATS, ssl->heap);
9062
0
    TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap);
9063
0
#ifdef WOLFSSL_TLS13
9064
0
    TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_VERSIONS, ssl->heap);
9065
0
    TLSX_Remove(&ssl->extensions, TLSX_KEY_SHARE, ssl->heap);
9066
0
#endif
9067
0
#endif /* !HAVE_SNI && && !HAVE_ALPN && !WOLFSSL_DTLS_CID &&
9068
        * !WOLFSSL_POST_HANDSHAKE_AUTH */
9069
0
#endif /* HAVE_TLS_EXTENSIONS && !NO_TLS */
9070
9071
#if defined(HAVE_OCSP) && (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY))
9072
    if (ssl->ocspResp != NULL) {
9073
        XFREE(ssl->ocspResp, NULL, 0);
9074
        ssl->ocspResp = NULL;
9075
        ssl->ocspRespSz = 0;
9076
    }
9077
#endif /* defined(HAVE_OCSP) && (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)) */
9078
9079
#ifdef WOLFSSL_STATIC_MEMORY
9080
    /* when done with handshake decrement current handshake count */
9081
    if (ssl->heap != NULL) {
9082
    #ifdef WOLFSSL_HEAP_TEST
9083
    /* avoid dereferencing a test value */
9084
    if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
9085
    #endif
9086
        WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
9087
        WOLFSSL_HEAP*      ctx_heap;
9088
9089
        ctx_heap = ssl_hint->memory;
9090
    #ifndef SINGLE_THREADED
9091
        if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
9092
            WOLFSSL_MSG("Bad memory_mutex lock");
9093
        }
9094
    #endif
9095
    #ifndef WOLFSSL_STATIC_MEMORY_LEAN
9096
        if (ctx_heap->curHa > 0) {
9097
            ctx_heap->curHa--;
9098
        }
9099
        ssl_hint->haFlag = 0; /* set to zero since handshake has been dec */
9100
    #endif
9101
    #ifndef SINGLE_THREADED
9102
        wc_UnLockMutex(&(ctx_heap->memory_mutex));
9103
    #endif
9104
    #ifdef WOLFSSL_HEAP_TEST
9105
    }
9106
    #endif
9107
    }
9108
#endif /* WOLFSSL_STATIC_MEMORY */
9109
0
}
9110
9111
9112
/* heap argument is the heap hint used when creating SSL */
9113
void FreeSSL(WOLFSSL* ssl, void* heap)
9114
86.5k
{
9115
86.5k
    WOLFSSL_CTX* ctx = ssl->ctx;
9116
86.5k
    wolfSSL_ResourceFree(ssl);
9117
86.5k
    XFREE(ssl, heap, DYNAMIC_TYPE_SSL);
9118
86.5k
    if (ctx)
9119
86.4k
        FreeSSL_Ctx(ctx); /* will decrement and free underlying CTX if 0 */
9120
86.5k
    (void)heap;
9121
#ifdef WOLFSSL_CHECK_MEM_ZERO
9122
    wc_MemZero_Check(ssl, sizeof(*ssl));
9123
#endif
9124
86.5k
}
9125
9126
#if !defined(NO_OLD_TLS) || defined(WOLFSSL_DTLS) || \
9127
    !defined(WOLFSSL_NO_TLS12) || \
9128
    ((defined(HAVE_CHACHA) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || \
9129
     defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) \
9130
     && defined(HAVE_AEAD))
9131
9132
#if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
9133
static WC_INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2])
9134
1.11k
{
9135
1.11k
    if (verify) {
9136
344
        seq[0] = ssl->keys.peer_sequence_number_hi;
9137
344
        seq[1] = ssl->keys.peer_sequence_number_lo++;
9138
344
        if (seq[1] > ssl->keys.peer_sequence_number_lo) {
9139
            /* handle rollover */
9140
0
            ssl->keys.peer_sequence_number_hi++;
9141
0
        }
9142
344
    }
9143
774
    else {
9144
774
        seq[0] = ssl->keys.sequence_number_hi;
9145
774
        seq[1] = ssl->keys.sequence_number_lo++;
9146
774
        if (seq[1] > ssl->keys.sequence_number_lo) {
9147
            /* handle rollover */
9148
0
            ssl->keys.sequence_number_hi++;
9149
0
        }
9150
774
    }
9151
1.11k
}
9152
#endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
9153
9154
9155
#ifdef WOLFSSL_DTLS
9156
static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2])
9157
{
9158
#ifdef HAVE_SECURE_RENEGOTIATION
9159
    order = DtlsCheckOrder(ssl, order);
9160
#endif
9161
    if (order == PREV_ORDER) {
9162
        /* Previous epoch case */
9163
        if (ssl->options.haveMcast) {
9164
        #ifdef WOLFSSL_MULTICAST
9165
            seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
9166
                     (ssl->options.mcastID << 8) |
9167
                     (ssl->keys.dtls_prev_sequence_number_hi & 0xFF);
9168
        #endif
9169
        }
9170
        else
9171
            seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
9172
                     (ssl->keys.dtls_prev_sequence_number_hi & 0xFFFF);
9173
        seq[1] = ssl->keys.dtls_prev_sequence_number_lo;
9174
    }
9175
    else if (order == PEER_ORDER) {
9176
        if (ssl->options.haveMcast) {
9177
        #ifdef WOLFSSL_MULTICAST
9178
            seq[0] = ((word32)ssl->keys.curEpoch << 16) |
9179
                     (ssl->keys.curPeerId << 8) |
9180
                     (ssl->keys.curSeq_hi & 0xFF);
9181
        #endif
9182
        }
9183
        else
9184
            seq[0] = ((word32)ssl->keys.curEpoch << 16) |
9185
                     (ssl->keys.curSeq_hi & 0xFFFF);
9186
        seq[1] = ssl->keys.curSeq_lo; /* explicit from peer */
9187
    }
9188
    else {
9189
        if (ssl->options.haveMcast) {
9190
        #ifdef WOLFSSL_MULTICAST
9191
            seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
9192
                     (ssl->options.mcastID << 8) |
9193
                     (ssl->keys.dtls_sequence_number_hi & 0xFF);
9194
        #endif
9195
        }
9196
        else
9197
            seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
9198
                     (ssl->keys.dtls_sequence_number_hi & 0xFFFF);
9199
        seq[1] = ssl->keys.dtls_sequence_number_lo;
9200
    }
9201
}
9202
9203
static WC_INLINE void DtlsSEQIncrement(WOLFSSL* ssl, int order)
9204
{
9205
    word32 seq;
9206
#ifdef HAVE_SECURE_RENEGOTIATION
9207
    order = DtlsCheckOrder(ssl, order);
9208
#endif
9209
9210
    if (order == PREV_ORDER) {
9211
        seq = ssl->keys.dtls_prev_sequence_number_lo++;
9212
        if (seq > ssl->keys.dtls_prev_sequence_number_lo) {
9213
            /* handle rollover */
9214
            ssl->keys.dtls_prev_sequence_number_hi++;
9215
        }
9216
    }
9217
    else if (order == PEER_ORDER) {
9218
        seq = ssl->keys.peer_sequence_number_lo++;
9219
        if (seq > ssl->keys.peer_sequence_number_lo) {
9220
            /* handle rollover */
9221
            ssl->keys.peer_sequence_number_hi++;
9222
        }
9223
    }
9224
    else {
9225
        seq = ssl->keys.dtls_sequence_number_lo++;
9226
        if (seq > ssl->keys.dtls_sequence_number_lo) {
9227
            /* handle rollover */
9228
            ssl->keys.dtls_sequence_number_hi++;
9229
        }
9230
    }
9231
}
9232
#endif /* WOLFSSL_DTLS */
9233
9234
#if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
9235
void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
9236
26.5k
{
9237
26.5k
    word32 seq[2] = {0, 0};
9238
9239
26.5k
    if (!ssl->options.dtls) {
9240
1.11k
        GetSEQIncrement(ssl, verifyOrder, seq);
9241
1.11k
    }
9242
25.3k
    else {
9243
#ifdef WOLFSSL_DTLS
9244
        DtlsGetSEQ(ssl, verifyOrder, seq);
9245
#endif
9246
25.3k
    }
9247
9248
26.5k
    c32toa(seq[0], out);
9249
26.5k
    c32toa(seq[1], out + OPAQUE32_LEN);
9250
26.5k
}
9251
#endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
9252
#endif /* !NO_OLD_TLS || WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 ||
9253
        *     ((HAVE_CHACHA || HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_SM4_GCM ||
9254
        *       WOLFSSL_SM4_CCM) && HAVE_AEAD) */
9255
9256
#ifdef WOLFSSL_DTLS
9257
9258
/* functions for managing DTLS datagram reordering */
9259
9260
/* Need to allocate space for the handshake message header. The hashing
9261
 * routines assume the message pointer is still within the buffer that
9262
 * has the headers, and will include those headers in the hash. The store
9263
 * routines need to take that into account as well. New will allocate
9264
 * extra space for the headers. */
9265
DtlsMsg* DtlsMsgNew(word32 sz, byte tx, void* heap)
9266
{
9267
    DtlsMsg* msg;
9268
    WOLFSSL_ENTER("DtlsMsgNew");
9269
9270
    (void)heap;
9271
    msg = (DtlsMsg*)XMALLOC(sizeof(DtlsMsg), heap, DYNAMIC_TYPE_DTLS_MSG);
9272
9273
    if (msg != NULL) {
9274
        XMEMSET(msg, 0, sizeof(DtlsMsg));
9275
        msg->sz = sz;
9276
        msg->type = no_shake;
9277
        if (tx) {
9278
            msg->raw = msg->fullMsg =
9279
                    (byte*)XMALLOC(sz + DTLS_HANDSHAKE_HEADER_SZ, heap,
9280
                            DYNAMIC_TYPE_DTLS_FRAG);
9281
            msg->ready = 1;
9282
            if (msg->raw == NULL) {
9283
                DtlsMsgDelete(msg, heap);
9284
                msg = NULL;
9285
            }
9286
        }
9287
    }
9288
9289
    return msg;
9290
}
9291
9292
void DtlsMsgDelete(DtlsMsg* item, void* heap)
9293
{
9294
    (void)heap;
9295
    WOLFSSL_ENTER("DtlsMsgDelete");
9296
9297
    if (item != NULL) {
9298
        while (item->fragBucketList != NULL) {
9299
            DtlsFragBucket* next = item->fragBucketList->m.m.next;
9300
            DtlsMsgDestroyFragBucket(item->fragBucketList, heap);
9301
            item->fragBucketList = next;
9302
        }
9303
        XFREE(item->raw, heap, DYNAMIC_TYPE_DTLS_FRAG);
9304
        XFREE(item, heap, DYNAMIC_TYPE_DTLS_MSG);
9305
    }
9306
}
9307
9308
9309
void DtlsMsgListDelete(DtlsMsg* head, void* heap)
9310
{
9311
    DtlsMsg* next;
9312
    WOLFSSL_ENTER("DtlsMsgListDelete");
9313
    while (head) {
9314
        next = head->next;
9315
        DtlsMsgDelete(head, heap);
9316
        head = next;
9317
    }
9318
}
9319
9320
/**
9321
 * Drop messages when they are no longer going to be retransmitted
9322
 */
9323
void DtlsTxMsgListClean(WOLFSSL* ssl)
9324
{
9325
    DtlsMsg* head = ssl->dtls_tx_msg_list;
9326
    DtlsMsg* next;
9327
    WOLFSSL_ENTER("DtlsTxMsgListClean");
9328
    while (head) {
9329
        next = head->next;
9330
        if (VerifyForTxDtlsMsgDelete(ssl, head))
9331
            DtlsMsgDelete(head, ssl->heap);
9332
        else
9333
            /* Stored packets should be in order so break on first failed
9334
             * verify */
9335
            break;
9336
        ssl->dtls_tx_msg_list_sz--;
9337
        head = next;
9338
    }
9339
    ssl->dtls_tx_msg_list = head;
9340
}
9341
9342
static DtlsFragBucket* DtlsMsgCreateFragBucket(word32 offset, const byte* data,
9343
                                               word32 dataSz, void* heap)
9344
{
9345
    DtlsFragBucket* bucket =
9346
            (DtlsFragBucket*)XMALLOC(sizeof(DtlsFragBucket) + dataSz, heap,
9347
                                     DYNAMIC_TYPE_DTLS_FRAG);
9348
    if (bucket != NULL) {
9349
        XMEMSET(bucket, 0, sizeof(*bucket));
9350
        bucket->m.m.next = NULL;
9351
        bucket->m.m.offset = offset;
9352
        bucket->m.m.sz = dataSz;
9353
        if (data != NULL)
9354
            XMEMCPY(bucket->buf, data, dataSz);
9355
    }
9356
    (void)heap;
9357
    return bucket;
9358
}
9359
9360
void DtlsMsgDestroyFragBucket(DtlsFragBucket* fragBucket, void* heap)
9361
{
9362
    (void)heap;
9363
    XFREE(fragBucket, heap, DYNAMIC_TYPE_DTLS_FRAG);
9364
}
9365
9366
/*
9367
 * data overlaps with cur but is before next.
9368
 * data + dataSz has to end before or inside next. next can be NULL.
9369
 */
9370
static DtlsFragBucket* DtlsMsgCombineFragBuckets(DtlsMsg* msg,
9371
        DtlsFragBucket* cur, DtlsFragBucket* next, word32 offset,
9372
        const byte* data, word32 dataSz, void* heap)
9373
{
9374
    word32 offsetEnd = offset + dataSz;
9375
    word32 newOffset = min(cur->m.m.offset, offset);
9376
    word32 newOffsetEnd;
9377
    word32 newSz;
9378
    word32 overlapSz = cur->m.m.sz;
9379
    DtlsFragBucket** chosenBucket;
9380
    DtlsFragBucket* newBucket;
9381
    DtlsFragBucket* otherBucket;
9382
    byte combineNext = FALSE;
9383
9384
    if (next != NULL && offsetEnd >= next->m.m.offset)
9385
        combineNext = TRUE;
9386
9387
    if (combineNext)
9388
        newOffsetEnd = next->m.m.offset + next->m.m.sz;
9389
    else
9390
        newOffsetEnd = max(cur->m.m.offset + cur->m.m.sz, offsetEnd);
9391
9392
    newSz = newOffsetEnd - newOffset;
9393
9394
    /* Expand the larger bucket if data bridges the gap between cur and next */
9395
    if (!combineNext || cur->m.m.sz >= next->m.m.sz) {
9396
        chosenBucket = &cur;
9397
        otherBucket = next;
9398
    }
9399
    else {
9400
        chosenBucket = &next;
9401
        otherBucket = cur;
9402
    }
9403
9404
    {
9405
#ifdef XREALLOC
9406
        DtlsFragBucket* tmp = (DtlsFragBucket*)XREALLOC(*chosenBucket,
9407
                sizeof(DtlsFragBucket) + newSz, heap, DYNAMIC_TYPE_DTLS_FRAG);
9408
#else
9409
        DtlsFragBucket* tmp = (DtlsFragBucket*)XMALLOC(
9410
                sizeof(DtlsFragBucket) + newSz, heap, DYNAMIC_TYPE_DTLS_FRAG);
9411
#endif
9412
        if (tmp == NULL)
9413
            return NULL;
9414
#ifndef XREALLOC
9415
        XMEMCPY(tmp, *chosenBucket, sizeof(DtlsFragBucket) +
9416
                (*chosenBucket)->m.m.sz);
9417
#endif
9418
        if (chosenBucket == &next) {
9419
            /* Update the link */
9420
            DtlsFragBucket* beforeNext = cur;
9421
            while (beforeNext->m.m.next != next)
9422
                beforeNext = beforeNext->m.m.next;
9423
            beforeNext->m.m.next = tmp;
9424
        }
9425
#ifndef XREALLOC
9426
        XFREE(*chosenBucket, heap, DYNAMIC_TYPE_DTLS_FRAG);
9427
#endif
9428
        newBucket = *chosenBucket = tmp;
9429
    }
9430
9431
    if (combineNext) {
9432
        /* Put next first since it will always be at the end. Use memmove since
9433
         * newBucket may be next. */
9434
        XMEMMOVE(newBucket->buf + (next->m.m.offset - newOffset), next->buf,
9435
                next->m.m.sz);
9436
        /* memory after newOffsetEnd is already copied. Don't do extra work. */
9437
        newOffsetEnd = next->m.m.offset;
9438
    }
9439
9440
    if (newOffset == offset) {
9441
        /* data comes first */
9442
        if (newOffsetEnd <= offsetEnd) {
9443
            /* data encompasses cur. only copy data */
9444
            XMEMCPY(newBucket->buf, data,
9445
                    min(dataSz, newOffsetEnd - newOffset));
9446
        }
9447
        else {
9448
            /* data -> cur. memcpy as much possible as its faster. */
9449
            XMEMMOVE(newBucket->buf + dataSz, cur->buf,
9450
                    cur->m.m.sz - (offsetEnd - cur->m.m.offset));
9451
            XMEMCPY(newBucket->buf, data, dataSz);
9452
        }
9453
    }
9454
    else {
9455
        /* cur -> data */
9456
        word32 curOffsetEnd = cur->m.m.offset + cur->m.m.sz;
9457
        if (newBucket != cur)
9458
            XMEMCPY(newBucket->buf, cur->buf, cur->m.m.sz);
9459
        XMEMCPY(newBucket->buf + cur->m.m.sz,
9460
                data + (curOffsetEnd - offset),
9461
                newOffsetEnd - curOffsetEnd);
9462
    }
9463
    /* FINALLY the newBucket is populated correctly */
9464
9465
    /* All buckets up to and including next (if combining) have to be free'd */
9466
    {
9467
        DtlsFragBucket* toFree = cur->m.m.next;
9468
        while (toFree != next) {
9469
            DtlsFragBucket* n = toFree->m.m.next;
9470
            overlapSz += toFree->m.m.sz;
9471
            DtlsMsgDestroyFragBucket(toFree, heap);
9472
            msg->fragBucketListCount--;
9473
            toFree = n;
9474
        }
9475
        if (combineNext) {
9476
            newBucket->m.m.next = next->m.m.next;
9477
            overlapSz += next->m.m.sz;
9478
            DtlsMsgDestroyFragBucket(otherBucket, heap);
9479
            msg->fragBucketListCount--;
9480
        }
9481
        else {
9482
            newBucket->m.m.next = next;
9483
        }
9484
    }
9485
    /* Adjust size in msg */
9486
    msg->bytesReceived += newSz - overlapSz;
9487
    newBucket->m.m.offset = newOffset;
9488
    newBucket->m.m.sz = newSz;
9489
    return newBucket;
9490
}
9491
9492
static void DtlsMsgAssembleCompleteMessage(DtlsMsg* msg)
9493
{
9494
    DtlsHandShakeHeader* dtls;
9495
9496
    /* We have received all necessary fragments. Reconstruct the header. */
9497
    if (msg->fragBucketListCount != 1 || msg->fragBucketList->m.m.offset != 0 ||
9498
            msg->fragBucketList->m.m.sz != msg->sz) {
9499
        WOLFSSL_MSG("Major error in fragment assembly logic");
9500
        return;
9501
    }
9502
9503
    /* Re-cycle the DtlsFragBucket as the buffer that holds the complete
9504
     * handshake message and the header. */
9505
    msg->raw = (byte*)msg->fragBucketList;
9506
    msg->fullMsg = msg->fragBucketList->buf;
9507
    msg->ready = 1;
9508
9509
    /* frag->padding makes sure we can fit the entire DTLS handshake header
9510
     * before frag->buf */
9511
9512
    /* note the dtls pointer needs to be computed from msg->fragBucketList, not
9513
     * from msg->fragBucketList->buf, to avoid a pointerOutOfBounds access
9514
     * detected by cppcheck.
9515
     *
9516
     * also note, the (void *) intermediate cast is necessary to avoid a
9517
     * potential -Wcast-align around alignment of DtlsHandShakeHeader exceeding
9518
     * alignment of char.
9519
     */
9520
    dtls = (DtlsHandShakeHeader*)(void *)((char *)msg->fragBucketList
9521
                                          + WC_OFFSETOF(DtlsFragBucket,buf)
9522
                                          - DTLS_HANDSHAKE_HEADER_SZ);
9523
9524
    msg->fragBucketList = NULL;
9525
    msg->fragBucketListCount = 0;
9526
9527
    dtls->type = msg->type;
9528
    c32to24(msg->sz, dtls->length);
9529
    c16toa((word16)msg->seq, dtls->message_seq);
9530
    c32to24(0, dtls->fragment_offset);
9531
    c32to24(msg->sz, dtls->fragment_length);
9532
}
9533
9534
int DtlsMsgSet(DtlsMsg* msg, word32 seq, word16 epoch, const byte* data, byte type,
9535
               word32 fragOffset, word32 fragSz, void* heap, word32 totalLen,
9536
               byte encrypted)
9537
{
9538
    word32 fragOffsetEnd = fragOffset + fragSz;
9539
9540
    WOLFSSL_ENTER("DtlsMsgSet");
9541
9542
    if (msg == NULL || data == NULL || msg->sz != totalLen ||
9543
            fragOffsetEnd > totalLen) {
9544
        WOLFSSL_ERROR_VERBOSE(BAD_FUNC_ARG);
9545
        return BAD_FUNC_ARG;
9546
    }
9547
9548
    if (msg->ready)
9549
        return 0; /* msg is already complete */
9550
9551
    if (msg->type != no_shake) {
9552
        /* msg is already populated with the correct seq, epoch, and type */
9553
        if (msg->type != type || msg->epoch != epoch || msg->seq != seq) {
9554
            WOLFSSL_ERROR_VERBOSE(SEQUENCE_ERROR);
9555
            return SEQUENCE_ERROR;
9556
        }
9557
        msg->encrypted = msg->encrypted && encrypted;
9558
    }
9559
    else {
9560
        msg->type = type;
9561
        msg->epoch = epoch;
9562
        msg->seq = seq;
9563
        msg->encrypted = encrypted;
9564
    }
9565
9566
    if (msg->fragBucketList == NULL) {
9567
        /* Clean list. Create first fragment. */
9568
        msg->fragBucketList = DtlsMsgCreateFragBucket(fragOffset, data, fragSz, heap);
9569
        if (msg->fragBucketList != NULL) {
9570
            msg->bytesReceived = fragSz;
9571
            msg->fragBucketListCount++;
9572
        }
9573
        else {
9574
            return MEMORY_ERROR;
9575
        }
9576
    }
9577
    else {
9578
        /* See if we can expand any existing bucket to fit this new data into */
9579
        DtlsFragBucket* prev = NULL;
9580
        DtlsFragBucket* cur = msg->fragBucketList;
9581
        byte done = 0;
9582
        for (; cur != NULL; prev = cur, cur = cur->m.m.next) {
9583
            word32 curOffset = cur->m.m.offset;
9584
            word32 curEnd    = cur->m.m.offset + cur->m.m.sz;
9585
9586
            if (fragOffset >= curOffset && fragOffsetEnd <= curEnd) {
9587
                /* We already have this fragment */
9588
                done = 1;
9589
                break;
9590
            }
9591
            else if (fragOffset <= curEnd) {
9592
                /* found place to store fragment */
9593
                break;
9594
            }
9595
        }
9596
        if (!done) {
9597
            if (cur == NULL) {
9598
                /* We reached the end of the list. data is after and disjointed
9599
                 * from anything we have received so far. */
9600
                if (msg->fragBucketListCount >= DTLS_FRAG_POOL_SZ) {
9601
                    WOLFSSL_ERROR_VERBOSE(DTLS_TOO_MANY_FRAGMENTS_E);
9602
                    return DTLS_TOO_MANY_FRAGMENTS_E;
9603
                }
9604
                prev->m.m.next =
9605
                        DtlsMsgCreateFragBucket(fragOffset, data, fragSz, heap);
9606
                if (prev->m.m.next != NULL) {
9607
                    msg->bytesReceived += fragSz;
9608
                    msg->fragBucketListCount++;
9609
                }
9610
            }
9611
            else if (prev == NULL && fragOffsetEnd < cur->m.m.offset) {
9612
                    /* This is the new first fragment we have received */
9613
                    if (msg->fragBucketListCount >= DTLS_FRAG_POOL_SZ) {
9614
                        WOLFSSL_ERROR_VERBOSE(DTLS_TOO_MANY_FRAGMENTS_E);
9615
                        return DTLS_TOO_MANY_FRAGMENTS_E;
9616
                    }
9617
                    msg->fragBucketList = DtlsMsgCreateFragBucket(fragOffset, data,
9618
                            fragSz, heap);
9619
                    if (msg->fragBucketList != NULL) {
9620
                        msg->fragBucketList->m.m.next = cur;
9621
                        msg->bytesReceived += fragSz;
9622
                        msg->fragBucketListCount++;
9623
                    }
9624
                    else {
9625
                        /* reset on error */
9626
                        msg->fragBucketList = cur;
9627
                    }
9628
            }
9629
            else {
9630
                /* Find if this fragment overlaps with any more */
9631
                DtlsFragBucket* next = cur->m.m.next;
9632
                DtlsFragBucket** prev_next = prev != NULL
9633
                        ? &prev->m.m.next : &msg->fragBucketList;
9634
                while (next != NULL &&
9635
                        (next->m.m.offset + next->m.m.sz) <= fragOffsetEnd)
9636
                    next = next->m.m.next;
9637
                /* We can combine the buckets */
9638
                *prev_next = DtlsMsgCombineFragBuckets(msg, cur, next,
9639
                        fragOffset, data, fragSz, heap);
9640
                if (*prev_next == NULL) /* reset on error */
9641
                    *prev_next = cur;
9642
            }
9643
        }
9644
    }
9645
9646
    if (msg->bytesReceived == msg->sz)
9647
        DtlsMsgAssembleCompleteMessage(msg);
9648
9649
    return 0;
9650
}
9651
9652
9653
DtlsMsg* DtlsMsgFind(DtlsMsg* head, word16 epoch, word32 seq)
9654
{
9655
    WOLFSSL_ENTER("DtlsMsgFind");
9656
    while (head != NULL && !(head->epoch == epoch && head->seq == seq)) {
9657
        head = head->next;
9658
    }
9659
    return head;
9660
}
9661
9662
9663
void DtlsMsgStore(WOLFSSL* ssl, word16 epoch, word32 seq, const byte* data,
9664
        word32 dataSz, byte type, word32 fragOffset, word32 fragSz, void* heap)
9665
{
9666
    /* See if seq exists in the list. If it isn't in the list, make
9667
     * a new item of size dataSz, copy fragSz bytes from data to msg->msg
9668
     * starting at offset fragOffset, and add fragSz to msg->fragSz. If
9669
     * the seq is in the list and it isn't full, copy fragSz bytes from
9670
     * data to msg->msg starting at offset fragOffset, and add fragSz to
9671
     * msg->fragSz. Insertions take into account data already in the list
9672
     * in case there are overlaps in the handshake message due to retransmit
9673
     * messages. The new item should be inserted into the list in its
9674
     * proper position.
9675
     *
9676
     * 1. Find seq in list, or where seq should go in list. If seq not in
9677
     *    list, create new item and insert into list. Either case, keep
9678
     *    pointer to item.
9679
     * 2. Copy the data from the message to the stored message where it
9680
     *    belongs without overlaps.
9681
     */
9682
9683
    DtlsMsg* head = ssl->dtls_rx_msg_list;
9684
    byte encrypted = ssl->keys.decryptedCur == 1;
9685
    WOLFSSL_ENTER("DtlsMsgStore");
9686
9687
    if (head != NULL) {
9688
        DtlsMsg* cur = DtlsMsgFind(head, epoch, seq);
9689
        if (cur == NULL) {
9690
            cur = DtlsMsgNew(dataSz, 0, heap);
9691
            if (cur != NULL) {
9692
                if (DtlsMsgSet(cur, seq, epoch, data, type,
9693
                             fragOffset, fragSz, heap, dataSz, encrypted) < 0) {
9694
                    DtlsMsgDelete(cur, heap);
9695
                }
9696
                else {
9697
                    ssl->dtls_rx_msg_list_sz++;
9698
                    head = DtlsMsgInsert(head, cur);
9699
                }
9700
            }
9701
        }
9702
        else {
9703
            /* If this fails, the data is just dropped. */
9704
            DtlsMsgSet(cur, seq, epoch, data, type, fragOffset,
9705
                    fragSz, heap, dataSz, encrypted);
9706
        }
9707
    }
9708
    else {
9709
        head = DtlsMsgNew(dataSz, 0, heap);
9710
        if (DtlsMsgSet(head, seq, epoch, data, type, fragOffset,
9711
                    fragSz, heap, dataSz, encrypted) < 0) {
9712
            DtlsMsgDelete(head, heap);
9713
            head = NULL;
9714
        }
9715
        else {
9716
            ssl->dtls_rx_msg_list_sz++;
9717
        }
9718
    }
9719
9720
    ssl->dtls_rx_msg_list = head;
9721
}
9722
9723
9724
/* DtlsMsgInsert() is an in-order insert. */
9725
DtlsMsg* DtlsMsgInsert(DtlsMsg* head, DtlsMsg* item)
9726
{
9727
    WOLFSSL_ENTER("DtlsMsgInsert");
9728
    if (head == NULL || (item->epoch <= head->epoch &&
9729
                         item->seq   <  head->seq)) {
9730
        item->next = head;
9731
        head = item;
9732
    }
9733
    else if (head->next == NULL) {
9734
        head->next = item;
9735
    }
9736
    else {
9737
        DtlsMsg* cur = head->next;
9738
        DtlsMsg* prev = head;
9739
        while (cur) {
9740
            if (item->epoch <= cur->epoch &&
9741
                item->seq   <  cur->seq) {
9742
                item->next = cur;
9743
                prev->next = item;
9744
                break;
9745
            }
9746
            prev = cur;
9747
            cur = cur->next;
9748
        }
9749
        if (cur == NULL) {
9750
            prev->next = item;
9751
        }
9752
    }
9753
9754
    return head;
9755
}
9756
9757
9758
/**
9759
 * DtlsMsgPoolSave() adds the message to the end of the stored transmit
9760
 * list. Must be called BEFORE BuildMessage or DtlsSEQIncrement or
9761
 * anything else that increments ssl->keys.dtls_handshake_number.
9762
 */
9763
int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz,
9764
                    enum HandShakeType type)
9765
{
9766
    DtlsMsg* item;
9767
    int ret = 0;
9768
9769
    WOLFSSL_ENTER("DtlsMsgPoolSave");
9770
9771
    if (ssl->dtls_tx_msg_list_sz > DTLS_POOL_SZ) {
9772
        WOLFSSL_ERROR(DTLS_POOL_SZ_E);
9773
        return DTLS_POOL_SZ_E;
9774
    }
9775
9776
    item = DtlsMsgNew(dataSz, 1, ssl->heap);
9777
9778
    if (item != NULL) {
9779
        DtlsMsg* cur = ssl->dtls_tx_msg_list;
9780
9781
        XMEMCPY(item->raw, data, dataSz);
9782
        item->epoch = ssl->keys.dtls_epoch;
9783
        item->seq = ssl->keys.dtls_handshake_number;
9784
        item->type = type;
9785
9786
        if (cur == NULL)
9787
            ssl->dtls_tx_msg_list = item;
9788
        else {
9789
            while (cur->next)
9790
                cur = cur->next;
9791
            cur->next = item;
9792
        }
9793
        ssl->dtls_tx_msg_list_sz++;
9794
    }
9795
    else
9796
        ret = MEMORY_E;
9797
9798
    WOLFSSL_LEAVE("DtlsMsgPoolSave()", ret);
9799
    return ret;
9800
}
9801
9802
9803
/* DtlsMsgPoolTimeout() updates the timeout time. */
9804
int DtlsMsgPoolTimeout(WOLFSSL* ssl)
9805
{
9806
    int result = -1;
9807
    WOLFSSL_ENTER("DtlsMsgPoolTimeout");
9808
    if (ssl->dtls_timeout <  ssl->dtls_timeout_max) {
9809
        ssl->dtls_timeout *= DTLS_TIMEOUT_MULTIPLIER;
9810
        result = 0;
9811
    }
9812
    WOLFSSL_LEAVE("DtlsMsgPoolTimeout()", result);
9813
    return result;
9814
}
9815
9816
9817
/* DtlsMsgPoolReset() deletes the stored transmit list. */
9818
void DtlsMsgPoolReset(WOLFSSL* ssl)
9819
{
9820
    WOLFSSL_ENTER("DtlsMsgPoolReset");
9821
    if (ssl->dtls_tx_msg_list) {
9822
        DtlsMsgListDelete(ssl->dtls_tx_msg_list, ssl->heap);
9823
        ssl->dtls_tx_msg_list = NULL;
9824
        ssl->dtls_tx_msg = NULL;
9825
        ssl->dtls_tx_msg_list_sz = 0;
9826
    }
9827
#ifdef WOLFSSL_DTLS13
9828
    /* Clear DTLS 1.3 buffer too */
9829
    Dtls13RtxFlushBuffered(ssl, 1);
9830
#endif
9831
}
9832
9833
9834
int VerifyForDtlsMsgPoolSend(WOLFSSL* ssl, byte type, word32 fragOffset)
9835
{
9836
    /**
9837
     * only the first message from previous flight should be valid
9838
     * to be used for triggering retransmission of whole DtlsMsgPool.
9839
     * change cipher suite type is not verified here
9840
     */
9841
    if (fragOffset == 0) {
9842
        if (ssl->options.side == WOLFSSL_SERVER_END) {
9843
            if (type == client_hello)
9844
                return 1;
9845
            else if (ssl->options.verifyPeer && type == certificate)
9846
                return 1;
9847
            else if (!ssl->options.verifyPeer && type == client_key_exchange)
9848
                return 1;
9849
        }
9850
        else {
9851
            if (type == hello_request || type == server_hello)
9852
                return 1;
9853
        }
9854
    }
9855
    return 0;
9856
}
9857
9858
9859
/**
9860
 * Verify if message `item` from `ssl->dtls_tx_msg_list` should be deleted
9861
 * depending on the current state of the handshake negotiation.
9862
 */
9863
int VerifyForTxDtlsMsgDelete(WOLFSSL* ssl, DtlsMsg* item)
9864
{
9865
    WOLFSSL_ENTER("VerifyForTxDtlsMsgDelete");
9866
    if (item->epoch < ssl->keys.dtls_epoch - 1)
9867
        /* Messages not from current or previous epoch can be deleted */
9868
        return 1;
9869
    switch (ssl->options.side) {
9870
    case WOLFSSL_CLIENT_END:
9871
        if (item->type == client_hello &&
9872
                ssl->options.serverState >= SERVER_HELLODONE_COMPLETE)
9873
            return 1; /* client can forget first client_hello if received full
9874
                       * flight of packets from server */
9875
        else
9876
            return 0;
9877
    case WOLFSSL_SERVER_END:
9878
        if (ssl->options.clientState >= CLIENT_HELLO_COMPLETE &&
9879
                item->type == hello_request)
9880
            return 1; /* Server can forget HelloRequest if client sent a valid
9881
                       * ClientHello */
9882
        if (ssl->options.clientState >= CLIENT_FINISHED_COMPLETE &&
9883
                item->type <= server_hello_done)
9884
            return 1; /* server can forget everything up to ServerHelloDone if
9885
                       * a client finished message has been received and
9886
                       * successfully processed */
9887
        else
9888
            return 0;
9889
    default:
9890
        return 0;
9891
    }
9892
}
9893
9894
9895
/* DtlsMsgPoolSend() will send the stored transmit list. The stored list is
9896
 * updated with new sequence numbers, and will be re-encrypted if needed. */
9897
int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket)
9898
{
9899
    int ret = 0;
9900
    DtlsMsg* pool;
9901
9902
    WOLFSSL_ENTER("DtlsMsgPoolSend");
9903
9904
    pool = ssl->dtls_tx_msg == NULL ? ssl->dtls_tx_msg_list : ssl->dtls_tx_msg;
9905
9906
    if (pool != NULL) {
9907
        if ((ssl->options.side == WOLFSSL_SERVER_END &&
9908
             !(ssl->options.acceptState == ACCEPT_BEGIN_RENEG ||
9909
               ssl->options.acceptState == SERVER_HELLO_DONE ||
9910
               ssl->options.acceptState == ACCEPT_FINISHED_DONE ||
9911
               ssl->options.acceptState == ACCEPT_THIRD_REPLY_DONE)) ||
9912
            (ssl->options.side == WOLFSSL_CLIENT_END &&
9913
             !(ssl->options.connectState == CLIENT_HELLO_SENT ||
9914
               ssl->options.connectState == HELLO_AGAIN_REPLY ||
9915
               ssl->options.connectState == FINISHED_DONE ||
9916
               ssl->options.connectState == SECOND_REPLY_DONE))) {
9917
9918
            WOLFSSL_ERROR(DTLS_RETX_OVER_TX);
9919
            ssl->error = DTLS_RETX_OVER_TX;
9920
            return WOLFSSL_FATAL_ERROR;
9921
        }
9922
9923
        while (pool != NULL) {
9924
            int epochOrder;
9925
9926
            if (pool->epoch == 0) {
9927
                DtlsRecordLayerHeader* dtls;
9928
9929
                dtls = (DtlsRecordLayerHeader*)pool->raw;
9930
                /* If the stored record's epoch is 0, and the currently set
9931
                 * epoch is 0, use the "current order" sequence number.
9932
                 * If the stored record's epoch is 0 and the currently set
9933
                 * epoch is not 0, the stored record is considered a "previous
9934
                 * order" sequence number. */
9935
                epochOrder = (ssl->keys.dtls_epoch == 0) ?
9936
                             CUR_ORDER : PREV_ORDER;
9937
9938
                WriteSEQ(ssl, epochOrder, dtls->sequence_number);
9939
                DtlsSEQIncrement(ssl, epochOrder);
9940
                if ((ret = CheckAvailableSize(ssl, (int)pool->sz)) != 0) {
9941
                    WOLFSSL_ERROR(ret);
9942
                    return ret;
9943
                }
9944
9945
                XMEMCPY(GetOutputBuffer(ssl), pool->raw, pool->sz);
9946
                ssl->buffers.outputBuffer.length += pool->sz;
9947
            }
9948
            else {
9949
                /* Handle sending packets from previous epoch */
9950
                byte*  input;
9951
                byte*  output;
9952
                int    inputSz, sendSz;
9953
9954
                input = pool->raw;
9955
                inputSz = (int)pool->sz;
9956
                sendSz = inputSz + cipherExtraData(ssl);
9957
9958
#ifdef HAVE_SECURE_RENEGOTIATION
9959
                /*
9960
                 * CUR_ORDER will use ssl->secure_renegotiation from epoch 2+.
9961
                 * ssl->keys otherwise
9962
                 * PREV_ORDER will always use ssl->keys
9963
                 */
9964
                if (DtlsSCRKeysSet(ssl)) {
9965
                    if (pool->epoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
9966
                        epochOrder = CUR_ORDER;
9967
                    else
9968
                        epochOrder = PREV_ORDER;
9969
                }
9970
                else {
9971
                    epochOrder = CUR_ORDER;
9972
                }
9973
#else
9974
                epochOrder = CUR_ORDER;
9975
#endif
9976
9977
9978
                /* add back in record header space from saved pool size */
9979
                sendSz += DTLS_RECORD_HEADER_SZ;
9980
9981
                if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) {
9982
                    WOLFSSL_ERROR(ret);
9983
                    return ret;
9984
                }
9985
9986
                output = GetOutputBuffer(ssl);
9987
                if (inputSz != ENUM_LEN)
9988
                    sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
9989
                                          handshake, 0, 0, 0, epochOrder);
9990
                else
9991
                    /* inputSz == ENUM_LEN must mean that this is a change cipher
9992
                     * spec message */
9993
                    sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
9994
                                          change_cipher_spec, 0, 0, 0, epochOrder);
9995
9996
                if (sendSz < 0) {
9997
                    WOLFSSL_ERROR(BUILD_MSG_ERROR);
9998
                    return BUILD_MSG_ERROR;
9999
                }
10000
10001
                ssl->buffers.outputBuffer.length += sendSz;
10002
            }
10003
10004
10005
            if (!ssl->options.groupMessages)
10006
                ret = SendBuffered(ssl);
10007
10008
            /**
10009
             * on server side, retransmission is being triggered only by sending
10010
             * first message of given flight, in order to trigger client
10011
             * to retransmit its whole flight. Sending the whole previous flight
10012
             * could lead to retransmission of previous client flight for each
10013
             * server message from previous flight. Therefore one message should
10014
             * be enough to do the trick.
10015
             */
10016
            if (sendOnlyFirstPacket &&
10017
                ssl->options.side == WOLFSSL_SERVER_END)
10018
                pool = NULL;
10019
            else
10020
                pool = pool->next;
10021
            ssl->dtls_tx_msg = pool;
10022
        }
10023
10024
        if (ret == 0 && ssl->options.groupMessages)
10025
            ret = SendBuffered(ssl);
10026
    }
10027
10028
    WOLFSSL_LEAVE("DtlsMsgPoolSend()", ret);
10029
    return ret;
10030
}
10031
10032
#endif /* WOLFSSL_DTLS */
10033
10034
#if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
10035
10036
ProtocolVersion MakeSSLv3(void)
10037
{
10038
    ProtocolVersion pv;
10039
    pv.major = SSLv3_MAJOR;
10040
    pv.minor = SSLv3_MINOR;
10041
10042
    return pv;
10043
}
10044
10045
#endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
10046
10047
10048
#ifdef WOLFSSL_DTLS
10049
10050
ProtocolVersion MakeDTLSv1(void)
10051
{
10052
    ProtocolVersion pv;
10053
    pv.major = DTLS_MAJOR;
10054
    pv.minor = DTLS_MINOR;
10055
10056
    return pv;
10057
}
10058
10059
#ifndef WOLFSSL_NO_TLS12
10060
10061
ProtocolVersion MakeDTLSv1_2(void)
10062
{
10063
    ProtocolVersion pv;
10064
    pv.major = DTLS_MAJOR;
10065
    pv.minor = DTLSv1_2_MINOR;
10066
10067
    return pv;
10068
}
10069
10070
#endif /* !WOLFSSL_NO_TLS12 */
10071
10072
#ifdef WOLFSSL_DTLS13
10073
10074
ProtocolVersion MakeDTLSv1_3(void)
10075
{
10076
    ProtocolVersion pv;
10077
    pv.major = DTLS_MAJOR;
10078
    pv.minor = DTLSv1_3_MINOR;
10079
10080
    return pv;
10081
}
10082
10083
#endif /* WOLFSSL_DTLS13 */
10084
#endif /* WOLFSSL_DTLS */
10085
10086
10087
#ifndef NO_ASN_TIME
10088
#if defined(USER_TICKS)
10089
#if 0
10090
    word32 LowResTimer(void)
10091
    {
10092
        /*
10093
        write your own clock tick function if don't want time(0)
10094
        needs second accuracy but doesn't have to correlated to EPOCH
10095
        */
10096
    }
10097
#endif
10098
10099
#elif defined(TIME_OVERRIDES)
10100
#if !defined(NO_ASN) && !defined(NO_ASN_TIME)
10101
    /* use same asn time overrides unless user wants tick override above */
10102
10103
    word32 LowResTimer(void)
10104
    {
10105
        return (word32) wc_Time(0);
10106
    }
10107
#else
10108
    #ifndef HAVE_TIME_T_TYPE
10109
        typedef long time_t;
10110
    #endif
10111
    extern time_t XTIME(time_t * timer);
10112
10113
    word32 LowResTimer(void)
10114
    {
10115
        return (word32) XTIME(0);
10116
    }
10117
#endif
10118
10119
#elif defined(USE_WINDOWS_API)
10120
10121
    word32 LowResTimer(void)
10122
    {
10123
        static int           init = 0;
10124
        static LARGE_INTEGER freq;
10125
        LARGE_INTEGER        count;
10126
10127
        if (!init) {
10128
            QueryPerformanceFrequency(&freq);
10129
            init = 1;
10130
        }
10131
10132
        QueryPerformanceCounter(&count);
10133
10134
        return (word32)(count.QuadPart / freq.QuadPart);
10135
    }
10136
10137
#elif defined(HAVE_RTP_SYS)
10138
10139
    #include "rtptime.h"
10140
10141
    word32 LowResTimer(void)
10142
    {
10143
        return (word32)rtp_get_system_sec();
10144
    }
10145
10146
#elif defined(WOLFSSL_DEOS)
10147
10148
    word32 LowResTimer(void)
10149
    {
10150
        const word32 systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
10151
        const volatile word32 *systemTickPtr = systemTickPointer();
10152
10153
        return (word32) *systemTickPtr/systemTickTimeInHz;
10154
    }
10155
10156
#elif defined(MICRIUM)
10157
10158
    word32 LowResTimer(void)
10159
    {
10160
        OS_TICK ticks = 0;
10161
        OS_ERR  err;
10162
10163
        ticks = OSTimeGet(&err);
10164
10165
        return (word32) (ticks / OSCfg_TickRate_Hz);
10166
    }
10167
10168
10169
#elif defined(MICROCHIP_TCPIP_V5)
10170
10171
    word32 LowResTimer(void)
10172
    {
10173
        return (word32) (TickGet() / TICKS_PER_SECOND);
10174
    }
10175
10176
10177
#elif defined(MICROCHIP_TCPIP)
10178
10179
    #if defined(MICROCHIP_MPLAB_HARMONY)
10180
10181
        #include <system/tmr/sys_tmr.h>
10182
10183
        word32 LowResTimer(void)
10184
        {
10185
            return (word32) (SYS_TMR_TickCountGet() /
10186
                             SYS_TMR_TickCounterFrequencyGet());
10187
        }
10188
10189
    #else
10190
10191
        word32 LowResTimer(void)
10192
        {
10193
            return (word32) (SYS_TICK_Get() / SYS_TICK_TicksPerSecondGet());
10194
        }
10195
10196
    #endif
10197
10198
#elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
10199
10200
    word32 LowResTimer(void)
10201
    {
10202
        TIME_STRUCT mqxTime;
10203
10204
        _time_get_elapsed(&mqxTime);
10205
10206
        return (word32) mqxTime.SECONDS;
10207
    }
10208
#elif defined(FREESCALE_FREE_RTOS) || defined(FREESCALE_KSDK_FREERTOS)
10209
10210
    #include "include/task.h"
10211
10212
    unsigned int LowResTimer(void)
10213
    {
10214
        return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
10215
    }
10216
10217
#elif defined(FREERTOS)
10218
10219
    #ifdef PLATFORMIO
10220
        #include <freertos/FreeRTOS.h>
10221
        #include <freertos/task.h>
10222
    #else
10223
        #include "task.h"
10224
    #endif
10225
10226
    unsigned int LowResTimer(void)
10227
    {
10228
        return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
10229
    }
10230
10231
#elif defined(FREESCALE_KSDK_BM)
10232
10233
    #include "lwip/sys.h" /* lwIP */
10234
    word32 LowResTimer(void)
10235
    {
10236
        return sys_now()/1000;
10237
    }
10238
10239
#elif defined(WOLFSSL_CMSIS_RTOS) || defined(WOLFSSL_CMSIS_RTOSv2)
10240
10241
    word32 LowResTimer(void)
10242
    {
10243
        return (word32)osKernelGetTickCount() / 1000;
10244
    }
10245
10246
#elif defined(WOLFSSL_TIRTOS)
10247
10248
    word32 LowResTimer(void)
10249
    {
10250
        return (word32) Seconds_get();
10251
    }
10252
#elif defined(WOLFSSL_XILINX)
10253
    #include "xrtcpsu.h"
10254
10255
    word32 LowResTimer(void)
10256
    {
10257
        XRtcPsu_Config* con;
10258
        XRtcPsu         rtc;
10259
10260
        con = XRtcPsu_LookupConfig(XPAR_XRTCPSU_0_DEVICE_ID);
10261
        if (con != NULL) {
10262
            if (XRtcPsu_CfgInitialize(&rtc, con, con->BaseAddr)
10263
                    == XST_SUCCESS) {
10264
                return (word32)XRtcPsu_GetCurrentTime(&rtc);
10265
            }
10266
            else {
10267
                WOLFSSL_MSG("Unable to initialize RTC");
10268
            }
10269
        }
10270
10271
        return 0;
10272
    }
10273
10274
#elif defined(WOLFSSL_UTASKER)
10275
10276
    word32 LowResTimer(void)
10277
    {
10278
        return (word32)(uTaskerSystemTick / TICK_RESOLUTION);
10279
    }
10280
10281
#elif defined(WOLFSSL_NUCLEUS_1_2)
10282
10283
    #define NU_TICKS_PER_SECOND 100
10284
10285
    word32 LowResTimer(void)
10286
    {
10287
        /* returns number of 10ms ticks, so 100 ticks/sec */
10288
        return NU_Retrieve_Clock() / NU_TICKS_PER_SECOND;
10289
    }
10290
#elif defined(WOLFSSL_APACHE_MYNEWT)
10291
10292
    #include "os/os_time.h"
10293
    word32 LowResTimer(void)
10294
    {
10295
        word32 now;
10296
        struct os_timeval tv;
10297
        os_gettimeofday(&tv, NULL);
10298
        now = (word32)tv.tv_sec;
10299
        return now;
10300
    }
10301
10302
#elif defined(WOLFSSL_ZEPHYR)
10303
10304
    word32 LowResTimer(void)
10305
    {
10306
        int64_t t;
10307
    #if defined(CONFIG_ARCH_POSIX) && !defined(CONFIG_BOARD_NATIVE_POSIX)
10308
        k_cpu_idle();
10309
    #endif
10310
        t = k_uptime_get(); /* returns current uptime in milliseconds */
10311
        return (word32)(t / 1000);
10312
    }
10313
10314
#elif defined(WOLFSSL_LINUXKM)
10315
    word32 LowResTimer(void)
10316
    {
10317
        return (word32)time(NULL);
10318
    }
10319
10320
#else
10321
    /* Posix style time */
10322
    #if !defined(USER_TIME) && !defined(USE_WOLF_TM)
10323
    #include <time.h>
10324
    #endif
10325
10326
    word32 LowResTimer(void)
10327
853
    {
10328
853
    #if !defined(NO_ASN) && !defined(NO_ASN_TIME)
10329
853
        return (word32)wc_Time(0);
10330
    #else
10331
        return (word32)XTIME(0);
10332
    #endif
10333
853
    }
10334
#endif
10335
#else
10336
    /* user must supply timer function to return elapsed seconds:
10337
     *   word32 LowResTimer(void);
10338
     */
10339
#endif /* !NO_ASN_TIME */
10340
10341
10342
#ifndef NO_TLS
10343
#if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
10344
               ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \
10345
                (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
10346
                (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
10347
/* Store the message for use with CertificateVerify using EdDSA.
10348
 *
10349
 * ssl   SSL/TLS object.
10350
 * data  Message to store.
10351
 * sz    Size of message to store.
10352
 * returns MEMORY_E if not able to reallocate, otherwise 0.
10353
 */
10354
static int EdDSA_Update(WOLFSSL* ssl, const byte* data, int sz)
10355
123k
{
10356
123k
    int   ret = 0;
10357
123k
    byte* msgs;
10358
10359
123k
    if (ssl->options.cacheMessages) {
10360
11.7k
        msgs = (byte*)XMALLOC(ssl->hsHashes->length + sz, ssl->heap,
10361
11.7k
            DYNAMIC_TYPE_HASHES);
10362
11.7k
        if (msgs == NULL)
10363
126
            ret = MEMORY_E;
10364
11.7k
        if ((ret == 0) && (ssl->hsHashes->messages != NULL)) {
10365
0
            XMEMCPY(msgs, ssl->hsHashes->messages, ssl->hsHashes->length);
10366
0
            ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
10367
0
            XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
10368
0
        }
10369
11.7k
        if (ret == 0) {
10370
        #ifdef WOLFSSL_CHECK_MEM_ZERO
10371
            wc_MemZero_Add("Handshake messages", msgs,
10372
                ssl->hsHashes->length + sz);
10373
        #endif
10374
11.6k
            ssl->hsHashes->messages = msgs;
10375
11.6k
            XMEMCPY(msgs + ssl->hsHashes->length, data, sz);
10376
11.6k
            ssl->hsHashes->prevLen = ssl->hsHashes->length;
10377
11.6k
            ssl->hsHashes->length += sz;
10378
11.6k
        }
10379
11.7k
    }
10380
10381
123k
    return ret;
10382
123k
}
10383
#endif /* (HAVE_ED25519 || HAVE_ED448) && !WOLFSSL_NO_CLIENT_AUTH */
10384
10385
int HashRaw(WOLFSSL* ssl, const byte* data, int sz)
10386
{
10387
    int ret = 0;
10388
#ifdef WOLFSSL_DEBUG_TLS
10389
    byte digest[WC_MAX_DIGEST_SIZE];
10390
10391
    WOLFSSL_MSG("HashRaw:");
10392
    WOLFSSL_MSG("Data:");
10393
    WOLFSSL_BUFFER(data, sz);
10394
    WOLFSSL_MSG("Hashes:");
10395
#endif
10396
10397
    (void)data;
10398
    (void)sz;
10399
10400
    if (ssl->hsHashes == NULL) {
10401
        return BAD_FUNC_ARG;
10402
    }
10403
10404
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
10405
    ret = tsip_StoreMessage(ssl, data, sz);
10406
    if (ret != 0 && ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
10407
        return ret;
10408
    }
10409
#endif /* WOLFSSL_RENESAS_TSIP_TLS */
10410
10411
#if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
10412
                          defined(WOLFSSL_ALLOW_TLS_SHA1))
10413
    wc_ShaUpdate(&ssl->hsHashes->hashSha, data, (word32)(sz));
10414
#endif
10415
#if !defined(NO_MD5) && !defined(NO_OLD_TLS)
10416
    wc_Md5Update(&ssl->hsHashes->hashMd5, data, (word32)(sz));
10417
#endif
10418
10419
    if (IsAtLeastTLSv1_2(ssl)) {
10420
    #ifndef NO_SHA256
10421
        ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, data, (word32)sz);
10422
        if (ret != 0)
10423
            return ret;
10424
    #ifdef WOLFSSL_DEBUG_TLS
10425
        WOLFSSL_MSG("Sha256");
10426
        wc_Sha256GetHash(&ssl->hsHashes->hashSha256, digest);
10427
        WOLFSSL_BUFFER(digest, WC_SHA256_DIGEST_SIZE);
10428
    #endif
10429
    #endif
10430
    #ifdef WOLFSSL_SHA384
10431
        ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, data, (word32)sz);
10432
        if (ret != 0)
10433
            return ret;
10434
    #ifdef WOLFSSL_DEBUG_TLS
10435
        WOLFSSL_MSG("Sha384");
10436
        wc_Sha384GetHash(&ssl->hsHashes->hashSha384, digest);
10437
        WOLFSSL_BUFFER(digest, WC_SHA384_DIGEST_SIZE);
10438
    #endif
10439
    #endif
10440
    #ifdef WOLFSSL_SHA512
10441
        ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, data, (word32)sz);
10442
        if (ret != 0)
10443
            return ret;
10444
    #ifdef WOLFSSL_DEBUG_TLS
10445
        WOLFSSL_MSG("Sha512");
10446
        wc_Sha512GetHash(&ssl->hsHashes->hashSha512, digest);
10447
        WOLFSSL_BUFFER(digest, WC_SHA512_DIGEST_SIZE);
10448
    #endif
10449
    #endif
10450
    #ifdef WOLFSSL_SM3
10451
        ret = wc_Sm3Update(&ssl->hsHashes->hashSm3, data, sz);
10452
        if (ret != 0)
10453
            return ret;
10454
    #ifdef WOLFSSL_DEBUG_TLS
10455
        WOLFSSL_MSG("SM3");
10456
        wc_Sm3GetHash(&ssl->hsHashes->hashSm3, digest);
10457
        WOLFSSL_BUFFER(digest, WC_SM3_DIGEST_SIZE);
10458
    #endif
10459
    #endif
10460
    #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
10461
               ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \
10462
                (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
10463
                (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
10464
        ret = EdDSA_Update(ssl, data, sz);
10465
        if (ret != 0)
10466
            return ret;
10467
    #endif
10468
    }
10469
10470
    return ret;
10471
}
10472
10473
/* add output to md5 and sha handshake hashes, exclude record header */
10474
int HashOutput(WOLFSSL* ssl, const byte* output, int sz, int ivSz)
10475
{
10476
    const byte* adj;
10477
10478
    if (ssl->hsHashes == NULL)
10479
        return BAD_FUNC_ARG;
10480
10481
    adj = output + RECORD_HEADER_SZ + ivSz;
10482
    sz -= RECORD_HEADER_SZ;
10483
10484
#ifdef HAVE_FUZZER
10485
    if (ssl->fuzzerCb)
10486
        ssl->fuzzerCb(ssl, output, sz, FUZZ_HASH, ssl->fuzzerCtx);
10487
#endif
10488
#ifdef WOLFSSL_DTLS
10489
    if (ssl->options.dtls) {
10490
        if (IsAtLeastTLSv1_3(ssl->version)) {
10491
#ifdef WOLFSSL_DTLS13
10492
            word16 dtls_record_extra;
10493
            dtls_record_extra = Dtls13GetRlHeaderLength(ssl, (byte)IsEncryptionOn(ssl, 1));
10494
            dtls_record_extra -= RECORD_HEADER_SZ;
10495
10496
            adj += dtls_record_extra;
10497
            sz  -= dtls_record_extra;
10498
#endif /* WOLFSSL_DTLS13 */
10499
        } else {
10500
#ifdef WOLFSSL_DTLS_CID
10501
            byte cidSz = DtlsGetCidTxSize(ssl);
10502
            if (IsEncryptionOn(ssl, 1) && cidSz > 0) {
10503
                adj += cidSz;
10504
                sz  -= cidSz + 1; /* +1 to not hash the real content type */
10505
            }
10506
#endif
10507
            adj += DTLS_RECORD_EXTRA;
10508
            sz  -= DTLS_RECORD_EXTRA;
10509
        }
10510
    }
10511
#endif
10512
10513
    return HashRaw(ssl, adj, sz);
10514
}
10515
10516
10517
/* add input to md5 and sha handshake hashes, include handshake header */
10518
int HashInput(WOLFSSL* ssl, const byte* input, int sz)
10519
{
10520
    const byte* adj;
10521
10522
    if (ssl->hsHashes == NULL) {
10523
        return BAD_FUNC_ARG;
10524
    }
10525
10526
    adj = input - HANDSHAKE_HEADER_SZ;
10527
    sz += HANDSHAKE_HEADER_SZ;
10528
10529
#ifdef WOLFSSL_DTLS
10530
    if (ssl->options.dtls) {
10531
        adj -= DTLS_HANDSHAKE_EXTRA;
10532
        sz  += DTLS_HANDSHAKE_EXTRA;
10533
10534
#ifdef WOLFSSL_DTLS13
10535
        if (IsAtLeastTLSv1_3(ssl->version))
10536
            return Dtls13HashHandshake(ssl, adj, (word16)sz);
10537
#endif /* WOLFSSL_DTLS13 */
10538
10539
    }
10540
#endif
10541
10542
    return HashRaw(ssl, adj, sz);
10543
}
10544
10545
10546
/* add record layer header for message */
10547
static void AddRecordHeader(byte* output, word32 length, byte type,
10548
        WOLFSSL* ssl, int epochOrder)
10549
{
10550
    RecordLayerHeader* rl;
10551
10552
    (void)epochOrder;
10553
10554
    /* record layer header */
10555
    rl = (RecordLayerHeader*)output;
10556
    if (rl == NULL) {
10557
        return;
10558
    }
10559
    rl->type    = type;
10560
    rl->pvMajor = ssl->version.major;       /* type and version same in each */
10561
#ifdef WOLFSSL_TLS13
10562
    if (IsAtLeastTLSv1_3(ssl->version)) {
10563
        rl->pvMinor = TLSv1_2_MINOR;
10564
#ifdef WOLFSSL_DTLS
10565
        if (ssl->options.dtls)
10566
            rl->pvMinor = DTLSv1_2_MINOR;
10567
#endif /* WOLFSSL_DTLS */
10568
    }
10569
    else
10570
#endif
10571
        rl->pvMinor = ssl->version.minor;
10572
10573
#ifdef WOLFSSL_ALTERNATIVE_DOWNGRADE
10574
    if (ssl->options.side == WOLFSSL_CLIENT_END
10575
    &&  ssl->options.connectState == CONNECT_BEGIN
10576
    && !ssl->options.resuming) {
10577
        rl->pvMinor = ssl->options.downgrade ? ssl->options.minDowngrade
10578
                                             : ssl->version.minor;
10579
    }
10580
#endif
10581
10582
    if (!ssl->options.dtls) {
10583
        c16toa((word16)length, rl->length);
10584
    }
10585
    else {
10586
#ifdef WOLFSSL_DTLS
10587
        /* dtls record layer header extensions */
10588
        DtlsRecordLayerHeader* dtls = (DtlsRecordLayerHeader*)output;
10589
#ifdef WOLFSSL_DTLS_CID
10590
        byte cidSz = 0;
10591
        if (type == dtls12_cid && (cidSz = DtlsGetCidTxSize(ssl)) > 0) {
10592
            wolfSSL_dtls_cid_get_tx(ssl, output + DTLS12_CID_OFFSET, cidSz);
10593
            c16toa((word16)length, output + DTLS12_CID_OFFSET + cidSz);
10594
        }
10595
        else
10596
#endif
10597
            c16toa((word16)length, dtls->length);
10598
        WriteSEQ(ssl, epochOrder, dtls->sequence_number);
10599
#endif
10600
    }
10601
}
10602
10603
10604
#if !defined(WOLFSSL_NO_TLS12) || (defined(HAVE_SESSION_TICKET) && \
10605
                                                    !defined(NO_WOLFSSL_SERVER))
10606
/* add handshake header for message */
10607
static void AddHandShakeHeader(byte* output, word32 length,
10608
                               word32 fragOffset, word32 fragLength,
10609
                               byte type, WOLFSSL* ssl)
10610
{
10611
    HandShakeHeader* hs;
10612
    (void)fragOffset;
10613
    (void)fragLength;
10614
    (void)ssl;
10615
10616
    /* handshake header */
10617
    hs = (HandShakeHeader*)output;
10618
    if (hs == NULL)
10619
        return;
10620
10621
    hs->type = type;
10622
    c32to24(length, hs->length);         /* type and length same for each */
10623
#ifdef WOLFSSL_DTLS
10624
    if (ssl->options.dtls) {
10625
        DtlsHandShakeHeader* dtls;
10626
10627
        /* dtls handshake header extensions */
10628
        dtls = (DtlsHandShakeHeader*)output;
10629
        c16toa(ssl->keys.dtls_handshake_number++, dtls->message_seq);
10630
        c32to24(fragOffset, dtls->fragment_offset);
10631
        c32to24(fragLength, dtls->fragment_length);
10632
    }
10633
#endif
10634
}
10635
10636
/* add both headers for handshake message */
10637
static void AddHeaders(byte* output, word32 length, byte type, WOLFSSL* ssl)
10638
{
10639
    word32 lengthAdj = HANDSHAKE_HEADER_SZ;
10640
    word32 outputAdj = RECORD_HEADER_SZ;
10641
10642
#ifdef WOLFSSL_DTLS
10643
    if (ssl->options.dtls) {
10644
        lengthAdj += DTLS_HANDSHAKE_EXTRA;
10645
        outputAdj += DTLS_RECORD_EXTRA;
10646
    }
10647
#endif
10648
10649
    AddRecordHeader(output, length + lengthAdj, handshake, ssl, CUR_ORDER);
10650
    AddHandShakeHeader(output + outputAdj, length, 0, length, type, ssl);
10651
}
10652
#endif /* !WOLFSSL_NO_TLS12 || (HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER) */
10653
10654
10655
#ifndef WOLFSSL_NO_TLS12
10656
#if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_SERVER) || \
10657
                           !defined(WOLFSSL_NO_CLIENT_AUTH)) || \
10658
                           defined(WOLFSSL_DTLS)
10659
static void AddFragHeaders(byte* output, word32 fragSz, word32 fragOffset,
10660
                           word32 length, byte type, WOLFSSL* ssl)
10661
{
10662
    word32 lengthAdj = HANDSHAKE_HEADER_SZ;
10663
    word32 outputAdj = RECORD_HEADER_SZ;
10664
    (void)fragSz;
10665
10666
#ifdef WOLFSSL_DTLS
10667
    if (ssl->options.dtls) {
10668
        lengthAdj += DTLS_HANDSHAKE_EXTRA;
10669
        outputAdj += DTLS_RECORD_EXTRA;
10670
    }
10671
#endif
10672
10673
    AddRecordHeader(output, fragSz + lengthAdj, handshake, ssl, CUR_ORDER);
10674
    AddHandShakeHeader(output + outputAdj, length, fragOffset, fragSz, type, ssl);
10675
}
10676
#endif /* NO_CERTS */
10677
10678
#if !defined(NO_WOLFSSL_SERVER) || \
10679
    (!defined(NO_WOLFSSL_CLIENT) && !defined(NO_CERTS) && \
10680
     !defined(WOLFSSL_NO_CLIENT_AUTH))
10681
/**
10682
 * Send the handshake message. This function handles fragmenting the message
10683
 * so that it will fit into the desired MTU or the max fragment size.
10684
 * @param ssl     Connection object
10685
 * @param input   Input starting at the record layer header. This function
10686
 *                assumes that the appropriate record and handshake headers
10687
 *                are present. These headers must assume no fragmentation.
10688
 *                That is handled here.
10689
 * @param inputSz Length of message excluding headers (this is the total
10690
 *                length of all fragments)
10691
 * @param type    Type of message being sent
10692
 * @return        0 on success and negative otherwise
10693
 */
10694
static int SendHandshakeMsg(WOLFSSL* ssl, byte* input, word32 inputSz,
10695
        enum HandShakeType type, const char* packetName)
10696
0
{
10697
0
    int maxFrag;
10698
0
    int ret = 0;
10699
0
    int headerSz;
10700
0
    int rHdrSz = 0; /* record header size */
10701
0
    int hsHdrSz = 0; /* handshake header size */
10702
10703
0
    WOLFSSL_ENTER("SendHandshakeMsg");
10704
0
    (void)type;
10705
0
    (void)packetName;
10706
10707
0
    if (ssl == NULL || input == NULL)
10708
0
        return BAD_FUNC_ARG;
10709
#ifdef WOLFSSL_DTLS
10710
    if (ssl->options.dtls) {
10711
        rHdrSz = DTLS_RECORD_HEADER_SZ;
10712
        hsHdrSz = DTLS_HANDSHAKE_HEADER_SZ;
10713
    }
10714
    else
10715
#endif
10716
0
    {
10717
        /* In TLS we send one handshake header in total, not one
10718
         * per fragment like in DTLS. The handshake header should
10719
         * already be in the input buffer. */
10720
0
        inputSz += HANDSHAKE_HEADER_SZ;
10721
0
        rHdrSz = RECORD_HEADER_SZ;
10722
0
    }
10723
0
    maxFrag = wolfSSL_GetMaxFragSize(ssl, (int)inputSz);
10724
10725
    /* Make sure input is not the ssl output buffer as this
10726
     * function doesn't handle that */
10727
0
    if (input >= ssl->buffers.outputBuffer.buffer &&
10728
0
            input < ssl->buffers.outputBuffer.buffer +
10729
0
                     ssl->buffers.outputBuffer.bufferSize) {
10730
0
        WOLFSSL_MSG("Can't use output buffer for input in SendHandshakeMsg");
10731
0
        return BAD_FUNC_ARG;
10732
0
    }
10733
0
    if (!ssl->options.buildingMsg) {
10734
        /* Hash it before the loop as we modify the input with
10735
         * encryption on */
10736
0
        ret = HashRaw(ssl, input + rHdrSz, (int)(inputSz) + hsHdrSz);
10737
0
        if (ret != 0)
10738
0
            return ret;
10739
#ifdef WOLFSSL_DTLS
10740
        /* Decrement msg number so that we continue to use the
10741
         * same msg number for this msg */
10742
        if (ssl->options.dtls)
10743
            ssl->keys.dtls_handshake_number--;
10744
#endif
10745
0
    }
10746
0
    headerSz = rHdrSz + hsHdrSz;
10747
0
    while (ssl->fragOffset < inputSz) {
10748
0
        byte* output;
10749
0
        int outputSz;
10750
0
        byte* data = input + ssl->fragOffset + headerSz;
10751
0
        word32 fragSz = (word32)maxFrag;
10752
10753
0
        ssl->options.buildingMsg = 1;
10754
10755
0
        if (inputSz - ssl->fragOffset < fragSz)
10756
0
            fragSz = inputSz - ssl->fragOffset;
10757
10758
        /* check for available size */
10759
0
        outputSz = headerSz + (int)fragSz;
10760
0
        if (IsEncryptionOn(ssl, 1))
10761
0
            outputSz += cipherExtraData(ssl);
10762
0
        if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
10763
0
            return ret;
10764
0
        if (ssl->buffers.outputBuffer.buffer == NULL)
10765
0
            return MEMORY_E;
10766
0
        output = GetOutputBuffer(ssl);
10767
10768
0
        if (IsEncryptionOn(ssl, 1)) {
10769
            /* First we need to add the fragment header ourselves.
10770
             * We do this in the input to minimize allocations */
10771
0
            int dataSz = (int)fragSz;
10772
#ifdef WOLFSSL_DTLS
10773
            if (ssl->options.dtls) {
10774
                data   -= DTLS_HANDSHAKE_HEADER_SZ;
10775
                dataSz += DTLS_HANDSHAKE_HEADER_SZ;
10776
                AddHandShakeHeader(data, inputSz, ssl->fragOffset, fragSz,
10777
                                   type, ssl);
10778
                ssl->keys.dtls_handshake_number--;
10779
            }
10780
            if (IsDtlsNotSctpMode(ssl) &&
10781
                (ret = DtlsMsgPoolSave(ssl, data,
10782
                        fragSz + DTLS_HANDSHAKE_HEADER_SZ, type))
10783
                    != 0)
10784
                return ret;
10785
#endif
10786
0
            ret = BuildMessage(ssl, output, outputSz,
10787
0
                        data, dataSz, handshake, 0, 0, 0, CUR_ORDER);
10788
0
            if (ret >= 0)
10789
0
                outputSz = ret;
10790
0
            else
10791
0
                return ret;
10792
0
            ret = 0;
10793
0
        }
10794
0
        else {
10795
#ifdef WOLFSSL_DTLS
10796
            if (ssl->options.dtls)
10797
                AddFragHeaders(output, fragSz, ssl->fragOffset,
10798
                        inputSz, type, ssl);
10799
            else
10800
#endif
10801
0
                AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
10802
10803
0
            XMEMCPY(output + headerSz, data, fragSz);
10804
#ifdef WOLFSSL_DTLS
10805
            if (ssl->options.dtls) {
10806
                ssl->keys.dtls_handshake_number--;
10807
                DtlsSEQIncrement(ssl, CUR_ORDER);
10808
            }
10809
            if (IsDtlsNotSctpMode(ssl)) {
10810
                if ((ret = DtlsMsgPoolSave(ssl, output, headerSz + fragSz,
10811
                        type)) != 0) {
10812
                    return ret;
10813
                }
10814
            }
10815
#endif
10816
0
        }
10817
0
        ssl->buffers.outputBuffer.length += (word32)outputSz;
10818
#if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
10819
        if (ssl->hsInfoOn) {
10820
            AddPacketName(ssl, packetName);
10821
        }
10822
        if (ssl->toInfoOn) {
10823
            ret = AddPacketInfo(ssl, packetName, handshake,
10824
                output, outputSz, WRITE_PROTO, 0, ssl->heap);
10825
            if (ret != 0)
10826
                return ret;
10827
        }
10828
#endif
10829
0
        ssl->fragOffset += fragSz;
10830
0
        if (!ssl->options.groupMessages)
10831
0
            ret = SendBuffered(ssl);
10832
0
        if (ret != 0)
10833
0
            return ret;
10834
0
    }
10835
#ifdef WOLFSSL_DTLS
10836
    /* Increment msg number once we sent all fragments */
10837
    if (ssl->options.dtls)
10838
        ssl->keys.dtls_handshake_number++;
10839
#endif
10840
0
    ssl->fragOffset = 0;
10841
0
    ssl->options.buildingMsg = 0;
10842
0
    return ret;
10843
0
}
10844
#endif /* !NO_WOLFSSL_SERVER || (!NO_WOLFSSL_CLIENT && !NO_CERTS &&
10845
        *  !WOLFSSL_NO_CLIENT_AUTH) */
10846
10847
#endif /* !WOLFSSL_NO_TLS12 */
10848
10849
10850
/* return bytes received, -1 on error */
10851
static int wolfSSLReceive(WOLFSSL* ssl, byte* buf, word32 sz)
10852
0
{
10853
0
    int recvd;
10854
0
    int retryLimit = WOLFSSL_MODE_AUTO_RETRY_ATTEMPTS;
10855
10856
#ifdef WOLFSSL_QUIC
10857
    if (WOLFSSL_IS_QUIC(ssl)) {
10858
        /* QUIC only "reads" from data provided by the application
10859
         * via wolfSSL_provide_quic_data(). Transfer from there
10860
         * into the inputBuffer. */
10861
        return wolfSSL_quic_receive(ssl, buf, sz);
10862
    }
10863
#endif
10864
10865
0
    if (ssl->CBIORecv == NULL) {
10866
0
        WOLFSSL_MSG("Your IO Recv callback is null, please set");
10867
0
        return WOLFSSL_FATAL_ERROR;
10868
0
    }
10869
10870
0
retry:
10871
0
    recvd = ssl->CBIORecv(ssl, (char *)buf, (int)sz, ssl->IOCB_ReadCtx);
10872
0
    if (recvd < 0) {
10873
0
        switch (recvd) {
10874
0
            case WC_NO_ERR_TRACE(WOLFSSL_CBIO_ERR_GENERAL):
10875
                #ifdef WOLFSSL_APACHE_HTTPD
10876
                #ifndef NO_BIO
10877
                    if (ssl->biord) {
10878
                        /* If retry and read flags are set, return WANT_READ */
10879
                        if ((ssl->biord->flags & WOLFSSL_BIO_FLAG_READ) &&
10880
                            (ssl->biord->flags & WOLFSSL_BIO_FLAG_RETRY)) {
10881
                            return WANT_READ;
10882
                        }
10883
                    }
10884
                #endif
10885
                #endif
10886
0
                return WOLFSSL_FATAL_ERROR;
10887
10888
0
            case WC_NO_ERR_TRACE(WOLFSSL_CBIO_ERR_WANT_READ):
10889
0
                if (retryLimit > 0 && ssl->ctx->autoRetry &&
10890
0
                        !ssl->options.handShakeDone && !ssl->options.dtls) {
10891
0
                    retryLimit--;
10892
0
                    goto retry;
10893
0
                }
10894
0
                return WC_NO_ERR_TRACE(WANT_READ);
10895
10896
0
            case WC_NO_ERR_TRACE(WOLFSSL_CBIO_ERR_CONN_RST):
10897
                #ifdef USE_WINDOWS_API
10898
                if (ssl->options.dtls) {
10899
                    goto retry;
10900
                }
10901
                #endif
10902
0
                ssl->options.connReset = 1;
10903
0
                return WOLFSSL_FATAL_ERROR;
10904
10905
0
            case WC_NO_ERR_TRACE(WOLFSSL_CBIO_ERR_ISR): /* interrupt */
10906
                /* see if we got our timeout */
10907
                #ifdef WOLFSSL_CALLBACKS
10908
                    if (ssl->toInfoOn) {
10909
                        struct itimerval timeout;
10910
                        getitimer(ITIMER_REAL, &timeout);
10911
                        if (timeout.it_value.tv_sec == 0 &&
10912
                                                timeout.it_value.tv_usec == 0) {
10913
                            XSTRNCPY(ssl->timeoutInfo.timeoutName,
10914
                                    "recv() timeout", MAX_TIMEOUT_NAME_SZ);
10915
                            ssl->timeoutInfo.timeoutName[
10916
                                MAX_TIMEOUT_NAME_SZ] = '\0';
10917
10918
                            WOLFSSL_MSG("Got our timeout");
10919
                            return WANT_READ;
10920
                        }
10921
                    }
10922
                #endif
10923
0
                return WOLFSSL_FATAL_ERROR;
10924
10925
0
            case WC_NO_ERR_TRACE(WOLFSSL_CBIO_ERR_CONN_CLOSE):
10926
0
                ssl->options.isClosed = 1;
10927
0
                return WOLFSSL_FATAL_ERROR;
10928
10929
0
            case WC_NO_ERR_TRACE(WOLFSSL_CBIO_ERR_TIMEOUT):
10930
            #ifdef WOLFSSL_DTLS
10931
#ifdef WOLFSSL_DTLS13
10932
                if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
10933
                    /* TODO: support WANT_WRITE here */
10934
                    if (Dtls13RtxTimeout(ssl) < 0) {
10935
                        WOLFSSL_MSG(
10936
                            "Error trying to retransmit DTLS buffered message");
10937
                        return WOLFSSL_FATAL_ERROR;
10938
                    }
10939
                    goto retry;
10940
                }
10941
#endif /* WOLFSSL_DTLS13 */
10942
10943
                if (IsDtlsNotSctpMode(ssl) &&
10944
                    ssl->options.handShakeState != HANDSHAKE_DONE &&
10945
                    DtlsMsgPoolTimeout(ssl) == 0 &&
10946
                    DtlsMsgPoolSend(ssl, 0) == 0) {
10947
10948
                    /* retry read for DTLS during handshake only */
10949
                    goto retry;
10950
                }
10951
            #endif
10952
0
                return WOLFSSL_FATAL_ERROR;
10953
10954
0
            default:
10955
0
                WOLFSSL_MSG("Unexpected recv return code");
10956
0
                return recvd;
10957
0
        }
10958
0
    }
10959
10960
0
    return recvd;
10961
0
}
10962
10963
10964
/* Switch dynamic output buffer back to static, buffer is assumed clear */
10965
void ShrinkOutputBuffer(WOLFSSL* ssl)
10966
126k
{
10967
126k
    WOLFSSL_MSG("Shrinking output buffer");
10968
126k
    XFREE(ssl->buffers.outputBuffer.buffer - ssl->buffers.outputBuffer.offset,
10969
126k
          ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
10970
126k
    ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
10971
126k
    ssl->buffers.outputBuffer.bufferSize  = STATIC_BUFFER_LEN;
10972
126k
    ssl->buffers.outputBuffer.dynamicFlag = 0;
10973
126k
    ssl->buffers.outputBuffer.offset      = 0;
10974
    /* idx and length are assumed to be 0. */
10975
126k
}
10976
10977
10978
/* Switch dynamic input buffer back to static, keep any remaining input */
10979
/* forced free means cleaning up */
10980
/* Be *CAREFUL* where this function is called. ProcessReply relies on
10981
 * inputBuffer.idx *NOT* changing inside the ProcessReply function. ProcessReply
10982
 * calls ShrinkInputBuffer itself when it is safe to do so. Don't overuse it. */
10983
void ShrinkInputBuffer(WOLFSSL* ssl, int forcedFree)
10984
169k
{
10985
169k
    int usedLength = (int)(ssl->buffers.inputBuffer.length -
10986
169k
                     ssl->buffers.inputBuffer.idx);
10987
169k
    if (!forcedFree && (usedLength > STATIC_BUFFER_LEN ||
10988
111k
            ssl->buffers.clearOutputBuffer.length > 0))
10989
77.0k
        return;
10990
10991
92.7k
    WOLFSSL_MSG("Shrinking input buffer");
10992
10993
92.7k
    if (!forcedFree && usedLength > 0) {
10994
1.23k
        XMEMCPY(ssl->buffers.inputBuffer.staticBuffer,
10995
1.23k
               ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
10996
1.23k
               (size_t)(usedLength));
10997
1.23k
    }
10998
10999
92.7k
    ForceZero(ssl->buffers.inputBuffer.buffer,
11000
92.7k
        ssl->buffers.inputBuffer.length);
11001
92.7k
    XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
11002
92.7k
          ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
11003
92.7k
    ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
11004
92.7k
    ssl->buffers.inputBuffer.bufferSize  = STATIC_BUFFER_LEN;
11005
92.7k
    ssl->buffers.inputBuffer.dynamicFlag = 0;
11006
92.7k
    ssl->buffers.inputBuffer.offset      = 0;
11007
92.7k
    ssl->buffers.inputBuffer.idx = 0;
11008
92.7k
    ssl->buffers.inputBuffer.length = (word32)usedLength;
11009
92.7k
}
11010
11011
int SendBuffered(WOLFSSL* ssl)
11012
{
11013
    int retryLimit = WOLFSSL_MODE_AUTO_RETRY_ATTEMPTS;
11014
11015
    if (ssl->CBIOSend == NULL && !WOLFSSL_IS_QUIC(ssl)) {
11016
        WOLFSSL_MSG("Your IO Send callback is null, please set");
11017
        return SOCKET_ERROR_E;
11018
    }
11019
11020
#ifdef WOLFSSL_DEBUG_TLS
11021
    if (ssl->buffers.outputBuffer.idx == 0) {
11022
        WOLFSSL_MSG("Data to send");
11023
        WOLFSSL_BUFFER(ssl->buffers.outputBuffer.buffer,
11024
                       ssl->buffers.outputBuffer.length);
11025
    }
11026
#endif
11027
11028
#ifdef WOLFSSL_QUIC
11029
    if (WOLFSSL_IS_QUIC(ssl)) {
11030
        return wolfSSL_quic_send(ssl);
11031
    }
11032
#endif
11033
11034
    while (ssl->buffers.outputBuffer.length > 0) {
11035
        int sent = 0;
11036
retry:
11037
        sent = ssl->CBIOSend(ssl,
11038
                             (char*)ssl->buffers.outputBuffer.buffer +
11039
                             ssl->buffers.outputBuffer.idx,
11040
                             (int)ssl->buffers.outputBuffer.length,
11041
                             ssl->IOCB_WriteCtx);
11042
        if (sent < 0) {
11043
            switch (sent) {
11044
11045
                case WC_NO_ERR_TRACE(WOLFSSL_CBIO_ERR_WANT_WRITE):
11046
                    if (retryLimit > 0 && ssl->ctx->autoRetry &&
11047
                            !ssl->options.handShakeDone && !ssl->options.dtls) {
11048
                        retryLimit--;
11049
                        goto retry;
11050
                    }
11051
                    return WC_NO_ERR_TRACE(WANT_WRITE);
11052
11053
                case WC_NO_ERR_TRACE(WOLFSSL_CBIO_ERR_CONN_RST):
11054
                    ssl->options.connReset = 1;
11055
                    break;
11056
11057
                case WC_NO_ERR_TRACE(WOLFSSL_CBIO_ERR_ISR): /* interrupt */
11058
                    /* see if we got our timeout */
11059
                    #ifdef WOLFSSL_CALLBACKS
11060
                        if (ssl->toInfoOn) {
11061
                            struct itimerval timeout;
11062
                            getitimer(ITIMER_REAL, &timeout);
11063
                            if (timeout.it_value.tv_sec == 0 &&
11064
                                                timeout.it_value.tv_usec == 0) {
11065
                                XSTRNCPY(ssl->timeoutInfo.timeoutName,
11066
                                        "send() timeout", MAX_TIMEOUT_NAME_SZ);
11067
                                ssl->timeoutInfo.timeoutName[
11068
                                    MAX_TIMEOUT_NAME_SZ] = '\0';
11069
11070
                                WOLFSSL_MSG("Got our timeout");
11071
                                return WANT_WRITE;
11072
                            }
11073
                        }
11074
                    #endif
11075
                    continue;
11076
11077
                case WC_NO_ERR_TRACE(WOLFSSL_CBIO_ERR_CONN_CLOSE): /* epipe */
11078
                    ssl->options.connReset = 1;  /* treat same as reset */
11079
                    break;
11080
11081
                default:
11082
                    return SOCKET_ERROR_E;
11083
            }
11084
11085
            return SOCKET_ERROR_E;
11086
        }
11087
11088
        if (sent > (int)ssl->buffers.outputBuffer.length) {
11089
            WOLFSSL_MSG("SendBuffered() out of bounds read");
11090
            return SEND_OOB_READ_E;
11091
        }
11092
11093
        ssl->buffers.outputBuffer.idx += (word32)sent;
11094
        ssl->buffers.outputBuffer.length -= (word32)sent;
11095
    }
11096
11097
    ssl->buffers.outputBuffer.idx = 0;
11098
11099
    if (ssl->buffers.outputBuffer.dynamicFlag)
11100
        ShrinkOutputBuffer(ssl);
11101
11102
    return 0;
11103
}
11104
11105
#ifdef WOLFSSL_THREADED_CRYPT
11106
static WC_INLINE int GrowAnOutputBuffer(WOLFSSL* ssl,
11107
    bufferStatic* outputBuffer, int size)
11108
{
11109
    byte* tmp;
11110
#if WOLFSSL_GENERAL_ALIGNMENT > 0
11111
    byte  hdrSz = ssl->options.dtls ? DTLS_RECORD_HEADER_SZ :
11112
                                      RECORD_HEADER_SZ;
11113
    byte align = WOLFSSL_GENERAL_ALIGNMENT;
11114
#else
11115
    const byte align = WOLFSSL_GENERAL_ALIGNMENT;
11116
#endif
11117
11118
#if WOLFSSL_GENERAL_ALIGNMENT > 0
11119
    /* the encrypted data will be offset from the front of the buffer by
11120
       the header, if the user wants encrypted alignment they need
11121
       to define their alignment requirement */
11122
11123
    while (align < hdrSz)
11124
        align *= 2;
11125
#endif
11126
11127
    tmp = (byte*)XMALLOC(size + outputBuffer->length + align,
11128
                             ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
11129
    WOLFSSL_MSG("growing output buffer");
11130
11131
    if (tmp == NULL)
11132
        return MEMORY_E;
11133
11134
#if WOLFSSL_GENERAL_ALIGNMENT > 0
11135
    if (align)
11136
        tmp += align - hdrSz;
11137
#endif
11138
11139
#ifdef WOLFSSL_STATIC_MEMORY
11140
    /* can be from IO memory pool which does not need copy if same buffer */
11141
    if (outputBuffer->length && tmp == outputBuffer->buffer) {
11142
        outputBuffer->bufferSize = size + outputBuffer->length;
11143
        return 0;
11144
    }
11145
#endif
11146
11147
    if (outputBuffer->length)
11148
        XMEMCPY(tmp, outputBuffer->buffer, outputBuffer->length);
11149
11150
    if (outputBuffer->dynamicFlag) {
11151
        XFREE(outputBuffer->buffer - outputBuffer->offset, ssl->heap,
11152
              DYNAMIC_TYPE_OUT_BUFFER);
11153
    }
11154
11155
#if WOLFSSL_GENERAL_ALIGNMENT > 0
11156
    if (align)
11157
        outputBuffer->offset = align - hdrSz;
11158
    else
11159
#endif
11160
        outputBuffer->offset = 0;
11161
11162
    outputBuffer->buffer = tmp;
11163
    outputBuffer->dynamicFlag = 1;
11164
    outputBuffer->bufferSize = size + outputBuffer->length;
11165
    return 0;
11166
}
11167
#endif
11168
11169
/* returns the current location in the output buffer to start writing to */
11170
byte* GetOutputBuffer(WOLFSSL* ssl)
11171
131k
{
11172
131k
    return ssl->buffers.outputBuffer.buffer + ssl->buffers.outputBuffer.idx +
11173
131k
             ssl->buffers.outputBuffer.length;
11174
131k
}
11175
11176
11177
/* Grow the output buffer */
11178
static WC_INLINE int GrowOutputBuffer(WOLFSSL* ssl, int size)
11179
138k
{
11180
138k
    byte* tmp;
11181
#if WOLFSSL_GENERAL_ALIGNMENT > 0
11182
    byte  hdrSz = ssl->options.dtls ? DTLS_RECORD_HEADER_SZ :
11183
                                      RECORD_HEADER_SZ;
11184
    byte align = WOLFSSL_GENERAL_ALIGNMENT;
11185
#else
11186
138k
    const byte align = WOLFSSL_GENERAL_ALIGNMENT;
11187
138k
#endif
11188
138k
    word32 newSz;
11189
11190
#if WOLFSSL_GENERAL_ALIGNMENT > 0
11191
    /* the encrypted data will be offset from the front of the buffer by
11192
       the header, if the user wants encrypted alignment they need
11193
       to define their alignment requirement */
11194
11195
    while (align < hdrSz)
11196
        align *= 2;
11197
#endif
11198
11199
138k
    if (! WC_SAFE_SUM_WORD32(ssl->buffers.outputBuffer.idx,
11200
138k
                             ssl->buffers.outputBuffer.length, newSz))
11201
0
        return BUFFER_E;
11202
138k
    if (! WC_SAFE_SUM_WORD32(newSz, (word32)size, newSz))
11203
0
        return BUFFER_E;
11204
138k
    if (! WC_SAFE_SUM_WORD32(newSz, align, newSz))
11205
0
        return BUFFER_E;
11206
138k
    tmp = (byte*)XMALLOC(newSz, ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
11207
138k
    newSz -= align;
11208
138k
    WOLFSSL_MSG("growing output buffer");
11209
11210
138k
    if (tmp == NULL)
11211
11.9k
        return MEMORY_E;
11212
11213
#if WOLFSSL_GENERAL_ALIGNMENT > 0
11214
    if (align)
11215
        tmp += align - hdrSz;
11216
#endif
11217
11218
#ifdef WOLFSSL_STATIC_MEMORY
11219
    /* can be from IO memory pool which does not need copy if same buffer */
11220
    if (ssl->buffers.outputBuffer.length &&
11221
            tmp == ssl->buffers.outputBuffer.buffer) {
11222
        ssl->buffers.outputBuffer.bufferSize = newSz;
11223
        return 0;
11224
    }
11225
#endif
11226
11227
126k
    if (ssl->buffers.outputBuffer.length)
11228
24
        XMEMCPY(tmp, ssl->buffers.outputBuffer.buffer,
11229
126k
               ssl->buffers.outputBuffer.idx +
11230
126k
               ssl->buffers.outputBuffer.length);
11231
11232
126k
    if (ssl->buffers.outputBuffer.dynamicFlag) {
11233
24
        XFREE(ssl->buffers.outputBuffer.buffer -
11234
24
              ssl->buffers.outputBuffer.offset, ssl->heap,
11235
24
              DYNAMIC_TYPE_OUT_BUFFER);
11236
24
    }
11237
126k
    ssl->buffers.outputBuffer.dynamicFlag = 1;
11238
11239
#if WOLFSSL_GENERAL_ALIGNMENT > 0
11240
    if (align)
11241
        ssl->buffers.outputBuffer.offset = align - hdrSz;
11242
    else
11243
#endif
11244
126k
        ssl->buffers.outputBuffer.offset = 0;
11245
11246
126k
    ssl->buffers.outputBuffer.buffer = tmp;
11247
126k
    ssl->buffers.outputBuffer.bufferSize = newSz;
11248
126k
    return 0;
11249
138k
}
11250
11251
11252
/* Grow the input buffer, should only be to read cert or big app data */
11253
int GrowInputBuffer(WOLFSSL* ssl, int size, int usedLength)
11254
{
11255
    byte* tmp;
11256
#if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
11257
    byte  align = ssl->options.dtls ? WOLFSSL_GENERAL_ALIGNMENT : 0;
11258
    byte  hdrSz = DTLS_RECORD_HEADER_SZ;
11259
#else
11260
    const byte align = WOLFSSL_GENERAL_ALIGNMENT;
11261
#endif
11262
11263
#if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
11264
    /* the encrypted data will be offset from the front of the buffer by
11265
       the dtls record header, if the user wants encrypted alignment they need
11266
       to define their alignment requirement. in tls we read record header
11267
       to get size of record and put actual data back at front, so don't need */
11268
11269
    if (align) {
11270
       while (align < hdrSz)
11271
           align *= 2;
11272
    }
11273
#endif
11274
11275
    if (usedLength < 0 || size < 0) {
11276
        WOLFSSL_MSG("GrowInputBuffer() called with negative number");
11277
        return BAD_FUNC_ARG;
11278
    }
11279
11280
    tmp = (byte*)XMALLOC((size_t)(size + usedLength + align),
11281
                             ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
11282
    WOLFSSL_MSG("growing input buffer");
11283
11284
    if (tmp == NULL)
11285
        return MEMORY_E;
11286
11287
#if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
11288
    if (align)
11289
        tmp += align - hdrSz;
11290
#endif
11291
11292
#ifdef WOLFSSL_STATIC_MEMORY
11293
    /* can be from IO memory pool which does not need copy if same buffer */
11294
    if (usedLength && tmp == ssl->buffers.inputBuffer.buffer) {
11295
        ssl->buffers.inputBuffer.bufferSize = size + usedLength;
11296
        ssl->buffers.inputBuffer.idx    = 0;
11297
        ssl->buffers.inputBuffer.length = usedLength;
11298
        return 0;
11299
    }
11300
#endif
11301
11302
    if (usedLength)
11303
        XMEMCPY(tmp, ssl->buffers.inputBuffer.buffer +
11304
                    ssl->buffers.inputBuffer.idx, (size_t)(usedLength));
11305
11306
    if (ssl->buffers.inputBuffer.dynamicFlag) {
11307
        if (IsEncryptionOn(ssl, 1)) {
11308
            ForceZero(ssl->buffers.inputBuffer.buffer,
11309
                ssl->buffers.inputBuffer.length);
11310
        }
11311
        XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
11312
              ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
11313
    }
11314
11315
    ssl->buffers.inputBuffer.dynamicFlag = 1;
11316
#if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
11317
    if (align)
11318
        ssl->buffers.inputBuffer.offset = align - hdrSz;
11319
    else
11320
#endif
11321
        ssl->buffers.inputBuffer.offset = 0;
11322
11323
    ssl->buffers.inputBuffer.buffer = tmp;
11324
    ssl->buffers.inputBuffer.bufferSize = (word32)(size + usedLength);
11325
    ssl->buffers.inputBuffer.idx    = 0;
11326
    ssl->buffers.inputBuffer.length = (word32)usedLength;
11327
11328
    return 0;
11329
}
11330
11331
11332
/* Check available size into output buffer, make room if needed.
11333
 * This function needs to be called before anything gets put
11334
 * into the output buffers since it flushes pending data if it
11335
 * predicts that the msg will exceed MTU. */
11336
int CheckAvailableSize(WOLFSSL *ssl, int size)
11337
{
11338
    if (size < 0) {
11339
        WOLFSSL_MSG("CheckAvailableSize() called with negative number");
11340
        return BAD_FUNC_ARG;
11341
    }
11342
11343
#ifdef WOLFSSL_DTLS
11344
    if (ssl->options.dtls) {
11345
#if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
11346
        word32 mtu = (word32)ssl->dtlsMtuSz;
11347
#else
11348
        word32 mtu = MAX_MTU;
11349
#endif
11350
        if ((word32)size + ssl->buffers.outputBuffer.length > mtu) {
11351
            int ret;
11352
            WOLFSSL_MSG("CheckAvailableSize() flushing buffer "
11353
                        "to make room for new message");
11354
            if ((ret = SendBuffered(ssl)) != 0) {
11355
                return ret;
11356
            }
11357
        }
11358
        if ((word32)size > mtu
11359
#ifdef WOLFSSL_DTLS13
11360
            /* DTLS1.3 uses the output buffer to store the full message and deal
11361
               with fragmentation later in dtls13HandshakeSend() */
11362
            && !IsAtLeastTLSv1_3(ssl->version)
11363
#endif /* WOLFSSL_DTLS13 */
11364
            ) {
11365
            WOLFSSL_MSG("CheckAvailableSize() called with size greater than MTU.");
11366
            return DTLS_SIZE_ERROR;
11367
        }
11368
    }
11369
#endif
11370
11371
    if ((ssl->buffers.outputBuffer.bufferSize -
11372
             ssl->buffers.outputBuffer.length -
11373
             ssl->buffers.outputBuffer.idx) < (word32)size) {
11374
        if (GrowOutputBuffer(ssl, size) < 0)
11375
            return MEMORY_E;
11376
    }
11377
11378
    return 0;
11379
}
11380
11381
#ifndef WOLFSSL_DISABLE_EARLY_SANITY_CHECKS
11382
11383
int MsgCheckEncryption(WOLFSSL* ssl, byte type, byte encrypted)
11384
{
11385
#ifdef WOLFSSL_QUIC
11386
    /* QUIC protects messages outside of the TLS scope */
11387
    if (WOLFSSL_IS_QUIC(ssl) && IsAtLeastTLSv1_3(ssl->version))
11388
        return 0;
11389
#endif
11390
    /* Verify which messages always have to be encrypted */
11391
    if (IsAtLeastTLSv1_3(ssl->version)) {
11392
        switch ((enum HandShakeType)type) {
11393
            case client_hello:
11394
            case server_hello:
11395
            case hello_verify_request:
11396
            case hello_retry_request:
11397
            case change_cipher_hs:
11398
                if (encrypted) {
11399
                    WOLFSSL_MSG("Message can not be encrypted");
11400
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
11401
                    return OUT_OF_ORDER_E;
11402
                }
11403
                break;
11404
            case hello_request:
11405
            case session_ticket:
11406
            case end_of_early_data:
11407
            case encrypted_extensions:
11408
            case certificate:
11409
            case server_key_exchange:
11410
            case certificate_request:
11411
            case server_hello_done:
11412
            case certificate_verify:
11413
            case client_key_exchange:
11414
            case finished:
11415
            case certificate_status:
11416
            case key_update:
11417
                if (!encrypted) {
11418
                    WOLFSSL_MSG("Message always has to be encrypted");
11419
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
11420
                    return OUT_OF_ORDER_E;
11421
                }
11422
                break;
11423
            case message_hash:
11424
            case no_shake:
11425
            default:
11426
                WOLFSSL_MSG("Unknown message type");
11427
                WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11428
                return SANITY_MSG_E;
11429
        }
11430
    }
11431
    else {
11432
        switch ((enum HandShakeType)type) {
11433
            case client_hello:
11434
                if ((IsSCR(ssl) || ssl->options.handShakeDone) && !encrypted) {
11435
                    WOLFSSL_MSG("Message has to be encrypted for SCR");
11436
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
11437
                    return OUT_OF_ORDER_E;
11438
                }
11439
                break;
11440
            case server_hello:
11441
            case hello_verify_request:
11442
            case hello_retry_request:
11443
            case certificate:
11444
            case server_key_exchange:
11445
            case certificate_request:
11446
            case server_hello_done:
11447
            case certificate_verify:
11448
            case client_key_exchange:
11449
            case certificate_status:
11450
            case session_ticket:
11451
            case change_cipher_hs:
11452
                if (IsSCR(ssl)) {
11453
                    if (!encrypted) {
11454
                        WOLFSSL_MSG("Message has to be encrypted during SCR");
11455
                        WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
11456
                        return OUT_OF_ORDER_E;
11457
                    }
11458
                }
11459
                else if (encrypted) {
11460
                    WOLFSSL_MSG("Message can not be encrypted in regular "
11461
                                "handshake");
11462
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
11463
                    return OUT_OF_ORDER_E;
11464
                }
11465
                break;
11466
            case hello_request:
11467
            case finished:
11468
                if (!encrypted) {
11469
                    WOLFSSL_MSG("Message always has to be encrypted");
11470
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
11471
                    return OUT_OF_ORDER_E;
11472
                }
11473
                break;
11474
            case key_update:
11475
            case encrypted_extensions:
11476
            case end_of_early_data:
11477
            case message_hash:
11478
            case no_shake:
11479
            default:
11480
                WOLFSSL_MSG("Unknown message type");
11481
                WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11482
                return SANITY_MSG_E;
11483
        }
11484
    }
11485
    return 0;
11486
}
11487
11488
static WC_INLINE int isLastMsg(const WOLFSSL* ssl, word32 msgSz)
11489
76.2k
{
11490
76.2k
    word32 extra = 0;
11491
76.2k
    if (IsEncryptionOn(ssl, 0))
11492
10
        extra = ssl->keys.padSz;
11493
76.2k
    return (ssl->buffers.inputBuffer.idx - ssl->curStartIdx) + msgSz + extra
11494
76.2k
            == ssl->curSize;
11495
76.2k
}
11496
11497
/* Check if the msg is the last msg in a record. This is also an easy way
11498
 * to check that a record doesn't span different key boundaries. */
11499
static int MsgCheckBoundary(const WOLFSSL* ssl, byte type,
11500
        byte version_negotiated, word32 msgSz)
11501
141k
{
11502
141k
    if (version_negotiated) {
11503
23.0k
        if (IsAtLeastTLSv1_3(ssl->version)) {
11504
11
            switch ((enum HandShakeType)type) {
11505
0
                case hello_request:
11506
2
                case client_hello:
11507
5
                case server_hello:
11508
9
                case hello_verify_request:
11509
10
                case hello_retry_request:
11510
10
                case finished:
11511
10
                case end_of_early_data:
11512
10
                    if (!isLastMsg(ssl, msgSz)) {
11513
5
                        WOLFSSL_MSG("Message type is not last in record");
11514
5
                        WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
11515
5
                        return OUT_OF_ORDER_E;
11516
5
                    }
11517
5
                    break;
11518
5
                case session_ticket:
11519
0
                case encrypted_extensions:
11520
0
                case certificate:
11521
0
                case server_key_exchange:
11522
0
                case certificate_request:
11523
0
                case certificate_verify:
11524
0
                case client_key_exchange:
11525
0
                case certificate_status:
11526
0
                case key_update:
11527
1
                case change_cipher_hs:
11528
1
                    break;
11529
0
                case server_hello_done:
11530
0
                case message_hash:
11531
0
                case no_shake:
11532
0
                default:
11533
0
                    WOLFSSL_MSG("Unknown message type");
11534
0
                    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11535
0
                    return SANITY_MSG_E;
11536
11
            }
11537
11
        }
11538
23.0k
        else {
11539
23.0k
            switch ((enum HandShakeType)type) {
11540
0
                case hello_request:
11541
796
                case client_hello:
11542
1.73k
                case hello_verify_request:
11543
1.73k
                    if (!isLastMsg(ssl, msgSz)) {
11544
42
                        WOLFSSL_MSG("Message type is not last in record");
11545
42
                        WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
11546
42
                        return OUT_OF_ORDER_E;
11547
42
                    }
11548
1.69k
                    break;
11549
1.69k
                case server_hello:
11550
1.16k
                case session_ticket:
11551
1.16k
                case end_of_early_data:
11552
10.0k
                case certificate:
11553
14.1k
                case server_key_exchange:
11554
15.9k
                case certificate_request:
11555
17.5k
                case server_hello_done:
11556
18.2k
                case certificate_verify:
11557
19.8k
                case client_key_exchange:
11558
19.8k
                case finished:
11559
20.9k
                case certificate_status:
11560
21.3k
                case change_cipher_hs:
11561
21.3k
                    break;
11562
4
                case hello_retry_request:
11563
4
                case encrypted_extensions:
11564
4
                case key_update:
11565
4
                case message_hash:
11566
4
                case no_shake:
11567
4
                default:
11568
4
                    WOLFSSL_MSG("Unknown message type");
11569
4
                    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11570
4
                    return SANITY_MSG_E;
11571
23.0k
            }
11572
23.0k
        }
11573
23.0k
    }
11574
118k
    else {
11575
118k
        switch ((enum HandShakeType)type) {
11576
7.28k
            case hello_request:
11577
72.3k
            case client_hello:
11578
74.5k
            case hello_verify_request:
11579
74.5k
                if (!isLastMsg(ssl, msgSz)) {
11580
562
                    WOLFSSL_MSG("Message type is not last in record");
11581
562
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
11582
562
                    return OUT_OF_ORDER_E;
11583
562
                }
11584
73.9k
                break;
11585
73.9k
            case server_hello:
11586
23.4k
            case session_ticket:
11587
25.0k
            case end_of_early_data:
11588
26.0k
            case hello_retry_request:
11589
27.1k
            case encrypted_extensions:
11590
32.9k
            case certificate:
11591
33.8k
            case server_key_exchange:
11592
36.4k
            case certificate_request:
11593
37.4k
            case server_hello_done:
11594
38.3k
            case certificate_verify:
11595
40.1k
            case client_key_exchange:
11596
41.3k
            case finished:
11597
42.1k
            case certificate_status:
11598
42.9k
            case key_update:
11599
43.7k
            case change_cipher_hs:
11600
43.7k
                break;
11601
3
            case message_hash:
11602
20
            case no_shake:
11603
124
            default:
11604
124
                WOLFSSL_MSG("Unknown message type");
11605
124
                WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11606
124
                return SANITY_MSG_E;
11607
118k
        }
11608
118k
    }
11609
140k
    return 0;
11610
141k
}
11611
11612
#endif /* WOLFSSL_DISABLE_EARLY_SANITY_CHECKS */
11613
11614
/* Extract the handshake header information.
11615
 *
11616
 * ssl       The SSL/TLS object.
11617
 * input     The buffer holding the message data.
11618
 * inOutIdx  On entry, the index into the buffer of the handshake data.
11619
 *           On exit, the start of the handshake data.
11620
 * type      Type of handshake message.
11621
 * size      The length of the handshake message data.
11622
 * totalSz   The total size of data in the buffer.
11623
 * returns BUFFER_E if there is not enough input data and 0 on success.
11624
 */
11625
int GetHandshakeHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
11626
                       byte* type, word32* size, word32 totalSz)
11627
62.7k
{
11628
62.7k
    const byte* ptr = input + *inOutIdx;
11629
62.7k
    (void)ssl;
11630
11631
62.7k
    *inOutIdx += HANDSHAKE_HEADER_SZ;
11632
62.7k
    if (*inOutIdx > totalSz)
11633
136
        return BUFFER_E;
11634
11635
62.6k
    *type = ptr[0];
11636
62.6k
    c24to32(&ptr[1], size);
11637
11638
62.6k
    return 0;
11639
62.7k
}
11640
11641
/**
11642
 * This check is performed as soon as the handshake message type becomes known.
11643
 * These checks can not be delayed and need to be performed when the msg is
11644
 * received and not when it is processed (fragmentation may cause messages to
11645
 * be processed at a later time). This function CAN NOT be called on stored
11646
 * messages as it relies on the state of the WOLFSSL object right after
11647
 * receiving the message.
11648
 *
11649
 * @param ssl   The current connection
11650
 * @param type  The enum HandShakeType of the current message
11651
 * @param msgSz Size of the current message
11652
 * @return int (less than 0 on fail, 0 on success)
11653
 */
11654
int EarlySanityCheckMsgReceived(WOLFSSL* ssl, byte type, word32 msgSz)
11655
{
11656
    int ret = 0;
11657
#ifndef WOLFSSL_DISABLE_EARLY_SANITY_CHECKS
11658
    /* Version has only been negotiated after we either send or process a
11659
     * ServerHello message */
11660
    byte version_negotiated = ssl->options.serverState >= SERVER_HELLO_COMPLETE;
11661
11662
    WOLFSSL_ENTER("EarlySanityCheckMsgReceived");
11663
11664
    if (version_negotiated)
11665
        ret = MsgCheckEncryption(ssl, type, ssl->keys.decryptedCur == 1);
11666
11667
    if (ret == 0)
11668
        ret = MsgCheckBoundary(ssl, type, version_negotiated, msgSz);
11669
11670
    if (ret != 0
11671
#ifdef WOLFSSL_DTLS
11672
            && ssl->options.dtls && ssl->options.dtlsStateful
11673
#endif
11674
            )
11675
        SendAlert(ssl, alert_fatal, unexpected_message);
11676
11677
    WOLFSSL_LEAVE("EarlySanityCheckMsgReceived", ret);
11678
#else
11679
    (void)ssl;
11680
    (void)type;
11681
    (void)msgSz;
11682
#endif
11683
11684
    return ret;
11685
}
11686
11687
static int RecordsCanSpanReads(WOLFSSL *ssl)
11688
{
11689
#if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_DTLS_RECORDS_CAN_SPAN_DATAGRAMS)
11690
    /* Only case where we return 0: DTLS mode (not SCTP) and can't span datagrams */
11691
    if (IsDtlsNotSctpMode(ssl)) {
11692
        return 0;
11693
    }
11694
#endif
11695
    (void)ssl;
11696
    return 1;
11697
}
11698
11699
#ifdef WOLFSSL_DTLS13
11700
static int GetInputData(WOLFSSL *ssl, word32 size);
11701
static int GetDtls13RecordHeader(WOLFSSL* ssl, word32* inOutIdx,
11702
    RecordLayerHeader* rh, word16* size)
11703
{
11704
11705
    Dtls13UnifiedHdrInfo hdrInfo;
11706
    w64wrapper epochNumber;
11707
    byte epochBits;
11708
    int readSize;
11709
    int ret;
11710
11711
    readSize = ssl->buffers.inputBuffer.length - *inOutIdx;
11712
11713
    if (readSize < DTLS_UNIFIED_HEADER_MIN_SZ)
11714
        return BUFFER_ERROR;
11715
11716
    epochBits = *(ssl->buffers.inputBuffer.buffer + *inOutIdx) & EE_MASK;
11717
    ret = Dtls13ReconstructEpochNumber(ssl, epochBits, &epochNumber);
11718
    if (ret != 0)
11719
        return ret;
11720
11721
#ifdef WOLFSSL_DEBUG_TLS
11722
    WOLFSSL_MSG_EX("reconstructed epoch number: %ld",
11723
                   epochNumber);
11724
#endif /* WOLFSSL_DEBUG_TLS */
11725
11726
    /* protected records always use unified_headers in DTLSv1.3 */
11727
    if (w64IsZero(epochNumber))
11728
        return SEQUENCE_ERROR;
11729
11730
    if (ssl->dtls13DecryptEpoch == NULL)
11731
        return BAD_STATE_E;
11732
11733
#ifdef WOLFSSL_EARLY_DATA
11734
    if (w64Equal(epochNumber, w64From32(0x0, DTLS13_EPOCH_EARLYDATA)) &&
11735
            ssl->options.handShakeDone) {
11736
        WOLFSSL_MSG("discarding early data after handshake");
11737
        return SEQUENCE_ERROR;
11738
    }
11739
#endif /* WOLFSSL_DTLS13 */
11740
11741
    if (!w64Equal(ssl->dtls13DecryptEpoch->epochNumber, epochNumber)) {
11742
        ret = Dtls13SetEpochKeys(ssl, epochNumber, DECRYPT_SIDE_ONLY);
11743
        if (ret != 0)
11744
            return SEQUENCE_ERROR;
11745
    }
11746
11747
    ret = Dtls13GetUnifiedHeaderSize(ssl,
11748
        *(ssl->buffers.inputBuffer.buffer+*inOutIdx), &ssl->dtls13CurRlLength);
11749
    if (ret != 0)
11750
        return ret;
11751
11752
    if (ssl->dtls13CurRlLength > sizeof(ssl->dtls13CurRL)) {
11753
        WOLFSSL_MSG("Record header too long");
11754
        return SEQUENCE_ERROR;
11755
    }
11756
11757
    if (readSize < ssl->dtls13CurRlLength + DTLS13_RN_MASK_SIZE) {
11758
        if (!RecordsCanSpanReads(ssl)) {
11759
            WOLFSSL_MSG("Partial record received");
11760
            return DTLS_PARTIAL_RECORD_READ;
11761
        }
11762
        /* when using DTLS over a medium that does not guarantee that a full
11763
         * message is received in a single read, we may end up without the full
11764
         * header and minimum ciphertext to decrypt record sequence numbers */
11765
        ret = GetInputData(ssl, ssl->dtls13CurRlLength + DTLS13_RN_MASK_SIZE);
11766
        if (ret != 0)
11767
            return ret;
11768
11769
        readSize = ssl->buffers.inputBuffer.length - *inOutIdx;
11770
    }
11771
11772
    ret = Dtls13ParseUnifiedRecordLayer(ssl,
11773
        ssl->buffers.inputBuffer.buffer + *inOutIdx, (word16)readSize,
11774
        &hdrInfo);
11775
11776
    if (ret != 0)
11777
        return ret;
11778
11779
    *size = hdrInfo.recordLength;
11780
    c16toa(*size, rh->length);
11781
11782
   /* type is implicit */
11783
    rh->type = application_data;
11784
11785
    /* version is implicit */
11786
    rh->pvMajor = ssl->version.major;
11787
    rh->pvMinor = DTLSv1_2_MINOR;
11788
11789
    ssl->keys.curEpoch64 = epochNumber;
11790
11791
    ret = Dtls13ReconstructSeqNumber(ssl, &hdrInfo, &ssl->keys.curSeq);
11792
    if (ret != 0)
11793
        return ret;
11794
11795
#ifdef WOLFSSL_DEBUG_TLS
11796
    WOLFSSL_MSG_EX("reconstructed seq number: %ld",
11797
                   ssl->keys.curSeq);
11798
#endif /* WOLFSSL_DEBUG_TLS */
11799
11800
    XMEMCPY(ssl->dtls13CurRL, ssl->buffers.inputBuffer.buffer + *inOutIdx,
11801
            ssl->dtls13CurRlLength);
11802
    *inOutIdx += ssl->dtls13CurRlLength;
11803
11804
    return 0;
11805
}
11806
11807
#endif /* WOLFSSL_DTLS13 */
11808
11809
#ifdef WOLFSSL_DTLS
11810
static int GetDtlsRecordHeader(WOLFSSL* ssl, word32* inOutIdx,
11811
    RecordLayerHeader* rh, word16* size)
11812
{
11813
#ifdef WOLFSSL_DTLS_CID
11814
    byte cidSz = 0;
11815
#endif
11816
11817
#ifdef HAVE_FUZZER
11818
    if (ssl->fuzzerCb)
11819
        ssl->fuzzerCb(ssl, ssl->buffers.inputBuffer.buffer + *inOutIdx,
11820
                      DTLS_RECORD_HEADER_SZ, FUZZ_HEAD, ssl->fuzzerCtx);
11821
#endif
11822
11823
#ifdef WOLFSSL_DTLS13
11824
    int ret;
11825
11826
    if (Dtls13IsUnifiedHeader(*(ssl->buffers.inputBuffer.buffer + *inOutIdx))) {
11827
        ssl->options.seenUnifiedHdr = 1; /* We can send ACKs to the peer */
11828
11829
        /* version 1.3 already negotiated */
11830
        if (ssl->options.tls1_3) {
11831
            ret = GetDtls13RecordHeader(ssl, inOutIdx, rh, size);
11832
            if (ret == 0 ||
11833
                ((ret != WC_NO_ERR_TRACE(SEQUENCE_ERROR)) &&
11834
                 (ret != WC_NO_ERR_TRACE(DTLS_CID_ERROR))))
11835
                return ret;
11836
        }
11837
11838
#ifndef NO_WOLFSSL_CLIENT
11839
        if (ssl->options.side == WOLFSSL_CLIENT_END
11840
            && ssl->options.serverState < SERVER_HELLO_COMPLETE
11841
            && IsAtLeastTLSv1_3(ssl->version)
11842
            && !ssl->options.handShakeDone) {
11843
            /* we may have lost ServerHello. Try to send a empty ACK to shortcut
11844
               Server retransmission timer */
11845
            ssl->dtls13Rtx.sendAcks = 1;
11846
        }
11847
#endif
11848
        return SEQUENCE_ERROR;
11849
    }
11850
11851
    /* not a unified header, check that we have at least
11852
     * DTLS_RECORD_HEADER_SZ */
11853
    if (ssl->buffers.inputBuffer.length - *inOutIdx < DTLS_RECORD_HEADER_SZ) {
11854
        if (!RecordsCanSpanReads(ssl)) {
11855
            WOLFSSL_MSG("Partial record received");
11856
            return DTLS_PARTIAL_RECORD_READ;
11857
        }
11858
        ret = GetInputData(ssl, DTLS_RECORD_HEADER_SZ);
11859
        /* Check if Dtls13RtxTimeout(ssl) returned socket error */
11860
        if (ret == WC_NO_ERR_TRACE(SOCKET_ERROR_E))
11861
            return ret;
11862
        if (ret != 0)
11863
            return LENGTH_ERROR;
11864
    }
11865
#endif /* WOLFSSL_DTLS13 */
11866
11867
    /* type and version in same spot */
11868
    XMEMCPY(rh, ssl->buffers.inputBuffer.buffer + *inOutIdx,
11869
            ENUM_LEN + VERSION_SZ);
11870
    *inOutIdx += ENUM_LEN + VERSION_SZ;
11871
    ato16(ssl->buffers.inputBuffer.buffer + *inOutIdx, &ssl->keys.curEpoch);
11872
11873
    if (rh->pvMajor == DTLS_MAJOR && rh->pvMinor == DTLS_BOGUS_MINOR) {
11874
        return SEQUENCE_ERROR;
11875
    }
11876
11877
#ifdef WOLFSSL_DTLS_CID
11878
    if (rh->type == dtls12_cid && (cidSz = DtlsGetCidRxSize(ssl)) == 0)
11879
        return DTLS_CID_ERROR;
11880
#endif
11881
11882
#ifdef WOLFSSL_DTLS13
11883
    /* only non protected message can use the DTLSPlaintext record header */
11884
    if (IsAtLeastTLSv1_3(ssl->version)) {
11885
        if (ssl->keys.curEpoch != 0)
11886
            return SEQUENCE_ERROR;
11887
11888
        w64Zero(&ssl->keys.curEpoch64);
11889
        if (!w64IsZero(ssl->dtls13DecryptEpoch->epochNumber))
11890
            Dtls13SetEpochKeys(ssl, ssl->keys.curEpoch64, DECRYPT_SIDE_ONLY);
11891
    }
11892
#endif /* WOLFSSL_DTLS13 */
11893
11894
    *inOutIdx += OPAQUE16_LEN;
11895
    if (ssl->options.haveMcast) {
11896
    #ifdef WOLFSSL_MULTICAST
11897
        ssl->keys.curPeerId = ssl->buffers.inputBuffer.buffer[*inOutIdx];
11898
        ssl->keys.curSeq_hi = ssl->buffers.inputBuffer.buffer[*inOutIdx+1];
11899
    #endif
11900
    }
11901
    else
11902
        ato16(ssl->buffers.inputBuffer.buffer + *inOutIdx, &ssl->keys.curSeq_hi);
11903
    *inOutIdx += OPAQUE16_LEN;
11904
    ato32(ssl->buffers.inputBuffer.buffer + *inOutIdx, &ssl->keys.curSeq_lo);
11905
    *inOutIdx += OPAQUE32_LEN;  /* advance past rest of seq */
11906
11907
#ifdef WOLFSSL_DTLS13
11908
    /* DTLSv1.3 PlainText records use DTLSv1.2 sequence number encoding. Update
11909
       the DTLv1.3 word64 version as well */
11910
    ssl->keys.curSeq = w64From32(ssl->keys.curSeq_hi, ssl->keys.curSeq_lo);
11911
#endif /* WOLFSSL_DTLS13 */
11912
11913
#ifdef WOLFSSL_DTLS_CID
11914
    if (rh->type == dtls12_cid) {
11915
        byte* ourCid = NULL;
11916
        if (ssl->buffers.inputBuffer.length - *inOutIdx <
11917
                (word32)cidSz + LENGTH_SZ)
11918
            return LENGTH_ERROR;
11919
        if (wolfSSL_dtls_cid_get0_rx(ssl, &ourCid) != WOLFSSL_SUCCESS)
11920
            return DTLS_CID_ERROR;
11921
        if (XMEMCMP(ssl->buffers.inputBuffer.buffer + *inOutIdx, ourCid, cidSz)
11922
                != 0)
11923
            return DTLS_CID_ERROR;
11924
        *inOutIdx += cidSz;
11925
    }
11926
#endif
11927
    ato16(ssl->buffers.inputBuffer.buffer + *inOutIdx, size);
11928
    *inOutIdx += LENGTH_SZ;
11929
11930
    return 0;
11931
}
11932
#endif /* WOLFSSL_DTLS */
11933
11934
/* do all verify and sanity checks on record header */
11935
static int GetRecordHeader(WOLFSSL* ssl, word32* inOutIdx,
11936
                           RecordLayerHeader* rh, word16 *size)
11937
{
11938
    byte tls12minor = 0;
11939
11940
#ifdef OPENSSL_ALL
11941
    word32 start = *inOutIdx;
11942
#endif
11943
11944
    (void)tls12minor;
11945
11946
    if (!ssl->options.dtls) {
11947
#ifdef HAVE_FUZZER
11948
        if (ssl->fuzzerCb)
11949
            ssl->fuzzerCb(ssl, ssl->buffers.inputBuffer.buffer + *inOutIdx,
11950
                          RECORD_HEADER_SZ, FUZZ_HEAD, ssl->fuzzerCtx);
11951
#endif
11952
        /* Set explicitly rather than make assumptions on struct layout */
11953
        rh->type      = ssl->buffers.inputBuffer.buffer[*inOutIdx];
11954
        rh->pvMajor   = ssl->buffers.inputBuffer.buffer[*inOutIdx + 1];
11955
        rh->pvMinor   = ssl->buffers.inputBuffer.buffer[*inOutIdx + 2];
11956
        rh->length[0] = ssl->buffers.inputBuffer.buffer[*inOutIdx + 3];
11957
        rh->length[1] = ssl->buffers.inputBuffer.buffer[*inOutIdx + 4];
11958
11959
        *inOutIdx += RECORD_HEADER_SZ;
11960
        ato16(rh->length, size);
11961
    }
11962
    else {
11963
#ifdef WOLFSSL_DTLS
11964
        int ret = GetDtlsRecordHeader(ssl, inOutIdx, rh, size);
11965
        if (ret != 0)
11966
            return ret;
11967
#endif
11968
    }
11969
11970
#ifdef WOLFSSL_DTLS
11971
    /* DTLSv1.3 MUST check window after deprotecting to avoid timing channel
11972
       (RFC9147 Section 4.5.1) */
11973
    if (IsDtlsNotSctpMode(ssl) && !IsAtLeastTLSv1_3(ssl->version)) {
11974
        byte needsEnc = rh->type == application_data; /* can't be epoch 0 */
11975
#ifdef WOLFSSL_DTLS_CID
11976
        needsEnc = needsEnc || rh->type == dtls12_cid;
11977
#endif
11978
        if (!_DtlsCheckWindow(ssl) ||
11979
                (needsEnc && ssl->keys.curEpoch == 0) ||
11980
                (rh->type == alert && ssl->options.handShakeDone &&
11981
                        ssl->keys.curEpoch == 0 && ssl->keys.dtls_epoch != 0)) {
11982
            WOLFSSL_LEAVE("GetRecordHeader()", SEQUENCE_ERROR);
11983
            return SEQUENCE_ERROR;
11984
        }
11985
    }
11986
#endif
11987
11988
#if defined(WOLFSSL_DTLS13) || defined(WOLFSSL_TLS13)
11989
    tls12minor = TLSv1_2_MINOR;
11990
#endif
11991
#ifdef WOLFSSL_DTLS13
11992
    if (ssl->options.dtls)
11993
        tls12minor = DTLSv1_2_MINOR;
11994
#endif /* WOLFSSL_DTLS13 */
11995
    /* catch version mismatch */
11996
#ifndef WOLFSSL_TLS13
11997
    if (rh->pvMajor != ssl->version.major || rh->pvMinor != ssl->version.minor)
11998
#else
11999
    if (rh->pvMajor != ssl->version.major ||
12000
        (rh->pvMinor != ssl->version.minor &&
12001
         (!IsAtLeastTLSv1_3(ssl->version) || rh->pvMinor != tls12minor)
12002
        ))
12003
#endif
12004
    {
12005
        if (ssl->options.side == WOLFSSL_SERVER_END &&
12006
            ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE)
12007
12008
            WOLFSSL_MSG("Client attempting to connect with different version");
12009
        else if (ssl->options.side == WOLFSSL_CLIENT_END &&
12010
                                 ssl->options.downgrade &&
12011
                                 ssl->options.connectState < FIRST_REPLY_DONE)
12012
            WOLFSSL_MSG("Server attempting to accept with different version");
12013
        else if (ssl->options.dtls && rh->type == handshake)
12014
            /* Check the DTLS handshake message RH version later. */
12015
            WOLFSSL_MSG("DTLS handshake, skip RH version number check");
12016
#ifdef WOLFSSL_DTLS13
12017
        else if (ssl->options.dtls && !ssl->options.handShakeDone) {
12018
            /* we may have lost the ServerHello and this is a unified record
12019
               before version been negotiated */
12020
            if (Dtls13IsUnifiedHeader(*ssl->buffers.inputBuffer.buffer)) {
12021
                return SEQUENCE_ERROR;
12022
            }
12023
        }
12024
#endif /* WOLFSSL_DTLS13 */
12025
        /* Don't care about protocol version being lower than expected on alerts
12026
         * sent back before version negotiation. */
12027
        else if (!(ssl->options.side == WOLFSSL_CLIENT_END &&
12028
                            ssl->options.connectState == CLIENT_HELLO_SENT &&
12029
                            rh->type == alert &&
12030
                            rh->pvMajor == ssl->version.major &&
12031
        #ifdef WOLFSSL_DTLS
12032
                            ((ssl->options.dtls && rh->pvMinor == DTLS_MINOR) ||
12033
                             (!ssl->options.dtls &&
12034
                              rh->pvMinor < ssl->version.minor))
12035
        #else
12036
                            (rh->pvMinor < ssl->version.minor)
12037
        #endif
12038
                   )) {
12039
            WOLFSSL_MSG("SSL version error");
12040
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
12041
            return VERSION_ERROR;              /* only use requested version */
12042
        }
12043
    }
12044
12045
    /* record layer length check */
12046
#ifdef HAVE_MAX_FRAGMENT
12047
    if (*size > (ssl->max_fragment + MAX_COMP_EXTRA + MAX_MSG_EXTRA)) {
12048
        WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
12049
        return LENGTH_ERROR;
12050
    }
12051
#else
12052
    if (*size > (MAX_RECORD_SIZE + MAX_COMP_EXTRA + MAX_MSG_EXTRA)) {
12053
        WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
12054
        return LENGTH_ERROR;
12055
    }
12056
#endif
12057
12058
    if (*size == 0 && rh->type != application_data) {
12059
        WOLFSSL_MSG("0 length, non-app data record.");
12060
        WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
12061
        return LENGTH_ERROR;
12062
    }
12063
12064
    /* verify record type here as well */
12065
    switch (rh->type) {
12066
        case handshake:
12067
        case change_cipher_spec:
12068
        case application_data:
12069
        case alert:
12070
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
12071
        case dtls12_cid:
12072
#endif
12073
#ifdef WOLFSSL_DTLS13
12074
        case ack:
12075
#endif /* WOLFSSL_DTLS13 */
12076
            break;
12077
        case no_type:
12078
        default:
12079
#ifdef OPENSSL_ALL
12080
            if (!ssl->options.dtls) {
12081
                char *method = (char*)ssl->buffers.inputBuffer.buffer + start;
12082
                /* Attempt to identify if this is a plain HTTP request.
12083
                 * No size checks because this function assumes at least
12084
                 * RECORD_HEADER_SZ size of data has been read which is
12085
                 * also the longest string comparison in this if. */
12086
                if (XSTRNCMP(method, "GET ", XSTR_SIZEOF("GET ")) == 0 ||
12087
                    XSTRNCMP(method, "POST ", XSTR_SIZEOF("POST ")) == 0 ||
12088
                    XSTRNCMP(method, "HEAD ", XSTR_SIZEOF("HEAD ")) == 0 ||
12089
                    XSTRNCMP(method, "PUT ", XSTR_SIZEOF("PUT ")) == 0) {
12090
                    WOLFSSL_MSG("Plain HTTP request detected");
12091
                    return SSL_R_HTTP_REQUEST;
12092
                }
12093
            }
12094
#endif
12095
            WOLFSSL_MSG("Unknown Record Type");
12096
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
12097
            return UNKNOWN_RECORD_TYPE;
12098
    }
12099
12100
    /* haven't decrypted this record yet */
12101
    ssl->keys.decryptedCur = 0;
12102
12103
    return 0;
12104
}
12105
12106
#ifdef WOLFSSL_DTLS
12107
int GetDtlsHandShakeHeader(WOLFSSL* ssl, const byte* input,
12108
                           word32* inOutIdx, byte *type, word32 *size,
12109
                           word32 *fragOffset, word32 *fragSz,
12110
                           word32 totalSz)
12111
{
12112
    word32 idx = *inOutIdx;
12113
12114
    *inOutIdx += DTLS_HANDSHAKE_HEADER_SZ;
12115
    if (*inOutIdx > totalSz) {
12116
        WOLFSSL_ERROR(BUFFER_E);
12117
        return BUFFER_E;
12118
    }
12119
12120
    *type = input[idx++];
12121
    c24to32(input + idx, size);
12122
    idx += OPAQUE24_LEN;
12123
12124
    ato16(input + idx, &ssl->keys.dtls_peer_handshake_number);
12125
    idx += DTLS_HANDSHAKE_SEQ_SZ;
12126
12127
    c24to32(input + idx, fragOffset);
12128
    idx += DTLS_HANDSHAKE_FRAG_SZ;
12129
    c24to32(input + idx, fragSz);
12130
12131
    if ((ssl->curRL.pvMajor != ssl->version.major) ||
12132
        (!IsAtLeastTLSv1_3(ssl->version) && ssl->curRL.pvMinor != ssl->version.minor) ||
12133
        (IsAtLeastTLSv1_3(ssl->version) && ssl->curRL.pvMinor != DTLSv1_2_MINOR)
12134
        ) {
12135
        if (*type != client_hello && *type != hello_verify_request && *type != server_hello) {
12136
            WOLFSSL_ERROR(VERSION_ERROR);
12137
            return VERSION_ERROR;
12138
        }
12139
        else {
12140
            WOLFSSL_MSG("DTLS Handshake ignoring hello or verify version");
12141
        }
12142
    }
12143
    return 0;
12144
}
12145
#endif
12146
12147
12148
#if !defined(NO_OLD_TLS) || \
12149
    (defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLS_SHA1))
12150
/* fill with MD5 pad size since biggest required */
12151
static const byte PAD1[PAD_MD5] =
12152
                              { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
12153
                                0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
12154
                                0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
12155
                                0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
12156
                                0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
12157
                                0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36
12158
                              };
12159
static const byte PAD2[PAD_MD5] =
12160
                              { 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
12161
                                0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
12162
                                0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
12163
                                0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
12164
                                0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
12165
                                0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c
12166
                              };
12167
#endif /* !NO_OLD_TLS || (NO_OLD_TLS && WOLFSSL_ALLOW_TLS_SHA1) */
12168
12169
#ifndef NO_OLD_TLS
12170
12171
/* calculate MD5 hash for finished */
12172
#ifdef WOLFSSL_TI_HASH
12173
#include <wolfssl/wolfcrypt/hash.h>
12174
#endif
12175
12176
static int BuildMD5(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
12177
{
12178
    int ret;
12179
    byte md5_result[WC_MD5_DIGEST_SIZE];
12180
#ifdef WOLFSSL_SMALL_STACK
12181
    wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
12182
    if (md5 == NULL)
12183
        return MEMORY_E;
12184
#else
12185
    wc_Md5  md5[1];
12186
#endif
12187
12188
    /* make md5 inner */
12189
    ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5);
12190
    if (ret == 0)
12191
        ret = wc_Md5Update(md5, sender, SIZEOF_SENDER);
12192
    if (ret == 0)
12193
        ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN);
12194
    if (ret == 0)
12195
        ret = wc_Md5Update(md5, PAD1, PAD_MD5);
12196
    if (ret == 0)
12197
        ret = wc_Md5Final(md5, md5_result);
12198
12199
    /* make md5 outer */
12200
    if (ret == 0) {
12201
        ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
12202
        if (ret == 0) {
12203
            ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN);
12204
            if (ret == 0)
12205
                ret = wc_Md5Update(md5, PAD2, PAD_MD5);
12206
            if (ret == 0)
12207
                ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
12208
            if (ret == 0)
12209
                ret = wc_Md5Final(md5, hashes->md5);
12210
            wc_Md5Free(md5);
12211
        }
12212
    }
12213
12214
#ifdef WOLFSSL_SMALL_STACK
12215
    XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
12216
#endif
12217
12218
    return ret;
12219
}
12220
12221
12222
/* calculate SHA hash for finished */
12223
static int BuildSHA(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
12224
{
12225
    int ret;
12226
    byte sha_result[WC_SHA_DIGEST_SIZE];
12227
#ifdef WOLFSSL_SMALL_STACK
12228
    wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
12229
    if (sha == NULL)
12230
        return MEMORY_E;
12231
#else
12232
    wc_Sha  sha[1];
12233
#endif
12234
    /* make sha inner */
12235
    ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
12236
    if (ret == 0)
12237
        ret = wc_ShaUpdate(sha, sender, SIZEOF_SENDER);
12238
    if (ret == 0)
12239
        ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret, SECRET_LEN);
12240
    if (ret == 0)
12241
        ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
12242
    if (ret == 0)
12243
        ret = wc_ShaFinal(sha, sha_result);
12244
12245
    /* make sha outer */
12246
    if (ret == 0) {
12247
        ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
12248
        if (ret == 0) {
12249
            ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret, SECRET_LEN);
12250
            if (ret == 0)
12251
                ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
12252
            if (ret == 0)
12253
                ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
12254
            if (ret == 0)
12255
                ret = wc_ShaFinal(sha, hashes->sha);
12256
            wc_ShaFree(sha);
12257
        }
12258
    }
12259
12260
#ifdef WOLFSSL_SMALL_STACK
12261
    XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
12262
#endif
12263
12264
    return ret;
12265
}
12266
#endif
12267
12268
#ifndef WOLFSSL_NO_TLS12
12269
12270
/* Finished doesn't support SHA512, not SHA512 cipher suites yet */
12271
static int BuildFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
12272
{
12273
    int ret = 0;
12274
12275
    if (ssl == NULL)
12276
        return BAD_FUNC_ARG;
12277
12278
    if (ssl->options.tls) {
12279
        ret = BuildTlsFinished(ssl, hashes, sender);
12280
    }
12281
#ifndef NO_OLD_TLS
12282
    if (!ssl->options.tls) {
12283
        ret = BuildMD5(ssl, hashes, sender);
12284
        if (ret == 0) {
12285
            ret = BuildSHA(ssl, hashes, sender);
12286
        }
12287
    }
12288
#endif
12289
12290
    return ret;
12291
}
12292
12293
#endif /* WOLFSSL_NO_TLS12 */
12294
12295
#if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
12296
12297
/* Does this cipher suite (first, second) have the requirement
12298
   an ephemeral key exchange will still require the key for signing
12299
   the key exchange so ECDHE_RSA requires an rsa key thus rsa_kea */
12300
int CipherRequires(byte first, byte second, int requirement)
12301
{
12302
12303
    (void)requirement;
12304
    (void)first;
12305
    (void)second;
12306
12307
#ifndef WOLFSSL_NO_TLS12
12308
12309
#ifdef HAVE_CHACHA
12310
    if (first == CHACHA_BYTE) {
12311
12312
        switch (second) {
12313
            case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
12314
                if (requirement == REQUIRES_RSA)
12315
                    return 1;
12316
                break;
12317
12318
            case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
12319
                if (requirement == REQUIRES_ECC)
12320
                    return 1;
12321
                break;
12322
12323
            case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
12324
                if (requirement == REQUIRES_RSA)
12325
                    return 1;
12326
                if (requirement == REQUIRES_DHE)
12327
                    return 1;
12328
                break;
12329
12330
            case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
12331
                if (requirement == REQUIRES_RSA)
12332
                    return 1;
12333
                break;
12334
12335
            case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
12336
                if (requirement == REQUIRES_ECC)
12337
                    return 1;
12338
                break;
12339
12340
            case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
12341
                if (requirement == REQUIRES_RSA)
12342
                    return 1;
12343
                if (requirement == REQUIRES_DHE)
12344
                    return 1;
12345
                break;
12346
12347
12348
            case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
12349
                if (requirement == REQUIRES_PSK)
12350
                    return 1;
12351
                break;
12352
12353
            case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 :
12354
                if (requirement == REQUIRES_PSK)
12355
                    return 1;
12356
                break;
12357
12358
            case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
12359
                if (requirement == REQUIRES_PSK)
12360
                    return 1;
12361
                if (requirement == REQUIRES_DHE)
12362
                    return 1;
12363
                break;
12364
12365
            default:
12366
                WOLFSSL_MSG("Unsupported cipher suite, CipherRequires CHACHA");
12367
                return 0;
12368
        }
12369
12370
        if (requirement == REQUIRES_AEAD)
12371
            return 1;
12372
    }
12373
#endif /* HAVE_CHACHA */
12374
12375
    /* ECC extensions */
12376
    if (first == ECC_BYTE) {
12377
12378
        switch (second) {
12379
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
12380
    #ifndef NO_RSA
12381
            case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA :
12382
                if (requirement == REQUIRES_RSA)
12383
                    return 1;
12384
                break;
12385
12386
            case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA :
12387
                if (requirement == REQUIRES_ECC_STATIC)
12388
                    return 1;
12389
                if (requirement == REQUIRES_RSA_SIG)
12390
                    return 1;
12391
                break;
12392
12393
        #ifndef NO_DES3
12394
            case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA :
12395
                if (requirement == REQUIRES_RSA)
12396
                    return 1;
12397
                break;
12398
12399
            case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA :
12400
                if (requirement == REQUIRES_ECC_STATIC)
12401
                    return 1;
12402
                if (requirement == REQUIRES_RSA_SIG)
12403
                    return 1;
12404
                break;
12405
        #endif /* !NO_DES3 */
12406
12407
        #ifndef NO_RC4
12408
            case TLS_ECDHE_RSA_WITH_RC4_128_SHA :
12409
                if (requirement == REQUIRES_RSA)
12410
                    return 1;
12411
                break;
12412
12413
            case TLS_ECDH_RSA_WITH_RC4_128_SHA :
12414
                if (requirement == REQUIRES_ECC_STATIC)
12415
                    return 1;
12416
                if (requirement == REQUIRES_RSA_SIG)
12417
                    return 1;
12418
                break;
12419
        #endif /* !NO_RC4 */
12420
    #endif /* NO_RSA */
12421
12422
        #ifndef NO_DES3
12423
            case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA :
12424
                if (requirement == REQUIRES_ECC)
12425
                    return 1;
12426
                break;
12427
12428
            case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA :
12429
                if (requirement == REQUIRES_ECC_STATIC)
12430
                    return 1;
12431
                break;
12432
        #endif /* !NO_DES3  */
12433
        #ifndef NO_RC4
12434
            case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA :
12435
                if (requirement == REQUIRES_ECC)
12436
                    return 1;
12437
                break;
12438
12439
            case TLS_ECDH_ECDSA_WITH_RC4_128_SHA :
12440
                if (requirement == REQUIRES_ECC_STATIC)
12441
                    return 1;
12442
                break;
12443
        #endif /* !NO_RC4 */
12444
        #ifndef NO_RSA
12445
            case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA :
12446
                if (requirement == REQUIRES_RSA)
12447
                    return 1;
12448
                break;
12449
12450
            case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA :
12451
                if (requirement == REQUIRES_ECC_STATIC)
12452
                    return 1;
12453
                if (requirement == REQUIRES_RSA_SIG)
12454
                    return 1;
12455
                break;
12456
        #endif /* !NO_RSA */
12457
12458
            case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA :
12459
                if (requirement == REQUIRES_ECC)
12460
                    return 1;
12461
                break;
12462
12463
            case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA :
12464
                if (requirement == REQUIRES_ECC_STATIC)
12465
                    return 1;
12466
                break;
12467
12468
            case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA :
12469
                if (requirement == REQUIRES_ECC)
12470
                    return 1;
12471
                break;
12472
12473
            case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA :
12474
                if (requirement == REQUIRES_ECC_STATIC)
12475
                    return 1;
12476
                break;
12477
12478
            case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 :
12479
                if (requirement == REQUIRES_ECC)
12480
                    return 1;
12481
                if (requirement == REQUIRES_AEAD)
12482
                    return 1;
12483
                break;
12484
12485
            case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 :
12486
                if (requirement == REQUIRES_ECC)
12487
                    return 1;
12488
                if (requirement == REQUIRES_AEAD)
12489
                    return 1;
12490
                break;
12491
12492
            case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 :
12493
                if (requirement == REQUIRES_ECC_STATIC)
12494
                    return 1;
12495
                if (requirement == REQUIRES_AEAD)
12496
                    return 1;
12497
                break;
12498
12499
            case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 :
12500
                if (requirement == REQUIRES_ECC_STATIC)
12501
                    return 1;
12502
                if (requirement == REQUIRES_AEAD)
12503
                    return 1;
12504
                break;
12505
#endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
12506
12507
#ifndef NO_RSA
12508
    #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
12509
            case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 :
12510
                if (requirement == REQUIRES_RSA)
12511
                    return 1;
12512
                if (requirement == REQUIRES_AEAD)
12513
                    return 1;
12514
                break;
12515
12516
            case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 :
12517
                if (requirement == REQUIRES_RSA)
12518
                    return 1;
12519
                if (requirement == REQUIRES_AEAD)
12520
                    return 1;
12521
                break;
12522
12523
            case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 :
12524
                if (requirement == REQUIRES_ECC_STATIC)
12525
                    return 1;
12526
                if (requirement == REQUIRES_RSA_SIG)
12527
                    return 1;
12528
                if (requirement == REQUIRES_AEAD)
12529
                    return 1;
12530
                break;
12531
12532
            case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 :
12533
                if (requirement == REQUIRES_ECC_STATIC)
12534
                    return 1;
12535
                if (requirement == REQUIRES_RSA_SIG)
12536
                    return 1;
12537
                if (requirement == REQUIRES_AEAD)
12538
                    return 1;
12539
                break;
12540
    #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
12541
    #ifdef HAVE_AESCCM
12542
            case TLS_RSA_WITH_AES_128_CCM_8 :
12543
            case TLS_RSA_WITH_AES_256_CCM_8 :
12544
                if (requirement == REQUIRES_RSA)
12545
                    return 1;
12546
                if (requirement == REQUIRES_RSA_SIG)
12547
                    return 1;
12548
                if (requirement == REQUIRES_AEAD)
12549
                    return 1;
12550
                break;
12551
    #endif /* HAVE_AESCCM */
12552
    #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
12553
12554
            case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 :
12555
            case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 :
12556
                if (requirement == REQUIRES_RSA)
12557
                    return 1;
12558
                break;
12559
12560
            case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 :
12561
            case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 :
12562
                if (requirement == REQUIRES_RSA_SIG)
12563
                    return 1;
12564
                if (requirement == REQUIRES_ECC_STATIC)
12565
                    return 1;
12566
                break;
12567
    #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
12568
#endif /* !NO_RSA */
12569
12570
#ifdef HAVE_ARIA
12571
        case TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 :
12572
        case TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 :
12573
            if (requirement == REQUIRES_ECC)
12574
                return 1;
12575
            break;
12576
#endif /* HAVE_ARIA */
12577
12578
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
12579
        case TLS_ECDHE_ECDSA_WITH_AES_128_CCM :
12580
        case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 :
12581
        case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 :
12582
            if (requirement == REQUIRES_ECC)
12583
                return 1;
12584
            if (requirement == REQUIRES_AEAD)
12585
                return 1;
12586
            break;
12587
12588
            case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 :
12589
            case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 :
12590
                if (requirement == REQUIRES_ECC)
12591
                    return 1;
12592
                break;
12593
12594
            case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 :
12595
            case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 :
12596
                if (requirement == REQUIRES_ECC)
12597
                    return 1;
12598
                if (requirement == REQUIRES_ECC_STATIC)
12599
                    return 1;
12600
                break;
12601
    #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
12602
12603
    #ifndef NO_PSK
12604
            case TLS_PSK_WITH_AES_128_CCM:
12605
            case TLS_PSK_WITH_AES_256_CCM:
12606
            case TLS_PSK_WITH_AES_128_CCM_8:
12607
            case TLS_PSK_WITH_AES_256_CCM_8:
12608
                if (requirement == REQUIRES_PSK)
12609
                    return 1;
12610
                if (requirement == REQUIRES_AEAD)
12611
                    return 1;
12612
                break;
12613
12614
            case TLS_DHE_PSK_WITH_AES_128_CCM:
12615
            case TLS_DHE_PSK_WITH_AES_256_CCM:
12616
                if (requirement == REQUIRES_PSK)
12617
                    return 1;
12618
                if (requirement == REQUIRES_DHE)
12619
                    return 1;
12620
                if (requirement == REQUIRES_AEAD)
12621
                    return 1;
12622
                break;
12623
    #endif /* !NO_PSK */
12624
    #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
12625
            case TLS_ECDHE_ECDSA_WITH_NULL_SHA :
12626
                if (requirement == REQUIRES_ECC)
12627
                    return 1;
12628
                break;
12629
12630
            case TLS_ECDHE_PSK_WITH_NULL_SHA256 :
12631
                if (requirement == REQUIRES_PSK)
12632
                    return 1;
12633
                break;
12634
12635
            case TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 :
12636
                if (requirement == REQUIRES_PSK)
12637
                    return 1;
12638
                break;
12639
    #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
12640
12641
    #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
12642
            case TLS_SHA256_SHA256:
12643
                break;
12644
            case TLS_SHA384_SHA384:
12645
                break;
12646
    #endif
12647
12648
            default:
12649
                WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC");
12650
                return 0;
12651
        }   /* switch */
12652
    }   /* if */
12653
12654
    /* ECC extensions */
12655
    if (first == ECDHE_PSK_BYTE) {
12656
12657
        switch (second) {
12658
    #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
12659
            case TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256 :
12660
                if (requirement == REQUIRES_PSK)
12661
                    return 1;
12662
                break;
12663
    #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
12664
            default:
12665
                WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC PSK");
12666
                return 0;
12667
        }   /* switch */
12668
    }   /* if     */
12669
#endif /* !WOLFSSL_NO_TLS12 */
12670
12671
#ifdef WOLFSSL_TLS13
12672
    /* Distinct TLS v1.3 cipher suites with cipher and digest only. */
12673
    if (first == TLS13_BYTE) {
12674
12675
        switch (second) {
12676
            case TLS_AES_128_GCM_SHA256:
12677
            case TLS_AES_256_GCM_SHA384:
12678
            case TLS_CHACHA20_POLY1305_SHA256:
12679
            case TLS_AES_128_CCM_SHA256:
12680
            case TLS_AES_128_CCM_8_SHA256:
12681
                if (requirement == REQUIRES_AEAD)
12682
                    return 1;
12683
                return 0;
12684
12685
            default:
12686
                WOLFSSL_MSG("Unsupported cipher suite, CipherRequires "
12687
                            "TLS v1.3");
12688
                return 0;
12689
        }
12690
    }
12691
12692
#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && defined(WOLFSSL_SM4)
12693
    if (first == CIPHER_BYTE) {
12694
        /* Other cipher suites for TLS 1.2 below.  */
12695
        switch (second) {
12696
        #if defined(WOLFSSL_SM4_GCM)
12697
            case TLS_SM4_GCM_SM3:
12698
                return 0;
12699
                break;
12700
        #endif
12701
        #if defined(WOLFSSL_SM4_CCM)
12702
            case TLS_SM4_CCM_SM3:
12703
                return 0;
12704
                break;
12705
        #endif
12706
        }
12707
    }
12708
#endif /* WOLFSSL_SM2 && WOLFSSL_SM3 && WOLFSSL_SM4 */
12709
#endif /* WOLFSSL_TLS13 */
12710
12711
#ifndef WOLFSSL_NO_TLS12
12712
12713
#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && defined(WOLFSSL_SM4)
12714
    if (first == SM_BYTE) {
12715
        switch (second) {
12716
        #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
12717
            case TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3:
12718
                if (requirement == REQUIRES_ECC)
12719
                    return 1;
12720
                break;
12721
        #endif
12722
        #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
12723
            case TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3:
12724
                if (requirement == REQUIRES_ECC)
12725
                    return 1;
12726
                break;
12727
        #endif
12728
        #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
12729
            case TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3:
12730
                if (requirement == REQUIRES_ECC)
12731
                    return 1;
12732
                break;
12733
        #endif
12734
12735
            default:
12736
                WOLFSSL_MSG("Unsupported cipher suite, CipherRequires SM");
12737
                return 0;
12738
        }
12739
    }
12740
#endif
12741
12742
    if (first == CIPHER_BYTE) {
12743
        /* normal suites */
12744
        switch (second) {
12745
12746
    #ifndef NO_RSA
12747
        #ifndef NO_RC4
12748
            case SSL_RSA_WITH_RC4_128_SHA :
12749
                if (requirement == REQUIRES_RSA)
12750
                    return 1;
12751
                break;
12752
12753
            case SSL_RSA_WITH_RC4_128_MD5 :
12754
                if (requirement == REQUIRES_RSA)
12755
                    return 1;
12756
                break;
12757
        #endif /* NO_RC4 */
12758
12759
            case SSL_RSA_WITH_3DES_EDE_CBC_SHA :
12760
                if (requirement == REQUIRES_RSA)
12761
                    return 1;
12762
                break;
12763
12764
            case TLS_RSA_WITH_AES_128_CBC_SHA :
12765
                if (requirement == REQUIRES_RSA)
12766
                    return 1;
12767
                break;
12768
12769
            case TLS_RSA_WITH_AES_128_CBC_SHA256 :
12770
                if (requirement == REQUIRES_RSA)
12771
                    return 1;
12772
                break;
12773
12774
            case TLS_RSA_WITH_AES_256_CBC_SHA :
12775
                if (requirement == REQUIRES_RSA)
12776
                    return 1;
12777
                break;
12778
12779
            case TLS_RSA_WITH_AES_256_CBC_SHA256 :
12780
                if (requirement == REQUIRES_RSA)
12781
                    return 1;
12782
                break;
12783
12784
            case TLS_RSA_WITH_NULL_MD5 :
12785
            case TLS_RSA_WITH_NULL_SHA :
12786
            case TLS_RSA_WITH_NULL_SHA256 :
12787
                if (requirement == REQUIRES_RSA)
12788
                    return 1;
12789
                break;
12790
12791
    #endif /* !NO_RSA */
12792
12793
    #ifndef NO_PSK
12794
            case TLS_PSK_WITH_AES_128_GCM_SHA256 :
12795
                if (requirement == REQUIRES_PSK)
12796
                    return 1;
12797
                if (requirement == REQUIRES_AEAD)
12798
                    return 1;
12799
                break;
12800
12801
            case TLS_PSK_WITH_AES_256_GCM_SHA384 :
12802
                if (requirement == REQUIRES_PSK)
12803
                    return 1;
12804
                if (requirement == REQUIRES_AEAD)
12805
                    return 1;
12806
                break;
12807
12808
            case TLS_PSK_WITH_AES_128_CBC_SHA256 :
12809
            case TLS_PSK_WITH_AES_256_CBC_SHA384 :
12810
            case TLS_PSK_WITH_AES_128_CBC_SHA :
12811
            case TLS_PSK_WITH_AES_256_CBC_SHA :
12812
            case TLS_PSK_WITH_NULL_SHA384 :
12813
            case TLS_PSK_WITH_NULL_SHA256 :
12814
            case TLS_PSK_WITH_NULL_SHA :
12815
                if (requirement == REQUIRES_PSK)
12816
                    return 1;
12817
                break;
12818
12819
            case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 :
12820
            case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 :
12821
                if (requirement == REQUIRES_DHE)
12822
                    return 1;
12823
                if (requirement == REQUIRES_PSK)
12824
                    return 1;
12825
                if (requirement == REQUIRES_AEAD)
12826
                    return 1;
12827
                break;
12828
12829
            case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 :
12830
            case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 :
12831
            case TLS_DHE_PSK_WITH_NULL_SHA384 :
12832
            case TLS_DHE_PSK_WITH_NULL_SHA256 :
12833
                if (requirement == REQUIRES_DHE)
12834
                    return 1;
12835
                if (requirement == REQUIRES_PSK)
12836
                    return 1;
12837
                break;
12838
    #endif /* NO_PSK */
12839
12840
    #ifndef NO_RSA
12841
            case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 :
12842
                if (requirement == REQUIRES_RSA)
12843
                    return 1;
12844
                if (requirement == REQUIRES_DHE)
12845
                    return 1;
12846
                break;
12847
12848
            case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 :
12849
                if (requirement == REQUIRES_RSA)
12850
                    return 1;
12851
                if (requirement == REQUIRES_DHE)
12852
                    return 1;
12853
                break;
12854
12855
            case TLS_DHE_RSA_WITH_AES_128_CBC_SHA :
12856
                if (requirement == REQUIRES_RSA)
12857
                    return 1;
12858
                if (requirement == REQUIRES_DHE)
12859
                    return 1;
12860
                break;
12861
12862
            case TLS_DHE_RSA_WITH_AES_256_CBC_SHA :
12863
                if (requirement == REQUIRES_RSA)
12864
                    return 1;
12865
                if (requirement == REQUIRES_DHE)
12866
                    return 1;
12867
                break;
12868
12869
            case TLS_RSA_WITH_AES_128_GCM_SHA256 :
12870
            case TLS_RSA_WITH_AES_256_GCM_SHA384 :
12871
                if (requirement == REQUIRES_RSA)
12872
                    return 1;
12873
                if (requirement == REQUIRES_AEAD)
12874
                    return 1;
12875
                break;
12876
12877
            case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 :
12878
            case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 :
12879
                if (requirement == REQUIRES_RSA)
12880
                    return 1;
12881
                if (requirement == REQUIRES_DHE)
12882
                    return 1;
12883
                if (requirement == REQUIRES_AEAD)
12884
                    return 1;
12885
                break;
12886
12887
        #ifdef HAVE_CAMELLIA
12888
            case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA :
12889
            case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA :
12890
            case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
12891
            case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
12892
                if (requirement == REQUIRES_RSA)
12893
                    return 1;
12894
                break;
12895
12896
            case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA :
12897
            case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA :
12898
            case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
12899
            case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
12900
                if (requirement == REQUIRES_RSA)
12901
                    return 1;
12902
                if (requirement == REQUIRES_RSA_SIG)
12903
                    return 1;
12904
                if (requirement == REQUIRES_DHE)
12905
                    return 1;
12906
                break;
12907
        #endif /* HAVE_CAMELLIA */
12908
12909
            case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
12910
                if (requirement == REQUIRES_RSA)
12911
                    return 1;
12912
                if (requirement == REQUIRES_RSA_SIG)
12913
                    return 1;
12914
                if (requirement == REQUIRES_DHE)
12915
                    return 1;
12916
                break;
12917
    #endif /* !NO_RSA */
12918
    #ifdef HAVE_ANON
12919
            case TLS_DH_anon_WITH_AES_128_CBC_SHA :
12920
                if (requirement == REQUIRES_DHE)
12921
                    return 1;
12922
                break;
12923
            case TLS_DH_anon_WITH_AES_256_GCM_SHA384:
12924
                if (requirement == REQUIRES_DHE)
12925
                    return 1;
12926
                if (requirement == REQUIRES_AEAD)
12927
                    return 1;
12928
                break;
12929
    #endif
12930
    #ifdef WOLFSSL_MULTICAST
12931
            case WDM_WITH_NULL_SHA256 :
12932
                break;
12933
    #endif
12934
12935
            default:
12936
                WOLFSSL_MSG("Unsupported cipher suite, CipherRequires");
12937
                return 0;
12938
        }  /* switch */
12939
    }  /* if ECC / Normal suites else */
12940
12941
#endif /* !WOLFSSL_NO_TLS12 */
12942
12943
    return 0;
12944
}
12945
12946
#endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
12947
#endif /* !NO_TLS */
12948
12949
#ifndef NO_CERTS
12950
#if defined(WOLFSSL_IP_ALT_NAME) && !defined(WOLFSSL_USER_IO)
12951
static int MatchIPv6(const char* pattern, int patternLen,
12952
                     const char* str, word32 strLen)
12953
{
12954
    WOLFSSL_SOCKADDR_IN6 addr1, addr2;
12955
    char patBuf[WOLFSSL_MAX_IPSTR];
12956
    char strBuf[WOLFSSL_MAX_IPSTR];
12957
12958
    if ((word32)patternLen >= sizeof(patBuf) || strLen >= sizeof(strBuf))
12959
        return 0;
12960
12961
    /* Make sure strings are null-terminated and safely copied */
12962
    XMEMCPY(patBuf, pattern, patternLen);
12963
    patBuf[patternLen] = '\0';
12964
    XMEMCPY(strBuf, str, strLen);
12965
    strBuf[strLen] = '\0';
12966
12967
    XMEMSET(&addr1, 0, sizeof(addr1));
12968
    XMEMSET(&addr2, 0, sizeof(addr2));
12969
12970
    /* Try parsing both as IPv6 */
12971
    if (XINET_PTON(WOLFSSL_IP6, patBuf, &addr1) != 1)
12972
        return 0;
12973
    if (XINET_PTON(WOLFSSL_IP6, strBuf, &addr2) != 1)
12974
        return 0;
12975
12976
    /* Compare raw address bytes */
12977
    return XMEMCMP(&addr1, &addr2, sizeof(WOLFSSL_SOCKADDR_IN6)) == 0;
12978
}
12979
#endif /* WOLFSSL_IP_ALT_NAME && !WOLFSSL_USER_IO */
12980
12981
/* Match names with wildcards, each wildcard can represent a single name
12982
   component or fragment but not multiple names, i.e.,
12983
   *.z.com matches y.z.com but not x.y.z.com
12984
12985
   If flags contains WOLFSSL_LEFT_MOST_WILDCARD_ONLY, wildcard only applies
12986
   to left-most name component, compatible with RFC 2830 identity checking.
12987
12988
   return 1 on success */
12989
int MatchDomainName(const char* pattern, int patternLen, const char* str,
12990
                    word32 strLen, unsigned int flags)
12991
0
{
12992
0
    int ret = 0;
12993
0
    byte wildcardEligible = 1;
12994
0
    byte leftWildcardOnly = flags & WOLFSSL_LEFT_MOST_WILDCARD_ONLY;
12995
12996
0
    if (pattern == NULL || str == NULL || patternLen <= 0 || strLen == 0)
12997
0
        return 0;
12998
12999
#if defined(WOLFSSL_IP_ALT_NAME) && !defined(WOLFSSL_USER_IO)
13000
    /* First try to match IPv6 addresses */
13001
    if (MatchIPv6(pattern, patternLen, str, strLen))
13002
        return 1;
13003
#endif
13004
13005
0
    while (patternLen > 0) {
13006
        /* Get the next pattern char to evaluate */
13007
0
        char p = (char)XTOLOWER((unsigned char)*pattern);
13008
0
        if (p == '\0')
13009
0
            break;
13010
13011
0
        pattern++;
13012
13013
0
        if ((p == '*') && wildcardEligible) {
13014
0
            char s;
13015
            /* We will always match '*' */
13016
0
            patternLen--;
13017
13018
            /* Only single wildcard allowed with strict left only */
13019
0
            if (leftWildcardOnly) {
13020
0
                wildcardEligible = 0;
13021
0
            }
13022
13023
            /* Consume any extra '*' chars until the next non '*' char. */
13024
0
            while (patternLen > 0) {
13025
0
                p = (char)XTOLOWER((unsigned char)*pattern);
13026
0
                pattern++;
13027
0
                if (p == '\0' && patternLen > 0)
13028
0
                    return 0;
13029
0
                if (p != '*')
13030
0
                    break;
13031
0
                if (leftWildcardOnly && (p == '*')) {
13032
                    /* RFC2830 only allows single left-most wildcard */
13033
0
                    return 0;
13034
0
                }
13035
13036
0
                patternLen--;
13037
0
            }
13038
13039
            /* Consume str until we reach next char in pattern after '*' or
13040
             * end of string */
13041
0
            while (strLen > 0) {
13042
0
                s = (char)XTOLOWER((unsigned char) *str);
13043
0
                str++;
13044
0
                strLen--;
13045
13046
                /* p is next char in pattern after '*', or '*' if '*' is the
13047
                 * last char in the pattern (in which case patternLen is 1) */
13048
0
                if ( ((s == p) && (patternLen > 0))) {
13049
                    /* We had already counted the '*' as matched, this means
13050
                     * we also matched the next non '*' char in pattern */
13051
0
                    patternLen--;
13052
0
                    break;
13053
0
                }
13054
13055
                /* If strlen is 0, we have consumed the entire string. Count that
13056
                 * as a match of '*' */
13057
0
                if (strLen == 0) {
13058
0
                    break;
13059
0
                }
13060
13061
0
                if (s == '.')
13062
0
                    return 0;
13063
0
            }
13064
0
        }
13065
0
        else {
13066
            /* Past left-most wildcard location, not eligible if flag set*/
13067
0
            if (leftWildcardOnly && wildcardEligible) {
13068
0
                wildcardEligible = 0;
13069
0
            }
13070
13071
            /* Simple case, pattern match exactly */
13072
0
            if (p != (char)XTOLOWER((unsigned char) *str))
13073
0
                return 0;
13074
13075
0
            str++;
13076
0
            strLen--;
13077
0
            patternLen--;
13078
0
        }
13079
0
    }
13080
13081
0
    if (strLen == 0 && patternLen == 0) {
13082
0
        ret = 1; /* success */
13083
0
    }
13084
13085
0
    return ret;
13086
0
}
13087
13088
13089
/* Check that alternative names, if they exists, match the domain.
13090
 * Fail if there are wild patterns and they didn't match.
13091
 * Check the common name if no alternative names matched.
13092
 *
13093
 * dCert     Decoded cert to get the alternative names from.
13094
 * domain    Domain name to compare against.
13095
 * domainLen Length of the domain name.
13096
 * checkCN   Whether to check the common name.
13097
 * returns   1 : match was found.
13098
 *           0 : no match found.
13099
 *          -1 : No matches and wild pattern match failed.
13100
 */
13101
int CheckForAltNames(DecodedCert* dCert, const char* domain, word32 domainLen,
13102
                     int* checkCN, unsigned int flags)
13103
0
{
13104
0
    int match = 0;
13105
0
    DNS_entry* altName = NULL;
13106
0
    char *buf;
13107
0
    word32 len;
13108
13109
0
    WOLFSSL_MSG("Checking AltNames");
13110
13111
0
    if (dCert)
13112
0
        altName = dCert->altNames;
13113
13114
0
    if (checkCN != NULL) {
13115
0
        *checkCN = (altName == NULL) ? 1 : 0;
13116
0
    }
13117
13118
0
    while (altName) {
13119
0
        WOLFSSL_MSG("\tindividual AltName check");
13120
13121
#ifdef WOLFSSL_IP_ALT_NAME
13122
        if (altName->type == ASN_IP_TYPE) {
13123
            buf = altName->ipString;
13124
            len = (word32)XSTRLEN(buf);
13125
        }
13126
        else
13127
#endif /* WOLFSSL_IP_ALT_NAME */
13128
0
        {
13129
0
            buf = altName->name;
13130
0
            len = (word32)altName->len;
13131
0
        }
13132
13133
0
        if (MatchDomainName(buf, (int)len, domain, domainLen, flags)) {
13134
0
            match = 1;
13135
0
            if (checkCN != NULL) {
13136
0
                *checkCN = 0;
13137
0
            }
13138
0
            WOLFSSL_MSG("\tmatch found");
13139
0
            break;
13140
0
        }
13141
        /* No matches and wild pattern match failed. */
13142
0
        else if (buf && (len >=1) && (buf[0] == '*')) {
13143
0
            match = -1;
13144
0
            WOLFSSL_MSG("\twildcard match failed");
13145
0
        }
13146
13147
0
        altName = altName->next;
13148
0
    }
13149
13150
0
    return match;
13151
0
}
13152
13153
13154
/* Check the domain name matches the subject alternative name or the subject
13155
 * name.
13156
 *
13157
 * dcert          Decoded certificate.
13158
 * domainName     The domain name.
13159
 * domainNameLen  The length of the domain name.
13160
 * returns DOMAIN_NAME_MISMATCH when no match found and 0 on success.
13161
 */
13162
int CheckHostName(DecodedCert* dCert, const char *domainName,
13163
                  size_t domainNameLen, unsigned int flags)
13164
0
{
13165
0
    int checkCN;
13166
0
    int ret = WC_NO_ERR_TRACE(DOMAIN_NAME_MISMATCH);
13167
13168
0
    if (CheckForAltNames(dCert, domainName, (word32)domainNameLen,
13169
0
                                            &checkCN, flags) != 1) {
13170
0
        ret = DOMAIN_NAME_MISMATCH;
13171
0
        WOLFSSL_MSG("DomainName match on alt names failed");
13172
0
    }
13173
0
    else {
13174
0
        ret = 0;
13175
0
    }
13176
13177
0
#ifndef WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY
13178
0
    if (checkCN == 1) {
13179
0
        if (MatchDomainName(dCert->subjectCN, dCert->subjectCNLen,
13180
0
                            domainName, (word32)domainNameLen, flags) == 1) {
13181
0
            ret = 0;
13182
0
        }
13183
0
        else {
13184
0
            ret = DOMAIN_NAME_MISMATCH;
13185
0
            WOLFSSL_MSG("DomainName match on common name failed");
13186
0
        }
13187
0
    }
13188
0
#endif /* !WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY */
13189
13190
0
    return ret;
13191
0
}
13192
13193
int CheckIPAddr(DecodedCert* dCert, const char* ipasc)
13194
0
{
13195
0
    WOLFSSL_MSG("Checking IPAddr");
13196
13197
0
    return CheckHostName(dCert, ipasc, (size_t)XSTRLEN(ipasc), 0);
13198
0
}
13199
13200
13201
#ifdef SESSION_CERTS
13202
static void AddSessionCertToChain(WOLFSSL_X509_CHAIN* chain,
13203
    byte* certBuf, word32 certSz)
13204
{
13205
   if (chain->count < MAX_CHAIN_DEPTH &&
13206
                               certSz < MAX_X509_SIZE) {
13207
        chain->certs[chain->count].length = (int)certSz;
13208
        XMEMCPY(chain->certs[chain->count].buffer, certBuf, certSz);
13209
        chain->count++;
13210
    }
13211
    else {
13212
        WOLFSSL_MSG("Couldn't store chain cert for session");
13213
    }
13214
}
13215
#endif
13216
13217
#if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \
13218
    defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
13219
    defined(WOLFSSL_ACERT)
13220
    static int CopyAltNames(DNS_entry** to, DNS_entry* from, int type, void* heap)
13221
{
13222
    /* Copy from to the beginning of to */
13223
    DNS_entry** prev_next = to;
13224
    DNS_entry* next;
13225
13226
    if (to == NULL) {
13227
        return BAD_FUNC_ARG;
13228
    }
13229
13230
    next = *to;
13231
13232
    for (; from != NULL; from = from->next) {
13233
        DNS_entry* dnsEntry;
13234
13235
        if (type != -1 && from->type != type)
13236
            continue;
13237
13238
        dnsEntry = AltNameDup(from, heap);
13239
        if (dnsEntry == NULL) {
13240
            WOLFSSL_MSG("\tOut of Memory");
13241
            return MEMORY_E;
13242
        }
13243
13244
        dnsEntry->next = next;
13245
        *prev_next = dnsEntry;
13246
        prev_next = &dnsEntry->next;
13247
    }
13248
13249
    return 0;
13250
}
13251
#endif /* KEEP_PEER_CERT || SESSION_CERTS ||
13252
        * OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL ||
13253
        * WOLFSSL_ACERT */
13254
13255
13256
#if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \
13257
    defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
13258
void CopyDecodedName(WOLFSSL_X509_NAME* name, DecodedCert* dCert, int nameType)
13259
{
13260
    if (name->dynamicName) {
13261
        XFREE(name->name, name->heap, DYNAMIC_TYPE_X509);
13262
        name->name = name->staticName;
13263
        name->dynamicName = 0;
13264
    }
13265
13266
    if (nameType == ASN_SUBJECT) {
13267
        XSTRNCPY(name->name, dCert->subject, ASN_NAME_MAX);
13268
        name->name[ASN_NAME_MAX - 1] = '\0';
13269
        name->sz = (int)XSTRLEN(name->name) + 1;
13270
#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
13271
        name->rawLen = min(dCert->subjectRawLen, ASN_NAME_MAX);
13272
        if (name->rawLen > 0)
13273
            XMEMCPY(name->raw, dCert->subjectRaw, name->rawLen);
13274
#endif
13275
    }
13276
    else {
13277
        XSTRNCPY(name->name, dCert->issuer, ASN_NAME_MAX);
13278
        name->name[ASN_NAME_MAX - 1] = '\0';
13279
        name->sz = (int)XSTRLEN(name->name) + 1;
13280
#if (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)) \
13281
    && (defined(HAVE_PKCS7) || defined(WOLFSSL_CERT_EXT))
13282
        name->rawLen = min(dCert->issuerRawLen, ASN_NAME_MAX);
13283
        if (name->rawLen > 0) {
13284
            XMEMCPY(name->raw, dCert->issuerRaw, name->rawLen);
13285
        }
13286
#endif
13287
    }
13288
}
13289
13290
#ifdef WOLFSSL_CERT_REQ
13291
static int CopyREQAttributes(WOLFSSL_X509* x509, DecodedCert* dCert)
13292
{
13293
    int ret = 0;
13294
13295
    if (dCert->cPwd) {
13296
        if (dCert->cPwdLen < CTC_NAME_SIZE) {
13297
            XMEMCPY(x509->challengePw, dCert->cPwd, dCert->cPwdLen);
13298
            x509->challengePw[dCert->cPwdLen] = '\0';
13299
        #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN)
13300
            if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
13301
                                        WC_NID_pkcs9_challengePassword,
13302
                                        MBSTRING_ASC,
13303
                                        (const byte*)dCert->cPwd,
13304
                                        dCert->cPwdLen) != WOLFSSL_SUCCESS) {
13305
                ret = REQ_ATTRIBUTE_E;
13306
                WOLFSSL_ERROR_VERBOSE(ret);
13307
            }
13308
        #endif
13309
        }
13310
        else {
13311
            WOLFSSL_MSG("Challenge password too long");
13312
            ret = MEMORY_E;
13313
        }
13314
    }
13315
13316
    if (dCert->contentType) {
13317
        if (dCert->contentTypeLen < CTC_NAME_SIZE) {
13318
            XMEMCPY(x509->contentType, dCert->contentType, dCert->contentTypeLen);
13319
            x509->contentType[dCert->contentTypeLen] = '\0';
13320
        }
13321
    #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN)
13322
        if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
13323
                                        WC_NID_pkcs9_contentType,
13324
                                        MBSTRING_ASC,
13325
                                        (const byte*)dCert->contentType,
13326
                                        dCert->contentTypeLen) !=
13327
                WOLFSSL_SUCCESS) {
13328
            ret = REQ_ATTRIBUTE_E;
13329
            WOLFSSL_ERROR_VERBOSE(ret);
13330
        }
13331
    #endif
13332
    }
13333
13334
    #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN)
13335
    if (dCert->sNum) {
13336
        if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
13337
                                        WC_NID_serialNumber,
13338
                                        MBSTRING_ASC,
13339
                                        (const byte*)dCert->sNum,
13340
                                        dCert->sNumLen) != WOLFSSL_SUCCESS) {
13341
            ret = REQ_ATTRIBUTE_E;
13342
            WOLFSSL_ERROR_VERBOSE(ret);
13343
        }
13344
    }
13345
    if (dCert->unstructuredName) {
13346
        if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
13347
                                        WC_NID_pkcs9_unstructuredName,
13348
                                        MBSTRING_ASC,
13349
                                        (const byte*)dCert->unstructuredName,
13350
                                        dCert->unstructuredNameLen)
13351
                != WOLFSSL_SUCCESS) {
13352
            ret = REQ_ATTRIBUTE_E;
13353
            WOLFSSL_ERROR_VERBOSE(ret);
13354
        }
13355
    }
13356
    if (dCert->surname) {
13357
        if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
13358
                                        WC_NID_surname,
13359
                                        MBSTRING_ASC,
13360
                                        (const byte*)dCert->surname,
13361
                                        dCert->surnameLen) != WOLFSSL_SUCCESS) {
13362
            ret = REQ_ATTRIBUTE_E;
13363
            WOLFSSL_ERROR_VERBOSE(ret);
13364
        }
13365
    }
13366
    if (dCert->givenName) {
13367
        if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
13368
                                        WC_NID_givenName,
13369
                                        MBSTRING_ASC,
13370
                                        (const byte*)dCert->givenName,
13371
                                        dCert->givenNameLen) != WOLFSSL_SUCCESS) {
13372
            ret = REQ_ATTRIBUTE_E;
13373
            WOLFSSL_ERROR_VERBOSE(ret);
13374
        }
13375
    }
13376
    if (dCert->dnQualifier) {
13377
        if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
13378
                                        WC_NID_dnQualifier,
13379
                                        MBSTRING_ASC,
13380
                                        (const byte*)dCert->dnQualifier,
13381
                                        dCert->dnQualifierLen) != WOLFSSL_SUCCESS) {
13382
            ret = REQ_ATTRIBUTE_E;
13383
            WOLFSSL_ERROR_VERBOSE(ret);
13384
        }
13385
    }
13386
    if (dCert->initials) {
13387
        if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
13388
                                        WC_NID_initials,
13389
                                        MBSTRING_ASC,
13390
                                        (const byte*)dCert->initials,
13391
                                        dCert->initialsLen) != WOLFSSL_SUCCESS) {
13392
            ret = REQ_ATTRIBUTE_E;
13393
            WOLFSSL_ERROR_VERBOSE(ret);
13394
        }
13395
    }
13396
    #endif /* OPENSSL_ALL */
13397
13398
    return ret;
13399
}
13400
#endif /* WOLFSSL_CERT_REQ */
13401
13402
/* Copy parts X509 needs from Decoded cert, 0 on success */
13403
int CopyDecodedToX509(WOLFSSL_X509* x509, DecodedCert* dCert)
13404
{
13405
    int ret = 0;
13406
    int minSz;
13407
13408
    if (x509 == NULL || dCert == NULL ||
13409
        dCert->subjectCNLen < 0)
13410
        return BAD_FUNC_ARG;
13411
13412
    if (x509->issuer.name == NULL || x509->subject.name == NULL) {
13413
        WOLFSSL_MSG("Either init was not called on X509 or programming error");
13414
        WOLFSSL_ERROR_VERBOSE(BAD_FUNC_ARG);
13415
        return BAD_FUNC_ARG;
13416
    }
13417
13418
    x509->version = dCert->version + 1;
13419
13420
    CopyDecodedName(&x509->issuer, dCert, ASN_ISSUER);
13421
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
13422
    if (dCert->issuerName != NULL) {
13423
        wolfSSL_X509_set_issuer_name(x509,
13424
                (WOLFSSL_X509_NAME*)dCert->issuerName);
13425
        x509->issuer.x509 = x509;
13426
    }
13427
#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
13428
    CopyDecodedName(&x509->subject, dCert, ASN_SUBJECT);
13429
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
13430
    if (dCert->subjectName != NULL) {
13431
        wolfSSL_X509_set_subject_name(x509,
13432
                (WOLFSSL_X509_NAME*)dCert->subjectName);
13433
        x509->subject.x509 = x509;
13434
    }
13435
#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
13436
13437
    XMEMCPY(x509->serial, dCert->serial, EXTERNAL_SERIAL_SIZE);
13438
    x509->serialSz = dCert->serialSz;
13439
    if (dCert->subjectCN && dCert->subjectCNLen < ASN_NAME_MAX) {
13440
        XMEMCPY(x509->subjectCN, dCert->subjectCN, dCert->subjectCNLen);
13441
        x509->subjectCN[dCert->subjectCNLen] = '\0';
13442
    }
13443
    else
13444
        x509->subjectCN[0] = '\0';
13445
13446
#ifdef WOLFSSL_CERT_REQ
13447
    x509->isCSR = dCert->isCSR;
13448
13449
    /* CSR attributes */
13450
    if (x509->isCSR) {
13451
        ret = CopyREQAttributes(x509, dCert);
13452
    }
13453
#endif /* WOLFSSL_CERT_REQ */
13454
13455
#ifdef WOLFSSL_SEP
13456
    minSz = min(dCert->deviceTypeSz, EXTERNAL_SERIAL_SIZE);
13457
    if (minSz > 0) {
13458
        x509->deviceTypeSz = minSz;
13459
        XMEMCPY(x509->deviceType, dCert->deviceType, minSz);
13460
    }
13461
    else
13462
        x509->deviceTypeSz = 0;
13463
    minSz = min(dCert->hwTypeSz, EXTERNAL_SERIAL_SIZE);
13464
    if (minSz > 0) {
13465
        x509->hwTypeSz = minSz;
13466
        XMEMCPY(x509->hwType, dCert->hwType, minSz);
13467
    }
13468
    else
13469
        x509->hwTypeSz = 0;
13470
    minSz = min(dCert->hwSerialNumSz, EXTERNAL_SERIAL_SIZE);
13471
    if (minSz > 0) {
13472
        x509->hwSerialNumSz = minSz;
13473
        XMEMCPY(x509->hwSerialNum, dCert->hwSerialNum, minSz);
13474
    }
13475
    else
13476
        x509->hwSerialNumSz = 0;
13477
#endif /* WOLFSSL_SEP */
13478
13479
    if (dCert->beforeDateLen > 0) {
13480
        minSz = (int)min(dCert->beforeDate[1], MAX_DATE_SZ);
13481
        x509->notBefore.type = dCert->beforeDate[0];
13482
        x509->notBefore.length = minSz;
13483
        XMEMCPY(x509->notBefore.data, &dCert->beforeDate[2], minSz);
13484
    }
13485
    else
13486
        x509->notBefore.length = 0;
13487
    if (dCert->afterDateLen > 0) {
13488
        minSz = (int)min(dCert->afterDate[1], MAX_DATE_SZ);
13489
        x509->notAfter.type = dCert->afterDate[0];
13490
        x509->notAfter.length = minSz;
13491
        XMEMCPY(x509->notAfter.data, &dCert->afterDate[2], minSz);
13492
    }
13493
    else
13494
        x509->notAfter.length = 0;
13495
13496
    if (dCert->publicKey != NULL && dCert->pubKeySize != 0) {
13497
        x509->pubKey.buffer = (byte*)XMALLOC(
13498
                        dCert->pubKeySize, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
13499
        if (x509->pubKey.buffer != NULL) {
13500
            x509->pubKeyOID = (int)dCert->keyOID;
13501
            x509->pubKey.length = dCert->pubKeySize;
13502
            XMEMCPY(x509->pubKey.buffer, dCert->publicKey, dCert->pubKeySize);
13503
        }
13504
        else
13505
            ret = MEMORY_E;
13506
#if defined(OPENSSL_ALL)
13507
        if (ret == 0) {
13508
            x509->key.pubKeyOID = (int)dCert->keyOID;
13509
13510
            if (!x509->key.algor) {
13511
                x509->key.algor = wolfSSL_X509_ALGOR_new();
13512
            } else {
13513
                wolfSSL_ASN1_OBJECT_free(x509->key.algor->algorithm);
13514
            }
13515
            if (!x509->key.algor) {
13516
                ret = MEMORY_E;
13517
            } else {
13518
                if (!(x509->key.algor->algorithm =
13519
                    wolfSSL_OBJ_nid2obj(oid2nid(dCert->keyOID, oidKeyType)))) {
13520
                    ret = PUBLIC_KEY_E;
13521
                    WOLFSSL_ERROR_VERBOSE(ret);
13522
                }
13523
            }
13524
13525
            wolfSSL_EVP_PKEY_free(x509->key.pkey);
13526
            if (!(x509->key.pkey = wolfSSL_d2i_PUBKEY(NULL,
13527
                                                      &dCert->publicKey,
13528
                                                      dCert->pubKeySize))) {
13529
                ret = PUBLIC_KEY_E;
13530
                WOLFSSL_ERROR_VERBOSE(ret);
13531
            }
13532
        }
13533
#endif
13534
    }
13535
13536
    if (dCert->signature != NULL && dCert->sigLength != 0 &&
13537
            dCert->sigLength <= MAX_ENCODED_SIG_SZ) {
13538
        x509->sig.buffer = (byte*)XMALLOC(
13539
                          dCert->sigLength, x509->heap, DYNAMIC_TYPE_SIGNATURE);
13540
        if (x509->sig.buffer == NULL) {
13541
            ret = MEMORY_E;
13542
        }
13543
        else {
13544
            XMEMCPY(x509->sig.buffer, dCert->signature, dCert->sigLength);
13545
            x509->sig.length = dCert->sigLength;
13546
            x509->sigOID = (int)dCert->signatureOID;
13547
        }
13548
#if defined(OPENSSL_ALL)
13549
        wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
13550
        if (!(x509->algor.algorithm =
13551
                wolfSSL_OBJ_nid2obj(oid2nid(dCert->signatureOID, oidSigType)))) {
13552
            ret = PUBLIC_KEY_E;
13553
            WOLFSSL_ERROR_VERBOSE(ret);
13554
        }
13555
#endif
13556
    }
13557
13558
    /* if der contains original source buffer then store for potential
13559
     * retrieval */
13560
    if (dCert->source != NULL && dCert->maxIdx > 0) {
13561
        if (AllocDer(&x509->derCert, dCert->maxIdx, CERT_TYPE, x509->heap)
13562
                                                                         == 0) {
13563
            XMEMCPY(x509->derCert->buffer, dCert->source, dCert->maxIdx);
13564
        }
13565
        else {
13566
            ret = MEMORY_E;
13567
        }
13568
    }
13569
13570
    /* add alt names from dCert to X509 */
13571
    if (CopyAltNames(&x509->altNames, dCert->altNames, -1, x509->heap) != 0) {
13572
        return MEMORY_E;
13573
    }
13574
#if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
13575
    !defined(IGNORE_NAME_CONSTRAINTS)
13576
    /* add copies of email names from dCert to X509 */
13577
    if (CopyAltNames(&x509->altNames, dCert->altEmailNames,
13578
                ASN_RFC822_TYPE, x509->heap) != 0) {
13579
        return MEMORY_E;
13580
    }
13581
#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
13582
#if defined(OPENSSL_EXTRA) && !defined(IGNORE_NAME_CONSTRAINTS)
13583
    /* add copies of alternate directory names from dCert to X509 */
13584
    if (CopyAltNames(&x509->altNames, dCert->altDirNames,
13585
                ASN_DIR_TYPE, x509->heap) != 0) {
13586
        return MEMORY_E;
13587
    }
13588
#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
13589
    x509->altNamesNext   = x509->altNames;  /* index hint */
13590
13591
    x509->isCa = dCert->isCA;
13592
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
13593
    x509->basicConstCrit = dCert->extBasicConstCrit;
13594
    x509->pathLength = dCert->pathLength;
13595
    x509->pathLengthSet = dCert->pathLengthSet;
13596
    x509->keyUsage = dCert->extKeyUsage;
13597
13598
    x509->CRLdistSet = dCert->extCRLdistSet;
13599
    x509->CRLdistCrit = dCert->extCRLdistCrit;
13600
    if (dCert->extCrlInfoRaw != NULL && dCert->extCrlInfoRawSz > 0) {
13601
        x509->rawCRLInfo = (byte*)XMALLOC(dCert->extCrlInfoRawSz, x509->heap,
13602
            DYNAMIC_TYPE_X509_EXT);
13603
        if (x509->rawCRLInfo != NULL) {
13604
            XMEMCPY(x509->rawCRLInfo, dCert->extCrlInfoRaw, dCert->extCrlInfoRawSz);
13605
            x509->rawCRLInfoSz = dCert->extCrlInfoRawSz;
13606
        }
13607
        else {
13608
            ret = MEMORY_E;
13609
        }
13610
    }
13611
    if (dCert->extCrlInfo != NULL && dCert->extCrlInfoSz > 0) {
13612
        x509->CRLInfo = (byte*)XMALLOC(dCert->extCrlInfoSz, x509->heap,
13613
            DYNAMIC_TYPE_X509_EXT);
13614
        if (x509->CRLInfo != NULL) {
13615
            XMEMCPY(x509->CRLInfo, dCert->extCrlInfo, dCert->extCrlInfoSz);
13616
            x509->CRLInfoSz = dCert->extCrlInfoSz;
13617
        }
13618
        else {
13619
            ret = MEMORY_E;
13620
        }
13621
    }
13622
    x509->authInfoSet = dCert->extAuthInfoSet;
13623
    x509->authInfoCrit = dCert->extAuthInfoCrit;
13624
    if (dCert->extAuthInfo != NULL && dCert->extAuthInfoSz > 0) {
13625
        x509->authInfo = (byte*)XMALLOC(dCert->extAuthInfoSz, x509->heap,
13626
                DYNAMIC_TYPE_X509_EXT);
13627
        if (x509->authInfo != NULL) {
13628
            XMEMCPY(x509->authInfo, dCert->extAuthInfo, dCert->extAuthInfoSz);
13629
            x509->authInfoSz = dCert->extAuthInfoSz;
13630
        }
13631
        else {
13632
            ret = MEMORY_E;
13633
        }
13634
    }
13635
    #ifdef WOLFSSL_ASN_CA_ISSUER
13636
    if (dCert->extAuthInfoCaIssuer != NULL && dCert->extAuthInfoCaIssuerSz > 0) {
13637
        x509->authInfoCaIssuer = (byte*)XMALLOC(dCert->extAuthInfoCaIssuerSz, x509->heap,
13638
                DYNAMIC_TYPE_X509_EXT);
13639
        if (x509->authInfoCaIssuer != NULL) {
13640
            XMEMCPY(x509->authInfoCaIssuer, dCert->extAuthInfoCaIssuer, dCert->extAuthInfoCaIssuerSz);
13641
            x509->authInfoCaIssuerSz = dCert->extAuthInfoCaIssuerSz;
13642
        }
13643
        else {
13644
            ret = MEMORY_E;
13645
        }
13646
    }
13647
    #endif
13648
    x509->basicConstSet = dCert->extBasicConstSet;
13649
    x509->basicConstPlSet = dCert->pathLengthSet;
13650
    x509->subjAltNameSet = dCert->extSubjAltNameSet;
13651
    x509->subjAltNameCrit = dCert->extSubjAltNameCrit;
13652
    x509->authKeyIdSet = dCert->extAuthKeyIdSet;
13653
    x509->authKeyIdCrit = dCert->extAuthKeyIdCrit;
13654
    if (dCert->extAuthKeyIdSrc != NULL && dCert->extAuthKeyIdSz != 0) {
13655
    #ifdef WOLFSSL_AKID_NAME
13656
        if (dCert->extRawAuthKeyIdSrc != NULL &&
13657
                dCert->extAuthKeyIdSrc > dCert->extRawAuthKeyIdSrc &&
13658
                dCert->extAuthKeyIdSrc <
13659
                    (dCert->extRawAuthKeyIdSrc + dCert->extRawAuthKeyIdSz)) {
13660
            /* Confirmed: extAuthKeyIdSrc points inside extRawAuthKeyIdSrc */
13661
            x509->authKeyIdSrc = (byte*)XMALLOC(dCert->extRawAuthKeyIdSz,
13662
                    x509->heap, DYNAMIC_TYPE_X509_EXT);
13663
            if (x509->authKeyIdSrc != NULL) {
13664
                XMEMCPY(x509->authKeyIdSrc, dCert->extRawAuthKeyIdSrc,
13665
                        dCert->extRawAuthKeyIdSz);
13666
                x509->authKeyIdSrcSz = dCert->extRawAuthKeyIdSz;
13667
                /* Set authKeyId to same offset inside authKeyIdSrc */
13668
                x509->authKeyId = x509->authKeyIdSrc +
13669
                        (dCert->extAuthKeyIdSrc - dCert->extRawAuthKeyIdSrc);
13670
                x509->authKeyIdSz = dCert->extAuthKeyIdSz;
13671
            }
13672
            else
13673
                ret = MEMORY_E;
13674
        }
13675
    #else
13676
        x509->authKeyId = (byte*)XMALLOC(dCert->extAuthKeyIdSz, x509->heap,
13677
                                         DYNAMIC_TYPE_X509_EXT);
13678
        if (x509->authKeyId != NULL) {
13679
            XMEMCPY(x509->authKeyId,
13680
                                 dCert->extAuthKeyIdSrc, dCert->extAuthKeyIdSz);
13681
            x509->authKeyIdSz = dCert->extAuthKeyIdSz;
13682
        }
13683
    #endif
13684
        else
13685
            ret = MEMORY_E;
13686
    }
13687
    x509->subjKeyIdSet = dCert->extSubjKeyIdSet;
13688
    x509->subjKeyIdCrit = dCert->extSubjKeyIdCrit;
13689
    if (dCert->extSubjKeyIdSrc != NULL && dCert->extSubjKeyIdSz != 0) {
13690
        x509->subjKeyId = (byte*)XMALLOC(dCert->extSubjKeyIdSz, x509->heap,
13691
                                         DYNAMIC_TYPE_X509_EXT);
13692
        if (x509->subjKeyId != NULL) {
13693
            XMEMCPY(x509->subjKeyId,
13694
                                 dCert->extSubjKeyIdSrc, dCert->extSubjKeyIdSz);
13695
            x509->subjKeyIdSz = dCert->extSubjKeyIdSz;
13696
        }
13697
        else
13698
            ret = MEMORY_E;
13699
    }
13700
    x509->keyUsageSet = dCert->extKeyUsageSet;
13701
    x509->keyUsageCrit = dCert->extKeyUsageCrit;
13702
    if (dCert->extExtKeyUsageSrc != NULL && dCert->extExtKeyUsageSz > 0) {
13703
        x509->extKeyUsageSrc = (byte*)XMALLOC(dCert->extExtKeyUsageSz,
13704
                x509->heap, DYNAMIC_TYPE_X509_EXT);
13705
        if (x509->extKeyUsageSrc != NULL) {
13706
            XMEMCPY(x509->extKeyUsageSrc, dCert->extExtKeyUsageSrc,
13707
                                                       dCert->extExtKeyUsageSz);
13708
            x509->extKeyUsage      = dCert->extExtKeyUsage;
13709
            x509->extKeyUsageSz    = dCert->extExtKeyUsageSz;
13710
            x509->extKeyUsageCrit  = dCert->extExtKeyUsageCrit;
13711
            x509->extKeyUsageCount = dCert->extExtKeyUsageCount;
13712
        }
13713
        else {
13714
            ret = MEMORY_E;
13715
        }
13716
    }
13717
    #ifndef IGNORE_NETSCAPE_CERT_TYPE
13718
    x509->nsCertType = dCert->nsCertType;
13719
    #endif
13720
    #ifdef WOLFSSL_SEP
13721
        x509->certPolicySet = dCert->extCertPolicySet;
13722
        x509->certPolicyCrit = dCert->extCertPolicyCrit;
13723
    #endif
13724
    #ifdef WOLFSSL_CERT_EXT
13725
        {
13726
            int i;
13727
            for (i = 0; i < dCert->extCertPoliciesNb && i < MAX_CERTPOL_NB; i++)
13728
                XMEMCPY(x509->certPolicies[i], dCert->extCertPolicies[i],
13729
                                                                MAX_CERTPOL_SZ);
13730
            x509->certPoliciesNb = dCert->extCertPoliciesNb;
13731
        }
13732
    #endif /* WOLFSSL_CERT_EXT */
13733
#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
13734
#ifdef OPENSSL_ALL
13735
    if (dCert->extSubjAltNameSrc != NULL && dCert->extSubjAltNameSz != 0) {
13736
        x509->subjAltNameSrc = (byte*)XMALLOC(dCert->extSubjAltNameSz, x509->heap,
13737
                                         DYNAMIC_TYPE_X509_EXT);
13738
        if (x509->subjAltNameSrc != NULL) {
13739
            XMEMCPY(x509->subjAltNameSrc,
13740
                                 dCert->extSubjAltNameSrc, dCert->extSubjAltNameSz);
13741
            x509->subjAltNameSz = dCert->extSubjAltNameSz;
13742
        }
13743
        else
13744
            ret = MEMORY_E;
13745
    }
13746
#endif
13747
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
13748
    x509->pkCurveOID = dCert->pkCurveOID;
13749
#endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
13750
13751
#ifdef WOLFSSL_DUAL_ALG_CERTS
13752
    /* Copy over alternative sig and pubkey. In this case we will allocate new
13753
     * buffers for them as we have no knowledge of when the DecodedCert is
13754
     * freed. */
13755
    if (dCert->extSapkiSet) {
13756
        x509->sapkiDer = (byte*)XMALLOC(dCert->sapkiLen, x509->heap,
13757
                                        DYNAMIC_TYPE_X509_EXT);
13758
        if (x509->sapkiDer != NULL) {
13759
            XMEMCPY(x509->sapkiDer, dCert->sapkiDer, dCert->sapkiLen);
13760
            x509->sapkiLen = dCert->sapkiLen;
13761
            x509->sapkiCrit = dCert->extSapkiCrit;
13762
        }
13763
        else {
13764
            ret = MEMORY_E;
13765
        }
13766
    }
13767
    if (dCert->extAltSigAlgSet) {
13768
        x509->altSigAlgDer = (byte*)XMALLOC(dCert->altSigAlgLen, x509->heap,
13769
                                            DYNAMIC_TYPE_X509_EXT);
13770
        if (x509->altSigAlgDer != NULL) {
13771
            XMEMCPY(x509->altSigAlgDer, dCert->altSigAlgDer,
13772
                    dCert->altSigAlgLen);
13773
            x509->altSigAlgLen = dCert->altSigAlgLen;
13774
            x509->altSigAlgCrit = dCert->extAltSigAlgCrit;
13775
        }
13776
        else {
13777
            ret = MEMORY_E;
13778
        }
13779
    }
13780
    if (dCert->extAltSigValSet) {
13781
        x509->altSigValDer = (byte*)XMALLOC(dCert->altSigValLen, x509->heap,
13782
                                            DYNAMIC_TYPE_X509_EXT);
13783
        if (x509->altSigValDer != NULL) {
13784
            XMEMCPY(x509->altSigValDer, dCert->altSigValDer,
13785
                    dCert->altSigValLen);
13786
            x509->altSigValLen = dCert->altSigValLen;
13787
            x509->altSigValCrit = dCert->extAltSigValCrit;
13788
        }
13789
        else {
13790
            ret = MEMORY_E;
13791
        }
13792
    }
13793
#endif /* WOLFSSL_DUAL_ALG_CERTS */
13794
13795
    return ret;
13796
}
13797
13798
#endif /* KEEP_PEER_CERT || SESSION_CERTS */
13799
13800
#if defined(WOLFSSL_ACERT)
13801
/* Copy a DecodedAcert structure to an X509_ACERT.
13802
 *
13803
 * @param [out]     x509        the dst X509 acert structure
13804
 * @param [in]      dAcert      the src decoded acert structure
13805
 *
13806
 * @return  0   on success
13807
 * @return  < 0 on error
13808
 * */
13809
int CopyDecodedAcertToX509(WOLFSSL_X509_ACERT* x509, DecodedAcert* dAcert)
13810
{
13811
    int ret = 0;
13812
13813
    if (x509 == NULL || dAcert == NULL) {
13814
        return BAD_FUNC_ARG;
13815
    }
13816
13817
    /* Copy version and serial number. */
13818
    x509->version = dAcert->version + 1;
13819
13820
    XMEMCPY(x509->serial, dAcert->serial, EXTERNAL_SERIAL_SIZE);
13821
    x509->serialSz = dAcert->serialSz;
13822
13823
    if (dAcert->holderSerialSz > 0) {
13824
        /* This ACERT Holder field had a serial number. Copy it. */
13825
        XMEMCPY(x509->holderSerial, dAcert->holderSerial,
13826
                dAcert->holderSerialSz);
13827
        x509->holderSerialSz = dAcert->holderSerialSz;
13828
    }
13829
13830
    /* Copy before and after dates. */
13831
    {
13832
        int minSz = 0;
13833
13834
        if (dAcert->beforeDateLen > 0) {
13835
            minSz = (int)min(dAcert->beforeDate[1], MAX_DATE_SZ);
13836
            x509->notBefore.type = dAcert->beforeDate[0];
13837
            x509->notBefore.length = minSz;
13838
            XMEMCPY(x509->notBefore.data, &dAcert->beforeDate[2], minSz);
13839
        }
13840
        else {
13841
            x509->notBefore.length = 0;
13842
        }
13843
13844
        if (dAcert->afterDateLen > 0) {
13845
            minSz = (int)min(dAcert->afterDate[1], MAX_DATE_SZ);
13846
            x509->notAfter.type = dAcert->afterDate[0];
13847
            x509->notAfter.length = minSz;
13848
            XMEMCPY(x509->notAfter.data, &dAcert->afterDate[2], minSz);
13849
        }
13850
        else {
13851
            x509->notAfter.length = 0;
13852
        }
13853
    }
13854
13855
    /* Copy the signature. */
13856
    if (dAcert->signature != NULL && dAcert->sigLength != 0 &&
13857
            dAcert->sigLength <= MAX_ENCODED_SIG_SZ) {
13858
        x509->sig.buffer = (byte*)XMALLOC(
13859
                          dAcert->sigLength, x509->heap, DYNAMIC_TYPE_SIGNATURE);
13860
        if (x509->sig.buffer == NULL) {
13861
            ret = MEMORY_E;
13862
        }
13863
        else {
13864
            XMEMCPY(x509->sig.buffer, dAcert->signature, dAcert->sigLength);
13865
            x509->sig.length = dAcert->sigLength;
13866
            x509->sigOID = (int)dAcert->signatureOID;
13867
        }
13868
    }
13869
13870
    /* if der contains original source buffer then store for potential
13871
     * retrieval */
13872
    if (dAcert->source != NULL && dAcert->maxIdx > 0) {
13873
        if (AllocDer(&x509->derCert, dAcert->maxIdx, CERT_TYPE, x509->heap)
13874
                                                                         == 0) {
13875
            XMEMCPY(x509->derCert->buffer, dAcert->source, dAcert->maxIdx);
13876
        }
13877
        else {
13878
            ret = MEMORY_E;
13879
        }
13880
    }
13881
13882
    /* Copy holder and att cert issuer names if present. */
13883
    if (CopyAltNames(&x509->holderIssuerName, dAcert->holderIssuerName,
13884
                ASN_DIR_TYPE, x509->heap) != 0) {
13885
        return MEMORY_E;
13886
    }
13887
13888
    if (CopyAltNames(&x509->holderEntityName, dAcert->holderEntityName,
13889
                ASN_DIR_TYPE, x509->heap) != 0) {
13890
        return MEMORY_E;
13891
    }
13892
13893
    if (CopyAltNames(&x509->AttCertIssuerName, dAcert->AttCertIssuerName,
13894
                ASN_DIR_TYPE, x509->heap) != 0) {
13895
        return MEMORY_E;
13896
    }
13897
13898
    if (dAcert->rawAttr && dAcert->rawAttrLen > 0) {
13899
        /* Allocate space for the raw Attributes field, then copy it in. */
13900
        x509->rawAttr = (byte*)XMALLOC(dAcert->rawAttrLen, x509->heap,
13901
                                       DYNAMIC_TYPE_X509_EXT);
13902
        if (x509->rawAttr != NULL) {
13903
            XMEMCPY(x509->rawAttr, dAcert->rawAttr, dAcert->rawAttrLen);
13904
            x509->rawAttrLen = dAcert->rawAttrLen;
13905
        }
13906
        else {
13907
            ret = MEMORY_E;
13908
        }
13909
    }
13910
13911
    return ret;
13912
}
13913
#endif /* WOLFSSL_ACERT */
13914
13915
13916
#if (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
13917
     defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)) && !defined(WOLFSSL_NO_TLS12)
13918
static int ProcessCSR_ex(WOLFSSL* ssl, byte* input, word32* inOutIdx,
13919
                      word32 status_length, int idx)
13920
{
13921
    int ret = 0;
13922
    OcspRequest* request;
13923
#if defined(HAVE_CERTIFICATE_STATUS_REQUEST)
13924
    TLSX* ext =  TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
13925
    CertificateStatusRequest* csr;
13926
#endif
13927
    #ifdef WOLFSSL_SMALL_STACK
13928
        CertStatus* status;
13929
        OcspEntry* single;
13930
        OcspResponse* response;
13931
    #else
13932
        CertStatus status[1];
13933
        OcspEntry single[1];
13934
        OcspResponse response[1];
13935
    #endif
13936
13937
    WOLFSSL_ENTER("ProcessCSR");
13938
#if defined(HAVE_CERTIFICATE_STATUS_REQUEST)
13939
    if (ext) {
13940
        /* status request */
13941
        csr = (CertificateStatusRequest*)ext->data;
13942
        if (csr && !csr->ssl)
13943
            csr->ssl = ssl;
13944
    }
13945
#endif
13946
    do {
13947
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
13948
            if (ssl->status_request) {
13949
                request = (OcspRequest*)TLSX_CSR_GetRequest_ex(ssl->extensions,
13950
                                idx);
13951
                ssl->status_request = 0;
13952
                break;
13953
            }
13954
        #else
13955
            (void)idx;
13956
        #endif
13957
13958
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
13959
            if (ssl->status_request_v2) {
13960
                request = (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
13961
                                                          WOLFSSL_CSR2_OCSP, 0);
13962
                ssl->status_request_v2 = 0;
13963
                break;
13964
            }
13965
        #endif
13966
13967
        return BUFFER_ERROR;
13968
    } while(0);
13969
13970
    if (request == NULL)
13971
        return BAD_CERTIFICATE_STATUS_ERROR; /* not expected */
13972
13973
    #ifdef WOLFSSL_SMALL_STACK
13974
        status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
13975
                                      DYNAMIC_TYPE_OCSP_STATUS);
13976
        single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
13977
                                     DYNAMIC_TYPE_OCSP_ENTRY);
13978
        response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
13979
                                          DYNAMIC_TYPE_OCSP_REQUEST);
13980
13981
        if (status == NULL || single == NULL || response == NULL) {
13982
            if (status != NULL) {
13983
                XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
13984
            }
13985
            if (single != NULL) {
13986
                XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
13987
            }
13988
            if (response != NULL) {
13989
                XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
13990
            }
13991
13992
            return MEMORY_ERROR;
13993
        }
13994
    #endif
13995
13996
    /* InitOcspResponse sets single and status to response struct. */
13997
    InitOcspResponse(response, single, status, input +*inOutIdx, status_length, ssl->heap);
13998
13999
    if (OcspResponseDecode(response, SSL_CM(ssl), ssl->heap, 0, 0) != 0)
14000
        ret = BAD_CERTIFICATE_STATUS_ERROR;
14001
    else if (CompareOcspReqResp(request, response) != 0)
14002
        ret = BAD_CERTIFICATE_STATUS_ERROR;
14003
    else if (response->responseStatus != OCSP_SUCCESSFUL)
14004
        ret = BAD_CERTIFICATE_STATUS_ERROR;
14005
    else if (response->single->status->status == CERT_REVOKED)
14006
        ret = OCSP_CERT_REVOKED;
14007
    else if (response->single->status->status != CERT_GOOD)
14008
        ret = BAD_CERTIFICATE_STATUS_ERROR;
14009
14010
    else {
14011
        XMEMCPY(ssl->ocspProducedDate, response->producedDate, sizeof ssl->ocspProducedDate);
14012
        ssl->ocspProducedDateFormat = response->producedDateFormat;
14013
    }
14014
14015
    *inOutIdx += status_length;
14016
14017
    /* FreeOcspResponse frees status and single only if
14018
     * single->isDynamic is set. */
14019
    FreeOcspResponse(response);
14020
14021
    #ifdef WOLFSSL_SMALL_STACK
14022
    XFREE(status,   ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
14023
    XFREE(single,   ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
14024
    XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
14025
    #endif
14026
14027
    WOLFSSL_LEAVE("ProcessCSR", ret);
14028
    return ret;
14029
}
14030
14031
static int ProcessCSR(WOLFSSL* ssl, byte* input, word32* inOutIdx,
14032
                      word32 status_length)
14033
{
14034
    return ProcessCSR_ex(ssl, input, inOutIdx, status_length, 0);
14035
}
14036
#endif
14037
14038
14039
14040
#ifdef HAVE_PK_CALLBACKS
14041
14042
#ifdef HAVE_ECC
14043
    static int SigPkCbEccVerify(const unsigned char* sig, unsigned int sigSz,
14044
       const unsigned char* hash, unsigned int hashSz,
14045
       const unsigned char* keyDer, unsigned int keySz,
14046
       int* result, void* ctx)
14047
    {
14048
        int ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN);
14049
        WOLFSSL* ssl = (WOLFSSL*)ctx;
14050
14051
        if (ssl && ssl->ctx->EccVerifyCb) {
14052
            ret = ssl->ctx->EccVerifyCb(ssl, sig, sigSz, hash, hashSz,
14053
                keyDer, keySz, result, ssl->EccVerifyCtx);
14054
        }
14055
        return ret;
14056
    }
14057
#endif
14058
#ifndef NO_RSA
14059
    static int SigPkCbRsaVerify(unsigned char* sig, unsigned int sigSz,
14060
       unsigned char** out, const unsigned char* keyDer, unsigned int keySz,
14061
       void* ctx)
14062
    {
14063
        int ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN);
14064
        WOLFSSL* ssl = (WOLFSSL*)ctx;
14065
14066
        if (ssl && ssl->ctx->RsaVerifyCb) {
14067
            ret = ssl->ctx->RsaVerifyCb(ssl, sig, sigSz, out, keyDer, keySz,
14068
                ssl->RsaVerifyCtx);
14069
        }
14070
        return ret;
14071
    }
14072
#endif
14073
14074
int InitSigPkCb(WOLFSSL* ssl, SignatureCtx* sigCtx)
14075
{
14076
    if (ssl == NULL || sigCtx == NULL)
14077
        return BAD_FUNC_ARG;
14078
14079
    /* only setup the verify callback if a PK is set */
14080
#ifdef HAVE_ECC
14081
    #if defined(WOLFSSL_RENESAS_FSPSM_TLS) || defined(WOLFSSL_RENESAS_TSIP_TLS)
14082
    sigCtx->pkCbEcc = Renesas_cmn_SigPkCbEccVerify;
14083
    sigCtx->pkCtxEcc = (void*)&sigCtx->CertAtt;
14084
    (void)SigPkCbEccVerify;
14085
    #else
14086
    if (ssl->ctx->EccVerifyCb) {
14087
        sigCtx->pkCbEcc = SigPkCbEccVerify;
14088
        sigCtx->pkCtxEcc = ssl;
14089
    }
14090
    #endif
14091
14092
#endif
14093
#ifndef NO_RSA
14094
    /* only setup the verify callback if a PK is set */
14095
    #if defined(WOLFSSL_RENESAS_FSPSM_TLS) || defined(WOLFSSL_RENESAS_TSIP_TLS)
14096
    sigCtx->pkCbRsa = Renesas_cmn_SigPkCbRsaVerify;
14097
    sigCtx->pkCtxRsa = (void*)&sigCtx->CertAtt;
14098
    (void)SigPkCbRsaVerify;
14099
    #else
14100
    if (ssl->ctx->RsaVerifyCb) {
14101
        sigCtx->pkCbRsa = SigPkCbRsaVerify;
14102
        sigCtx->pkCtxRsa = ssl;
14103
    }
14104
    #endif
14105
14106
#endif
14107
14108
    return 0;
14109
}
14110
14111
#endif /* HAVE_PK_CALLBACKS */
14112
14113
#if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
14114
void DoCertFatalAlert(WOLFSSL* ssl, int ret)
14115
{
14116
    int alertWhy;
14117
    if (ssl == NULL || ret == 0) {
14118
        return;
14119
    }
14120
    WOLFSSL_ERROR(ret);
14121
14122
    /* Determine alert reason */
14123
    alertWhy = bad_certificate;
14124
    if (ret == WC_NO_ERR_TRACE(ASN_AFTER_DATE_E) ||
14125
        ret == WC_NO_ERR_TRACE(ASN_BEFORE_DATE_E)) {
14126
        alertWhy = certificate_expired;
14127
    }
14128
    else if (ret == WC_NO_ERR_TRACE(ASN_NO_SIGNER_E) ||
14129
             ret == WC_NO_ERR_TRACE(ASN_PATHLEN_INV_E) ||
14130
             ret == WC_NO_ERR_TRACE(ASN_PATHLEN_SIZE_E)) {
14131
        alertWhy = unknown_ca;
14132
    }
14133
#ifdef OPENSSL_EXTRA
14134
    else if (ret == WC_NO_ERR_TRACE(CRL_CERT_REVOKED)) {
14135
        alertWhy = certificate_revoked;
14136
    }
14137
#endif
14138
#if defined(HAVE_RPK)
14139
    else if (ret == WC_NO_ERR_TRACE(UNSUPPORTED_CERTIFICATE)) {
14140
        alertWhy = unsupported_certificate;
14141
    }
14142
#endif /* HAVE_RPK */
14143
    else if (ret == WC_NO_ERR_TRACE(NO_PEER_CERT)) {
14144
#ifdef WOLFSSL_TLS13
14145
        if (ssl->options.tls1_3) {
14146
            alertWhy = certificate_required;
14147
        }
14148
        else
14149
#endif
14150
        {
14151
            alertWhy = handshake_failure;
14152
        }
14153
    }
14154
14155
#ifndef NO_TLS
14156
    /* send fatal alert and mark connection closed */
14157
    SendAlert(ssl, alert_fatal, alertWhy); /* try to send */
14158
#else
14159
    (void)alertWhy;
14160
#endif
14161
    ssl->options.isClosed = 1;
14162
}
14163
14164
int SetupStoreCtxCallback(WOLFSSL_X509_STORE_CTX** store_pt,
14165
        WOLFSSL* ssl, WOLFSSL_CERT_MANAGER* cm, ProcPeerCertArgs* args,
14166
        int cert_err, void* heap, int* x509Free)
14167
0
{
14168
0
    WOLFSSL_X509_STORE_CTX* store = NULL;
14169
0
    char* domain = NULL;
14170
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
14171
    WOLFSSL_X509* x509 = NULL;
14172
#endif
14173
14174
0
    *x509Free = 0;
14175
14176
0
    store = wolfSSL_X509_STORE_CTX_new_ex(heap);
14177
0
    if (store == NULL)
14178
0
        goto mem_error;
14179
0
    domain = (char*)XMALLOC(ASN_NAME_MAX, heap, DYNAMIC_TYPE_STRING);
14180
0
    if (domain == NULL)
14181
0
        goto mem_error;
14182
14183
0
    domain[0] = '\0';
14184
14185
    /* build subject CN as string to return in store */
14186
0
    if (args->dCertInit && args->dCert && args->dCert->subjectCN) {
14187
0
        int subjectCNLen = args->dCert->subjectCNLen;
14188
0
        if (subjectCNLen > ASN_NAME_MAX-1)
14189
0
            subjectCNLen = ASN_NAME_MAX-1;
14190
0
        if (subjectCNLen > 0) {
14191
0
            XMEMCPY(domain, args->dCert->subjectCN, (size_t)(subjectCNLen));
14192
0
            domain[subjectCNLen] = '\0';
14193
0
        }
14194
0
    }
14195
14196
0
#ifndef OPENSSL_COMPATIBLE_DEFAULTS
14197
0
    store->error = cert_err;
14198
#else
14199
    store->error = GetX509Error(cert_err);
14200
#endif
14201
0
    store->error_depth = args->certIdx;
14202
0
    store->discardSessionCerts = 0;
14203
0
    store->domain = domain;
14204
0
    if (ssl != NULL) {
14205
0
        if (ssl->verifyCbCtx != NULL) {
14206
            /* Use the WOLFSSL user context if set */
14207
0
            store->userCtx = ssl->verifyCbCtx;
14208
0
        }
14209
0
        else {
14210
            /* Else use the WOLFSSL_CTX user context */
14211
0
            store->userCtx = ssl->ctx->verifyCbCtx;
14212
0
        }
14213
0
    }
14214
0
    else {
14215
0
        store->userCtx = cm;
14216
0
    }
14217
0
    store->certs = args->certs;
14218
0
    store->totalCerts = args->totalCerts;
14219
#if defined(HAVE_EX_DATA) && \
14220
    (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
14221
    if (wolfSSL_CRYPTO_set_ex_data(&store->ex_data, 0, ssl)
14222
            != WOLFSSL_SUCCESS) {
14223
        WOLFSSL_MSG("Failed to store ssl context in WOLFSSL_X509_STORE_CTX");
14224
    }
14225
#endif
14226
14227
0
    if (ssl != NULL) {
14228
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
14229
        store->store = SSL_STORE(ssl);
14230
#if defined(OPENSSL_EXTRA)
14231
        store->depth = args->count;
14232
        /* Overwrite with non-default param values in SSL */
14233
        if (ssl->param) {
14234
            if (ssl->param->check_time)
14235
                store->param->check_time = ssl->param->check_time;
14236
14237
            if (ssl->param->flags)
14238
                store->param->flags = ssl->param->flags;
14239
#ifdef WOLFSSL_LOCAL_X509_STORE
14240
            else if (SSL_STORE(ssl) && SSL_STORE(ssl)->param &&
14241
                    SSL_STORE(ssl)->param->flags)
14242
                store->param->flags = SSL_STORE(ssl)->param->flags;
14243
#endif
14244
14245
14246
            if (ssl->param->hostName[0])
14247
                XMEMCPY(store->param->hostName, ssl->param->hostName,
14248
                        WOLFSSL_HOST_NAME_MAX);
14249
14250
        }
14251
#endif /* defined(OPENSSL_EXTRA) */
14252
#endif /* defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)*/
14253
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
14254
    #ifdef KEEP_PEER_CERT
14255
        if (args->certIdx == 0) {
14256
            FreeX509(&ssl->peerCert);
14257
            InitX509(&ssl->peerCert, 0, ssl->heap);
14258
            if (CopyDecodedToX509(&ssl->peerCert, args->dCert) == 0)
14259
                WOLFSSL_MSG("Unable to copy to ssl->peerCert");
14260
            store->current_cert = &ssl->peerCert; /* use existing X509 */
14261
        }
14262
        else
14263
    #endif
14264
        {
14265
            x509 = wolfSSL_X509_new_ex(heap);
14266
            if (x509 == NULL)
14267
                goto mem_error;
14268
            if (CopyDecodedToX509(x509, args->dCert) == 0) {
14269
                store->current_cert = x509;
14270
                *x509Free = 1;
14271
            }
14272
            else {
14273
                goto mem_error;
14274
            }
14275
        }
14276
#endif
14277
#ifdef SESSION_CERTS
14278
        store->sesChain = &ssl->session->chain;
14279
#endif
14280
0
    }
14281
0
    *store_pt = store;
14282
0
    return 0;
14283
0
mem_error:
14284
0
    if (store != NULL)
14285
0
        wolfSSL_X509_STORE_CTX_free(store);
14286
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
14287
    if (x509 != NULL) {
14288
        wolfSSL_X509_free(x509);
14289
        x509 = NULL;
14290
    }
14291
#endif
14292
0
    XFREE(domain, heap, DYNAMIC_TYPE_STRING);
14293
0
    return MEMORY_E;
14294
0
}
14295
14296
void CleanupStoreCtxCallback(WOLFSSL_X509_STORE_CTX* store,
14297
        WOLFSSL* ssl, void* heap, int x509Free)
14298
0
{
14299
0
    (void)ssl;
14300
0
    (void)x509Free;
14301
14302
#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
14303
    wolfSSL_sk_X509_pop_free(store->chain, NULL);
14304
    store->chain = NULL;
14305
#endif
14306
#ifdef SESSION_CERTS
14307
    if ((ssl != NULL) && (store->discardSessionCerts)) {
14308
        WOLFSSL_MSG("Verify callback requested discard sess certs");
14309
        ssl->session->chain.count = 0;
14310
    #ifdef WOLFSSL_ALT_CERT_CHAINS
14311
        ssl->session->altChain.count = 0;
14312
    #endif
14313
    }
14314
#endif /* SESSION_CERTS */
14315
0
    XFREE(store->domain, heap, DYNAMIC_TYPE_STRING);
14316
0
    store->domain = NULL;
14317
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
14318
    if (x509Free)
14319
        wolfSSL_X509_free(store->current_cert);
14320
    store->current_cert = NULL;
14321
#endif
14322
0
    wolfSSL_X509_STORE_CTX_free(store);
14323
0
}
14324
14325
/* WOLFSSL_ALWAYS_VERIFY_CB: Use verify callback for success or failure cases */
14326
/* WOLFSSL_VERIFY_CB_ALL_CERTS: Issue callback for all intermediate certificates */
14327
14328
/* Callback is issued for certificate presented in TLS Certificate (11) packet.
14329
 * The intermediates are done first then peer leaf cert last. Use the
14330
 * store->error_depth member to determine index (0=peer, >1 intermediates)
14331
 */
14332
14333
int DoVerifyCallback(WOLFSSL_CERT_MANAGER* cm, WOLFSSL* ssl, int cert_err,
14334
                                                        ProcPeerCertArgs* args)
14335
0
{
14336
0
    int verify_ok = 0, use_cb = 0, ret = cert_err;
14337
0
    void *heap;
14338
14339
0
    if (cm == NULL) {
14340
0
        return BAD_FUNC_ARG;
14341
0
    }
14342
14343
0
    heap = (ssl != NULL) ? ssl->heap : cm->heap;
14344
14345
    /* Determine if verify was okay */
14346
0
    if (cert_err == 0) {
14347
0
        verify_ok = 1;
14348
0
    }
14349
14350
    /* Determine if verify callback should be used */
14351
0
    if (cert_err != 0) {
14352
0
        if ((ssl != NULL) && (!ssl->options.verifyNone)) {
14353
0
            use_cb = 1; /* always report errors */
14354
0
        }
14355
0
    }
14356
#ifdef WOLFSSL_ALWAYS_VERIFY_CB
14357
    /* always use verify callback on peer leaf cert */
14358
    if (args->certIdx == 0) {
14359
        use_cb = 1;
14360
    }
14361
#endif
14362
#ifdef WOLFSSL_VERIFY_CB_ALL_CERTS
14363
    /* perform verify callback on other intermediate certs (not just peer) */
14364
    if (args->certIdx > 0) {
14365
        use_cb = 1;
14366
    }
14367
#endif
14368
#if defined(OPENSSL_EXTRA)
14369
    /* Perform domain and IP check only for the leaf certificate */
14370
    if (args->certIdx == 0) {
14371
        /* perform domain name check on the peer certificate */
14372
        if (args->dCertInit && args->dCert && (ssl != NULL) &&
14373
                ssl->param && ssl->param->hostName[0]) {
14374
            /* If altNames names is present, then subject common name is ignored */
14375
            if (args->dCert->altNames != NULL) {
14376
                if (CheckForAltNames(args->dCert, ssl->param->hostName,
14377
                    (word32)XSTRLEN(ssl->param->hostName), NULL, 0) != 1) {
14378
                    if (cert_err == 0) {
14379
                        ret = DOMAIN_NAME_MISMATCH;
14380
                        WOLFSSL_ERROR_VERBOSE(ret);
14381
                    }
14382
                }
14383
            }
14384
        #ifndef WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY
14385
            else {
14386
                if (args->dCert->subjectCN) {
14387
                    if (MatchDomainName(
14388
                            args->dCert->subjectCN,
14389
                            args->dCert->subjectCNLen,
14390
                            ssl->param->hostName,
14391
                            (word32)XSTRLEN(ssl->param->hostName), 0) == 0) {
14392
                        if (cert_err == 0) {
14393
                            ret = DOMAIN_NAME_MISMATCH;
14394
                            WOLFSSL_ERROR_VERBOSE(ret);
14395
                        }
14396
                    }
14397
                }
14398
            }
14399
        #else
14400
            else {
14401
                if (cert_err == 0) {
14402
                    ret = DOMAIN_NAME_MISMATCH;
14403
                    WOLFSSL_ERROR_VERBOSE(ret);
14404
                }
14405
            }
14406
        #endif /* !WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY */
14407
        }
14408
14409
        /* perform IP address check on the peer certificate */
14410
        if ((args->dCertInit != 0) && (args->dCert != NULL) && (ssl != NULL) &&
14411
            (ssl->param != NULL) && (XSTRLEN(ssl->param->ipasc) > 0)) {
14412
            if (CheckIPAddr(args->dCert, ssl->param->ipasc) != 0) {
14413
                if (cert_err == 0) {
14414
                    ret = IPADDR_MISMATCH;
14415
                    WOLFSSL_ERROR_VERBOSE(ret);
14416
                }
14417
            }
14418
        }
14419
    }
14420
#endif
14421
    /* if verify callback has been set */
14422
0
    if ((use_cb && (ssl != NULL) && ((ssl->verifyCallback != NULL)
14423
    #ifdef OPENSSL_ALL
14424
        || (ssl->ctx->verifyCertCb != NULL)
14425
    #endif
14426
    #if defined(WOLFSSL_LOCAL_X509_STORE) && \
14427
        (defined(OPENSSL_ALL) || defined(WOLFSSL_QT))
14428
        || (SSL_STORE(ssl) != NULL && SSL_STORE(ssl)->verify_cb != NULL)
14429
    #endif
14430
0
        ))
14431
0
    #ifndef NO_WOLFSSL_CM_VERIFY
14432
0
        || (cm->verifyCallback != NULL)
14433
0
    #endif
14434
0
        ) {
14435
0
        int verifyFail = 0;
14436
0
        WOLFSSL_X509_STORE_CTX* store = NULL;
14437
0
        int x509Free = 0;
14438
0
        int setupRet = SetupStoreCtxCallback(&store, ssl, cm, args, cert_err,
14439
0
                heap, &x509Free);
14440
14441
0
        if (setupRet != 0)
14442
0
            return setupRet;
14443
14444
0
    #ifndef NO_WOLFSSL_CM_VERIFY
14445
        /* non-zero return code indicates failure override */
14446
0
        if (cm->verifyCallback != NULL) {
14447
0
            store->userCtx = cm;
14448
0
            if (cm->verifyCallback(verify_ok, store)) {
14449
0
                if (cert_err != 0) {
14450
0
                    WOLFSSL_MSG("Verify CM callback overriding error!");
14451
0
                    ret = 0;
14452
0
                }
14453
0
            }
14454
0
            else {
14455
0
                verifyFail = 1;
14456
0
            }
14457
0
        }
14458
0
    #endif
14459
14460
0
        if (ssl != NULL) {
14461
    #ifdef OPENSSL_ALL
14462
            /* non-zero return code indicates failure override */
14463
            if (ssl->ctx->verifyCertCb) {
14464
                if (ssl->ctx->verifyCertCb(store, ssl->ctx->verifyCertCbArg)) {
14465
                    if (cert_err != 0) {
14466
                        WOLFSSL_MSG("Verify Cert callback overriding error!");
14467
                        ret = 0;
14468
                    }
14469
                }
14470
                else {
14471
                    verifyFail = 1;
14472
                }
14473
            }
14474
    #endif
14475
            /* non-zero return code indicates failure override */
14476
0
            if (ssl->verifyCallback) {
14477
0
                if (ssl->verifyCallback(verify_ok, store)) {
14478
0
                    if (cert_err != 0) {
14479
0
                        WOLFSSL_MSG("Verify callback overriding error!");
14480
0
                        ret = 0;
14481
0
                    }
14482
0
                }
14483
0
                else {
14484
0
                    verifyFail = 1;
14485
0
                }
14486
0
            }
14487
#if defined(WOLFSSL_LOCAL_X509_STORE) && \
14488
    (defined(OPENSSL_ALL) || defined(WOLFSSL_QT))
14489
            if (SSL_STORE(ssl) != NULL && SSL_STORE(ssl)->verify_cb != NULL) {
14490
                if (SSL_STORE(ssl)->verify_cb(verify_ok, store)) {
14491
                    if (cert_err != 0) {
14492
                        WOLFSSL_MSG("Store Verify callback overriding error!");
14493
                        ret = 0;
14494
                    }
14495
                }
14496
                else {
14497
                    verifyFail = 1;
14498
                }
14499
            }
14500
#endif
14501
0
        }
14502
14503
0
        if (verifyFail) {
14504
            /* induce error if one not present */
14505
0
            if (cert_err == 0) {
14506
0
                ret = VERIFY_CERT_ERROR;
14507
0
                WOLFSSL_ERROR_VERBOSE(ret);
14508
0
            }
14509
14510
            /* mark as verify error */
14511
0
            args->verifyErr = 1;
14512
0
        }
14513
0
        CleanupStoreCtxCallback(store, ssl, heap, x509Free);
14514
0
    }
14515
14516
0
    (void)heap;
14517
14518
0
    return ret;
14519
0
}
14520
14521
#ifdef HAVE_CRL
14522
void DoCrlCallback(WOLFSSL_CERT_MANAGER* cm, WOLFSSL* ssl,
14523
        ProcPeerCertArgs* args, int* outRet)
14524
{
14525
#if defined(WOLFSSL_LOCAL_X509_STORE) && \
14526
    (defined(OPENSSL_ALL) || defined(WOLFSSL_QT))
14527
    int ret = 0;
14528
    void* heap = (ssl != NULL) ? ssl->heap : cm->heap;
14529
    WOLFSSL_X509_STORE* cert_store = (ssl != NULL) ? SSL_STORE(ssl) : NULL;
14530
14531
    if (cert_store != NULL && cert_store->get_crl_cb != NULL) {
14532
        WOLFSSL_CRL* userCrl = NULL;
14533
        WOLFSSL_X509_STORE_CTX* store = NULL;
14534
        int x509Free = 0;
14535
14536
        ret = SetupStoreCtxCallback(&store, ssl, cm, args, 0, heap,
14537
                &x509Free);
14538
        if (ret != 0) {
14539
            *outRet = ret;
14540
            return;
14541
        }
14542
14543
        ret = cert_store->get_crl_cb(store, &userCrl, store->current_cert);
14544
        if (ret == 1 && userCrl != NULL) {
14545
            /* Point to current cm to be able to verify CRL */
14546
            userCrl->cm = SSL_CM(ssl);
14547
            *outRet = CheckCertCRL(userCrl, args->dCert);
14548
        }
14549
        else
14550
            *outRet = CRL_MISSING;
14551
14552
        if (userCrl != NULL)
14553
            wolfSSL_X509_CRL_free(userCrl);
14554
        CleanupStoreCtxCallback(store, ssl, heap, x509Free);
14555
    }
14556
#else
14557
    (void)cm;
14558
    (void)ssl;
14559
    (void)args;
14560
    (void)outRet;
14561
#endif
14562
}
14563
#endif
14564
14565
static void FreeProcPeerCertArgs(WOLFSSL* ssl, void* pArgs)
14566
8.41k
{
14567
8.41k
    ProcPeerCertArgs* args = (ProcPeerCertArgs*)pArgs;
14568
14569
8.41k
    (void)ssl;
14570
14571
8.41k
    XFREE(args->certs, ssl->heap, DYNAMIC_TYPE_DER);
14572
8.41k
    args->certs = NULL;
14573
8.41k
#ifdef WOLFSSL_TLS13
14574
8.41k
    XFREE(args->exts, ssl->heap, DYNAMIC_TYPE_CERT_EXT);
14575
8.41k
    args->exts = NULL;
14576
8.41k
#endif
14577
8.41k
    if (args->dCert) {
14578
8.16k
        if (args->dCertInit) {
14579
7.55k
            FreeDecodedCert(args->dCert);
14580
7.55k
            args->dCertInit = 0;
14581
7.55k
        }
14582
8.16k
        XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
14583
8.16k
        args->dCert = NULL;
14584
8.16k
    }
14585
8.41k
}
14586
#if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
14587
    (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
14588
    !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) && \
14589
    !defined(NO_STDIO_FILESYSTEM)
14590
/* load certificate file which has the form <hash>.(r)N[0..N]       */
14591
/* in the folder.                                                   */
14592
/* (r), in the case of CRL file                                     */
14593
/* @param store  a pointer to X509_STORE structure                  */
14594
/* @param issuer a pointer to X509_NAME that presents an issuer     */
14595
/* @param type   X509_LU_X509 or X509_LU_CRL                        */
14596
/* @return WOLFSSL_SUCCESS on successful, otherwise WOLFSSL_FAILURE */
14597
int LoadCertByIssuer(WOLFSSL_X509_STORE* store, X509_NAME* issuer, int type)
14598
{
14599
    const int MAX_SUFFIX = 10;/* The number comes from CA_TABLE_SIZE=10 */
14600
    int ret = WOLFSSL_SUCCESS;
14601
    WOLFSSL_X509_LOOKUP* lookup;
14602
    WOLFSSL_BY_DIR_entry* entry;
14603
    WOLFSSL_BY_DIR_HASH   hash_tmp;
14604
    WOLFSSL_BY_DIR_HASH*  ph = NULL;
14605
    WOLFSSL_X509* x509;
14606
    unsigned long hash = 0;
14607
    char*   filename = NULL;
14608
    const char* post = "";
14609
    byte*   pbuf = NULL;
14610
    int     len, num, i, idx;
14611
    int    suffix = 0;
14612
    int retHash = NOT_COMPILED_IN;
14613
    byte dgt[WC_MAX_DIGEST_SIZE];
14614
14615
    WOLFSSL_ENTER("LoadCertByIssuer");
14616
14617
    /* sanity check */
14618
    if (store == NULL || issuer == NULL || (type != X509_LU_X509 && type != X509_LU_CRL)) {
14619
        return WOLFSSL_FAILURE;
14620
    }
14621
    lookup = &store->lookup;
14622
    if (lookup->dirs == NULL || lookup->type != 1) {
14623
        return WOLFSSL_FAILURE;
14624
    }
14625
14626
    len = wolfSSL_i2d_X509_NAME_canon(issuer, &pbuf);
14627
    if (len > 0) {
14628
    #if defined(NO_SHA) && !defined(NO_SHA256)
14629
        retHash = wc_Sha256Hash((const byte*)pbuf, len, dgt);
14630
    #elif !defined(NO_SHA)
14631
        retHash = wc_ShaHash((const byte*)pbuf, (word32)len, dgt);
14632
    #endif
14633
        if (retHash == 0) {
14634
            /* 4 bytes in little endian as unsigned long */
14635
            hash = (((unsigned long)dgt[3] << 24) |
14636
                    ((unsigned long)dgt[2] << 16) |
14637
                    ((unsigned long)dgt[1] <<  8) |
14638
                    ((unsigned long)dgt[0]));
14639
        } else {
14640
            WOLFSSL_MSG("failed hash operation");
14641
            return WOLFSSL_FAILURE;
14642
        }
14643
        wolfSSL_OPENSSL_free(pbuf);
14644
    }
14645
14646
    /* try to load each hashed name file in path */
14647
#if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
14648
14649
    if (type == X509_LU_CRL) {
14650
        post = "r";
14651
    }
14652
14653
    num = wolfSSL_sk_BY_DIR_entry_num(lookup->dirs->dir_entry);
14654
14655
    for (i=0; i<num; i++) {
14656
14657
        entry = wolfSSL_sk_BY_DIR_entry_value(lookup->dirs->dir_entry, i);
14658
14659
        if (type == X509_LU_CRL && entry->hashes != NULL &&
14660
            wolfSSL_sk_BY_DIR_HASH_num(entry->hashes) > 0) {
14661
            /* lock the list */
14662
            if (wc_LockMutex(&lookup->dirs->lock) != 0) {
14663
                WOLFSSL_MSG("wc_LockMutex cdir Lock error");
14664
                return BAD_MUTEX_E;
14665
            }
14666
14667
            hash_tmp.hash_value = hash;
14668
            idx = wolfSSL_sk_BY_DIR_HASH_find(entry->hashes, &hash_tmp);
14669
            if (idx >= 0) {
14670
                WOLFSSL_MSG("find hashed CRL in list");
14671
                ph = wolfSSL_sk_BY_DIR_HASH_value(entry->hashes, idx);
14672
                suffix = ph->last_suffix;
14673
            } else {
14674
                ph = NULL;
14675
                suffix = 0;
14676
            }
14677
14678
            wc_UnLockMutex(&lookup->dirs->lock);
14679
        }
14680
14681
        /* Additional buffer length for file name memory allocation :   */
14682
        /* / <hashvalue>.(r)N\0                                         */
14683
        /*|1|     8    |1|1|1|1|           => 13                        */
14684
        len = (int)XSTRLEN(entry->dir_name) + 13;
14685
        XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
14686
14687
        filename = (char*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
14688
        if (filename == NULL) {
14689
            WOLFSSL_MSG("memory allocation error");
14690
            return MEMORY_E;
14691
        }
14692
14693
        /* set as FAILURE, if successfully loading cert of CRL, this becomes */
14694
        /* WOLFSSL_SUCCESS                                                  */
14695
        ret = WOLFSSL_FAILURE;
14696
14697
        for (; suffix < MAX_SUFFIX; suffix++) {
14698
            /* /folder-path/<hash>.(r)N[0..9] */
14699
            if (XSNPRINTF(filename, (size_t)len, "%s/%08lx.%s%d", entry->dir_name,
14700
                                                       hash, post, suffix)
14701
                >= len)
14702
            {
14703
                WOLFSSL_MSG("buffer overrun in LoadCertByIssuer");
14704
                ret = BUFFER_E;
14705
                break;
14706
            }
14707
14708
            if(wc_FileExists(filename) == 0/*0 file exists */) {
14709
14710
                if (type == X509_LU_X509) {
14711
                    x509 = wolfSSL_X509_load_certificate_file(filename,
14712
                                                        WOLFSSL_FILETYPE_PEM);
14713
                    if (x509 != NULL) {
14714
                       ret = wolfSSL_X509_STORE_add_cert(store, x509);
14715
                       wolfSSL_X509_free(x509);
14716
                       x509 = NULL;
14717
                    } else {
14718
                       WOLFSSL_MSG("failed to load certificate");
14719
                       ret = WOLFSSL_FAILURE;
14720
                       break;
14721
                    }
14722
                }
14723
                else if (type == X509_LU_CRL) {
14724
#if defined(HAVE_CRL)
14725
                    ret = wolfSSL_X509_load_crl_file(&store->lookup, filename,
14726
                                                     entry->dir_type);
14727
                    if (ret != WOLFSSL_SUCCESS) {
14728
                        WOLFSSL_MSG("failed to load CRL");
14729
                        break;
14730
                    }
14731
#else
14732
                    WOLFSSL_MSG("CRL is not supported");
14733
                    ret = WOLFSSL_FAILURE;
14734
                    break;
14735
#endif /* HAVE_CRL  */
14736
                }
14737
            } else
14738
                break;
14739
        }
14740
14741
        if (ret != WOLFSSL_SUCCESS) {
14742
            WOLFSSL_MSG("not found file");
14743
            ret = WOLFSSL_FAILURE;
14744
        } else {
14745
            if (type == X509_LU_CRL) {
14746
                if (wc_LockMutex(&lookup->dirs->lock) != 0) {
14747
                    WOLFSSL_MSG("wc_LockMutex cdir Lock error");
14748
                    XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
14749
                    WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
14750
                    return BAD_MUTEX_E;
14751
                }
14752
                if (ph == NULL) {
14753
                    ph = wolfSSL_BY_DIR_HASH_new();
14754
                    if (ph == NULL) {
14755
                        WOLFSSL_MSG("failed to allocate hash stack");
14756
                        ret = WOLFSSL_FAILURE;
14757
                    } else {
14758
                        ph->hash_value = hash;
14759
                        ph->last_suffix = suffix;
14760
14761
                        ret = wolfSSL_sk_BY_DIR_HASH_push(entry->hashes, ph) > 0
14762
                                ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
14763
                    }
14764
                }
14765
                wc_UnLockMutex(&lookup->dirs->lock);
14766
            }
14767
        }
14768
14769
        XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
14770
        filename = NULL;
14771
    }
14772
#else
14773
    (void) type;
14774
    (void) ret;
14775
    (void) x509;
14776
    (void) filename;
14777
    (void) suffix;
14778
    (void) num;
14779
    (void) i;
14780
    ret = WOLFSSL_NOT_IMPLEMENTED;
14781
#endif
14782
    WOLFSSL_LEAVE("LoadCertByIssuer", ret);
14783
14784
    return ret;
14785
}
14786
#endif
14787
14788
14789
static int ProcessPeerCertParse(WOLFSSL* ssl, ProcPeerCertArgs* args,
14790
    int certType, int verify, byte** pSubjectHash, int* pAlreadySigner)
14791
0
{
14792
0
    int ret = 0;
14793
0
    buffer* cert;
14794
0
    byte* subjectHash = NULL;
14795
0
    int alreadySigner = 0;
14796
0
    Signer *extraSigners = NULL;
14797
#if defined(HAVE_RPK)
14798
    int cType;
14799
#endif
14800
#ifdef WOLFSSL_SMALL_CERT_VERIFY
14801
    int sigRet = 0;
14802
#endif
14803
14804
0
    if (ssl == NULL || args == NULL
14805
0
    #ifndef WOLFSSL_SMALL_CERT_VERIFY
14806
0
        || args->dCert == NULL
14807
0
    #endif
14808
0
    ) {
14809
0
        return BAD_FUNC_ARG;
14810
0
    }
14811
14812
0
PRAGMA_GCC_DIAG_PUSH
14813
0
PRAGMA_GCC("GCC diagnostic ignored \"-Wstrict-overflow\"")
14814
    /* Surrounded in gcc pragma to avoid -Werror=strict-overflow when the
14815
     * compiler optimizes out the check and assumes no underflow. Keeping the
14816
     * check in place to handle multiple build configurations and future
14817
     * changes. */
14818
14819
    /* check to make sure certificate index is valid */
14820
0
    if (args->certIdx > args->count)
14821
0
        return BUFFER_E;
14822
0
PRAGMA_GCC_DIAG_POP
14823
14824
    /* check if returning from non-blocking OCSP */
14825
    /* skip this section because cert is already initialized and parsed */
14826
#ifdef WOLFSSL_NONBLOCK_OCSP
14827
    if (args->lastErr == WC_NO_ERR_TRACE(OCSP_WANT_READ)) {
14828
        args->lastErr = 0; /* clear error */
14829
        return 0;
14830
    }
14831
#endif
14832
14833
#ifdef WOLFSSL_TRUST_PEER_CERT
14834
    /* we have trusted peer */
14835
    if (args->haveTrustPeer) {
14836
        return 0;
14837
    }
14838
#endif
14839
14840
    /* get certificate buffer */
14841
0
    cert = &args->certs[args->certIdx];
14842
14843
#ifdef WOLFSSL_SMALL_CERT_VERIFY
14844
    if (verify == VERIFY) {
14845
        /* for small cert verify, release decoded cert during signature check to
14846
            reduce peak memory usage */
14847
        if (args->dCert != NULL) {
14848
            if (args->dCertInit) {
14849
                FreeDecodedCert(args->dCert);
14850
                args->dCertInit = 0;
14851
            }
14852
            XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
14853
            args->dCert = NULL;
14854
        }
14855
14856
        /* perform cert parsing and signature check */
14857
        sigRet = wc_CheckCertSignature(cert->buffer, cert->length,
14858
                                         ssl->heap, SSL_CM(ssl));
14859
        /* fail on errors here after the ParseCertRelative call, so dCert is populated */
14860
14861
        /* verify name only in ParseCertRelative below, signature check done */
14862
        verify = VERIFY_NAME;
14863
    }
14864
#endif /* WOLFSSL_SMALL_CERT_VERIFY */
14865
14866
    /* make sure the decoded cert structure is allocated and initialized */
14867
0
    if (!args->dCertInit
14868
    #ifdef WOLFSSL_SMALL_CERT_VERIFY
14869
        || args->dCert == NULL
14870
    #endif
14871
0
    ) {
14872
    #ifdef WOLFSSL_SMALL_CERT_VERIFY
14873
        if (args->dCert == NULL) {
14874
            args->dCert = (DecodedCert*)XMALLOC(
14875
                                 sizeof(DecodedCert), ssl->heap,
14876
                                 DYNAMIC_TYPE_DCERT);
14877
            if (args->dCert == NULL) {
14878
                return MEMORY_E;
14879
            }
14880
        }
14881
    #endif
14882
14883
0
        InitDecodedCert(args->dCert, cert->buffer, cert->length, ssl->heap);
14884
14885
0
        args->dCertInit = 1;
14886
0
        args->dCert->sigCtx.devId = ssl->devId;
14887
    #ifdef WOLFSSL_ASYNC_CRYPT
14888
        args->dCert->sigCtx.asyncCtx = ssl;
14889
    #endif
14890
14891
    #ifdef HAVE_PK_CALLBACKS
14892
        /* setup the PK callback context */
14893
        ret = InitSigPkCb(ssl, &args->dCert->sigCtx);
14894
        if (ret != 0)
14895
            return ret;
14896
    #endif
14897
0
    }
14898
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
14899
    if (verify != NO_VERIFY && TLSX_CSR2_IsMulti(ssl->extensions)) {
14900
        extraSigners = TLSX_CSR2_GetPendingSigners(ssl->extensions);
14901
    }
14902
#endif
14903
    /* Parse Certificate */
14904
0
    ret = ParseCertRelative(args->dCert, certType, verify, SSL_CM(ssl), extraSigners);
14905
14906
#if defined(HAVE_RPK)
14907
    /* if cert type has negotiated with peer, confirm the cert received has
14908
     * the same type.
14909
     */
14910
    if (ret == 0 ) {
14911
        if (ssl->options.side ==  WOLFSSL_CLIENT_END) {
14912
            if (ssl->options.rpkState.received_ServerCertTypeCnt == 1) {
14913
                cType = ssl->options.rpkState.received_ServerCertTypes[0];
14914
                if ((cType == WOLFSSL_CERT_TYPE_RPK && !args->dCert->isRPK) ||
14915
                    (cType == WOLFSSL_CERT_TYPE_X509 && args->dCert->isRPK)) {
14916
                    /* cert type mismatch */
14917
                    WOLFSSL_MSG("unsupported certificate type received");
14918
                    ret = UNSUPPORTED_CERTIFICATE;
14919
                }
14920
            }
14921
        }
14922
        else if (ssl->options.side == WOLFSSL_SERVER_END) {
14923
            if (ssl->options.rpkState.received_ClientCertTypeCnt == 1) {
14924
                cType = ssl->options.rpkState.sending_ClientCertTypes[0];
14925
                if ((cType == WOLFSSL_CERT_TYPE_RPK && !args->dCert->isRPK) ||
14926
                    (cType == WOLFSSL_CERT_TYPE_X509 && args->dCert->isRPK)) {
14927
                    /* cert type mismatch */
14928
                    WOLFSSL_MSG("unsupported certificate type received");
14929
                    ret = UNSUPPORTED_CERTIFICATE;
14930
                }
14931
            }
14932
        }
14933
    }
14934
#endif /* HAVE_RPK */
14935
14936
    /* perform below checks for date failure cases */
14937
0
    if (ret == 0 ||
14938
0
        ret == WC_NO_ERR_TRACE(ASN_BEFORE_DATE_E) ||
14939
0
        ret == WC_NO_ERR_TRACE(ASN_AFTER_DATE_E)) {
14940
        /* get subject and determine if already loaded */
14941
0
    #ifndef NO_SKID
14942
0
        if (args->dCert->extAuthKeyIdSet)
14943
0
            subjectHash = args->dCert->extSubjKeyId;
14944
0
        else
14945
0
    #endif
14946
0
            subjectHash = args->dCert->subjectHash;
14947
0
        alreadySigner = AlreadySigner(SSL_CM(ssl), subjectHash);
14948
0
    }
14949
14950
#ifdef WOLFSSL_SMALL_CERT_VERIFY
14951
    /* get signature check failures from above */
14952
    if (ret == 0)
14953
        ret = sigRet;
14954
#endif
14955
14956
0
    if (pSubjectHash)
14957
0
        *pSubjectHash = subjectHash;
14958
0
    if (pAlreadySigner)
14959
0
        *pAlreadySigner = alreadySigner;
14960
14961
#ifdef WOLFSSL_ASYNC_CRYPT
14962
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
14963
        ret = wolfSSL_AsyncPush(ssl,
14964
            args->dCert->sigCtx.asyncDev);
14965
    }
14966
#endif
14967
14968
#if defined(WOLFSSL_PUBLIC_ASN) && defined(HAVE_PK_CALLBACKS)
14969
    /* This block gives the callback a chance to process the peer cert.
14970
     * If there is no callback set or it returns NOT_COMPILED_IN, then the
14971
     * original return code is returned. */
14972
    if (ssl->ctx && ssl->ctx->ProcessPeerCertCb) {
14973
        int new_ret = ssl->ctx->ProcessPeerCertCb(ssl, args->dCert);
14974
        if (new_ret != WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
14975
            ret = new_ret;
14976
        }
14977
    }
14978
#endif /* WOLFSSL_PUBLIC_ASN && HAVE_PK_CALLBACKS */
14979
14980
0
    return ret;
14981
0
}
14982
14983
/* Check key sizes for certs. Is redundant check since
14984
   ProcessBuffer also performs this check. */
14985
static int ProcessPeerCertCheckKey(WOLFSSL* ssl, ProcPeerCertArgs* args)
14986
104
{
14987
104
    int ret = 0;
14988
14989
104
    if (ssl->options.verifyNone) {
14990
104
        return ret;
14991
104
    }
14992
14993
0
    switch (args->dCert->keyOID) {
14994
0
    #ifndef NO_RSA
14995
0
        #ifdef WC_RSA_PSS
14996
0
        case RSAPSSk:
14997
0
        #endif
14998
0
        case RSAk:
14999
0
            if (ssl->options.minRsaKeySz < 0 ||
15000
0
                    args->dCert->pubKeySize <
15001
0
                     (word16)ssl->options.minRsaKeySz) {
15002
0
                WOLFSSL_MSG(
15003
0
                    "RSA key size in cert chain error");
15004
0
                ret = RSA_KEY_SIZE_E;
15005
0
                WOLFSSL_ERROR_VERBOSE(ret);
15006
0
            }
15007
0
            break;
15008
0
    #endif /* !NO_RSA */
15009
0
    #ifdef HAVE_ECC
15010
0
        case ECDSAk:
15011
0
            if (ssl->options.minEccKeySz < 0 ||
15012
0
                    args->dCert->pubKeySize <
15013
0
                     (word16)ssl->options.minEccKeySz) {
15014
0
                WOLFSSL_MSG(
15015
0
                    "ECC key size in cert chain error");
15016
0
                ret = ECC_KEY_SIZE_E;
15017
0
                WOLFSSL_ERROR_VERBOSE(ret);
15018
0
            }
15019
0
            break;
15020
0
    #endif /* HAVE_ECC */
15021
0
    #ifdef HAVE_ED25519
15022
0
        case ED25519k:
15023
0
            if (ssl->options.minEccKeySz < 0 ||
15024
0
                    ED25519_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
15025
0
                WOLFSSL_MSG(
15026
0
                    "ECC key size in cert chain error");
15027
0
                ret = ECC_KEY_SIZE_E;
15028
0
                WOLFSSL_ERROR_VERBOSE(ret);
15029
0
            }
15030
0
            break;
15031
0
    #endif /* HAVE_ED25519 */
15032
0
    #ifdef HAVE_ED448
15033
0
        case ED448k:
15034
0
            if (ssl->options.minEccKeySz < 0 ||
15035
0
                    ED448_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
15036
0
                WOLFSSL_MSG(
15037
0
                    "ECC key size in cert chain error");
15038
0
                ret = ECC_KEY_SIZE_E;
15039
0
                WOLFSSL_ERROR_VERBOSE(ret);
15040
0
            }
15041
0
            break;
15042
0
    #endif /* HAVE_ED448 */
15043
    #if defined(HAVE_FALCON)
15044
        case FALCON_LEVEL1k:
15045
            if (ssl->options.minFalconKeySz < 0 ||
15046
                FALCON_LEVEL1_KEY_SIZE < (word16)ssl->options.minFalconKeySz) {
15047
                WOLFSSL_MSG("Falcon key size in cert chain error");
15048
                ret = FALCON_KEY_SIZE_E;
15049
                WOLFSSL_ERROR_VERBOSE(ret);
15050
            }
15051
            break;
15052
        case FALCON_LEVEL5k:
15053
            if (ssl->options.minFalconKeySz < 0 ||
15054
                FALCON_LEVEL5_KEY_SIZE < (word16)ssl->options.minFalconKeySz) {
15055
                WOLFSSL_MSG("Falcon key size in cert chain error");
15056
                ret = FALCON_KEY_SIZE_E;
15057
                WOLFSSL_ERROR_VERBOSE(ret);
15058
            }
15059
            break;
15060
    #endif /* HAVE_FALCON */
15061
    #if defined(HAVE_DILITHIUM)
15062
        #ifdef WOLFSSL_DILITHIUM_FIPS204_DRAFT
15063
        case DILITHIUM_LEVEL2k:
15064
            if (ssl->options.minDilithiumKeySz < 0 ||
15065
                DILITHIUM_LEVEL2_KEY_SIZE
15066
                < (word16)ssl->options.minDilithiumKeySz) {
15067
                WOLFSSL_MSG("Dilithium key size in cert chain error");
15068
                ret = DILITHIUM_KEY_SIZE_E;
15069
            }
15070
            break;
15071
        case DILITHIUM_LEVEL3k:
15072
            if (ssl->options.minDilithiumKeySz < 0 ||
15073
                DILITHIUM_LEVEL3_KEY_SIZE
15074
                < (word16)ssl->options.minDilithiumKeySz) {
15075
                WOLFSSL_MSG( "Dilithium key size in cert chain error");
15076
                ret = DILITHIUM_KEY_SIZE_E;
15077
            }
15078
            break;
15079
        case DILITHIUM_LEVEL5k:
15080
            if (ssl->options.minDilithiumKeySz < 0 ||
15081
                DILITHIUM_LEVEL5_KEY_SIZE
15082
                < (word16)ssl->options.minDilithiumKeySz) {
15083
                WOLFSSL_MSG("Dilithium key size in cert chain error");
15084
                ret = DILITHIUM_KEY_SIZE_E;
15085
            }
15086
            break;
15087
        #endif /* WOLFSSL_DILITHIUM_FIPS204_DRAFT */
15088
        case ML_DSA_LEVEL2k:
15089
            if (ssl->options.minDilithiumKeySz < 0 ||
15090
                ML_DSA_LEVEL2_KEY_SIZE
15091
                < (word16)ssl->options.minDilithiumKeySz) {
15092
                WOLFSSL_MSG("Dilithium key size in cert chain error");
15093
                ret = DILITHIUM_KEY_SIZE_E;
15094
            }
15095
            break;
15096
        case ML_DSA_LEVEL3k:
15097
            if (ssl->options.minDilithiumKeySz < 0 ||
15098
                ML_DSA_LEVEL3_KEY_SIZE
15099
                < (word16)ssl->options.minDilithiumKeySz) {
15100
                WOLFSSL_MSG( "Dilithium key size in cert chain error");
15101
                ret = DILITHIUM_KEY_SIZE_E;
15102
            }
15103
            break;
15104
        case ML_DSA_LEVEL5k:
15105
            if (ssl->options.minDilithiumKeySz < 0 ||
15106
                ML_DSA_LEVEL5_KEY_SIZE
15107
                < (word16)ssl->options.minDilithiumKeySz) {
15108
                WOLFSSL_MSG("Dilithium key size in cert chain error");
15109
                ret = DILITHIUM_KEY_SIZE_E;
15110
            }
15111
            break;
15112
    #endif /* HAVE_DILITHIUM */
15113
0
        default:
15114
0
            WOLFSSL_MSG("Key size not checked");
15115
            /* key not being checked for size if not in
15116
               switch */
15117
0
            break;
15118
0
    }
15119
15120
0
    return ret;
15121
0
}
15122
15123
#if defined(HAVE_OCSP) && defined(WOLFSSL_TLS13) \
15124
        && defined(HAVE_CERTIFICATE_STATUS_REQUEST)
15125
static int ProcessPeerCertsChainOCSPStatusCheck(WOLFSSL* ssl)
15126
{
15127
    int ret = 0;
15128
    word32 i;
15129
    word32 idx = 0;
15130
    TLSX* ext =  TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
15131
    CertificateStatusRequest* csr;
15132
15133
    if (ext) {
15134
        csr = (CertificateStatusRequest*)ext->data;
15135
        if (csr == NULL) {
15136
            return 0;
15137
        }
15138
    } else
15139
        return 0;
15140
15141
    /* error when leaf cert doesn't have certificate status */
15142
    if (csr->requests < 1 || csr->responses[0].length == 0) {
15143
        WOLFSSL_MSG("Leaf cert doesn't have certificate status.");
15144
        return BAD_CERTIFICATE_STATUS_ERROR;
15145
    }
15146
15147
    for (i = 0; i < csr->requests; i++) {
15148
        if (csr->responses[i].length != 0) {
15149
            ssl->status_request = 1;
15150
            idx = 0;
15151
            ret = ProcessCSR_ex(ssl,
15152
                    csr->responses[i].buffer,
15153
                    &idx, csr->responses[i].length, i);
15154
            if (ret < 0) {
15155
                WOLFSSL_ERROR_VERBOSE(ret);
15156
                break;
15157
            }
15158
        }
15159
        else {
15160
            WOLFSSL_MSG("Intermediate cert doesn't have certificate status.");
15161
        }
15162
    }
15163
15164
    return ret;
15165
}
15166
15167
#endif
15168
15169
#ifdef HAVE_CRL
15170
static int ProcessPeerCertsChainCRLCheck(WOLFSSL* ssl, ProcPeerCertArgs* args)
15171
{
15172
    Signer* prev = NULL;
15173
    int ret = 0;
15174
    WOLFSSL_CERT_MANAGER* cm = SSL_CM(ssl);
15175
    Signer* ca = args->dCert->ca;
15176
    /* End loop if no more issuers found or if we have
15177
     * found a self signed cert (ca == prev) */
15178
    for (; ret == 0 && ca != NULL && ca != prev;
15179
            prev = ca, ca = GetCAByName(cm, ca->issuerNameHash)) {
15180
        ret = CheckCertCRL_ex(cm->crl, ca->issuerNameHash, NULL, 0,
15181
                ca->serialHash, NULL, 0, NULL);
15182
        if (ret != 0)
15183
            DoCrlCallback(cm, ssl, args, &ret);
15184
        if (ret != 0){
15185
            WOLFSSL_ERROR_VERBOSE(ret);
15186
            WOLFSSL_MSG("\tCRL check not ok");
15187
            break;
15188
        }
15189
    }
15190
    return ret;
15191
}
15192
#endif
15193
15194
#ifdef OPENSSL_EXTRA
15195
/* account for verify params flag set */
15196
static int AdjustCMForParams(WOLFSSL* ssl)
15197
{
15198
    int flags;
15199
    WOLFSSL_X509_VERIFY_PARAM* param;
15200
15201
    param = wolfSSL_get0_param(ssl);
15202
    flags = wolfSSL_X509_VERIFY_PARAM_get_flags(param);
15203
15204
    /* For now there is a possible contradiction of PARAM flags and store flags.
15205
     * Do not disable CRL support if it has already been enabled with store. */
15206
    if (flags == 0) {
15207
        return WOLFSSL_SUCCESS;
15208
    }
15209
    return wolfSSL_X509_STORE_set_flags(SSL_STORE(ssl), flags);
15210
}
15211
#endif
15212
15213
int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx,
15214
                     word32 totalSz)
15215
{
15216
    int ret = 0;
15217
#if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
15218
    ProcPeerCertArgs* args = NULL;
15219
    WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
15220
#elif defined(WOLFSSL_SMALL_STACK)
15221
    ProcPeerCertArgs* args = NULL;
15222
#else
15223
    ProcPeerCertArgs  args[1];
15224
#endif
15225
    byte* subjectHash = NULL;
15226
    int alreadySigner = 0;
15227
15228
#if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
15229
    int addToPendingCAs = 0;
15230
#endif
15231
    WOLFSSL_ENTER("ProcessPeerCerts");
15232
15233
#if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
15234
    if (ssl->async == NULL) {
15235
        ssl->async = (struct WOLFSSL_ASYNC*)
15236
                XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
15237
                        DYNAMIC_TYPE_ASYNC);
15238
        if (ssl->async == NULL)
15239
            ERROR_OUT(MEMORY_E, exit_ppc);
15240
    }
15241
    args = (ProcPeerCertArgs*)ssl->async->args;
15242
#ifdef WOLFSSL_ASYNC_CRYPT
15243
    ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
15244
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
15245
        /* Check for error */
15246
        if (ret < 0)
15247
            goto exit_ppc;
15248
    }
15249
    else
15250
#endif /* WOLFSSL_ASYNC_CRYPT */
15251
#ifdef WOLFSSL_NONBLOCK_OCSP
15252
    if (ssl->error == WC_NO_ERR_TRACE(OCSP_WANT_READ)) {
15253
        /* Re-entry after non-blocking OCSP */
15254
    #ifdef WOLFSSL_ASYNC_CRYPT
15255
        /* if async operations not pending, reset error code */
15256
        if (ret == WC_NO_ERR_TRACE(WC_NO_PENDING_E))
15257
            ret = 0;
15258
    #endif
15259
    }
15260
    else
15261
#endif /* WOLFSSL_NONBLOCK_OCSP */
15262
#elif defined(WOLFSSL_SMALL_STACK)
15263
    args = (ProcPeerCertArgs*)XMALLOC(
15264
        sizeof(ProcPeerCertArgs), ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15265
    if (args == NULL) {
15266
        ERROR_OUT(MEMORY_E, exit_ppc);
15267
    }
15268
#endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
15269
    {
15270
        /* Reset state */
15271
        ret = 0;
15272
        ssl->options.asyncState = TLS_ASYNC_BEGIN;
15273
        XMEMSET(args, 0, sizeof(ProcPeerCertArgs));
15274
        args->idx = *inOutIdx;
15275
        args->begin = *inOutIdx;
15276
    #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
15277
        ssl->async->freeArgs = FreeProcPeerCertArgs;
15278
    #endif
15279
    }
15280
15281
#ifdef OPENSSL_EXTRA
15282
    /* account for verify params flag set */
15283
    if (AdjustCMForParams(ssl) != WOLFSSL_SUCCESS) {
15284
        WOLFSSL_MSG("Issue with updating store flags from PARAMS set");
15285
        ERROR_OUT(WOLFSSL_FAILURE, exit_ppc);
15286
    }
15287
#endif
15288
15289
    switch (ssl->options.asyncState)
15290
    {
15291
        case TLS_ASYNC_BEGIN:
15292
        {
15293
            word32 listSz;
15294
15295
        #ifdef WOLFSSL_CALLBACKS
15296
            if (ssl->hsInfoOn)
15297
                AddPacketName(ssl, "Certificate");
15298
            if (ssl->toInfoOn)
15299
                AddLateName("Certificate", &ssl->timeoutInfo);
15300
        #endif
15301
15302
        #ifdef WOLFSSL_TLS13
15303
            if (ssl->options.tls1_3) {
15304
                byte ctxSz;
15305
15306
                /* Certificate Request Context */
15307
                if ((args->idx - args->begin) + OPAQUE8_LEN > totalSz)
15308
                    ERROR_OUT(BUFFER_ERROR, exit_ppc);
15309
                ctxSz = *(input + args->idx);
15310
                args->idx++;
15311
                if ((args->idx - args->begin) + ctxSz > totalSz)
15312
                    ERROR_OUT(BUFFER_ERROR, exit_ppc);
15313
            #ifndef NO_WOLFSSL_CLIENT
15314
                /* Must be empty when received from server. */
15315
                if (ssl->options.side == WOLFSSL_CLIENT_END) {
15316
                    if (ctxSz != 0) {
15317
                        WOLFSSL_ERROR_VERBOSE(INVALID_CERT_CTX_E);
15318
                        ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
15319
                    }
15320
                }
15321
            #endif
15322
            #ifndef NO_WOLFSSL_SERVER
15323
                /* Must contain value sent in request. */
15324
                if (ssl->options.side == WOLFSSL_SERVER_END) {
15325
                    if (ssl->options.handShakeState != HANDSHAKE_DONE &&
15326
                                                                   ctxSz != 0) {
15327
                        WOLFSSL_ERROR_VERBOSE(INVALID_CERT_CTX_E);
15328
                        ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
15329
                    }
15330
                    else if (ssl->options.handShakeState == HANDSHAKE_DONE) {
15331
                #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
15332
                         CertReqCtx* curr = ssl->certReqCtx;
15333
                         CertReqCtx* prev = NULL;
15334
                         while (curr != NULL) {
15335
                             if ((ctxSz == curr->len) &&
15336
                                 XMEMCMP(&curr->ctx, input + args->idx, ctxSz)
15337
                                                                         == 0) {
15338
                                     if (prev != NULL)
15339
                                         prev->next = curr->next;
15340
                                     else
15341
                                         ssl->certReqCtx = curr->next;
15342
                                     XFREE(curr, ssl->heap,
15343
                                           DYNAMIC_TYPE_TMP_BUFFER);
15344
                                     break;
15345
                             }
15346
                             prev = curr;
15347
                             curr = curr->next;
15348
                        }
15349
                        if (curr == NULL)
15350
                #endif
15351
                        {
15352
                            WOLFSSL_ERROR_VERBOSE(INVALID_CERT_CTX_E);
15353
                            ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
15354
                        }
15355
                    }
15356
                }
15357
            #endif
15358
                args->idx += ctxSz;
15359
15360
                /* allocate buffer for cert extensions */
15361
                args->exts = (buffer*)XMALLOC(sizeof(buffer) *
15362
                     MAX_CHAIN_DEPTH, ssl->heap, DYNAMIC_TYPE_CERT_EXT);
15363
                if (args->exts == NULL) {
15364
                    ERROR_OUT(MEMORY_E, exit_ppc);
15365
                }
15366
            }
15367
        #endif
15368
15369
            /* allocate buffer for certs */
15370
            args->certs = (buffer*)XMALLOC(sizeof(buffer) * MAX_CHAIN_DEPTH,
15371
                                            ssl->heap, DYNAMIC_TYPE_DER);
15372
            if (args->certs == NULL) {
15373
                ERROR_OUT(MEMORY_E, exit_ppc);
15374
            }
15375
            XMEMSET(args->certs, 0, sizeof(buffer) * MAX_CHAIN_DEPTH);
15376
15377
            /* Certificate List */
15378
            if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
15379
                ERROR_OUT(BUFFER_ERROR, exit_ppc);
15380
            }
15381
            c24to32(input + args->idx, &listSz);
15382
#ifdef HAVE_RPK
15383
            /*
15384
             * If this is RPK from the peer, then single cert (if TLS1.2).
15385
             * So, ListSz location is same as CertSz location, so fake
15386
             * we have just seen this ListSz.
15387
             */
15388
            if (!IsAtLeastTLSv1_3(ssl->version) &&
15389
                ((ssl->options.side == WOLFSSL_SERVER_END &&
15390
                  ssl->options.rpkState.received_ClientCertTypeCnt == 1 &&
15391
                  ssl->options.rpkState.received_ClientCertTypes[0] == WOLFSSL_CERT_TYPE_RPK) ||
15392
                 (ssl->options.side == WOLFSSL_CLIENT_END &&
15393
                  ssl->options.rpkState.received_ServerCertTypeCnt == 1 &&
15394
                  ssl->options.rpkState.received_ServerCertTypes[0] == WOLFSSL_CERT_TYPE_RPK))) {
15395
                listSz += OPAQUE24_LEN;
15396
            } else
15397
#endif /* HAVE_RPK */
15398
            {
15399
                args->idx += OPAQUE24_LEN;
15400
            }
15401
            if (listSz > MAX_CERTIFICATE_SZ) {
15402
                ERROR_OUT(BUFFER_ERROR, exit_ppc);
15403
            }
15404
            if ((args->idx - args->begin) + listSz != totalSz) {
15405
                ERROR_OUT(BUFFER_ERROR, exit_ppc);
15406
            }
15407
15408
            WOLFSSL_MSG("Loading peer's cert chain");
15409
            /* first put cert chain into buffer so can verify top down
15410
               we're sent bottom up */
15411
            while (listSz) {
15412
                word32 certSz;
15413
15414
15415
            #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
15416
                if (args->totalCerts >= MAX_CHAIN_DEPTH) {
15417
                    if (ssl->peerVerifyRet == 0) /* Return first cert error here */
15418
                        ssl->peerVerifyRet =
15419
                                        WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG;
15420
                    ret = MAX_CHAIN_ERROR;
15421
                    WOLFSSL_ERROR_VERBOSE(ret);
15422
                    WOLFSSL_MSG("Too many certs for MAX_CHAIN_DEPTH");
15423
                    break; /* break out to avoid reading more certs then buffer
15424
                            * can hold */
15425
                }
15426
            #else
15427
                if (args->totalCerts >= ssl->verifyDepth ||
15428
                        args->totalCerts >= MAX_CHAIN_DEPTH) {
15429
                    WOLFSSL_ERROR_VERBOSE(MAX_CHAIN_ERROR);
15430
                    ERROR_OUT(MAX_CHAIN_ERROR, exit_ppc);
15431
                }
15432
            #endif
15433
15434
                if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
15435
                    ERROR_OUT(BUFFER_ERROR, exit_ppc);
15436
                }
15437
15438
                c24to32(input + args->idx, &certSz);
15439
                args->idx += OPAQUE24_LEN;
15440
15441
                if ((args->idx - args->begin) + certSz > totalSz) {
15442
                    ERROR_OUT(BUFFER_ERROR, exit_ppc);
15443
                }
15444
15445
                args->certs[args->totalCerts].length = certSz;
15446
                args->certs[args->totalCerts].buffer = input + args->idx;
15447
15448
            #ifdef SESSION_CERTS
15449
                AddSessionCertToChain(&ssl->session->chain,
15450
                    input + args->idx, certSz);
15451
            #endif /* SESSION_CERTS */
15452
15453
                args->idx += certSz;
15454
                listSz -= certSz + CERT_HEADER_SZ;
15455
15456
            #ifdef WOLFSSL_TLS13
15457
                /* Extensions */
15458
                if (ssl->options.tls1_3) {
15459
                    word16 extSz;
15460
15461
                    if (args->exts == NULL) {
15462
                        ERROR_OUT(BUFFER_ERROR, exit_ppc);
15463
                    }
15464
                    if ((args->idx - args->begin) + OPAQUE16_LEN > totalSz) {
15465
                        ERROR_OUT(BUFFER_ERROR, exit_ppc);
15466
                    }
15467
                    ato16(input + args->idx, &extSz);
15468
                    args->idx += OPAQUE16_LEN;
15469
                    if ((args->idx - args->begin) + extSz > totalSz) {
15470
                        ERROR_OUT(BUFFER_ERROR, exit_ppc);
15471
                    }
15472
                    /* Store extension data info for later processing. */
15473
                    args->exts[args->totalCerts].length = extSz;
15474
                    args->exts[args->totalCerts].buffer = input + args->idx;
15475
                    args->idx += extSz;
15476
                    listSz -= extSz + OPAQUE16_LEN;
15477
                    WOLFSSL_MSG_EX("\tParsing %d bytes of cert extensions",
15478
                        args->exts[args->totalCerts].length);
15479
                    #if !defined(NO_TLS)
15480
                    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST)
15481
                    ssl->response_idx = args->totalCerts;
15482
                    #endif
15483
                    ret = TLSX_Parse(ssl, args->exts[args->totalCerts].buffer,
15484
                        (word16)args->exts[args->totalCerts].length,
15485
                        certificate, NULL);
15486
                    #endif /* !NO_TLS */
15487
                    if (ret < 0) {
15488
                        WOLFSSL_ERROR_VERBOSE(ret);
15489
                        ERROR_OUT(ret, exit_ppc);
15490
                    }
15491
                }
15492
            #endif
15493
15494
                args->totalCerts++;
15495
                WOLFSSL_MSG("\tPut another cert into chain");
15496
            } /* while (listSz) */
15497
15498
            args->count = args->totalCerts;
15499
            args->certIdx = 0; /* select peer cert (first one) */
15500
15501
            if (args->count == 0) {
15502
                /* Empty certificate message. */
15503
                if ((ssl->options.side == WOLFSSL_SERVER_END) &&
15504
                    (ssl->options.mutualAuth || (ssl->options.failNoCert &&
15505
                                             IsAtLeastTLSv1_3(ssl->version)))) {
15506
                    WOLFSSL_MSG("No peer cert from Client");
15507
                    ret = NO_PEER_CERT;
15508
                    WOLFSSL_ERROR_VERBOSE(ret);
15509
                    DoCertFatalAlert(ssl, ret);
15510
                }
15511
                else if ((ssl->options.side == WOLFSSL_CLIENT_END) &&
15512
                         IsAtLeastTLSv1_3(ssl->version)) {
15513
                    WOLFSSL_MSG("No peer cert from Server");
15514
                    ret = NO_PEER_CERT;
15515
                    WOLFSSL_ERROR_VERBOSE(ret);
15516
                    SendAlert(ssl, alert_fatal, decode_error);
15517
                }
15518
            }
15519
15520
            args->dCertInit = 0;
15521
        #ifndef WOLFSSL_SMALL_CERT_VERIFY
15522
            args->dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
15523
                                                       DYNAMIC_TYPE_DCERT);
15524
            if (args->dCert == NULL) {
15525
                ERROR_OUT(MEMORY_E, exit_ppc);
15526
            }
15527
            XMEMSET(args->dCert, 0, sizeof(DecodedCert));
15528
        #endif
15529
15530
            /* Advance state and proceed */
15531
            ssl->options.asyncState = TLS_ASYNC_BUILD;
15532
        } /* case TLS_ASYNC_BEGIN */
15533
        FALL_THROUGH;
15534
15535
        case TLS_ASYNC_BUILD:
15536
        {
15537
            if (args->count > 0) {
15538
15539
                /* check for trusted peer and get untrustedDepth */
15540
            #if defined(WOLFSSL_TRUST_PEER_CERT) || defined(OPENSSL_EXTRA)
15541
                if (args->certIdx == 0) {
15542
                #ifdef WOLFSSL_TRUST_PEER_CERT
15543
                    TrustedPeerCert* tp;
15544
                #endif
15545
15546
                    ret = ProcessPeerCertParse(ssl, args, CERT_TYPE, NO_VERIFY,
15547
                        &subjectHash, &alreadySigner);
15548
                    if (ret != 0)
15549
                        goto exit_ppc;
15550
15551
                #ifdef OPENSSL_EXTRA
15552
                    /* Determine untrusted depth */
15553
                    if (!alreadySigner && (!args->dCert ||
15554
                            !args->dCertInit || !args->dCert->selfSigned)) {
15555
                        args->untrustedDepth = 1;
15556
                    }
15557
                #endif
15558
15559
                #ifdef WOLFSSL_TRUST_PEER_CERT
15560
                    tp = GetTrustedPeer(SSL_CM(ssl), args->dCert);
15561
                    WOLFSSL_MSG("Checking for trusted peer cert");
15562
15563
                    if (tp && MatchTrustedPeer(tp, args->dCert)) {
15564
                        WOLFSSL_MSG("Found matching trusted peer cert");
15565
                        args->haveTrustPeer = 1;
15566
                    }
15567
                    else if (tp == NULL) {
15568
                        /* no trusted peer cert */
15569
                        WOLFSSL_MSG("No matching trusted peer cert. Checking CAs");
15570
                    }
15571
                    else {
15572
                        WOLFSSL_MSG("Trusted peer cert did not match!");
15573
                    }
15574
                    if (!args->haveTrustPeer)
15575
                #endif
15576
                    {
15577
                        /* free cert if not trusted peer */
15578
                        FreeDecodedCert(args->dCert);
15579
                        args->dCertInit = 0;
15580
                    }
15581
                }
15582
            #endif /* WOLFSSL_TRUST_PEER_CERT || OPENSSL_EXTRA */
15583
15584
                /* check certificate up to peer's first */
15585
                /* do not verify chain if trusted peer cert found */
15586
                while (args->count > 1
15587
                #ifdef WOLFSSL_TRUST_PEER_CERT
15588
                    && !args->haveTrustPeer
15589
                #endif /* WOLFSSL_TRUST_PEER_CERT */
15590
                ) {
15591
                    int skipAddCA = 0;
15592
15593
                    /* select last certificate */
15594
                    args->certIdx = args->count - 1;
15595
15596
                    ret = ProcessPeerCertParse(ssl, args, CHAIN_CERT_TYPE,
15597
                        !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
15598
                        &subjectHash, &alreadySigner);
15599
#if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
15600
    (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
15601
    !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) && \
15602
    !defined(NO_STDIO_FILESYSTEM)
15603
                    if (ret == WC_NO_ERR_TRACE(ASN_NO_SIGNER_E) ||
15604
                        ret == WC_NO_ERR_TRACE(ASN_SELF_SIGNED_E)) {
15605
                        WOLFSSL_MSG("try to load certificate if hash dir is set");
15606
                        ret = LoadCertByIssuer(SSL_STORE(ssl),
15607
                           (WOLFSSL_X509_NAME*)args->dCert->issuerName,
15608
                                                          X509_LU_X509);
15609
                        if (ret == WOLFSSL_SUCCESS) {
15610
                            FreeDecodedCert(args->dCert);
15611
                            args->dCertInit = 0;
15612
                            /* once again */
15613
                            ret = ProcessPeerCertParse(ssl, args, CHAIN_CERT_TYPE,
15614
                                !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
15615
                                &subjectHash, &alreadySigner);
15616
                        }
15617
                        else {
15618
                            ret = ASN_NO_SIGNER_E;
15619
                            WOLFSSL_ERROR_VERBOSE(ret);
15620
                        }
15621
                    }
15622
#endif
15623
                #ifdef WOLFSSL_ASYNC_CRYPT
15624
                    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
15625
                        goto exit_ppc;
15626
                #endif
15627
                    if (ret == 0) {
15628
                        ret = ProcessPeerCertCheckKey(ssl, args);
15629
                    }
15630
                    else if (ret == WC_NO_ERR_TRACE(ASN_PARSE_E) ||
15631
                             ret == WC_NO_ERR_TRACE(BUFFER_E) ||
15632
                             ret == WC_NO_ERR_TRACE(MEMORY_E)) {
15633
                        WOLFSSL_MSG(
15634
                            "Got Peer cert ASN PARSE_E, BUFFER E, MEMORY_E");
15635
                        ERROR_OUT(ret, exit_ppc);
15636
                    }
15637
15638
                    if (ret == 0 && args->dCert->isCA == 0) {
15639
                        WOLFSSL_MSG("Chain cert is not a CA, not adding as one");
15640
                    }
15641
                    else if (ret == 0 && ssl->options.verifyNone) {
15642
                        WOLFSSL_MSG("Chain cert not verified by option, "
15643
                            "not adding as CA");
15644
                    }
15645
                    else if (ret == 0) {
15646
                    #ifdef OPENSSL_EXTRA
15647
                        if (args->certIdx > args->untrustedDepth) {
15648
                            args->untrustedDepth = (char)args->certIdx + 1;
15649
                        }
15650
                    #endif
15651
15652
                        if (alreadySigner) {
15653
                            WOLFSSL_MSG("Verified CA from chain and already had it");
15654
                        }
15655
                    }
15656
                    else {
15657
                        WOLFSSL_MSG("Failed to verify CA from chain");
15658
                    #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
15659
                        if (ssl->peerVerifyRet == 0) /* Return first cert error here */
15660
                            ssl->peerVerifyRet = WOLFSSL_X509_V_ERR_INVALID_CA;
15661
                    #endif
15662
                    }
15663
15664
                    if (ret == 0) {
15665
                #ifdef HAVE_OCSP
15666
                    #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
15667
                        addToPendingCAs = 0;
15668
                        if (ssl->options.side == WOLFSSL_CLIENT_END &&
15669
                            ssl->status_request_v2 &&
15670
                            TLSX_CSR2_IsMulti(ssl->extensions)) {
15671
                            ret = TLSX_CSR2_InitRequests(ssl->extensions,
15672
                                                    args->dCert, 0, ssl->heap);
15673
                            addToPendingCAs = 1;
15674
                        }
15675
                        else /* skips OCSP and force CRL check */
15676
                    #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
15677
                    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST)
15678
                        if (IsAtLeastTLSv1_3(ssl->version) &&
15679
                            ssl->options.side == WOLFSSL_CLIENT_END &&
15680
                            ssl->status_request) {
15681
                            /* We check CSR in Certificate message sent from
15682
                             * Server. Server side will check client
15683
                             * certificates by traditional OCSP if enabled
15684
                             */
15685
                            ret = TLSX_CSR_InitRequest_ex(ssl->extensions,
15686
                                    args->dCert, ssl->heap, args->certIdx);
15687
                        }
15688
                        else
15689
                    #endif
15690
                        if (SSL_CM(ssl)->ocspEnabled &&
15691
                                            SSL_CM(ssl)->ocspCheckAll) {
15692
                            WOLFSSL_MSG("Doing Non Leaf OCSP check");
15693
                            ret = CheckCertOCSP_ex(SSL_CM(ssl)->ocsp,
15694
                                                    args->dCert, ssl);
15695
                        #ifdef WOLFSSL_NONBLOCK_OCSP
15696
                            if (ret == WC_NO_ERR_TRACE(OCSP_WANT_READ)) {
15697
                                args->lastErr = ret;
15698
                                goto exit_ppc;
15699
                            }
15700
                        #endif
15701
                            if (ret != 0) {
15702
                                WOLFSSL_ERROR_VERBOSE(ret);
15703
                                WOLFSSL_MSG("\tOCSP Lookup not ok");
15704
                            }
15705
                        }
15706
                #endif /* HAVE_OCSP */
15707
15708
                #ifdef HAVE_CRL
15709
                        if (SSL_CM(ssl)->crlEnabled &&
15710
                                SSL_CM(ssl)->crlCheckAll) {
15711
                            int doCrlLookup = 1;
15712
15713
                        #ifdef HAVE_OCSP
15714
                            if (SSL_CM(ssl)->ocspEnabled &&
15715
                                    SSL_CM(ssl)->ocspCheckAll) {
15716
                                /* If the cert status is unknown to the OCSP
15717
                                   responder, do a CRL lookup. If any other
15718
                                   error, skip the CRL lookup and fail the
15719
                                   certificate. */
15720
                                doCrlLookup = (ret == WC_NO_ERR_TRACE(OCSP_CERT_UNKNOWN));
15721
                            }
15722
                        #endif /* HAVE_OCSP */
15723
15724
                            if (doCrlLookup) {
15725
                                WOLFSSL_MSG("Doing Non Leaf CRL check");
15726
                                ret = CheckCertCRL(SSL_CM(ssl)->crl,
15727
                                        args->dCert);
15728
                            #ifdef WOLFSSL_NONBLOCK_OCSP
15729
                                /* The CRL lookup I/O callback is using the
15730
                                 * same WOULD_BLOCK error code as OCSP's I/O
15731
                                 * callback, and it is enabling it using the
15732
                                 * same flag. */
15733
                                if (ret == WC_NO_ERR_TRACE(OCSP_WANT_READ)) {
15734
                                    args->lastErr = ret;
15735
                                    goto exit_ppc;
15736
                                }
15737
                            #endif
15738
                                if (ret != 0)
15739
                                    DoCrlCallback(SSL_CM(ssl), ssl, args, &ret);
15740
                                if (ret != 0) {
15741
                                    WOLFSSL_ERROR_VERBOSE(ret);
15742
                                    WOLFSSL_MSG("\tCRL check not ok");
15743
                                }
15744
                                if (ret == 0 &&
15745
                                        args->certIdx == args->totalCerts-1) {
15746
                                    ret = ProcessPeerCertsChainCRLCheck(ssl,
15747
                                            args);
15748
                                    if (ret != 0) {
15749
                                        WOLFSSL_ERROR_VERBOSE(ret);
15750
                                        WOLFSSL_MSG("\tCRL chain check not ok");
15751
                                        args->fatal = 0;
15752
                                    }
15753
                                }
15754
                            }
15755
                        }
15756
                #endif /* HAVE_CRL */
15757
                    }
15758
            #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
15759
                    if (ret == 0 &&
15760
                        /* extend the limit "+1" until reaching
15761
                         * an ultimately trusted issuer.*/
15762
                        args->count > (ssl->verifyDepth + 1)) {
15763
                        if (ssl->peerVerifyRet == 0) /* Return first cert error here */
15764
                            ssl->peerVerifyRet =
15765
                                         WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG;
15766
                        ret = MAX_CHAIN_ERROR;
15767
                        WOLFSSL_ERROR_VERBOSE(ret);
15768
                    }
15769
            #endif
15770
                #ifdef WOLFSSL_ALT_CERT_CHAINS
15771
                    /* For alternate cert chain, its okay for a CA cert to fail
15772
                        with ASN_NO_SIGNER_E here. The "alternate" certificate
15773
                        chain mode only requires that the peer certificate
15774
                        validate to a trusted CA */
15775
                    if (ret != 0 && args->dCert->isCA) {
15776
                        if (ret == WC_NO_ERR_TRACE(ASN_NO_SIGNER_E) ||
15777
                            ret == WC_NO_ERR_TRACE(ASN_SELF_SIGNED_E)) {
15778
                            if (!ssl->options.usingAltCertChain) {
15779
                                WOLFSSL_MSG("Trying alternate cert chain");
15780
                                ssl->options.usingAltCertChain = 1;
15781
                            }
15782
15783
                            ret = 0; /* clear errors and continue */
15784
                    #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
15785
                            ssl->peerVerifyRet = 0;
15786
                    #endif
15787
                            args->verifyErr = 0;
15788
15789
                            /* do not add to certificate manager */
15790
                            skipAddCA = 1;
15791
                        }
15792
                    }
15793
                #endif /* WOLFSSL_ALT_CERT_CHAINS */
15794
15795
                #if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS)
15796
                    /* If we are using native Apple CA validation, it is okay
15797
                     * for a CA cert to fail validation here, as we will verify
15798
                     * the entire chain when we hit the peer (leaf) cert */
15799
                    if ((ssl->ctx->doAppleNativeCertValidationFlag)
15800
                        && (ret == WC_NO_ERR_TRACE(ASN_NO_SIGNER_E))) {
15801
15802
                        WOLFSSL_MSG("Bypassing errors to allow for Apple native"
15803
                                    " CA validation");
15804
                        ret = 0; /* clear errors and continue */
15805
                        args->verifyErr = 0;
15806
                        #if defined(OPENSSL_EXTRA) \
15807
                            || defined(OPENSSL_EXTRA_X509_SMALL)
15808
                        ssl->peerVerifyRet = 0;
15809
                        #endif
15810
                        /* do not add to certificate manager */
15811
                        skipAddCA = 1;
15812
                    }
15813
                #endif /* defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) */
15814
15815
                    /* Do verify callback */
15816
                    ret = DoVerifyCallback(SSL_CM(ssl), ssl, ret, args);
15817
                    if (ssl->options.verifyNone &&
15818
                              (ret == WC_NO_ERR_TRACE(CRL_MISSING) ||
15819
                               ret == WC_NO_ERR_TRACE(CRL_CERT_REVOKED) ||
15820
                               ret == WC_NO_ERR_TRACE(CRL_CERT_DATE_ERR))) {
15821
                        WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
15822
                        ret = ssl->error = 0;
15823
                    }
15824
15825
                #ifdef WOLFSSL_ALT_CERT_CHAINS
15826
                    if (ret != 0 && args->dCert->isCA) {
15827
                        /* do not add to certificate manager */
15828
                        skipAddCA = 1;
15829
                    }
15830
                #endif
15831
#if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
15832
                    if (ret == 0 && addToPendingCAs && !alreadySigner) {
15833
#ifdef WOLFSSL_SMALL_STACK
15834
                        DecodedCert *dCertAdd = NULL;
15835
#else
15836
                        DecodedCert dCertAdd[1];
15837
#endif
15838
                        int dCertAdd_inited = 0;
15839
                        DerBuffer *derBuffer = NULL;
15840
                        buffer* cert = &args->certs[args->certIdx];
15841
                        Signer *s = NULL;
15842
15843
#ifdef WOLFSSL_SMALL_STACK
15844
                        dCertAdd = (DecodedCert *)
15845
                            XMALLOC(sizeof(*dCertAdd), ssl->heap,
15846
                                    DYNAMIC_TYPE_TMP_BUFFER);
15847
                        if (dCertAdd == NULL) {
15848
                            ret = MEMORY_E;
15849
                            goto exit_req_v2;
15850
                        }
15851
#endif
15852
                        InitDecodedCert(dCertAdd, cert->buffer, cert->length,
15853
                                        ssl->heap);
15854
                        dCertAdd_inited = 1;
15855
                        ret = ParseCert(dCertAdd, CA_TYPE, NO_VERIFY,
15856
                                        SSL_CM(ssl));
15857
                        if (ret != 0) {
15858
                            goto exit_req_v2;
15859
                        }
15860
                        ret = AllocDer(&derBuffer, cert->length, CA_TYPE, ssl->heap);
15861
                        if (ret != 0 || derBuffer == NULL) {
15862
                            goto exit_req_v2;
15863
                        }
15864
                        XMEMCPY(derBuffer->buffer, cert->buffer, cert->length);
15865
                        s = MakeSigner(SSL_CM(ssl)->heap);
15866
                        if (s == NULL) {
15867
                            ret = MEMORY_E;
15868
                            goto exit_req_v2;
15869
                        }
15870
                        ret = FillSigner(s, dCertAdd, CA_TYPE, derBuffer);
15871
                        if (ret != 0) {
15872
                            goto exit_req_v2;
15873
                        }
15874
                        skipAddCA = 1;
15875
                        ret = TLSX_CSR2_AddPendingSigner(ssl->extensions, s);
15876
15877
                    exit_req_v2:
15878
                        if (s && (ret != 0))
15879
                            FreeSigner(s, SSL_CM(ssl)->heap);
15880
                        if (derBuffer)
15881
                            FreeDer(&derBuffer);
15882
                        if (dCertAdd_inited)
15883
                            FreeDecodedCert(dCertAdd);
15884
#ifdef WOLFSSL_SMALL_STACK
15885
                        XFREE(dCertAdd, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15886
#endif
15887
                        if (ret != 0)
15888
                            goto exit_ppc;
15889
                    }
15890
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
15891
15892
                    /* If valid CA then add to Certificate Manager */
15893
                    if (ret == 0 && args->dCert->isCA &&
15894
                            !ssl->options.verifyNone && !skipAddCA) {
15895
                        buffer* cert = &args->certs[args->certIdx];
15896
15897
                        /* Is valid CA */
15898
                    #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
15899
                        /* if using alternate chain, store the cert used */
15900
                        if (ssl->options.usingAltCertChain) {
15901
                            AddSessionCertToChain(&ssl->session->altChain,
15902
                                cert->buffer, cert->length);
15903
                        }
15904
                    #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
15905
                        if (!alreadySigner) {
15906
                            DerBuffer* add = NULL;
15907
                            ret = AllocDer(&add, cert->length, CA_TYPE, ssl->heap);
15908
                            if (ret < 0)
15909
                                goto exit_ppc;
15910
15911
                            XMEMCPY(add->buffer, cert->buffer, cert->length);
15912
15913
                            /* CA already verified above in ParseCertRelative */
15914
                            WOLFSSL_MSG("Adding CA from chain");
15915
                            SSL_CM_WARNING(ssl);
15916
                            ret = AddCA(SSL_CM(ssl), &add, WOLFSSL_CHAIN_CA,
15917
                                NO_VERIFY);
15918
                            if (ret == WOLFSSL_SUCCESS) {
15919
                                ret = 0;
15920
                            }
15921
                        }
15922
                    }
15923
15924
                    /* Handle error codes */
15925
                    ssl->error = ret; /* Report SSL error or clear error if
15926
                                       * callback overrides. */
15927
                    if (ret != 0) {
15928
                        if (!ssl->options.verifyNone) {
15929
                            WOLFSSL_ERROR_VERBOSE(ret);
15930
                            DoCertFatalAlert(ssl, ret);
15931
                            args->lastErr = ret;
15932
                            break; /* We sent a fatal alert.
15933
                                    * No point continuing. */
15934
                        }
15935
                        if (args->lastErr == 0) {
15936
                            args->lastErr = ret; /* save error from last time */
15937
                            ret = 0; /* reset error */
15938
                        }
15939
                    }
15940
15941
                    FreeDecodedCert(args->dCert);
15942
                    args->dCertInit = 0;
15943
                    args->count--;
15944
                } /* while (count > 1 && !args->haveTrustPeer) */
15945
            } /* if (count > 0) */
15946
15947
            /* Check for error */
15948
            if (ret != 0) {
15949
                goto exit_ppc;
15950
            }
15951
15952
            /* Advance state and proceed */
15953
            ssl->options.asyncState = TLS_ASYNC_DO;
15954
        } /* case TLS_ASYNC_BUILD */
15955
        FALL_THROUGH;
15956
15957
        case TLS_ASYNC_DO:
15958
        {
15959
            /* peer's, may not have one if blank client cert sent by TLSv1.2 */
15960
            if (args->count > 0) {
15961
                WOLFSSL_MSG("Verifying Peer's cert");
15962
15963
                /* select peer cert (first one) */
15964
                args->certIdx = 0;
15965
15966
                ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
15967
                        !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
15968
                        &subjectHash, &alreadySigner);
15969
#if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
15970
    (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
15971
    !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) && \
15972
    !defined(NO_STDIO_FILESYSTEM)
15973
                    if (ret == WC_NO_ERR_TRACE(ASN_NO_SIGNER_E) ||
15974
                        ret == WC_NO_ERR_TRACE(ASN_SELF_SIGNED_E)) {
15975
                        int lastErr = ret; /* save error from last time */
15976
                        WOLFSSL_MSG("try to load certificate if hash dir is set");
15977
                        ret = LoadCertByIssuer(SSL_STORE(ssl),
15978
                           (WOLFSSL_X509_NAME*)args->dCert->issuerName,
15979
                                                          X509_LU_X509);
15980
                        if (ret == WOLFSSL_SUCCESS) {
15981
                            FreeDecodedCert(args->dCert);
15982
                            args->dCertInit = 0;
15983
                            /* once again */
15984
                            ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
15985
                                !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
15986
                                &subjectHash, &alreadySigner);
15987
                        }
15988
                        else {
15989
                            ret = lastErr; /* restore error */
15990
                            WOLFSSL_ERROR_VERBOSE(ret);
15991
                        }
15992
                    }
15993
#endif
15994
            #ifdef WOLFSSL_ASYNC_CRYPT
15995
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
15996
                    goto exit_ppc;
15997
            #endif
15998
                if (ret == 0) {
15999
                    WOLFSSL_MSG("Verified Peer's cert");
16000
                #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
16001
                    if (ssl->peerVerifyRet == 0) /* Return first cert error here */
16002
                        ssl->peerVerifyRet = WOLFSSL_X509_V_OK;
16003
                #endif
16004
                #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
16005
                    /* if using alternate chain, store the cert used */
16006
                    if (ssl->options.usingAltCertChain) {
16007
                        buffer* cert = &args->certs[args->certIdx];
16008
                        AddSessionCertToChain(&ssl->session->altChain,
16009
                            cert->buffer, cert->length);
16010
                    }
16011
                #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
16012
16013
                #ifndef OPENSSL_COMPATIBLE_DEFAULTS
16014
                    /* Check peer's certificate version number. TLS 1.2 / 1.3
16015
                     * requires the clients certificate be version 3 unless a
16016
                     * different version has been negotiated using RFC 7250.
16017
                     * OpenSSL doesn't appear to be performing this check.
16018
                     * For TLS 1.3 see RFC8446 Section 4.4.2.3 */
16019
                    if (ssl->options.side == WOLFSSL_SERVER_END) {
16020
                #if defined(HAVE_RPK)
16021
                        if (args->dCert->isRPK) {
16022
                            /* to verify Raw Public Key cert, DANE(RFC6698)
16023
                             * should be introduced. Without DANE, no
16024
                             * authentication is performed.
16025
                             */
16026
                        #if defined(HAVE_DANE)
16027
                            if (ssl->useDANE) {
16028
                                /* DANE authentication should be added */
16029
                            }
16030
                        #endif /* HAVE_DANE */
16031
                        }
16032
                        else /* skip followingx509 version check */
16033
                #endif  /* HAVE_RPK */
16034
                        if (args->dCert->version != WOLFSSL_X509_V3) {
16035
                            WOLFSSL_MSG("Peers certificate was not version 3!");
16036
                            args->lastErr = ASN_VERSION_E;
16037
                            /* setting last error but not considering it fatal
16038
                             * giving the user a chance to override */
16039
                        }
16040
                    }
16041
                #endif
16042
16043
                    /* check if fatal error */
16044
                    if (args->verifyErr) {
16045
                        args->fatal = 1;
16046
                        ret = args->lastErr;
16047
                    }
16048
                    else {
16049
                        args->fatal = 0;
16050
                    }
16051
                }
16052
                else if (ret == WC_NO_ERR_TRACE(ASN_PARSE_E) ||
16053
                         ret == WC_NO_ERR_TRACE(BUFFER_E) ||
16054
                         ret == WC_NO_ERR_TRACE(MEMORY_E) ||
16055
                         ret == WC_NO_ERR_TRACE(BAD_FUNC_ARG)) {
16056
                    WOLFSSL_MSG("Got Peer cert ASN_PARSE_E, BUFFER_E, MEMORY_E,"
16057
                                " BAD_FUNC_ARG");
16058
                #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA) || \
16059
                                               defined(OPENSSL_EXTRA_X509_SMALL)
16060
                    DoCertFatalAlert(ssl, ret);
16061
                #endif
16062
                #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
16063
                    if (ssl->peerVerifyRet == 0) /* Return first cert error here */
16064
                        ssl->peerVerifyRet = WOLFSSL_X509_V_ERR_CERT_REJECTED;
16065
                #endif
16066
                    args->fatal = 1;
16067
                }
16068
                else {
16069
                    WOLFSSL_MSG("Failed to verify Peer's cert");
16070
16071
                    #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
16072
                    if (ssl->peerVerifyRet == 0) { /* Return first cert error here */
16073
                        if (ret == WC_NO_ERR_TRACE(ASN_BEFORE_DATE_E)) {
16074
                            ssl->peerVerifyRet =
16075
                           (unsigned long)WOLFSSL_X509_V_ERR_CERT_NOT_YET_VALID;
16076
                        }
16077
                        else if (ret == WC_NO_ERR_TRACE(ASN_AFTER_DATE_E)) {
16078
                            ssl->peerVerifyRet =
16079
                            (unsigned long)WOLFSSL_X509_V_ERR_CERT_HAS_EXPIRED;
16080
                        }
16081
                        else {
16082
                            ssl->peerVerifyRet =
16083
                                   (unsigned long)
16084
                            WOLFSSL_X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE;
16085
                        }
16086
                    }
16087
                    #endif
16088
16089
                    if (ssl->verifyCallback) {
16090
                        WOLFSSL_MSG(
16091
                            "\tCallback override available, will continue");
16092
                        /* check if fatal error */
16093
                        args->fatal = (args->verifyErr) ? (word16)(1)
16094
                                                        : (word16)(0);
16095
                        if (args->fatal)
16096
                            DoCertFatalAlert(ssl, ret);
16097
                    }
16098
                    #if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS)
16099
                    /* Disregard failure to verify peer cert, as we will verify
16100
                     * the whole chain with the native API later */
16101
                    else if (ssl->ctx->doAppleNativeCertValidationFlag) {
16102
                        WOLFSSL_MSG("\tApple native CA validation override"
16103
                                    " available, will continue");
16104
                        /* check if fatal error */
16105
                        args->fatal = (args->verifyErr) ? 1 : 0;
16106
                        if (args->fatal)
16107
                            DoCertFatalAlert(ssl, ret);
16108
                    }
16109
                    #endif/*defined(__APPLE__)&& defined(WOLFSSL_SYS_CA_CERTS)*/
16110
                    else {
16111
                        WOLFSSL_MSG("\tNo callback override available, fatal");
16112
                        args->fatal = 1;
16113
                        DoCertFatalAlert(ssl, ret);
16114
                    }
16115
                }
16116
16117
            #ifdef HAVE_SECURE_RENEGOTIATION
16118
                if (args->fatal == 0 && !IsAtLeastTLSv1_3(ssl->version)
16119
                                     && ssl->secure_renegotiation
16120
                                     && ssl->secure_renegotiation->enabled) {
16121
16122
                    if (IsEncryptionOn(ssl, 0)) {
16123
                        /* compare against previous time */
16124
                        if (ssl->secure_renegotiation->subject_hash_set) {
16125
                            if (XMEMCMP(args->dCert->subjectHash,
16126
                                    ssl->secure_renegotiation->subject_hash,
16127
                                    KEYID_SIZE) != 0) {
16128
                                WOLFSSL_MSG(
16129
                                  "Peer sent different cert during scr, fatal");
16130
                                args->fatal = 1;
16131
                                ret = SCR_DIFFERENT_CERT_E;
16132
                                WOLFSSL_ERROR_VERBOSE(ret);
16133
                            }
16134
                        }
16135
                    }
16136
16137
                    /* cache peer's hash */
16138
                    if (args->fatal == 0) {
16139
                        XMEMCPY(ssl->secure_renegotiation->subject_hash,
16140
                                args->dCert->subjectHash, KEYID_SIZE);
16141
                        ssl->secure_renegotiation->subject_hash_set = 1;
16142
                    }
16143
                }
16144
            #endif /* HAVE_SECURE_RENEGOTIATION */
16145
            } /* if (count > 0) */
16146
16147
            /* Check for error */
16148
            if (args->fatal && ret != 0) {
16149
                goto exit_ppc;
16150
            }
16151
16152
            /* Advance state and proceed */
16153
            ssl->options.asyncState = TLS_ASYNC_VERIFY;
16154
        } /* case TLS_ASYNC_DO */
16155
        FALL_THROUGH;
16156
16157
        case TLS_ASYNC_VERIFY:
16158
        {
16159
            if (args->count > 0) {
16160
            #if defined(HAVE_OCSP) || defined(HAVE_CRL)
16161
                /* only attempt to check OCSP or CRL if not previous error such
16162
                 * as ASN_BEFORE_DATE_E or ASN_AFTER_DATE_E */
16163
                if (args->fatal == 0 && ret == 0) {
16164
                    int doLookup = 1;
16165
16166
                    WOLFSSL_MSG("Checking if ocsp needed");
16167
16168
                    if (ssl->options.side == WOLFSSL_CLIENT_END) {
16169
                #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
16170
                        if (ssl->status_request) {
16171
                            args->fatal = (TLSX_CSR_InitRequest_ex(
16172
                                                ssl->extensions, args->dCert,
16173
                                                ssl->heap, args->certIdx) != 0);
16174
                            doLookup = 0;
16175
                            WOLFSSL_MSG("\tHave status request");
16176
                        #if defined(WOLFSSL_TLS13)
16177
                            if (ssl->options.tls1_3) {
16178
                                ret = ProcessPeerCertsChainOCSPStatusCheck(ssl);
16179
                                if (ret < 0) {
16180
                                    WOLFSSL_ERROR_VERBOSE(ret);
16181
                                    goto exit_ppc;
16182
                                }
16183
                            }
16184
                        #endif
16185
                        }
16186
                        /* Ensure a stapling response was seen */
16187
                        else if (ssl->options.tls1_3 &&
16188
                                                 SSL_CM(ssl)->ocspMustStaple) {
16189
                             ret = OCSP_CERT_UNKNOWN;
16190
                             goto exit_ppc;
16191
                        }
16192
                #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
16193
                #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
16194
                        if (ssl->status_request_v2) {
16195
                            args->fatal = (TLSX_CSR2_InitRequests(ssl->extensions,
16196
                                                 args->dCert, 1, ssl->heap) != 0);
16197
                            doLookup = 0;
16198
                            WOLFSSL_MSG("\tHave status request v2");
16199
                        }
16200
                #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
16201
                    }
16202
16203
                #ifdef HAVE_OCSP
16204
                    if (doLookup && SSL_CM(ssl)->ocspEnabled) {
16205
                        WOLFSSL_MSG("Doing Leaf OCSP check");
16206
                        ret = CheckCertOCSP_ex(SSL_CM(ssl)->ocsp,
16207
                                                    args->dCert, ssl);
16208
                    #ifdef WOLFSSL_NONBLOCK_OCSP
16209
                        if (ret == WC_NO_ERR_TRACE(OCSP_WANT_READ)) {
16210
                            goto exit_ppc;
16211
                        }
16212
                    #endif
16213
                        doLookup = (ret == WC_NO_ERR_TRACE(OCSP_CERT_UNKNOWN));
16214
                        if (ret != 0) {
16215
                            WOLFSSL_MSG("\tOCSP Lookup not ok");
16216
                            args->fatal = 0;
16217
                        #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
16218
                            if (ssl->peerVerifyRet == 0) {
16219
                                /* Return first cert error here */
16220
                                ssl->peerVerifyRet =
16221
                                    ret == WC_NO_ERR_TRACE(OCSP_CERT_REVOKED)
16222
                                    ? WOLFSSL_X509_V_ERR_CERT_REVOKED
16223
                                    : WOLFSSL_X509_V_ERR_CERT_REJECTED;
16224
                            }
16225
                        #endif
16226
                        }
16227
                    }
16228
                #endif /* HAVE_OCSP */
16229
16230
                #ifdef HAVE_CRL
16231
                    if (ret == 0 && doLookup && SSL_CM(ssl)->crlEnabled) {
16232
                        WOLFSSL_MSG("Doing Leaf CRL check");
16233
                        ret = CheckCertCRL(SSL_CM(ssl)->crl, args->dCert);
16234
                    #ifdef WOLFSSL_NONBLOCK_OCSP
16235
                        /* The CRL lookup I/O callback is using the
16236
                         * same WOULD_BLOCK error code as OCSP's I/O
16237
                         * callback, and it is enabling it using the
16238
                         * same flag. */
16239
                        if (ret == WC_NO_ERR_TRACE(OCSP_WANT_READ)) {
16240
                            goto exit_ppc;
16241
                        }
16242
                    #endif
16243
                        if (ret != 0)
16244
                            DoCrlCallback(SSL_CM(ssl), ssl, args, &ret);
16245
                        if (ret != 0) {
16246
                            WOLFSSL_MSG("\tCRL check not ok");
16247
                            args->fatal = 0;
16248
                        #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
16249
                            if (ssl->peerVerifyRet == 0) {
16250
                                /* Return first cert error here */
16251
                                ssl->peerVerifyRet =
16252
                                        ret == WC_NO_ERR_TRACE(CRL_CERT_REVOKED)
16253
                                            ? WOLFSSL_X509_V_ERR_CERT_REVOKED
16254
                                            : WOLFSSL_X509_V_ERR_CERT_REJECTED;
16255
                            }
16256
                        #endif
16257
                        }
16258
                    }
16259
                    if (ret == 0 && doLookup && SSL_CM(ssl)->crlEnabled &&
16260
                            SSL_CM(ssl)->crlCheckAll && args->totalCerts == 1) {
16261
                        /* Check the entire cert chain */
16262
                        if (args->dCert->ca != NULL) {
16263
                            ret = ProcessPeerCertsChainCRLCheck(ssl, args);
16264
                            if (ret != 0) {
16265
                                WOLFSSL_ERROR_VERBOSE(ret);
16266
                                WOLFSSL_MSG("\tCRL chain check not ok");
16267
                                args->fatal = 0;
16268
                            }
16269
                        }
16270
                        else {
16271
                            WOLFSSL_MSG("No CA signer set");
16272
                        }
16273
                    }
16274
                #endif /* HAVE_CRL */
16275
                    (void)doLookup;
16276
                }
16277
            #endif /* HAVE_OCSP || HAVE_CRL */
16278
16279
            #ifdef KEEP_PEER_CERT
16280
                if (args->fatal == 0) {
16281
                    int copyRet = 0;
16282
16283
                    /* free old peer cert */
16284
                    FreeX509(&ssl->peerCert);
16285
                    InitX509(&ssl->peerCert, 0, ssl->heap);
16286
                    copyRet = CopyDecodedToX509(&ssl->peerCert, args->dCert);
16287
                    if (copyRet == WC_NO_ERR_TRACE(MEMORY_E)) {
16288
                        args->fatal = 1;
16289
                    }
16290
                }
16291
            #endif /* KEEP_PEER_CERT */
16292
16293
            #ifndef IGNORE_KEY_EXTENSIONS
16294
                #if defined(OPENSSL_EXTRA)
16295
                  /* when compatibility layer is turned on and no verify is
16296
                   * set then ignore the certificate key extension */
16297
                    if (args->dCert->extKeyUsageSet &&
16298
                          args->dCert->extKeyUsageCrit == 0 &&
16299
                          ssl->options.verifyNone) {
16300
                        WOLFSSL_MSG("Not verifying certificate key usage");
16301
                    }
16302
                    else
16303
                #endif
16304
                if (args->dCert->extKeyUsageSet) {
16305
                    if ((ssl->specs.kea == rsa_kea) &&
16306
                        (ssl->options.side == WOLFSSL_CLIENT_END) &&
16307
                        (args->dCert->extKeyUsage & KEYUSE_KEY_ENCIPHER) == 0) {
16308
                        ret = KEYUSE_ENCIPHER_E;
16309
                        WOLFSSL_ERROR_VERBOSE(ret);
16310
                    }
16311
                    if ((ssl->specs.kea != rsa_kea) &&
16312
                        (ssl->specs.sig_algo == rsa_sa_algo ||
16313
                            (ssl->specs.sig_algo == ecc_dsa_sa_algo &&
16314
                                 !ssl->specs.static_ecdh)) &&
16315
                        (args->dCert->extKeyUsage & KEYUSE_DIGITAL_SIG) == 0) {
16316
                        WOLFSSL_MSG("KeyUse Digital Sig not set");
16317
                        ret = KEYUSE_SIGNATURE_E;
16318
                        WOLFSSL_ERROR_VERBOSE(ret);
16319
                    }
16320
                }
16321
16322
                #if defined(OPENSSL_EXTRA)
16323
                    /* when compatibility layer is turned on and no verify is
16324
                     * set then ignore the certificate key extension */
16325
                    if (args->dCert->extExtKeyUsageSet &&
16326
                            args->dCert->extExtKeyUsageCrit == 0 &&
16327
                          ssl->options.verifyNone) {
16328
                                WOLFSSL_MSG("Not verifying certificate ext key usage");
16329
                    }
16330
                    else
16331
                #endif
16332
                if (args->dCert->extExtKeyUsageSet) {
16333
                    if (ssl->options.side == WOLFSSL_CLIENT_END) {
16334
                        if ((args->dCert->extExtKeyUsage &
16335
                                (EXTKEYUSE_ANY | EXTKEYUSE_SERVER_AUTH)) == 0) {
16336
                            WOLFSSL_MSG("ExtKeyUse Server Auth not set");
16337
                            ret = EXTKEYUSE_AUTH_E;
16338
                            WOLFSSL_ERROR_VERBOSE(ret);
16339
                        }
16340
                    }
16341
                    else {
16342
                        if ((args->dCert->extExtKeyUsage &
16343
                                (EXTKEYUSE_ANY | EXTKEYUSE_CLIENT_AUTH)) == 0) {
16344
                            WOLFSSL_MSG("ExtKeyUse Client Auth not set");
16345
                            ret = EXTKEYUSE_AUTH_E;
16346
                            WOLFSSL_ERROR_VERBOSE(ret);
16347
                        }
16348
                    }
16349
                }
16350
            #endif /* IGNORE_KEY_EXTENSIONS */
16351
16352
                if (args->fatal) {
16353
                    ssl->error = ret;
16354
                #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
16355
                    SendAlert(ssl, alert_fatal, bad_certificate);
16356
                    if (ssl->peerVerifyRet == 0) /* Return first cert error here */
16357
                        ssl->peerVerifyRet = WOLFSSL_X509_V_ERR_CERT_REJECTED;
16358
                #endif
16359
                    goto exit_ppc;
16360
                }
16361
16362
                /* Certificate validated and stored. */
16363
                ssl->options.havePeerCert = 1;
16364
            #if !defined(NO_WOLFSSL_CLIENT) && !defined(NO_RSA)
16365
                if (ssl->options.side == WOLFSSL_CLIENT_END &&
16366
                    ssl->specs.sig_algo == rsa_kea) {
16367
                    /* CLIENT: No ServerKeyExchange message sent by server. */
16368
                    ssl->options.peerAuthGood = 1;
16369
                }
16370
            #endif
16371
            #if !defined(NO_WOLFSSL_CLIENT) && defined(HAVE_ECC)
16372
                if (ssl->options.side == WOLFSSL_CLIENT_END &&
16373
                    ssl->specs.static_ecdh) {
16374
                    /* CLIENT: No ServerKeyExchange message sent by server. */
16375
                    ssl->options.peerAuthGood = 1;
16376
                }
16377
            #endif
16378
16379
                if (!ssl->options.verifyNone && ssl->buffers.domainName.buffer) {
16380
                #ifndef WOLFSSL_ALLOW_NO_CN_IN_SAN
16381
                    /* Per RFC 5280 section 4.2.1.6, "Whenever such identities
16382
                     * are to be bound into a certificate, the subject
16383
                     * alternative name extension MUST be used." */
16384
                    if (args->dCert->altNames) {
16385
                        if (CheckForAltNames(args->dCert,
16386
                                (char*)ssl->buffers.domainName.buffer,
16387
                                (ssl->buffers.domainName.buffer == NULL ? 0 :
16388
                                (word32)XSTRLEN(
16389
                                (const char *)ssl->buffers.domainName.buffer)),
16390
                                NULL, 0) != 1) {
16391
                            WOLFSSL_MSG("DomainName match on alt names failed");
16392
                            /* try to get peer key still */
16393
                            ret = DOMAIN_NAME_MISMATCH;
16394
                            WOLFSSL_ERROR_VERBOSE(ret);
16395
                        }
16396
                    }
16397
                    else {
16398
                        if (MatchDomainName(
16399
                                args->dCert->subjectCN,
16400
                                args->dCert->subjectCNLen,
16401
                                (char*)ssl->buffers.domainName.buffer,
16402
                                (ssl->buffers.domainName.buffer == NULL ? 0 :
16403
                                (word32)XSTRLEN(
16404
                                (const char *)ssl->buffers.domainName.buffer)
16405
                                ), 0) == 0)
16406
                        {
16407
                            WOLFSSL_MSG("DomainName match on common name failed");
16408
                            ret = DOMAIN_NAME_MISMATCH;
16409
                            WOLFSSL_ERROR_VERBOSE(ret);
16410
                        }
16411
                    }
16412
                #else /* WOLFSSL_ALL_NO_CN_IN_SAN */
16413
                    /* Old behavior. */
16414
                    if (MatchDomainName(args->dCert->subjectCN,
16415
                                args->dCert->subjectCNLen,
16416
                                (char*)ssl->buffers.domainName.buffer,
16417
                                (ssl->buffers.domainName.buffer == NULL ? 0 :
16418
                                (word32)XSTRLEN(ssl->buffers.domainName.buffer)), 0) == 0)
16419
                    {
16420
                        WOLFSSL_MSG("DomainName match on common name failed");
16421
                        if (CheckForAltNames(args->dCert,
16422
                                 (char*)ssl->buffers.domainName.buffer,
16423
                                 (ssl->buffers.domainName.buffer == NULL ? 0 :
16424
                                 (word32)XSTRLEN(ssl->buffers.domainName.buffer)),
16425
                                 NULL, 0) != 1) {
16426
                            WOLFSSL_MSG(
16427
                                "DomainName match on alt names failed too");
16428
                            /* try to get peer key still */
16429
                            ret = DOMAIN_NAME_MISMATCH;
16430
                            WOLFSSL_ERROR_VERBOSE(ret);
16431
                        }
16432
                    }
16433
                #endif /* WOLFSSL_ALL_NO_CN_IN_SAN */
16434
                }
16435
16436
                /* decode peer key */
16437
                switch (args->dCert->keyOID) {
16438
                #ifndef NO_RSA
16439
                    #ifdef WC_RSA_PSS
16440
                    case RSAPSSk:
16441
                    #endif
16442
                    case RSAk:
16443
                    {
16444
                        word32 keyIdx = 0;
16445
                        int keyRet = 0;
16446
16447
                        if (ssl->peerRsaKey == NULL) {
16448
                            keyRet = AllocKey(ssl, DYNAMIC_TYPE_RSA,
16449
                                                (void**)&ssl->peerRsaKey);
16450
                        } else if (ssl->peerRsaKeyPresent) {
16451
                            keyRet = ReuseKey(ssl, DYNAMIC_TYPE_RSA,
16452
                                              ssl->peerRsaKey);
16453
                            ssl->peerRsaKeyPresent = 0;
16454
                        }
16455
16456
                        if (keyRet != 0 || wc_RsaPublicKeyDecode(
16457
                               args->dCert->publicKey, &keyIdx, ssl->peerRsaKey,
16458
                                                args->dCert->pubKeySize) != 0) {
16459
                            ret = PEER_KEY_ERROR;
16460
                            WOLFSSL_ERROR_VERBOSE(ret);
16461
                        }
16462
                        else {
16463
                            ssl->peerRsaKeyPresent = 1;
16464
                    #if defined(WOLFSSL_RENESAS_TSIP_TLS) || \
16465
                                             defined(WOLFSSL_RENESAS_FSPSM_TLS)
16466
                        /* copy encrypted tsip key index into ssl object */
16467
                        if (args->dCert->sce_tsip_encRsaKeyIdx) {
16468
                            if (!ssl->peerSceTsipEncRsaKeyIndex) {
16469
                                ssl->peerSceTsipEncRsaKeyIndex = (byte*)XMALLOC(
16470
                                    TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY,
16471
                                    ssl->heap, DYNAMIC_TYPE_RSA);
16472
                                if (!ssl->peerSceTsipEncRsaKeyIndex) {
16473
                                    args->lastErr = MEMORY_E;
16474
                                    goto exit_ppc;
16475
                                }
16476
                            }
16477
16478
                            XMEMCPY(ssl->peerSceTsipEncRsaKeyIndex,
16479
                                        args->dCert->sce_tsip_encRsaKeyIdx,
16480
                                        TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY);
16481
                         }
16482
                    #endif
16483
                    #ifdef HAVE_PK_CALLBACKS
16484
                        #if defined(HAVE_SECURE_RENEGOTIATION) || \
16485
                                        defined(WOLFSSL_POST_HANDSHAKE_AUTH)
16486
                        if (ssl->buffers.peerRsaKey.buffer) {
16487
                            XFREE(ssl->buffers.peerRsaKey.buffer,
16488
                                    ssl->heap, DYNAMIC_TYPE_RSA);
16489
                            ssl->buffers.peerRsaKey.buffer = NULL;
16490
                        }
16491
                        #endif
16492
16493
16494
                        ssl->buffers.peerRsaKey.buffer =
16495
                               (byte*)XMALLOC(args->dCert->pubKeySize,
16496
                                            ssl->heap, DYNAMIC_TYPE_RSA);
16497
                        if (ssl->buffers.peerRsaKey.buffer == NULL) {
16498
                            ret = MEMORY_ERROR;
16499
                        }
16500
                        else {
16501
                            XMEMCPY(ssl->buffers.peerRsaKey.buffer,
16502
                                    args->dCert->publicKey,
16503
                                    args->dCert->pubKeySize);
16504
                            ssl->buffers.peerRsaKey.length =
16505
                                args->dCert->pubKeySize;
16506
                        }
16507
                    #endif /* HAVE_PK_CALLBACKS */
16508
                        }
16509
16510
                        /* check size of peer RSA key */
16511
                        if (ret == 0 && ssl->peerRsaKeyPresent &&
16512
                                          !ssl->options.verifyNone &&
16513
                                          wc_RsaEncryptSize(ssl->peerRsaKey)
16514
                                              < ssl->options.minRsaKeySz) {
16515
                            ret = RSA_KEY_SIZE_E;
16516
                            WOLFSSL_ERROR_VERBOSE(ret);
16517
                            WOLFSSL_MSG("Peer RSA key is too small");
16518
                        }
16519
                        break;
16520
                    }
16521
                #endif /* NO_RSA */
16522
                #ifdef HAVE_ECC
16523
                #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
16524
                    case SM2k:
16525
                #endif
16526
                    case ECDSAk:
16527
                    {
16528
                        int keyRet = 0;
16529
                        word32 idx = 0;
16530
                    #if defined(WOLFSSL_RENESAS_FSPSM_TLS) || \
16531
                        defined(WOLFSSL_RENESAS_TSIP_TLS)
16532
                        /* copy encrypted tsip/sce key index into ssl object */
16533
                        if (args->dCert->sce_tsip_encRsaKeyIdx) {
16534
                            if (!ssl->peerSceTsipEncRsaKeyIndex) {
16535
                                ssl->peerSceTsipEncRsaKeyIndex = (byte*)XMALLOC(
16536
                                    TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY,
16537
                                    ssl->heap, DYNAMIC_TYPE_RSA);
16538
                                if (!ssl->peerSceTsipEncRsaKeyIndex) {
16539
                                    args->lastErr = MEMORY_E;
16540
                                    ERROR_OUT(MEMORY_ERROR, exit_ppc);
16541
                                }
16542
                            }
16543
16544
                            XMEMCPY(ssl->peerSceTsipEncRsaKeyIndex,
16545
                                        args->dCert->sce_tsip_encRsaKeyIdx,
16546
                                        TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY);
16547
                         }
16548
                    #endif
16549
                        if (ssl->peerEccDsaKey == NULL) {
16550
                            /* alloc/init on demand */
16551
                            keyRet = AllocKey(ssl, DYNAMIC_TYPE_ECC,
16552
                                    (void**)&ssl->peerEccDsaKey);
16553
                        } else if (ssl->peerEccDsaKeyPresent) {
16554
                            keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
16555
                                              ssl->peerEccDsaKey);
16556
                            ssl->peerEccDsaKeyPresent = 0;
16557
                        }
16558
16559
                        if (keyRet != 0 ||
16560
                            wc_EccPublicKeyDecode(args->dCert->publicKey, &idx,
16561
                                                ssl->peerEccDsaKey,
16562
                                                args->dCert->pubKeySize) != 0) {
16563
                            ret = PEER_KEY_ERROR;
16564
                            WOLFSSL_ERROR_VERBOSE(ret);
16565
                        }
16566
                        else {
16567
                            ssl->peerEccDsaKeyPresent = 1;
16568
16569
                    #ifdef HAVE_PK_CALLBACKS
16570
                            if (ssl->buffers.peerEccDsaKey.buffer)
16571
                                XFREE(ssl->buffers.peerEccDsaKey.buffer,
16572
                                      ssl->heap, DYNAMIC_TYPE_ECC);
16573
                            ssl->buffers.peerEccDsaKey.buffer =
16574
                                   (byte*)XMALLOC(args->dCert->pubKeySize,
16575
                                           ssl->heap, DYNAMIC_TYPE_ECC);
16576
                            if (ssl->buffers.peerEccDsaKey.buffer == NULL) {
16577
                                ERROR_OUT(MEMORY_ERROR, exit_ppc);
16578
                            }
16579
                            else {
16580
                                XMEMCPY(ssl->buffers.peerEccDsaKey.buffer,
16581
                                        args->dCert->publicKey,
16582
                                        args->dCert->pubKeySize);
16583
                                ssl->buffers.peerEccDsaKey.length =
16584
                                        args->dCert->pubKeySize;
16585
                            }
16586
                    #endif /* HAVE_PK_CALLBACKS */
16587
                        }
16588
16589
                        /* check size of peer ECC key */
16590
                        if (ret == 0 && ssl->peerEccDsaKeyPresent &&
16591
                                              !ssl->options.verifyNone &&
16592
                                              wc_ecc_size(ssl->peerEccDsaKey)
16593
                                              < ssl->options.minEccKeySz) {
16594
                            ret = ECC_KEY_SIZE_E;
16595
                            WOLFSSL_ERROR_VERBOSE(ret);
16596
                            WOLFSSL_MSG("Peer ECC key is too small");
16597
                        }
16598
16599
                        /* populate curve oid - if missing */
16600
                        if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
16601
                            ssl->ecdhCurveOID = args->dCert->pkCurveOID;
16602
                        break;
16603
                    }
16604
                #endif /* HAVE_ECC */
16605
                #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
16606
                    case ED25519k:
16607
                    {
16608
                        int keyRet = 0;
16609
                        if (ssl->peerEd25519Key == NULL) {
16610
                            /* alloc/init on demand */
16611
                            keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED25519,
16612
                                    (void**)&ssl->peerEd25519Key);
16613
                        } else if (ssl->peerEd25519KeyPresent) {
16614
                            keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED25519,
16615
                                              ssl->peerEd25519Key);
16616
                            ssl->peerEd25519KeyPresent = 0;
16617
                        }
16618
16619
                        if (keyRet != 0 ||
16620
                            wc_ed25519_import_public(args->dCert->publicKey,
16621
                                                     args->dCert->pubKeySize,
16622
                                                     ssl->peerEd25519Key)
16623
                                                                         != 0) {
16624
                            ret = PEER_KEY_ERROR;
16625
                            WOLFSSL_ERROR_VERBOSE(ret);
16626
                        }
16627
                        else {
16628
                            ssl->peerEd25519KeyPresent = 1;
16629
                    #ifdef HAVE_PK_CALLBACKS
16630
                            ssl->buffers.peerEd25519Key.buffer =
16631
                                   (byte*)XMALLOC(args->dCert->pubKeySize,
16632
                                           ssl->heap, DYNAMIC_TYPE_ED25519);
16633
                            if (ssl->buffers.peerEd25519Key.buffer == NULL) {
16634
                                ERROR_OUT(MEMORY_ERROR, exit_ppc);
16635
                            }
16636
                            else {
16637
                                XMEMCPY(ssl->buffers.peerEd25519Key.buffer,
16638
                                        args->dCert->publicKey,
16639
                                        args->dCert->pubKeySize);
16640
                                ssl->buffers.peerEd25519Key.length =
16641
                                        args->dCert->pubKeySize;
16642
                            }
16643
                    #endif /*HAVE_PK_CALLBACKS */
16644
                        }
16645
16646
                        /* check size of peer ECC key */
16647
                        if (ret == 0 && ssl->peerEd25519KeyPresent &&
16648
                                  !ssl->options.verifyNone &&
16649
                                  ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
16650
                            ret = ECC_KEY_SIZE_E;
16651
                            WOLFSSL_ERROR_VERBOSE(ret);
16652
                            WOLFSSL_MSG("Peer ECC key is too small");
16653
                        }
16654
16655
                        /* populate curve oid - if missing */
16656
                        if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
16657
                            ssl->ecdhCurveOID = ECC_X25519_OID;
16658
                        break;
16659
                    }
16660
                #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
16661
                #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
16662
                    case ED448k:
16663
                    {
16664
                        int keyRet = 0;
16665
                        if (ssl->peerEd448Key == NULL) {
16666
                            /* alloc/init on demand */
16667
                            keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED448,
16668
                                    (void**)&ssl->peerEd448Key);
16669
                        } else if (ssl->peerEd448KeyPresent) {
16670
                            keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED448,
16671
                                    ssl->peerEd448Key);
16672
                            ssl->peerEd448KeyPresent = 0;
16673
                        }
16674
16675
                        if (keyRet != 0 ||
16676
                            wc_ed448_import_public(args->dCert->publicKey,
16677
                                    args->dCert->pubKeySize,
16678
                                    ssl->peerEd448Key) != 0) {
16679
                            ret = PEER_KEY_ERROR;
16680
                            WOLFSSL_ERROR_VERBOSE(ret);
16681
                        }
16682
                        else {
16683
                            ssl->peerEd448KeyPresent = 1;
16684
                    #ifdef HAVE_PK_CALLBACKS
16685
                            ssl->buffers.peerEd448Key.buffer =
16686
                                   (byte*)XMALLOC(args->dCert->pubKeySize,
16687
                                           ssl->heap, DYNAMIC_TYPE_ED448);
16688
                            if (ssl->buffers.peerEd448Key.buffer == NULL) {
16689
                                ERROR_OUT(MEMORY_ERROR, exit_ppc);
16690
                            }
16691
                            else {
16692
                                XMEMCPY(ssl->buffers.peerEd448Key.buffer,
16693
                                        args->dCert->publicKey,
16694
                                        args->dCert->pubKeySize);
16695
                                ssl->buffers.peerEd448Key.length =
16696
                                        args->dCert->pubKeySize;
16697
                            }
16698
                    #endif /*HAVE_PK_CALLBACKS */
16699
                        }
16700
16701
                        /* check size of peer ECC key */
16702
                        if (ret == 0 && ssl->peerEd448KeyPresent &&
16703
                               !ssl->options.verifyNone &&
16704
                               ED448_KEY_SIZE < ssl->options.minEccKeySz) {
16705
                            ret = ECC_KEY_SIZE_E;
16706
                            WOLFSSL_ERROR_VERBOSE(ret);
16707
                            WOLFSSL_MSG("Peer ECC key is too small");
16708
                        }
16709
16710
                        /* populate curve oid - if missing */
16711
                        if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
16712
                            ssl->ecdhCurveOID = ECC_X448_OID;
16713
                        break;
16714
                    }
16715
                #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
16716
                #if defined(HAVE_FALCON)
16717
                    case FALCON_LEVEL1k:
16718
                    case FALCON_LEVEL5k:
16719
                    {
16720
                        int keyRet = 0;
16721
                        if (ssl->peerFalconKey == NULL) {
16722
                            /* alloc/init on demand */
16723
                            keyRet = AllocKey(ssl, DYNAMIC_TYPE_FALCON,
16724
                                    (void**)&ssl->peerFalconKey);
16725
                        } else if (ssl->peerFalconKeyPresent) {
16726
                            keyRet = ReuseKey(ssl, DYNAMIC_TYPE_FALCON,
16727
                                    ssl->peerFalconKey);
16728
                            ssl->peerFalconKeyPresent = 0;
16729
                        }
16730
16731
                        if (keyRet == 0) {
16732
                            if (args->dCert->keyOID == FALCON_LEVEL1k) {
16733
                                keyRet = wc_falcon_set_level(ssl->peerFalconKey,
16734
                                1);
16735
                            }
16736
                            else {
16737
                                keyRet = wc_falcon_set_level(ssl->peerFalconKey,
16738
                                5);
16739
                            }
16740
                        }
16741
16742
                        if (keyRet != 0 ||
16743
                            wc_falcon_import_public(args->dCert->publicKey,
16744
                                                    args->dCert->pubKeySize,
16745
                                                    ssl->peerFalconKey) != 0) {
16746
                            ret = PEER_KEY_ERROR;
16747
                            WOLFSSL_ERROR_VERBOSE(ret);
16748
                        }
16749
                        else {
16750
                            ssl->peerFalconKeyPresent = 1;
16751
                        }
16752
16753
                        /* check size of peer Falcon key */
16754
                        if (ret == 0 && ssl->peerFalconKeyPresent &&
16755
                               !ssl->options.verifyNone &&
16756
                               FALCON_MAX_KEY_SIZE <
16757
                               ssl->options.minFalconKeySz) {
16758
                            ret = FALCON_KEY_SIZE_E;
16759
                            WOLFSSL_ERROR_VERBOSE(ret);
16760
                            WOLFSSL_MSG("Peer Falcon key is too small");
16761
                        }
16762
                        break;
16763
                    }
16764
                #endif /* HAVE_FALCON */
16765
                #if defined(HAVE_DILITHIUM) && \
16766
                    !defined(WOLFSSL_DILITHIUM_NO_VERIFY)
16767
                    case ML_DSA_LEVEL2k:
16768
                    case ML_DSA_LEVEL3k:
16769
                    case ML_DSA_LEVEL5k:
16770
                    #ifdef WOLFSSL_DILITHIUM_FIPS204_DRAFT
16771
                    case DILITHIUM_LEVEL2k:
16772
                    case DILITHIUM_LEVEL3k:
16773
                    case DILITHIUM_LEVEL5k:
16774
                    #endif
16775
                    {
16776
                        int keyRet = 0;
16777
                        if (ssl->peerDilithiumKey == NULL) {
16778
                            /* alloc/init on demand */
16779
                            keyRet = AllocKey(ssl, DYNAMIC_TYPE_DILITHIUM,
16780
                                    (void**)&ssl->peerDilithiumKey);
16781
                        } else if (ssl->peerDilithiumKeyPresent) {
16782
                            keyRet = ReuseKey(ssl, DYNAMIC_TYPE_DILITHIUM,
16783
                                    ssl->peerDilithiumKey);
16784
                            ssl->peerDilithiumKeyPresent = 0;
16785
                        }
16786
16787
                        if (keyRet == 0) {
16788
                            if (args->dCert->keyOID == ML_DSA_LEVEL2k) {
16789
                                keyRet = wc_dilithium_set_level(
16790
                                             ssl->peerDilithiumKey, WC_ML_DSA_44);
16791
                            }
16792
                            else if (args->dCert->keyOID == ML_DSA_LEVEL3k) {
16793
                                keyRet = wc_dilithium_set_level(
16794
                                             ssl->peerDilithiumKey, WC_ML_DSA_65);
16795
                            }
16796
                            else if (args->dCert->keyOID == ML_DSA_LEVEL5k) {
16797
                                keyRet = wc_dilithium_set_level(
16798
                                             ssl->peerDilithiumKey, WC_ML_DSA_87);
16799
                            }
16800
                            #ifdef WOLFSSL_DILITHIUM_FIPS204_DRAFT
16801
                            else if (args->dCert->keyOID == DILITHIUM_LEVEL2k) {
16802
                                keyRet = wc_dilithium_set_level(
16803
                                             ssl->peerDilithiumKey, WC_ML_DSA_44_DRAFT);
16804
                            }
16805
                            else if (args->dCert->keyOID == DILITHIUM_LEVEL3k) {
16806
                                keyRet = wc_dilithium_set_level(
16807
                                             ssl->peerDilithiumKey, WC_ML_DSA_65_DRAFT);
16808
                            }
16809
                            else if (args->dCert->keyOID == DILITHIUM_LEVEL5k) {
16810
                                keyRet = wc_dilithium_set_level(
16811
                                             ssl->peerDilithiumKey, WC_ML_DSA_87_DRAFT);
16812
                            }
16813
                            #endif
16814
                        }
16815
16816
                        if (keyRet != 0 ||
16817
                            wc_dilithium_import_public(args->dCert->publicKey,
16818
                                                       args->dCert->pubKeySize,
16819
                                                       ssl->peerDilithiumKey)
16820
                            != 0) {
16821
                            ret = PEER_KEY_ERROR;
16822
                        }
16823
                        else {
16824
                            ssl->peerDilithiumKeyPresent = 1;
16825
                        }
16826
16827
                        /* check size of peer Dilithium key */
16828
                        if (ret == 0 && ssl->peerDilithiumKeyPresent &&
16829
                               !ssl->options.verifyNone &&
16830
                               DILITHIUM_MAX_KEY_SIZE <
16831
                               ssl->options.minDilithiumKeySz) {
16832
                            ret = DILITHIUM_KEY_SIZE_E;
16833
                            WOLFSSL_MSG("Peer Dilithium key is too small");
16834
                        }
16835
                        break;
16836
                    }
16837
                #endif /* HAVE_DILITHIUM */
16838
                    default:
16839
                        break;
16840
                }
16841
16842
                /* args->dCert free'd in function cleanup after callback */
16843
            } /* if (count > 0) */
16844
16845
            /* Check for error */
16846
            if (args->fatal && ret != 0) {
16847
                goto exit_ppc;
16848
            }
16849
16850
            /* Advance state and proceed */
16851
            ssl->options.asyncState = TLS_ASYNC_FINALIZE;
16852
        } /* case TLS_ASYNC_VERIFY */
16853
        FALL_THROUGH;
16854
16855
        case TLS_ASYNC_FINALIZE:
16856
        {
16857
            /* load last error */
16858
            if (args->lastErr != 0 && ret == 0) {
16859
                ret = args->lastErr;
16860
            }
16861
16862
        #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
16863
           /* limit compliant with OpenSSL verify Depth + 1
16864
            * OpenSSL tries to expand the chain one longer than limit until
16865
            * reaching an ultimately trusted issuer. Becoming failure if
16866
            * we hit the limit, with WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG
16867
            */
16868
            if (args->untrustedDepth > (ssl->options.verifyDepth + 1)) {
16869
                if (ssl->peerVerifyRet == 0) /* Return first cert error here */
16870
                    ssl->peerVerifyRet = WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG;
16871
                ret = MAX_CHAIN_ERROR;
16872
                WOLFSSL_ERROR_VERBOSE(ret);
16873
            }
16874
        #endif
16875
16876
        #if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS)
16877
            /* If we can't validate the peer cert chain against the CAs loaded
16878
             * into wolfSSL, try to validate against the system certificates
16879
             * using Apple's native trust APIs */
16880
            if ((ret == WC_NO_ERR_TRACE(ASN_NO_SIGNER_E)) &&
16881
                (ssl->ctx->doAppleNativeCertValidationFlag)) {
16882
                if (DoAppleNativeCertValidation(ssl, args->certs,
16883
                                                     args->totalCerts)) {
16884
                    WOLFSSL_MSG("Apple native cert chain validation SUCCESS");
16885
                    ret = 0;
16886
                }
16887
                else {
16888
                    WOLFSSL_MSG("Apple native cert chain validation FAIL");
16889
                }
16890
            }
16891
        #endif /* defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) */
16892
16893
            /* Do verify callback */
16894
            ret = DoVerifyCallback(SSL_CM(ssl), ssl, ret, args);
16895
16896
            if (ssl->options.verifyNone &&
16897
                              (ret == WC_NO_ERR_TRACE(CRL_MISSING) ||
16898
                               ret == WC_NO_ERR_TRACE(CRL_CERT_REVOKED) ||
16899
                               ret == WC_NO_ERR_TRACE(CRL_CERT_DATE_ERR))) {
16900
                WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
16901
                ret = ssl->error = 0;
16902
            }
16903
16904
            if (ret != 0) {
16905
                if (!ssl->options.verifyNone) {
16906
                    DoCertFatalAlert(ssl, ret);
16907
                }
16908
                ssl->error = ret; /* Report SSL error */
16909
            }
16910
16911
            if (ret == 0 && ssl->options.side == WOLFSSL_CLIENT_END) {
16912
                ssl->options.serverState = SERVER_CERT_COMPLETE;
16913
            }
16914
16915
            if (IsEncryptionOn(ssl, 0))
16916
                args->idx += ssl->keys.padSz;
16917
16918
            /* Advance state and proceed */
16919
            ssl->options.asyncState = TLS_ASYNC_END;
16920
        } /* case TLS_ASYNC_FINALIZE */
16921
        FALL_THROUGH;
16922
16923
        case TLS_ASYNC_END:
16924
        {
16925
            /* Set final index */
16926
            *inOutIdx = args->idx;
16927
16928
            break;
16929
        }
16930
        default:
16931
            ret = INPUT_CASE_ERROR;
16932
            break;
16933
    } /* switch(ssl->options.asyncState) */
16934
16935
exit_ppc:
16936
16937
    WOLFSSL_LEAVE("ProcessPeerCerts", ret);
16938
16939
16940
#if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
16941
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E) ||
16942
        ret == WC_NO_ERR_TRACE(OCSP_WANT_READ)) {
16943
        /* Mark message as not received so it can process again */
16944
        ssl->msgsReceived.got_certificate = 0;
16945
16946
        return ret;
16947
    }
16948
#endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
16949
16950
#if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
16951
    /* Cleanup async */
16952
    FreeAsyncCtx(ssl, 0);
16953
#elif defined(WOLFSSL_SMALL_STACK)
16954
    if (args)
16955
    {
16956
        FreeProcPeerCertArgs(ssl, args);
16957
    }
16958
#else
16959
    FreeProcPeerCertArgs(ssl, args);
16960
#endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP || WOLFSSL_SMALL_STACK */
16961
16962
#if !defined(WOLFSSL_ASYNC_CRYPT) && defined(WOLFSSL_SMALL_STACK)
16963
    XFREE(args, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
16964
#endif
16965
16966
    FreeKeyExchange(ssl);
16967
16968
    return ret;
16969
}
16970
#endif
16971
16972
#if !defined(NO_TLS) && !defined(WOLFSSL_NO_TLS12)
16973
#if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
16974
16975
/* handle processing of certificate (11) */
16976
static int DoCertificate(WOLFSSL* ssl, byte* input, word32* inOutIdx,
16977
                                                                word32 size)
16978
8.42k
{
16979
8.42k
    int ret;
16980
16981
8.42k
    WOLFSSL_START(WC_FUNC_CERTIFICATE_DO);
16982
8.42k
    WOLFSSL_ENTER("DoCertificate");
16983
16984
#ifdef SESSION_CERTS
16985
    /* Reset the session cert chain count in case the session resume failed,
16986
     * do not reset if we are resuming after an async wait */
16987
#if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
16988
    if (ssl->error != WC_NO_ERR_TRACE(OCSP_WANT_READ) &&
16989
        ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E))
16990
#endif
16991
    {
16992
        ssl->session->chain.count = 0;
16993
#ifdef WOLFSSL_ALT_CERT_CHAINS
16994
        ssl->session->altChain.count = 0;
16995
#endif
16996
    }
16997
#endif /* SESSION_CERTS */
16998
16999
8.42k
    ret = ProcessPeerCerts(ssl, input, inOutIdx, size);
17000
17001
#ifdef OPENSSL_EXTRA
17002
    ssl->options.serverState = SERVER_CERT_COMPLETE;
17003
#endif
17004
17005
8.42k
    WOLFSSL_LEAVE("DoCertificate", ret);
17006
8.42k
    WOLFSSL_END(WC_FUNC_CERTIFICATE_DO);
17007
17008
8.42k
    return ret;
17009
8.42k
}
17010
17011
/* handle processing of certificate_status (22) */
17012
static int DoCertificateStatus(WOLFSSL* ssl, byte* input, word32* inOutIdx,
17013
                                                                    word32 size)
17014
{
17015
    int    ret = 0;
17016
    byte   status_type;
17017
    word32 status_length;
17018
    int endCertificateOK = 0;
17019
17020
    WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_DO);
17021
    WOLFSSL_ENTER("DoCertificateStatus");
17022
17023
    if (size < ENUM_LEN + OPAQUE24_LEN)
17024
        return BUFFER_ERROR;
17025
17026
    status_type = input[(*inOutIdx)++];
17027
17028
    c24to32(input + *inOutIdx, &status_length);
17029
    *inOutIdx += OPAQUE24_LEN;
17030
17031
    if (size != ENUM_LEN + OPAQUE24_LEN + status_length)
17032
        return BUFFER_ERROR;
17033
17034
    switch (status_type) {
17035
17036
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
17037
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
17038
17039
        /* WOLFSSL_CSR_OCSP overlaps with WOLFSSL_CSR2_OCSP */
17040
        case WOLFSSL_CSR2_OCSP:
17041
            ret = ProcessCSR(ssl, input, inOutIdx, status_length);
17042
            endCertificateOK = (ret == 0);
17043
            break;
17044
17045
    #endif
17046
17047
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
17048
17049
        case WOLFSSL_CSR2_OCSP_MULTI: {
17050
            OcspRequest* request;
17051
            word32 list_length = status_length;
17052
            byte   idx = 0;
17053
            Signer *pendingCAs = NULL;
17054
17055
            #ifdef WOLFSSL_SMALL_STACK
17056
                CertStatus*   status;
17057
                OcspEntry*    single;
17058
                OcspResponse* response;
17059
            #else
17060
                CertStatus   status[1];
17061
                OcspEntry    single[1];
17062
                OcspResponse response[1];
17063
            #endif
17064
17065
            if (!ssl->status_request_v2)
17066
                return BUFFER_ERROR;
17067
17068
            ssl->status_request_v2 = 0;
17069
17070
            pendingCAs = TLSX_CSR2_GetPendingSigners(ssl->extensions);
17071
17072
            #ifdef WOLFSSL_SMALL_STACK
17073
                status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
17074
                                                       DYNAMIC_TYPE_OCSP_STATUS);
17075
                single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
17076
                                                              DYNAMIC_TYPE_OCSP_ENTRY);
17077
                response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
17078
                                                             DYNAMIC_TYPE_OCSP_REQUEST);
17079
17080
                if (status == NULL || single == NULL || response == NULL) {
17081
                    XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
17082
                    XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
17083
                    XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
17084
17085
                    return MEMORY_ERROR;
17086
                }
17087
            #endif
17088
17089
            while (list_length && ret == 0) {
17090
                if (OPAQUE24_LEN > list_length) {
17091
                    ret = BUFFER_ERROR;
17092
                    break;
17093
                }
17094
17095
                c24to32(input + *inOutIdx, &status_length);
17096
                *inOutIdx   += OPAQUE24_LEN;
17097
                list_length -= OPAQUE24_LEN;
17098
17099
                if (status_length > list_length) {
17100
                    ret = BUFFER_ERROR;
17101
                    break;
17102
                }
17103
17104
                if (status_length) {
17105
                    InitOcspResponse(response, single, status, input +*inOutIdx,
17106
                                     status_length, ssl->heap);
17107
                    response->pendingCAs = pendingCAs;
17108
                    if ((OcspResponseDecode(response, SSL_CM(ssl), ssl->heap,
17109
                            0, 0) != 0)
17110
                    ||  (response->responseStatus != OCSP_SUCCESSFUL)
17111
                    ||  (response->single->status->status != CERT_GOOD))
17112
                        ret = BAD_CERTIFICATE_STATUS_ERROR;
17113
17114
                    if (ret == 0) {
17115
                        request = (OcspRequest*)TLSX_CSR2_GetRequest(
17116
                                ssl->extensions, status_type, idx);
17117
17118
                        if (request == NULL) {
17119
                            ret = BAD_CERTIFICATE_STATUS_ERROR;
17120
                        }
17121
                        else if (CompareOcspReqResp(request, response) != 0) {
17122
                            ret = BAD_CERTIFICATE_STATUS_ERROR;
17123
                        }
17124
                        else {
17125
                            if (idx == 0) /* server cert must be OK */
17126
                                endCertificateOK = 1;
17127
                        }
17128
                    }
17129
17130
                    /* only frees 'single' if single->isDynamic is set */
17131
                    FreeOcspResponse(response);
17132
17133
                    *inOutIdx   += status_length;
17134
                    list_length -= status_length;
17135
                }
17136
                idx++;
17137
            }
17138
17139
            ssl->status_request_v2 = 0;
17140
17141
            #ifdef WOLFSSL_SMALL_STACK
17142
                XFREE(status,   NULL, DYNAMIC_TYPE_OCSP_STATUS);
17143
                XFREE(single,   NULL, DYNAMIC_TYPE_OCSP_ENTRY);
17144
                XFREE(response, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
17145
            #endif
17146
17147
        }
17148
        break;
17149
17150
    #endif
17151
17152
        default:
17153
            ret = BUFFER_ERROR;
17154
    }
17155
17156
    /* end certificate MUST be present */
17157
    if (endCertificateOK == 0)
17158
        ret = BAD_CERTIFICATE_STATUS_ERROR;
17159
#if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
17160
    if (ret == 0) {
17161
        if (TLSX_CSR2_MergePendingCA(ssl) < 0) {
17162
            WOLFSSL_MSG("Failed to merge pending CAs");
17163
        }
17164
    }
17165
    else {
17166
        TLSX_CSR2_ClearPendingCA(ssl);
17167
    }
17168
#endif
17169
17170
    if (ret != 0) {
17171
        WOLFSSL_ERROR_VERBOSE(ret);
17172
        SendAlert(ssl, alert_fatal, bad_certificate_status_response);
17173
    }
17174
17175
    if (IsEncryptionOn(ssl, 0)) {
17176
        if (*inOutIdx + ssl->keys.padSz > size)
17177
            return BUFFER_E;
17178
        *inOutIdx += ssl->keys.padSz;
17179
    }
17180
17181
    WOLFSSL_LEAVE("DoCertificateStatus", ret);
17182
    WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_DO);
17183
17184
    return ret;
17185
}
17186
17187
#endif
17188
17189
#endif /* !NO_TLS && !WOLFSSL_NO_TLS12 */
17190
17191
#endif /* !NO_CERTS */
17192
17193
#if !defined(NO_TLS) && !defined(WOLFSSL_NO_TLS12)
17194
17195
static int DoHelloRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
17196
                                                    word32 size, word32 totalSz)
17197
0
{
17198
0
    (void)input;
17199
17200
0
    WOLFSSL_START(WC_FUNC_HELLO_REQUEST_DO);
17201
0
    WOLFSSL_ENTER("DoHelloRequest");
17202
17203
0
    if (size) /* must be 0 */
17204
0
        return BUFFER_ERROR;
17205
17206
0
    if (IsEncryptionOn(ssl, 0)) {
17207
        /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
17208
         * about padding */
17209
        /* access beyond input + size should be checked against totalSz */
17210
0
        if (size != totalSz &&
17211
0
                *inOutIdx + ssl->keys.padSz > totalSz)
17212
0
            return BUFFER_E;
17213
17214
0
        *inOutIdx += ssl->keys.padSz;
17215
0
    }
17216
17217
0
    if (ssl->options.side == WOLFSSL_SERVER_END) {
17218
0
        SendAlert(ssl, alert_fatal, unexpected_message); /* try */
17219
0
        WOLFSSL_ERROR_VERBOSE(FATAL_ERROR);
17220
0
        return FATAL_ERROR;
17221
0
    }
17222
#ifdef HAVE_SECURE_RENEGOTIATION
17223
    else if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
17224
        ssl->secure_renegotiation->startScr = 1;
17225
        WOLFSSL_LEAVE("DoHelloRequest", 0);
17226
        WOLFSSL_END(WC_FUNC_HELLO_REQUEST_DO);
17227
        return 0;
17228
    }
17229
#endif
17230
0
    else {
17231
0
        return SendAlert(ssl, alert_warning, no_renegotiation);
17232
0
    }
17233
0
}
17234
17235
17236
int DoFinished(WOLFSSL* ssl, const byte* input, word32* inOutIdx, word32 size,
17237
                                                      word32 totalSz, int sniff)
17238
0
{
17239
0
    word32 finishedSz = (ssl->options.tls ? TLS_FINISHED_SZ : FINISHED_SZ);
17240
17241
0
    WOLFSSL_START(WC_FUNC_FINISHED_DO);
17242
0
    WOLFSSL_ENTER("DoFinished");
17243
17244
0
    if (finishedSz != size)
17245
0
        return BUFFER_ERROR;
17246
17247
    /* check against totalSz
17248
     * If size == totalSz then we are in DtlsMsgDrain so no need to worry about
17249
     * padding */
17250
0
    if (size != totalSz) {
17251
0
        if (*inOutIdx + size + ssl->keys.padSz > totalSz)
17252
0
            return BUFFER_E;
17253
0
    }
17254
17255
    #ifdef WOLFSSL_CALLBACKS
17256
        if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
17257
        if (ssl->toInfoOn) AddLateName("Finished", &ssl->timeoutInfo);
17258
    #endif
17259
17260
0
    if (sniff == NO_SNIFF) {
17261
0
        if (XMEMCMP(input + *inOutIdx, &ssl->hsHashes->verifyHashes,size) != 0){
17262
0
            WOLFSSL_MSG("Verify finished error on hashes");
17263
0
            WOLFSSL_ERROR_VERBOSE(VERIFY_FINISHED_ERROR);
17264
0
            return VERIFY_FINISHED_ERROR;
17265
0
        }
17266
0
    }
17267
17268
#ifdef HAVE_SECURE_RENEGOTIATION
17269
    if (ssl->secure_renegotiation) {
17270
        /* save peer's state */
17271
        if (ssl->options.side == WOLFSSL_CLIENT_END)
17272
            XMEMCPY(ssl->secure_renegotiation->server_verify_data,
17273
                    input + *inOutIdx, TLS_FINISHED_SZ);
17274
        else
17275
            XMEMCPY(ssl->secure_renegotiation->client_verify_data,
17276
                    input + *inOutIdx, TLS_FINISHED_SZ);
17277
        ssl->secure_renegotiation->verifySet = 1;
17278
    }
17279
#endif
17280
#ifdef WOLFSSL_HAVE_TLS_UNIQUE
17281
    if (ssl->options.side == WOLFSSL_CLIENT_END) {
17282
        XMEMCPY(ssl->serverFinished,
17283
                input + *inOutIdx, TLS_FINISHED_SZ);
17284
        ssl->serverFinished_len = TLS_FINISHED_SZ;
17285
    }
17286
    else {
17287
        XMEMCPY(ssl->clientFinished,
17288
                input + *inOutIdx, TLS_FINISHED_SZ);
17289
        ssl->clientFinished_len = TLS_FINISHED_SZ;
17290
    }
17291
#endif
17292
17293
    /* force input exhaustion at ProcessReply consuming padSz */
17294
0
    *inOutIdx += size + ssl->keys.padSz;
17295
17296
0
    if (ssl->options.side == WOLFSSL_CLIENT_END) {
17297
0
        ssl->options.serverState = SERVER_FINISHED_COMPLETE;
17298
#ifdef OPENSSL_EXTRA
17299
        ssl->cbmode = WOLFSSL_CB_MODE_WRITE;
17300
        ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
17301
#endif
17302
0
        if (!ssl->options.resuming) {
17303
#ifdef OPENSSL_EXTRA
17304
            if (ssl->CBIS != NULL) {
17305
                ssl->CBIS(ssl, WOLFSSL_CB_CONNECT_LOOP, WOLFSSL_SUCCESS);
17306
            }
17307
#endif
17308
0
            ssl->options.handShakeState = HANDSHAKE_DONE;
17309
0
            ssl->options.handShakeDone  = 1;
17310
#ifdef HAVE_SECURE_RENEGOTIATION
17311
            ssl->options.resumed = ssl->options.resuming;
17312
#endif
17313
0
        }
17314
0
    }
17315
0
    else {
17316
0
        ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
17317
#ifdef OPENSSL_EXTRA
17318
        ssl->cbmode = WOLFSSL_CB_MODE_READ;
17319
        ssl->options.serverState = SERVER_FINISHED_COMPLETE;
17320
#endif
17321
0
        if (ssl->options.resuming) {
17322
#ifdef OPENSSL_EXTRA
17323
            if (ssl->CBIS != NULL) {
17324
                ssl->CBIS(ssl, WOLFSSL_CB_ACCEPT_LOOP, WOLFSSL_SUCCESS);
17325
            }
17326
#endif
17327
0
            ssl->options.handShakeState = HANDSHAKE_DONE;
17328
0
            ssl->options.handShakeDone  = 1;
17329
#ifdef HAVE_SECURE_RENEGOTIATION
17330
            ssl->options.resumed = ssl->options.resuming;
17331
#endif
17332
0
        }
17333
0
    }
17334
#ifdef WOLFSSL_DTLS
17335
    if (ssl->options.dtls) {
17336
        if ((!ssl->options.resuming && ssl->options.side == WOLFSSL_CLIENT_END) ||
17337
             (ssl->options.resuming && ssl->options.side == WOLFSSL_SERVER_END)){
17338
            DtlsMsgPoolReset(ssl);
17339
            ssl->keys.dtls_handshake_number = 0;
17340
            ssl->keys.dtls_expected_peer_handshake_number = 0;
17341
        }
17342
    }
17343
#endif
17344
17345
0
    WOLFSSL_LEAVE("DoFinished", 0);
17346
0
    WOLFSSL_END(WC_FUNC_FINISHED_DO);
17347
17348
0
    return 0;
17349
0
}
17350
17351
/* Make sure no duplicates, no fast forward, or other problems; 0 on success */
17352
static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
17353
0
{
17354
    /* verify not a duplicate, mark received, check state */
17355
0
    switch (type) {
17356
17357
0
#ifndef NO_WOLFSSL_CLIENT
17358
0
        case hello_request:
17359
0
        #ifndef NO_WOLFSSL_SERVER
17360
0
            if (ssl->options.side == WOLFSSL_SERVER_END) {
17361
0
                WOLFSSL_MSG("HelloRequest received by server");
17362
0
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
17363
0
                return SIDE_ERROR;
17364
0
            }
17365
0
        #endif
17366
0
            if (ssl->msgsReceived.got_hello_request) {
17367
0
                WOLFSSL_MSG("Duplicate HelloRequest received");
17368
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
17369
0
                return DUPLICATE_MSG_E;
17370
0
            }
17371
0
            ssl->msgsReceived.got_hello_request = 1;
17372
17373
0
            break;
17374
0
#endif
17375
17376
0
#ifndef NO_WOLFSSL_SERVER
17377
0
        case client_hello:
17378
0
        #ifndef NO_WOLFSSL_CLIENT
17379
0
            if (ssl->options.side == WOLFSSL_CLIENT_END) {
17380
0
                WOLFSSL_MSG("ClientHello received by client");
17381
0
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
17382
0
                return SIDE_ERROR;
17383
0
            }
17384
0
        #endif
17385
0
            if (ssl->msgsReceived.got_client_hello) {
17386
0
                WOLFSSL_MSG("Duplicate ClientHello received");
17387
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
17388
0
                return DUPLICATE_MSG_E;
17389
0
            }
17390
0
            ssl->msgsReceived.got_client_hello = 1;
17391
17392
0
            break;
17393
0
#endif
17394
17395
0
#ifndef NO_WOLFSSL_CLIENT
17396
0
        case server_hello:
17397
0
        #ifndef NO_WOLFSSL_SERVER
17398
0
            if (ssl->options.side == WOLFSSL_SERVER_END) {
17399
0
                WOLFSSL_MSG("ServerHello received by server");
17400
0
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
17401
0
                return SIDE_ERROR;
17402
0
            }
17403
0
        #endif
17404
0
            if (ssl->msgsReceived.got_server_hello) {
17405
0
                WOLFSSL_MSG("Duplicate ServerHello received");
17406
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
17407
0
                return DUPLICATE_MSG_E;
17408
0
            }
17409
0
            ssl->msgsReceived.got_server_hello = 1;
17410
17411
0
            break;
17412
0
#endif
17413
17414
0
#ifndef NO_WOLFSSL_CLIENT
17415
0
        case hello_verify_request:
17416
0
        #ifndef NO_WOLFSSL_SERVER
17417
0
            if (ssl->options.side == WOLFSSL_SERVER_END) {
17418
0
                WOLFSSL_MSG("HelloVerifyRequest received by server");
17419
0
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
17420
0
                return SIDE_ERROR;
17421
0
            }
17422
0
        #endif
17423
0
            if (ssl->msgsReceived.got_hello_verify_request) {
17424
0
                WOLFSSL_MSG("Duplicate HelloVerifyRequest received");
17425
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
17426
0
                return DUPLICATE_MSG_E;
17427
0
            }
17428
0
            if (ssl->msgsReceived.got_hello_retry_request) {
17429
0
                WOLFSSL_MSG("Received HelloVerifyRequest after a "
17430
0
                            "HelloRetryRequest");
17431
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
17432
0
                return VERSION_ERROR;
17433
0
            }
17434
0
            ssl->msgsReceived.got_hello_verify_request = 1;
17435
17436
0
            break;
17437
0
#endif
17438
17439
0
#ifndef NO_WOLFSSL_CLIENT
17440
0
        case session_ticket:
17441
0
        #ifndef NO_WOLFSSL_SERVER
17442
0
            if (ssl->options.side == WOLFSSL_SERVER_END) {
17443
0
                WOLFSSL_MSG("SessionTicket received by server");
17444
0
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
17445
0
                return SIDE_ERROR;
17446
0
            }
17447
0
        #endif
17448
0
            if (ssl->msgsReceived.got_session_ticket) {
17449
0
                WOLFSSL_MSG("Duplicate SessionTicket received");
17450
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
17451
0
                return DUPLICATE_MSG_E;
17452
0
            }
17453
0
            ssl->msgsReceived.got_session_ticket = 1;
17454
17455
0
            break;
17456
0
#endif
17457
17458
0
        case certificate:
17459
0
            if (ssl->msgsReceived.got_certificate) {
17460
0
                WOLFSSL_MSG("Duplicate Certificate received");
17461
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
17462
0
                return DUPLICATE_MSG_E;
17463
0
            }
17464
0
            ssl->msgsReceived.got_certificate = 1;
17465
17466
0
#ifndef NO_WOLFSSL_CLIENT
17467
0
            if (ssl->options.side == WOLFSSL_CLIENT_END) {
17468
0
                if ( ssl->msgsReceived.got_server_hello == 0) {
17469
0
                    WOLFSSL_MSG("No ServerHello before Cert");
17470
0
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17471
0
                    return OUT_OF_ORDER_E;
17472
0
                }
17473
0
            }
17474
0
#endif
17475
0
#ifndef NO_WOLFSSL_SERVER
17476
0
            if (ssl->options.side == WOLFSSL_SERVER_END) {
17477
0
                if ( ssl->msgsReceived.got_client_hello == 0) {
17478
0
                    WOLFSSL_MSG("No ClientHello before Cert");
17479
0
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17480
0
                    return OUT_OF_ORDER_E;
17481
0
                }
17482
0
            }
17483
0
#endif
17484
0
            break;
17485
17486
0
#ifndef NO_WOLFSSL_CLIENT
17487
0
        case certificate_status:
17488
0
        #ifndef NO_WOLFSSL_SERVER
17489
0
            if (ssl->options.side == WOLFSSL_SERVER_END) {
17490
0
                WOLFSSL_MSG("CertificateStatus received by server");
17491
0
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
17492
0
                return SIDE_ERROR;
17493
0
            }
17494
0
        #endif
17495
0
            if (ssl->msgsReceived.got_certificate_status) {
17496
0
                WOLFSSL_MSG("Duplicate CertificateStatus received");
17497
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
17498
0
                return DUPLICATE_MSG_E;
17499
0
            }
17500
0
            ssl->msgsReceived.got_certificate_status = 1;
17501
17502
0
            if (ssl->msgsReceived.got_certificate == 0) {
17503
0
                WOLFSSL_MSG("No Certificate before CertificateStatus");
17504
0
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17505
0
                return OUT_OF_ORDER_E;
17506
0
            }
17507
0
            if (ssl->msgsReceived.got_server_key_exchange != 0) {
17508
0
                WOLFSSL_MSG("CertificateStatus after ServerKeyExchange");
17509
0
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17510
0
                return OUT_OF_ORDER_E;
17511
0
            }
17512
17513
0
            break;
17514
0
#endif
17515
17516
0
#ifndef NO_WOLFSSL_CLIENT
17517
0
        case server_key_exchange:
17518
0
        #ifndef NO_WOLFSSL_SERVER
17519
0
            if (ssl->options.side == WOLFSSL_SERVER_END) {
17520
0
                WOLFSSL_MSG("ServerKeyExchange received by server");
17521
0
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
17522
0
                return SIDE_ERROR;
17523
0
            }
17524
0
        #endif
17525
0
            if (ssl->msgsReceived.got_server_key_exchange) {
17526
0
                WOLFSSL_MSG("Duplicate ServerKeyExchange received");
17527
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
17528
0
                return DUPLICATE_MSG_E;
17529
0
            }
17530
0
            ssl->msgsReceived.got_server_key_exchange = 1;
17531
17532
0
            if (ssl->msgsReceived.got_server_hello == 0) {
17533
0
                WOLFSSL_MSG("No ServerHello before ServerKeyExchange");
17534
0
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17535
0
                return OUT_OF_ORDER_E;
17536
0
            }
17537
17538
0
            break;
17539
0
#endif
17540
17541
0
#ifndef NO_WOLFSSL_CLIENT
17542
0
        case certificate_request:
17543
0
        #ifndef NO_WOLFSSL_SERVER
17544
0
            if (ssl->options.side == WOLFSSL_SERVER_END) {
17545
0
                WOLFSSL_MSG("CertificateRequest received by server");
17546
0
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
17547
0
                return SIDE_ERROR;
17548
0
            }
17549
0
        #endif
17550
0
            if (ssl->msgsReceived.got_certificate_request) {
17551
0
                WOLFSSL_MSG("Duplicate CertificateRequest received");
17552
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
17553
0
                return DUPLICATE_MSG_E;
17554
0
            }
17555
0
            ssl->msgsReceived.got_certificate_request = 1;
17556
17557
0
            break;
17558
0
#endif
17559
17560
0
#ifndef NO_WOLFSSL_CLIENT
17561
0
        case server_hello_done:
17562
0
        #ifndef NO_WOLFSSL_SERVER
17563
0
            if (ssl->options.side == WOLFSSL_SERVER_END) {
17564
0
                WOLFSSL_MSG("ServerHelloDone received by server");
17565
0
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
17566
0
                return SIDE_ERROR;
17567
0
            }
17568
0
        #endif
17569
0
            if (ssl->msgsReceived.got_server_hello_done) {
17570
0
                WOLFSSL_MSG("Duplicate ServerHelloDone received");
17571
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
17572
0
                return DUPLICATE_MSG_E;
17573
0
            }
17574
0
            ssl->msgsReceived.got_server_hello_done = 1;
17575
17576
0
            if (ssl->msgsReceived.got_certificate == 0) {
17577
0
                if (ssl->specs.kea == psk_kea ||
17578
0
                    ssl->specs.kea == dhe_psk_kea ||
17579
0
                    ssl->specs.kea == ecdhe_psk_kea ||
17580
0
                    ssl->options.usingAnon_cipher) {
17581
0
                    WOLFSSL_MSG("No Cert required");
17582
0
                }
17583
0
                else {
17584
0
                    WOLFSSL_MSG("No Certificate before ServerHelloDone");
17585
0
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17586
0
                    return OUT_OF_ORDER_E;
17587
0
                }
17588
0
            }
17589
0
            if (ssl->msgsReceived.got_server_key_exchange == 0) {
17590
0
                int pskNoServerHint = 0;  /* not required in this case */
17591
17592
                #ifndef NO_PSK
17593
                    if (ssl->specs.kea == psk_kea &&
17594
                        ssl->arrays != NULL &&
17595
                        ssl->arrays->server_hint[0] == 0)
17596
                        pskNoServerHint = 1;
17597
                #endif
17598
0
                if (ssl->specs.static_ecdh == 1 ||
17599
0
                    ssl->specs.kea == rsa_kea ||
17600
0
                    pskNoServerHint) {
17601
0
                    WOLFSSL_MSG("No KeyExchange required");
17602
0
                }
17603
0
                else {
17604
0
                    WOLFSSL_MSG("No ServerKeyExchange before ServerDone");
17605
0
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17606
0
                    return OUT_OF_ORDER_E;
17607
0
                }
17608
0
            }
17609
#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
17610
                                     defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
17611
            if (ssl->msgsReceived.got_certificate_status == 0) {
17612
                int csrRet = 0;
17613
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST
17614
                if (csrRet == 0 && ssl->status_request) {
17615
                    WOLFSSL_MSG("No CertificateStatus before ServerHelloDone");
17616
                    csrRet = TLSX_CSR_ForceRequest(ssl);
17617
                }
17618
#endif
17619
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
17620
                if (csrRet == 0 && ssl->status_request_v2) {
17621
                    WOLFSSL_MSG("No CertificateStatus before ServerHelloDone");
17622
                    csrRet = TLSX_CSR2_ForceRequest(ssl);
17623
                }
17624
                if (ssl->status_request_v2) {
17625
                    if (csrRet == 0) {
17626
                        if (TLSX_CSR2_MergePendingCA(ssl) < 0) {
17627
                            WOLFSSL_MSG("Failed to merge pending CAs");
17628
                        }
17629
                    }
17630
                    else {
17631
                        TLSX_CSR2_ClearPendingCA(ssl);
17632
                    }
17633
                }
17634
#endif
17635
                if (csrRet != 0) {
17636
                    /* Error out if OCSP lookups are enabled and failed or if
17637
                     * the user requires stapling. */
17638
                    if (SSL_CM(ssl)->ocspEnabled || SSL_CM(ssl)->ocspMustStaple)
17639
                        return csrRet;
17640
                }
17641
                /* Check that a status request extension was seen as the
17642
                 * CertificateStatus wasn't when an OCSP staple is required.
17643
                 */
17644
                if (
17645
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST
17646
                     !ssl->status_request &&
17647
#endif
17648
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
17649
                     !ssl->status_request_v2 &&
17650
#endif
17651
                                                 SSL_CM(ssl)->ocspMustStaple) {
17652
                    WOLFSSL_ERROR_VERBOSE(OCSP_CERT_UNKNOWN);
17653
                    return OCSP_CERT_UNKNOWN;
17654
                }
17655
            }
17656
#endif
17657
0
            break;
17658
0
#endif
17659
17660
0
#ifndef NO_WOLFSSL_SERVER
17661
0
        case certificate_verify:
17662
0
        #ifndef NO_WOLFSSL_CLIENT
17663
0
            if (ssl->options.side == WOLFSSL_CLIENT_END) {
17664
0
                WOLFSSL_MSG("CertificateVerify received by client");
17665
0
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
17666
0
                return SIDE_ERROR;
17667
0
            }
17668
0
        #endif
17669
0
            if (ssl->msgsReceived.got_certificate_verify) {
17670
0
                WOLFSSL_MSG("Duplicate CertificateVerify received");
17671
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
17672
0
                return DUPLICATE_MSG_E;
17673
0
            }
17674
0
            ssl->msgsReceived.got_certificate_verify = 1;
17675
17676
0
            if ( ssl->msgsReceived.got_certificate == 0) {
17677
0
                WOLFSSL_MSG("No Cert before CertVerify");
17678
0
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17679
0
                return OUT_OF_ORDER_E;
17680
0
            }
17681
0
            break;
17682
0
#endif
17683
17684
0
#ifndef NO_WOLFSSL_SERVER
17685
0
        case client_key_exchange:
17686
0
        #ifndef NO_WOLFSSL_CLIENT
17687
0
            if (ssl->options.side == WOLFSSL_CLIENT_END) {
17688
0
                WOLFSSL_MSG("ClientKeyExchange received by client");
17689
0
                WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
17690
0
                return SIDE_ERROR;
17691
0
            }
17692
0
        #endif
17693
0
            if (ssl->msgsReceived.got_client_key_exchange) {
17694
0
                WOLFSSL_MSG("Duplicate ClientKeyExchange received");
17695
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
17696
0
                return DUPLICATE_MSG_E;
17697
0
            }
17698
0
            ssl->msgsReceived.got_client_key_exchange = 1;
17699
17700
0
            if (ssl->msgsReceived.got_client_hello == 0) {
17701
0
                WOLFSSL_MSG("No ClientHello before ClientKeyExchange");
17702
0
                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17703
0
                return OUT_OF_ORDER_E;
17704
0
            }
17705
0
            break;
17706
0
#endif
17707
17708
0
        case finished:
17709
0
            if (ssl->msgsReceived.got_finished) {
17710
0
                WOLFSSL_MSG("Duplicate Finished received");
17711
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
17712
0
                return DUPLICATE_MSG_E;
17713
0
            }
17714
#ifdef WOLFSSL_DTLS
17715
            if (ssl->options.dtls) {
17716
                if (ssl->keys.curEpoch == 0) {
17717
                    WOLFSSL_MSG("Finished received with epoch 0");
17718
                    WOLFSSL_ERROR_VERBOSE(SEQUENCE_ERROR);
17719
                    return SEQUENCE_ERROR;
17720
                }
17721
            }
17722
#endif
17723
0
            ssl->msgsReceived.got_finished = 1;
17724
17725
0
            if (ssl->msgsReceived.got_change_cipher == 0) {
17726
0
                WOLFSSL_MSG("Finished received before ChangeCipher");
17727
0
                WOLFSSL_ERROR_VERBOSE(NO_CHANGE_CIPHER_E);
17728
0
                return NO_CHANGE_CIPHER_E;
17729
0
            }
17730
0
            break;
17731
17732
0
        case change_cipher_hs:
17733
0
            if (ssl->msgsReceived.got_change_cipher) {
17734
0
                WOLFSSL_MSG("Duplicate ChangeCipher received");
17735
0
                WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
17736
0
                return DUPLICATE_MSG_E;
17737
0
            }
17738
            /* DTLS is going to ignore the CCS message if the client key
17739
             * exchange message wasn't received yet. */
17740
0
            if (!ssl->options.dtls)
17741
0
                ssl->msgsReceived.got_change_cipher = 1;
17742
17743
0
#ifndef NO_WOLFSSL_CLIENT
17744
0
            if (ssl->options.side == WOLFSSL_CLIENT_END) {
17745
0
                if (!ssl->options.resuming) {
17746
0
                   if (ssl->msgsReceived.got_server_hello_done == 0) {
17747
0
                        WOLFSSL_MSG("No ServerHelloDone before ChangeCipher");
17748
0
                        WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17749
0
                        return OUT_OF_ORDER_E;
17750
0
                   }
17751
0
                }
17752
0
                else {
17753
0
                    if (ssl->msgsReceived.got_server_hello == 0) {
17754
0
                        WOLFSSL_MSG("No ServerHello before ChangeCipher on "
17755
0
                                    "Resume");
17756
0
                        WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17757
0
                        return OUT_OF_ORDER_E;
17758
0
                    }
17759
0
                }
17760
                #ifdef HAVE_SESSION_TICKET
17761
                    if (ssl->expect_session_ticket) {
17762
                        WOLFSSL_MSG("Expected session ticket missing");
17763
                        #ifdef WOLFSSL_DTLS
17764
                            if (ssl->options.dtls) {
17765
                                WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17766
                                return OUT_OF_ORDER_E;
17767
                            }
17768
                        #endif
17769
                        WOLFSSL_ERROR_VERBOSE(SESSION_TICKET_EXPECT_E);
17770
                        return SESSION_TICKET_EXPECT_E;
17771
                    }
17772
                #endif
17773
0
            }
17774
0
#endif
17775
0
#ifndef NO_WOLFSSL_SERVER
17776
0
            if (ssl->options.side == WOLFSSL_SERVER_END) {
17777
0
                if (!ssl->options.resuming &&
17778
0
                               ssl->msgsReceived.got_client_key_exchange == 0) {
17779
0
                    WOLFSSL_MSG("No ClientKeyExchange before ChangeCipher");
17780
0
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17781
0
                    return OUT_OF_ORDER_E;
17782
0
                }
17783
0
                #ifndef NO_CERTS
17784
0
                    if (ssl->options.verifyPeer &&
17785
0
                        ssl->options.havePeerCert) {
17786
17787
0
                        if (!ssl->options.havePeerVerify ||
17788
0
                                !ssl->msgsReceived.got_certificate_verify) {
17789
0
                            WOLFSSL_MSG("client didn't send cert verify");
17790
                            #ifdef WOLFSSL_DTLS
17791
                                if (ssl->options.dtls) {
17792
                                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17793
                                    return OUT_OF_ORDER_E;
17794
                                }
17795
                            #endif
17796
0
                            WOLFSSL_ERROR_VERBOSE(NO_PEER_VERIFY);
17797
0
                            return NO_PEER_VERIFY;
17798
0
                        }
17799
0
                    }
17800
0
                #endif
17801
0
            }
17802
0
#endif /* !NO_WOLFSSL_SERVER */
17803
0
            if (ssl->options.dtls)
17804
0
                ssl->msgsReceived.got_change_cipher = 1;
17805
0
            break;
17806
17807
0
        default:
17808
0
            WOLFSSL_MSG("Unknown message type");
17809
0
            WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
17810
0
            return SANITY_MSG_E;
17811
0
    }
17812
17813
0
    return 0;
17814
0
}
17815
17816
int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx,
17817
                          byte type, word32 size, word32 totalSz)
17818
0
{
17819
0
    int ret = 0;
17820
0
    word32 expectedIdx;
17821
17822
0
    WOLFSSL_ENTER("DoHandShakeMsgType");
17823
17824
0
#ifdef WOLFSSL_TLS13
17825
0
    if (type == hello_retry_request) {
17826
0
        return DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
17827
0
                                       totalSz);
17828
0
    }
17829
0
#endif
17830
17831
    /* make sure can read the message */
17832
0
    if (*inOutIdx + size > totalSz) {
17833
0
        WOLFSSL_MSG("Incomplete Data");
17834
0
        WOLFSSL_ERROR_VERBOSE(INCOMPLETE_DATA);
17835
0
        return INCOMPLETE_DATA;
17836
0
    }
17837
17838
0
    expectedIdx = *inOutIdx + size +
17839
0
                  (ssl->keys.encryptionOn ? ssl->keys.padSz : 0);
17840
17841
#if !defined(NO_WOLFSSL_SERVER) && \
17842
    defined(HAVE_SECURE_RENEGOTIATION) && \
17843
    defined(HAVE_SERVER_RENEGOTIATION_INFO)
17844
    if (ssl->options.handShakeDone && type == client_hello &&
17845
            ssl->secure_renegotiation &&
17846
            ssl->secure_renegotiation->enabled)
17847
    {
17848
        WOLFSSL_MSG("Reset handshake state");
17849
        XMEMSET(&ssl->msgsReceived, 0, sizeof(MsgsReceived));
17850
        ssl->options.serverState = NULL_STATE;
17851
        ssl->options.clientState = NULL_STATE;
17852
        ssl->options.connectState = CONNECT_BEGIN;
17853
        ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
17854
        ssl->options.handShakeState = NULL_STATE;
17855
        ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
17856
17857
        ret = InitHandshakeHashes(ssl);
17858
        if (ret != 0)
17859
            return ret;
17860
    }
17861
#endif
17862
17863
    /* sanity check msg received */
17864
0
    if ( (ret = SanityCheckMsgReceived(ssl, type)) != 0) {
17865
0
        WOLFSSL_MSG("Sanity Check on handshake message type received failed");
17866
0
        return ret;
17867
0
    }
17868
17869
#if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
17870
    /* add name later, add the handshake header part back on and record layer
17871
     * header */
17872
    if (ssl->toInfoOn) {
17873
        ret = AddPacketInfo(ssl, 0, handshake, input + *inOutIdx -
17874
            HANDSHAKE_HEADER_SZ, size + HANDSHAKE_HEADER_SZ, READ_PROTO,
17875
            RECORD_HEADER_SZ, ssl->heap);
17876
        if (ret != 0)
17877
            return ret;
17878
        #ifdef WOLFSSL_CALLBACKS
17879
        AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
17880
        #endif
17881
    }
17882
#endif
17883
17884
0
    if (ssl->options.handShakeState == HANDSHAKE_DONE && type != hello_request){
17885
0
        WOLFSSL_MSG("HandShake message after handshake complete");
17886
0
        SendAlert(ssl, alert_fatal, unexpected_message);
17887
0
        WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17888
0
        return OUT_OF_ORDER_E;
17889
0
    }
17890
17891
0
    if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls == 0 &&
17892
0
               ssl->options.serverState == NULL_STATE && type != server_hello &&
17893
0
               type != hello_request) {
17894
0
        WOLFSSL_MSG("First server message not server hello or "
17895
0
                    "hello request");
17896
0
        SendAlert(ssl, alert_fatal, unexpected_message);
17897
0
        WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17898
0
        return OUT_OF_ORDER_E;
17899
0
    }
17900
17901
0
    if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls &&
17902
0
            type == server_hello_done &&
17903
0
            ssl->options.serverState < SERVER_HELLO_COMPLETE) {
17904
0
        WOLFSSL_MSG("Server hello done received before server hello in DTLS");
17905
0
        SendAlert(ssl, alert_fatal, unexpected_message);
17906
0
        WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17907
0
        return OUT_OF_ORDER_E;
17908
0
    }
17909
17910
0
    if (ssl->options.side == WOLFSSL_SERVER_END &&
17911
0
               ssl->options.clientState == NULL_STATE && type != client_hello) {
17912
0
        WOLFSSL_MSG("First client message not client hello");
17913
0
        SendAlert(ssl, alert_fatal, unexpected_message);
17914
0
        WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17915
0
        return OUT_OF_ORDER_E;
17916
0
    }
17917
17918
    /* above checks handshake state */
17919
    /* hello_request not hashed */
17920
0
    if (type != hello_request
17921
    #ifdef WOLFSSL_ASYNC_CRYPT
17922
            && ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E)
17923
    #endif
17924
    #ifdef WOLFSSL_NONBLOCK_OCSP
17925
            && ssl->error != WC_NO_ERR_TRACE(OCSP_WANT_READ)
17926
    #endif
17927
0
    ) {
17928
0
        ret = HashInput(ssl, input + *inOutIdx, (int)size);
17929
0
        if (ret != 0) {
17930
0
            WOLFSSL_MSG("Incomplete handshake hashes");
17931
0
            return ret;
17932
0
        }
17933
0
    }
17934
17935
0
    if (ssl->options.side == WOLFSSL_CLIENT_END) {
17936
0
        switch (type) {
17937
0
        case certificate:
17938
0
        case server_key_exchange:
17939
0
        case certificate_request:
17940
0
        case server_hello_done:
17941
0
            if (ssl->options.resuming) {
17942
                /* Client requested resumption, but server is doing a
17943
                 * full handshake */
17944
17945
                /* The server's decision to resume isn't known until after the
17946
                 * "server_hello". If subsequent handshake messages like
17947
                 * "certificate" or "server_key_exchange" are received then we
17948
                 * are doing a full handshake */
17949
17950
                /* If the server included a session id then we
17951
                 * treat this as a fatal error, since the server said it was
17952
                 * doing resumption, but did not. */
17953
17954
                /* https://www.rfc-editor.org/rfc/rfc5077.html#section-3.4
17955
                 *   Alternatively, the client MAY include an empty Session ID
17956
                 *   in the ClientHello.  In this case, the client ignores the
17957
                 *   Session ID sent in the ServerHello and determines if the
17958
                 *   server is resuming a session by the subsequent handshake
17959
                 *   messages.
17960
                 */
17961
0
#ifndef WOLFSSL_WPAS
17962
0
                if (ssl->arrays->sessionIDSz != 0) {
17963
                    /* Fatal error. Only try to send an alert. RFC 5246 does not
17964
                     * allow for reverting back to a full handshake after the
17965
                     * server has indicated the intention to do a resumption. */
17966
0
                    (void)SendAlert(ssl, alert_fatal, unexpected_message);
17967
0
                    WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17968
0
                    return OUT_OF_ORDER_E;
17969
0
                }
17970
0
#endif
17971
                /* This can occur when ssl->sessionSecretCb is set. EAP-FAST
17972
                 * (RFC 4851) allows for detecting server session resumption
17973
                 * based on the msg received after the ServerHello. */
17974
0
                WOLFSSL_MSG("Not resuming as thought");
17975
0
                ssl->options.resuming = 0;
17976
                /* No longer resuming, reset peer authentication state. */
17977
0
                ssl->options.peerAuthGood = 0;
17978
0
            }
17979
0
        }
17980
0
    }
17981
17982
#ifdef OPENSSL_EXTRA
17983
    if (ssl->CBIS != NULL){
17984
        ssl->cbmode = WOLFSSL_CB_MODE_READ;
17985
        ssl->cbtype = type;
17986
        ssl->CBIS(ssl, WOLFSSL_CB_ACCEPT_LOOP, WOLFSSL_SUCCESS);
17987
    }
17988
#endif
17989
17990
0
    switch (type) {
17991
17992
0
    case hello_request:
17993
0
        WOLFSSL_MSG("processing hello request");
17994
0
        ret = DoHelloRequest(ssl, input, inOutIdx, size, totalSz);
17995
0
        break;
17996
17997
0
#ifndef NO_WOLFSSL_CLIENT
17998
0
    case hello_verify_request:
17999
0
        WOLFSSL_MSG("processing hello verify request");
18000
0
        ret = DoHelloVerifyRequest(ssl, input,inOutIdx, size);
18001
0
        if (IsEncryptionOn(ssl, 0)) {
18002
            /* access beyond input + size should be checked against totalSz
18003
             */
18004
0
            if (*inOutIdx + ssl->keys.padSz > totalSz)
18005
0
                return BUFFER_E;
18006
18007
0
            *inOutIdx += ssl->keys.padSz;
18008
0
        }
18009
0
        break;
18010
18011
0
    case server_hello:
18012
0
        WOLFSSL_MSG("processing server hello");
18013
0
        ret = DoServerHello(ssl, input, inOutIdx, size);
18014
0
    #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
18015
0
               ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \
18016
0
                (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
18017
0
                (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
18018
0
        if (ssl->options.resuming || !IsAtLeastTLSv1_2(ssl) ||
18019
0
                                               IsAtLeastTLSv1_3(ssl->version)) {
18020
18021
        #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
18022
            if (ret != WC_NO_ERR_TRACE(WC_PENDING_E) &&
18023
                ret != WC_NO_ERR_TRACE(OCSP_WANT_READ))
18024
        #endif
18025
0
            {
18026
0
                ssl->options.cacheMessages = 0;
18027
0
                if ((ssl->hsHashes != NULL) && (ssl->hsHashes->messages != NULL)) {
18028
0
                    ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
18029
0
                    XFREE(ssl->hsHashes->messages, ssl->heap,
18030
0
                        DYNAMIC_TYPE_HASHES);
18031
0
                    ssl->hsHashes->messages = NULL;
18032
0
                }
18033
0
            }
18034
0
        }
18035
0
    #endif
18036
0
        break;
18037
18038
0
#ifndef NO_CERTS
18039
0
    case certificate_request:
18040
0
        WOLFSSL_MSG("processing certificate request");
18041
0
        ret = DoCertificateRequest(ssl, input, inOutIdx, size);
18042
0
        break;
18043
0
#endif
18044
18045
0
    case server_key_exchange:
18046
0
        WOLFSSL_MSG("processing server key exchange");
18047
0
        ret = DoServerKeyExchange(ssl, input, inOutIdx, size);
18048
0
        break;
18049
18050
#ifdef HAVE_SESSION_TICKET
18051
    case session_ticket:
18052
        WOLFSSL_MSG("processing session ticket");
18053
        ret = DoSessionTicket(ssl, input, inOutIdx, size);
18054
        break;
18055
#endif /* HAVE_SESSION_TICKET */
18056
0
#endif
18057
18058
0
#if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \
18059
0
                                               !defined(WOLFSSL_NO_CLIENT_AUTH))
18060
0
    case certificate:
18061
0
        WOLFSSL_MSG("processing certificate");
18062
0
        ret = DoCertificate(ssl, input, inOutIdx, size);
18063
0
        break;
18064
18065
0
    case certificate_status:
18066
0
        WOLFSSL_MSG("processing certificate status");
18067
0
        ret = DoCertificateStatus(ssl, input, inOutIdx, size);
18068
0
        break;
18069
0
#endif
18070
18071
0
    case server_hello_done:
18072
0
        WOLFSSL_MSG("processing server hello done");
18073
    #ifdef WOLFSSL_CALLBACKS
18074
        if (ssl->hsInfoOn)
18075
            AddPacketName(ssl, "ServerHelloDone");
18076
        if (ssl->toInfoOn)
18077
            AddLateName("ServerHelloDone", &ssl->timeoutInfo);
18078
    #endif
18079
0
        ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
18080
0
        if (IsEncryptionOn(ssl, 0))
18081
0
            *inOutIdx += ssl->keys.padSz;
18082
0
        break;
18083
18084
0
    case finished:
18085
0
        WOLFSSL_MSG("processing finished");
18086
0
        ret = DoFinished(ssl, input, inOutIdx, size, totalSz, NO_SNIFF);
18087
0
        break;
18088
18089
0
#ifndef NO_WOLFSSL_SERVER
18090
0
    case client_hello:
18091
0
        WOLFSSL_MSG("processing client hello");
18092
0
        ret = DoClientHello(ssl, input, inOutIdx, size);
18093
0
    #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
18094
0
               ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \
18095
0
                (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
18096
0
                (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
18097
0
        if (ssl->options.resuming || !ssl->options.verifyPeer || \
18098
0
                     !IsAtLeastTLSv1_2(ssl) || IsAtLeastTLSv1_3(ssl->version)) {
18099
        #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
18100
            if (ret != WC_NO_ERR_TRACE(WC_PENDING_E) &&
18101
                ret != WC_NO_ERR_TRACE(OCSP_WANT_READ))
18102
        #endif
18103
0
            {
18104
0
                ssl->options.cacheMessages = 0;
18105
0
                if ((ssl->hsHashes != NULL) && (ssl->hsHashes->messages != NULL)) {
18106
0
                    ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
18107
0
                    XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
18108
0
                    ssl->hsHashes->messages = NULL;
18109
0
                }
18110
0
            }
18111
0
        }
18112
0
    #endif
18113
        /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
18114
         * about padding */
18115
0
        if (IsEncryptionOn(ssl, 0)) {
18116
            /* access beyond input + size should be checked against totalSz
18117
             */
18118
0
            if (size != totalSz &&
18119
0
                    *inOutIdx + ssl->keys.padSz > totalSz)
18120
0
                return BUFFER_E;
18121
0
            *inOutIdx += ssl->keys.padSz;
18122
0
        }
18123
0
        break;
18124
18125
0
    case client_key_exchange:
18126
0
        WOLFSSL_MSG("processing client key exchange");
18127
0
        ret = DoClientKeyExchange(ssl, input, inOutIdx, size);
18128
0
        break;
18129
18130
0
#if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
18131
0
                        defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
18132
0
    case certificate_verify:
18133
0
        WOLFSSL_MSG("processing certificate verify");
18134
0
        ret = DoCertificateVerify(ssl, input, inOutIdx, size);
18135
0
        break;
18136
0
#endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
18137
18138
0
#endif /* !NO_WOLFSSL_SERVER */
18139
18140
0
    default:
18141
0
        WOLFSSL_MSG("Unknown handshake message type");
18142
0
        ret = UNKNOWN_HANDSHAKE_TYPE;
18143
0
        break;
18144
0
    }
18145
0
    if (ret == 0 && expectedIdx != *inOutIdx) {
18146
0
        WOLFSSL_MSG("Extra data in handshake message");
18147
0
        if (!ssl->options.dtls)
18148
0
            SendAlert(ssl, alert_fatal, decode_error);
18149
0
        ret = DECODE_E;
18150
0
        WOLFSSL_ERROR_VERBOSE(ret);
18151
0
    }
18152
18153
#if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
18154
    /* if async, offset index so this msg will be processed again */
18155
    if ((ret == WC_NO_ERR_TRACE(WC_PENDING_E) ||
18156
         ret == WC_NO_ERR_TRACE(OCSP_WANT_READ)) && *inOutIdx > 0) {
18157
        *inOutIdx -= HANDSHAKE_HEADER_SZ;
18158
    #ifdef WOLFSSL_DTLS
18159
        if (ssl->options.dtls) {
18160
            *inOutIdx -= DTLS_HANDSHAKE_EXTRA;
18161
        }
18162
    #endif
18163
    }
18164
18165
    /* make sure async error is cleared */
18166
    if (ret == 0 && (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E) ||
18167
                     ssl->error == WC_NO_ERR_TRACE(OCSP_WANT_READ))) {
18168
        ssl->error = 0;
18169
    }
18170
#endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
18171
18172
#ifdef WOLFSSL_DTLS
18173
    if (ret == 0) {
18174
        if (type == client_hello) {
18175
            /* Advance expected number only if cookie exchange complete */
18176
            if (ssl->msgsReceived.got_client_hello)
18177
                ssl->keys.dtls_expected_peer_handshake_number =
18178
                    ssl->keys.dtls_peer_handshake_number + 1;
18179
        }
18180
        else if (type != finished) {
18181
            ssl->keys.dtls_expected_peer_handshake_number++;
18182
        }
18183
    }
18184
#endif
18185
18186
0
    WOLFSSL_LEAVE("DoHandShakeMsgType()", ret);
18187
0
    return ret;
18188
0
}
18189
18190
18191
static int DoHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
18192
                          word32 totalSz)
18193
74.6k
{
18194
74.6k
    int    ret = 0;
18195
74.6k
    word32 inputLength;
18196
18197
74.6k
    WOLFSSL_ENTER("DoHandShakeMsg");
18198
18199
74.6k
    if (ssl->arrays == NULL) {
18200
0
        byte   type;
18201
0
        word32 size;
18202
18203
0
        if (GetHandshakeHeader(ssl,input,inOutIdx,&type, &size, totalSz) != 0) {
18204
0
            WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
18205
0
            return PARSE_ERROR;
18206
0
        }
18207
18208
0
        ret = EarlySanityCheckMsgReceived(ssl, type, size);
18209
0
        if (ret != 0) {
18210
0
            WOLFSSL_ERROR(ret);
18211
0
            return ret;
18212
0
        }
18213
18214
0
        if (size > MAX_HANDSHAKE_SZ) {
18215
0
            WOLFSSL_MSG("Handshake message too large");
18216
0
            WOLFSSL_ERROR_VERBOSE(HANDSHAKE_SIZE_ERROR);
18217
0
            return HANDSHAKE_SIZE_ERROR;
18218
0
        }
18219
18220
0
        return DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
18221
0
    }
18222
18223
74.6k
    inputLength = ssl->buffers.inputBuffer.length - *inOutIdx;
18224
18225
    /* If there is a pending fragmented handshake message,
18226
     * pending message size will be non-zero. */
18227
74.6k
    if (ssl->arrays->pendingMsgSz == 0) {
18228
50.8k
        byte   type;
18229
50.8k
        word32 size;
18230
18231
50.8k
        if (GetHandshakeHeader(ssl, input, inOutIdx, &type, &size,
18232
50.8k
                               totalSz) != 0) {
18233
120
            WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
18234
120
            return PARSE_ERROR;
18235
120
        }
18236
18237
50.7k
        ret = EarlySanityCheckMsgReceived(ssl, type,
18238
50.7k
                min(inputLength - HANDSHAKE_HEADER_SZ, size));
18239
50.7k
        if (ret != 0) {
18240
209
            WOLFSSL_ERROR(ret);
18241
209
            return ret;
18242
209
        }
18243
18244
        /* Cap the maximum size of a handshake message to something reasonable.
18245
         * By default is the maximum size of a certificate message assuming
18246
         * nine 2048-bit RSA certificates in the chain. */
18247
50.4k
        if (size > MAX_HANDSHAKE_SZ) {
18248
149
            WOLFSSL_MSG("Handshake message too large");
18249
149
            WOLFSSL_ERROR_VERBOSE(HANDSHAKE_SIZE_ERROR);
18250
149
            return HANDSHAKE_SIZE_ERROR;
18251
149
        }
18252
18253
        /* size is the size of the certificate message payload */
18254
50.3k
        if (inputLength - HANDSHAKE_HEADER_SZ < size) {
18255
2.39k
            ssl->arrays->pendingMsgType = type;
18256
2.39k
            ssl->arrays->pendingMsgSz = size + HANDSHAKE_HEADER_SZ;
18257
2.39k
            ssl->arrays->pendingMsg = (byte*)XMALLOC(size + HANDSHAKE_HEADER_SZ,
18258
2.39k
                                                     ssl->heap,
18259
2.39k
                                                     DYNAMIC_TYPE_ARRAYS);
18260
2.39k
            if (ssl->arrays->pendingMsg == NULL)
18261
60
                return MEMORY_E;
18262
2.33k
            XMEMCPY(ssl->arrays->pendingMsg,
18263
2.33k
                    input + *inOutIdx - HANDSHAKE_HEADER_SZ,
18264
2.33k
                    inputLength);
18265
2.33k
            ssl->arrays->pendingMsgOffset = inputLength;
18266
2.33k
            *inOutIdx += inputLength - HANDSHAKE_HEADER_SZ;
18267
2.33k
            return 0;
18268
2.39k
        }
18269
18270
47.9k
        ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
18271
47.9k
    }
18272
23.7k
    else {
18273
23.7k
        word32 pendSz =
18274
23.7k
            ssl->arrays->pendingMsgSz - ssl->arrays->pendingMsgOffset;
18275
18276
        /* Catch the case where there may be the remainder of a fragmented
18277
         * handshake message and the next handshake message in the same
18278
         * record. */
18279
23.7k
        if (inputLength > pendSz)
18280
101
            inputLength = pendSz;
18281
18282
23.7k
        ret = EarlySanityCheckMsgReceived(ssl, ssl->arrays->pendingMsgType,
18283
23.7k
                inputLength);
18284
23.7k
        if (ret != 0) {
18285
53
            WOLFSSL_ERROR(ret);
18286
53
            return ret;
18287
53
        }
18288
18289
    #ifdef WOLFSSL_ASYNC_CRYPT
18290
        if (ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E))
18291
    #endif
18292
23.7k
        {
18293
            /* for async this copy was already done, do not replace, since
18294
             * contents may have been changed for inline operations */
18295
23.7k
            XMEMCPY(ssl->arrays->pendingMsg + ssl->arrays->pendingMsgOffset,
18296
23.7k
                    input + *inOutIdx, inputLength);
18297
23.7k
        }
18298
23.7k
        ssl->arrays->pendingMsgOffset += inputLength;
18299
23.7k
        *inOutIdx += inputLength;
18300
18301
23.7k
        if (ssl->arrays->pendingMsgOffset == ssl->arrays->pendingMsgSz)
18302
254
        {
18303
254
            word32 idx = HANDSHAKE_HEADER_SZ;
18304
254
            ret = DoHandShakeMsgType(ssl,
18305
254
                                     ssl->arrays->pendingMsg,
18306
254
                                     &idx, ssl->arrays->pendingMsgType,
18307
254
                                     ssl->arrays->pendingMsgSz - idx,
18308
254
                                     ssl->arrays->pendingMsgSz);
18309
        #ifdef WOLFSSL_ASYNC_CRYPT
18310
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
18311
                /* setup to process fragment again */
18312
                ssl->arrays->pendingMsgOffset -= inputLength;
18313
                *inOutIdx -= inputLength;
18314
            }
18315
            else
18316
        #endif
18317
254
            {
18318
254
                XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
18319
254
                ssl->arrays->pendingMsg = NULL;
18320
254
                ssl->arrays->pendingMsgSz = 0;
18321
254
            }
18322
254
        }
18323
23.7k
    }
18324
18325
71.6k
    WOLFSSL_LEAVE("DoHandShakeMsg()", ret);
18326
71.6k
    return ret;
18327
74.6k
}
18328
#endif /* !NO_TLS && !WOLFSSL_NO_TLS12 */
18329
18330
#ifdef WOLFSSL_EXTRA_ALERTS
18331
int SendFatalAlertOnly(WOLFSSL *ssl, int error)
18332
{
18333
    int why;
18334
18335
    /* already sent a more specific fatal alert  */
18336
    if (ssl->alert_history.last_tx.level == alert_fatal)
18337
        return 0;
18338
18339
    switch (error) {
18340
        /* not fatal errors */
18341
    case WC_NO_ERR_TRACE(WANT_WRITE):
18342
    case WC_NO_ERR_TRACE(WANT_READ):
18343
    case WC_NO_ERR_TRACE(ZERO_RETURN):
18344
#ifdef WOLFSSL_NONBLOCK_OCSP
18345
    case WC_NO_ERR_TRACE(OCSP_WANT_READ):
18346
#endif
18347
#ifdef WOLFSSL_ASYNC_CRYPT
18348
    case WC_NO_ERR_TRACE(WC_PENDING_E):
18349
#endif
18350
        return 0;
18351
18352
    /* peer already disconnected and ssl is possibly in bad state
18353
     * don't try to send an alert */
18354
    case WC_NO_ERR_TRACE(SOCKET_ERROR_E):
18355
        return error;
18356
18357
    case WC_NO_ERR_TRACE(BUFFER_ERROR):
18358
    case WC_NO_ERR_TRACE(ASN_PARSE_E):
18359
    case WC_NO_ERR_TRACE(COMPRESSION_ERROR):
18360
        why = decode_error;
18361
        break;
18362
    case WC_NO_ERR_TRACE(VERIFY_FINISHED_ERROR):
18363
    case WC_NO_ERR_TRACE(SIG_VERIFY_E):
18364
        why = decrypt_error;
18365
        break;
18366
    case WC_NO_ERR_TRACE(DUPLICATE_MSG_E):
18367
    case WC_NO_ERR_TRACE(NO_CHANGE_CIPHER_E):
18368
    case WC_NO_ERR_TRACE(OUT_OF_ORDER_E):
18369
        why = unexpected_message;
18370
        break;
18371
    case WC_NO_ERR_TRACE(ECC_OUT_OF_RANGE_E):
18372
        why = bad_record_mac;
18373
        break;
18374
    case WC_NO_ERR_TRACE(MATCH_SUITE_ERROR):
18375
    case WC_NO_ERR_TRACE(VERSION_ERROR):
18376
    default:
18377
        why = handshake_failure;
18378
        break;
18379
    }
18380
18381
    return SendAlert(ssl, alert_fatal, why);
18382
}
18383
#else
18384
int SendFatalAlertOnly(WOLFSSL *ssl, int error)
18385
{
18386
    (void)ssl;
18387
    (void)error;
18388
    /* no op */
18389
    return 0;
18390
}
18391
#endif /* WOLFSSL_EXTRA_ALERTS */
18392
18393
#ifdef WOLFSSL_DTLS
18394
18395
static int _DtlsCheckWindow(WOLFSSL* ssl)
18396
{
18397
    word32* window;
18398
    word16 cur_hi, next_hi;
18399
    word32 cur_lo, next_lo, diff;
18400
    int curLT;
18401
    WOLFSSL_DTLS_PEERSEQ* peerSeq = NULL;
18402
18403
    if (!ssl->options.haveMcast)
18404
        peerSeq = ssl->keys.peerSeq;
18405
    else {
18406
#ifdef WOLFSSL_MULTICAST
18407
        WOLFSSL_DTLS_PEERSEQ* p;
18408
        int i;
18409
18410
        for (i = 0, p = ssl->keys.peerSeq;
18411
             i < WOLFSSL_DTLS_PEERSEQ_SZ;
18412
             i++, p++) {
18413
18414
            if (p->peerId == ssl->keys.curPeerId) {
18415
                peerSeq = p;
18416
                break;
18417
            }
18418
        }
18419
#endif
18420
    }
18421
18422
    if (peerSeq == NULL) {
18423
        WOLFSSL_MSG("Could not find peer sequence");
18424
        return 0;
18425
    }
18426
18427
    if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
18428
        next_hi = peerSeq->nextSeq_hi;
18429
        next_lo = peerSeq->nextSeq_lo;
18430
        window = peerSeq->window;
18431
    }
18432
    else if (ssl->keys.curEpoch == peerSeq->nextEpoch - 1) {
18433
        next_hi = peerSeq->prevSeq_hi;
18434
        next_lo = peerSeq->prevSeq_lo;
18435
        window = peerSeq->prevWindow;
18436
    }
18437
    else {
18438
        return 0;
18439
    }
18440
18441
    cur_hi = ssl->keys.curSeq_hi;
18442
    cur_lo = ssl->keys.curSeq_lo;
18443
18444
    /* If the difference between next and cur is > 2^32, way outside window. */
18445
    if ((cur_hi > next_hi + 1) || (next_hi > cur_hi + 1)) {
18446
        WOLFSSL_MSG("Current record from way too far in the future.");
18447
        return 0;
18448
    }
18449
18450
    if (cur_hi == next_hi) {
18451
        curLT = cur_lo < next_lo;
18452
        diff = curLT ? next_lo - cur_lo : cur_lo - next_lo;
18453
    }
18454
    else {
18455
        curLT = cur_hi < next_hi;
18456
        diff = curLT ? cur_lo - next_lo : next_lo - cur_lo;
18457
    }
18458
18459
    /* Check to see that the next value is greater than the number of messages
18460
     * trackable in the window, and that the difference between the next
18461
     * expected sequence number and the received sequence number is inside the
18462
     * window. */
18463
    if ((next_hi || next_lo > DTLS_SEQ_BITS) &&
18464
        curLT && (diff > DTLS_SEQ_BITS)) {
18465
18466
        WOLFSSL_MSG("Current record sequence number from the past.");
18467
        return 0;
18468
    }
18469
#ifdef WOLFSSL_DTLS_DISALLOW_FUTURE
18470
    else if (!curLT && (diff > DTLS_SEQ_BITS)) {
18471
        WOLFSSL_MSG("Rejecting message too far into the future.");
18472
        return 0;
18473
    }
18474
#endif
18475
    else if (curLT) {
18476
        word32 idx;
18477
        word32 newDiff;
18478
        if (diff == 0) {
18479
            WOLFSSL_MSG("DTLS sanity check failed");
18480
            return 0;
18481
        }
18482
        diff--;
18483
        idx = diff / DTLS_WORD_BITS;
18484
        newDiff = diff % DTLS_WORD_BITS;
18485
18486
        /* verify idx is valid for window array */
18487
        if (idx >= WOLFSSL_DTLS_WINDOW_WORDS) {
18488
            WOLFSSL_MSG("Invalid DTLS windows index");
18489
            return 0;
18490
        }
18491
18492
        if (window[idx] & (1 << newDiff)) {
18493
            WOLFSSL_MSG("Current record sequence number already received.");
18494
            return 0;
18495
        }
18496
    }
18497
18498
    return 1;
18499
}
18500
18501
#ifdef WOLFSSL_DTLS13
18502
static WC_INLINE int Dtls13CheckWindow(WOLFSSL* ssl)
18503
{
18504
    w64wrapper nextSeq, seq;
18505
    w64wrapper diff64;
18506
    word32 *window;
18507
    int wordOffset;
18508
    int wordIndex;
18509
    word32 diff;
18510
18511
    WOLFSSL_ENTER("Dtls13CheckWindow");
18512
18513
    if (ssl->dtls13DecryptEpoch == NULL) {
18514
        WOLFSSL_MSG("Can't find decrypting epoch");
18515
        return 0;
18516
    }
18517
18518
    nextSeq = ssl->dtls13DecryptEpoch->nextPeerSeqNumber;
18519
    window = ssl->dtls13DecryptEpoch->window;
18520
    seq = ssl->keys.curSeq;
18521
18522
    if (w64GTE(seq, nextSeq))
18523
        return 1;
18524
18525
    /* seq < nextSeq, nextSeq - seq */
18526
    diff64 = w64Sub(nextSeq, seq);
18527
18528
    /* diff >= DTLS_SEQ_BITS, outside of the window */
18529
    if (w64GT(diff64, w64From32(0, DTLS_SEQ_BITS)))
18530
        return 0;
18531
18532
    /* we are assuming DTLS_SEQ_BITS <= 2**32 */
18533
    diff = w64GetLow32(diff64);
18534
18535
    /* zero based index */
18536
    diff--;
18537
18538
    wordIndex = ((int)diff) / DTLS_WORD_BITS;
18539
    wordOffset = ((int)diff) % DTLS_WORD_BITS;
18540
18541
    if (window[wordIndex] & (1 << wordOffset))
18542
        return 0;
18543
18544
    return 1;
18545
}
18546
18547
#endif /* WOLFSSL_DTLS13 */
18548
18549
#ifdef WOLFSSL_MULTICAST
18550
static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
18551
                                         word32 second, word32 high)
18552
{
18553
    word32 newCur = 0;
18554
18555
    if (cur < first)
18556
        newCur = first;
18557
    else if (cur < second)
18558
        newCur = second;
18559
    else if (cur < high)
18560
        newCur = high;
18561
18562
    return newCur;
18563
}
18564
#endif /* WOLFSSL_MULTICAST */
18565
18566
/* diff is the difference between the message sequence and the
18567
 * expected sequence number. 0 is special where it is an overflow. */
18568
static void _DtlsUpdateWindowGTSeq(word32 diff, word32* window)
18569
{
18570
    word32 oldWindow[WOLFSSL_DTLS_WINDOW_WORDS];
18571
18572
    if (diff == 0 || diff >= DTLS_SEQ_BITS)
18573
        XMEMSET(window, 0, DTLS_SEQ_SZ);
18574
    else {
18575
        word32 i;
18576
        word32 temp = 0;
18577
        word32 idx = diff / DTLS_WORD_BITS;
18578
        diff %= DTLS_WORD_BITS;
18579
18580
        XMEMCPY(oldWindow, window, sizeof(oldWindow));
18581
18582
        for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
18583
            if (i < idx)
18584
                window[i] = 0;
18585
            else {
18586
                temp |= (oldWindow[i-idx] << diff);
18587
                window[i] = temp;
18588
                if (diff > 0)
18589
                    temp = oldWindow[i-idx] >> (DTLS_WORD_BITS - diff);
18590
                else
18591
                    temp = 0;
18592
            }
18593
        }
18594
    }
18595
    window[0] |= 1;
18596
}
18597
18598
int wolfSSL_DtlsUpdateWindow(word16 cur_hi, word32 cur_lo,
18599
        word16* next_hi, word32* next_lo, word32 *window)
18600
{
18601
    word32 diff;
18602
    int curLT;
18603
18604
    if (cur_hi == *next_hi) {
18605
        curLT = cur_lo < *next_lo;
18606
        diff = curLT ? *next_lo - cur_lo : cur_lo - *next_lo;
18607
    }
18608
    else {
18609
        if (cur_hi > *next_hi + 1) {
18610
            /* reset window */
18611
            _DtlsUpdateWindowGTSeq(0, window);
18612
            *next_lo = cur_lo + 1;
18613
            if (*next_lo == 0)
18614
                *next_hi = cur_hi + 1;
18615
            else
18616
                *next_hi = cur_hi;
18617
            return 1;
18618
        }
18619
        else if (*next_hi > cur_hi + 1) {
18620
            return 1;
18621
        }
18622
        else {
18623
            curLT = cur_hi < *next_hi;
18624
            if (curLT) {
18625
                if (*next_lo < DTLS_SEQ_BITS &&
18626
                        cur_lo >= (((word32)0xFFFFFFFF) - DTLS_SEQ_BITS)) {
18627
                    /* diff here can still result in a difference that can not
18628
                     * be stored in the window. The index is checked against
18629
                     * WOLFSSL_DTLS_WINDOW_WORDS later. */
18630
                    diff = *next_lo + ((word32)0xFFFFFFFF - cur_lo) + 1;
18631
                }
18632
                else {
18633
                    /* Too far back to update */
18634
                    return 1;
18635
                }
18636
            }
18637
            else {
18638
                if (*next_lo >= (((word32)0xFFFFFFFF) - DTLS_SEQ_BITS) &&
18639
                        cur_lo < DTLS_SEQ_BITS) {
18640
                    /* diff here can still result in a difference that can not
18641
                     * be stored in the window. The index is checked against
18642
                     * WOLFSSL_DTLS_WINDOW_WORDS later. */
18643
                    diff = cur_lo - *next_lo;
18644
                }
18645
                else {
18646
                    _DtlsUpdateWindowGTSeq(0, window);
18647
                    *next_lo = cur_lo + 1;
18648
                    if (*next_lo == 0)
18649
                        *next_hi = cur_hi + 1;
18650
                    else
18651
                        *next_hi = cur_hi;
18652
                    return 1;
18653
                }
18654
            }
18655
        }
18656
    }
18657
18658
    if (curLT) {
18659
        word32 idx;
18660
18661
        diff--;
18662
        idx = diff / DTLS_WORD_BITS;
18663
        diff %= DTLS_WORD_BITS;
18664
18665
        if (idx < WOLFSSL_DTLS_WINDOW_WORDS)
18666
            window[idx] |= (1U << diff);
18667
    }
18668
    else {
18669
        _DtlsUpdateWindowGTSeq(diff + 1, window);
18670
        *next_lo = cur_lo + 1;
18671
        if (*next_lo == 0)
18672
            *next_hi = cur_hi + 1;
18673
        else
18674
            *next_hi = cur_hi;
18675
    }
18676
18677
    return 1;
18678
}
18679
18680
int DtlsUpdateWindow(WOLFSSL* ssl)
18681
{
18682
    WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
18683
    word16 *next_hi;
18684
    word32 *next_lo;
18685
    word32* window;
18686
18687
#ifdef WOLFSSL_MULTICAST
18688
    word32 cur_lo = ssl->keys.curSeq_lo;
18689
18690
    if (ssl->options.haveMcast) {
18691
        WOLFSSL_DTLS_PEERSEQ* p;
18692
        int i;
18693
18694
        peerSeq = NULL;
18695
        for (i = 0, p = ssl->keys.peerSeq;
18696
             i < WOLFSSL_DTLS_PEERSEQ_SZ;
18697
             i++, p++) {
18698
18699
            if (p->peerId == ssl->keys.curPeerId) {
18700
                peerSeq = p;
18701
                break;
18702
            }
18703
        }
18704
18705
        if (peerSeq == NULL) {
18706
            WOLFSSL_MSG("Couldn't find that peer ID to update window.");
18707
            return 0;
18708
        }
18709
18710
        if (p->highwaterMark && cur_lo >= p->highwaterMark) {
18711
            int cbError = 0;
18712
18713
            if (ssl->ctx->mcastHwCb)
18714
                cbError = ssl->ctx->mcastHwCb(p->peerId,
18715
                                              ssl->ctx->mcastMaxSeq,
18716
                                              cur_lo, ssl->mcastHwCbCtx);
18717
            if (cbError) {
18718
                WOLFSSL_MSG("Multicast highwater callback returned an error.");
18719
                return MCAST_HIGHWATER_CB_E;
18720
            }
18721
18722
            p->highwaterMark = UpdateHighwaterMark(cur_lo,
18723
                                                   ssl->ctx->mcastFirstSeq,
18724
                                                   ssl->ctx->mcastSecondSeq,
18725
                                                   ssl->ctx->mcastMaxSeq);
18726
        }
18727
    }
18728
#endif
18729
18730
    if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
18731
        next_hi = &peerSeq->nextSeq_hi;
18732
        next_lo = &peerSeq->nextSeq_lo;
18733
        window = peerSeq->window;
18734
    }
18735
    else {
18736
        next_hi = &peerSeq->prevSeq_hi;
18737
        next_lo = &peerSeq->prevSeq_lo;
18738
        window = peerSeq->prevWindow;
18739
    }
18740
18741
    return wolfSSL_DtlsUpdateWindow(ssl->keys.curSeq_hi, ssl->keys.curSeq_lo,
18742
            next_hi, next_lo, window);
18743
}
18744
18745
#ifdef WOLFSSL_DTLS13
18746
18747
/* Update DTLS 1.3 window
18748
 * Return
18749
 *   0 on successful update
18750
 *  <0 on error
18751
 */
18752
static int Dtls13UpdateWindow(WOLFSSL* ssl)
18753
{
18754
    w64wrapper nextSeq, seq;
18755
    w64wrapper diff64;
18756
    word32 *window;
18757
    int wordOffset;
18758
    int wordIndex;
18759
    word32 diff;
18760
    Dtls13Epoch* e = ssl->dtls13DecryptEpoch;
18761
18762
    WOLFSSL_ENTER("Dtls13UpdateWindow");
18763
18764
    if (ssl->dtls13DecryptEpoch == NULL) {
18765
        WOLFSSL_MSG("Can't find decrypting Epoch");
18766
        return BAD_STATE_E;
18767
    }
18768
18769
    if (!w64Equal(ssl->keys.curEpoch64, ssl->dtls13DecryptEpoch->epochNumber)) {
18770
        /* ssl->dtls13DecryptEpoch has been updated since we received the msg */
18771
        e = Dtls13GetEpoch(ssl, ssl->keys.curEpoch64);
18772
        if (e == NULL) {
18773
            WOLFSSL_MSG("Can't find decrypting Epoch");
18774
            return BAD_STATE_E;
18775
        }
18776
    }
18777
18778
    nextSeq = e->nextPeerSeqNumber;
18779
    window = e->window;
18780
    seq = ssl->keys.curSeq;
18781
18782
    /* seq < nextSeq */
18783
    if (w64LT(seq, nextSeq)) {
18784
        diff64 = w64Sub(nextSeq, seq);
18785
18786
        /* zero based index */
18787
        w64Decrement(&diff64);
18788
18789
        /* FIXME: check that diff64 < DTLS_WORDS_BITS */
18790
        diff = w64GetLow32(diff64);
18791
        wordIndex = ((int)diff) / DTLS_WORD_BITS;
18792
        wordOffset = ((int)diff) % DTLS_WORD_BITS;
18793
18794
        if (wordIndex >= WOLFSSL_DTLS_WINDOW_WORDS) {
18795
            WOLFSSL_MSG("Invalid sequence number to Dtls13UpdateWindow");
18796
            return BAD_STATE_E;
18797
        }
18798
18799
        window[wordIndex] |= (1 << wordOffset);
18800
        return 0;
18801
    }
18802
18803
    /* seq >= nextSeq, seq - nextSeq */
18804
    diff64 = w64Sub(seq, nextSeq);
18805
18806
    /* as we are considering nextSeq inside the window, we should add + 1 */
18807
    w64Increment(&diff64);
18808
    _DtlsUpdateWindowGTSeq(w64GetLow32(diff64), window);
18809
18810
    w64Increment(&seq);
18811
    e->nextPeerSeqNumber = seq;
18812
18813
    return 0;
18814
}
18815
18816
int Dtls13UpdateWindowRecordRecvd(WOLFSSL* ssl)
18817
{
18818
    int ret = Dtls13UpdateWindow(ssl);
18819
    if (ret != 0)
18820
        return ret;
18821
    return Dtls13RecordRecvd(ssl);
18822
}
18823
#endif /* WOLFSSL_DTLS13 */
18824
18825
int DtlsMsgDrain(WOLFSSL* ssl)
18826
{
18827
    DtlsMsg* item = ssl->dtls_rx_msg_list;
18828
    int ret = 0;
18829
18830
    WOLFSSL_ENTER("DtlsMsgDrain");
18831
18832
    /* While there is an item in the store list, and it is the expected
18833
     * message, and it is complete, and there hasn't been an error in the
18834
     * last message... */
18835
    while (item != NULL &&
18836
            ssl->keys.dtls_expected_peer_handshake_number == item->seq &&
18837
            item->ready && ret == 0) {
18838
        word32 idx = 0;
18839
18840
    #ifndef WOLFSSL_DISABLE_EARLY_SANITY_CHECKS
18841
        ret = MsgCheckEncryption(ssl, item->type, item->encrypted);
18842
        if (ret != 0) {
18843
            SendAlert(ssl, alert_fatal, unexpected_message);
18844
            break;
18845
        }
18846
    #endif
18847
18848
    #ifdef WOLFSSL_NO_TLS12
18849
        ret = DoTls13HandShakeMsgType(ssl, item->fullMsg, &idx, item->type,
18850
                                      item->sz, item->sz);
18851
    #else
18852
        ret = DoHandShakeMsgType(ssl, item->fullMsg, &idx, item->type,
18853
                                      item->sz, item->sz);
18854
    #endif
18855
        if (ret == 0) {
18856
            DtlsTxMsgListClean(ssl);
18857
        }
18858
        else if (!IsAtLeastTLSv1_3(ssl->version)) {
18859
            if (SendFatalAlertOnly(ssl, ret) == WC_NO_ERR_TRACE(SOCKET_ERROR_E)) {
18860
                ret = SOCKET_ERROR_E;
18861
            }
18862
        }
18863
    #ifdef WOLFSSL_ASYNC_CRYPT
18864
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
18865
            break;
18866
        }
18867
    #endif
18868
        ssl->dtls_rx_msg_list = item->next;
18869
        DtlsMsgDelete(item, ssl->heap);
18870
        item = ssl->dtls_rx_msg_list;
18871
        ssl->dtls_rx_msg_list_sz--;
18872
    }
18873
18874
    WOLFSSL_LEAVE("DtlsMsgDrain()", ret);
18875
    return ret;
18876
}
18877
18878
18879
static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
18880
                          word32 totalSz)
18881
{
18882
    byte type;
18883
    word32 size;
18884
    word32 fragOffset, fragSz;
18885
    int ret = 0;
18886
    int ignoreFinished = 0;
18887
18888
    WOLFSSL_ENTER("DoDtlsHandShakeMsg");
18889
18890
    /* parse header */
18891
    if (GetDtlsHandShakeHeader(ssl, input, inOutIdx, &type,
18892
                               &size, &fragOffset, &fragSz, totalSz) != 0) {
18893
        WOLFSSL_ERROR(PARSE_ERROR);
18894
        return PARSE_ERROR;
18895
    }
18896
18897
    ret = EarlySanityCheckMsgReceived(ssl, type, fragSz);
18898
    if (ret != 0) {
18899
        WOLFSSL_ERROR(ret);
18900
        return ret;
18901
    }
18902
18903
    /* Cap the maximum size of a handshake message to something reasonable.
18904
     * By default is the maximum size of a certificate message assuming
18905
     * nine 2048-bit RSA certificates in the chain. */
18906
    if (size > MAX_HANDSHAKE_SZ) {
18907
        WOLFSSL_MSG("Handshake message too large");
18908
        return HANDSHAKE_SIZE_ERROR;
18909
    }
18910
18911
    /* check that we have complete fragment */
18912
    if (*inOutIdx + fragSz > totalSz) {
18913
        WOLFSSL_ERROR(INCOMPLETE_DATA);
18914
        return INCOMPLETE_DATA;
18915
    }
18916
18917
    /* check that the fragment is contained in the message */
18918
    if (fragOffset + fragSz > size) {
18919
        WOLFSSL_ERROR(LENGTH_ERROR);
18920
        return LENGTH_ERROR;
18921
    }
18922
18923
    if (type == finished && ssl->keys.dtls_peer_handshake_number >=
18924
                            ssl->keys.dtls_expected_peer_handshake_number &&
18925
                            ssl->keys.curEpoch == ssl->keys.dtls_epoch) {
18926
        /* finished msg should be ignore from the current epoch
18927
         * if it comes from a previous handshake */
18928
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
18929
            ignoreFinished = ssl->options.connectState < FINISHED_DONE;
18930
        }
18931
        else {
18932
            ignoreFinished = ssl->options.acceptState < ACCEPT_FINISHED_DONE;
18933
        }
18934
    }
18935
18936
#if !defined(NO_WOLFSSL_SERVER)
18937
    if (ssl->options.side == WOLFSSL_SERVER_END &&
18938
            ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE &&
18939
            type != client_hello) {
18940
        WOLFSSL_MSG("Ignoring other messages before we verify a ClientHello");
18941
        *inOutIdx = totalSz;
18942
        return 0;
18943
    }
18944
#endif
18945
18946
    /* Check the handshake sequence number first. If out of order,
18947
     * add the current message to the list. If the message is in order,
18948
     * but it is a fragment, add the current message to the list, then
18949
     * check the head of the list to see if it is complete, if so, pop
18950
     * it out as the current message. If the message is complete and in
18951
     * order, process it. Check the head of the list to see if it is in
18952
     * order, if so, process it. (Repeat until list exhausted.) If the
18953
     * head is out of order, return for more processing.
18954
     */
18955
    if (ssl->keys.dtls_peer_handshake_number >
18956
            ssl->keys.dtls_expected_peer_handshake_number &&
18957
            /* Only client_hello shouldn't be ignored if the handshake
18958
             * num is greater */
18959
            (type == client_hello ||
18960
                    ssl->options.handShakeState != HANDSHAKE_DONE) &&
18961
            !ignoreFinished) {
18962
        /* Current message is out of order. It will get stored in the list.
18963
         * Storing also takes care of defragmentation. If the messages is a
18964
         * client hello, we need to process this out of order; the server
18965
         * is not supposed to keep state, but the second client hello will
18966
         * have a different handshake sequence number than is expected, and
18967
         * the server shouldn't be expecting any particular handshake sequence
18968
         * number. (If the cookie changes multiple times in quick succession,
18969
         * the client could be sending multiple new client hello messages
18970
         * with newer and newer cookies.) */
18971
        if (type != client_hello) {
18972
            WOLFSSL_MSG("Current message is out of order");
18973
            if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
18974
                WOLFSSL_MSG("Reached rx msg limit error");
18975
                return DTLS_TOO_MANY_FRAGMENTS_E;
18976
            }
18977
18978
            DtlsMsgStore(ssl, ssl->keys.curEpoch,
18979
                         ssl->keys.dtls_peer_handshake_number,
18980
                         input + *inOutIdx, size, type,
18981
                         fragOffset, fragSz, ssl->heap);
18982
            *inOutIdx += fragSz;
18983
            if (*inOutIdx + ssl->keys.padSz > totalSz) {
18984
                WOLFSSL_ERROR(BUFFER_E);
18985
                return BUFFER_E;
18986
            }
18987
            *inOutIdx += ssl->keys.padSz;
18988
            ret = 0;
18989
            #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
18990
            /* If we receive an out of order last flight msg then retransmit */
18991
            if (type == server_hello_done || type == finished) {
18992
                ret = DtlsMsgPoolSend(ssl, 0);
18993
            }
18994
            #endif
18995
        }
18996
        else {
18997
            if (fragSz < size) {
18998
                /* a fragmented ClientHello, very probably forged or
18999
                   erroneous. Even if the packet is valid, we don't want to save
19000
                   state while processing a ClientHello to avoid DoS attacks */
19001
                WOLFSSL_MSG("Ignoring datagram with fragmented ClientHello");
19002
                *inOutIdx = totalSz;
19003
            }
19004
            else {
19005
            #ifdef WOLFSSL_NO_TLS12
19006
                ret = DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
19007
                    totalSz);
19008
            #else
19009
                ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size,
19010
                    totalSz);
19011
            #endif
19012
            }
19013
        }
19014
    }
19015
    else if (ssl->keys.dtls_peer_handshake_number <
19016
                ssl->keys.dtls_expected_peer_handshake_number ||
19017
            /* ignore all handshake messages if we are done with the
19018
             * handshake */
19019
            (ssl->keys.dtls_peer_handshake_number >
19020
                ssl->keys.dtls_expected_peer_handshake_number &&
19021
                ssl->options.handShakeState == HANDSHAKE_DONE) ||
19022
            ignoreFinished) {
19023
        /* Already saw this message and processed it. It can be ignored. */
19024
        WOLFSSL_MSG("Already saw this message and processed it");
19025
        *inOutIdx += fragSz;
19026
        if (*inOutIdx + ssl->keys.padSz > totalSz) {
19027
            WOLFSSL_ERROR(BUFFER_E);
19028
            return BUFFER_E;
19029
        }
19030
        #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
19031
        if (IsDtlsNotSctpMode(ssl) &&
19032
            VerifyForDtlsMsgPoolSend(ssl, type, fragOffset)) {
19033
19034
            ret = DtlsMsgPoolSend(ssl, 0);
19035
        }
19036
        #endif
19037
        *inOutIdx += ssl->keys.padSz;
19038
    }
19039
    else if (fragSz < size) {
19040
        /* Since this branch is in order, but fragmented, dtls_rx_msg_list will
19041
         * be pointing to the message with this fragment in it. Check it to see
19042
         * if it is completed. */
19043
        WOLFSSL_MSG("Branch is in order, but fragmented");
19044
19045
        if (type == client_hello) {
19046
            WOLFSSL_MSG("Ignoring datagram with fragmented ClientHello");
19047
            *inOutIdx = totalSz;
19048
            return 0;
19049
        }
19050
19051
        if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
19052
            WOLFSSL_MSG("Reached rx msg limit error");
19053
            WOLFSSL_ERROR(DTLS_TOO_MANY_FRAGMENTS_E);
19054
            return DTLS_TOO_MANY_FRAGMENTS_E;
19055
        }
19056
        DtlsMsgStore(ssl, ssl->keys.curEpoch,
19057
                     ssl->keys.dtls_peer_handshake_number,
19058
                     input + *inOutIdx, size, type,
19059
                     fragOffset, fragSz, ssl->heap);
19060
        *inOutIdx += fragSz;
19061
        if (*inOutIdx + ssl->keys.padSz > totalSz) {
19062
            WOLFSSL_ERROR(BUFFER_E);
19063
            return BUFFER_E;
19064
        }
19065
        *inOutIdx += ssl->keys.padSz;
19066
        ret = 0;
19067
        if (ssl->dtls_rx_msg_list != NULL && ssl->dtls_rx_msg_list->ready)
19068
            ret = DtlsMsgDrain(ssl);
19069
    }
19070
    else {
19071
        /* This branch is in order next, and a complete message. On success
19072
         * clean the tx list. */
19073
        WOLFSSL_MSG("Branch is in order and a complete message");
19074
19075
#ifdef WOLFSSL_ASYNC_CRYPT
19076
        if (ssl->devId != INVALID_DEVID) {
19077
            word32 idx = *inOutIdx;
19078
            if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
19079
                WOLFSSL_ERROR(BUFFER_ERROR);
19080
                return BUFFER_ERROR;
19081
            }
19082
            if (idx + fragSz + ssl->keys.padSz > totalSz)
19083
                return BUFFER_E;
19084
            *inOutIdx = idx + fragSz + ssl->keys.padSz;
19085
            /* In async mode always store the message and process it with
19086
             * DtlsMsgDrain because in case of a WC_PENDING_E it will be
19087
             * easier this way. */
19088
            if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
19089
                WOLFSSL_MSG("Reached rx msg limit error");
19090
                return DTLS_TOO_MANY_FRAGMENTS_E;
19091
            }
19092
            DtlsMsgStore(ssl, ssl->keys.curEpoch,
19093
                         ssl->keys.dtls_peer_handshake_number,
19094
                         input + idx, size, type,
19095
                         fragOffset, fragSz, ssl->heap);
19096
            ret = DtlsMsgDrain(ssl);
19097
        }
19098
        else
19099
#endif
19100
        {
19101
#ifdef WOLFSSL_NO_TLS12
19102
            ret = DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
19103
                                  totalSz);
19104
#else
19105
            ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
19106
#endif
19107
            if (ret == 0) {
19108
                DtlsTxMsgListClean(ssl);
19109
                if (ssl->dtls_rx_msg_list != NULL) {
19110
                    ret = DtlsMsgDrain(ssl);
19111
                }
19112
            }
19113
        }
19114
    }
19115
19116
    WOLFSSL_LEAVE("DoDtlsHandShakeMsg()", ret);
19117
    return ret;
19118
}
19119
#endif /* WOLFSSL_DTLS13 */
19120
19121
#ifndef NO_TLS
19122
#ifndef WOLFSSL_NO_TLS12
19123
19124
#ifdef HAVE_AEAD
19125
19126
#if (!defined(NO_PUBLIC_GCM_SET_IV) && \
19127
    ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
19128
    (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))) || \
19129
    (defined(HAVE_POLY1305) && defined(HAVE_CHACHA))
19130
static WC_INLINE void AeadIncrementExpIV(WOLFSSL* ssl)
19131
252
{
19132
252
    int i;
19133
252
    for (i = AEAD_MAX_EXP_SZ-1; i >= 0; i--) {
19134
252
        if (++ssl->keys.aead_exp_IV[i]) return;
19135
252
    }
19136
252
}
19137
#endif
19138
19139
19140
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && !defined(NO_CHAPOL_AEAD)
19141
/* Used for the older version of creating AEAD tags with Poly1305 */
19142
static int Poly1305TagOld(WOLFSSL* ssl, byte* additional, int additionalSz,
19143
        const byte* out, byte* cipher, word16 sz, byte* tag)
19144
12
{
19145
12
    int ret       = 0;
19146
12
    int msglen    = (sz - ssl->specs.aead_mac_size);
19147
12
    word32 keySz  = 32;
19148
12
    byte padding[8]; /* used to temporarily store lengths */
19149
19150
#ifdef CHACHA_AEAD_TEST
19151
      printf("Using old version of poly1305 input.\n");
19152
#endif
19153
19154
12
    if (msglen < 0)
19155
0
        return INPUT_CASE_ERROR;
19156
19157
12
    if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, cipher, keySz)) != 0)
19158
0
        return ret;
19159
19160
12
    if ((ret = wc_Poly1305Update(ssl->auth.poly1305, additional,
19161
12
            additionalSz)) != 0)
19162
0
        return ret;
19163
19164
    /* length of additional input plus padding */
19165
12
    XMEMSET(padding, 0, sizeof(padding));
19166
12
    padding[0] = (byte)additionalSz;
19167
12
    if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding,
19168
12
                    sizeof(padding))) != 0)
19169
0
        return ret;
19170
19171
19172
    /* add cipher info and then its length */
19173
12
    XMEMSET(padding, 0, sizeof(padding));
19174
12
    if ((ret = wc_Poly1305Update(ssl->auth.poly1305, out, (word32)msglen)) != 0)
19175
0
        return ret;
19176
19177
    /* 32 bit size of cipher to 64 bit endian */
19178
12
    padding[0] =  msglen        & 0xff;
19179
12
    padding[1] = (msglen >>  8) & 0xff;
19180
12
    padding[2] = ((word32)msglen >> 16) & 0xff;
19181
12
    padding[3] = ((word32)msglen >> 24) & 0xff;
19182
12
    if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding, sizeof(padding)))
19183
12
        != 0)
19184
0
        return ret;
19185
19186
    /* generate tag */
19187
12
    if ((ret = wc_Poly1305Final(ssl->auth.poly1305, tag)) != 0)
19188
0
        return ret;
19189
19190
12
    return ret;
19191
12
}
19192
19193
19194
/* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
19195
 * the implementation follows an older draft for creating the nonce and MAC.
19196
 * The flag oldPoly gets set automatically depending on what cipher suite was
19197
 * negotiated in the handshake. This is able to be done because the IDs for the
19198
 * cipher suites was updated in RFC7905 giving unique values for the older
19199
 * draft in comparison to the more recent RFC.
19200
 *
19201
 * ssl   WOLFSSL structure to get cipher and TLS state from
19202
 * out   output buffer to hold encrypted data
19203
 * input data to encrypt
19204
 * sz    size of input
19205
 *
19206
 * Return 0 on success negative values in error case
19207
 */
19208
int ChachaAEADEncrypt(WOLFSSL* ssl, byte* out, const byte* input,
19209
                              word16 sz, byte type)
19210
{
19211
    int ret       = 0;
19212
    word32 msgLen = (sz - ssl->specs.aead_mac_size);
19213
    byte tag[POLY1305_AUTH_SZ];
19214
    byte add[AEAD_AUTH_DATA_SZ];
19215
    int  addSz = 0;
19216
    byte nonce[CHACHA20_NONCE_SZ];
19217
    byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for poly1305 */
19218
    #ifdef CHACHA_AEAD_TEST
19219
        int i;
19220
    #endif
19221
    Keys* keys = &ssl->keys;
19222
    byte* seq = NULL;
19223
    int verifyOrder = CUR_ORDER;
19224
19225
    XMEMSET(tag,   0, sizeof(tag));
19226
    XMEMSET(nonce, 0, sizeof(nonce));
19227
    XMEMSET(poly,  0, sizeof(poly));
19228
    XMEMSET(add,   0, sizeof(add));
19229
19230
#if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
19231
    /*
19232
     * For epochs 2+:
19233
     * * use ssl->secure_renegotiation when encrypting the current epoch as it
19234
     *   has the current epoch cipher material
19235
     * * use PREV_ORDER if encrypting the epoch not in
19236
     *   ssl->secure_renegotiation
19237
     */
19238
    /* opaque SEQ number stored for AD */
19239
    if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
19240
        if (ssl->keys.dtls_epoch ==
19241
                    ssl->secure_renegotiation->tmp_keys.dtls_epoch)
19242
            keys = &ssl->secure_renegotiation->tmp_keys;
19243
        else
19244
            verifyOrder = PREV_ORDER;
19245
    }
19246
#endif
19247
19248
    addSz = writeAeadAuthData(ssl, (word16)msgLen, type, add, 0, &seq,
19249
        verifyOrder);
19250
    if (addSz < 0)
19251
        return addSz;
19252
19253
    if (ssl->options.oldPoly != 0) {
19254
        /* get nonce. SEQ should not be incremented again here */
19255
        XMEMCPY(nonce + CHACHA20_OLD_OFFSET, seq, SEQ_SZ);
19256
    }
19257
19258
    #ifdef CHACHA_AEAD_TEST
19259
        printf("Encrypt Additional : ");
19260
        for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
19261
            printf("%02x", add[i]);
19262
        }
19263
        printf("\n\n");
19264
        printf("input before encryption :\n");
19265
        for (i = 0; i < sz; i++) {
19266
            printf("%02x", input[i]);
19267
            if ((i + 1) % 16 == 0)
19268
                printf("\n");
19269
        }
19270
        printf("\n");
19271
    #endif
19272
19273
    if (ssl->options.oldPoly == 0) {
19274
        /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
19275
         * record sequence number XORed with client_write_IV/server_write_IV */
19276
        XMEMCPY(nonce + CHACHA20_OFFSET, seq, SEQ_SZ);
19277
        xorbuf(nonce, keys->aead_enc_imp_IV, CHACHA20_IMP_IV_SZ);
19278
    }
19279
#ifdef WOLFSSL_CHECK_MEM_ZERO
19280
    wc_MemZero_Add("ChachaAEADEncrypt nonce", nonce, CHACHA20_NONCE_SZ);
19281
#endif
19282
19283
    /* set the nonce for chacha and get poly1305 key */
19284
    if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 0)) != 0) {
19285
        ForceZero(nonce, CHACHA20_NONCE_SZ);
19286
    #ifdef WOLFSSL_CHECK_MEM_ZERO
19287
        wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
19288
    #endif
19289
        return ret;
19290
    }
19291
19292
    /* create Poly1305 key using chacha20 keystream */
19293
    if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, poly,
19294
                                                    poly, sizeof(poly))) != 0) {
19295
        ForceZero(nonce, CHACHA20_NONCE_SZ);
19296
    #ifdef WOLFSSL_CHECK_MEM_ZERO
19297
        wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
19298
    #endif
19299
        return ret;
19300
    }
19301
#ifdef WOLFSSL_CHECK_MEM_ZERO
19302
    wc_MemZero_Add("ChachaAEADEncrypt poly", poly, CHACHA20_256_KEY_SIZE);
19303
#endif
19304
19305
    /* set the counter after getting poly1305 key */
19306
    if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 1)) != 0) {
19307
        ForceZero(nonce, CHACHA20_NONCE_SZ);
19308
        ForceZero(poly, sizeof(poly));
19309
    #ifdef WOLFSSL_CHECK_MEM_ZERO
19310
        wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
19311
        wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
19312
    #endif
19313
        return ret;
19314
    }
19315
    ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
19316
#ifdef WOLFSSL_CHECK_MEM_ZERO
19317
    wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
19318
#endif
19319
19320
    /* encrypt the plain text */
19321
    if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, out,
19322
                                                         input, msgLen)) != 0) {
19323
        ForceZero(poly, sizeof(poly));
19324
    #ifdef WOLFSSL_CHECK_MEM_ZERO
19325
        wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
19326
    #endif
19327
        return ret;
19328
    }
19329
19330
    /* get the poly1305 tag using either old padding scheme or more recent */
19331
    if (ssl->options.oldPoly != 0) {
19332
        if ((ret = Poly1305TagOld(ssl, add, addSz, (const byte* )out,
19333
                                                         poly, sz, tag)) != 0) {
19334
            ForceZero(poly, sizeof(poly));
19335
        #ifdef WOLFSSL_CHECK_MEM_ZERO
19336
            wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
19337
        #endif
19338
            return ret;
19339
        }
19340
    }
19341
    else {
19342
        if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
19343
                                                          sizeof(poly))) != 0) {
19344
            ForceZero(poly, sizeof(poly));
19345
        #ifdef WOLFSSL_CHECK_MEM_ZERO
19346
            wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
19347
        #endif
19348
            return ret;
19349
        }
19350
        if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add, addSz, out, msgLen,
19351
                tag, sizeof(tag))) != 0) {
19352
            ForceZero(poly, sizeof(poly));
19353
        #ifdef WOLFSSL_CHECK_MEM_ZERO
19354
            wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
19355
        #endif
19356
            return ret;
19357
        }
19358
    }
19359
    ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
19360
#ifdef WOLFSSL_CHECK_MEM_ZERO
19361
    wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
19362
#endif
19363
19364
    /* append tag to ciphertext */
19365
    XMEMCPY(out + msgLen, tag, sizeof(tag));
19366
19367
    AeadIncrementExpIV(ssl);
19368
19369
    #ifdef CHACHA_AEAD_TEST
19370
       printf("mac tag :\n");
19371
        for (i = 0; i < 16; i++) {
19372
           printf("%02x", tag[i]);
19373
           if ((i + 1) % 16 == 0)
19374
               printf("\n");
19375
        }
19376
       printf("\n\noutput after encrypt :\n");
19377
        for (i = 0; i < sz; i++) {
19378
           printf("%02x", out[i]);
19379
           if ((i + 1) % 16 == 0)
19380
               printf("\n");
19381
        }
19382
        printf("\n");
19383
    #endif
19384
19385
    return ret;
19386
}
19387
19388
19389
/* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
19390
 * the implementation follows an older draft for creating the nonce and MAC.
19391
 * The flag oldPoly gets set automatically depending on what cipher suite was
19392
 * negotiated in the handshake. This is able to be done because the IDs for the
19393
 * cipher suites was updated in RFC7905 giving unique values for the older
19394
 * draft in comparison to the more recent RFC.
19395
 *
19396
 * ssl   WOLFSSL structure to get cipher and TLS state from
19397
 * plain output buffer to hold decrypted data
19398
 * input data to decrypt
19399
 * sz    size of input
19400
 *
19401
 * Return 0 on success negative values in error case
19402
 */
19403
int ChachaAEADDecrypt(WOLFSSL* ssl, byte* plain, const byte* input,
19404
                           word16 sz)
19405
0
{
19406
0
    byte add[AEAD_AUTH_DATA_SZ];
19407
0
    int  addSz = 0;
19408
0
    byte nonce[CHACHA20_NONCE_SZ];
19409
0
    byte tag[POLY1305_AUTH_SZ];
19410
0
    byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for mac */
19411
0
    int ret    = 0;
19412
0
    int msgLen = (sz - ssl->specs.aead_mac_size);
19413
0
    Keys* keys = &ssl->keys;
19414
0
    byte* seq = NULL;
19415
19416
    #ifdef CHACHA_AEAD_TEST
19417
       int i;
19418
       printf("input before decrypt :\n");
19419
        for (i = 0; i < sz; i++) {
19420
           printf("%02x", input[i]);
19421
           if ((i + 1) % 16 == 0)
19422
               printf("\n");
19423
        }
19424
        printf("\n");
19425
    #endif
19426
19427
0
    XMEMSET(tag,   0, sizeof(tag));
19428
0
    XMEMSET(poly,  0, sizeof(poly));
19429
0
    XMEMSET(nonce, 0, sizeof(nonce));
19430
0
    XMEMSET(add,   0, sizeof(add));
19431
19432
#if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
19433
    /*
19434
     * For epochs 2+:
19435
     * * use ssl->secure_renegotiation when decrypting the latest epoch as it
19436
     *   has the latest epoch cipher material
19437
     */
19438
    if (ssl->options.dtls && DtlsSCRKeysSet(ssl) &&
19439
        ssl->keys.curEpoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
19440
        keys = &ssl->secure_renegotiation->tmp_keys;
19441
#endif
19442
19443
19444
0
    addSz = writeAeadAuthData(ssl, (word16)msgLen, no_type, add, 1, &seq,
19445
0
        PEER_ORDER);
19446
0
    if (addSz < 0)
19447
0
        return addSz;
19448
19449
0
    if (ssl->options.oldPoly != 0) {
19450
        /* get nonce, SEQ should not be incremented again here */
19451
0
        XMEMCPY(nonce + CHACHA20_OLD_OFFSET, seq, SEQ_SZ);
19452
0
    }
19453
19454
    #ifdef CHACHA_AEAD_TEST
19455
        printf("Decrypt Additional : ");
19456
        for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
19457
            printf("%02x", add[i]);
19458
        }
19459
        printf("\n\n");
19460
    #endif
19461
19462
0
    if (ssl->options.oldPoly == 0) {
19463
        /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
19464
         * record sequence number XORed with client_write_IV/server_write_IV */
19465
0
        XMEMCPY(nonce + CHACHA20_OFFSET, seq, SEQ_SZ);
19466
0
        xorbuf(nonce, keys->aead_dec_imp_IV, CHACHA20_IMP_IV_SZ);
19467
0
    }
19468
#ifdef WOLFSSL_CHECK_MEM_ZERO
19469
    wc_MemZero_Add("ChachaAEADEncrypt nonce", nonce, CHACHA20_NONCE_SZ);
19470
#endif
19471
19472
    /* set nonce and get poly1305 key */
19473
0
    if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 0)) != 0) {
19474
0
        ForceZero(nonce, CHACHA20_NONCE_SZ);
19475
    #ifdef WOLFSSL_CHECK_MEM_ZERO
19476
        wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
19477
    #endif
19478
0
        return ret;
19479
0
    }
19480
19481
    /* use chacha20 keystream to get poly1305 key for tag */
19482
0
    if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, poly,
19483
0
                                                    poly, sizeof(poly))) != 0) {
19484
0
        ForceZero(nonce, CHACHA20_NONCE_SZ);
19485
    #ifdef WOLFSSL_CHECK_MEM_ZERO
19486
        wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
19487
    #endif
19488
0
        return ret;
19489
0
    }
19490
#ifdef WOLFSSL_CHECK_MEM_ZERO
19491
    wc_MemZero_Add("ChachaAEADEncrypt poly", poly, CHACHA20_256_KEY_SIZE);
19492
#endif
19493
19494
    /* set counter after getting poly1305 key */
19495
0
    if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 1)) != 0) {
19496
0
        ForceZero(nonce, CHACHA20_NONCE_SZ);
19497
0
        ForceZero(poly, sizeof(poly));
19498
    #ifdef WOLFSSL_CHECK_MEM_ZERO
19499
        wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
19500
        wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
19501
    #endif
19502
0
        return ret;
19503
0
    }
19504
0
    ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
19505
#ifdef WOLFSSL_CHECK_MEM_ZERO
19506
    wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
19507
#endif
19508
19509
    /* get the tag using Poly1305 */
19510
0
    if (ssl->options.oldPoly != 0) {
19511
0
        if ((ret = Poly1305TagOld(ssl, add, addSz, input, poly, sz, tag))
19512
0
                != 0) {
19513
0
            ForceZero(poly, sizeof(poly));
19514
        #ifdef WOLFSSL_CHECK_MEM_ZERO
19515
            wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
19516
        #endif
19517
0
            return ret;
19518
0
        }
19519
0
    }
19520
0
    else {
19521
0
        if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
19522
0
                                                          sizeof(poly))) != 0) {
19523
0
            ForceZero(poly, sizeof(poly));
19524
        #ifdef WOLFSSL_CHECK_MEM_ZERO
19525
            wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
19526
        #endif
19527
0
            return ret;
19528
0
        }
19529
0
        if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add, addSz, input,
19530
0
                (word32)msgLen, tag, sizeof(tag))) != 0) {
19531
0
            ForceZero(poly, sizeof(poly));
19532
        #ifdef WOLFSSL_CHECK_MEM_ZERO
19533
            wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
19534
        #endif
19535
0
            return ret;
19536
0
        }
19537
0
    }
19538
0
    ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
19539
#ifdef WOLFSSL_CHECK_MEM_ZERO
19540
    wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
19541
#endif
19542
19543
    /* check tag sent along with packet */
19544
0
    if (ConstantCompare(input + msgLen, tag, ssl->specs.aead_mac_size) != 0) {
19545
0
        WOLFSSL_MSG("MAC did not match");
19546
0
        if (!ssl->options.dtls)
19547
0
            SendAlert(ssl, alert_fatal, bad_record_mac);
19548
0
        WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
19549
0
        return VERIFY_MAC_ERROR;
19550
0
    }
19551
19552
    /* if the tag was good decrypt message */
19553
0
    if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, plain,
19554
0
                                                           input, (word32)msgLen)) != 0)
19555
0
        return ret;
19556
19557
    #ifdef CHACHA_AEAD_TEST
19558
       printf("plain after decrypt :\n");
19559
        for (i = 0; i < sz; i++) {
19560
           printf("%02x", plain[i]);
19561
           if ((i + 1) % 16 == 0)
19562
               printf("\n");
19563
        }
19564
        printf("\n");
19565
    #endif
19566
19567
0
    return ret;
19568
0
}
19569
#endif /* HAVE_CHACHA && HAVE_POLY1305 && !NO_CHAPOL_AEAD*/
19570
#endif /* HAVE_AEAD */
19571
19572
19573
#if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
19574
19575
#if !defined(NO_GCM_ENCRYPT_EXTRA) && \
19576
    ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
19577
    (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
19578
/* The following type is used to share code between AES-GCM and AES-CCM. */
19579
    typedef int (*AesAuthEncryptFunc)(Aes* aes, byte* out,
19580
                                       const byte* in, word32 sz,
19581
                                       byte* iv, word32 ivSz,
19582
                                       byte* authTag, word32 authTagSz,
19583
                                       const byte* authIn, word32 authInSz);
19584
0
    #define AES_AUTH_ENCRYPT_FUNC AesAuthEncryptFunc
19585
0
    #define AES_GCM_ENCRYPT wc_AesGcmEncrypt_ex
19586
0
    #define AES_CCM_ENCRYPT wc_AesCcmEncrypt_ex
19587
#else
19588
    #define AES_AUTH_ENCRYPT_FUNC wc_AesAuthEncryptFunc
19589
    #define AES_GCM_ENCRYPT wc_AesGcmEncrypt
19590
    #define AES_CCM_ENCRYPT wc_AesCcmEncrypt
19591
#endif
19592
19593
#endif
19594
19595
#if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
19596
19597
/* The following type is used to share code between SM4-GCM and SM4-CCM. */
19598
typedef int (*Sm4AuthEncryptFunc)(wc_Sm4* sm4, byte* out, const byte* in,
19599
    word32 sz, const byte* nonce, word32 nonceSz, byte* tag, word32 tagSz,
19600
    const byte* aad, word32 aadSz);
19601
typedef int (*Sm4AuthDecryptFunc)(wc_Sm4* sm4, byte* out, const byte* in,
19602
    word32 sz, const byte* nonce, word32 nonceSz, const byte* tag, word32 tagSz,
19603
    const byte* aad, word32 aadSz);
19604
19605
0
#define SM4_AUTH_ENCRYPT_FUNC Sm4AuthEncryptFunc
19606
#define SM4_AUTH_DECRYPT_FUNC Sm4AuthDecryptFunc
19607
0
#define SM4_GCM_ENCRYPT_FUNC wc_Sm4GcmEncrypt
19608
0
#define SM4_CCM_ENCRYPT_FUNC wc_Sm4CcmEncrypt
19609
#define SM4_GCM_DECRYPT_FUNC wc_Sm4GcmDecrypt
19610
#define SM4_CCM_DECRYPT_FUNC wc_Sm4CcmDecrypt
19611
19612
#endif
19613
19614
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
19615
#define TLS_AEAD_CID_SZ(s, dec) \
19616
                ((dec) ? DtlsGetCidRxSize((s)) \
19617
                       : DtlsGetCidTxSize((s)))
19618
#define TLS_AEAD_CID(s, dec, b, c) \
19619
                ((dec) ? wolfSSL_dtls_cid_get_rx((s), (b), (c)) \
19620
                       : wolfSSL_dtls_cid_get_tx((s), (b), (c)))
19621
#endif
19622
/**
19623
 *
19624
 * @param ssl           WOLFSSL object
19625
 * @param sz            Length of fragment
19626
 * @param type          Record content type
19627
 * @param additional    AAD output buffer. Assumed AEAD_AUTH_DATA_SZ length.
19628
 * @param dec           Are we decrypting
19629
 * @return >= 0         length of auth data
19630
 *         < 0          error
19631
 */
19632
int writeAeadAuthData(WOLFSSL* ssl, word16 sz, byte type,
19633
        byte* additional, byte dec, byte** seq, int verifyOrder)
19634
{
19635
    word32 idx = 0;
19636
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
19637
    byte cidSz = 0;
19638
    if (ssl->options.dtls && (cidSz = TLS_AEAD_CID_SZ(ssl, dec)) > 0) {
19639
        if (cidSz > DTLS_CID_MAX_SIZE) {
19640
            WOLFSSL_MSG("DTLS CID too large");
19641
            return DTLS_CID_ERROR;
19642
        }
19643
19644
        XMEMSET(additional + idx, 0xFF, SEQ_SZ);
19645
        idx += SEQ_SZ;
19646
        additional[idx++] = dtls12_cid;
19647
        additional[idx++] = cidSz;
19648
        additional[idx++] = dtls12_cid;
19649
        additional[idx++] = dec ? ssl->curRL.pvMajor : ssl->version.major;
19650
        additional[idx++] = dec ? ssl->curRL.pvMinor : ssl->version.minor;
19651
        WriteSEQ(ssl, verifyOrder, additional + idx);
19652
        if (seq != NULL)
19653
            *seq = additional + idx;
19654
        idx += SEQ_SZ;
19655
        if (TLS_AEAD_CID(ssl, dec, additional + idx, (unsigned int)cidSz)
19656
                == WC_NO_ERR_TRACE(WOLFSSL_FAILURE)) {
19657
            WOLFSSL_MSG("DTLS CID write failed");
19658
            return DTLS_CID_ERROR;
19659
        }
19660
        idx += cidSz;
19661
        c16toa(sz, additional + idx);
19662
        idx += LENGTH_SZ;
19663
19664
        return (int)idx;
19665
    }
19666
#endif
19667
    if (seq != NULL)
19668
        *seq = additional + idx;
19669
    WriteSEQ(ssl, verifyOrder, additional + idx);
19670
    idx += SEQ_SZ;
19671
    additional[idx++] = dec ? ssl->curRL.type : type;
19672
    additional[idx++] = dec ? ssl->curRL.pvMajor : ssl->version.major;
19673
    additional[idx++] = dec ? ssl->curRL.pvMinor : ssl->version.minor;
19674
    c16toa(sz, additional + idx);
19675
    idx += LENGTH_SZ;
19676
19677
    return (int)idx;
19678
}
19679
19680
static WC_INLINE int EncryptDo(WOLFSSL* ssl, byte* out, const byte* input,
19681
    word16 sz, int asyncOkay, byte type)
19682
0
{
19683
0
    int ret = 0;
19684
#ifdef WOLFSSL_ASYNC_CRYPT
19685
    WC_ASYNC_DEV* asyncDev = NULL;
19686
    word32 event_flags = WC_ASYNC_FLAG_CALL_AGAIN;
19687
#else
19688
0
    (void)asyncOkay;
19689
0
#endif
19690
19691
0
    (void)out;
19692
0
    (void)sz;
19693
0
    (void)type;
19694
19695
0
    if (input == NULL) {
19696
0
        return BAD_FUNC_ARG;
19697
0
    }
19698
19699
0
    switch (ssl->specs.bulk_cipher_algorithm) {
19700
0
    #ifdef BUILD_ARC4
19701
0
        case wolfssl_rc4:
19702
0
            wc_Arc4Process(ssl->encrypt.arc4, out, input, sz);
19703
0
            break;
19704
0
    #endif
19705
19706
0
    #ifdef BUILD_DES3
19707
0
        case wolfssl_triple_des:
19708
        #ifdef WOLFSSL_ASYNC_CRYPT
19709
            /* initialize event */
19710
            asyncDev = &ssl->encrypt.des3->asyncDev;
19711
            ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
19712
            if (ret != 0)
19713
                break;
19714
        #endif
19715
19716
0
            ret = wc_Des3_CbcEncrypt(ssl->encrypt.des3, out, input, sz);
19717
        #ifdef WOLFSSL_ASYNC_CRYPT
19718
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E) && asyncOkay) {
19719
                ret = wolfSSL_AsyncPush(ssl, asyncDev);
19720
            }
19721
        #endif
19722
0
            break;
19723
0
    #endif
19724
19725
0
    #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
19726
0
        case wolfssl_aes:
19727
        #ifdef WOLFSSL_ASYNC_CRYPT
19728
            /* initialize event */
19729
            asyncDev = &ssl->encrypt.aes->asyncDev;
19730
            ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
19731
            if (ret != 0)
19732
                break;
19733
        #endif
19734
0
            ret = wc_AesCbcEncrypt(ssl->encrypt.aes, out, input, sz);
19735
        #ifdef WOLFSSL_ASYNC_CRYPT
19736
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E) && asyncOkay) {
19737
                ret = wolfSSL_AsyncPush(ssl, asyncDev);
19738
            }
19739
        #endif
19740
0
            break;
19741
0
    #endif
19742
19743
0
    #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
19744
0
        case wolfssl_aes_gcm:
19745
0
        case wolfssl_aes_ccm:/* GCM AEAD macros use same size as CCM */
19746
0
        {
19747
0
            AES_AUTH_ENCRYPT_FUNC aes_auth_fn;
19748
0
            int additionalSz;
19749
19750
        #ifdef WOLFSSL_ASYNC_CRYPT
19751
            /* initialize event */
19752
            asyncDev = &ssl->encrypt.aes->asyncDev;
19753
            ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
19754
            if (ret != 0)
19755
                break;
19756
        #endif
19757
19758
0
        #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
19759
0
            aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
19760
0
                            ? AES_GCM_ENCRYPT : AES_CCM_ENCRYPT;
19761
        #elif defined(BUILD_AESGCM)
19762
            aes_auth_fn = AES_GCM_ENCRYPT;
19763
        #else
19764
            aes_auth_fn = AES_CCM_ENCRYPT;
19765
        #endif
19766
19767
0
            additionalSz = writeAeadAuthData(ssl,
19768
                    /* Length of the plain text minus the explicit
19769
                     * IV length minus the authentication tag size. */
19770
0
                    sz - (word16)(AESGCM_EXP_IV_SZ) - ssl->specs.aead_mac_size,
19771
0
                    type, ssl->encrypt.additional, 0, NULL, CUR_ORDER);
19772
0
            if (additionalSz < 0) {
19773
0
                ret = additionalSz;
19774
0
                break;
19775
0
            }
19776
19777
#if !defined(NO_PUBLIC_GCM_SET_IV) && \
19778
    ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
19779
    (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
19780
            XMEMCPY(ssl->encrypt.nonce,
19781
                                ssl->keys.aead_enc_imp_IV, AESGCM_IMP_IV_SZ);
19782
            XMEMCPY(ssl->encrypt.nonce + AESGCM_IMP_IV_SZ,
19783
                                ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
19784
#endif
19785
        #ifdef HAVE_PK_CALLBACKS
19786
            ret = NOT_COMPILED_IN;
19787
            if (ssl->ctx && ssl->ctx->PerformTlsRecordProcessingCb) {
19788
                ret = ssl->ctx->PerformTlsRecordProcessingCb(ssl, 1,
19789
                         out + AESGCM_EXP_IV_SZ, input + AESGCM_EXP_IV_SZ,
19790
                         sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
19791
                         ssl->encrypt.nonce, AESGCM_NONCE_SZ,
19792
                         out + sz - ssl->specs.aead_mac_size,
19793
                         ssl->specs.aead_mac_size,
19794
                         ssl->encrypt.additional, (word32)(additionalSz));
19795
            }
19796
19797
            if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN))
19798
        #endif /* HAVE_PK_CALLBACKS */
19799
0
            {
19800
0
                ret = aes_auth_fn(ssl->encrypt.aes,
19801
0
                    out + AESGCM_EXP_IV_SZ, input + AESGCM_EXP_IV_SZ,
19802
0
                    sz - (word16)(AESGCM_EXP_IV_SZ) - ssl->specs.aead_mac_size,
19803
0
                    ssl->encrypt.nonce, AESGCM_NONCE_SZ,
19804
0
                    out + sz - ssl->specs.aead_mac_size,
19805
0
                    ssl->specs.aead_mac_size,
19806
0
                    ssl->encrypt.additional, (word32)(additionalSz));
19807
0
            }
19808
19809
        #ifdef WOLFSSL_ASYNC_CRYPT
19810
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E) && asyncOkay) {
19811
                ret = wolfSSL_AsyncPush(ssl, asyncDev);
19812
            }
19813
        #endif
19814
0
#if !defined(NO_PUBLIC_GCM_SET_IV) && \
19815
0
    ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
19816
0
    (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
19817
0
            XMEMCPY(out,
19818
0
                    ssl->encrypt.nonce + AESGCM_IMP_IV_SZ, AESGCM_EXP_IV_SZ);
19819
0
#endif
19820
0
        }
19821
0
        break;
19822
0
    #endif /* BUILD_AESGCM || HAVE_AESCCM */
19823
19824
    #ifdef HAVE_ARIA
19825
        case wolfssl_aria_gcm:
19826
        {
19827
            int additionalSz;
19828
            byte *outBuf = NULL;
19829
19830
            additionalSz = ret = writeAeadAuthData(ssl,
19831
                    /* Length of the plain text minus the explicit
19832
                     * IV length minus the authentication tag size. */
19833
                    sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size, type,
19834
                    ssl->encrypt.additional, 0, NULL, CUR_ORDER);
19835
            if (ret < 0)
19836
                break;
19837
            ret = 0;
19838
19839
            XMEMCPY(ssl->encrypt.nonce,
19840
                                ssl->keys.aead_enc_imp_IV, AESGCM_IMP_IV_SZ);
19841
            XMEMCPY(ssl->encrypt.nonce + AESGCM_IMP_IV_SZ,
19842
                                ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
19843
            outBuf = (byte*)XMALLOC(sz - AESGCM_EXP_IV_SZ, ssl->heap,
19844
                                    DYNAMIC_TYPE_TMP_BUFFER);
19845
            if (outBuf == NULL) {
19846
                ret = MEMORY_ERROR;
19847
                break;
19848
            }
19849
            ret = wc_AriaEncrypt(ssl->encrypt.aria, outBuf,
19850
                    (byte*) input + AESGCM_EXP_IV_SZ,
19851
                    sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
19852
                    ssl->encrypt.nonce, AESGCM_NONCE_SZ,
19853
                    ssl->encrypt.additional, additionalSz,
19854
                    out + sz - ssl->specs.aead_mac_size,
19855
                    ssl->specs.aead_mac_size
19856
                    );
19857
            if (ret != 0)
19858
                break;
19859
            XMEMCPY(out,
19860
                    ssl->encrypt.nonce + AESGCM_IMP_IV_SZ, AESGCM_EXP_IV_SZ);
19861
            XMEMCPY(out + AESGCM_EXP_IV_SZ,outBuf,sz - AESGCM_EXP_IV_SZ);
19862
            XFREE(outBuf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
19863
            break;
19864
        }
19865
    #endif
19866
19867
0
    #ifdef HAVE_CAMELLIA
19868
0
        case wolfssl_camellia:
19869
0
            ret = wc_CamelliaCbcEncrypt(ssl->encrypt.cam, out, input, sz);
19870
0
            break;
19871
0
    #endif
19872
19873
0
    #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
19874
0
        !defined(NO_CHAPOL_AEAD)
19875
0
        case wolfssl_chacha:
19876
0
            ret = ChachaAEADEncrypt(ssl, out, input, sz, type);
19877
0
            break;
19878
0
    #endif
19879
19880
0
    #ifdef WOLFSSL_SM4_CBC
19881
0
        case wolfssl_sm4_cbc:
19882
        #ifdef WOLFSSL_ASYNC_CRYPT
19883
            /* initialize event */
19884
            asyncDev = &ssl->encrypt.sm4->asyncDev;
19885
            ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
19886
            if (ret != 0)
19887
                break;
19888
        #endif
19889
0
            ret = wc_Sm4CbcEncrypt(ssl->encrypt.sm4, out, input, sz);
19890
        #ifdef WOLFSSL_ASYNC_CRYPT
19891
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E) && asyncOkay) {
19892
                ret = wolfSSL_AsyncPush(ssl, asyncDev);
19893
            }
19894
        #endif
19895
0
            break;
19896
0
    #endif
19897
19898
0
    #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
19899
0
        case wolfssl_sm4_gcm:
19900
0
        case wolfssl_sm4_ccm:/* GCM AEAD macros use same size as CCM */
19901
0
        {
19902
0
            SM4_AUTH_ENCRYPT_FUNC sm4_auth_fn;
19903
0
            const byte* additionalSrc;
19904
19905
        #ifdef WOLFSSL_ASYNC_CRYPT
19906
            /* initialize event */
19907
            asyncDev = &ssl->encrypt.sm4->asyncDev;
19908
            ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
19909
            if (ret != 0)
19910
                break;
19911
        #endif
19912
19913
0
        #if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_SM4_CCM)
19914
0
            sm4_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm)
19915
0
                            ? SM4_GCM_ENCRYPT_FUNC : SM4_CCM_ENCRYPT_FUNC;
19916
        #elif defined(WOLFSSL_SM4_GCM)
19917
            sm4_auth_fn = SM4_GCM_ENCRYPT_FUNC;
19918
        #else
19919
            sm4_auth_fn = SM4_CCM_ENCRYPT_FUNC;
19920
        #endif
19921
0
            additionalSrc = input - 5;
19922
19923
0
            XMEMSET(ssl->encrypt.additional, 0, AEAD_AUTH_DATA_SZ);
19924
19925
            /* sequence number field is 64-bits */
19926
0
            WriteSEQ(ssl, CUR_ORDER, ssl->encrypt.additional);
19927
19928
            /* Store the type, version. Unfortunately, they are in
19929
             * the input buffer ahead of the plaintext. */
19930
        #ifdef WOLFSSL_DTLS
19931
            if (ssl->options.dtls) {
19932
                additionalSrc -= DTLS_HANDSHAKE_EXTRA;
19933
            }
19934
        #endif
19935
0
            XMEMCPY(ssl->encrypt.additional + AEAD_TYPE_OFFSET,
19936
0
                                                        additionalSrc, 3);
19937
19938
            /* Store the length of the plain text minus the explicit
19939
             * IV length minus the authentication tag size. */
19940
0
            c16toa(sz - GCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
19941
0
                                ssl->encrypt.additional + AEAD_LEN_OFFSET);
19942
0
            XMEMCPY(ssl->encrypt.nonce,
19943
0
                                ssl->keys.aead_enc_imp_IV, GCM_IMP_IV_SZ);
19944
0
            XMEMCPY(ssl->encrypt.nonce + GCM_IMP_IV_SZ,
19945
0
                                ssl->keys.aead_exp_IV, GCM_EXP_IV_SZ);
19946
0
            ret = sm4_auth_fn(ssl->encrypt.sm4,
19947
0
                    out + GCM_EXP_IV_SZ, input + GCM_EXP_IV_SZ,
19948
0
                    sz - GCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
19949
0
                    ssl->encrypt.nonce, GCM_NONCE_SZ,
19950
0
                    out + sz - ssl->specs.aead_mac_size,
19951
0
                    ssl->specs.aead_mac_size,
19952
0
                    ssl->encrypt.additional, AEAD_AUTH_DATA_SZ);
19953
19954
        #ifdef WOLFSSL_ASYNC_CRYPT
19955
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E) && asyncOkay) {
19956
                ret = wolfSSL_AsyncPush(ssl, asyncDev);
19957
            }
19958
        #endif
19959
0
#if !defined(NO_PUBLIC_GCM_SET_IV) && \
19960
0
    ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
19961
0
    (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
19962
0
            XMEMCPY(out,
19963
0
                    ssl->encrypt.nonce + GCM_IMP_IV_SZ, GCM_EXP_IV_SZ);
19964
0
#endif
19965
0
        }
19966
0
        break;
19967
0
    #endif /* WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM */
19968
19969
    #ifdef HAVE_NULL_CIPHER
19970
        case wolfssl_cipher_null:
19971
            if (input != out) {
19972
                XMEMMOVE(out, input, sz);
19973
            }
19974
            break;
19975
    #endif
19976
19977
0
        default:
19978
0
            WOLFSSL_MSG("wolfSSL Encrypt programming error");
19979
0
            ret = ENCRYPT_ERROR;
19980
0
            WOLFSSL_ERROR_VERBOSE(ret);
19981
0
    }
19982
19983
#ifdef WOLFSSL_ASYNC_CRYPT
19984
    /* if async is not okay, then block */
19985
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E) && !asyncOkay) {
19986
        ret = wc_AsyncWait(ret, asyncDev, event_flags);
19987
    }
19988
#endif
19989
19990
0
    return ret;
19991
0
}
19992
19993
static WC_INLINE int Encrypt(WOLFSSL* ssl, byte* out, const byte* input,
19994
    word16 sz, int asyncOkay, byte type)
19995
0
{
19996
0
    int ret = 0;
19997
19998
#ifdef WOLFSSL_ASYNC_CRYPT
19999
    if (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E)) {
20000
        ssl->error = 0; /* clear async */
20001
    }
20002
#endif
20003
20004
0
    switch (ssl->encrypt.state) {
20005
0
        case CIPHER_STATE_BEGIN:
20006
0
        {
20007
0
            if (ssl->encrypt.setup == 0) {
20008
0
                WOLFSSL_MSG("Encrypt ciphers not setup");
20009
0
                WOLFSSL_ERROR_VERBOSE(ENCRYPT_ERROR);
20010
0
                return ENCRYPT_ERROR;
20011
0
            }
20012
20013
        #ifdef WOLFSSL_CIPHER_TEXT_CHECK
20014
            if (ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) {
20015
                XMEMCPY(ssl->encrypt.sanityCheck, input,
20016
                    min(sz, sizeof(ssl->encrypt.sanityCheck)));
20017
            }
20018
        #endif
20019
20020
        #ifdef HAVE_FUZZER
20021
            if (ssl->fuzzerCb)
20022
                ssl->fuzzerCb(ssl, input, sz, FUZZ_ENCRYPT, ssl->fuzzerCtx);
20023
        #endif
20024
20025
0
        #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA)
20026
            /* make sure AES GCM/CCM memory is allocated */
20027
            /* free for these happens in FreeCiphers */
20028
0
            if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
20029
0
                ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm ||
20030
0
                ssl->specs.bulk_cipher_algorithm == wolfssl_aria_gcm) {
20031
                /* make sure auth iv and auth are allocated */
20032
0
                if (ssl->encrypt.additional == NULL)
20033
0
                    ssl->encrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
20034
0
                                                ssl->heap, DYNAMIC_TYPE_CIPHER);
20035
0
                if (ssl->encrypt.nonce == NULL) {
20036
0
                    ssl->encrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
20037
0
                                                ssl->heap, DYNAMIC_TYPE_CIPHER);
20038
                #ifdef WOLFSSL_CHECK_MEM_ZERO
20039
                    if (ssl->encrypt.nonce != NULL) {
20040
                        wc_MemZero_Add("Encrypt nonce", ssl->encrypt.nonce,
20041
                            AESGCM_NONCE_SZ);
20042
                    }
20043
                #endif
20044
0
                }
20045
0
                if (ssl->encrypt.additional == NULL ||
20046
0
                         ssl->encrypt.nonce == NULL) {
20047
0
                    return MEMORY_E;
20048
0
                }
20049
0
            }
20050
0
        #endif /* BUILD_AESGCM || HAVE_AESCCM || HAVE_ARIA */
20051
20052
0
        #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
20053
            /* make sure SM4 GCM/CCM memory is allocated */
20054
            /* free for these happens in FreeCiphers */
20055
0
            if (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_ccm ||
20056
0
                ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm) {
20057
                /* make sure auth iv and auth are allocated */
20058
0
                if (ssl->encrypt.additional == NULL)
20059
0
                    ssl->encrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
20060
0
                                                ssl->heap, DYNAMIC_TYPE_CIPHER);
20061
0
                if (ssl->encrypt.nonce == NULL) {
20062
0
                    ssl->encrypt.nonce = (byte*)XMALLOC(GCM_NONCE_SZ,
20063
0
                                                ssl->heap, DYNAMIC_TYPE_CIPHER);
20064
                #ifdef WOLFSSL_CHECK_MEM_ZERO
20065
                    if (ssl->encrypt.nonce != NULL) {
20066
                        wc_MemZero_Add("Encrypt nonce", ssl->encrypt.nonce,
20067
                            GCM_NONCE_SZ);
20068
                    }
20069
                #endif
20070
0
                }
20071
0
                if (ssl->encrypt.additional == NULL ||
20072
0
                         ssl->encrypt.nonce == NULL) {
20073
0
                    return MEMORY_E;
20074
0
                }
20075
0
            }
20076
0
        #endif /* WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM */
20077
20078
            /* Advance state and proceed */
20079
0
            ssl->encrypt.state = CIPHER_STATE_DO;
20080
0
        }
20081
0
        FALL_THROUGH;
20082
20083
0
        case CIPHER_STATE_DO:
20084
0
        {
20085
0
            ret = EncryptDo(ssl, out, input, sz, asyncOkay, type);
20086
20087
            /* Advance state */
20088
0
            ssl->encrypt.state = CIPHER_STATE_END;
20089
20090
        #ifdef WOLFSSL_ASYNC_CRYPT
20091
            /* If pending, then leave and return will resume below */
20092
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
20093
                return ret;
20094
            }
20095
        #endif
20096
0
        }
20097
0
        FALL_THROUGH;
20098
20099
0
        case CIPHER_STATE_END:
20100
0
        {
20101
        #ifdef WOLFSSL_CIPHER_TEXT_CHECK
20102
            if (ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null &&
20103
                XMEMCMP(out, ssl->encrypt.sanityCheck,
20104
                    min(sz, sizeof(ssl->encrypt.sanityCheck))) == 0) {
20105
20106
                WOLFSSL_MSG("Encrypt sanity check failed! Glitch?");
20107
                WOLFSSL_ERROR_VERBOSE(ENCRYPT_ERROR);
20108
                return ENCRYPT_ERROR;
20109
            }
20110
            ForceZero(ssl->encrypt.sanityCheck,
20111
                sizeof(ssl->encrypt.sanityCheck));
20112
        #endif
20113
20114
0
        #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA)
20115
0
            if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
20116
0
                ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm ||
20117
0
                ssl->specs.bulk_cipher_algorithm == wolfssl_aria_gcm)
20118
0
            {
20119
                /* finalize authentication cipher */
20120
#if !defined(NO_PUBLIC_GCM_SET_IV) && \
20121
    ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
20122
    (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
20123
                AeadIncrementExpIV(ssl);
20124
#endif
20125
0
                if (ssl->encrypt.nonce)
20126
0
                    ForceZero(ssl->encrypt.nonce, AESGCM_NONCE_SZ);
20127
0
            }
20128
0
        #endif /* BUILD_AESGCM || HAVE_AESCCM || HAVE_ARIA */
20129
0
        #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
20130
0
            if (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_ccm ||
20131
0
                ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm)
20132
0
            {
20133
                /* finalize authentication cipher */
20134
0
                AeadIncrementExpIV(ssl);
20135
0
                if (ssl->encrypt.nonce)
20136
0
                    ForceZero(ssl->encrypt.nonce, GCM_NONCE_SZ);
20137
0
            }
20138
0
        #endif /* WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM */
20139
        #ifdef WOLFSSL_CHECK_MEM_ZERO
20140
            if ((ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) &&
20141
                    (out != input) && (ret == 0)) {
20142
                wc_MemZero_Add("TLS Encrypt plaintext", input, sz);
20143
            }
20144
        #endif
20145
0
            break;
20146
0
        }
20147
20148
0
        default:
20149
0
            break;
20150
0
    }
20151
20152
    /* Reset state */
20153
0
    ssl->encrypt.state = CIPHER_STATE_BEGIN;
20154
20155
0
    return ret;
20156
0
}
20157
20158
20159
static WC_INLINE int DecryptDo(WOLFSSL* ssl, byte* plain, const byte* input,
20160
                           word16 sz)
20161
{
20162
    int ret = 0;
20163
20164
    (void)plain;
20165
    (void)input;
20166
    (void)sz;
20167
20168
    switch (ssl->specs.bulk_cipher_algorithm)
20169
    {
20170
    #ifdef BUILD_ARC4
20171
        case wolfssl_rc4:
20172
            wc_Arc4Process(ssl->decrypt.arc4, plain, input, sz);
20173
            break;
20174
    #endif
20175
20176
    #ifdef BUILD_DES3
20177
        case wolfssl_triple_des:
20178
        #ifdef WOLFSSL_ASYNC_CRYPT
20179
            /* initialize event */
20180
            ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.des3->asyncDev,
20181
                WC_ASYNC_FLAG_CALL_AGAIN);
20182
            if (ret != 0)
20183
                break;
20184
        #endif
20185
20186
            ret = wc_Des3_CbcDecrypt(ssl->decrypt.des3, plain, input, sz);
20187
        #ifdef WOLFSSL_ASYNC_CRYPT
20188
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
20189
                ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.des3->asyncDev);
20190
            }
20191
        #endif
20192
            break;
20193
    #endif
20194
20195
    #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
20196
        case wolfssl_aes:
20197
        #ifdef WOLFSSL_ASYNC_CRYPT
20198
            /* initialize event */
20199
            ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
20200
                WC_ASYNC_FLAG_CALL_AGAIN);
20201
            if (ret != 0)
20202
                break;
20203
        #endif
20204
            ret = wc_AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz);
20205
        #ifdef WOLFSSL_ASYNC_CRYPT
20206
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
20207
                ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
20208
            }
20209
        #endif
20210
            break;
20211
    #endif
20212
20213
    #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
20214
        case wolfssl_aes_gcm:
20215
        case wolfssl_aes_ccm: /* GCM AEAD macros use same size as CCM */
20216
        {
20217
            wc_AesAuthDecryptFunc aes_auth_fn;
20218
            int additionalSz;
20219
20220
        #ifdef WOLFSSL_ASYNC_CRYPT
20221
            /* initialize event */
20222
            ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
20223
                WC_ASYNC_FLAG_CALL_AGAIN);
20224
            if (ret != 0)
20225
                break;
20226
        #endif
20227
20228
        #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
20229
            aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
20230
                            ? wc_AesGcmDecrypt : wc_AesCcmDecrypt;
20231
        #elif defined(BUILD_AESGCM)
20232
            aes_auth_fn = wc_AesGcmDecrypt;
20233
        #else
20234
            aes_auth_fn = wc_AesCcmDecrypt;
20235
        #endif
20236
20237
            additionalSz = writeAeadAuthData(ssl,
20238
                    sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size, no_type,
20239
                    ssl->decrypt.additional, 1, NULL, PEER_ORDER);
20240
            if (additionalSz < 0) {
20241
                ret = additionalSz;
20242
                break;
20243
            }
20244
20245
        #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
20246
            if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl))
20247
                XMEMCPY(ssl->decrypt.nonce,
20248
                        ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV,
20249
                        AESGCM_IMP_IV_SZ);
20250
            else
20251
        #endif
20252
                XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
20253
                        AESGCM_IMP_IV_SZ);
20254
            XMEMCPY(ssl->decrypt.nonce + AESGCM_IMP_IV_SZ, input,
20255
                                                            AESGCM_EXP_IV_SZ);
20256
        #ifdef HAVE_PK_CALLBACKS
20257
            ret = NOT_COMPILED_IN;
20258
            if (ssl->ctx && ssl->ctx->PerformTlsRecordProcessingCb) {
20259
                ret = ssl->ctx->PerformTlsRecordProcessingCb(ssl, 0,
20260
                        plain + AESGCM_EXP_IV_SZ,
20261
                        input + AESGCM_EXP_IV_SZ,
20262
                        sz - (word16)(AESGCM_EXP_IV_SZ) - ssl->specs.aead_mac_size,
20263
                        ssl->decrypt.nonce, AESGCM_NONCE_SZ,
20264
                        (byte *)(input + sz - ssl->specs.aead_mac_size),
20265
                        ssl->specs.aead_mac_size,
20266
                        ssl->decrypt.additional, (word32)(additionalSz));
20267
            }
20268
20269
            if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN))
20270
        #endif /* HAVE_PK_CALLBACKS */
20271
            {
20272
                if ((ret = aes_auth_fn(ssl->decrypt.aes,
20273
                    plain + AESGCM_EXP_IV_SZ,
20274
                    input + AESGCM_EXP_IV_SZ,
20275
                    sz - (word16)(AESGCM_EXP_IV_SZ) - ssl->specs.aead_mac_size,
20276
                    ssl->decrypt.nonce, AESGCM_NONCE_SZ,
20277
                    input + sz - ssl->specs.aead_mac_size,
20278
                    ssl->specs.aead_mac_size,
20279
                    ssl->decrypt.additional, (word32)(additionalSz))) < 0) {
20280
                #ifdef WOLFSSL_ASYNC_CRYPT
20281
                    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
20282
                        ret = wolfSSL_AsyncPush(ssl,
20283
                                                &ssl->decrypt.aes->asyncDev);
20284
                    }
20285
                #endif
20286
                }
20287
            }
20288
        }
20289
        break;
20290
    #endif /* BUILD_AESGCM || HAVE_AESCCM */
20291
20292
    #ifdef HAVE_ARIA
20293
        case wolfssl_aria_gcm:
20294
        {
20295
            byte *outBuf = NULL;
20296
            int additionalSz;
20297
20298
            additionalSz = ret = writeAeadAuthData(ssl,
20299
                    sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size, no_type,
20300
                    ssl->decrypt.additional, 1, NULL, PEER_ORDER);
20301
            if (ret < 0)
20302
                break;
20303
            ret = 0;
20304
20305
        #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
20306
            if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl))
20307
                XMEMCPY(ssl->decrypt.nonce,
20308
                        ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV,
20309
                        AESGCM_IMP_IV_SZ);
20310
            else
20311
        #endif
20312
                XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
20313
                        AESGCM_IMP_IV_SZ);
20314
            XMEMCPY(ssl->decrypt.nonce + AESGCM_IMP_IV_SZ, input,
20315
                                                            AESGCM_EXP_IV_SZ);
20316
            outBuf = (byte*)XMALLOC(sz - AESGCM_EXP_IV_SZ, ssl->heap,
20317
                                                       DYNAMIC_TYPE_TMP_BUFFER);
20318
            if (outBuf == NULL) {
20319
                ret = MEMORY_ERROR;
20320
                break;
20321
            }
20322
            ret = wc_AriaDecrypt(ssl->decrypt.aria, outBuf,
20323
                                (byte *)input + AESGCM_EXP_IV_SZ,
20324
                                sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
20325
                                ssl->decrypt.nonce, AESGCM_NONCE_SZ,
20326
                                ssl->decrypt.additional, additionalSz,
20327
                                (byte *)input + sz - ssl->specs.aead_mac_size,
20328
                                ssl->specs.aead_mac_size
20329
                                );
20330
            if (ret != 0)
20331
                break;
20332
            XMEMCPY(plain + AESGCM_EXP_IV_SZ,
20333
                    outBuf,
20334
                    sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size);
20335
            XFREE(outBuf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
20336
            break;
20337
        }
20338
    #endif /* HAVE_ARIA */
20339
20340
    #ifdef HAVE_CAMELLIA
20341
        case wolfssl_camellia:
20342
            ret = wc_CamelliaCbcDecrypt(ssl->decrypt.cam, plain, input, sz);
20343
            break;
20344
    #endif
20345
20346
    #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
20347
        !defined(NO_CHAPOL_AEAD)
20348
        case wolfssl_chacha:
20349
            ret = ChachaAEADDecrypt(ssl, plain, input, sz);
20350
            break;
20351
    #endif
20352
20353
    #ifdef WOLFSSL_SM4_CBC
20354
        case wolfssl_sm4_cbc:
20355
        #ifdef WOLFSSL_ASYNC_CRYPT
20356
            /* initialize event */
20357
            ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
20358
                WC_ASYNC_FLAG_CALL_AGAIN);
20359
            if (ret != 0)
20360
                break;
20361
        #endif
20362
            ret = wc_Sm4CbcDecrypt(ssl->decrypt.sm4, plain, input, sz);
20363
        #ifdef WOLFSSL_ASYNC_CRYPT
20364
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
20365
                ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
20366
            }
20367
        #endif
20368
            break;
20369
    #endif
20370
20371
    #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
20372
        case wolfssl_sm4_gcm:
20373
        case wolfssl_sm4_ccm: /* GCM AEAD macros use same size as CCM */
20374
        {
20375
            SM4_AUTH_DECRYPT_FUNC sm4_auth_fn;
20376
20377
        #ifdef WOLFSSL_ASYNC_CRYPT
20378
            /* initialize event */
20379
            ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.sm4->asyncDev,
20380
                WC_ASYNC_FLAG_CALL_AGAIN);
20381
            if (ret != 0)
20382
                break;
20383
        #endif
20384
20385
        #if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_SM4_CCM)
20386
            sm4_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm)
20387
                            ? SM4_GCM_DECRYPT_FUNC : SM4_CCM_DECRYPT_FUNC;
20388
        #elif defined(WOLFSSL_SM4_GCM)
20389
            sm4_auth_fn = SM4_GCM_DECRYPT_FUNC;
20390
        #else
20391
            sm4_auth_fn = SM4_CCM_DECRYPT_FUNC;
20392
        #endif
20393
20394
            XMEMSET(ssl->decrypt.additional, 0, AEAD_AUTH_DATA_SZ);
20395
20396
            /* sequence number field is 64-bits */
20397
            WriteSEQ(ssl, PEER_ORDER, ssl->decrypt.additional);
20398
20399
            ssl->decrypt.additional[AEAD_TYPE_OFFSET] = ssl->curRL.type;
20400
            ssl->decrypt.additional[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
20401
            ssl->decrypt.additional[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
20402
20403
            c16toa(sz - GCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
20404
                                    ssl->decrypt.additional + AEAD_LEN_OFFSET);
20405
20406
        #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
20407
            if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl))
20408
                XMEMCPY(ssl->decrypt.nonce,
20409
                        ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV,
20410
                        GCM_IMP_IV_SZ);
20411
            else
20412
        #endif
20413
                XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
20414
                        GCM_IMP_IV_SZ);
20415
            XMEMCPY(ssl->decrypt.nonce + GCM_IMP_IV_SZ, input, GCM_EXP_IV_SZ);
20416
            if ((ret = sm4_auth_fn(ssl->decrypt.sm4,
20417
                        plain + GCM_EXP_IV_SZ,
20418
                        input + GCM_EXP_IV_SZ,
20419
                        sz - GCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
20420
                        ssl->decrypt.nonce, GCM_NONCE_SZ,
20421
                        input + sz - ssl->specs.aead_mac_size,
20422
                        ssl->specs.aead_mac_size,
20423
                        ssl->decrypt.additional, AEAD_AUTH_DATA_SZ)) < 0) {
20424
            #ifdef WOLFSSL_ASYNC_CRYPT
20425
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
20426
                    ret = wolfSSL_AsyncPush(ssl,
20427
                                            &ssl->decrypt.sm4->asyncDev);
20428
                }
20429
            #endif
20430
            }
20431
        }
20432
        break;
20433
    #endif /* WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM */
20434
20435
    #ifdef HAVE_NULL_CIPHER
20436
        case wolfssl_cipher_null:
20437
            if (input != plain) {
20438
                XMEMMOVE(plain, input, sz);
20439
            }
20440
            break;
20441
    #endif
20442
20443
        default:
20444
            WOLFSSL_MSG("wolfSSL Decrypt programming error");
20445
            WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
20446
            ret = DECRYPT_ERROR;
20447
    }
20448
20449
#ifdef WOLFSSL_CHECK_MEM_ZERO
20450
    if ((ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) &&
20451
            (ret == 0)) {
20452
        wc_MemZero_Add("Decrypted data", plain, sz);
20453
    }
20454
#endif
20455
20456
    return ret;
20457
}
20458
20459
static int DecryptTls(WOLFSSL* ssl, byte* plain, const byte* input, word16 sz)
20460
0
{
20461
0
    int ret = 0;
20462
20463
#ifdef WOLFSSL_ASYNC_CRYPT
20464
    ret = wolfSSL_AsyncPop(ssl, &ssl->decrypt.state);
20465
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
20466
        /* check for still pending */
20467
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
20468
            return ret;
20469
20470
        ssl->error = 0; /* clear async */
20471
20472
        /* let failures through so CIPHER_STATE_END logic is run */
20473
    }
20474
    else
20475
#endif
20476
0
    {
20477
        /* Reset state */
20478
0
        ret = 0;
20479
0
        ssl->decrypt.state = CIPHER_STATE_BEGIN;
20480
0
    }
20481
20482
0
    switch (ssl->decrypt.state) {
20483
0
        case CIPHER_STATE_BEGIN:
20484
0
        {
20485
0
            if (ssl->decrypt.setup == 0) {
20486
0
                WOLFSSL_MSG("Decrypt ciphers not setup");
20487
0
                WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
20488
0
                return DECRYPT_ERROR;
20489
0
            }
20490
20491
0
        #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA)
20492
            /* make sure AES GCM/CCM memory is allocated */
20493
            /* free for these happens in FreeCiphers */
20494
0
            if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
20495
0
                ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm ||
20496
0
                ssl->specs.bulk_cipher_algorithm == wolfssl_aria_gcm) {
20497
                /* make sure auth iv and auth are allocated */
20498
0
                if (ssl->decrypt.additional == NULL)
20499
0
                    ssl->decrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
20500
0
                                                ssl->heap, DYNAMIC_TYPE_CIPHER);
20501
0
                if (ssl->decrypt.nonce == NULL) {
20502
0
                    ssl->decrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
20503
0
                                                ssl->heap, DYNAMIC_TYPE_CIPHER);
20504
                #ifdef WOLFSSL_CHECK_MEM_ZERO
20505
                    if (ssl->decrypt.nonce != NULL) {
20506
                        wc_MemZero_Add("DecryptTls nonce", ssl->decrypt.nonce,
20507
                            AESGCM_NONCE_SZ);
20508
                    }
20509
                #endif
20510
0
                }
20511
0
                if (ssl->decrypt.additional == NULL ||
20512
0
                         ssl->decrypt.nonce == NULL) {
20513
0
                    return MEMORY_E;
20514
0
                }
20515
0
            }
20516
0
        #endif /* BUILD_AESGCM || HAVE_AESCCM || HAVE_ARIA */
20517
20518
0
        #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
20519
            /* make sure SM4 GCM/CCM memory is allocated */
20520
            /* free for these happens in FreeCiphers */
20521
0
            if (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_ccm ||
20522
0
                ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm) {
20523
                /* make sure auth iv and auth are allocated */
20524
0
                if (ssl->decrypt.additional == NULL)
20525
0
                    ssl->decrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
20526
0
                                                ssl->heap, DYNAMIC_TYPE_CIPHER);
20527
0
                if (ssl->decrypt.nonce == NULL) {
20528
0
                    ssl->decrypt.nonce = (byte*)XMALLOC(GCM_NONCE_SZ,
20529
0
                                                ssl->heap, DYNAMIC_TYPE_CIPHER);
20530
                #ifdef WOLFSSL_CHECK_MEM_ZERO
20531
                    if (ssl->decrypt.nonce != NULL) {
20532
                        wc_MemZero_Add("DecryptTls nonce", ssl->decrypt.nonce,
20533
                            GCM_NONCE_SZ);
20534
                    }
20535
                #endif
20536
0
                }
20537
0
                if (ssl->decrypt.additional == NULL ||
20538
0
                         ssl->decrypt.nonce == NULL) {
20539
0
                    return MEMORY_E;
20540
0
                }
20541
0
            }
20542
0
        #endif /* WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM */
20543
20544
            /* Advance state and proceed */
20545
0
            ssl->decrypt.state = CIPHER_STATE_DO;
20546
0
        }
20547
0
        FALL_THROUGH;
20548
0
        case CIPHER_STATE_DO:
20549
0
        {
20550
        #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
20551
            if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
20552
                /* For epochs >1 the current cipher parameters are located in
20553
                 * ssl->secure_renegotiation->tmp_keys. Previous cipher
20554
                 * parameters and for epoch 1 use ssl->keys */
20555
                if (ssl->keys.curEpoch ==
20556
                        ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
20557
                    if (ssl->decrypt.src != SCR) {
20558
                        ssl->secure_renegotiation->cache_status =
20559
                                SCR_CACHE_NEEDED;
20560
                        if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
20561
                            break;
20562
                    }
20563
                }
20564
                else {
20565
                    if (ssl->decrypt.src != KEYS) {
20566
                        ssl->secure_renegotiation->cache_status =
20567
                                SCR_CACHE_NULL;
20568
                        if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
20569
                            break;
20570
                    }
20571
                }
20572
            }
20573
        #endif
20574
20575
0
            ret = DecryptDo(ssl, plain, input, sz);
20576
20577
            /* Advance state */
20578
0
            ssl->decrypt.state = CIPHER_STATE_END;
20579
20580
        #ifdef WOLFSSL_ASYNC_CRYPT
20581
            /* If pending, leave and return below */
20582
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
20583
                return ret;
20584
            }
20585
        #endif
20586
0
        }
20587
0
        FALL_THROUGH;
20588
0
        case CIPHER_STATE_END:
20589
0
        {
20590
0
        #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA)
20591
            /* make sure AES GCM/CCM nonce is cleared */
20592
0
            if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
20593
0
                ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
20594
0
                if (ssl->decrypt.nonce)
20595
0
                    ForceZero(ssl->decrypt.nonce, AESGCM_NONCE_SZ);
20596
20597
0
                if (ret < 0) {
20598
0
                    ret = VERIFY_MAC_ERROR;
20599
0
                    WOLFSSL_ERROR_VERBOSE(ret);
20600
0
                }
20601
0
            }
20602
0
        #endif /* BUILD_AESGCM || HAVE_AESCCM || HAVE_ARIA */
20603
0
        #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
20604
            /* make sure SM4 GCM/CCM nonce is cleared */
20605
0
            if (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_ccm ||
20606
0
                ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm) {
20607
0
                if (ssl->decrypt.nonce)
20608
0
                    ForceZero(ssl->decrypt.nonce, GCM_NONCE_SZ);
20609
20610
0
                if (ret < 0) {
20611
0
                    ret = VERIFY_MAC_ERROR;
20612
0
                    WOLFSSL_ERROR_VERBOSE(ret);
20613
0
                }
20614
0
            }
20615
0
        #endif /* BUILD_AESGCM || HAVE_AESCCM */
20616
0
            break;
20617
0
        }
20618
20619
0
        default:
20620
0
            break;
20621
0
    }
20622
20623
    /* Reset state */
20624
0
    ssl->decrypt.state = CIPHER_STATE_BEGIN;
20625
20626
0
    return ret;
20627
0
}
20628
20629
#endif /* !WOLFSSL_NO_TLS12 */
20630
20631
/* Check conditions for a cipher to have an explicit IV.
20632
 *
20633
 * ssl  The SSL/TLS object.
20634
 * returns 1 if the cipher in use has an explicit IV and 0 otherwise.
20635
 */
20636
static WC_INLINE int CipherHasExpIV(WOLFSSL *ssl)
20637
5.68k
{
20638
5.68k
#ifdef WOLFSSL_TLS13
20639
5.68k
    if (ssl->options.tls1_3)
20640
5.32k
        return 0;
20641
360
#endif
20642
360
    return (ssl->specs.cipher_type == aead) &&
20643
360
            (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha);
20644
5.68k
}
20645
20646
/* check cipher text size for sanity */
20647
static int SanityCheckCipherText(WOLFSSL* ssl, word32 encryptSz)
20648
5.70k
{
20649
5.70k
    word32 minLength = MacSize(ssl);
20650
20651
5.70k
#ifndef WOLFSSL_AEAD_ONLY
20652
5.70k
    if (ssl->specs.cipher_type == block) {
20653
159
#ifdef HAVE_ENCRYPT_THEN_MAC
20654
159
        if (ssl->options.startedETMRead) {
20655
0
            if ((encryptSz - MacSize(ssl)) % ssl->specs.block_size) {
20656
0
                WOLFSSL_MSG("Block ciphertext not block size");
20657
0
                WOLFSSL_ERROR_VERBOSE(SANITY_CIPHER_E);
20658
0
                return SANITY_CIPHER_E;
20659
0
            }
20660
0
        }
20661
159
        else
20662
159
#endif
20663
159
        if (encryptSz % ssl->specs.block_size) {
20664
7
            WOLFSSL_MSG("Block ciphertext not block size");
20665
7
            WOLFSSL_ERROR_VERBOSE(SANITY_CIPHER_E);
20666
7
            return SANITY_CIPHER_E;
20667
7
        }
20668
20669
152
        minLength++;  /* pad byte */
20670
20671
152
        if (ssl->specs.block_size > minLength)
20672
19
            minLength = ssl->specs.block_size;
20673
20674
152
        if (ssl->options.tls1_1)
20675
152
            minLength += ssl->specs.block_size;  /* explicit IV */
20676
152
    }
20677
5.54k
    else
20678
5.54k
#endif
20679
5.54k
    if (ssl->specs.cipher_type == aead) {
20680
5.50k
        minLength = ssl->specs.aead_mac_size;    /* authTag size */
20681
5.50k
        if (CipherHasExpIV(ssl))
20682
104
            minLength += AESGCM_EXP_IV_SZ;       /* explicit IV  */
20683
5.50k
    }
20684
20685
5.69k
    if (encryptSz < minLength) {
20686
28
        WOLFSSL_MSG("Ciphertext not minimum size");
20687
28
        WOLFSSL_ERROR_VERBOSE(SANITY_CIPHER_E);
20688
28
        return SANITY_CIPHER_E;
20689
28
    }
20690
20691
5.66k
    return 0;
20692
5.69k
}
20693
20694
20695
#ifndef WOLFSSL_AEAD_ONLY
20696
#ifdef WOLFSSL_OLD_TIMINGPADVERIFY
20697
#define COMPRESS_LOWER      64
20698
#define COMPRESS_UPPER      55
20699
#define COMPRESS_CONSTANT   13
20700
20701
#ifndef NO_OLD_TLS
20702
20703
static WC_INLINE void Md5Rounds(int rounds, const byte* data, int sz)
20704
{
20705
    wc_Md5 md5;
20706
    int i;
20707
20708
    wc_InitMd5(&md5);   /* no error check on purpose, dummy round */
20709
20710
    for (i = 0; i < rounds; i++)
20711
        wc_Md5Update(&md5, data, sz);
20712
    wc_Md5Free(&md5); /* in case needed to release resources */
20713
}
20714
20715
20716
20717
/* do a dummy sha round */
20718
static WC_INLINE void ShaRounds(int rounds, const byte* data, int sz)
20719
{
20720
    wc_Sha sha;
20721
    int i;
20722
20723
    wc_InitSha(&sha);  /* no error check on purpose, dummy round */
20724
20725
    for (i = 0; i < rounds; i++)
20726
        wc_ShaUpdate(&sha, data, sz);
20727
    wc_ShaFree(&sha); /* in case needed to release resources */
20728
}
20729
#endif
20730
20731
20732
#ifndef NO_SHA256
20733
20734
static WC_INLINE void Sha256Rounds(int rounds, const byte* data, int sz)
20735
{
20736
    wc_Sha256 sha256;
20737
    int i;
20738
20739
    wc_InitSha256(&sha256);  /* no error check on purpose, dummy round */
20740
20741
    for (i = 0; i < rounds; i++) {
20742
        wc_Sha256Update(&sha256, data, sz);
20743
        /* no error check on purpose, dummy round */
20744
    }
20745
    wc_Sha256Free(&sha256); /* in case needed to release resources */
20746
}
20747
20748
#endif
20749
20750
20751
#ifdef WOLFSSL_SHA384
20752
20753
static WC_INLINE void Sha384Rounds(int rounds, const byte* data, int sz)
20754
{
20755
    wc_Sha384 sha384;
20756
    int i;
20757
20758
    wc_InitSha384(&sha384);  /* no error check on purpose, dummy round */
20759
20760
    for (i = 0; i < rounds; i++) {
20761
        wc_Sha384Update(&sha384, data, sz);
20762
        /* no error check on purpose, dummy round */
20763
    }
20764
    wc_Sha384Free(&sha384); /* in case needed to release resources */
20765
}
20766
20767
#endif
20768
20769
20770
#ifdef WOLFSSL_SHA512
20771
static WC_INLINE void Sha512Rounds(int rounds, const byte* data, int sz)
20772
{
20773
    wc_Sha512 sha512;
20774
    int i;
20775
20776
    wc_InitSha512(&sha512);  /* no error check on purpose, dummy round */
20777
20778
    for (i = 0; i < rounds; i++) {
20779
        wc_Sha512Update(&sha512, data, sz);
20780
        /* no error check on purpose, dummy round */
20781
    }
20782
    wc_Sha512Free(&sha512); /* in case needed to release resources */
20783
}
20784
20785
#endif
20786
20787
20788
#ifdef WOLFSSL_RIPEMD
20789
20790
static WC_INLINE void RmdRounds(int rounds, const byte* data, int sz)
20791
{
20792
    RipeMd ripemd;
20793
    int i;
20794
20795
    wc_InitRipeMd(&ripemd);
20796
20797
    for (i = 0; i < rounds; i++)
20798
        wc_RipeMdUpdate(&ripemd, data, sz);
20799
}
20800
20801
#endif
20802
20803
20804
/* Do dummy rounds */
20805
static WC_INLINE void DoRounds(int type, int rounds, const byte* data, int sz)
20806
{
20807
    (void)rounds;
20808
    (void)data;
20809
    (void)sz;
20810
20811
    switch (type) {
20812
        case no_mac :
20813
            break;
20814
20815
#ifndef NO_OLD_TLS
20816
#ifndef NO_MD5
20817
        case md5_mac :
20818
            Md5Rounds(rounds, data, sz);
20819
            break;
20820
#endif
20821
20822
#ifndef NO_SHA
20823
        case sha_mac :
20824
            ShaRounds(rounds, data, sz);
20825
            break;
20826
#endif
20827
#endif
20828
20829
#ifndef NO_SHA256
20830
        case sha256_mac :
20831
            Sha256Rounds(rounds, data, sz);
20832
            break;
20833
#endif
20834
20835
#ifdef WOLFSSL_SHA384
20836
        case sha384_mac :
20837
            Sha384Rounds(rounds, data, sz);
20838
            break;
20839
#endif
20840
20841
#ifdef WOLFSSL_SHA512
20842
        case sha512_mac :
20843
            Sha512Rounds(rounds, data, sz);
20844
            break;
20845
#endif
20846
20847
#ifdef WOLFSSL_RIPEMD
20848
        case rmd_mac :
20849
            RmdRounds(rounds, data, sz);
20850
            break;
20851
#endif
20852
20853
        default:
20854
            WOLFSSL_MSG("Bad round type");
20855
            break;
20856
    }
20857
}
20858
20859
20860
/* do number of compression rounds on dummy data */
20861
static WC_INLINE void CompressRounds(WOLFSSL* ssl, int rounds, const byte* dummy)
20862
{
20863
    if (rounds)
20864
        DoRounds(ssl->specs.mac_algorithm, rounds, dummy, COMPRESS_LOWER);
20865
}
20866
20867
20868
/* check all length bytes for the pad value, return 0 on success */
20869
static int PadCheck(const byte* a, byte pad, int length)
20870
{
20871
    int i;
20872
    int compareSum = 0;
20873
20874
    for (i = 0; i < length; i++) {
20875
        compareSum |= a[i] ^ pad;
20876
    }
20877
20878
    return compareSum;
20879
}
20880
20881
20882
/* get compression extra rounds */
20883
static WC_INLINE int GetRounds(int pLen, int padLen, int t)
20884
{
20885
    int  roundL1 = 1;  /* round up flags */
20886
    int  roundL2 = 1;
20887
20888
    int L1 = COMPRESS_CONSTANT + pLen - t;
20889
    int L2 = COMPRESS_CONSTANT + pLen - padLen - 1 - t;
20890
20891
    L1 -= COMPRESS_UPPER;
20892
    L2 -= COMPRESS_UPPER;
20893
20894
    if ( (L1 % COMPRESS_LOWER) == 0)
20895
        roundL1 = 0;
20896
    if ( (L2 % COMPRESS_LOWER) == 0)
20897
        roundL2 = 0;
20898
20899
    L1 /= COMPRESS_LOWER;
20900
    L2 /= COMPRESS_LOWER;
20901
20902
    L1 += roundL1;
20903
    L2 += roundL2;
20904
20905
    return L1 - L2;
20906
}
20907
20908
20909
/* timing resistant pad/verify check, return 0 on success */
20910
 int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int t,
20911
                     int pLen, int content)
20912
{
20913
    byte verify[WC_MAX_DIGEST_SIZE];
20914
    byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE] = {0};
20915
    byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy;
20916
    int  ret = 0;
20917
20918
    (void)dmy;
20919
20920
    if ( (t + padLen + 1) > pLen) {
20921
        WOLFSSL_MSG("Plain Len not long enough for pad/mac");
20922
        PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE);
20923
        /* still compare */
20924
        ssl->hmac(ssl, verify, input, pLen - t, -1, content, 1, PEER_ORDER);
20925
        ConstantCompare(verify, input + pLen - t, t);
20926
        WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
20927
        return VERIFY_MAC_ERROR;
20928
    }
20929
20930
    if (PadCheck(input + pLen - (padLen + 1), (byte)padLen, padLen + 1) != 0) {
20931
        WOLFSSL_MSG("PadCheck failed");
20932
        PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE - padLen - 1);
20933
        /* still compare */
20934
        ssl->hmac(ssl, verify, input, pLen - t, -1, content, 1, PEER_ORDER);
20935
        ConstantCompare(verify, input + pLen - t, t);
20936
        WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
20937
        return VERIFY_MAC_ERROR;
20938
    }
20939
20940
    PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE - padLen - 1);
20941
    ret = ssl->hmac(ssl, verify, input, pLen - padLen - 1 - t, -1, content,
20942
                                                                 1, PEER_ORDER);
20943
20944
    CompressRounds(ssl, GetRounds(pLen, padLen, t), dummy);
20945
20946
    if (ConstantCompare(verify, input + (pLen - padLen - 1 - t), t) != 0) {
20947
        WOLFSSL_MSG("Verify MAC compare failed");
20948
        WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
20949
        return VERIFY_MAC_ERROR;
20950
    }
20951
20952
    /* treat any failure as verify MAC error */
20953
    if (ret != 0) {
20954
        ret = VERIFY_MAC_ERROR;
20955
        WOLFSSL_ERROR_VERBOSE(ret);
20956
    }
20957
20958
    return ret;
20959
}
20960
#else
20961
20962
#if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
20963
/* check all length bytes for the pad value, return 0 on success */
20964
static int PadCheck(const byte* a, byte pad, int length)
20965
0
{
20966
0
    int i;
20967
0
    int compareSum = 0;
20968
20969
0
    for (i = 0; i < length; i++) {
20970
0
        compareSum |= a[i] ^ pad;
20971
0
    }
20972
20973
0
    return compareSum;
20974
0
}
20975
20976
20977
/* Mask the padding bytes with the expected values.
20978
 * Constant time implementation - does maximum pad size possible.
20979
 *
20980
 * data   Message data.
20981
 * sz     Size of the message including MAC and padding and padding length.
20982
 * macSz  Size of the MAC.
20983
 * returns 0 on success, otherwise failure.
20984
 */
20985
static byte MaskPadding(const byte* data, int sz, int macSz)
20986
148
{
20987
148
    int i;
20988
148
    int checkSz = sz - 1;
20989
148
    byte paddingSz = data[sz - 1];
20990
148
    byte good = ctMaskGT(paddingSz, sz - 1 - macSz);
20991
20992
148
    if (checkSz > TLS_MAX_PAD_SZ)
20993
68
        checkSz = TLS_MAX_PAD_SZ;
20994
20995
26.2k
    for (i = 0; i < checkSz; i++) {
20996
26.1k
        byte mask = ctMaskLTE(i, paddingSz);
20997
26.1k
        good |= mask & (data[sz - 1 - i] ^ paddingSz);
20998
26.1k
    }
20999
21000
148
    return good;
21001
148
}
21002
21003
/* Mask the MAC in the message with the MAC calculated.
21004
 * Constant time implementation - starts looking for MAC where maximum padding
21005
 * size has it.
21006
 *
21007
 * data    Message data.
21008
 * sz      Size of the message including MAC and padding and padding length.
21009
 * macSz   Size of the MAC data.
21010
 * expMac  Expected MAC value.
21011
 * returns 0 on success, otherwise failure.
21012
 */
21013
static byte MaskMac(const byte* data, int sz, int macSz, byte* expMac)
21014
148
{
21015
148
    int i, j;
21016
148
    unsigned char mac[WC_MAX_DIGEST_SIZE];
21017
148
    int scanStart = sz - 1 - TLS_MAX_PAD_SZ - macSz;
21018
148
    int macEnd = sz - 1 - data[sz - 1];
21019
148
    int macStart = macEnd - macSz;
21020
148
    int r = 0;
21021
148
    unsigned char started, notEnded;
21022
148
    unsigned char good = 0;
21023
21024
148
    scanStart &= ctMaskIntGTE(scanStart, 0);
21025
148
    macStart &= ctMaskIntGTE(macStart, 0);
21026
21027
    /* Div on Intel has different speeds depending on value.
21028
     * Use a bitwise AND or mod a specific value (converted to mul). */
21029
148
    if ((macSz & (macSz - 1)) == 0)
21030
42
        r = (macSz - (scanStart - macStart)) & (macSz - 1);
21031
106
#ifndef NO_SHA
21032
106
    else if (macSz == WC_SHA_DIGEST_SIZE)
21033
59
        r = (macSz - (scanStart - macStart)) % WC_SHA_DIGEST_SIZE;
21034
47
#endif
21035
47
#ifdef WOLFSSL_SHA384
21036
47
    else if (macSz == WC_SHA384_DIGEST_SIZE)
21037
47
        r = (macSz - (scanStart - macStart)) % WC_SHA384_DIGEST_SIZE;
21038
148
#endif
21039
21040
148
    XMEMSET(mac, 0, (size_t)(macSz));
21041
1.18k
    for (i = scanStart; i < sz; i += macSz) {
21042
29.6k
        for (j = 0; j < macSz && j + i < sz; j++) {
21043
28.5k
            started = ctMaskGTE(i + j, macStart);
21044
28.5k
            notEnded = ctMaskLT(i + j, macEnd);
21045
28.5k
            mac[j] |= started & notEnded & data[i + j];
21046
28.5k
        }
21047
1.04k
    }
21048
21049
148
    if ((macSz & (macSz - 1)) == 0) {
21050
1.38k
        for (i = 0; i < macSz; i++)
21051
1.34k
            good |= expMac[i] ^ mac[(i + r) & (macSz - 1)];
21052
42
    }
21053
106
#ifndef NO_SHA
21054
106
    else if (macSz == WC_SHA_DIGEST_SIZE) {
21055
1.23k
        for (i = 0; i < macSz; i++)
21056
1.18k
            good |= expMac[i] ^ mac[(i + r) % WC_SHA_DIGEST_SIZE];
21057
59
    }
21058
47
#endif
21059
47
#ifdef WOLFSSL_SHA384
21060
47
    else if (macSz == WC_SHA384_DIGEST_SIZE) {
21061
2.30k
        for (i = 0; i < macSz; i++)
21062
2.25k
            good |= expMac[i] ^ mac[(i + r) % WC_SHA384_DIGEST_SIZE];
21063
47
    }
21064
148
#endif
21065
21066
148
    return good;
21067
148
}
21068
21069
/* timing resistant pad/verify check, return 0 on success */
21070
int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int macSz,
21071
                    int pLen, int content)
21072
148
{
21073
148
    byte verify[WC_MAX_DIGEST_SIZE];
21074
148
    byte good;
21075
148
    int  ret = 0;
21076
21077
148
    XMEMSET(verify, 0, WC_MAX_DIGEST_SIZE);
21078
148
    good = MaskPadding(input, pLen, macSz);
21079
    /* 4th argument has potential to underflow, ssl->hmac function should
21080
     * either increment the size by (macSz + padLen + 1) before use or check on
21081
     * the size to make sure is valid. */
21082
148
    ret = ssl->hmac(ssl, verify, input, (word32)(pLen - macSz - padLen - 1), padLen,
21083
148
                                                        content, 1, PEER_ORDER);
21084
148
    good |= MaskMac(input, pLen, ssl->specs.hash_size, verify);
21085
21086
    /* Non-zero on failure. */
21087
148
    good = (byte)~(word32)good;
21088
148
    good &= good >> 4;
21089
148
    good &= good >> 2;
21090
148
    good &= good >> 1;
21091
    /* Make ret negative on masking failure. */
21092
148
    ret -= 1 - good;
21093
21094
    /* Treat any failure as verify MAC error. */
21095
148
    if (ret != 0) {
21096
148
        ret = VERIFY_MAC_ERROR;
21097
148
        WOLFSSL_ERROR_VERBOSE(ret);
21098
148
    }
21099
21100
148
    return ret;
21101
148
}
21102
#endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
21103
#endif /* WOLFSSL_OLD_TIMINGPADVERIFY */
21104
#endif /* WOLFSSL_AEAD_ONLY */
21105
21106
int DoApplicationData(WOLFSSL* ssl, byte* input, word32* inOutIdx, int sniff)
21107
{
21108
    word32 msgSz   = ssl->curSize;
21109
    word32 idx     = *inOutIdx;
21110
    int    dataSz;
21111
    byte*  rawData = input + idx;  /* keep current  for hmac */
21112
#ifdef HAVE_LIBZ
21113
    byte   decomp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
21114
#endif
21115
#ifdef WOLFSSL_EARLY_DATA
21116
    int    isEarlyData = ssl->options.tls1_3 &&
21117
                         ssl->options.handShakeDone == 0 &&
21118
                         ssl->options.side == WOLFSSL_SERVER_END;
21119
    int    acceptEarlyData = ssl->earlyData != no_early_data &&
21120
                         ssl->options.clientState == CLIENT_HELLO_COMPLETE;
21121
#endif
21122
21123
#if defined(WOLFSSL_EARLY_DATA) && defined(WOLFSSL_DTLS13)
21124
    if (ssl->options.tls1_3 && ssl->options.dtls)
21125
        isEarlyData = isEarlyData && w64Equal(ssl->keys.curEpoch64,
21126
                w64From32(0x0, DTLS13_EPOCH_EARLYDATA));
21127
#endif
21128
#ifdef WOLFSSL_DTLS13
21129
    /* Application data should never appear in epoch 0 or 2 */
21130
    if (ssl->options.tls1_3 && ssl->options.dtls &&
21131
        (w64Equal(ssl->keys.curEpoch64, w64From32(0x0, DTLS13_EPOCH_HANDSHAKE))
21132
                || w64Equal(ssl->keys.curEpoch64, w64From32(0x0, 0x0))))
21133
    {
21134
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
21135
        return SANITY_MSG_E;
21136
    }
21137
#endif
21138
21139
#ifdef WOLFSSL_EARLY_DATA
21140
    if (isEarlyData && acceptEarlyData) {
21141
        WOLFSSL_MSG("Processing EarlyData");
21142
    }
21143
    else if (isEarlyData && !acceptEarlyData) {
21144
        WOLFSSL_MSG("Ignoring EarlyData!");
21145
        *inOutIdx += ssl->curSize;
21146
        if (*inOutIdx > ssl->buffers.inputBuffer.length)
21147
            return BUFFER_E;
21148
#ifdef WOLFSSL_DTLS13
21149
        /* Receiving app data from the traffic epoch before the handshake is
21150
         * done means that there was a disruption. */
21151
        if (ssl->options.dtls && !w64Equal(ssl->keys.curEpoch64,
21152
                                        w64From32(0x0, DTLS13_EPOCH_EARLYDATA)))
21153
            ssl->dtls13Rtx.sendAcks = 1;
21154
#endif
21155
        return 0;
21156
    }
21157
    else
21158
#endif
21159
#ifdef WOLFSSL_DTLS
21160
    if (ssl->options.handShakeDone == 0 && ssl->options.dtls) {
21161
        WOLFSSL_MSG("Dropping app data received before handshake complete");
21162
        *inOutIdx += ssl->curSize;
21163
        if (*inOutIdx > ssl->buffers.inputBuffer.length)
21164
            return BUFFER_E;
21165
#ifdef WOLFSSL_DTLS13
21166
        /* Receiving app data from the traffic epoch before the handshake is
21167
         * done means that there was a disruption. */
21168
        if (ssl->options.tls1_3 && !w64Equal(ssl->keys.curEpoch64,
21169
                                        w64From32(0x0, DTLS13_EPOCH_EARLYDATA)))
21170
            ssl->dtls13Rtx.sendAcks = 1;
21171
#endif
21172
        return 0;
21173
    }
21174
    else
21175
#endif
21176
    if (ssl->options.handShakeDone == 0) {
21177
        WOLFSSL_MSG("Received App data before a handshake completed");
21178
        if (sniff == NO_SNIFF) {
21179
            SendAlert(ssl, alert_fatal, unexpected_message);
21180
        }
21181
        WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
21182
        return OUT_OF_ORDER_E;
21183
    }
21184
21185
21186
#if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_TLS13_IGNORE_AEAD_LIMITS)
21187
    /* Check if we want to invalidate old epochs. If
21188
     * ssl->dtls13InvalidateBefore is set then we want to mark all old
21189
     * epochs as encrypt only. This is done when we detect too many failed
21190
     * decryptions. We do this here to confirm that the peer has updated its
21191
     * keys and we can stop using the old keys. */
21192
    if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
21193
        if (!w64IsZero(ssl->dtls13InvalidateBefore) &&
21194
                w64Equal(ssl->keys.curEpoch64, ssl->dtls13InvalidateBefore)) {
21195
            Dtls13SetOlderEpochSide(ssl, ssl->dtls13InvalidateBefore,
21196
                                    ENCRYPT_SIDE_ONLY);
21197
            w64Zero(&ssl->dtls13InvalidateBefore);
21198
        }
21199
    }
21200
#endif
21201
21202
    dataSz = (int)(msgSz - ssl->keys.padSz);
21203
    if (dataSz < 0) {
21204
        WOLFSSL_MSG("App data buffer error, malicious input?");
21205
        if (sniff == NO_SNIFF) {
21206
            SendAlert(ssl, alert_fatal, unexpected_message);
21207
        }
21208
        WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
21209
        return BUFFER_ERROR;
21210
    }
21211
#ifdef WOLFSSL_EARLY_DATA
21212
    if (ssl->options.side == WOLFSSL_SERVER_END &&
21213
            ssl->earlyData > early_data_ext) {
21214
        if (ssl->earlyDataSz + dataSz > ssl->options.maxEarlyDataSz) {
21215
            if (sniff == NO_SNIFF) {
21216
                SendAlert(ssl, alert_fatal, unexpected_message);
21217
            }
21218
            return WOLFSSL_FATAL_ERROR;
21219
        }
21220
        ssl->earlyDataSz += dataSz;
21221
    }
21222
#endif
21223
21224
    /* read data */
21225
    if (dataSz) {
21226
        int rawSz = dataSz;       /* keep raw size for idx adjustment */
21227
21228
#ifdef HAVE_LIBZ
21229
        if (ssl->options.usingCompression) {
21230
            dataSz = myDeCompress(ssl, rawData, dataSz, decomp, sizeof(decomp));
21231
            if (dataSz < 0) return dataSz;
21232
        }
21233
#endif
21234
        idx += (word32)rawSz;
21235
21236
        ssl->buffers.clearOutputBuffer.buffer = rawData;
21237
        ssl->buffers.clearOutputBuffer.length = (unsigned int)dataSz;
21238
    }
21239
21240
    idx += ssl->keys.padSz;
21241
21242
#ifdef HAVE_LIBZ
21243
    /* decompress could be bigger, overwrite after verify */
21244
    if (ssl->options.usingCompression)
21245
        XMEMMOVE(rawData, decomp, dataSz);
21246
#endif
21247
21248
    *inOutIdx = idx;
21249
#ifdef WOLFSSL_DTLS13
21250
    if (ssl->options.connectState == WAIT_FINISHED_ACK) {
21251
        /* DTLS 1.3 is waiting for an ACK but we can still return app data. */
21252
        return APP_DATA_READY;
21253
    }
21254
#endif
21255
#ifdef HAVE_SECURE_RENEGOTIATION
21256
    if (IsSCR(ssl)) {
21257
        /* If we are in a secure renegotiation then APP DATA is treated
21258
         * differently */
21259
        return APP_DATA_READY;
21260
    }
21261
#endif
21262
    return 0;
21263
}
21264
21265
const char* AlertTypeToString(int type)
21266
68.3k
{
21267
68.3k
    switch (type) {
21268
0
        case close_notify:
21269
0
            {
21270
0
                static const char close_notify_str[] =
21271
0
                    "close_notify";
21272
0
                return close_notify_str;
21273
0
            }
21274
21275
1.56k
        case unexpected_message:
21276
1.56k
            {
21277
1.56k
                static const char unexpected_message_str[] =
21278
1.56k
                    "unexpected_message";
21279
1.56k
                return unexpected_message_str;
21280
0
            }
21281
21282
1.50k
        case bad_record_mac:
21283
1.50k
            {
21284
1.50k
                static const char bad_record_mac_str[] =
21285
1.50k
                    "bad_record_mac";
21286
1.50k
                return bad_record_mac_str;
21287
0
            }
21288
21289
5.40k
        case record_overflow:
21290
5.40k
            {
21291
5.40k
                static const char record_overflow_str[] =
21292
5.40k
                    "record_overflow";
21293
5.40k
                return record_overflow_str;
21294
0
            }
21295
21296
0
        case decompression_failure:
21297
0
            {
21298
0
                static const char decompression_failure_str[] =
21299
0
                    "decompression_failure";
21300
0
                return decompression_failure_str;
21301
0
            }
21302
21303
11.7k
        case handshake_failure:
21304
11.7k
            {
21305
11.7k
                static const char handshake_failure_str[] =
21306
11.7k
                    "handshake_failure";
21307
11.7k
                return handshake_failure_str;
21308
0
            }
21309
21310
0
        case no_certificate:
21311
0
            {
21312
0
                static const char no_certificate_str[] =
21313
0
                    "no_certificate";
21314
0
                return no_certificate_str;
21315
0
            }
21316
21317
1
        case bad_certificate:
21318
1
            {
21319
1
                static const char bad_certificate_str[] =
21320
1
                    "bad_certificate";
21321
1
                return bad_certificate_str;
21322
0
            }
21323
21324
0
        case unsupported_certificate:
21325
0
            {
21326
0
                static const char unsupported_certificate_str[] =
21327
0
                    "unsupported_certificate";
21328
0
                return unsupported_certificate_str;
21329
0
            }
21330
21331
0
        case certificate_revoked:
21332
0
            {
21333
0
                static const char certificate_revoked_str[] =
21334
0
                    "certificate_revoked";
21335
0
                return certificate_revoked_str;
21336
0
            }
21337
21338
0
        case certificate_expired:
21339
0
            {
21340
0
                static const char certificate_expired_str[] =
21341
0
                    "certificate_expired";
21342
0
                return certificate_expired_str;
21343
0
            }
21344
21345
0
        case certificate_unknown:
21346
0
            {
21347
0
                static const char certificate_unknown_str[] =
21348
0
                    "certificate_unknown";
21349
0
                return certificate_unknown_str;
21350
0
            }
21351
21352
3.57k
        case illegal_parameter:
21353
3.57k
            {
21354
3.57k
                static const char illegal_parameter_str[] =
21355
3.57k
                    "illegal_parameter";
21356
3.57k
                return illegal_parameter_str;
21357
0
            }
21358
21359
82
        case unknown_ca:
21360
82
            {
21361
82
                static const char unknown_ca_str[] =
21362
82
                    "unknown_ca";
21363
82
                return unknown_ca_str;
21364
0
            }
21365
21366
0
        case access_denied:
21367
0
            {
21368
0
                static const char access_denied_str[] =
21369
0
                    "access_denied";
21370
0
                return access_denied_str;
21371
0
            }
21372
21373
33.7k
        case decode_error:
21374
33.7k
            {
21375
33.7k
                static const char decode_error_str[] =
21376
33.7k
                    "decode_error";
21377
33.7k
                return decode_error_str;
21378
0
            }
21379
21380
0
        case decrypt_error:
21381
0
            {
21382
0
                static const char decrypt_error_str[] =
21383
0
                    "decrypt_error";
21384
0
                return decrypt_error_str;
21385
0
            }
21386
21387
9.87k
        case wolfssl_alert_protocol_version:
21388
9.87k
            {
21389
9.87k
                static const char protocol_version_str[] =
21390
9.87k
                    "protocol_version";
21391
9.87k
                return protocol_version_str;
21392
0
            }
21393
0
        case insufficient_security:
21394
0
            {
21395
0
                static const char insufficient_security_str[] =
21396
0
                    "insufficient_security";
21397
0
                return insufficient_security_str;
21398
0
            }
21399
21400
0
        case internal_error:
21401
0
            {
21402
0
                static const char internal_error_str[] =
21403
0
                    "internal_error";
21404
0
                return internal_error_str;
21405
0
            }
21406
21407
0
        case inappropriate_fallback:
21408
0
            {
21409
0
                static const char inappropriate_fallback_str[] =
21410
0
                    "inappropriate_fallback";
21411
0
                return inappropriate_fallback_str;
21412
0
            }
21413
21414
0
        case user_canceled:
21415
0
            {
21416
0
                static const char user_canceled_str[] =
21417
0
                    "user_canceled";
21418
0
                return user_canceled_str;
21419
0
            }
21420
21421
65
        case no_renegotiation:
21422
65
            {
21423
65
                static const char no_renegotiation_str[] =
21424
65
                    "no_renegotiation";
21425
65
                return no_renegotiation_str;
21426
0
            }
21427
21428
130
        case missing_extension:
21429
130
            {
21430
130
                static const char missing_extension_str[] =
21431
130
                    "missing_extension";
21432
130
                return missing_extension_str;
21433
0
            }
21434
21435
21
        case unsupported_extension:
21436
21
            {
21437
21
                static const char unsupported_extension_str[] =
21438
21
                    "unsupported_extension";
21439
21
                return unsupported_extension_str;
21440
0
            }
21441
21442
0
        case unrecognized_name:
21443
0
            {
21444
0
                static const char unrecognized_name_str[] =
21445
0
                    "unrecognized_name";
21446
0
                return unrecognized_name_str;
21447
0
            }
21448
21449
575
        case bad_certificate_status_response:
21450
575
            {
21451
575
                static const char bad_certificate_status_response_str[] =
21452
575
                    "bad_certificate_status_response";
21453
575
                return bad_certificate_status_response_str;
21454
0
            }
21455
21456
0
        case unknown_psk_identity:
21457
0
            {
21458
0
                static const char unknown_psk_identity_str[] =
21459
0
                    "unknown_psk_identity";
21460
0
                return unknown_psk_identity_str;
21461
0
            }
21462
21463
0
        case certificate_required:
21464
0
            {
21465
0
                static const char certificate_required_str[] =
21466
0
                    "certificate_required";
21467
0
                return certificate_required_str;
21468
0
            }
21469
21470
0
        case no_application_protocol:
21471
0
            {
21472
0
                static const char no_application_protocol_str[] =
21473
0
                    "no_application_protocol";
21474
0
                return no_application_protocol_str;
21475
0
            }
21476
21477
0
        default:
21478
0
            WOLFSSL_MSG("Unknown Alert");
21479
0
            return NULL;
21480
68.3k
    }
21481
68.3k
}
21482
21483
static void LogAlert(int type)
21484
1.20k
{
21485
#ifdef DEBUG_WOLFSSL
21486
    const char* typeStr;
21487
21488
    typeStr = AlertTypeToString(type);
21489
    if (typeStr != NULL) {
21490
        char buff[60];
21491
        if (XSNPRINTF(buff, sizeof(buff), "Alert type: %s", typeStr)
21492
            >= (int)sizeof(buff))
21493
        {
21494
            buff[sizeof(buff) - 1] = 0;
21495
        }
21496
        WOLFSSL_MSG(buff);
21497
    }
21498
#else
21499
1.20k
    (void)type;
21500
1.20k
#endif /* DEBUG_WOLFSSL */
21501
1.20k
}
21502
21503
/* process alert, return level */
21504
static int DoAlert(WOLFSSL* ssl, byte* input, word32* inOutIdx, int* type)
21505
0
{
21506
0
    byte level;
21507
0
    byte code;
21508
0
    word32 dataSz = (word32)ssl->curSize;
21509
21510
    #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
21511
        if (ssl->hsInfoOn)
21512
            AddPacketName(ssl, "Alert");
21513
        if (ssl->toInfoOn) {
21514
            /* add record header back on to info + alert bytes level/code */
21515
            int ret = AddPacketInfo(ssl, "Alert", alert, input + *inOutIdx,
21516
                          ALERT_SIZE, READ_PROTO, RECORD_HEADER_SZ, ssl->heap);
21517
            if (ret != 0)
21518
                return ret;
21519
            #ifdef WOLFSSL_CALLBACKS
21520
            AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
21521
            #endif
21522
        }
21523
    #endif
21524
21525
0
    if (IsEncryptionOn(ssl, 0))
21526
0
        dataSz -= ssl->keys.padSz;
21527
21528
    /* make sure can read the message */
21529
0
    if (dataSz != ALERT_SIZE) {
21530
#ifdef WOLFSSL_EXTRA_ALERTS
21531
        SendAlert(ssl, alert_fatal, unexpected_message);
21532
#endif
21533
0
        return BUFFER_E;
21534
0
    }
21535
21536
0
    level = input[(*inOutIdx)++];
21537
0
    code  = input[(*inOutIdx)++];
21538
0
    ssl->alert_history.last_rx.code = code;
21539
0
    ssl->alert_history.last_rx.level = level;
21540
0
    *type = code;
21541
0
    if (level == alert_fatal) {
21542
0
        ssl->options.isClosed = 1;  /* Don't send close_notify */
21543
0
    }
21544
21545
0
    if (++ssl->options.alertCount >= WOLFSSL_ALERT_COUNT_MAX) {
21546
0
        WOLFSSL_MSG("Alert count exceeded");
21547
#ifdef WOLFSSL_EXTRA_ALERTS
21548
        if (level != alert_warning || code != close_notify)
21549
            SendAlert(ssl, alert_fatal, unexpected_message);
21550
#endif
21551
0
        WOLFSSL_ERROR_VERBOSE(ALERT_COUNT_E);
21552
0
        return ALERT_COUNT_E;
21553
0
    }
21554
21555
0
    LogAlert(*type);
21556
0
    if (*type == close_notify) {
21557
0
        ssl->options.closeNotify = 1;
21558
0
    }
21559
0
    else {
21560
        /*
21561
         * A close_notify alert doesn't mean there's been an error, so we only
21562
         * add other types of alerts to the error queue
21563
         */
21564
0
        WOLFSSL_ERROR(*type);
21565
0
    }
21566
21567
0
    if (IsEncryptionOn(ssl, 0)) {
21568
0
        *inOutIdx += ssl->keys.padSz;
21569
0
    }
21570
21571
0
    return level;
21572
0
}
21573
21574
static int GetInputData(WOLFSSL *ssl, word32 size)
21575
0
{
21576
0
    int inSz;
21577
0
    int maxLength;
21578
0
    int usedLength;
21579
0
    int dtlsExtra = 0;
21580
21581
0
    if (ssl->options.disableRead)
21582
0
        return WC_NO_ERR_TRACE(WANT_READ);
21583
21584
    /* check max input length */
21585
0
    usedLength = (int)(ssl->buffers.inputBuffer.length -
21586
0
                       ssl->buffers.inputBuffer.idx);
21587
0
    maxLength  = (int)(ssl->buffers.inputBuffer.bufferSize -
21588
0
                       (word32)usedLength);
21589
21590
#ifdef WOLFSSL_DTLS
21591
    if (ssl->options.dtls && IsDtlsNotSctpMode(ssl)) {
21592
        /* Add DTLS_MTU_ADDITIONAL_READ_BUFFER bytes so that we can operate with
21593
         * slight difference in set MTU size on each peer */
21594
#ifdef WOLFSSL_DTLS_MTU
21595
        inSz = (word32)ssl->dtlsMtuSz + DTLS_MTU_ADDITIONAL_READ_BUFFER;
21596
#else
21597
        inSz = MAX_MTU + DTLS_MTU_ADDITIONAL_READ_BUFFER;
21598
#endif
21599
        if (size < (word32)inSz)
21600
            dtlsExtra = (int)(inSz - size);
21601
    }
21602
    else
21603
#endif
21604
0
    {
21605
        /* check that no lengths or size values are negative */
21606
0
        if (usedLength < 0 || maxLength < 0) {
21607
0
            return BUFFER_ERROR;
21608
0
        }
21609
21610
        /* Return if we have enough data already in the buffer */
21611
0
        if (size <= (word32)usedLength) {
21612
0
            return 0;
21613
0
        }
21614
21615
0
        inSz = (int)(size - (word32)usedLength); /* from last partial read */
21616
0
    }
21617
21618
0
    if (inSz > maxLength) {
21619
0
        if (GrowInputBuffer(ssl, (int)(size + (word32)dtlsExtra), usedLength) < 0)
21620
0
            return MEMORY_E;
21621
0
    }
21622
21623
    /* Put buffer data at start if not there */
21624
0
    if (usedLength > 0 && ssl->buffers.inputBuffer.idx != 0)
21625
0
        XMEMMOVE(ssl->buffers.inputBuffer.buffer,
21626
0
                ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
21627
0
                (size_t)(usedLength));
21628
21629
    /* remove processed data */
21630
0
    ssl->buffers.inputBuffer.idx    = 0;
21631
0
    ssl->buffers.inputBuffer.length = (word32)usedLength;
21632
21633
    /* read data from network */
21634
0
    do {
21635
0
        int in = wolfSSLReceive(ssl,
21636
0
                     ssl->buffers.inputBuffer.buffer +
21637
0
                     ssl->buffers.inputBuffer.length,
21638
0
                     (word32)inSz);
21639
0
        if (in == WC_NO_ERR_TRACE(WANT_READ))
21640
0
            return WC_NO_ERR_TRACE(WANT_READ);
21641
21642
0
        if (in < 0) {
21643
0
            WOLFSSL_ERROR_VERBOSE(SOCKET_ERROR_E);
21644
0
            return SOCKET_ERROR_E;
21645
0
        }
21646
21647
0
        if (in > inSz) {
21648
0
            WOLFSSL_ERROR_VERBOSE(RECV_OVERFLOW_E);
21649
0
            return RECV_OVERFLOW_E;
21650
0
        }
21651
21652
0
        if ((word32)in < size) {
21653
0
            if (!RecordsCanSpanReads(ssl)) {
21654
0
                WOLFSSL_MSG("DTLS: Received partial record, ignoring");
21655
#ifdef WOLFSSL_DTLS_DROP_STATS
21656
                ssl->replayDropCount++;
21657
#endif /* WOLFSSL_DTLS_DROP_STATS */
21658
0
                continue;
21659
0
            }
21660
0
        }
21661
21662
0
        ssl->buffers.inputBuffer.length += (word32)in;
21663
0
        inSz -= in;
21664
0
    } while (ssl->buffers.inputBuffer.length < size);
21665
21666
#ifdef WOLFSSL_DEBUG_TLS
21667
    if (ssl->buffers.inputBuffer.idx == 0) {
21668
        WOLFSSL_MSG("Data received");
21669
        WOLFSSL_BUFFER(ssl->buffers.inputBuffer.buffer,
21670
                       ssl->buffers.inputBuffer.length);
21671
    }
21672
#endif
21673
21674
0
    return 0;
21675
0
}
21676
21677
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
21678
static WC_INLINE int VerifyMacEnc(WOLFSSL* ssl, const byte* input, word32 msgSz,
21679
                                  int content)
21680
{
21681
    int    ret;
21682
#ifdef HAVE_TRUNCATED_HMAC
21683
    word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
21684
                                          : ssl->specs.hash_size;
21685
#else
21686
    word32 digestSz = ssl->specs.hash_size;
21687
#endif
21688
    byte   verify[WC_MAX_DIGEST_SIZE];
21689
21690
    WOLFSSL_MSG("Verify MAC of Encrypted Data");
21691
21692
    if (msgSz < digestSz) {
21693
        WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
21694
        return VERIFY_MAC_ERROR;
21695
    }
21696
    XMEMSET(verify, 0, WC_MAX_DIGEST_SIZE);
21697
21698
    ret  = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1, PEER_ORDER);
21699
    ret |= ConstantCompare(verify, input + msgSz - digestSz, (int)digestSz);
21700
    if (ret != 0) {
21701
        WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
21702
        return VERIFY_MAC_ERROR;
21703
    }
21704
21705
    return 0;
21706
}
21707
#endif
21708
21709
static WC_INLINE int VerifyMac(WOLFSSL* ssl, const byte* input, word32 msgSz,
21710
                            int content, word32* padSz)
21711
180
{
21712
180
#if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
21713
180
    int    ret;
21714
180
    word32 pad     = 0;
21715
180
    word32 padByte = 0;
21716
180
    word32 digestSz = MacSize(ssl);
21717
180
    byte   verify[WC_MAX_DIGEST_SIZE];
21718
21719
180
    XMEMSET(verify, 0, WC_MAX_DIGEST_SIZE);
21720
21721
180
    if (ssl->specs.cipher_type == block) {
21722
148
        pad = input[msgSz - 1];
21723
148
        padByte = 1;
21724
21725
148
        if (ssl->options.tls) {
21726
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
21727
            ret = PROTOCOLCB_UNAVAILABLE;
21728
            if(ssl->ctx->VerifyMacCb) {
21729
                void* ctx = wolfSSL_GetVerifyMacCtx(ssl);
21730
                ret = ssl->ctx->VerifyMacCb(ssl, input,
21731
                                            msgSz - digestSz - pad - 1,
21732
                                            digestSz, (word32)content, ctx);
21733
                if (ret != 0 &&
21734
                    ret != WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE)) {
21735
                    return ret;
21736
                }
21737
            }
21738
            if (!ssl->ctx->VerifyMacCb ||
21739
                ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
21740
#endif
21741
148
            ret = TimingPadVerify(ssl, input, (int)pad, (int)digestSz,
21742
148
                                  (int)msgSz, content);
21743
148
            if (ret != 0)
21744
148
                return ret;
21745
148
        }
21746
0
        else {  /* sslv3, some implementations have bad padding, but don't
21747
                 * allow bad read */
21748
0
            int  badPadLen = 0;
21749
0
            byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE];
21750
0
            byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy;
21751
0
            XMEMSET(dmy, 0, sizeof(dmy));
21752
21753
0
            if (pad > (msgSz - digestSz - 1)) {
21754
0
                WOLFSSL_MSG("Plain Len not long enough for pad/mac");
21755
0
                pad       = 0;  /* no bad read */
21756
0
                badPadLen = 1;
21757
0
            }
21758
0
            (void)PadCheck(dummy, (byte)pad, MAX_PAD_SIZE);  /* timing only */
21759
0
            ret = ssl->hmac(ssl, verify, input, msgSz - digestSz - pad - 1,
21760
0
                            (int)pad, content, 1, PEER_ORDER);
21761
0
            if (ConstantCompare(verify, input + msgSz - digestSz - pad - 1,
21762
0
                                (int)digestSz) != 0) {
21763
0
                WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
21764
0
                return VERIFY_MAC_ERROR;
21765
0
            }
21766
0
            if (ret != 0 || badPadLen) {
21767
0
                WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
21768
0
                return VERIFY_MAC_ERROR;
21769
0
            }
21770
0
        }
21771
148
    }
21772
32
    else if (ssl->specs.cipher_type == stream) {
21773
32
        ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1,
21774
32
                        PEER_ORDER);
21775
32
        if (ConstantCompare(verify, input + msgSz - digestSz, (int)digestSz) != 0) {
21776
29
            WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
21777
29
            return VERIFY_MAC_ERROR;
21778
29
        }
21779
3
        if (ret != 0) {
21780
3
            WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
21781
3
            return VERIFY_MAC_ERROR;
21782
3
        }
21783
3
    }
21784
0
#endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
21785
21786
0
    if (ssl->specs.cipher_type == aead) {
21787
0
        *padSz = ssl->specs.aead_mac_size;
21788
0
    }
21789
0
#if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
21790
0
    else {
21791
0
        *padSz = pad + padByte;
21792
0
    }
21793
0
#endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
21794
21795
0
    (void)input;
21796
0
    (void)msgSz;
21797
0
    (void)content;
21798
21799
0
    return 0;
21800
180
}
21801
21802
#ifdef WOLFSSL_DTLS
21803
static int HandleDTLSDecryptFailed(WOLFSSL* ssl)
21804
{
21805
    int ret = 0;
21806
#ifdef WOLFSSL_DTLS_DROP_STATS
21807
    ssl->macDropCount++;
21808
#endif
21809
21810
#if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_TLS13_IGNORE_AEAD_LIMITS)
21811
    /* Handle AEAD limits specified by the RFC for failed decryption */
21812
    if (IsAtLeastTLSv1_3(ssl->version))
21813
        ret = Dtls13CheckAEADFailLimit(ssl);
21814
#endif
21815
21816
    (void)ssl;
21817
    WOLFSSL_MSG("DTLS: Ignoring failed decryption");
21818
    return ret;
21819
}
21820
21821
static int DtlsShouldDrop(WOLFSSL* ssl, int retcode)
21822
{
21823
    if (ssl->options.handShakeDone && !IsEncryptionOn(ssl, 0) &&
21824
            !ssl->options.dtlsHsRetain) {
21825
        WOLFSSL_MSG("Silently dropping plaintext DTLS message "
21826
                    "on established connection when we have nothing to send.");
21827
        return 1;
21828
    }
21829
21830
    if ((ssl->options.handShakeDone && retcode != 0)
21831
        || retcode == WC_NO_ERR_TRACE(SEQUENCE_ERROR)
21832
        || retcode == WC_NO_ERR_TRACE(DTLS_CID_ERROR)
21833
        || retcode == WC_NO_ERR_TRACE(DTLS_PARTIAL_RECORD_READ)) {
21834
        WOLFSSL_MSG_EX("Silently dropping DTLS message: %d", retcode);
21835
        return 1;
21836
    }
21837
21838
#ifdef WOLFSSL_DTLS13
21839
    if (IsAtLeastTLSv1_3(ssl->version) && !w64IsZero(ssl->dtls13Epoch)
21840
            && w64IsZero(ssl->keys.curEpoch64) && ssl->curRL.type != ack) {
21841
        WOLFSSL_MSG("Silently dropping plaintext DTLS message "
21842
                    "during encrypted handshake.");
21843
        return 1;
21844
    }
21845
#endif /* WOLFSSL_DTLS13 */
21846
21847
#ifndef NO_WOLFSSL_SERVER
21848
    if (ssl->options.side == WOLFSSL_SERVER_END
21849
            && ssl->curRL.type != handshake && !IsSCR(ssl)) {
21850
        if (!ssl->options.dtlsStateful) {
21851
            WOLFSSL_MSG("Drop non-handshake record when not stateful");
21852
            return 1;
21853
        }
21854
    }
21855
#endif /* NO_WOLFSSL_SERVER */
21856
21857
    return 0;
21858
}
21859
#endif /* WOLFSSL_DTLS */
21860
21861
#if defined(WOLFSSL_TLS13) || \
21862
    (defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID))
21863
static int removeMsgInnerPadding(WOLFSSL* ssl)
21864
0
{
21865
0
    word32 i = ssl->buffers.inputBuffer.idx +
21866
0
        ssl->curSize;
21867
0
    if (ssl->specs.cipher_type == aead)
21868
0
        i -= ssl->specs.aead_mac_size;
21869
0
    else
21870
0
        i -= ssl->keys.padSz + MacSize(ssl);
21871
21872
    /* check that the end of the logical length doesn't extend
21873
     * past the real buffer */
21874
0
    if (i > ssl->buffers.inputBuffer.length || i == 0) {
21875
0
        WOLFSSL_ERROR(BUFFER_ERROR);
21876
0
        return BUFFER_ERROR;
21877
0
    }
21878
21879
    /* Remove padding from end of plain text. */
21880
0
    for (--i; i > ssl->buffers.inputBuffer.idx; i--) {
21881
0
        if (ssl->buffers.inputBuffer.buffer[i] != 0)
21882
0
            break;
21883
0
    }
21884
21885
    /* Get the real content type from the end of the data. */
21886
0
    ssl->curRL.type = ssl->buffers.inputBuffer.buffer[i];
21887
    /* consider both contentType byte and MAC as padding */
21888
0
    ssl->keys.padSz = ssl->buffers.inputBuffer.idx
21889
0
        + ssl->curSize - i;
21890
0
    return 0;
21891
0
}
21892
#endif
21893
21894
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
21895
static void dtlsClearPeer(WOLFSSL_SOCKADDR* peer)
21896
{
21897
    XFREE(peer->sa, NULL, DYNAMIC_TYPE_SOCKADDR);
21898
    peer->sa = NULL;
21899
    peer->sz = 0;
21900
    peer->bufSz = 0;
21901
}
21902
21903
21904
/**
21905
 * @brief Handle pending peer during record processing.
21906
 * @param ssl           WOLFSSL object.
21907
 * @param deprotected   0 when we have not decrypted the record yet
21908
 *                      1 when we have decrypted and verified the record
21909
 */
21910
static void dtlsProcessPendingPeer(WOLFSSL* ssl, int deprotected)
21911
{
21912
    if (ssl->buffers.dtlsCtx.pendingPeer.sa != NULL) {
21913
        if (!deprotected) {
21914
            /* Here we have just read an entire record from the network. It is
21915
             * still encrypted. If processingPendingRecord is set then that
21916
             * means that an error occurred when processing the previous record.
21917
             * In that case we should clear the pendingPeer because we only
21918
             * want to allow it to be valid for one record. */
21919
            if (ssl->buffers.dtlsCtx.processingPendingRecord) {
21920
                /* Clear the pending peer. */
21921
                dtlsClearPeer(&ssl->buffers.dtlsCtx.pendingPeer);
21922
            }
21923
            ssl->buffers.dtlsCtx.processingPendingRecord =
21924
                    !ssl->buffers.dtlsCtx.processingPendingRecord;
21925
        }
21926
        else {
21927
            /* Pending peer present and record deprotected. Update the peer. */
21928
            (void)wolfSSL_dtls_set_peer(ssl,
21929
                    ssl->buffers.dtlsCtx.pendingPeer.sa,
21930
                    ssl->buffers.dtlsCtx.pendingPeer.sz);
21931
            ssl->buffers.dtlsCtx.processingPendingRecord = 0;
21932
            dtlsClearPeer(&ssl->buffers.dtlsCtx.pendingPeer);
21933
        }
21934
    }
21935
    else {
21936
        ssl->buffers.dtlsCtx.processingPendingRecord = 0;
21937
    }
21938
}
21939
#endif
21940
static int DoDecrypt(WOLFSSL *ssl)
21941
{
21942
    int ret;
21943
    int atomicUser = 0;
21944
    bufferStatic* in = &ssl->buffers.inputBuffer;
21945
21946
#ifdef ATOMIC_USER
21947
    if (ssl->ctx->DecryptVerifyCb)
21948
        atomicUser = 1;
21949
#endif
21950
21951
    ret = SanityCheckCipherText(ssl, ssl->curSize);
21952
    if (ret < 0) {
21953
        return ret;
21954
    }
21955
21956
    if (atomicUser) {
21957
#ifdef ATOMIC_USER
21958
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
21959
        if (ssl->options.startedETMRead) {
21960
            ret = ssl->ctx->VerifyDecryptCb(ssl,
21961
                            in->buffer + in->idx, in->buffer + in->idx,
21962
                            ssl->curSize - MacSize(ssl),
21963
                            ssl->curRL.type, 1, &ssl->keys.padSz,
21964
                            ssl->DecryptVerifyCtx);
21965
        }
21966
        else
21967
#endif
21968
        {
21969
            ret = ssl->ctx->DecryptVerifyCb(ssl,
21970
                            in->buffer + in->idx,
21971
                            in->buffer + in->idx,
21972
                            ssl->curSize, ssl->curRL.type, 1,
21973
                            &ssl->keys.padSz, ssl->DecryptVerifyCtx);
21974
        }
21975
#endif /* ATOMIC_USER */
21976
    }
21977
    else {
21978
        if (!ssl->options.tls1_3) {
21979
#ifndef WOLFSSL_NO_TLS12
21980
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
21981
        if (ssl->options.startedETMRead) {
21982
            word32 digestSz = MacSize(ssl);
21983
            ret = DecryptTls(ssl,
21984
                            in->buffer + in->idx,
21985
                            in->buffer + in->idx,
21986
                            ssl->curSize - (word16)digestSz);
21987
            if (ret == 0) {
21988
                byte invalid = 0;
21989
                byte padding = (byte)-1;
21990
                word32 i;
21991
                word32 off = in->idx + ssl->curSize - digestSz - 1;
21992
21993
                /* Last of padding bytes - indicates length. */
21994
                ssl->keys.padSz = in->buffer[off];
21995
                /* Constant time checking of padding - don't leak
21996
                    * the length of the data.
21997
                    */
21998
                /* Compare max pad bytes or at most data + pad. */
21999
                for (i = 1; i < MAX_PAD_SIZE && off >= i; i++) {
22000
                    /* Mask on indicates this is expected to be a
22001
                        * padding byte.
22002
                        */
22003
                    padding &= ctMaskLTE((int)i,
22004
                                            (int)ssl->keys.padSz);
22005
                    /* When this is a padding byte and not equal
22006
                        * to length then mask is set.
22007
                        */
22008
                    invalid |= padding &
22009
                                ctMaskNotEq(in->buffer[off - i],
22010
                                            (int)ssl->keys.padSz);
22011
                }
22012
                /* If mask is set then there was an error. */
22013
                if (invalid) {
22014
                    ret = DECRYPT_ERROR;
22015
                }
22016
                ssl->keys.padSz += 1;
22017
                ssl->keys.decryptedCur = 1;
22018
            }
22019
        }
22020
        else
22021
#endif
22022
        {
22023
            ret = DecryptTls(ssl,
22024
                            in->buffer + in->idx,
22025
                            in->buffer + in->idx,
22026
                            ssl->curSize);
22027
        }
22028
#else
22029
            ret = DECRYPT_ERROR;
22030
#endif
22031
        }
22032
        else
22033
        {
22034
    #ifdef WOLFSSL_TLS13
22035
            byte *aad = (byte*)&ssl->curRL;
22036
            word16 aad_size = RECORD_HEADER_SZ;
22037
        #ifdef WOLFSSL_DTLS13
22038
            if (ssl->options.dtls) {
22039
                /* aad now points to the record header */
22040
                aad = ssl->dtls13CurRL;
22041
                aad_size = ssl->dtls13CurRlLength;
22042
            }
22043
        #endif /* WOLFSSL_DTLS13 */
22044
            /* Don't send an alert for DTLS. We will just drop it
22045
                * silently later. */
22046
            ret = DecryptTls13(ssl,
22047
                            in->buffer + in->idx,
22048
                            in->buffer + in->idx,
22049
                            ssl->curSize,
22050
                            aad, aad_size);
22051
    #else
22052
            ret = DECRYPT_ERROR;
22053
    #endif /* WOLFSSL_TLS13 */
22054
        }
22055
        (void)in;
22056
    }
22057
    return ret;
22058
}
22059
22060
#ifdef WOLFSSL_DTLS
22061
static void DropAndRestartProcessReply(WOLFSSL* ssl)
22062
{
22063
    ssl->options.processReply = doProcessInit;
22064
    ssl->buffers.inputBuffer.length = 0;
22065
    ssl->buffers.inputBuffer.idx = 0;
22066
#ifdef WOLFSSL_DTLS_DROP_STATS
22067
    if (ssl->options.dtls)
22068
        ssl->replayDropCount++;
22069
#endif /* WOLFSSL_DTLS_DROP_STATS */
22070
}
22071
#endif /* WOLFSSL_DTLS */
22072
/* Process input requests. Return 0 is done, 1 is call again to complete, and
22073
   negative number is error. If allowSocketErr is set, SOCKET_ERROR_E in
22074
   ssl->error will be whitelisted. This is useful when the connection has been
22075
   closed and the endpoint wants to check for an alert sent by the other end. */
22076
static int DoProcessReplyEx(WOLFSSL* ssl, int allowSocketErr)
22077
0
{
22078
0
    int    ret = 0, type = internal_error, readSz;
22079
0
    int    atomicUser = 0;
22080
#if defined(WOLFSSL_DTLS)
22081
    int    used;
22082
#endif
22083
22084
#ifdef ATOMIC_USER
22085
    if (ssl->ctx->DecryptVerifyCb)
22086
        atomicUser = 1;
22087
#endif
22088
22089
0
    if (ssl->error != 0 &&
22090
0
        ssl->error != WC_NO_ERR_TRACE(WANT_READ) &&
22091
0
        ssl->error != WC_NO_ERR_TRACE(WANT_WRITE)
22092
    #if defined(HAVE_SECURE_RENEGOTIATION) || defined(WOLFSSL_DTLS13)
22093
        && ssl->error != WC_NO_ERR_TRACE(APP_DATA_READY)
22094
    #endif
22095
    #ifdef WOLFSSL_ASYNC_CRYPT
22096
        && ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E)
22097
    #endif
22098
    #ifdef WOLFSSL_NONBLOCK_OCSP
22099
        && ssl->error != WC_NO_ERR_TRACE(OCSP_WANT_READ)
22100
    #endif
22101
0
        && (allowSocketErr != 1 ||
22102
0
            ssl->error != WC_NO_ERR_TRACE(SOCKET_ERROR_E))
22103
0
    ) {
22104
0
        WOLFSSL_MSG("ProcessReply retry in error state, not allowed");
22105
0
        return ssl->error;
22106
0
    }
22107
22108
    /* If checking alert on error (allowSocketErr == 1) do not try and
22109
     * process alerts for async or ocsp non blocking */
22110
#if defined(WOLFSSL_CHECK_ALERT_ON_ERR) && \
22111
    (defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP))
22112
    if (allowSocketErr == 1 && \
22113
        (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E) ||
22114
         ssl->error == WC_NO_ERR_TRACE(OCSP_WANT_READ))) {
22115
        return ssl->error;
22116
    }
22117
#endif
22118
22119
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_ASYNC_CRYPT)
22120
    /* process any pending DTLS messages - this flow can happen with async */
22121
    if (ssl->dtls_rx_msg_list != NULL) {
22122
        word32 pendingMsg = ssl->dtls_rx_msg_list_sz;
22123
        if(IsAtLeastTLSv1_3(ssl->version)) {
22124
#ifdef WOLFSSL_DTLS13
22125
            ret = Dtls13ProcessBufferedMessages(ssl);
22126
#else
22127
            ret = NOT_COMPILED_IN;
22128
#endif /* WOLFSSL_DTLS13 */
22129
        }
22130
        else {
22131
            ret = DtlsMsgDrain(ssl);
22132
        }
22133
        if (ret != 0) {
22134
            WOLFSSL_ERROR(ret);
22135
            return ret;
22136
        }
22137
        /* we processed some messages, return so connect/accept can make
22138
           progress */
22139
        if (ssl->dtls_rx_msg_list_sz != pendingMsg)
22140
            return ret;
22141
    }
22142
#endif
22143
22144
0
    ret = RetrySendAlert(ssl);
22145
0
    if (ret != 0) {
22146
0
        WOLFSSL_MSG_EX("RetrySendAlert failed, giving up. err = %d", ret);
22147
0
        return ret;
22148
0
    }
22149
22150
0
    for (;;) {
22151
0
        switch (ssl->options.processReply) {
22152
22153
        /* in the WOLFSSL_SERVER case, get the first byte for detecting
22154
         * old client hello */
22155
0
        case doProcessInit:
22156
22157
0
            readSz = RECORD_HEADER_SZ;
22158
22159
        #ifdef WOLFSSL_DTLS
22160
            if (ssl->options.dtls) {
22161
                readSz = DTLS_RECORD_HEADER_SZ;
22162
#ifdef WOLFSSL_DTLS13
22163
                if (ssl->options.tls1_3) {
22164
                    /* dtls1.3 unified header can be as little as 2 bytes */
22165
                    readSz = DTLS_UNIFIED_HEADER_MIN_SZ;
22166
                }
22167
#endif /* WOLFSSL_DTLS13 */
22168
            }
22169
        #endif
22170
22171
            /* get header or return error */
22172
0
            if (!ssl->options.dtls) {
22173
0
                if ((ret = GetInputData(ssl, (word32)readSz)) < 0)
22174
0
                    return ret;
22175
0
            } else {
22176
            #ifdef WOLFSSL_DTLS
22177
                /* read ahead may already have header */
22178
                used = ssl->buffers.inputBuffer.length -
22179
                       ssl->buffers.inputBuffer.idx;
22180
                if (used < readSz) {
22181
                    if (used > 0 && !RecordsCanSpanReads(ssl)) {
22182
                        WOLFSSL_MSG("DTLS: Partial record in buffer, dropping");
22183
                        DropAndRestartProcessReply(ssl);
22184
                        continue;
22185
                    }
22186
                    if ((ret = GetInputData(ssl, (word32)readSz)) < 0)
22187
                        return ret;
22188
                }
22189
            #endif
22190
0
            }
22191
22192
#ifdef OLD_HELLO_ALLOWED
22193
22194
            /* see if sending SSLv2 client hello */
22195
            if ( ssl->options.side == WOLFSSL_SERVER_END &&
22196
                 ssl->options.clientState == NULL_STATE &&
22197
                 ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx]
22198
                         != handshake &&
22199
                 /* change_cipher_spec here is an error but we want to handle
22200
                  * it correctly later */
22201
                 ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx]
22202
                         != change_cipher_spec) {
22203
                byte b0, b1;
22204
22205
                ssl->options.processReply = runProcessOldClientHello;
22206
22207
                /* sanity checks before getting size at front */
22208
                if (ssl->buffers.inputBuffer.buffer[
22209
                          ssl->buffers.inputBuffer.idx + OPAQUE16_LEN] != OLD_HELLO_ID) {
22210
                    WOLFSSL_MSG("Not a valid old client hello");
22211
                    WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
22212
                    return PARSE_ERROR;
22213
                }
22214
22215
                if (ssl->buffers.inputBuffer.buffer[
22216
                          ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != SSLv3_MAJOR &&
22217
                    ssl->buffers.inputBuffer.buffer[
22218
                          ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != DTLS_MAJOR) {
22219
                    WOLFSSL_MSG("Not a valid version in old client hello");
22220
                    WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
22221
                    return PARSE_ERROR;
22222
                }
22223
22224
                /* how many bytes need ProcessOldClientHello */
22225
                b0 =
22226
                ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
22227
                b1 =
22228
                ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
22229
                ssl->curSize = (word16)(((b0 & 0x7f) << 8) | b1);
22230
            }
22231
            else {
22232
                ssl->options.processReply = getRecordLayerHeader;
22233
                continue;
22234
            }
22235
            FALL_THROUGH;
22236
22237
        /* in the WOLFSSL_SERVER case, run the old client hello */
22238
        case runProcessOldClientHello:
22239
22240
            /* get sz bytes or return error */
22241
            if (!ssl->options.dtls) {
22242
                if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
22243
                    return ret;
22244
            } else {
22245
            #ifdef WOLFSSL_DTLS
22246
                /* read ahead may already have */
22247
                used = ssl->buffers.inputBuffer.length -
22248
                       ssl->buffers.inputBuffer.idx;
22249
                if (used < ssl->curSize)
22250
                    if ((ret = GetInputData(ssl, ssl->curSize - used)) < 0)
22251
                        return ret;
22252
            #endif  /* WOLFSSL_DTLS */
22253
            }
22254
22255
            ret = ProcessOldClientHello(ssl, ssl->buffers.inputBuffer.buffer,
22256
                                        &ssl->buffers.inputBuffer.idx,
22257
                                        ssl->buffers.inputBuffer.length -
22258
                                        ssl->buffers.inputBuffer.idx,
22259
                                        ssl->curSize);
22260
            if (ret < 0)
22261
                return ret;
22262
22263
            else if (ssl->buffers.inputBuffer.idx ==
22264
                     ssl->buffers.inputBuffer.length) {
22265
                ssl->options.processReply = doProcessInit;
22266
                return 0;
22267
            }
22268
22269
#endif  /* OLD_HELLO_ALLOWED */
22270
0
            FALL_THROUGH;
22271
22272
        /* get the record layer header */
22273
0
        case getRecordLayerHeader:
22274
22275
            /* DTLSv1.3 record numbers in the header are encrypted, and AAD
22276
             * uses the unencrypted form. Because of this we need to modify the
22277
             * header, decrypting the numbers inside
22278
             * DtlsParseUnifiedRecordLayer(). This violates the const attribute
22279
             * of the buffer parameter of GetRecordHeader() used here. */
22280
0
            ret = GetRecordHeader(ssl, &ssl->buffers.inputBuffer.idx,
22281
0
                                       &ssl->curRL, &ssl->curSize);
22282
22283
#ifdef WOLFSSL_DTLS
22284
#ifdef WOLFSSL_DTLS_CID
22285
            if (ssl->options.dtls)
22286
                dtlsProcessPendingPeer(ssl, 0);
22287
#endif
22288
            if (ssl->options.dtls && DtlsShouldDrop(ssl, ret)) {
22289
                DropAndRestartProcessReply(ssl);
22290
#ifdef WOLFSSL_DTLS13
22291
                    /* return to send ACKS and shortcut rtx timer */
22292
                    if (IsAtLeastTLSv1_3(ssl->version)
22293
                        && ssl->dtls13Rtx.sendAcks)
22294
                        return 0;
22295
#endif /* WOLFSSL_DTLS13 */
22296
22297
                    continue;
22298
            }
22299
#endif
22300
0
            if (ret != 0) {
22301
0
                switch (ret) {
22302
0
                case WC_NO_ERR_TRACE(VERSION_ERROR):
22303
                    /* send alert per RFC5246 Appendix E. Backward
22304
                     * Compatibility */
22305
0
                    if (ssl->options.side == WOLFSSL_CLIENT_END)
22306
0
                        SendAlert(ssl, alert_fatal,
22307
0
                            wolfssl_alert_protocol_version);
22308
0
                    break;
22309
#ifdef HAVE_MAX_FRAGMENT
22310
                case WC_NO_ERR_TRACE(LENGTH_ERROR):
22311
                    SendAlert(ssl, alert_fatal, record_overflow);
22312
                    break;
22313
#endif /* HAVE_MAX_FRAGMENT */
22314
0
default:
22315
0
                    break;
22316
0
                }
22317
0
                return ret;
22318
0
            }
22319
22320
0
#ifdef WOLFSSL_TLS13
22321
0
            if (IsAtLeastTLSv1_3(ssl->version) && IsEncryptionOn(ssl, 0) &&
22322
0
                                        ssl->curRL.type != application_data &&
22323
0
                                        ssl->curRL.type != change_cipher_spec) {
22324
0
                SendAlert(ssl, alert_fatal, unexpected_message);
22325
0
                WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
22326
0
                return PARSE_ERROR;
22327
0
            }
22328
0
#endif
22329
22330
0
            ssl->options.processReply = getData;
22331
0
            FALL_THROUGH;
22332
22333
        /* retrieve record layer data */
22334
0
        case getData:
22335
22336
            /* get sz bytes or return error */
22337
0
            if (!ssl->options.dtls) {
22338
0
                if ((ret = GetInputData(ssl, ssl->curSize)) < 0) {
22339
#ifdef WOLFSSL_EXTRA_ALERTS
22340
                    if (ret != WC_NO_ERR_TRACE(WANT_READ))
22341
                        SendAlert(ssl, alert_fatal, bad_record_mac);
22342
#endif
22343
0
                    return ret;
22344
0
                }
22345
0
            }
22346
0
            else {
22347
#ifdef WOLFSSL_DTLS
22348
                /* read ahead may already have */
22349
                used = ssl->buffers.inputBuffer.length -
22350
                       ssl->buffers.inputBuffer.idx;
22351
                if (used < ssl->curSize) {
22352
                    if (!RecordsCanSpanReads(ssl)) {
22353
                        WOLFSSL_MSG("Partial record received, dropping");
22354
                        DropAndRestartProcessReply(ssl);
22355
                        continue;
22356
                    }
22357
                    if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
22358
                        return ret;
22359
                }
22360
#endif
22361
0
            }
22362
22363
0
            if (IsEncryptionOn(ssl, 0)) {
22364
0
#if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
22365
0
                int tooLong = 0;
22366
0
#endif
22367
22368
0
#ifdef WOLFSSL_TLS13
22369
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
22370
0
                    tooLong  = ssl->curSize > MAX_TLS13_ENC_SZ;
22371
0
                    tooLong |= ssl->curSize - ssl->specs.aead_mac_size >
22372
0
                                                             MAX_TLS13_PLAIN_SZ;
22373
0
                }
22374
0
#endif
22375
#ifdef WOLFSSL_EXTRA_ALERTS
22376
                if (!IsAtLeastTLSv1_3(ssl->version))
22377
                    tooLong = ssl->curSize > MAX_TLS_CIPHER_SZ;
22378
#endif
22379
0
#if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
22380
0
                if (tooLong) {
22381
0
                    WOLFSSL_MSG("Encrypted data too long");
22382
0
                    SendAlert(ssl, alert_fatal, record_overflow);
22383
0
                    return BUFFER_ERROR;
22384
0
                }
22385
0
#endif
22386
0
            }
22387
0
            ssl->keys.padSz = 0;
22388
22389
0
            ssl->options.processReply = verifyEncryptedMessage;
22390
0
            FALL_THROUGH;
22391
22392
        /* verify digest of encrypted message */
22393
0
        case verifyEncryptedMessage:
22394
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
22395
0
            if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
22396
0
                                   !atomicUser && ssl->options.startedETMRead) {
22397
0
                ret = VerifyMacEnc(ssl, ssl->buffers.inputBuffer.buffer +
22398
0
                                   ssl->buffers.inputBuffer.idx,
22399
0
                                   ssl->curSize, ssl->curRL.type);
22400
            #ifdef WOLFSSL_ASYNC_CRYPT
22401
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
22402
                    return ret;
22403
            #endif
22404
0
                if (ret < 0) {
22405
0
                    WOLFSSL_MSG("VerifyMacEnc failed");
22406
                #ifdef WOLFSSL_DTLS
22407
                    /* If in DTLS mode, if the decrypt fails for any
22408
                     * reason, pretend the datagram never happened. */
22409
                    if (ssl->options.dtls) {
22410
                        DropAndRestartProcessReply(ssl);
22411
                        return HandleDTLSDecryptFailed(ssl);
22412
                    }
22413
                #endif /* WOLFSSL_DTLS */
22414
                #ifdef WOLFSSL_EXTRA_ALERTS
22415
                    if (!ssl->options.dtls)
22416
                        SendAlert(ssl, alert_fatal, bad_record_mac);
22417
                #endif
22418
0
                    WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
22419
0
                    return DECRYPT_ERROR;
22420
0
                }
22421
0
                ssl->keys.encryptSz    = ssl->curSize;
22422
0
            }
22423
0
#endif
22424
0
            ssl->options.processReply = decryptMessage;
22425
0
            FALL_THROUGH;
22426
22427
        /* decrypt message */
22428
0
        case decryptMessage:
22429
22430
0
            if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
22431
0
                                        (!IsAtLeastTLSv1_3(ssl->version) ||
22432
0
                                         ssl->curRL.type != change_cipher_spec))
22433
0
            {
22434
0
                ret = DoDecrypt(ssl);
22435
            #ifdef WOLFSSL_ASYNC_CRYPT
22436
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
22437
                    return ret;
22438
            #endif
22439
22440
0
                if (ret >= 0) {
22441
0
            #ifndef WOLFSSL_NO_TLS12
22442
                    /* handle success */
22443
0
                #ifndef WOLFSSL_AEAD_ONLY
22444
0
                    if (ssl->options.tls1_1 &&
22445
0
                            ssl->specs.cipher_type == block) {
22446
0
                        ssl->buffers.inputBuffer.idx += ssl->specs.block_size;
22447
0
                        ssl->curSize -= ssl->specs.block_size;
22448
0
                    }
22449
0
                #endif
22450
                    /* go past TLSv1.1 IV */
22451
0
                    if (CipherHasExpIV(ssl)) {
22452
0
                        ssl->buffers.inputBuffer.idx += AESGCM_EXP_IV_SZ;
22453
0
                        ssl->curSize -= AESGCM_EXP_IV_SZ;
22454
0
                    }
22455
0
            #endif
22456
0
                }
22457
0
                else {
22458
0
                    WOLFSSL_MSG("Decrypt failed");
22459
                #ifdef WOLFSSL_DTLS
22460
                    /* If in DTLS mode, if the decrypt fails for any
22461
                     * reason, pretend the datagram never happened. */
22462
                    if (ssl->options.dtls) {
22463
                        DropAndRestartProcessReply(ssl);
22464
                        return HandleDTLSDecryptFailed(ssl);
22465
                    }
22466
                #endif /* WOLFSSL_DTLS */
22467
                #ifdef WOLFSSL_EARLY_DATA
22468
                    if (ssl->options.tls1_3) {
22469
                         if (ssl->options.side == WOLFSSL_SERVER_END &&
22470
                                 ssl->earlyData != no_early_data &&
22471
                                 ssl->options.clientState <
22472
                                                     CLIENT_FINISHED_COMPLETE) {
22473
                            ssl->earlyDataSz += ssl->curSize;
22474
                            if (ssl->earlyDataSz <=
22475
                                                  ssl->options.maxEarlyDataSz) {
22476
                                WOLFSSL_MSG("Ignoring EarlyData!");
22477
                                if (ssl->keys.peer_sequence_number_lo-- == 0)
22478
                                    ssl->keys.peer_sequence_number_hi--;
22479
                                ssl->options.processReply = doProcessInit;
22480
                                ssl->buffers.inputBuffer.idx += ssl->curSize;
22481
                                if (ssl->buffers.inputBuffer.idx >
22482
                                    ssl->buffers.inputBuffer.length) {
22483
                                    WOLFSSL_ERROR(BUFFER_E);
22484
                                    return BUFFER_E;
22485
                                }
22486
22487
                                return 0;
22488
                            }
22489
                            WOLFSSL_MSG("Too much EarlyData!");
22490
                            SendAlert(ssl, alert_fatal, unexpected_message);
22491
                            WOLFSSL_ERROR(TOO_MUCH_EARLY_DATA);
22492
                            return TOO_MUCH_EARLY_DATA;
22493
                        }
22494
                    }
22495
                #endif
22496
0
                    SendAlert(ssl, alert_fatal, bad_record_mac);
22497
                    /* Push error once we know that we will error out here */
22498
0
                    WOLFSSL_ERROR(ret);
22499
0
                    return ret;
22500
0
                }
22501
0
            }
22502
22503
0
            ssl->options.processReply = verifyMessage;
22504
0
            FALL_THROUGH;
22505
22506
        /* verify digest of message */
22507
0
        case verifyMessage:
22508
22509
0
            if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
22510
0
                                        (!IsAtLeastTLSv1_3(ssl->version) ||
22511
0
                                         ssl->curRL.type != change_cipher_spec))
22512
0
            {
22513
0
                if (!atomicUser
22514
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
22515
0
                                && !ssl->options.startedETMRead
22516
0
#endif
22517
0
                    ) {
22518
0
                    ret = VerifyMac(ssl, ssl->buffers.inputBuffer.buffer +
22519
0
                                    ssl->buffers.inputBuffer.idx,
22520
0
                                    ssl->curSize, ssl->curRL.type,
22521
0
                                    &ssl->keys.padSz);
22522
                #ifdef WOLFSSL_ASYNC_CRYPT
22523
                    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
22524
                        return ret;
22525
                #endif
22526
0
                    if (ret < 0) {
22527
                    #ifdef WOLFSSL_DTLS
22528
                        /* If in DTLS mode, if the decrypt fails for any
22529
                         * reason, pretend the datagram never happened. */
22530
                        if (ssl->options.dtls) {
22531
                            DropAndRestartProcessReply(ssl);
22532
                            return HandleDTLSDecryptFailed(ssl);
22533
                        }
22534
                    #endif /* WOLFSSL_DTLS */
22535
                    #if defined(WOLFSSL_EXTRA_ALERTS) && !defined(WOLFSSL_NO_ETM_ALERT)
22536
                        if (!ssl->options.dtls)
22537
                            SendAlert(ssl, alert_fatal, bad_record_mac);
22538
                    #endif
22539
0
                        WOLFSSL_MSG("VerifyMac failed");
22540
0
                        WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
22541
0
                        return DECRYPT_ERROR;
22542
0
                    }
22543
0
                }
22544
22545
0
                ssl->keys.encryptSz    = ssl->curSize;
22546
0
                ssl->keys.decryptedCur = 1;
22547
0
            }
22548
22549
0
            if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 1) {
22550
0
#if defined(WOLFSSL_TLS13) || \
22551
0
    (defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID))
22552
0
                int removePadding = 0;
22553
0
                if (ssl->options.tls1_3)
22554
0
                    removePadding = 1;
22555
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
22556
                if (!ssl->options.tls1_3 && ssl->options.dtls &&
22557
                        ssl->curRL.type == dtls12_cid)
22558
                    removePadding = 1;
22559
#endif
22560
0
                if (removePadding) {
22561
0
                    ret = removeMsgInnerPadding(ssl);
22562
0
                    if (ret != 0)
22563
0
                        return ret;
22564
0
                }
22565
0
                else
22566
0
#endif
22567
0
                {
22568
                    /* With atomicUser the callback should have already included
22569
                     * the mac in the padding size. The ETM callback doesn't do
22570
                     * this for some reason. */
22571
0
                    if (ssl->specs.cipher_type != aead
22572
#ifdef ATOMIC_USER
22573
                             && (!atomicUser
22574
#ifdef HAVE_ENCRYPT_THEN_MAC
22575
                                 || ssl->options.startedETMRead
22576
#endif /* HAVE_ENCRYPT_THEN_MAC */
22577
                                )
22578
#endif /* !ATOMIC_USER */
22579
0
                       )
22580
0
                    {
22581
                        /* consider MAC as padding */
22582
0
                        ssl->keys.padSz += MacSize(ssl);
22583
0
                    }
22584
0
                }
22585
22586
0
            }
22587
22588
            /* in case > 1 msg per record */
22589
0
            ssl->curStartIdx = ssl->buffers.inputBuffer.idx;
22590
22591
0
            ssl->options.processReply = runProcessingOneRecord;
22592
0
            FALL_THROUGH;
22593
22594
        /* the record layer is here */
22595
0
        case runProcessingOneRecord:
22596
#ifdef WOLFSSL_DTLS
22597
            if (ssl->options.dtls) {
22598
#ifdef WOLFSSL_DTLS13
22599
                if (IsAtLeastTLSv1_3(ssl->version)) {
22600
                    if (!Dtls13CheckWindow(ssl)) {
22601
                        /* drop packet */
22602
                        WOLFSSL_MSG("Dropping DTLS record outside receiving "
22603
                                    "window");
22604
                        ssl->options.processReply = doProcessInit;
22605
                        ssl->buffers.inputBuffer.idx += ssl->curSize;
22606
                        if (ssl->buffers.inputBuffer.idx >
22607
                                ssl->buffers.inputBuffer.length)
22608
                            return BUFFER_E;
22609
22610
                        continue;
22611
                    }
22612
22613
                    /* Only update the window once we enter stateful parsing */
22614
                    if (ssl->options.dtlsStateful) {
22615
                        ret = Dtls13UpdateWindowRecordRecvd(ssl);
22616
                        if (ret != 0) {
22617
                            WOLFSSL_ERROR(ret);
22618
                            return ret;
22619
                        }
22620
                    }
22621
                }
22622
                else
22623
#endif /* WOLFSSL_DTLS13 */
22624
                if (IsDtlsNotSctpMode(ssl)) {
22625
                    DtlsUpdateWindow(ssl);
22626
                }
22627
#ifdef WOLFSSL_DTLS_CID
22628
                /* Update the peer if we were able to de-protect the message */
22629
                if (IsEncryptionOn(ssl, 0))
22630
                    dtlsProcessPendingPeer(ssl, 1);
22631
#endif
22632
            }
22633
#endif /* WOLFSSL_DTLS */
22634
0
            ssl->options.processReply = runProcessingOneMessage;
22635
0
            FALL_THROUGH;
22636
22637
0
        case runProcessingOneMessage:
22638
            /* can't process a message if we have no data.  */
22639
0
            if (ssl->buffers.inputBuffer.idx
22640
0
                    >= ssl->buffers.inputBuffer.length) {
22641
0
                return BUFFER_ERROR;
22642
0
            }
22643
0
       #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
22644
0
            if (IsEncryptionOn(ssl, 0) && ssl->options.startedETMRead) {
22645
0
                if ((ssl->curSize - ssl->keys.padSz > MAX_PLAINTEXT_SZ)
22646
#ifdef WOLFSSL_ASYNC_CRYPT
22647
                        && ssl->buffers.inputBuffer.length !=
22648
                                ssl->buffers.inputBuffer.idx
22649
#endif
22650
0
                                ) {
22651
0
                    WOLFSSL_MSG("Plaintext too long - Encrypt-Then-MAC");
22652
            #if defined(WOLFSSL_EXTRA_ALERTS) && !defined(WOLFSSL_NO_ETM_ALERT)
22653
                    SendAlert(ssl, alert_fatal, record_overflow);
22654
            #endif
22655
0
                    WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
22656
0
                    return BUFFER_ERROR;
22657
0
                }
22658
0
            }
22659
0
            else
22660
0
       #endif
22661
            /* TLS13 plaintext limit is checked earlier before decryption */
22662
0
            if (!IsAtLeastTLSv1_3(ssl->version)
22663
0
                    && ssl->curSize - ssl->keys.padSz > MAX_PLAINTEXT_SZ
22664
#ifdef WOLFSSL_ASYNC_CRYPT
22665
                    && ssl->buffers.inputBuffer.length !=
22666
                            ssl->buffers.inputBuffer.idx
22667
#endif
22668
0
                                ) {
22669
0
                WOLFSSL_MSG("Plaintext too long");
22670
0
#if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
22671
0
                SendAlert(ssl, alert_fatal, record_overflow);
22672
0
#endif
22673
0
                WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
22674
0
                return BUFFER_ERROR;
22675
0
            }
22676
22677
0
            WOLFSSL_MSG("received record layer msg");
22678
22679
0
            switch (ssl->curRL.type) {
22680
0
                case handshake :
22681
0
                    WOLFSSL_MSG("got HANDSHAKE");
22682
                    /* debugging in DoHandShakeMsg */
22683
0
                    if (ssl->options.dtls) {
22684
#ifdef WOLFSSL_DTLS
22685
                        if (!IsAtLeastTLSv1_3(ssl->version)) {
22686
                            ret = DoDtlsHandShakeMsg(ssl,
22687
                                ssl->buffers.inputBuffer.buffer,
22688
                                &ssl->buffers.inputBuffer.idx,
22689
                                ssl->buffers.inputBuffer.length);
22690
                            if (ret == 0 ||
22691
                                ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
22692
                                /* Reset timeout as we have received a valid
22693
                                 * DTLS handshake message */
22694
                                ssl->dtls_timeout = ssl->dtls_timeout_init;
22695
                            }
22696
                            else {
22697
                                if (SendFatalAlertOnly(ssl, ret)
22698
                                        == WC_NO_ERR_TRACE(SOCKET_ERROR_E)) {
22699
                                    ret = SOCKET_ERROR_E;
22700
                                }
22701
                            }
22702
                        }
22703
#endif
22704
#ifdef WOLFSSL_DTLS13
22705
                        if (IsAtLeastTLSv1_3(ssl->version)) {
22706
                            ret = Dtls13HandshakeRecv(ssl,
22707
                                ssl->buffers.inputBuffer.buffer,
22708
                                &ssl->buffers.inputBuffer.idx,
22709
                                ssl->buffers.inputBuffer.length);
22710
#ifdef WOLFSSL_EARLY_DATA
22711
                            if (ret == 0 &&
22712
                                ssl->options.side == WOLFSSL_SERVER_END &&
22713
                                ssl->earlyData > early_data_ext &&
22714
                                ssl->options.handShakeState == HANDSHAKE_DONE) {
22715
22716
                                /* return so wolfSSL_read_early_data can return
22717
                                   exit */
22718
                                ssl->earlyData = no_early_data;
22719
                                ssl->options.processReply = doProcessInit;
22720
22721
                                return ZERO_RETURN;
22722
                            }
22723
#endif /* WOLFSSL_EARLY_DATA */
22724
22725
                        }
22726
#endif /* WOLFSSL_DTLS13 */
22727
0
                    }
22728
0
                    else if (!IsAtLeastTLSv1_3(ssl->version)
22729
0
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
22730
0
                            || !TLSv1_3_Capable(ssl)
22731
0
#endif
22732
0
                            ) {
22733
0
#ifndef WOLFSSL_NO_TLS12
22734
0
                        ret = DoHandShakeMsg(ssl,
22735
0
                                            ssl->buffers.inputBuffer.buffer,
22736
0
                                            &ssl->buffers.inputBuffer.idx,
22737
0
                                            ssl->buffers.inputBuffer.length);
22738
0
                        if (ret != 0) {
22739
0
                            if (SendFatalAlertOnly(ssl, ret) ==
22740
0
                                WC_NO_ERR_TRACE(SOCKET_ERROR_E))
22741
0
                                ret = SOCKET_ERROR_E;
22742
0
                        }
22743
#else
22744
                        ret = BUFFER_ERROR;
22745
#endif
22746
0
                    }
22747
0
                    else {
22748
0
#ifdef WOLFSSL_TLS13
22749
0
                        ssl->msgsReceived.got_change_cipher = 0;
22750
0
                        ret = DoTls13HandShakeMsg(ssl,
22751
0
                                            ssl->buffers.inputBuffer.buffer,
22752
0
                                            &ssl->buffers.inputBuffer.idx,
22753
0
                                            ssl->buffers.inputBuffer.length);
22754
    #ifdef WOLFSSL_EARLY_DATA
22755
                        if (ret != 0)
22756
                            return ret;
22757
                        if (ssl->options.side == WOLFSSL_SERVER_END &&
22758
                                ssl->earlyData > early_data_ext &&
22759
                                ssl->options.handShakeState == HANDSHAKE_DONE) {
22760
                            ssl->earlyData = no_early_data;
22761
                            ssl->options.processReply = doProcessInit;
22762
                            return ZERO_RETURN;
22763
                        }
22764
    #endif
22765
#else
22766
                        ret = BUFFER_ERROR;
22767
#endif
22768
0
                    }
22769
0
                    if (ret != 0
22770
                            /* DoDtlsHandShakeMsg can return a WANT_WRITE when
22771
                             * calling DtlsMsgPoolSend. This msg is done
22772
                             * processing so let's move on. */
22773
0
                        && (!ssl->options.dtls
22774
0
                            || ret != WC_NO_ERR_TRACE(WANT_WRITE))
22775
#ifdef WOLFSSL_ASYNC_CRYPT
22776
                    /* In async case, on pending, move onto next message.
22777
                     * Current message should have been DtlsMsgStore'ed and
22778
                     * should be processed with DtlsMsgDrain */
22779
                            && (!ssl->options.dtls
22780
                                || ret != WC_NO_ERR_TRACE(WC_PENDING_E))
22781
#endif
22782
0
                    ) {
22783
0
                        WOLFSSL_ERROR(ret);
22784
0
                        return ret;
22785
0
                    }
22786
0
                    break;
22787
22788
0
                case change_cipher_spec:
22789
0
                    WOLFSSL_MSG("got CHANGE CIPHER SPEC");
22790
                    #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
22791
                        if (ssl->hsInfoOn)
22792
                            AddPacketName(ssl, "ChangeCipher");
22793
                        /* add record header back on info */
22794
                        if (ssl->toInfoOn) {
22795
                            ret = AddPacketInfo(ssl, "ChangeCipher",
22796
                                change_cipher_spec,
22797
                                ssl->buffers.inputBuffer.buffer +
22798
                                ssl->buffers.inputBuffer.idx,
22799
                                1, READ_PROTO, RECORD_HEADER_SZ, ssl->heap);
22800
                            if (ret != 0)
22801
                                return ret;
22802
                            #ifdef WOLFSSL_CALLBACKS
22803
                            AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
22804
                            #endif
22805
                        }
22806
                    #endif
22807
22808
0
#ifdef WOLFSSL_TLS13
22809
0
                    if (IsAtLeastTLSv1_3(ssl->version)) {
22810
0
                        word32 i = ssl->buffers.inputBuffer.idx;
22811
0
                        if (ssl->options.handShakeState == HANDSHAKE_DONE) {
22812
0
                            SendAlert(ssl, alert_fatal, unexpected_message);
22813
0
                            WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
22814
0
                            return UNKNOWN_RECORD_TYPE;
22815
0
                        }
22816
0
                        if (ssl->curSize != 1 ||
22817
0
                                      ssl->buffers.inputBuffer.buffer[i] != 1) {
22818
0
                            SendAlert(ssl, alert_fatal, unexpected_message);
22819
0
                            WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
22820
0
                            return UNKNOWN_RECORD_TYPE;
22821
0
                        }
22822
0
                        ssl->buffers.inputBuffer.idx++;
22823
0
                        if (ssl->options.side == WOLFSSL_SERVER_END &&
22824
0
                                !ssl->msgsReceived.got_client_hello) {
22825
                            /* Can't appear before CH */
22826
0
                            SendAlert(ssl, alert_fatal, unexpected_message);
22827
0
                            WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
22828
0
                            return UNKNOWN_RECORD_TYPE;
22829
0
                        }
22830
0
                        if (!ssl->msgsReceived.got_change_cipher) {
22831
0
                            ssl->msgsReceived.got_change_cipher = 1;
22832
0
                        }
22833
0
                        else {
22834
0
                            SendAlert(ssl, alert_fatal, illegal_parameter);
22835
0
                            WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
22836
0
                            return UNKNOWN_RECORD_TYPE;
22837
0
                        }
22838
0
                        if (ssl->keys.decryptedCur == 1) {
22839
0
                            SendAlert(ssl, alert_fatal, unexpected_message);
22840
0
                            WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
22841
0
                            return UNKNOWN_RECORD_TYPE;
22842
0
                        }
22843
0
                        break;
22844
0
                    }
22845
0
#endif
22846
22847
0
#ifndef WOLFSSL_NO_TLS12
22848
0
                    if (ssl->buffers.inputBuffer.idx >=
22849
0
                            ssl->buffers.inputBuffer.length ||
22850
0
                            ssl->curSize < 1) {
22851
0
                        WOLFSSL_MSG("ChangeCipher msg too short");
22852
0
                        WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
22853
0
                        return LENGTH_ERROR;
22854
0
                    }
22855
0
                    if (ssl->buffers.inputBuffer.buffer[
22856
0
                            ssl->buffers.inputBuffer.idx] != 1) {
22857
0
                        WOLFSSL_MSG("ChangeCipher msg wrong value");
22858
0
                        WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
22859
0
                        return LENGTH_ERROR;
22860
0
                    }
22861
22862
0
                    if (IsEncryptionOn(ssl, 0) && ssl->options.handShakeDone) {
22863
0
                        ssl->buffers.inputBuffer.idx += ssl->keys.padSz;
22864
0
                        ssl->curSize -= (word16)ssl->keys.padSz;
22865
0
                    }
22866
22867
0
                    if (ssl->curSize != 1) {
22868
0
                        WOLFSSL_MSG("Malicious or corrupted ChangeCipher msg");
22869
0
                        WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
22870
0
                        return LENGTH_ERROR;
22871
0
                    }
22872
22873
0
                    ssl->buffers.inputBuffer.idx++;
22874
22875
0
                    ret = SanityCheckMsgReceived(ssl, change_cipher_hs);
22876
0
                    if (ret != 0) {
22877
0
                        if (!ssl->options.dtls) {
22878
0
                            return ret;
22879
0
                        }
22880
0
                        else {
22881
                        #ifdef WOLFSSL_DTLS
22882
                        /* Check for duplicate CCS message in DTLS mode.
22883
                         * DTLS allows for duplicate messages, and it should be
22884
                         * skipped. Also skip if out of order. */
22885
                            if (ret != WC_NO_ERR_TRACE(DUPLICATE_MSG_E) &&
22886
                                ret != WC_NO_ERR_TRACE(OUT_OF_ORDER_E))
22887
                                return ret;
22888
                            /* Reset error */
22889
                            ret = 0;
22890
                            break;
22891
                        #endif /* WOLFSSL_DTLS */
22892
0
                        }
22893
0
                    }
22894
22895
0
                    ssl->keys.encryptionOn = 1;
22896
22897
                    /* setup decrypt keys for following messages */
22898
                    /* XXX This might not be what we want to do when
22899
                     * receiving a CCS with multicast. We update the
22900
                     * key when the application updates them. */
22901
0
                    if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
22902
0
                        return ret;
22903
22904
0
            #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
22905
0
                    ssl->options.startedETMRead = ssl->options.encThenMac;
22906
0
            #endif
22907
22908
                    #ifdef WOLFSSL_DTLS
22909
                        if (ssl->options.dtls) {
22910
                            WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
22911
#ifdef WOLFSSL_MULTICAST
22912
                            if (ssl->options.haveMcast) {
22913
                                peerSeq += ssl->keys.curPeerId;
22914
                                peerSeq->highwaterMark = UpdateHighwaterMark(0,
22915
                                        ssl->ctx->mcastFirstSeq,
22916
                                        ssl->ctx->mcastSecondSeq,
22917
                                        ssl->ctx->mcastMaxSeq);
22918
                            }
22919
#endif
22920
                            peerSeq->nextEpoch++;
22921
                            peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
22922
                            peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
22923
                            peerSeq->nextSeq_lo = 0;
22924
                            peerSeq->nextSeq_hi = 0;
22925
                            XMEMCPY(peerSeq->prevWindow, peerSeq->window,
22926
                                    DTLS_SEQ_SZ);
22927
                            XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
22928
                        }
22929
                    #endif
22930
22931
                    #ifdef HAVE_LIBZ
22932
                        if (ssl->options.usingCompression)
22933
                            if ( (ret = InitStreams(ssl)) != 0)
22934
                                return ret;
22935
                    #endif
22936
0
                    ret = BuildFinished(ssl, &ssl->hsHashes->verifyHashes,
22937
0
                                       ssl->options.side == WOLFSSL_CLIENT_END ?
22938
0
                                       kTlsServerStr : kTlsClientStr);
22939
0
                    if (ret != 0)
22940
0
                        return ret;
22941
0
#endif /* !WOLFSSL_NO_TLS12 */
22942
0
                    break;
22943
22944
0
                case application_data:
22945
0
                    WOLFSSL_MSG("got app DATA");
22946
                    #ifdef WOLFSSL_DTLS
22947
                        if (ssl->options.dtls && ssl->options.dtlsHsRetain) {
22948
                        #ifdef HAVE_SECURE_RENEGOTIATION
22949
                            /*
22950
                             * Only free HS resources when not in the process of a
22951
                             * secure renegotiation and we have received APP DATA
22952
                             * from the current epoch
22953
                             */
22954
                            if (!IsSCR(ssl) && (DtlsUseSCRKeys(ssl)
22955
                                    || !DtlsSCRKeysSet(ssl))) {
22956
                                FreeHandshakeResources(ssl);
22957
                                ssl->options.dtlsHsRetain = 0;
22958
                            }
22959
                        #else
22960
                            FreeHandshakeResources(ssl);
22961
                            ssl->options.dtlsHsRetain = 0;
22962
                        #endif
22963
                        }
22964
                    #endif
22965
0
                #ifndef WOLFSSL_RW_THREADED
22966
0
                    #ifdef WOLFSSL_TLS13
22967
0
                        if (ssl->keys.keyUpdateRespond) {
22968
0
                            WOLFSSL_MSG("No KeyUpdate from peer seen");
22969
0
                            WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
22970
0
                            return SANITY_MSG_E;
22971
0
                        }
22972
0
                    #endif
22973
0
                #endif
22974
0
                    if ((ret = DoApplicationData(ssl,
22975
0
                                                ssl->buffers.inputBuffer.buffer,
22976
0
                                                &ssl->buffers.inputBuffer.idx,
22977
0
                                                              NO_SNIFF)) != 0) {
22978
0
                        WOLFSSL_ERROR(ret);
22979
                    #if defined(WOLFSSL_DTLS13) || \
22980
                        defined(HAVE_SECURE_RENEGOTIATION)
22981
                        /* Not really an error. We will return after cleaning
22982
                         * up the processReply state. */
22983
                        if (ret != WC_NO_ERR_TRACE(APP_DATA_READY))
22984
                    #endif
22985
0
                            return ret;
22986
0
                    }
22987
0
                    break;
22988
22989
0
                case alert:
22990
0
                    WOLFSSL_MSG("got ALERT!");
22991
0
                    ret = DoAlert(ssl, ssl->buffers.inputBuffer.buffer,
22992
0
                                  &ssl->buffers.inputBuffer.idx, &type);
22993
0
                    if (ret == alert_fatal)
22994
0
                        return FATAL_ERROR;
22995
0
                    else if (ret < 0)
22996
0
                        return ret;
22997
22998
                    /* catch warnings that are handled as errors */
22999
0
                    if (type == close_notify) {
23000
0
                        ssl->buffers.inputBuffer.idx =
23001
0
                            ssl->buffers.inputBuffer.length;
23002
0
                        ssl->options.processReply = doProcessInit;
23003
0
                        return ssl->error = ZERO_RETURN;
23004
0
                    }
23005
23006
0
                    if (type == decrypt_error)
23007
0
                        return FATAL_ERROR;
23008
23009
                    /* Reset error if we got an alert level in ret */
23010
0
                    if (ret > 0)
23011
0
                        ret = 0;
23012
0
                    break;
23013
23014
#ifdef WOLFSSL_DTLS13
23015
            case ack:
23016
                WOLFSSL_MSG("got ACK");
23017
                if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
23018
                    word32 processedSize = 0;
23019
                    ret = DoDtls13Ack(ssl, ssl->buffers.inputBuffer.buffer +
23020
                                             ssl->buffers.inputBuffer.idx,
23021
                                             ssl->buffers.inputBuffer.length -
23022
                                             ssl->buffers.inputBuffer.idx -
23023
                                             ssl->keys.padSz, &processedSize);
23024
                    ssl->buffers.inputBuffer.idx += processedSize;
23025
                    ssl->buffers.inputBuffer.idx += ssl->keys.padSz;
23026
                    if (ret != 0)
23027
                        return ret;
23028
                    break;
23029
                }
23030
                FALL_THROUGH;
23031
#endif /* WOLFSSL_DTLS13 */
23032
0
                default:
23033
0
                    WOLFSSL_ERROR(UNKNOWN_RECORD_TYPE);
23034
0
                    return UNKNOWN_RECORD_TYPE;
23035
0
            }
23036
23037
0
            ssl->options.processReply = doProcessInit;
23038
23039
            /* input exhausted */
23040
0
            if (ssl->buffers.inputBuffer.idx >= ssl->buffers.inputBuffer.length
23041
#ifdef WOLFSSL_DTLS
23042
                || (ssl->options.dtls &&
23043
                    /* If app data was processed then return now to avoid
23044
                     * dropping any app data. */
23045
                    (ssl->curRL.type == application_data ||
23046
                    /* client: if we processed a finished message, return to
23047
                     *         allow higher layers to establish the crypto
23048
                     *         parameters of the connection. The remaining data
23049
                     *         may be app data that we would drop without the
23050
                     *         crypto setup. */
23051
                    (ssl->options.side == WOLFSSL_CLIENT_END &&
23052
                        ssl->options.serverState == SERVER_FINISHED_COMPLETE &&
23053
                        ssl->options.handShakeState != HANDSHAKE_DONE)))
23054
#endif
23055
0
                ) {
23056
                /* Shrink input buffer when we successfully finish record
23057
                 * processing */
23058
0
                if ((ret == 0) && ssl->buffers.inputBuffer.dynamicFlag)
23059
0
                    ShrinkInputBuffer(ssl, NO_FORCED_FREE);
23060
0
                return ret;
23061
0
            }
23062
            /* more messages per record */
23063
0
            else if ((ssl->buffers.inputBuffer.idx - ssl->curStartIdx)
23064
0
                    < ssl->curSize) {
23065
0
                WOLFSSL_MSG("More messages in record");
23066
23067
0
                ssl->options.processReply = runProcessingOneMessage;
23068
23069
0
                if (IsEncryptionOn(ssl, 0)) {
23070
                    /* With encryption on, we advance the index by the value
23071
                     * of ssl->keys.padSz. Since padding only appears once, we
23072
                     * only can do this at the end of record parsing. We have to
23073
                     * reset the index to the start of the next message here. */
23074
0
                    if (ssl->buffers.inputBuffer.idx >= ssl->keys.padSz) {
23075
0
                        ssl->buffers.inputBuffer.idx -= ssl->keys.padSz;
23076
0
                    }
23077
0
                    else {
23078
0
                        WOLFSSL_MSG("\tBuffer advanced not enough error");
23079
0
                        WOLFSSL_ERROR_VERBOSE(FATAL_ERROR);
23080
0
                        return FATAL_ERROR;
23081
0
                    }
23082
0
                }
23083
0
            }
23084
            /* more records */
23085
0
            else {
23086
0
                WOLFSSL_MSG("More records in input");
23087
0
            }
23088
#ifdef WOLFSSL_ASYNC_CRYPT
23089
            /* We are setup to read next message/record but we had an error
23090
             * (probably WC_PENDING_E) so return that so it can be handled
23091
             * by higher layers. */
23092
            if (ret != 0)
23093
                return ret;
23094
#endif
23095
#if defined(WOLFSSL_DTLS13) || defined(HAVE_SECURE_RENEGOTIATION)
23096
            /* Signal to user that we have application data ready to read */
23097
            if (ret == WC_NO_ERR_TRACE(APP_DATA_READY))
23098
                return ret;
23099
#endif
23100
            /* It is safe to shrink the input buffer here now. local vars will
23101
             * be reset to the new starting value. */
23102
0
            if (ret == 0 && ssl->buffers.inputBuffer.dynamicFlag)
23103
0
                ShrinkInputBuffer(ssl, NO_FORCED_FREE);
23104
0
            continue;
23105
0
        default:
23106
0
            WOLFSSL_MSG("Bad process input state, programming error");
23107
0
            WOLFSSL_ERROR_VERBOSE(INPUT_CASE_ERROR);
23108
0
            return INPUT_CASE_ERROR;
23109
0
        }
23110
0
    }
23111
0
}
23112
23113
int ProcessReply(WOLFSSL* ssl)
23114
144k
{
23115
144k
    return ProcessReplyEx(ssl, 0);
23116
144k
}
23117
23118
int ProcessReplyEx(WOLFSSL* ssl, int allowSocketErr)
23119
{
23120
    int ret;
23121
23122
    ret = DoProcessReplyEx(ssl, allowSocketErr);
23123
23124
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
23125
    if (ssl->options.dtls) {
23126
        /* Don't clear pending peer if we are going to re-enter
23127
         * DoProcessReplyEx */
23128
        if (ret != WC_NO_ERR_TRACE(WANT_READ)
23129
#ifdef WOLFSSL_ASYNC_CRYPT
23130
                && ret != WC_NO_ERR_TRACE(WC_PENDING_E)
23131
#endif
23132
            ) {
23133
            dtlsClearPeer(&ssl->buffers.dtlsCtx.pendingPeer);
23134
            ssl->buffers.dtlsCtx.processingPendingRecord = 0;
23135
        }
23136
    }
23137
#endif
23138
23139
    return ret;
23140
}
23141
23142
#if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS) || \
23143
             (defined(WOLFSSL_TLS13) && defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT))
23144
int SendChangeCipher(WOLFSSL* ssl)
23145
{
23146
    byte              *output;
23147
    int                sendSz = RECORD_HEADER_SZ + ENUM_LEN;
23148
    int                idx    = RECORD_HEADER_SZ;
23149
    int                ret;
23150
23151
    #ifdef OPENSSL_EXTRA
23152
    ssl->cbmode = WOLFSSL_CB_MODE_WRITE;
23153
    if (ssl->options.side == WOLFSSL_SERVER_END){
23154
        ssl->options.serverState = SERVER_CHANGECIPHERSPEC_COMPLETE;
23155
        if (ssl->CBIS != NULL)
23156
            ssl->CBIS(ssl, WOLFSSL_CB_ACCEPT_LOOP, WOLFSSL_SUCCESS);
23157
    }
23158
    else {
23159
        ssl->options.clientState =
23160
            CLIENT_CHANGECIPHERSPEC_COMPLETE;
23161
        if (ssl->CBIS != NULL)
23162
            ssl->CBIS(ssl, WOLFSSL_CB_CONNECT_LOOP, WOLFSSL_SUCCESS);
23163
    }
23164
    #endif
23165
23166
    #ifdef WOLFSSL_DTLS
23167
        if (ssl->options.dtls) {
23168
            sendSz += DTLS_RECORD_EXTRA;
23169
            idx    += DTLS_RECORD_EXTRA;
23170
        }
23171
    #endif
23172
23173
    /* are we in scr */
23174
    if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
23175
        sendSz += MAX_MSG_EXTRA;
23176
    }
23177
23178
    /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
23179
     * is not advanced yet */
23180
    ssl->options.buildingMsg = 1;
23181
23182
    /* check for available size */
23183
    if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
23184
        return ret;
23185
23186
    /* get output buffer */
23187
    output = GetOutputBuffer(ssl);
23188
23189
    AddRecordHeader(output, 1, change_cipher_spec, ssl, CUR_ORDER);
23190
23191
    output[idx] = 1;             /* turn it on */
23192
23193
    if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
23194
        byte input[ENUM_LEN];
23195
        int  inputSz = ENUM_LEN;
23196
23197
        input[0] = 1;  /* turn it on */
23198
    #ifdef WOLFSSL_DTLS
23199
        if (IsDtlsNotSctpMode(ssl) &&
23200
                (ret = DtlsMsgPoolSave(ssl, input, (word32)inputSz, change_cipher_hs)) != 0) {
23201
            return ret;
23202
        }
23203
    #endif
23204
        sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
23205
                              change_cipher_spec, 0, 0, 0, CUR_ORDER);
23206
        if (sendSz < 0) {
23207
            return sendSz;
23208
        }
23209
    }
23210
    #ifdef WOLFSSL_DTLS
23211
    else {
23212
        if (IsDtlsNotSctpMode(ssl)) {
23213
            if ((ret = DtlsMsgPoolSave(ssl, output, (word32)sendSz, change_cipher_hs)) != 0)
23214
                return ret;
23215
            DtlsSEQIncrement(ssl, CUR_ORDER);
23216
        }
23217
    }
23218
    #endif
23219
    #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
23220
        if (ssl->hsInfoOn) AddPacketName(ssl, "ChangeCipher");
23221
        if (ssl->toInfoOn) {
23222
            ret = AddPacketInfo(ssl, "ChangeCipher", change_cipher_spec, output,
23223
                    sendSz, WRITE_PROTO, 0, ssl->heap);
23224
            if (ret != 0)
23225
                return ret;
23226
        }
23227
    #endif
23228
    ssl->buffers.outputBuffer.length += (word32)sendSz;
23229
23230
#ifdef WOLFSSL_TLS13
23231
    if (!ssl->options.tls1_3)
23232
#endif
23233
    {
23234
        /* setup encrypt keys */
23235
        if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
23236
            return ret;
23237
23238
    #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
23239
        ssl->options.startedETMWrite = ssl->options.encThenMac;
23240
    #endif
23241
    }
23242
23243
    ssl->options.buildingMsg = 0;
23244
23245
    if (ssl->options.groupMessages)
23246
        return 0;
23247
    #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_DEBUG_DTLS)
23248
    else if (ssl->options.dtls) {
23249
        /* If using DTLS, force the ChangeCipherSpec message to be in the
23250
         * same datagram as the finished message. */
23251
        return 0;
23252
    }
23253
    #endif
23254
    else
23255
        return SendBuffered(ssl);
23256
}
23257
#endif /* !WOLFSSL_NO_TLS12 || !NO_OLD_TLS ||
23258
        * (WOLFSSL_TLS13 && WOLFSSL_TLS13_MIDDLEBOX_COMPAT) */
23259
23260
23261
#if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
23262
static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
23263
                    int padLen, int content, int verify, int epochOrder)
23264
{
23265
    byte   result[WC_MAX_DIGEST_SIZE];
23266
    word32 digestSz = ssl->specs.hash_size;            /* actual sizes */
23267
    word32 padSz    = ssl->specs.pad_size;
23268
    int    ret      = 0;
23269
23270
    wc_Md5 md5;
23271
    wc_Sha sha;
23272
23273
    /* data */
23274
    byte seq[SEQ_SZ];
23275
    byte conLen[ENUM_LEN + LENGTH_SZ];     /* content & length */
23276
    const byte* macSecret = NULL;
23277
23278
    (void)padLen;
23279
23280
#ifdef HAVE_FUZZER
23281
    if (ssl->fuzzerCb)
23282
        ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
23283
#endif
23284
23285
#ifdef WOLFSSL_DTLS
23286
    if (ssl->options.dtls)
23287
        macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
23288
    else
23289
        macSecret = wolfSSL_GetMacSecret(ssl, verify);
23290
#else
23291
    macSecret = wolfSSL_GetMacSecret(ssl, verify);
23292
#endif
23293
23294
    XMEMSET(seq, 0, SEQ_SZ);
23295
    conLen[0] = (byte)content;
23296
    c16toa((word16)sz, &conLen[ENUM_LEN]);
23297
    WriteSEQ(ssl, epochOrder, seq);
23298
23299
    if (ssl->specs.mac_algorithm == md5_mac) {
23300
        ret =  wc_InitMd5_ex(&md5, ssl->heap, ssl->devId);
23301
        if (ret != 0)
23302
            return ret;
23303
23304
        /* inner */
23305
        ret =  wc_Md5Update(&md5, macSecret, digestSz);
23306
        ret |= wc_Md5Update(&md5, PAD1, padSz);
23307
        ret |= wc_Md5Update(&md5, seq, SEQ_SZ);
23308
        ret |= wc_Md5Update(&md5, conLen, sizeof(conLen));
23309
        /* in buffer */
23310
        ret |= wc_Md5Update(&md5, in, sz);
23311
        if (ret != 0) {
23312
            WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
23313
            return VERIFY_MAC_ERROR;
23314
        }
23315
        ret = wc_Md5Final(&md5, result);
23316
    #ifdef WOLFSSL_ASYNC_CRYPT
23317
        /* TODO: Make non-blocking */
23318
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
23319
            ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
23320
        }
23321
    #endif
23322
        if (ret != 0) {
23323
            WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
23324
            return VERIFY_MAC_ERROR;
23325
        }
23326
23327
        /* outer */
23328
        ret =  wc_Md5Update(&md5, macSecret, digestSz);
23329
        ret |= wc_Md5Update(&md5, PAD2, padSz);
23330
        ret |= wc_Md5Update(&md5, result, digestSz);
23331
        if (ret != 0) {
23332
            WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
23333
            return VERIFY_MAC_ERROR;
23334
        }
23335
        ret =  wc_Md5Final(&md5, digest);
23336
    #ifdef WOLFSSL_ASYNC_CRYPT
23337
        /* TODO: Make non-blocking */
23338
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
23339
            ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
23340
        }
23341
    #endif
23342
        if (ret != 0) {
23343
            WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
23344
            return VERIFY_MAC_ERROR;
23345
        }
23346
23347
        wc_Md5Free(&md5);
23348
    }
23349
    else {
23350
        ret =  wc_InitSha_ex(&sha, ssl->heap, ssl->devId);
23351
        if (ret != 0)
23352
            return ret;
23353
23354
        /* inner */
23355
        ret =  wc_ShaUpdate(&sha, macSecret, digestSz);
23356
        ret |= wc_ShaUpdate(&sha, PAD1, padSz);
23357
        ret |= wc_ShaUpdate(&sha, seq, SEQ_SZ);
23358
        ret |= wc_ShaUpdate(&sha, conLen, sizeof(conLen));
23359
        /* in buffer */
23360
        ret |= wc_ShaUpdate(&sha, in, sz);
23361
        if (ret != 0) {
23362
            WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
23363
            return VERIFY_MAC_ERROR;
23364
        }
23365
        ret = wc_ShaFinal(&sha, result);
23366
    #ifdef WOLFSSL_ASYNC_CRYPT
23367
        /* TODO: Make non-blocking */
23368
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
23369
            ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
23370
        }
23371
    #endif
23372
        if (ret != 0) {
23373
            WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
23374
            return VERIFY_MAC_ERROR;
23375
        }
23376
23377
        /* outer */
23378
        ret =  wc_ShaUpdate(&sha, macSecret, digestSz);
23379
        ret |= wc_ShaUpdate(&sha, PAD2, padSz);
23380
        ret |= wc_ShaUpdate(&sha, result, digestSz);
23381
        if (ret != 0) {
23382
            WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
23383
            return VERIFY_MAC_ERROR;
23384
        }
23385
        ret =  wc_ShaFinal(&sha, digest);
23386
    #ifdef WOLFSSL_ASYNC_CRYPT
23387
        /* TODO: Make non-blocking */
23388
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
23389
            ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
23390
        }
23391
    #endif
23392
        if (ret != 0) {
23393
            WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
23394
            return VERIFY_MAC_ERROR;
23395
        }
23396
23397
        wc_ShaFree(&sha);
23398
    }
23399
    return 0;
23400
}
23401
#endif /* !NO_OLD_TLS && !WOLFSSL_AEAD_ONLY */
23402
23403
#if !defined(NO_MD5) && !defined(NO_OLD_TLS)
23404
static int BuildMD5_CertVerify(const WOLFSSL* ssl, byte* digest)
23405
{
23406
    int ret;
23407
    byte md5_result[WC_MD5_DIGEST_SIZE];
23408
#ifdef WOLFSSL_SMALL_STACK
23409
    wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap,
23410
        DYNAMIC_TYPE_HASHCTX);
23411
#else
23412
    wc_Md5  md5[1];
23413
#endif
23414
23415
    /* make md5 inner */
23416
    ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5); /* Save current position */
23417
    if (ret == 0)
23418
        ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN);
23419
    if (ret == 0)
23420
        ret = wc_Md5Update(md5, PAD1, PAD_MD5);
23421
    if (ret == 0)
23422
        ret = wc_Md5Final(md5, md5_result);
23423
23424
    /* make md5 outer */
23425
    if (ret == 0) {
23426
        ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
23427
        if (ret == 0) {
23428
            ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN);
23429
            if (ret == 0)
23430
                ret = wc_Md5Update(md5, PAD2, PAD_MD5);
23431
            if (ret == 0)
23432
                ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
23433
            if (ret == 0)
23434
                ret = wc_Md5Final(md5, digest);
23435
            wc_Md5Free(md5);
23436
        }
23437
    }
23438
23439
#ifdef WOLFSSL_SMALL_STACK
23440
    XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
23441
#endif
23442
23443
    return ret;
23444
}
23445
#endif /* !NO_MD5 && !NO_OLD_TLS */
23446
23447
#if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
23448
                          defined(WOLFSSL_ALLOW_TLS_SHA1))
23449
static int BuildSHA_CertVerify(const WOLFSSL* ssl, byte* digest)
23450
{
23451
    int ret;
23452
    byte sha_result[WC_SHA_DIGEST_SIZE];
23453
#ifdef WOLFSSL_SMALL_STACK
23454
    wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap,
23455
        DYNAMIC_TYPE_HASHCTX);
23456
#else
23457
    wc_Sha  sha[1];
23458
#endif
23459
23460
    /* make sha inner */
23461
    ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
23462
    if (ret == 0)
23463
        ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret, SECRET_LEN);
23464
    if (ret == 0)
23465
        ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
23466
    if (ret == 0)
23467
        ret = wc_ShaFinal(sha, sha_result);
23468
23469
    /* make sha outer */
23470
    if (ret == 0) {
23471
        ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
23472
        if (ret == 0) {
23473
            ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret, SECRET_LEN);
23474
            if (ret == 0)
23475
                ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
23476
            if (ret == 0)
23477
                ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
23478
            if (ret == 0)
23479
                ret = wc_ShaFinal(sha, digest);
23480
            wc_ShaFree(sha);
23481
        }
23482
    }
23483
23484
#ifdef WOLFSSL_SMALL_STACK
23485
    XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
23486
#endif
23487
23488
    return ret;
23489
}
23490
#endif /* !NO_SHA && (!NO_OLD_TLS || WOLFSSL_ALLOW_TLS_SHA1) */
23491
23492
int BuildCertHashes(const WOLFSSL* ssl, Hashes* hashes)
23493
0
{
23494
0
    int ret = 0;
23495
23496
0
    (void)hashes;
23497
23498
0
    if (ssl->options.tls) {
23499
    #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
23500
        ret = wc_Md5GetHash(&ssl->hsHashes->hashMd5, hashes->md5);
23501
        if (ret != 0)
23502
            return ret;
23503
    #endif
23504
    #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
23505
                              defined(WOLFSSL_ALLOW_TLS_SHA1))
23506
        ret = wc_ShaGetHash(&ssl->hsHashes->hashSha, hashes->sha);
23507
        if (ret != 0)
23508
            return ret;
23509
    #endif
23510
0
        if (IsAtLeastTLSv1_2(ssl)) {
23511
0
            #ifndef NO_SHA256
23512
0
                ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256,
23513
0
                                       hashes->sha256);
23514
0
                if (ret != 0)
23515
0
                    return ret;
23516
0
            #endif
23517
0
            #ifdef WOLFSSL_SHA384
23518
0
                ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384,
23519
0
                                       hashes->sha384);
23520
0
                if (ret != 0)
23521
0
                    return ret;
23522
0
            #endif
23523
0
            #ifdef WOLFSSL_SHA512
23524
0
                ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512,
23525
0
                                       hashes->sha512);
23526
0
                if (ret != 0)
23527
0
                    return ret;
23528
0
            #endif
23529
0
            #ifdef WOLFSSL_SM3
23530
0
                ret = wc_Sm3GetHash(&ssl->hsHashes->hashSm3,
23531
0
                                       hashes->sm3);
23532
0
                if (ret != 0)
23533
0
                    return ret;
23534
0
            #endif
23535
0
        }
23536
0
    }
23537
0
    else {
23538
    #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
23539
        ret = BuildMD5_CertVerify(ssl, hashes->md5);
23540
        if (ret != 0)
23541
            return ret;
23542
    #endif
23543
    #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
23544
                              defined(WOLFSSL_ALLOW_TLS_SHA1))
23545
        ret = BuildSHA_CertVerify(ssl, hashes->sha);
23546
        if (ret != 0)
23547
            return ret;
23548
    #endif
23549
0
    }
23550
23551
0
    return ret;
23552
0
}
23553
23554
#ifndef WOLFSSL_NO_TLS12
23555
void FreeBuildMsgArgs(WOLFSSL* ssl, BuildMsgArgs* args)
23556
812
{
23557
812
    (void)ssl;
23558
812
    if (args
23559
#ifdef WOLFSSL_ASYNC_CRYPT
23560
            && ssl->options.buildArgsSet
23561
#endif
23562
812
        ) {
23563
        /* only free the IV if it was dynamically allocated */
23564
812
        if (args->iv && (args->iv != args->staticIvBuffer)) {
23565
0
            XFREE(args->iv, ssl->heap, DYNAMIC_TYPE_SALT);
23566
0
        }
23567
812
    }
23568
#ifdef WOLFSSL_ASYNC_CRYPT
23569
    ssl->options.buildArgsSet = 0;
23570
#endif
23571
812
}
23572
#endif
23573
23574
/* Build SSL Message, encrypted */
23575
int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input,
23576
             int inSz, int type, int hashOutput, int sizeOnly, int asyncOkay,
23577
             int epochOrder)
23578
{
23579
#ifndef WOLFSSL_NO_TLS12
23580
    int ret;
23581
    BuildMsgArgs* args;
23582
    BuildMsgArgs  lcl_args;
23583
#endif
23584
23585
    WOLFSSL_ENTER("BuildMessage");
23586
23587
    if (ssl == NULL) {
23588
        return BAD_FUNC_ARG;
23589
    }
23590
    /* catch mistaken sizeOnly parameter */
23591
    if (!sizeOnly && (output == NULL || input == NULL) ) {
23592
        return BAD_FUNC_ARG;
23593
    }
23594
    if (sizeOnly && (output || input) ) {
23595
        return BAD_FUNC_ARG;
23596
    }
23597
23598
    (void)epochOrder;
23599
23600
#if defined(WOLFSSL_NO_TLS12) && defined(WOLFSSL_TLS13)
23601
    /* TLS v1.3 only */
23602
    return BuildTls13Message(ssl, output, outSz, input, inSz, type,
23603
                                               hashOutput, sizeOnly, asyncOkay);
23604
#else
23605
    /* TLS v1.2 or v1.3 */
23606
#ifdef WOLFSSL_TLS13
23607
    if (ssl->options.tls1_3) {
23608
        return BuildTls13Message(ssl, output, outSz, input, inSz, type,
23609
                                 hashOutput, sizeOnly, asyncOkay);
23610
    }
23611
#endif
23612
23613
#ifndef WOLFSSL_NO_TLS12
23614
#ifdef WOLFSSL_ASYNC_CRYPT
23615
    ret = WC_NO_PENDING_E;
23616
    if (asyncOkay) {
23617
        if (ssl->async == NULL) {
23618
            return BAD_FUNC_ARG;
23619
        }
23620
        args = &ssl->async->buildArgs;
23621
23622
        ret = wolfSSL_AsyncPop(ssl, &ssl->options.buildMsgState);
23623
        if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
23624
            /* Check for error */
23625
            if (ret < 0)
23626
                goto exit_buildmsg;
23627
        }
23628
    }
23629
    else
23630
#endif
23631
    {
23632
        args = &lcl_args;
23633
    }
23634
23635
    /* Reset state */
23636
#ifdef WOLFSSL_ASYNC_CRYPT
23637
    if (ret == WC_NO_ERR_TRACE(WC_NO_PENDING_E))
23638
#endif
23639
    {
23640
        ret = 0;
23641
#ifdef WOLFSSL_ASYNC_CRYPT
23642
        ssl->options.buildArgsSet = 1;
23643
#endif
23644
        ssl->options.buildMsgState = BUILD_MSG_BEGIN;
23645
        XMEMSET(args, 0, sizeof(BuildMsgArgs));
23646
23647
        args->sz = RECORD_HEADER_SZ + (word32)inSz;
23648
        args->idx  = RECORD_HEADER_SZ;
23649
        args->headerSz = RECORD_HEADER_SZ;
23650
        args->type = (byte)type;
23651
    }
23652
23653
    switch (ssl->options.buildMsgState) {
23654
        case BUILD_MSG_BEGIN:
23655
        {
23656
        #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
23657
            if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
23658
                /* For epochs >1 the current cipher parameters are located in
23659
                 * ssl->secure_renegotiation->tmp_keys. Previous cipher
23660
                 * parameters and for epoch 1 use ssl->keys */
23661
                switch (epochOrder) {
23662
                case PREV_ORDER:
23663
                    if (ssl->encrypt.src != KEYS) {
23664
                        ssl->secure_renegotiation->cache_status =
23665
                                SCR_CACHE_NULL;
23666
                        if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
23667
                            ERROR_OUT(ret, exit_buildmsg);
23668
                    }
23669
                    break;
23670
                case CUR_ORDER:
23671
                    if (ssl->keys.dtls_epoch ==
23672
                            ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
23673
                        if (ssl->encrypt.src != SCR) {
23674
                            ssl->secure_renegotiation->cache_status =
23675
                                    SCR_CACHE_NEEDED;
23676
                            if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
23677
                                    != 0)
23678
                                ERROR_OUT(ret, exit_buildmsg);
23679
                        }
23680
                    }
23681
                    else {
23682
                        if (ssl->encrypt.src != KEYS) {
23683
                            ssl->secure_renegotiation->cache_status =
23684
                                    SCR_CACHE_NULL;
23685
                            if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
23686
                                    != 0)
23687
                                ERROR_OUT(ret, exit_buildmsg);
23688
                        }
23689
                    }
23690
                    break;
23691
                default:
23692
                    WOLFSSL_MSG("BuildMessage only supports PREV_ORDER and "
23693
                                "CUR_ORDER");
23694
                    ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
23695
                }
23696
            }
23697
        #endif
23698
23699
            ssl->options.buildMsgState = BUILD_MSG_SIZE;
23700
        }
23701
        FALL_THROUGH;
23702
        case BUILD_MSG_SIZE:
23703
        {
23704
            args->digestSz = ssl->specs.hash_size;
23705
        #ifdef HAVE_TRUNCATED_HMAC
23706
            if (ssl->truncated_hmac)
23707
                args->digestSz = min(TRUNCATED_HMAC_SZ, args->digestSz);
23708
        #endif
23709
            args->sz += args->digestSz;
23710
23711
        #ifdef WOLFSSL_DTLS
23712
            if (ssl->options.dtls) {
23713
                args->sz       += DTLS_RECORD_EXTRA;
23714
                args->idx      += DTLS_RECORD_EXTRA;
23715
                args->headerSz += DTLS_RECORD_EXTRA;
23716
        #ifdef WOLFSSL_DTLS_CID
23717
                if (ssl->options.dtls) {
23718
                    byte cidSz = 0;
23719
                    if ((cidSz = DtlsGetCidTxSize(ssl)) > 0) {
23720
                        args->sz       += cidSz;
23721
                        args->idx      += cidSz;
23722
                        args->headerSz += cidSz;
23723
                        args->sz++; /* real_type. no padding. */
23724
                    }
23725
                }
23726
        #endif
23727
            }
23728
        #endif
23729
23730
        #ifndef WOLFSSL_AEAD_ONLY
23731
            if (ssl->specs.cipher_type == block) {
23732
                word32 blockSz = ssl->specs.block_size;
23733
23734
                if (blockSz == 0) {
23735
                    WOLFSSL_MSG("Invalid block size with block cipher type");
23736
                    ERROR_OUT(BAD_STATE_E, exit_buildmsg);
23737
                }
23738
23739
                if (ssl->options.tls1_1) {
23740
                    args->ivSz = blockSz;
23741
                    args->sz  += args->ivSz;
23742
23743
                    if (args->ivSz > MAX_IV_SZ)
23744
                        ERROR_OUT(BUFFER_E, exit_buildmsg);
23745
                }
23746
                args->sz += 1;       /* pad byte */
23747
            #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
23748
                if (ssl->options.startedETMWrite) {
23749
                    args->pad = (args->sz - args->headerSz -
23750
                                                      args->digestSz) % blockSz;
23751
                }
23752
                else
23753
            #endif
23754
                {
23755
                    args->pad = (args->sz - args->headerSz) % blockSz;
23756
                }
23757
                if (args->pad != 0)
23758
                    args->pad = blockSz - args->pad;
23759
                args->sz += args->pad;
23760
            }
23761
        #endif /* WOLFSSL_AEAD_ONLY */
23762
23763
        #ifdef HAVE_AEAD
23764
            if (ssl->specs.cipher_type == aead) {
23765
                if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
23766
                    args->ivSz = AESGCM_EXP_IV_SZ;
23767
23768
                args->sz += (args->ivSz + ssl->specs.aead_mac_size - args->digestSz);
23769
            }
23770
        #endif
23771
23772
            /* done with size calculations */
23773
            if (sizeOnly)
23774
                goto exit_buildmsg;
23775
23776
            if (args->sz > (word32)outSz) {
23777
                WOLFSSL_MSG("Oops, want to write past output buffer size");
23778
                ERROR_OUT(BUFFER_E, exit_buildmsg);
23779
            }
23780
23781
            if (args->ivSz > 0) {
23782
                if (args->ivSz > sizeof(args->staticIvBuffer)) {
23783
                    args->iv = (byte*)XMALLOC(args->ivSz, ssl->heap,
23784
                                              DYNAMIC_TYPE_SALT);
23785
                    if (args->iv == NULL) {
23786
                        ERROR_OUT(MEMORY_E, exit_buildmsg);
23787
                    }
23788
                }
23789
                else {
23790
                    args->iv = args->staticIvBuffer;
23791
                }
23792
23793
                ret = wc_RNG_GenerateBlock(ssl->rng, args->iv, args->ivSz);
23794
                if (ret != 0)
23795
                    goto exit_buildmsg;
23796
            }
23797
#if !defined(NO_PUBLIC_GCM_SET_IV) && \
23798
    ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
23799
    (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) && \
23800
    defined(HAVE_AEAD))
23801
            if (ssl->specs.cipher_type == aead) {
23802
                if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
23803
                    XMEMCPY(args->iv, ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
23804
            }
23805
#endif
23806
23807
            args->size = (word16)(args->sz - args->headerSz);    /* include mac and digest */
23808
23809
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
23810
            if (ssl->options.dtls && DtlsGetCidTxSize(ssl) > 0)
23811
                args->type = dtls12_cid;
23812
#endif
23813
            AddRecordHeader(output, args->size, args->type, ssl, epochOrder);
23814
23815
            /* write to output */
23816
            if (args->ivSz > 0) {
23817
                XMEMCPY(output + args->idx, args->iv,
23818
                                        min(args->ivSz, MAX_IV_SZ));
23819
                args->idx += min(args->ivSz, MAX_IV_SZ);
23820
            }
23821
            XMEMCPY(output + args->idx, input, (size_t)(inSz));
23822
            args->idx += (word32)inSz;
23823
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
23824
            if (ssl->options.dtls && DtlsGetCidTxSize(ssl) > 0) {
23825
                output[args->idx++] = (byte)type; /* type goes after input */
23826
                inSz++;
23827
            }
23828
#endif
23829
            /* Make sure we don't access input anymore as inSz may have been
23830
             * incremented */
23831
            input = NULL;
23832
23833
            ssl->options.buildMsgState = BUILD_MSG_HASH;
23834
        }
23835
        FALL_THROUGH;
23836
        case BUILD_MSG_HASH:
23837
        {
23838
            /* done with size calculations */
23839
            if (sizeOnly)
23840
                goto exit_buildmsg;
23841
23842
            if (type == handshake && hashOutput) {
23843
                ret = HashOutput(ssl, output,
23844
                    (int)(args->headerSz + (word32)inSz), (int)args->ivSz);
23845
                if (ret != 0)
23846
                    goto exit_buildmsg;
23847
            }
23848
        #ifndef WOLFSSL_AEAD_ONLY
23849
            if (ssl->specs.cipher_type == block) {
23850
                word32 tmpIdx;
23851
                word32 i;
23852
23853
            #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
23854
                if (ssl->options.startedETMWrite)
23855
                    tmpIdx = args->idx;
23856
                else
23857
            #endif
23858
                    tmpIdx = args->idx + args->digestSz;
23859
23860
                for (i = 0; i <= args->pad; i++)
23861
                    output[tmpIdx++] = (byte)args->pad; /* pad byte gets pad value */
23862
            }
23863
        #endif
23864
23865
            ssl->options.buildMsgState = BUILD_MSG_VERIFY_MAC;
23866
        }
23867
        FALL_THROUGH;
23868
        case BUILD_MSG_VERIFY_MAC:
23869
        {
23870
            /* done with size calculations */
23871
            if (sizeOnly)
23872
                goto exit_buildmsg;
23873
23874
            /* User Record Layer Callback handling */
23875
    #ifdef ATOMIC_USER
23876
        #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
23877
            if (ssl->options.startedETMWrite) {
23878
                if (ssl->ctx->EncryptMacCb) {
23879
                    ret = ssl->ctx->EncryptMacCb(ssl, output + args->idx +
23880
                                                 args->pad + 1, args->type, 0,
23881
                                                 output + args->headerSz,
23882
                                                 output + args->headerSz,
23883
                                                 args->size - args->digestSz,
23884
                                                 ssl->MacEncryptCtx);
23885
                    goto exit_buildmsg;
23886
                }
23887
            }
23888
            else
23889
        #endif
23890
            {
23891
                if (ssl->ctx->MacEncryptCb) {
23892
                    ret = ssl->ctx->MacEncryptCb(ssl, output + args->idx,
23893
                                    output + args->headerSz + args->ivSz,
23894
                                    (unsigned int)inSz, args->type, 0,
23895
                                    output + args->headerSz,
23896
                                    output + args->headerSz, args->size,
23897
                                    ssl->MacEncryptCtx);
23898
                    goto exit_buildmsg;
23899
                }
23900
            }
23901
    #endif
23902
23903
        #ifndef WOLFSSL_AEAD_ONLY
23904
            if (ssl->specs.cipher_type != aead
23905
            #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
23906
                                               && !ssl->options.startedETMWrite
23907
            #endif
23908
                ) {
23909
            #ifdef HAVE_TRUNCATED_HMAC
23910
                if (ssl->truncated_hmac &&
23911
                                        ssl->specs.hash_size > args->digestSz) {
23912
                #ifdef WOLFSSL_SMALL_STACK
23913
                    byte* hmac;
23914
                #else
23915
                    byte  hmac[WC_MAX_DIGEST_SIZE];
23916
                #endif
23917
23918
                #ifdef WOLFSSL_SMALL_STACK
23919
                    hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
23920
                                                           DYNAMIC_TYPE_DIGEST);
23921
                    if (hmac == NULL)
23922
                        ERROR_OUT(MEMORY_E, exit_buildmsg);
23923
                #endif
23924
23925
                    ret = ssl->hmac(ssl, hmac,
23926
                                     output + args->headerSz + args->ivSz,
23927
                                     (word32)inSz, -1, args->type, 0,
23928
                                     epochOrder);
23929
                    XMEMCPY(output + args->idx, hmac, args->digestSz);
23930
23931
                #ifdef WOLFSSL_SMALL_STACK
23932
                    XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
23933
                #endif
23934
                }
23935
                else
23936
            #endif
23937
                {
23938
                    ret = ssl->hmac(ssl, output + args->idx, output +
23939
                                args->headerSz + args->ivSz, (word32)inSz, -1,
23940
                                args->type, 0, epochOrder);
23941
                }
23942
            }
23943
        #endif /* WOLFSSL_AEAD_ONLY */
23944
            if (ret != 0)
23945
                goto exit_buildmsg;
23946
23947
            ssl->options.buildMsgState = BUILD_MSG_ENCRYPT;
23948
        }
23949
        FALL_THROUGH;
23950
        case BUILD_MSG_ENCRYPT:
23951
        {
23952
            /* done with size calculations */
23953
            if (sizeOnly)
23954
                goto exit_buildmsg;
23955
23956
            {
23957
    #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
23958
            /* If we want the PREV_ORDER then modify CUR_ORDER sequence number
23959
             * for all encryption algos that use it for encryption parameters */
23960
            word16 dtls_epoch = 0;
23961
            word16 dtls_sequence_number_hi = 0;
23962
            word32 dtls_sequence_number_lo = 0;
23963
            int swap_seq = ssl->options.dtls && epochOrder == PREV_ORDER &&
23964
                    DtlsUseSCRKeys(ssl);
23965
            if (swap_seq) {
23966
                dtls_epoch = ssl->keys.dtls_epoch;
23967
                dtls_sequence_number_hi = ssl->keys.dtls_sequence_number_hi;
23968
                dtls_sequence_number_lo = ssl->keys.dtls_sequence_number_lo;
23969
                ssl->keys.dtls_epoch--;
23970
                ssl->keys.dtls_sequence_number_hi =
23971
                        ssl->keys.dtls_prev_sequence_number_hi;
23972
                ssl->keys.dtls_sequence_number_lo =
23973
                        ssl->keys.dtls_prev_sequence_number_lo;
23974
            }
23975
    #endif
23976
23977
#ifdef WOLFSSL_THREADED_CRYPT
23978
    if (asyncOkay) {
23979
        WOLFSSL_MSG("Not encrypting\n");
23980
        /* make sure build message state is reset */
23981
        ssl->options.buildMsgState = BUILD_MSG_BEGIN;
23982
23983
        /* return sz on success */
23984
        if (ret == 0) {
23985
            ret = args->sz;
23986
        }
23987
        else {
23988
            WOLFSSL_ERROR_VERBOSE(ret);
23989
        }
23990
23991
        /* Final cleanup */
23992
        FreeBuildMsgArgs(ssl, args);
23993
23994
        return ret;
23995
    }
23996
    else
23997
#endif
23998
    {
23999
    #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
24000
            if (ssl->options.startedETMWrite) {
24001
                ret = Encrypt(ssl, output + args->headerSz,
24002
                                          output + args->headerSz,
24003
                                          (word16)(args->size - args->digestSz),
24004
                                          asyncOkay, args->type);
24005
            }
24006
            else
24007
    #endif
24008
            {
24009
                ret = Encrypt(ssl, output + args->headerSz,
24010
                                output + args->headerSz, args->size, asyncOkay,
24011
                                args->type);
24012
            }
24013
    #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
24014
            /* Restore sequence numbers */
24015
            if (swap_seq) {
24016
                ssl->keys.dtls_epoch = dtls_epoch;
24017
                ssl->keys.dtls_sequence_number_hi = dtls_sequence_number_hi;
24018
                ssl->keys.dtls_sequence_number_lo = dtls_sequence_number_lo;
24019
            }
24020
    #endif
24021
    }
24022
            }
24023
24024
            if (ret != 0) {
24025
            #ifdef WOLFSSL_ASYNC_CRYPT
24026
                if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
24027
            #endif
24028
                {
24029
                    /* Zeroize plaintext. */
24030
            #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
24031
                    if (ssl->options.startedETMWrite) {
24032
                        ForceZero(output + args->headerSz,
24033
                            (word16)(args->size - args->digestSz));
24034
                    }
24035
                    else
24036
            #endif
24037
                    {
24038
                        ForceZero(output + args->headerSz, (word16)args->size);
24039
                    }
24040
                }
24041
                goto exit_buildmsg;
24042
            }
24043
            ssl->options.buildMsgState = BUILD_MSG_ENCRYPTED_VERIFY_MAC;
24044
        }
24045
        FALL_THROUGH;
24046
        case BUILD_MSG_ENCRYPTED_VERIFY_MAC:
24047
        {
24048
            /* done with size calculations */
24049
            if (sizeOnly)
24050
                goto exit_buildmsg;
24051
24052
        #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
24053
            if (ssl->options.startedETMWrite) {
24054
                WOLFSSL_MSG("Calculate MAC of Encrypted Data");
24055
24056
            #ifdef HAVE_TRUNCATED_HMAC
24057
                if (ssl->truncated_hmac &&
24058
                                        ssl->specs.hash_size > args->digestSz) {
24059
                #ifdef WOLFSSL_SMALL_STACK
24060
                    byte* hmac = NULL;
24061
                #else
24062
                    byte  hmac[WC_MAX_DIGEST_SIZE];
24063
                #endif
24064
24065
                #ifdef WOLFSSL_SMALL_STACK
24066
                    hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
24067
                                                           DYNAMIC_TYPE_DIGEST);
24068
                    if (hmac == NULL)
24069
                        ERROR_OUT(MEMORY_E, exit_buildmsg);
24070
                #endif
24071
24072
                    ret = ssl->hmac(ssl, hmac, output + args->headerSz,
24073
                                    args->ivSz + inSz + args->pad + 1, -1,
24074
                                    args->type, 0, epochOrder);
24075
                    XMEMCPY(output + args->idx + args->pad + 1, hmac,
24076
                                                                args->digestSz);
24077
24078
                #ifdef WOLFSSL_SMALL_STACK
24079
                    XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
24080
                #endif
24081
                }
24082
                else
24083
            #endif
24084
                {
24085
                    ret = ssl->hmac(ssl, output + args->idx + args->pad + 1,
24086
                                    output + args->headerSz,
24087
                                    args->ivSz + (word32)inSz + args->pad + 1,
24088
                                    -1, args->type, 0, epochOrder);
24089
                }
24090
            }
24091
        #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
24092
        }
24093
        FALL_THROUGH;
24094
        default:
24095
            break;
24096
    }
24097
24098
exit_buildmsg:
24099
24100
    WOLFSSL_LEAVE("BuildMessage", ret);
24101
24102
#ifdef WOLFSSL_ASYNC_CRYPT
24103
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
24104
        return ret;
24105
    }
24106
#endif
24107
24108
    /* make sure build message state is reset */
24109
    ssl->options.buildMsgState = BUILD_MSG_BEGIN;
24110
24111
    #ifdef WOLFSSL_DTLS
24112
        if (ret == 0 && ssl->options.dtls && !sizeOnly)
24113
            DtlsSEQIncrement(ssl, epochOrder);
24114
    #endif
24115
24116
    /* return sz on success */
24117
    if (ret == 0) {
24118
        ret = (int)args->sz;
24119
    }
24120
    else {
24121
        WOLFSSL_ERROR_VERBOSE(ret);
24122
    }
24123
24124
    /* Final cleanup */
24125
    FreeBuildMsgArgs(ssl, args);
24126
    return ret;
24127
#else
24128
    (void)outSz;
24129
    (void)inSz;
24130
    (void)type;
24131
    (void)hashOutput;
24132
    (void)asyncOkay;
24133
    return NOT_COMPILED_IN;
24134
#endif /* !WOLFSSL_NO_TLS12 */
24135
#endif
24136
}
24137
24138
#ifndef WOLFSSL_NO_TLS12
24139
24140
int SendFinished(WOLFSSL* ssl)
24141
{
24142
    int              sendSz,
24143
                     finishedSz = ssl->options.tls ? TLS_FINISHED_SZ :
24144
                                                     FINISHED_SZ;
24145
    byte             input[FINISHED_SZ + DTLS_HANDSHAKE_HEADER_SZ];  /* max */
24146
    byte            *output;
24147
    Hashes*          hashes;
24148
    int              ret;
24149
    int              headerSz = HANDSHAKE_HEADER_SZ;
24150
    int              outputSz;
24151
24152
    WOLFSSL_START(WC_FUNC_FINISHED_SEND);
24153
    WOLFSSL_ENTER("SendFinished");
24154
24155
    /* check for available size */
24156
    outputSz = sizeof(input) + MAX_MSG_EXTRA;
24157
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
24158
    if (ssl->options.dtls) {
24159
        byte cidSz = 0;
24160
        if ((cidSz = DtlsGetCidTxSize(ssl)) > 0)
24161
            outputSz += cidSz + 1; /* +1 for inner content type */
24162
    }
24163
#endif
24164
24165
    /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
24166
     * is not advanced yet */
24167
    ssl->options.buildingMsg = 1;
24168
24169
    if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
24170
        return ret;
24171
24172
    #ifdef WOLFSSL_DTLS
24173
        if (ssl->options.dtls) {
24174
            headerSz += DTLS_HANDSHAKE_EXTRA;
24175
            ssl->keys.dtls_epoch++;
24176
            ssl->keys.dtls_prev_sequence_number_hi =
24177
                    ssl->keys.dtls_sequence_number_hi;
24178
            ssl->keys.dtls_prev_sequence_number_lo =
24179
                    ssl->keys.dtls_sequence_number_lo;
24180
            ssl->keys.dtls_sequence_number_hi = 0;
24181
            ssl->keys.dtls_sequence_number_lo = 0;
24182
        }
24183
    #endif
24184
24185
    /* get output buffer */
24186
    output = GetOutputBuffer(ssl);
24187
    AddHandShakeHeader(input, (word32)finishedSz, 0,
24188
            (word32)finishedSz, finished, ssl);
24189
24190
    /* make finished hashes */
24191
    hashes = (Hashes*)&input[headerSz];
24192
    ret = BuildFinished(ssl, hashes, ssl->options.side == WOLFSSL_CLIENT_END ?
24193
                                                 kTlsClientStr : kTlsServerStr);
24194
    if (ret != 0) return ret;
24195
24196
#ifdef HAVE_SECURE_RENEGOTIATION
24197
    if (ssl->secure_renegotiation) {
24198
        if (ssl->options.side == WOLFSSL_CLIENT_END)
24199
            XMEMCPY(ssl->secure_renegotiation->client_verify_data, hashes,
24200
                    TLS_FINISHED_SZ);
24201
        else
24202
            XMEMCPY(ssl->secure_renegotiation->server_verify_data, hashes,
24203
                    TLS_FINISHED_SZ);
24204
    }
24205
#endif
24206
#ifdef WOLFSSL_HAVE_TLS_UNIQUE
24207
    if (ssl->options.side == WOLFSSL_CLIENT_END) {
24208
        XMEMCPY(ssl->clientFinished,
24209
                hashes, TLS_FINISHED_SZ);
24210
        ssl->clientFinished_len = TLS_FINISHED_SZ;
24211
    }
24212
    else {
24213
        XMEMCPY(ssl->serverFinished,
24214
                hashes, TLS_FINISHED_SZ);
24215
        ssl->serverFinished_len = TLS_FINISHED_SZ;
24216
    }
24217
#endif
24218
24219
    #ifdef WOLFSSL_DTLS
24220
        if (IsDtlsNotSctpMode(ssl)) {
24221
            if ((ret = DtlsMsgPoolSave(ssl, input, headerSz + finishedSz,
24222
                                                              finished)) != 0) {
24223
                return ret;
24224
            }
24225
        }
24226
    #endif
24227
24228
    ssl->keys.encryptionOn = 1;
24229
    sendSz = BuildMessage(ssl, output, outputSz, input, headerSz + finishedSz,
24230
                                                 handshake, 1, 0, 0, CUR_ORDER);
24231
    if (sendSz < 0)
24232
        return BUILD_MSG_ERROR;
24233
24234
    if (!ssl->options.resuming) {
24235
        SetupSession(ssl);
24236
#ifndef NO_SESSION_CACHE
24237
        AddSession(ssl);
24238
#endif
24239
        if (ssl->options.side == WOLFSSL_SERVER_END) {
24240
        #ifdef OPENSSL_EXTRA
24241
            ssl->options.serverState = SERVER_FINISHED_COMPLETE;
24242
            ssl->cbmode = WOLFSSL_CB_MODE_WRITE;
24243
            if (ssl->CBIS != NULL)
24244
                ssl->CBIS(ssl, WOLFSSL_CB_HANDSHAKE_DONE, WOLFSSL_SUCCESS);
24245
        #endif
24246
            ssl->options.handShakeState = HANDSHAKE_DONE;
24247
            ssl->options.handShakeDone  = 1;
24248
#ifdef HAVE_SECURE_RENEGOTIATION
24249
            ssl->options.resumed = ssl->options.resuming;
24250
#endif
24251
        }
24252
    }
24253
    else {
24254
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
24255
        #ifdef OPENSSL_EXTRA
24256
            ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
24257
            ssl->cbmode = WOLFSSL_CB_MODE_WRITE;
24258
            if (ssl->CBIS != NULL)
24259
                ssl->CBIS(ssl, WOLFSSL_CB_HANDSHAKE_DONE, WOLFSSL_SUCCESS);
24260
        #endif
24261
            ssl->options.handShakeState = HANDSHAKE_DONE;
24262
            ssl->options.handShakeDone  = 1;
24263
#ifdef HAVE_SECURE_RENEGOTIATION
24264
            ssl->options.resumed = ssl->options.resuming;
24265
#endif
24266
        }
24267
    }
24268
24269
    #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
24270
        if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
24271
        if (ssl->toInfoOn) {
24272
            ret = AddPacketInfo(ssl, "Finished", handshake, output, sendSz,
24273
                          WRITE_PROTO, 0, ssl->heap);
24274
            if (ret != 0)
24275
                return ret;
24276
        }
24277
    #endif
24278
24279
    ssl->buffers.outputBuffer.length += (word32)sendSz;
24280
24281
    ret = SendBuffered(ssl);
24282
24283
    ssl->options.buildingMsg = 0;
24284
24285
#ifdef WOLFSSL_DTLS
24286
    if ((!ssl->options.resuming &&
24287
            ssl->options.side == WOLFSSL_SERVER_END) ||
24288
        (ssl->options.resuming &&
24289
            ssl->options.side == WOLFSSL_CLIENT_END)) {
24290
        ssl->keys.dtls_handshake_number = 0;
24291
        ssl->keys.dtls_expected_peer_handshake_number = 0;
24292
    }
24293
#endif
24294
24295
    WOLFSSL_LEAVE("SendFinished", ret);
24296
    WOLFSSL_END(WC_FUNC_FINISHED_SEND);
24297
24298
    return ret;
24299
}
24300
#endif /* WOLFSSL_NO_TLS12 */
24301
#endif /* !NO_TLS */
24302
24303
#ifndef NO_WOLFSSL_SERVER
24304
#if (!defined(WOLFSSL_NO_TLS12) && \
24305
        (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
24306
         defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))) || \
24307
    (defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST))
24308
/* Parses and decodes the certificate then initializes "request". In the case
24309
 * of !ssl->buffers.weOwnCert, ssl->ctx->certOcspRequest gets set to "request".
24310
 *
24311
 * Returns 0 on success
24312
 */
24313
int CreateOcspRequest(WOLFSSL* ssl, OcspRequest* request,
24314
                             DecodedCert* cert, byte* certData, word32 length,
24315
                             byte *ctxOwnsRequest)
24316
{
24317
    int ret;
24318
24319
    if (request != NULL)
24320
        XMEMSET(request, 0, sizeof(OcspRequest));
24321
24322
    if (ctxOwnsRequest!= NULL)
24323
        *ctxOwnsRequest = 0;
24324
24325
    InitDecodedCert(cert, certData, length, ssl->heap);
24326
    /* TODO: Setup async support here */
24327
    ret = ParseCertRelative(cert, CERT_TYPE, VERIFY, SSL_CM(ssl), NULL);
24328
    if (ret != 0) {
24329
        WOLFSSL_MSG("ParseCert failed");
24330
    }
24331
    if (ret == 0)
24332
        ret = InitOcspRequest(request, cert, 0, ssl->heap);
24333
    if (ret == 0) {
24334
        /* make sure ctx OCSP request is updated */
24335
        if (!ssl->buffers.weOwnCert && SSL_CM(ssl) != NULL) {
24336
            wolfSSL_Mutex* ocspLock = &SSL_CM(ssl)->ocsp_stapling->ocspLock;
24337
            if (wc_LockMutex(ocspLock) == 0) {
24338
                if (ssl->ctx->certOcspRequest == NULL) {
24339
                    ssl->ctx->certOcspRequest = request;
24340
                    if (ctxOwnsRequest!= NULL)
24341
                        *ctxOwnsRequest = 1;
24342
                }
24343
                wc_UnLockMutex(ocspLock);
24344
            }
24345
        }
24346
    }
24347
24348
    FreeDecodedCert(cert);
24349
24350
    return ret;
24351
}
24352
24353
24354
/* Creates OCSP response and places it in variable "response". Memory
24355
 * management for "buffer* response" is up to the caller.
24356
 *
24357
 * Also creates an OcspRequest in the case that ocspRequest is null or that
24358
 * ssl->buffers.weOwnCert is set. In those cases managing ocspRequest free'ing
24359
 * is up to the caller. NOTE: in OcspCreateRequest ssl->ctx->certOcspRequest can
24360
 * be set to point to "ocspRequest" and it then should not be free'd since
24361
 * wolfSSL_CTX_free will take care of it.
24362
 *
24363
 * Returns 0 on success
24364
 */
24365
int CreateOcspResponse(WOLFSSL* ssl, OcspRequest** ocspRequest,
24366
                       buffer* response)
24367
{
24368
    int          ret = 0;
24369
    OcspRequest* request = NULL;
24370
    byte createdRequest  = 0;
24371
    byte ctxOwnsRequest = 0;
24372
24373
    if (ssl == NULL || ocspRequest == NULL || response == NULL)
24374
        return BAD_FUNC_ARG;
24375
24376
    XMEMSET(response, 0, sizeof(*response));
24377
    request = *ocspRequest;
24378
24379
    /* unable to fetch status. skip. */
24380
    if (SSL_CM(ssl) == NULL || SSL_CM(ssl)->ocspStaplingEnabled == 0)
24381
        return 0;
24382
24383
    if (request == NULL || ssl->buffers.weOwnCert) {
24384
        DerBuffer* der = ssl->buffers.certificate;
24385
        #ifdef WOLFSSL_SMALL_STACK
24386
            DecodedCert* cert = NULL;
24387
        #else
24388
            DecodedCert  cert[1];
24389
        #endif
24390
24391
        /* unable to fetch status. skip. */
24392
        if (der->buffer == NULL || der->length == 0)
24393
            return 0;
24394
24395
    #ifdef WOLFSSL_SMALL_STACK
24396
        cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
24397
                                        DYNAMIC_TYPE_DCERT);
24398
        if (cert == NULL)
24399
            return MEMORY_E;
24400
    #endif
24401
        request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
24402
                                                     DYNAMIC_TYPE_OCSP_REQUEST);
24403
        if (request == NULL)
24404
            ret = MEMORY_E;
24405
24406
        createdRequest = 1;
24407
        if (ret == 0) {
24408
            ret = CreateOcspRequest(ssl, request, cert, der->buffer,
24409
                      der->length, &ctxOwnsRequest);
24410
        }
24411
24412
        if (ret != 0) {
24413
            XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
24414
            request = NULL;
24415
        }
24416
24417
    #ifdef WOLFSSL_SMALL_STACK
24418
        XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
24419
    #endif
24420
    }
24421
24422
    if (ret == 0) {
24423
        request->ssl = ssl;
24424
        ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling, request, response,
24425
                               ssl->heap);
24426
24427
        /* Suppressing, not critical */
24428
        if (ret == WC_NO_ERR_TRACE(OCSP_CERT_REVOKED) ||
24429
            ret == WC_NO_ERR_TRACE(OCSP_CERT_UNKNOWN) ||
24430
            ret == WC_NO_ERR_TRACE(OCSP_LOOKUP_FAIL)) {
24431
            ret = 0;
24432
        }
24433
    }
24434
24435
    /* free request up if error case found otherwise return it */
24436
    if (ret != 0 && createdRequest && !ctxOwnsRequest) {
24437
        FreeOcspRequest(request);
24438
        XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
24439
    }
24440
24441
    if (ret == 0)
24442
        *ocspRequest = request;
24443
24444
    return ret;
24445
}
24446
#endif
24447
#endif /* !NO_WOLFSSL_SERVER */
24448
24449
int cipherExtraData(WOLFSSL* ssl)
24450
0
{
24451
0
    int cipherExtra;
24452
    /* Cipher data that may be added by BuildMessage */
24453
    /* There is always an IV (expect for chacha). For AEAD ciphers,
24454
     * there is the authentication tag (aead_mac_size). For block
24455
     * ciphers we have the hash_size MAC on the message, and one
24456
     * block size for possible padding. */
24457
0
    if (ssl->specs.cipher_type == aead) {
24458
0
        cipherExtra = ssl->specs.aead_mac_size;
24459
        /* CHACHA does not have an explicit IV. */
24460
0
        if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha) {
24461
0
            cipherExtra += AESGCM_EXP_IV_SZ;
24462
0
        }
24463
0
    }
24464
0
    else {
24465
0
        cipherExtra = ssl->specs.iv_size + ssl->specs.block_size +
24466
0
            ssl->specs.hash_size;
24467
0
    }
24468
    /* Add space needed for the CID */
24469
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
24470
    if (ssl->options.dtls) {
24471
        byte cidSz = 0;
24472
        if ((cidSz = DtlsGetCidTxSize(ssl)) > 0)
24473
            cipherExtra += cidSz + 1; /* +1 for inner content type */
24474
    }
24475
#endif
24476
    /* Sanity check so we don't ever return negative. */
24477
0
    return cipherExtra > 0 ? cipherExtra : 0;
24478
0
}
24479
24480
#ifndef WOLFSSL_NO_TLS12
24481
24482
#ifndef NO_CERTS
24483
24484
#if (!defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)) && \
24485
    !defined(NO_TLS)
24486
/* handle generation of certificate (11) */
24487
int SendCertificate(WOLFSSL* ssl)
24488
{
24489
    int    ret = 0;
24490
    word32 certSz, certChainSz, headerSz, listSz, payloadSz;
24491
    word32 length, maxFragment;
24492
#ifdef HAVE_RPK
24493
    int    usingRpkTls12 = 0;
24494
#endif /* HAVE_RPK */
24495
24496
    WOLFSSL_START(WC_FUNC_CERTIFICATE_SEND);
24497
    WOLFSSL_ENTER("SendCertificate");
24498
24499
    if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher) {
24500
        WOLFSSL_MSG("Not sending certificate msg. Using PSK or ANON cipher.");
24501
        return 0;  /* not needed */
24502
    }
24503
24504
#ifdef HAVE_RPK
24505
    if (!IsAtLeastTLSv1_3(ssl->version)) {
24506
        /* If this is (D)TLS1.2 and RPK, then single cert, not list. */
24507
        if (ssl->options.side == WOLFSSL_SERVER_END) {
24508
            if (ssl->options.rpkState.sending_ServerCertTypeCnt == 1 &&
24509
                ssl->options.rpkState.sending_ServerCertTypes[0] == WOLFSSL_CERT_TYPE_RPK)
24510
                usingRpkTls12 = 1;
24511
        } else if (ssl->options.side == WOLFSSL_CLIENT_END) {
24512
            if (ssl->options.rpkState.sending_ClientCertTypeCnt == 1 &&
24513
                ssl->options.rpkState.sending_ClientCertTypes[0] == WOLFSSL_CERT_TYPE_RPK)
24514
                usingRpkTls12 = 1;
24515
        }
24516
    }
24517
#endif /* HAVE_RPK */
24518
24519
    if (ssl->options.sendVerify == SEND_BLANK_CERT) {
24520
    #ifdef OPENSSL_EXTRA
24521
        if (ssl->version.major == SSLv3_MAJOR
24522
            && ssl->version.minor == SSLv3_MINOR){
24523
            return SendAlert(ssl, alert_warning, no_certificate);
24524
        } else {
24525
    #endif
24526
            certSz = 0;
24527
            certChainSz = 0;
24528
            headerSz = CERT_HEADER_SZ;
24529
            length = CERT_HEADER_SZ;
24530
            listSz = 0;
24531
    #ifdef OPENSSL_EXTRA
24532
        }
24533
    #endif
24534
    }
24535
    else {
24536
        if (!ssl->buffers.certificate) {
24537
            WOLFSSL_MSG("Send Cert missing certificate buffer");
24538
            return BUFFER_ERROR;
24539
        }
24540
        certSz = ssl->buffers.certificate->length;
24541
#ifdef HAVE_RPK
24542
        if (usingRpkTls12) {
24543
            headerSz = 1 * CERT_HEADER_SZ;
24544
            listSz = certSz;
24545
        } else {
24546
#endif /* HAVE_RPK */
24547
            headerSz = 2 * CERT_HEADER_SZ;
24548
            listSz = certSz + CERT_HEADER_SZ;
24549
#ifdef HAVE_RPK
24550
        }
24551
#endif /* HAVE_RPK */
24552
        /* list + cert size */
24553
        length = certSz + headerSz;
24554
24555
        /* may need to send rest of chain, already has leading size(s) */
24556
        if (certSz && ssl->buffers.certChain) {
24557
            certChainSz = ssl->buffers.certChain->length;
24558
            length += certChainSz;
24559
            listSz += certChainSz;
24560
        }
24561
        else
24562
            certChainSz = 0;
24563
    }
24564
24565
    payloadSz = length;
24566
24567
    if (ssl->fragOffset != 0)
24568
        length -= (ssl->fragOffset + headerSz);
24569
24570
    maxFragment = MAX_RECORD_SIZE;
24571
24572
    maxFragment = (word32)wolfSSL_GetMaxFragSize(ssl, (int)maxFragment);
24573
24574
    while (length > 0 && ret == 0) {
24575
        byte*  output = NULL;
24576
        word32 fragSz = 0;
24577
        word32 i = RECORD_HEADER_SZ;
24578
        int    sendSz = RECORD_HEADER_SZ;
24579
24580
        ssl->options.buildingMsg = 1;
24581
24582
        if (!ssl->options.dtls) {
24583
            if (ssl->fragOffset == 0)  {
24584
                if (headerSz + certSz + certChainSz <=
24585
                    maxFragment - HANDSHAKE_HEADER_SZ) {
24586
24587
                    fragSz = headerSz + certSz + certChainSz;
24588
                }
24589
                else {
24590
                    fragSz = maxFragment - HANDSHAKE_HEADER_SZ;
24591
                }
24592
                sendSz += (int)(fragSz) + HANDSHAKE_HEADER_SZ;
24593
                i += HANDSHAKE_HEADER_SZ;
24594
            }
24595
            else {
24596
                fragSz = min(length, maxFragment);
24597
                sendSz += (int)(fragSz);
24598
            }
24599
24600
            if (IsEncryptionOn(ssl, 1))
24601
                sendSz += MAX_MSG_EXTRA;
24602
        }
24603
        else {
24604
        #ifdef WOLFSSL_DTLS
24605
            fragSz = min(length, maxFragment);
24606
            sendSz += fragSz + DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_HEADER_SZ;
24607
            i      += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_HEADER_SZ;
24608
        #endif
24609
        }
24610
24611
        if (IsEncryptionOn(ssl, 1))
24612
            sendSz += cipherExtraData(ssl);
24613
24614
        /* check for available size */
24615
        if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
24616
            return ret;
24617
24618
        /* get output buffer */
24619
        output = GetOutputBuffer(ssl);
24620
24621
        /* Safe to use ssl->fragOffset since it will be incremented immediately
24622
         * after this block. This block needs to be entered only once to not
24623
         * hash the cert msg twice. */
24624
        if (ssl->fragOffset == 0) {
24625
            if (!ssl->options.dtls) {
24626
                AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
24627
                if (!IsEncryptionOn(ssl, 1))
24628
                    HashRaw(ssl, output + RECORD_HEADER_SZ,
24629
                                  HANDSHAKE_HEADER_SZ);
24630
            }
24631
            else {
24632
            #ifdef WOLFSSL_DTLS
24633
                AddHeaders(output, payloadSz, certificate, ssl);
24634
                HashRaw(ssl,
24635
                        output + RECORD_HEADER_SZ + DTLS_RECORD_EXTRA,
24636
                        HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA);
24637
                /* Adding the headers increments these, decrement them for
24638
                 * actual message header. */
24639
                ssl->keys.dtls_handshake_number--;
24640
                AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
24641
                ssl->keys.dtls_handshake_number--;
24642
            #endif /* WOLFSSL_DTLS */
24643
            }
24644
24645
            /* list total */
24646
#ifdef HAVE_RPK
24647
            if (!usingRpkTls12) {
24648
#endif /* HAVE_RPK */
24649
                c32to24(listSz, output + i);
24650
                if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
24651
                    HashRaw(ssl, output + i, CERT_HEADER_SZ);
24652
                i += CERT_HEADER_SZ;
24653
                length -= CERT_HEADER_SZ;
24654
                fragSz -= CERT_HEADER_SZ;
24655
#ifdef HAVE_RPK
24656
            }
24657
#endif /* HAVE_RPK */
24658
            if (certSz) {
24659
                c32to24(certSz, output + i);
24660
                if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
24661
                    HashRaw(ssl, output + i, CERT_HEADER_SZ);
24662
                i += CERT_HEADER_SZ;
24663
                length -= CERT_HEADER_SZ;
24664
                fragSz -= CERT_HEADER_SZ;
24665
24666
                if (ssl->options.dtls || !IsEncryptionOn(ssl, 1)) {
24667
                    HashRaw(ssl, ssl->buffers.certificate->buffer, (int)certSz);
24668
                    if (certChainSz)
24669
                        HashRaw(ssl, ssl->buffers.certChain->buffer,
24670
                                      (int)certChainSz);
24671
                }
24672
            }
24673
        }
24674
        else {
24675
            if (!ssl->options.dtls) {
24676
                AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
24677
            }
24678
            else {
24679
            #ifdef WOLFSSL_DTLS
24680
                AddFragHeaders(output, fragSz, ssl->fragOffset + headerSz,
24681
                               payloadSz, certificate, ssl);
24682
                ssl->keys.dtls_handshake_number--;
24683
            #endif /* WOLFSSL_DTLS */
24684
            }
24685
        }
24686
24687
        /* member */
24688
        if (certSz && ssl->fragOffset < certSz) {
24689
            word32 copySz = min(certSz - ssl->fragOffset, fragSz);
24690
            XMEMCPY(output + i,
24691
                    ssl->buffers.certificate->buffer + ssl->fragOffset, copySz);
24692
            i += copySz;
24693
            ssl->fragOffset += copySz;
24694
            length -= copySz;
24695
            fragSz -= copySz;
24696
        }
24697
        if (certChainSz && fragSz) {
24698
            word32 copySz = min(certChainSz + certSz - ssl->fragOffset, fragSz);
24699
            XMEMCPY(output + i,
24700
                    ssl->buffers.certChain->buffer + ssl->fragOffset - certSz,
24701
                    copySz);
24702
            i += copySz;
24703
            ssl->fragOffset += copySz;
24704
            length -= copySz;
24705
        }
24706
24707
        if (IsEncryptionOn(ssl, 1)) {
24708
            byte* input = NULL;
24709
            int   inputSz = (int)i; /* build msg adds rec hdr */
24710
            int   recordHeaderSz = RECORD_HEADER_SZ;
24711
24712
            if (ssl->options.dtls)
24713
                recordHeaderSz += DTLS_RECORD_EXTRA;
24714
            inputSz -= recordHeaderSz;
24715
24716
            if (inputSz < 0) {
24717
                WOLFSSL_MSG("Send Cert bad inputSz");
24718
                return BUFFER_E;
24719
            }
24720
24721
            if (inputSz > 0) {  /* clang thinks could be zero, let's help */
24722
                input = (byte*)XMALLOC((size_t)inputSz, ssl->heap,
24723
                                       DYNAMIC_TYPE_IN_BUFFER);
24724
                if (input == NULL)
24725
                    return MEMORY_E;
24726
                XMEMCPY(input, output + recordHeaderSz, (size_t)(inputSz));
24727
            }
24728
24729
#ifndef WOLFSSL_DTLS
24730
            sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
24731
                                                          handshake, 1, 0, 0, CUR_ORDER);
24732
#else
24733
            if (!ssl->options.dtls)
24734
                sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
24735
                                                              handshake, 1, 0, 0, CUR_ORDER);
24736
            else /* DTLS 1.2 has to ignore fragmentation in hashing so we need to
24737
                  * calculate the hash ourselves above */ {
24738
                if ((ret = DtlsMsgPoolSave(ssl, input, (word32)inputSz, certificate)) != 0) {
24739
                    XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
24740
                    return ret;
24741
                }
24742
                sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
24743
                                                              handshake, 0, 0, 0, CUR_ORDER);
24744
            }
24745
#endif
24746
24747
            XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
24748
24749
            if (sendSz < 0)
24750
                return sendSz;
24751
        }
24752
        else {
24753
            sendSz = (int)i;
24754
        #ifdef WOLFSSL_DTLS
24755
            if (IsDtlsNotSctpMode(ssl)) {
24756
                if ((ret = DtlsMsgPoolSave(ssl, output, (word32)sendSz, certificate)) != 0)
24757
                    return ret;
24758
            }
24759
            if (ssl->options.dtls)
24760
                DtlsSEQIncrement(ssl, CUR_ORDER);
24761
        #endif
24762
        }
24763
24764
    #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
24765
        if (ssl->hsInfoOn)
24766
            AddPacketName(ssl, "Certificate");
24767
        if (ssl->toInfoOn) {
24768
            ret = AddPacketInfo(ssl, "Certificate", handshake, output, sendSz,
24769
                           WRITE_PROTO, 0, ssl->heap);
24770
            if (ret != 0)
24771
                return ret;
24772
        }
24773
    #endif
24774
24775
        ssl->buffers.outputBuffer.length += (word32)sendSz;
24776
        if (!ssl->options.groupMessages)
24777
            ret = SendBuffered(ssl);
24778
    }
24779
24780
    if (ret != WC_NO_ERR_TRACE(WANT_WRITE)) {
24781
        /* Clean up the fragment offset. */
24782
        ssl->options.buildingMsg = 0;
24783
        ssl->fragOffset = 0;
24784
        #ifdef WOLFSSL_DTLS
24785
            if (ssl->options.dtls)
24786
                ssl->keys.dtls_handshake_number++;
24787
        #endif
24788
        if (ssl->options.side == WOLFSSL_SERVER_END){
24789
            ssl->options.serverState = SERVER_CERT_COMPLETE;
24790
        }
24791
    }
24792
24793
    WOLFSSL_LEAVE("SendCertificate", ret);
24794
    WOLFSSL_END(WC_FUNC_CERTIFICATE_SEND);
24795
24796
    return ret;
24797
}
24798
#endif /* !NO_TLS && (!NO_WOLFSSL_SERVER || !WOLFSSL_NO_CLIENT_AUTH) */
24799
24800
#if !defined(NO_TLS)
24801
/* handle generation of certificate_request (13) */
24802
int SendCertificateRequest(WOLFSSL* ssl)
24803
0
{
24804
0
    byte   *output;
24805
0
    int    ret;
24806
0
    int    sendSz;
24807
0
    word32 i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
24808
0
    word32 dnLen = 0;
24809
#ifndef WOLFSSL_NO_CA_NAMES
24810
    WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
24811
#endif
24812
0
    const Suites* suites = WOLFSSL_SUITES(ssl);
24813
24814
0
    int  typeTotal = 1;  /* only 1 for now */
24815
0
    int  reqSz = ENUM_LEN + typeTotal + REQ_HEADER_SZ;  /* add auth later */
24816
24817
0
    WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_SEND);
24818
0
    WOLFSSL_ENTER("SendCertificateRequest");
24819
24820
0
    if (IsAtLeastTLSv1_2(ssl))
24821
0
        reqSz += LENGTH_SZ + suites->hashSigAlgoSz;
24822
24823
#ifndef WOLFSSL_NO_CA_NAMES
24824
    /* Certificate Authorities */
24825
    names = SSL_CA_NAMES(ssl);
24826
    while (names != NULL) {
24827
        byte seq[MAX_SEQ_SZ];
24828
        WOLFSSL_X509_NAME* name = names->data.name;
24829
24830
        if (name != NULL) {
24831
            /* 16-bit length | SEQ | Len | DER of name */
24832
            dnLen += OPAQUE16_LEN + SetSequence(name->rawLen, seq) +
24833
                        name->rawLen;
24834
        }
24835
        names = names->next;
24836
    }
24837
    reqSz += dnLen;
24838
#endif
24839
24840
0
    if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher)
24841
0
        return 0;  /* not needed */
24842
24843
0
    sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + reqSz;
24844
24845
0
    if (!ssl->options.dtls) {
24846
0
        if (IsEncryptionOn(ssl, 1))
24847
0
            sendSz += MAX_MSG_EXTRA;
24848
0
    }
24849
0
    else {
24850
    #ifdef WOLFSSL_DTLS
24851
        sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
24852
        i      += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
24853
    #endif
24854
0
    }
24855
24856
0
    if (IsEncryptionOn(ssl, 1))
24857
0
        sendSz += cipherExtraData(ssl);
24858
24859
    /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
24860
     * is not advanced yet */
24861
0
    ssl->options.buildingMsg = 1;
24862
24863
    /* check for available size */
24864
0
    if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
24865
0
        return ret;
24866
24867
    /* get output buffer */
24868
0
    output = GetOutputBuffer(ssl);
24869
24870
0
    AddHeaders(output, (word32)reqSz, certificate_request, ssl);
24871
24872
    /* write to output */
24873
0
    output[i++] = (byte)typeTotal;  /* # of types */
24874
0
#ifdef HAVE_ECC
24875
0
    if ((ssl->options.cipherSuite0 == ECC_BYTE ||
24876
0
         ssl->options.cipherSuite0 == CHACHA_BYTE) &&
24877
0
                     ssl->specs.sig_algo == ecc_dsa_sa_algo) {
24878
0
        output[i++] = ecdsa_sign;
24879
0
    }
24880
0
    else
24881
0
#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && \
24882
0
    (defined(WOLFSSL_SM4_CBC) || defined(WOLFSSL_SM4_GCM) || \
24883
0
     defined(WOLFSSL_SM4_CCM))
24884
0
    if (ssl->options.cipherSuite0 == SM_BYTE && (0
24885
0
    #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
24886
0
        || ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
24887
0
    #endif
24888
0
    #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
24889
0
        || ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
24890
0
    #endif
24891
0
    #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
24892
0
        || ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
24893
0
    #endif
24894
0
        )) {
24895
0
        output[i++] = ecdsa_sign;
24896
0
    }
24897
0
    else
24898
0
#endif
24899
0
#endif /* HAVE_ECC */
24900
0
    {
24901
0
        output[i++] = rsa_sign;
24902
0
    }
24903
24904
    /* supported hash/sig */
24905
0
    if (IsAtLeastTLSv1_2(ssl)) {
24906
0
        c16toa(suites->hashSigAlgoSz, &output[i]);
24907
0
        i += OPAQUE16_LEN;
24908
24909
0
        XMEMCPY(&output[i], suites->hashSigAlgo, suites->hashSigAlgoSz);
24910
0
        i += suites->hashSigAlgoSz;
24911
0
    }
24912
24913
    /* Certificate Authorities */
24914
0
    c16toa((word16)dnLen, &output[i]);  /* auth's */
24915
0
    i += REQ_HEADER_SZ;
24916
#ifndef WOLFSSL_NO_CA_NAMES
24917
    names = SSL_CA_NAMES(ssl);
24918
    while (names != NULL) {
24919
        byte seq[MAX_SEQ_SZ];
24920
        WOLFSSL_X509_NAME* name = names->data.name;
24921
24922
        if (name != NULL) {
24923
            c16toa((word16)name->rawLen +
24924
                   (word16)SetSequence(name->rawLen, seq), &output[i]);
24925
            i += OPAQUE16_LEN;
24926
            i += SetSequence(name->rawLen, output + i);
24927
            XMEMCPY(output + i, name->raw, name->rawLen);
24928
            i += name->rawLen;
24929
        }
24930
        names = names->next;
24931
    }
24932
#endif
24933
0
    (void)i;
24934
24935
0
        if (IsEncryptionOn(ssl, 1)) {
24936
0
            byte* input = NULL;
24937
0
            int   inputSz = (int)i; /* build msg adds rec hdr */
24938
0
            int   recordHeaderSz = RECORD_HEADER_SZ;
24939
24940
0
            if (ssl->options.dtls)
24941
0
                recordHeaderSz += DTLS_RECORD_EXTRA;
24942
0
            inputSz -= recordHeaderSz;
24943
24944
0
            if (inputSz <= 0) {
24945
0
                WOLFSSL_MSG("Send Cert Req bad inputSz");
24946
0
                return BUFFER_E;
24947
0
            }
24948
24949
0
            input = (byte*)XMALLOC((size_t)inputSz, ssl->heap,
24950
0
                    DYNAMIC_TYPE_IN_BUFFER);
24951
0
            if (input == NULL)
24952
0
                return MEMORY_E;
24953
24954
0
            XMEMCPY(input, output + recordHeaderSz, (size_t)(inputSz));
24955
            #ifdef WOLFSSL_DTLS
24956
            if (IsDtlsNotSctpMode(ssl) &&
24957
                    (ret = DtlsMsgPoolSave(ssl, input, (word32)inputSz,
24958
                                           certificate_request)) != 0) {
24959
                XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
24960
                return ret;
24961
            }
24962
            #endif
24963
0
            sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
24964
0
                                  handshake, 1, 0, 0, CUR_ORDER);
24965
0
            XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
24966
24967
0
            if (sendSz < 0)
24968
0
                return sendSz;
24969
0
        } else {
24970
0
            sendSz = (int)i;
24971
            #ifdef WOLFSSL_DTLS
24972
                if (IsDtlsNotSctpMode(ssl)) {
24973
                    if ((ret = DtlsMsgPoolSave(ssl, output, (word32)sendSz,
24974
                                    certificate_request)) != 0)
24975
                        return ret;
24976
                }
24977
                if (ssl->options.dtls)
24978
                    DtlsSEQIncrement(ssl, CUR_ORDER);
24979
            #endif
24980
0
            ret = HashOutput(ssl, output, sendSz, 0);
24981
0
            if (ret != 0)
24982
0
                return ret;
24983
0
        }
24984
24985
    #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
24986
        if (ssl->hsInfoOn)
24987
            AddPacketName(ssl, "CertificateRequest");
24988
        if (ssl->toInfoOn) {
24989
            ret = AddPacketInfo(ssl, "CertificateRequest", handshake, output,
24990
                    sendSz, WRITE_PROTO, 0, ssl->heap);
24991
            if (ret != 0)
24992
                return ret;
24993
        }
24994
    #endif
24995
0
    ssl->buffers.outputBuffer.length += (word32)sendSz;
24996
0
    if (ssl->options.groupMessages)
24997
0
        ret = 0;
24998
0
    else
24999
0
        ret = SendBuffered(ssl);
25000
25001
0
    ssl->options.buildingMsg = 0;
25002
25003
0
    WOLFSSL_LEAVE("SendCertificateRequest", ret);
25004
0
    WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_SEND);
25005
25006
0
    return ret;
25007
0
}
25008
#endif /* !NO_TLS */
25009
25010
25011
#ifndef NO_WOLFSSL_SERVER
25012
25013
#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
25014
 || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
25015
static int BuildCertificateStatus(WOLFSSL* ssl, byte type, buffer* status,
25016
                                                                     byte count)
25017
{
25018
    byte*  output  = NULL;
25019
    word32 idx     = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
25020
    word32 length  = ENUM_LEN;
25021
    word32 headerSz= idx;
25022
    int    sendSz  = 0;
25023
    int    ret     = 0;
25024
    int    i       = 0;
25025
25026
    WOLFSSL_ENTER("BuildCertificateStatus");
25027
25028
    switch (type) {
25029
        case WOLFSSL_CSR2_OCSP_MULTI:
25030
            length += OPAQUE24_LEN;
25031
            FALL_THROUGH; /* followed by */
25032
25033
        case WOLFSSL_CSR2_OCSP:
25034
            for (i = 0; i < count; i++)
25035
                length += OPAQUE24_LEN + status[i].length;
25036
        break;
25037
25038
        default:
25039
            return 0;
25040
    }
25041
#ifdef WOLFSSL_DTLS
25042
    if (ssl->options.dtls) {
25043
        headerSz = idx = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
25044
        sendSz  = idx + length;
25045
25046
    } else
25047
#endif
25048
    sendSz = (int)(idx + length);
25049
25050
    if (ssl->keys.encryptionOn)
25051
        sendSz += MAX_MSG_EXTRA;
25052
25053
    output =(byte*)XMALLOC(sendSz, ssl->heap, DYNAMIC_TYPE_OCSP);
25054
    if (output == NULL)
25055
        return MEMORY_E;
25056
25057
    AddHeaders(output, length, certificate_status, ssl);
25058
25059
    output[idx++] = type;
25060
25061
    if (type == WOLFSSL_CSR2_OCSP_MULTI) {
25062
        c32to24(length - (ENUM_LEN + OPAQUE24_LEN), output + idx);
25063
        idx += OPAQUE24_LEN;
25064
    }
25065
25066
    for (i = 0; i < count; i++) {
25067
        c32to24(status[i].length, output + idx);
25068
        idx += OPAQUE24_LEN;
25069
25070
        XMEMCPY(output + idx, status[i].buffer, status[i].length);
25071
        idx += status[i].length;
25072
    }
25073
    /* Send Message. Handled message fragmentation in the function if needed */
25074
    ret = SendHandshakeMsg(ssl, output, (sendSz - headerSz), certificate_status,
25075
                "Certificate Status");
25076
    XFREE(output, ssl->heap, DYNAMIC_TYPE_OCSP);
25077
25078
    WOLFSSL_LEAVE("BuildCertificateStatus", ret);
25079
    return ret;
25080
}
25081
#endif
25082
25083
#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) &&                                \
25084
    (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) ||                         \
25085
    defined(WOLFSSL_HAPROXY))
25086
static int BuildCertificateStatusWithStatusCB(WOLFSSL* ssl)
25087
{
25088
    WOLFSSL_OCSP *ocsp;
25089
    void *ioCtx = NULL;
25090
    buffer response;
25091
    int ret;
25092
25093
    if (ssl == NULL) {
25094
        return BAD_FUNC_ARG;
25095
    }
25096
25097
    ocsp = SSL_CM(ssl)->ocsp_stapling;
25098
    if (ocsp == NULL || ocsp->statusCb == NULL)
25099
        return BAD_FUNC_ARG;
25100
    ioCtx = (ssl->ocspIOCtx != NULL) ?  ssl->ocspIOCtx : ocsp->cm->ocspIOCtx;
25101
    XMEMSET(&response, 0, sizeof(response));
25102
    WOLFSSL_MSG("Calling ocsp->statusCb");
25103
    ret = ocsp->statusCb(ssl, ioCtx);
25104
    switch (ret) {
25105
        case SSL_TLSEXT_ERR_OK:
25106
            if (ssl->ocspResp == NULL || ssl->ocspRespSz == 0) {
25107
                ret = 0;
25108
                break;
25109
            }
25110
            response.buffer = ssl->ocspResp;
25111
            response.length = ssl->ocspRespSz;
25112
            ret = BuildCertificateStatus(ssl, WOLFSSL_CSR_OCSP, &response, 1);
25113
            break;
25114
        case SSL_TLSEXT_ERR_NOACK:
25115
            /* No OCSP response to send */
25116
            ret = 0;
25117
            break;
25118
        case SSL_TLSEXT_ERR_ALERT_FATAL:
25119
        /* fall through */
25120
        default:
25121
            ret = WOLFSSL_FATAL_ERROR;
25122
            break;
25123
    }
25124
    return ret;
25125
}
25126
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST && (defined(OPENSSL_ALL) ||
25127
          defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)) */
25128
25129
#endif /* NO_WOLFSSL_SERVER */
25130
25131
/* handle generation of certificate_status (22) */
25132
int SendCertificateStatus(WOLFSSL* ssl)
25133
0
{
25134
0
    int ret = 0;
25135
0
    byte status_type = 0;
25136
25137
0
    WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_SEND);
25138
0
    WOLFSSL_ENTER("SendCertificateStatus");
25139
25140
0
    if (ssl == NULL || SSL_CM(ssl) == NULL) {
25141
0
        WOLFSSL_MSG("SendCertificateStatus bad args");
25142
0
        return BAD_FUNC_ARG;
25143
0
    }
25144
25145
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST
25146
    status_type = ssl->status_request;
25147
#endif
25148
25149
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
25150
    status_type = status_type ? status_type : ssl->status_request_v2;
25151
#endif
25152
25153
#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) && \
25154
    (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \
25155
    defined(WOLFSSL_HAPROXY))
25156
    if (SSL_CM(ssl)->ocsp_stapling != NULL &&
25157
            SSL_CM(ssl)->ocsp_stapling->statusCb != NULL) {
25158
        if (ssl->status_request == WOLFSSL_CSR_OCSP)
25159
            return BuildCertificateStatusWithStatusCB(ssl);
25160
    }
25161
#endif
25162
25163
0
    switch (status_type) {
25164
25165
0
    #ifndef NO_WOLFSSL_SERVER
25166
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
25167
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
25168
        /* case WOLFSSL_CSR_OCSP: */
25169
        case WOLFSSL_CSR2_OCSP:
25170
        {
25171
            OcspRequest* request = ssl->ctx->certOcspRequest;
25172
            buffer response;
25173
25174
            ret = CreateOcspResponse(ssl, &request, &response);
25175
25176
            /* if a request was successfully created and not stored in
25177
             * ssl->ctx then free it */
25178
            if (ret == 0 && request != ssl->ctx->certOcspRequest) {
25179
                FreeOcspRequest(request);
25180
                XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
25181
                request = NULL;
25182
            }
25183
25184
            if (ret == 0 && response.buffer) {
25185
                ret = BuildCertificateStatus(ssl, status_type, &response, 1);
25186
            }
25187
25188
            /* Let's not error out the connection if we can't verify our cert */
25189
            if (ret == WC_NO_ERR_TRACE(ASN_SELF_SIGNED_E) ||
25190
                ret == WC_NO_ERR_TRACE(ASN_NO_SIGNER_E))
25191
                ret = 0;
25192
25193
            if (response.buffer) {
25194
                XFREE(response.buffer, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
25195
                response.buffer = NULL;
25196
            }
25197
            break;
25198
        }
25199
25200
    #endif /* HAVE_CERTIFICATE_STATUS_REQUEST    */
25201
           /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
25202
25203
    #if defined HAVE_CERTIFICATE_STATUS_REQUEST_V2
25204
        case WOLFSSL_CSR2_OCSP_MULTI:
25205
        {
25206
            OcspRequest* request = ssl->ctx->certOcspRequest;
25207
            buffer responses[1 + MAX_CHAIN_DEPTH];
25208
            byte ctxOwnsRequest = 0;
25209
            int i = 0;
25210
25211
            XMEMSET(responses, 0, sizeof(responses));
25212
25213
            ret = CreateOcspResponse(ssl, &request, &responses[0]);
25214
25215
            /* if a request was successfully created and not stored in
25216
             * ssl->ctx then free it */
25217
            if (ret == 0 && request != ssl->ctx->certOcspRequest) {
25218
                FreeOcspRequest(request);
25219
                XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
25220
                request = NULL;
25221
            }
25222
25223
            if (ret == 0 && (!ssl->ctx->chainOcspRequest[0]
25224
                                              || ssl->buffers.weOwnCertChain)) {
25225
                buffer der;
25226
                word32 idx = 0;
25227
            #ifdef WOLFSSL_SMALL_STACK
25228
                DecodedCert* cert;
25229
            #else
25230
                DecodedCert  cert[1];
25231
            #endif
25232
                DerBuffer* chain;
25233
25234
            #ifdef WOLFSSL_SMALL_STACK
25235
                cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
25236
                                                            DYNAMIC_TYPE_DCERT);
25237
                if (cert == NULL)
25238
                    return MEMORY_E;
25239
            #endif
25240
                request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
25241
                                                     DYNAMIC_TYPE_OCSP_REQUEST);
25242
                if (request == NULL) {
25243
            #ifdef WOLFSSL_SMALL_STACK
25244
                    XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
25245
            #endif
25246
                    return MEMORY_E;
25247
                }
25248
25249
                /* use certChain if available, otherwise use peer certificate */
25250
                chain = ssl->buffers.certChain;
25251
                if (chain == NULL) {
25252
                    chain = ssl->buffers.certificate;
25253
                }
25254
25255
                if (chain && chain->buffer) {
25256
                    while (idx + OPAQUE24_LEN < chain->length) {
25257
                        c24to32(chain->buffer + idx, &der.length);
25258
                        idx += OPAQUE24_LEN;
25259
25260
                        der.buffer = chain->buffer + idx;
25261
                        idx += der.length;
25262
25263
                        if (idx > chain->length)
25264
                            break;
25265
                        ret = CreateOcspRequest(ssl, request, cert, der.buffer,
25266
                                                der.length, &ctxOwnsRequest);
25267
                        if (ret == 0) {
25268
                            request->ssl = ssl;
25269
                        ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
25270
                                        request, &responses[i + 1], ssl->heap);
25271
25272
                            /* Suppressing, not critical */
25273
                            if (ret == WC_NO_ERR_TRACE(OCSP_CERT_REVOKED) ||
25274
                                ret == WC_NO_ERR_TRACE(OCSP_CERT_UNKNOWN) ||
25275
                                ret == WC_NO_ERR_TRACE(OCSP_LOOKUP_FAIL)) {
25276
                                ret = 0;
25277
                            }
25278
25279
25280
                            i++;
25281
                            if (!ctxOwnsRequest)
25282
                                FreeOcspRequest(request);
25283
                        }
25284
                    }
25285
                }
25286
                if (!ctxOwnsRequest)
25287
                    XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
25288
            #ifdef WOLFSSL_SMALL_STACK
25289
                XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
25290
            #endif
25291
            }
25292
            else {
25293
                while (ret == 0 &&
25294
                            NULL != (request = ssl->ctx->chainOcspRequest[i])) {
25295
                    request->ssl = ssl;
25296
                    ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
25297
                                           request, &responses[++i], ssl->heap);
25298
25299
                    /* Suppressing, not critical */
25300
                    if (ret == WC_NO_ERR_TRACE(OCSP_CERT_REVOKED) ||
25301
                        ret == WC_NO_ERR_TRACE(OCSP_CERT_UNKNOWN) ||
25302
                        ret == WC_NO_ERR_TRACE(OCSP_LOOKUP_FAIL)) {
25303
                        ret = 0;
25304
                    }
25305
                }
25306
            }
25307
25308
            if (responses[0].buffer) {
25309
                if (ret == 0) {
25310
                    ret = BuildCertificateStatus(ssl, status_type, responses,
25311
                                                                   (byte)i + 1);
25312
                }
25313
25314
                for (i = 0; i < 1 + MAX_CHAIN_DEPTH; i++) {
25315
                    if (responses[i].buffer) {
25316
                        XFREE(responses[i].buffer, ssl->heap,
25317
                                                     DYNAMIC_TYPE_OCSP_REQUEST);
25318
                    }
25319
                }
25320
            }
25321
25322
            /* Let's not error out the connection if we can't verify our cert */
25323
            if (ret == WC_NO_ERR_TRACE(ASN_SELF_SIGNED_E) ||
25324
                ret == WC_NO_ERR_TRACE(ASN_NO_SIGNER_E))
25325
                ret = 0;
25326
25327
            break;
25328
        }
25329
    #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
25330
0
    #endif /* NO_WOLFSSL_SERVER */
25331
25332
0
        default:
25333
0
            break;
25334
0
    }
25335
25336
0
    WOLFSSL_LEAVE("SendCertificateStatus", ret);
25337
0
    WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_SEND);
25338
25339
0
    return ret;
25340
0
}
25341
25342
#endif /* !NO_CERTS */
25343
25344
#endif /* WOLFSSL_NO_TLS12 */
25345
25346
25347
25348
#if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
25349
/**
25350
 * Check if the SCR keys are set in ssl->secure_renegotiation->tmp_keys.
25351
 */
25352
int DtlsSCRKeysSet(WOLFSSL* ssl)
25353
{
25354
    return ssl->secure_renegotiation &&
25355
           ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0;
25356
}
25357
25358
/**
25359
 * ssl->keys contains the current cipher parameters only for epoch 1. For
25360
 * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
25361
 * cipher parameters. This function checks if the message currently being
25362
 * processed should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
25363
 */
25364
int IsDtlsMsgSCRKeys(WOLFSSL* ssl)
25365
{
25366
    return DtlsSCRKeysSet(ssl) &&
25367
           ssl->keys.curEpoch ==
25368
                   ssl->secure_renegotiation->tmp_keys.dtls_epoch;
25369
}
25370
25371
/**
25372
 * ssl->keys contains the current cipher parameters only for epoch 1. For
25373
 * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
25374
 * cipher parameters. This function checks if the message currently being
25375
 * built should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
25376
 */
25377
int DtlsUseSCRKeys(WOLFSSL* ssl)
25378
{
25379
    return DtlsSCRKeysSet(ssl) &&
25380
           ssl->secure_renegotiation->tmp_keys.dtls_epoch ==
25381
                   ssl->keys.dtls_epoch;
25382
}
25383
25384
/**
25385
 * If ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch
25386
 * then PREV_ORDER refers to the current epoch.
25387
 * */
25388
int DtlsCheckOrder(WOLFSSL* ssl, int order)
25389
{
25390
    if (order == PREV_ORDER && ssl->secure_renegotiation &&
25391
            ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch) {
25392
        return CUR_ORDER;
25393
    }
25394
    else {
25395
        return order;
25396
    }
25397
}
25398
#endif /* HAVE_SECURE_RENEGOTIATION && WOLFSSL_DTLS */
25399
25400
/* If secure renegotiation is disabled, this will always return false.
25401
 * Otherwise it checks to see if we are currently renegotiating. */
25402
int IsSCR(WOLFSSL* ssl)
25403
{
25404
#ifndef HAVE_SECURE_RENEGOTIATION
25405
    (void)ssl;
25406
#else /* HAVE_SECURE_RENEGOTIATION */
25407
    if (ssl->secure_renegotiation &&
25408
            ssl->secure_renegotiation->enabled &&  /* Is SCR enabled? */
25409
            ssl->options.handShakeDone && /* At least one handshake done? */
25410
            ssl->options.handShakeState != HANDSHAKE_DONE) /* Currently handshaking? */
25411
        return 1;
25412
#endif /* HAVE_SECURE_RENEGOTIATION */
25413
    return 0;
25414
}
25415
25416
25417
#ifdef WOLFSSL_DTLS
25418
static int ModifyForMTU(WOLFSSL* ssl, int buffSz, int outputSz, int mtuSz)
25419
{
25420
    int recordExtra = outputSz - buffSz;
25421
25422
    (void)ssl;
25423
25424
    if (recordExtra > 0 && outputSz > mtuSz) {
25425
        buffSz = mtuSz - recordExtra;
25426
#ifndef WOLFSSL_AEAD_ONLY
25427
        /* Subtract a block size to be certain that returned fragment
25428
         * size won't get more padding. */
25429
        if (ssl->specs.cipher_type == block)
25430
            buffSz -= ssl->specs.block_size;
25431
#endif
25432
    }
25433
25434
    return buffSz;
25435
}
25436
#endif /* WOLFSSL_DTLS */
25437
25438
#if !defined(NO_TLS) && defined(WOLFSSL_TLS13) && \
25439
    !defined(WOLFSSL_TLS13_IGNORE_AEAD_LIMITS)
25440
/*
25441
 * Enforce limits specified in
25442
 * https://www.rfc-editor.org/rfc/rfc8446#section-5.5
25443
 */
25444
static int CheckTLS13AEADSendLimit(WOLFSSL* ssl)
25445
0
{
25446
0
    w64wrapper seq;
25447
0
    w64wrapper limit;
25448
25449
0
    switch (ssl->specs.bulk_cipher_algorithm) {
25450
0
#ifdef BUILD_AESGCM
25451
0
        case wolfssl_aes_gcm:
25452
            /* Limit is 2^24.5 */
25453
0
            limit = AEAD_AES_LIMIT;
25454
0
            break;
25455
0
#endif
25456
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
25457
0
        case wolfssl_chacha:
25458
            /* For ChaCha20/Poly1305, the record sequence number would wrap
25459
             * before the safety limit is reached. */
25460
0
            return 0;
25461
0
#endif
25462
0
#ifdef HAVE_AESCCM
25463
0
        case wolfssl_aes_ccm:
25464
            /* Use the limits calculated in the DTLS 1.3 spec
25465
             * https://www.rfc-editor.org/rfc/rfc9147.html#name-analysis-of-limits-on-ccm-u */
25466
#ifdef WOLFSSL_DTLS13
25467
            if (ssl->options.dtls)
25468
                limit = DTLS_AEAD_AES_CCM_LIMIT; /* Limit is 2^23 */
25469
            else
25470
#endif
25471
0
                limit = AEAD_AES_LIMIT; /* Limit is 2^24.5 */
25472
0
            break;
25473
0
#endif
25474
0
#ifdef WOLFSSL_SM4_GCM
25475
0
        case wolfssl_sm4_gcm:
25476
            /* Limit is 2^22 - 1 */
25477
0
            limit = AEAD_SM4_GCM_LIMIT;
25478
0
            break;
25479
0
#endif
25480
0
#ifdef WOLFSSL_SM4_CCM
25481
0
        case wolfssl_sm4_ccm:
25482
            /* Limit is 2^10 - 1 */
25483
0
            limit = AEAD_SM4_CCM_LIMIT;
25484
0
            break;
25485
0
#endif
25486
0
        case wolfssl_cipher_null:
25487
            /* No encryption being done */
25488
0
            return 0;
25489
0
        default:
25490
0
            WOLFSSL_MSG("Unrecognized ciphersuite for AEAD limit check");
25491
0
            return BAD_STATE_E;
25492
25493
0
    }
25494
#ifdef WOLFSSL_DTLS13
25495
    if (ssl->options.dtls) {
25496
        seq = ssl->dtls13EncryptEpoch->nextSeqNumber;
25497
    }
25498
    else
25499
#endif
25500
0
    {
25501
0
        seq = w64From32(ssl->keys.sequence_number_hi,
25502
0
                ssl->keys.sequence_number_lo);
25503
0
    }
25504
25505
0
    if (w64GTE(seq, limit)) { /* cppcheck-suppress uninitvar
25506
                               * (false positive from cppcheck-2.13.0)
25507
                               */
25508
0
        return Tls13UpdateKeys(ssl); /* Need to generate new keys */
25509
0
    }
25510
25511
0
    return 0;
25512
0
}
25513
#endif /* WOLFSSL_TLS13 && !WOLFSSL_TLS13_IGNORE_AEAD_LIMITS */
25514
25515
#ifdef WOLFSSL_THREADED_CRYPT
25516
int SendAsyncData(WOLFSSL* ssl)
25517
{
25518
    int i;
25519
25520
    for (i = 0; i < WOLFSSL_THREADED_CRYPT_CNT; i++) {
25521
        ThreadCrypt* encrypt = &ssl->buffers.encrypt[i];
25522
25523
        if (encrypt->done) {
25524
            int error;
25525
25526
            GrowOutputBuffer(ssl, encrypt->buffer.length);
25527
            XMEMCPY(ssl->buffers.outputBuffer.buffer, encrypt->buffer.buffer,
25528
                encrypt->buffer.length);
25529
            ssl->buffers.outputBuffer.length = encrypt->buffer.length;
25530
            ssl->buffers.outputBuffer.idx = 0;
25531
            encrypt->done = 0;
25532
            encrypt->avail = 1;
25533
            if ((error = SendBuffered(ssl)) < 0) {
25534
                ssl->error = error;
25535
                WOLFSSL_ERROR(ssl->error);
25536
                /* store for next call if WANT_WRITE or user embedSend() that
25537
                   doesn't present like WANT_WRITE */
25538
                ssl->buffers.plainSz  = encrypt->buffer.length;
25539
                ssl->buffers.prevSent = encrypt->buffer.length;
25540
                if (ssl->error == WC_NO_ERR_TRACE(SOCKET_ERROR_E) &&
25541
                        (ssl->options.connReset || ssl->options.isClosed)) {
25542
                    return SOCKET_PEER_CLOSED_E;  /* peer reset or closed */
25543
                }
25544
                return ssl->error;
25545
            }
25546
25547
            /* only one message per attempt */
25548
            if (ssl->options.partialWrite == 1) {
25549
                WOLFSSL_MSG("Partial Write on, only sending one record");
25550
                break;
25551
            }
25552
        }
25553
    }
25554
25555
    return 0;
25556
}
25557
#endif
25558
25559
#ifndef NO_TLS
25560
25561
/**
25562
 * ssl_in_handshake():
25563
 * Invoked in wolfSSL_read/wolfSSL_write to check if wolfSSL_negotiate() is
25564
 * needed in the handshake.
25565
 *
25566
 * In TLSv1.2 negotiate until the end of the handshake, unless:
25567
 * 1 in SCR and sending data or
25568
 * 2 in SCR and we have plain data ready
25569
 * Early data logic may bypass this logic in TLSv1.3 when appropriate.
25570
 */
25571
static int ssl_in_handshake(WOLFSSL *ssl, int sending_data)
25572
229
{
25573
229
int SendAsyncData = 1;
25574
229
(void)SendAsyncData;
25575
229
    if (IsSCR(ssl)) {
25576
0
        if (sending_data) {
25577
            /* allow sending data in SCR */
25578
0
            return 0;
25579
0
        } else {
25580
            /* allow reading buffered data in SCR */
25581
0
            if (ssl->buffers.clearOutputBuffer.length != 0)
25582
0
                return 0;
25583
0
        }
25584
0
        return 1;
25585
0
    }
25586
25587
229
    if (ssl->options.handShakeState != HANDSHAKE_DONE)
25588
229
        return 1;
25589
25590
0
    if (ssl->options.side == WOLFSSL_SERVER_END) {
25591
0
        if (IsAtLeastTLSv1_3(ssl->version))
25592
0
            return ssl->options.acceptState < TLS13_TICKET_SENT;
25593
0
        if (IsAtLeastTLSv1_2(ssl))
25594
0
            return ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE;
25595
0
        return 0;
25596
0
    }
25597
25598
0
    if (ssl->options.side == WOLFSSL_CLIENT_END) {
25599
0
        if (IsAtLeastTLSv1_3(ssl->version))
25600
0
            return ssl->options.connectState < FINISHED_DONE;
25601
0
        if (IsAtLeastTLSv1_2(ssl))
25602
0
            return ssl->options.connectState < SECOND_REPLY_DONE;
25603
0
        return 0;
25604
0
    }
25605
25606
0
    return 0;
25607
0
}
25608
25609
int SendData(WOLFSSL* ssl, const void* data, size_t sz)
25610
0
{
25611
0
    word32 sent = 0; /* plainText size */
25612
0
    int sendSz,
25613
0
        ret;
25614
#if defined(WOLFSSL_EARLY_DATA) && defined(WOLFSSL_EARLY_DATA_GROUP)
25615
    int groupMsgs = 0;
25616
#endif
25617
0
    int error = ssl->error;
25618
25619
0
    if (sz > INT_MAX) {
25620
0
        WOLFSSL_MSG("SendData sz overflow");
25621
0
        return WOLFSSL_FATAL_ERROR;
25622
0
    }
25623
25624
0
    if (error == WC_NO_ERR_TRACE(WANT_WRITE)
25625
    #ifdef WOLFSSL_ASYNC_CRYPT
25626
        || error == WC_NO_ERR_TRACE(WC_PENDING_E)
25627
    #endif
25628
0
    ) {
25629
0
        error = 0;
25630
0
        ssl->error = 0;
25631
0
    }
25632
25633
    /* don't allow write after decrypt or mac error */
25634
0
    if (error == WC_NO_ERR_TRACE(VERIFY_MAC_ERROR) ||
25635
0
        error == WC_NO_ERR_TRACE(DECRYPT_ERROR)) {
25636
        /* For DTLS allow these possible errors and allow the session
25637
            to continue despite them */
25638
0
        if (ssl->options.dtls) {
25639
0
            ssl->error = 0;
25640
0
        }
25641
0
        else {
25642
0
            WOLFSSL_MSG("Not allowing write after decrypt or mac error");
25643
0
            return WOLFSSL_FATAL_ERROR;
25644
0
        }
25645
0
    }
25646
25647
#ifdef WOLFSSL_EARLY_DATA
25648
    if (ssl->options.side == WOLFSSL_CLIENT_END &&
25649
            ssl->earlyData != no_early_data &&
25650
            ssl->earlyData != done_early_data) {
25651
        if (ssl->options.handShakeState == HANDSHAKE_DONE) {
25652
            WOLFSSL_MSG("handshake complete, trying to send early data");
25653
            ssl->error = BUILD_MSG_ERROR;
25654
            return WOLFSSL_FATAL_ERROR;
25655
        }
25656
    #ifdef WOLFSSL_EARLY_DATA_GROUP
25657
        groupMsgs = 1;
25658
    #endif
25659
    }
25660
    else
25661
#endif
25662
0
    if (IsAtLeastTLSv1_3(ssl->version) &&
25663
0
            ssl->options.side == WOLFSSL_SERVER_END &&
25664
0
            ssl->options.acceptState >= TLS13_ACCEPT_FINISHED_SENT) {
25665
        /* We can send data without waiting on peer finished msg */
25666
0
        WOLFSSL_MSG("server sending data before receiving client finished");
25667
0
    }
25668
0
    else if (ssl_in_handshake(ssl, 1)) {
25669
0
        int err;
25670
0
        WOLFSSL_MSG("handshake not complete, trying to finish");
25671
0
        if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
25672
        #ifdef WOLFSSL_ASYNC_CRYPT
25673
            /* if async would block return WANT_WRITE */
25674
            if (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E)) {
25675
                return WOLFSSL_CBIO_ERR_WANT_WRITE;
25676
            }
25677
        #endif
25678
0
            return err;
25679
0
        }
25680
0
    }
25681
25682
#ifdef WOLFSSL_RW_THREADED
25683
#ifdef WOLFSSL_DTLS13
25684
    if (ssl->options.dtls) {
25685
        /* Dtls13DoScheduledWork(ssl) may return WANT_WRITE */
25686
        if ((error = Dtls13DoScheduledWork(ssl)) < 0) {
25687
            ssl->error = error;
25688
            WOLFSSL_ERROR(error);
25689
            return error;
25690
        }
25691
    }
25692
#endif /* WOLFSSL_DTLS13 */
25693
#ifdef WOLFSSL_TLS13
25694
    if (ssl->options.sendKeyUpdate) {
25695
        ssl->options.sendKeyUpdate = 0;
25696
        ret = SendTls13KeyUpdate(ssl);
25697
        if (ret != 0) {
25698
            ssl->error = BUILD_MSG_ERROR;
25699
            return WOLFSSL_FATAL_ERROR;
25700
        }
25701
    }
25702
#endif
25703
#endif
25704
25705
    /* last time system socket output buffer was full, try again to send */
25706
0
    if (ssl->buffers.outputBuffer.length > 0
25707
    #if defined(WOLFSSL_EARLY_DATA) && defined(WOLFSSL_EARLY_DATA_GROUP)
25708
        && !groupMsgs
25709
    #endif
25710
0
        ) {
25711
0
        WOLFSSL_MSG("output buffer was full, trying to send again");
25712
0
        if ( (error = SendBuffered(ssl)) < 0) {
25713
0
            WOLFSSL_ERROR(error);
25714
0
            if (error == WC_NO_ERR_TRACE(SOCKET_ERROR_E) &&
25715
0
                    (ssl->options.connReset || ssl->options.isClosed)) {
25716
0
                error = SOCKET_PEER_CLOSED_E;
25717
0
                ssl->error = error;
25718
0
                WOLFSSL_ERROR(error);
25719
0
                return 0;  /* peer reset or closed */
25720
0
            }
25721
0
            return (ssl->error = error);
25722
0
        }
25723
0
        else {
25724
            /* advance sent to previous sent + plain size just sent */
25725
0
            sent = ssl->buffers.prevSent + ssl->buffers.plainSz;
25726
0
            WOLFSSL_MSG("sent write buffered data");
25727
25728
0
            if (sent > (word32)sz) {
25729
0
                WOLFSSL_MSG("error: write() after WANT_WRITE with short size");
25730
0
                return (ssl->error = BAD_FUNC_ARG);
25731
0
            }
25732
0
        }
25733
0
    }
25734
25735
0
    ret = RetrySendAlert(ssl);
25736
0
    if (ret != 0) {
25737
0
        ssl->error = ret;
25738
0
        return WOLFSSL_FATAL_ERROR;
25739
0
    }
25740
25741
#ifdef WOLFSSL_THREADED_CRYPT
25742
    ret = SendAsyncData(ssl);
25743
    if (ret != 0) {
25744
        ssl->error = ret;
25745
        return WOLFSSL_FATAL_ERROR;
25746
    }
25747
    if (ssl->dtls13WaitKeyUpdateAck) {
25748
        ret = DoDtls13KeyUpdateAck(ssl);
25749
        if (ret != 0)
25750
            return ret;
25751
    }
25752
#endif
25753
25754
0
    for (;;) {
25755
0
        byte* out;
25756
0
        byte* sendBuffer = (byte*)data + sent;  /* may switch on comp */
25757
0
        int   buffSz;                           /* may switch on comp */
25758
0
        int   outputSz;
25759
#ifdef HAVE_LIBZ
25760
        byte  comp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
25761
#endif
25762
#ifdef WOLFSSL_THREADED_CRYPT
25763
        int i;
25764
        ThreadCrypt* encrypt = NULL;
25765
#endif
25766
25767
0
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_TLS13_IGNORE_AEAD_LIMITS)
25768
0
        if (IsAtLeastTLSv1_3(ssl->version)) {
25769
0
            ret = CheckTLS13AEADSendLimit(ssl);
25770
0
            if (ret != 0) {
25771
0
                ssl->error = ret;
25772
0
                return WOLFSSL_FATAL_ERROR;
25773
0
            }
25774
0
        }
25775
0
#endif
25776
25777
#ifdef WOLFSSL_DTLS13
25778
        if (ssl->options.dtls && ssl->options.tls1_3) {
25779
            byte isEarlyData = 0;
25780
25781
            if (ssl->dtls13EncryptEpoch == NULL)
25782
                return ssl->error = BAD_STATE_E;
25783
25784
#ifdef WOLFSSL_EARLY_DATA
25785
            isEarlyData = ssl->options.side == WOLFSSL_CLIENT_END &&
25786
                    ssl->earlyData != no_early_data &&
25787
                    ssl->earlyData != done_early_data;
25788
#endif
25789
25790
            if (isEarlyData) {
25791
#ifdef WOLFSSL_EARLY_DATA
25792
                ret = Dtls13SetEpochKeys(ssl,
25793
                    w64From32(0x0, DTLS13_EPOCH_EARLYDATA), ENCRYPT_SIDE_ONLY);
25794
                if (ret != 0) {
25795
                    WOLFSSL_MSG(
25796
                        "trying to send early data without epoch 1");
25797
                    ssl->error = BUILD_MSG_ERROR;
25798
                    return WOLFSSL_FATAL_ERROR;
25799
                }
25800
#endif /* WOLFSSL_EARLY_DATA */
25801
            }
25802
            else if (!w64Equal(
25803
                         ssl->dtls13EncryptEpoch->epochNumber,
25804
                         ssl->dtls13Epoch)) {
25805
                ret = Dtls13SetEpochKeys(
25806
                    ssl, ssl->dtls13Epoch, ENCRYPT_SIDE_ONLY);
25807
                if (ret != 0) {
25808
                    ssl->error = BUILD_MSG_ERROR;
25809
                    return WOLFSSL_FATAL_ERROR;
25810
                }
25811
            }
25812
        }
25813
#endif /* WOLFSSL_DTLS13 */
25814
25815
#ifdef WOLFSSL_DTLS
25816
        if (ssl->options.dtls) {
25817
            buffSz = wolfSSL_GetMaxFragSize(ssl, (word32)sz - sent);
25818
        }
25819
        else
25820
#endif
25821
0
        {
25822
0
            buffSz = wolfSSL_GetMaxFragSize(ssl, (word32)sz - sent);
25823
25824
0
        }
25825
25826
0
        if (sent == (word32)sz) break;
25827
25828
#if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_DTLS_SIZE_CHECK)
25829
        if (ssl->options.dtls && ((size_t)buffSz < (word32)sz - sent)) {
25830
            error = DTLS_SIZE_ERROR;
25831
            ssl->error = error;
25832
            WOLFSSL_ERROR(error);
25833
            return error;
25834
        }
25835
#endif
25836
0
        outputSz = buffSz + COMP_EXTRA + DTLS_RECORD_HEADER_SZ;
25837
0
        if (IsEncryptionOn(ssl, 1) || ssl->options.tls1_3)
25838
0
            outputSz += cipherExtraData(ssl);
25839
25840
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
25841
        if (ssl->options.dtls) {
25842
            byte cidSz = 0;
25843
            if ((cidSz = DtlsGetCidTxSize(ssl)) > 0)
25844
                outputSz += cidSz + 1; /* +1 for inner content type */
25845
        }
25846
#endif
25847
25848
        /* check for available size */
25849
0
        if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
25850
0
            return (ssl->error = ret);
25851
25852
        /* get output buffer */
25853
0
#ifndef WOLFSSL_THREADED_CRYPT
25854
0
        out = GetOutputBuffer(ssl);
25855
#else
25856
        do {
25857
            for (i = 0; i < WOLFSSL_THREADED_CRYPT_CNT; i++) {
25858
                if (ssl->buffers.encrypt[i].avail) {
25859
                    encrypt = &ssl->buffers.encrypt[i];
25860
                    break;
25861
                }
25862
            }
25863
            if (encrypt == NULL) {
25864
                ret = SendAsyncData(ssl);
25865
                if (ret != 0) {
25866
                    ssl->error = ret;
25867
                    return WOLFSSL_FATAL_ERROR;
25868
                }
25869
            }
25870
        }
25871
        while (encrypt == NULL);
25872
        encrypt->done = 0;
25873
        encrypt->avail = 0;
25874
        GrowAnOutputBuffer(ssl, &encrypt->buffer, outputSz);
25875
        out = encrypt->buffer.buffer;
25876
#endif
25877
25878
#ifdef HAVE_LIBZ
25879
        if (ssl->options.usingCompression) {
25880
            buffSz = myCompress(ssl, sendBuffer, buffSz, comp, sizeof(comp));
25881
            if (buffSz < 0) {
25882
                return buffSz;
25883
            }
25884
            sendBuffer = comp;
25885
        }
25886
#endif
25887
0
        if (!ssl->options.tls1_3) {
25888
#ifdef WOLFSSL_ASYNC_CRYPT
25889
            if (ssl->async == NULL) {
25890
                ssl->async = (struct WOLFSSL_ASYNC*)
25891
                        XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
25892
                                DYNAMIC_TYPE_ASYNC);
25893
                if (ssl->async == NULL)
25894
                    return MEMORY_E;
25895
                ssl->async->freeArgs = NULL;
25896
            }
25897
#endif
25898
0
            sendSz = BuildMessage(ssl, out, outputSz, sendBuffer, buffSz,
25899
0
                                  application_data, 0, 0, 1, CUR_ORDER);
25900
0
        }
25901
0
        else {
25902
0
#ifdef WOLFSSL_TLS13
25903
0
            sendSz = BuildTls13Message(ssl, out, outputSz, sendBuffer, buffSz,
25904
0
                                       application_data, 0, 0, 1);
25905
#else
25906
            sendSz = BUFFER_ERROR;
25907
#endif
25908
0
        }
25909
0
        if (sendSz < 0) {
25910
        #ifdef WOLFSSL_ASYNC_CRYPT
25911
            if (sendSz == WC_NO_ERR_TRACE(WC_PENDING_E))
25912
                ssl->error = sendSz;
25913
        #endif
25914
0
            return BUILD_MSG_ERROR;
25915
0
        }
25916
25917
#ifdef WOLFSSL_ASYNC_CRYPT
25918
        FreeAsyncCtx(ssl, 0);
25919
#endif
25920
#ifdef WOLFSSL_THREADED_CRYPT
25921
        if (!encrypt->init) {
25922
            SetKeys(&encrypt->encrypt, NULL, &ssl->keys, &ssl->specs,
25923
                ssl->options.side, ssl->heap, ssl->devId, ssl->rng,
25924
                ssl->options.tls1_3);
25925
            encrypt->init = 1;
25926
        }
25927
        encrypt->buffer.length = sendSz;
25928
        encrypt->offset = RECORD_HEADER_SZ;
25929
        if (ssl->options.dtls) {
25930
            encrypt->offset += DTLS_RECORD_EXTRA;
25931
        }
25932
        encrypt->cryptLen = outputSz - encrypt->offset;
25933
    #ifdef HAVE_TRUNCATED_HMAC
25934
        if (ssl->truncated_hmac) {
25935
            encrypt->cryptLen -= min(TRUNCATED_HMAC_SZ, ssl->specs.hash_size);
25936
        }
25937
        else
25938
    #endif
25939
        {
25940
            encrypt->cryptLen -= ssl->specs.hash_size;
25941
        }
25942
25943
#if !defined(NO_PUBLIC_GCM_SET_IV) && \
25944
    ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
25945
    (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
25946
        XMEMCPY(encrypt->nonce, ssl->keys.aead_enc_imp_IV, AESGCM_IMP_IV_SZ);
25947
        XMEMCPY(encrypt->nonce + AESGCM_IMP_IV_SZ, ssl->keys.aead_exp_IV,
25948
            AESGCM_EXP_IV_SZ);
25949
#endif
25950
        XMEMSET(encrypt->additional, 0, AEAD_AUTH_DATA_SZ);
25951
        WriteSEQ(ssl, CUR_ORDER, encrypt->additional);
25952
        XMEMCPY(encrypt->additional + AEAD_TYPE_OFFSET, encrypt->buffer.buffer,
25953
            3);
25954
        c16toa(sendSz - encrypt->offset - AESGCM_EXP_IV_SZ -
25955
            ssl->specs.aead_mac_size, encrypt->additional + AEAD_LEN_OFFSET);
25956
25957
    #ifdef WOLFSSL_DTLS
25958
        if (ssl->options.dtls)
25959
            DtlsSEQIncrement(ssl, CUR_ORDER);
25960
    #endif
25961
25962
        if (encrypt->signal != NULL) {
25963
            encrypt->signal(encrypt->signalCtx, ssl);
25964
        }
25965
        return sendSz;
25966
#else
25967
0
        ssl->buffers.outputBuffer.length += (word32)sendSz;
25968
25969
0
        if ( (error = SendBuffered(ssl)) < 0) {
25970
0
            ssl->error = error;
25971
0
            WOLFSSL_ERROR(error);
25972
            /* store for next call if WANT_WRITE or user embedSend() that
25973
               doesn't present like WANT_WRITE */
25974
0
            ssl->buffers.plainSz  = buffSz;
25975
0
            ssl->buffers.prevSent = sent;
25976
0
            if (error == WC_NO_ERR_TRACE(SOCKET_ERROR_E) &&
25977
0
                    (ssl->options.connReset || ssl->options.isClosed)) {
25978
0
                error = SOCKET_PEER_CLOSED_E;
25979
0
                ssl->error = SOCKET_PEER_CLOSED_E;
25980
0
                WOLFSSL_ERROR(error);
25981
0
                return 0;  /* peer reset or closed */
25982
0
            }
25983
0
            return error;
25984
0
        }
25985
0
        else {
25986
0
            ssl->error = 0; /* Clear any previous errors */
25987
0
        }
25988
25989
0
        sent += buffSz;
25990
25991
        /* only one message per attempt */
25992
0
        if (ssl->options.partialWrite == 1) {
25993
0
            WOLFSSL_MSG("Partial Write on, only sending one record");
25994
0
            break;
25995
0
        }
25996
0
#endif
25997
0
    }
25998
25999
0
    return sent;
26000
0
}
26001
26002
/* process input data */
26003
int ReceiveData(WOLFSSL* ssl, byte* output, size_t sz, int peek)
26004
0
{
26005
0
    int size;
26006
0
    int error = ssl->error;
26007
26008
0
    WOLFSSL_ENTER("ReceiveData");
26009
26010
0
    if (sz > INT_MAX) {
26011
0
        WOLFSSL_MSG("ReceiveData sz overflow");
26012
0
        return WOLFSSL_FATAL_ERROR;
26013
0
    }
26014
26015
    /* reset error state */
26016
0
    if (error == WC_NO_ERR_TRACE(WANT_READ) ||
26017
0
        error == WOLFSSL_ERROR_WANT_READ) {
26018
0
        error = 0;
26019
0
        ssl->error = 0;
26020
0
    }
26021
26022
#ifdef WOLFSSL_DTLS
26023
    if (ssl->options.dtls) {
26024
        /* In DTLS mode, we forgive some errors and allow the session
26025
         * to continue despite them. */
26026
        if (error == WC_NO_ERR_TRACE(VERIFY_MAC_ERROR) ||
26027
            error == WC_NO_ERR_TRACE(DECRYPT_ERROR) ||
26028
            error == WC_NO_ERR_TRACE(DTLS_SIZE_ERROR)) {
26029
26030
            error = 0;
26031
            ssl->error = 0;
26032
        }
26033
    }
26034
#endif /* WOLFSSL_DTLS */
26035
26036
0
    if (error != 0 && error != WC_NO_ERR_TRACE(WANT_WRITE)
26037
#ifdef WOLFSSL_ASYNC_CRYPT
26038
            && error != WC_NO_ERR_TRACE(WC_PENDING_E)
26039
#endif
26040
#if defined(HAVE_SECURE_RENEGOTIATION) || defined(WOLFSSL_DTLS13)
26041
            && error != WC_NO_ERR_TRACE(APP_DATA_READY)
26042
#endif
26043
0
    ) {
26044
0
        WOLFSSL_MSG("User calling wolfSSL_read in error state, not allowed");
26045
0
        return error;
26046
0
    }
26047
26048
#ifdef WOLFSSL_EARLY_DATA
26049
    if (ssl->options.side == WOLFSSL_SERVER_END &&
26050
          ssl->earlyData > early_data_ext && ssl->earlyData < done_early_data) {
26051
    }
26052
    else
26053
#endif
26054
0
    {
26055
0
        if (ssl_in_handshake(ssl, 0)) {
26056
0
            int err;
26057
0
            WOLFSSL_MSG("Handshake not complete, trying to finish");
26058
0
            if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
26059
            #ifdef WOLFSSL_ASYNC_CRYPT
26060
                /* if async would block return WANT_WRITE */
26061
                if (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E)) {
26062
                    return WOLFSSL_CBIO_ERR_WANT_READ;
26063
                }
26064
            #endif
26065
0
                return err;
26066
0
            }
26067
0
        }
26068
0
    }
26069
26070
#ifdef HAVE_SECURE_RENEGOTIATION
26071
startScr:
26072
    if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
26073
        int ret;
26074
        WOLFSSL_MSG("Need to start scr, server requested");
26075
        ret = wolfSSL_Rehandshake(ssl);
26076
        ssl->secure_renegotiation->startScr = 0;  /* only start once */
26077
        if (ret != WOLFSSL_SUCCESS)
26078
            return ret;
26079
    }
26080
#endif
26081
26082
0
    while (ssl->buffers.clearOutputBuffer.length == 0) {
26083
0
        if ( (error = ProcessReply(ssl)) < 0) {
26084
0
            if (error == WC_NO_ERR_TRACE(ZERO_RETURN)) {
26085
0
                ssl->error = error;
26086
0
                WOLFSSL_MSG("Zero return, no more data coming");
26087
0
                return 0; /* no more data coming */
26088
0
            }
26089
0
            if (error == WC_NO_ERR_TRACE(SOCKET_ERROR_E)) {
26090
0
                if (ssl->options.connReset || ssl->options.isClosed) {
26091
0
                    WOLFSSL_MSG("Peer reset or closed, connection done");
26092
0
                    error = SOCKET_PEER_CLOSED_E;
26093
0
                    ssl->error = error;
26094
0
                    WOLFSSL_ERROR(error);
26095
0
                    return 0; /* peer reset or closed */
26096
0
                }
26097
0
            }
26098
0
            ssl->error = error;
26099
0
            WOLFSSL_ERROR(error);
26100
0
            return error;
26101
0
        }
26102
26103
0
#ifndef WOLFSSL_RW_THREADED
26104
    #ifdef WOLFSSL_DTLS13
26105
        if (ssl->options.dtls) {
26106
            /* Dtls13DoScheduledWork(ssl) may return WANT_WRITE */
26107
            if ((error = Dtls13DoScheduledWork(ssl)) < 0) {
26108
                ssl->error = error;
26109
                WOLFSSL_ERROR(error);
26110
                return error;
26111
            }
26112
        }
26113
    #endif /* WOLFSSL_DTLS13 */
26114
0
#endif
26115
26116
        #ifdef HAVE_SECURE_RENEGOTIATION
26117
            if (ssl->secure_renegotiation &&
26118
                ssl->secure_renegotiation->startScr) {
26119
                goto startScr;
26120
            }
26121
            if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
26122
                    ssl->options.handShakeState != HANDSHAKE_DONE
26123
                    && ssl->buffers.clearOutputBuffer.length == 0) {
26124
                /* ProcessReply processed a handshake packet and not any APP DATA
26125
                 * so let's move the handshake along */
26126
                int err;
26127
                WOLFSSL_MSG("Handshake not complete, trying to finish");
26128
                if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
26129
                #ifdef WOLFSSL_ASYNC_CRYPT
26130
                    /* if async would block return WANT_WRITE */
26131
                    if (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E)) {
26132
                        return WOLFSSL_CBIO_ERR_WANT_READ;
26133
                    }
26134
                #endif
26135
                    return err;
26136
                }
26137
            }
26138
        #endif
26139
26140
#ifdef WOLFSSL_DTLS13
26141
            /* if wolfSSL_Peek() is invoked with sz == 0 it will not block (but
26142
             *  it processes pending non-application records) */
26143
            if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version) && peek &&
26144
                sz == 0 && ssl->buffers.inputBuffer.idx
26145
                - ssl->buffers.inputBuffer.length  == 0) {
26146
                return 0;
26147
            }
26148
#endif /* WOLFSSL_DTLS13 */
26149
26150
0
#ifndef WOLFSSL_TLS13_NO_PEEK_HANDSHAKE_DONE
26151
0
    #ifdef WOLFSSL_TLS13
26152
0
        if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.handShakeDone &&
26153
0
                                         ssl->curRL.type == handshake && peek) {
26154
0
            WOLFSSL_MSG("Got Handshake Message in APP data");
26155
0
            if (ssl->buffers.inputBuffer.length == 0) {
26156
0
                ssl->error = WOLFSSL_ERROR_WANT_READ;
26157
0
                return 0;
26158
0
            }
26159
0
        }
26160
0
    #endif
26161
0
#endif
26162
0
    }
26163
26164
0
    size = (sz < (size_t)ssl->buffers.clearOutputBuffer.length) ?
26165
0
        (int)sz : (int)ssl->buffers.clearOutputBuffer.length;
26166
26167
0
    XMEMCPY(output, ssl->buffers.clearOutputBuffer.buffer, (size_t)(size));
26168
26169
0
    if (peek == 0) {
26170
0
        ssl->buffers.clearOutputBuffer.length -= (word32)size;
26171
0
        ssl->buffers.clearOutputBuffer.buffer += size;
26172
0
    }
26173
26174
0
    if (ssl->buffers.inputBuffer.dynamicFlag)
26175
0
       ShrinkInputBuffer(ssl, NO_FORCED_FREE);
26176
26177
0
    WOLFSSL_LEAVE("ReceiveData()", size);
26178
0
    return size;
26179
0
}
26180
26181
static int SendAlert_ex(WOLFSSL* ssl, int severity, int type)
26182
{
26183
    byte input[ALERT_SIZE];
26184
    byte *output;
26185
    int  sendSz;
26186
    int  ret;
26187
    int  outputSz;
26188
    int  dtlsExtra = 0;
26189
    const char* alert_str = NULL;
26190
26191
    WOLFSSL_ENTER("SendAlert");
26192
26193
    alert_str = AlertTypeToString(type);
26194
    if (alert_str != NULL)
26195
    {
26196
        WOLFSSL_MSG_EX("SendAlert: %d %s", type, alert_str);
26197
    }
26198
    else
26199
    {
26200
        WOLFSSL_MSG_EX("SendAlert: %d", type);
26201
    }
26202
26203
#ifdef WOLFSSL_QUIC
26204
    if (WOLFSSL_IS_QUIC(ssl)) {
26205
        ret = !ssl->quic.method->send_alert(ssl, ssl->quic.enc_level_write, (uint8_t)type);
26206
        if (ret) {
26207
            WOLFSSL_MSG("QUIC send_alert callback error");
26208
        }
26209
        return ret;
26210
    }
26211
#endif
26212
26213
#ifdef HAVE_WRITE_DUP
26214
    if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
26215
        int notifyErr = 0;
26216
26217
        WOLFSSL_MSG("Read dup side cannot write alerts, notifying sibling");
26218
26219
        if (type == close_notify) {
26220
            notifyErr = ZERO_RETURN;
26221
        } else if (severity == alert_fatal) {
26222
            notifyErr = FATAL_ERROR;
26223
        }
26224
26225
        if (notifyErr != 0) {
26226
            return NotifyWriteSide(ssl, notifyErr);
26227
        }
26228
26229
        return 0;
26230
    }
26231
#endif
26232
26233
    ssl->pendingAlert.code = type;
26234
    ssl->pendingAlert.level = severity;
26235
26236
   #ifdef OPENSSL_EXTRA
26237
        if (ssl->CBIS != NULL) {
26238
            ssl->CBIS(ssl, WOLFSSL_CB_ALERT, type);
26239
        }
26240
   #endif
26241
   #ifdef WOLFSSL_DTLS
26242
        if (ssl->options.dtls)
26243
           dtlsExtra = DTLS_RECORD_EXTRA;
26244
   #endif
26245
26246
    /* check for available size */
26247
    outputSz = ALERT_SIZE + MAX_MSG_EXTRA + dtlsExtra;
26248
    if ((ret = CheckAvailableSize(ssl, outputSz)) != 0) {
26249
#ifdef WOLFSSL_DTLS
26250
        /* If CheckAvailableSize returned WANT_WRITE due to a blocking write
26251
         * then discard pending output and just send the alert. */
26252
        if (ssl->options.dtls) {
26253
            if (ret != WC_NO_ERR_TRACE(WANT_WRITE) || severity != alert_fatal)
26254
                return ret;
26255
            ShrinkOutputBuffer(ssl);
26256
            if ((ret = CheckAvailableSize(ssl, outputSz)) != 0) {
26257
                return ret;
26258
            }
26259
        }
26260
        else {
26261
            return ret;
26262
        }
26263
#else
26264
        return ret;
26265
#endif
26266
    }
26267
26268
    /* Check output buffer */
26269
    if (ssl->buffers.outputBuffer.buffer == NULL)
26270
        return BUFFER_E;
26271
26272
    /* get output buffer */
26273
    output = GetOutputBuffer(ssl);
26274
    input[0] = (byte)severity;
26275
    input[1] = (byte)type;
26276
    ssl->alert_history.last_tx.code = type;
26277
    ssl->alert_history.last_tx.level = severity;
26278
    if (severity == alert_fatal) {
26279
#ifdef WOLFSSL_DTLS
26280
        /* Mark as closed in dtls only once we enter stateful mode. */
26281
        if (!ssl->options.dtls || ssl->options.dtlsStateful)
26282
#endif
26283
            ssl->options.isClosed = 1;  /* Don't send close_notify */
26284
    }
26285
26286
    /* send encrypted alert if encryption is on - can be a rehandshake over
26287
     * an existing encrypted channel.
26288
     * TLS 1.3 encrypts handshake packets after the ServerHello
26289
     */
26290
    if (IsEncryptionOn(ssl, 1)) {
26291
#ifdef WOLFSSL_DTLS13
26292
        if (ssl->options.dtls
26293
            && IsAtLeastTLSv1_3(ssl->version)
26294
            && !w64Equal(ssl->dtls13EncryptEpoch->epochNumber, ssl->dtls13Epoch)) {
26295
            ret = Dtls13SetEpochKeys(ssl, ssl->dtls13Epoch, ENCRYPT_SIDE_ONLY);
26296
            if (ret != 0)
26297
                return ret;
26298
        }
26299
#endif /* WOLFSSL_DTLS13 */
26300
26301
        sendSz = BuildMessage(ssl, output, outputSz, input, ALERT_SIZE, alert,
26302
                                                                       0, 0, 0, CUR_ORDER);
26303
    }
26304
    else {
26305
26306
#ifdef WOLFSSL_DTLS13
26307
        if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
26308
            ret = Dtls13RlAddPlaintextHeader(ssl, output, alert, ALERT_SIZE);
26309
            if (ret != 0)
26310
                return ret;
26311
        }
26312
        else
26313
#endif /* WOLFSSL_DTLS13 */
26314
            {
26315
                AddRecordHeader(output, ALERT_SIZE, alert, ssl, CUR_ORDER);
26316
#ifdef WOLFSSL_DTLS
26317
                /* AddRecordHeader doesn't increment the seq number */
26318
                if (ssl->options.dtls)
26319
                    DtlsSEQIncrement(ssl, CUR_ORDER);
26320
#endif
26321
            }
26322
26323
        output += RECORD_HEADER_SZ;
26324
        #ifdef WOLFSSL_DTLS
26325
            if (ssl->options.dtls)
26326
                output += DTLS_RECORD_EXTRA;
26327
        #endif
26328
        XMEMCPY(output, input, ALERT_SIZE);
26329
26330
        sendSz = RECORD_HEADER_SZ + ALERT_SIZE;
26331
        #ifdef WOLFSSL_DTLS
26332
            if (ssl->options.dtls)
26333
                sendSz += DTLS_RECORD_EXTRA;
26334
        #endif
26335
    }
26336
    if (sendSz < 0)
26337
        return BUILD_MSG_ERROR;
26338
26339
    #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
26340
        if (ssl->hsInfoOn)
26341
            AddPacketName(ssl, "Alert");
26342
        if (ssl->toInfoOn) {
26343
            ret = AddPacketInfo(ssl, "Alert", alert, output, sendSz,
26344
                    WRITE_PROTO, 0, ssl->heap);
26345
            if (ret != 0)
26346
                return ret;
26347
        }
26348
    #endif
26349
26350
    /*
26351
     * We check if we are trying to send a
26352
     * CLOSE_NOTIFY alert.
26353
     * */
26354
    if (type == close_notify) {
26355
        if (!ssl->options.sentNotify) {
26356
            ssl->options.sentNotify = 1;
26357
        }
26358
        else {
26359
            /* CLOSE_NOTIFY already sent */
26360
            return 0;
26361
        }
26362
    }
26363
26364
    ssl->buffers.outputBuffer.length += (word32)sendSz;
26365
26366
    ret = SendBuffered(ssl);
26367
26368
    ssl->pendingAlert.code = 0;
26369
    ssl->pendingAlert.level = alert_none;
26370
26371
    WOLFSSL_LEAVE("SendAlert", ret);
26372
26373
    return ret;
26374
}
26375
26376
#endif /* !NO_TLS */
26377
26378
int RetrySendAlert(WOLFSSL* ssl)
26379
231k
{
26380
231k
    int ret = 0;
26381
231k
    int type;
26382
231k
    int severity;
26383
231k
    WOLFSSL_ENTER("RetrySendAlert");
26384
26385
231k
    if (ssl == NULL) {
26386
0
        return BAD_FUNC_ARG;
26387
0
    }
26388
26389
231k
    type = ssl->pendingAlert.code;
26390
231k
    severity = ssl->pendingAlert.level;
26391
26392
231k
    if (severity == alert_none)
26393
229k
        return 0;
26394
26395
2.36k
    ssl->pendingAlert.code = 0;
26396
2.36k
    ssl->pendingAlert.level = alert_none;
26397
26398
2.36k
#ifndef NO_TLS
26399
2.36k
    ret = SendAlert_ex(ssl, severity, type);
26400
#else
26401
    (void)type;
26402
#endif
26403
2.36k
    return ret;
26404
231k
}
26405
26406
/* send alert message */
26407
int SendAlert(WOLFSSL* ssl, int severity, int type)
26408
67.9k
{
26409
67.9k
    int ret = 0;
26410
67.9k
    WOLFSSL_ENTER("SendAlert");
26411
26412
67.9k
    if (ssl == NULL) {
26413
0
        return BAD_FUNC_ARG;
26414
0
    }
26415
26416
67.9k
    if (ssl->pendingAlert.level != alert_none) {
26417
2.24k
        ret = RetrySendAlert(ssl);
26418
2.24k
        if (ret != 0) {
26419
1.99k
            if (ssl->pendingAlert.level == alert_none ||
26420
1.99k
                    (ssl->pendingAlert.level != alert_fatal &&
26421
1.97k
                            severity == alert_fatal)) {
26422
                /* Store current alert if pendingAlert is empty or if current
26423
                 * is fatal and previous was not */
26424
18
                ssl->pendingAlert.code = type;
26425
18
                ssl->pendingAlert.level = severity;
26426
18
            }
26427
1.99k
            return ret;
26428
1.99k
        }
26429
2.24k
    }
26430
65.9k
#ifndef NO_TLS
26431
65.9k
    ret = SendAlert_ex(ssl, severity, type);
26432
65.9k
#endif /* !NO_TLS */
26433
65.9k
    return ret;
26434
67.9k
}
26435
26436
26437
#ifdef WOLFSSL_DEBUG_TRACE_ERROR_CODES_H
26438
#include <wolfssl/debug-untrace-error-codes.h>
26439
#endif
26440
26441
const char* wolfSSL_ERR_reason_error_string(unsigned long e)
26442
0
{
26443
#ifdef NO_ERROR_STRINGS
26444
26445
    (void)e;
26446
    return "no support for error strings built in";
26447
26448
#else
26449
26450
0
    int error = (int)e;
26451
26452
    /* OpenSSL uses positive error codes */
26453
0
    if (error > 0) {
26454
0
        error = -error;
26455
0
    }
26456
26457
    /* pass to wolfCrypt */
26458
0
    if ((error <= WC_SPAN1_FIRST_E && error >= WC_SPAN1_MIN_CODE_E) ||
26459
0
        (error <= WC_SPAN2_FIRST_E && error >= WC_SPAN2_MIN_CODE_E))
26460
0
    {
26461
0
        return wc_GetErrorString(error);
26462
0
    }
26463
26464
0
    if (error == 0) {
26465
#ifdef OPENSSL_EXTRA
26466
        return "ok";
26467
#else
26468
0
        return "unknown error number";
26469
0
#endif
26470
0
    }
26471
26472
0
    switch ((enum wolfSSL_ErrorCodes)error) { /* // NOLINT(clang-analyzer-optin.core.EnumCastOutOfRange) */
26473
26474
0
    case UNSUPPORTED_SUITE :
26475
0
        return "unsupported cipher suite";
26476
26477
0
    case INPUT_CASE_ERROR :
26478
0
        return "input state error";
26479
26480
0
    case PREFIX_ERROR :
26481
0
        return "bad index to key rounds";
26482
26483
0
    case MEMORY_ERROR :
26484
0
        return "out of memory";
26485
26486
0
    case VERIFY_FINISHED_ERROR :
26487
0
        return "verify problem on finished";
26488
26489
0
    case VERIFY_MAC_ERROR :
26490
0
        return "verify mac problem";
26491
26492
0
    case PARSE_ERROR :
26493
0
        return "parse error on header";
26494
26495
0
    case SIDE_ERROR :
26496
0
        return "wrong client/server type";
26497
26498
0
    case NO_PEER_CERT : /* OpenSSL compatibility expects this exact text */
26499
0
        return "peer did not return a certificate";
26500
26501
0
    case UNKNOWN_HANDSHAKE_TYPE :
26502
0
        return "weird handshake type";
26503
26504
0
    case SOCKET_ERROR_E :
26505
0
        return "error state on socket";
26506
26507
0
    case SOCKET_NODATA :
26508
0
        return "expected data, not there";
26509
26510
0
    case INCOMPLETE_DATA :
26511
0
        return "don't have enough data to complete task";
26512
26513
0
    case UNKNOWN_RECORD_TYPE :
26514
0
        return "unknown type in record hdr";
26515
26516
0
    case DECRYPT_ERROR :
26517
0
        return "error during decryption";
26518
26519
0
    case FATAL_ERROR :
26520
0
        return "received alert fatal error";
26521
26522
0
    case ENCRYPT_ERROR :
26523
0
        return "error during encryption";
26524
26525
0
    case FREAD_ERROR :
26526
0
        return "fread problem";
26527
26528
0
    case NO_PEER_KEY :
26529
0
        return "need peer's key";
26530
26531
0
    case NO_PRIVATE_KEY :
26532
0
        return "need the private key";
26533
26534
0
    case NO_DH_PARAMS :
26535
0
        return "server missing DH params";
26536
26537
0
    case RSA_PRIVATE_ERROR :
26538
0
        return "error during rsa priv op";
26539
26540
0
    case MATCH_SUITE_ERROR :
26541
0
        return "can't match cipher suite";
26542
26543
0
    case COMPRESSION_ERROR :
26544
0
        return "compression mismatch error";
26545
26546
0
    case BUILD_MSG_ERROR :
26547
0
        return "build message failure";
26548
26549
0
    case BAD_HELLO :
26550
0
        return "client hello malformed";
26551
26552
0
    case DOMAIN_NAME_MISMATCH :
26553
0
        return "peer subject name mismatch";
26554
26555
0
    case IPADDR_MISMATCH :
26556
0
        return "peer ip address mismatch";
26557
26558
0
    case WANT_READ :
26559
0
    case WOLFSSL_ERROR_WANT_READ_E :
26560
0
        return "non-blocking socket wants data to be read";
26561
26562
0
    case NOT_READY_ERROR :
26563
0
        return "handshake layer not ready yet, complete first";
26564
26565
0
    case VERSION_ERROR :
26566
0
        return "record layer version error";
26567
26568
0
    case WANT_WRITE :
26569
0
    case WOLFSSL_ERROR_WANT_WRITE_E :
26570
0
        return "non-blocking socket write buffer full";
26571
26572
0
    case WOLFSSL_ERROR_WANT_CONNECT_E :
26573
0
    case WOLFSSL_ERROR_WANT_ACCEPT_E :
26574
0
        return "The underlying BIO was not yet connected";
26575
26576
0
    case WOLFSSL_ERROR_SYSCALL_E :
26577
0
        return "fatal I/O error in TLS layer";
26578
26579
0
    case WOLFSSL_ERROR_WANT_X509_LOOKUP_E :
26580
0
        return "application client cert callback asked to be called again";
26581
26582
0
    case BUFFER_ERROR :
26583
0
        return "malformed buffer input error";
26584
26585
0
    case VERIFY_CERT_ERROR :
26586
0
        return "verify problem on certificate";
26587
26588
0
    case VERIFY_SIGN_ERROR :
26589
0
        return "verify problem based on signature";
26590
26591
0
    case CLIENT_ID_ERROR :
26592
0
        return "psk client identity error";
26593
26594
0
    case SERVER_HINT_ERROR:
26595
0
        return "psk server hint error";
26596
26597
0
    case PSK_KEY_ERROR:
26598
0
        return "psk key callback error";
26599
26600
0
    case GETTIME_ERROR:
26601
0
        return "gettimeofday() error";
26602
26603
0
    case GETITIMER_ERROR:
26604
0
        return "getitimer() error";
26605
26606
0
    case SIGACT_ERROR:
26607
0
        return "sigaction() error";
26608
26609
0
    case SETITIMER_ERROR:
26610
0
        return "setitimer() error";
26611
26612
0
    case LENGTH_ERROR:
26613
0
        return "record layer length error";
26614
26615
0
    case PEER_KEY_ERROR:
26616
0
        return "can't decode peer key";
26617
26618
0
    case ZERO_RETURN:
26619
0
    case WOLFSSL_ERROR_ZERO_RETURN_E :
26620
0
        return "peer sent close notify alert";
26621
26622
0
    case ECC_CURVETYPE_ERROR:
26623
0
        return "Bad ECC Curve Type or unsupported";
26624
26625
0
    case ECC_CURVE_ERROR:
26626
0
        return "Bad ECC Curve or unsupported";
26627
26628
0
    case ECC_PEERKEY_ERROR:
26629
0
        return "Bad ECC Peer Key";
26630
26631
0
    case ECC_MAKEKEY_ERROR:
26632
0
        return "ECC Make Key failure";
26633
26634
0
    case ECC_EXPORT_ERROR:
26635
0
        return "ECC Export Key failure";
26636
26637
0
    case ECC_SHARED_ERROR:
26638
0
        return "ECC DHE shared failure";
26639
26640
0
    case NOT_CA_ERROR:
26641
0
        return "Not a CA by basic constraint error";
26642
26643
0
    case BAD_CERT_MANAGER_ERROR:
26644
0
        return "Bad Cert Manager error";
26645
26646
0
    case OCSP_CERT_REVOKED:
26647
0
        return "OCSP Cert revoked";
26648
26649
0
    case CRL_CERT_REVOKED:
26650
#ifdef OPENSSL_EXTRA
26651
        return "certificate revoked";
26652
#else
26653
0
        return "CRL Cert revoked";
26654
0
#endif
26655
26656
0
    case CRL_MISSING:
26657
0
        return "CRL missing, not loaded";
26658
26659
0
    case CRYPTO_POLICY_FORBIDDEN:
26660
0
        return "Operation forbidden by system crypto-policy";
26661
26662
0
    case MONITOR_SETUP_E:
26663
0
        return "CRL monitor setup error";
26664
26665
0
    case THREAD_CREATE_E:
26666
0
        return "Thread creation problem";
26667
26668
0
    case OCSP_NEED_URL:
26669
0
        return "OCSP need URL";
26670
26671
0
    case OCSP_CERT_UNKNOWN:
26672
0
        return "OCSP Cert unknown";
26673
26674
0
    case OCSP_LOOKUP_FAIL:
26675
0
        return "OCSP Responder lookup fail";
26676
26677
0
    case MAX_CHAIN_ERROR:
26678
0
        return "Maximum Chain Depth Exceeded";
26679
26680
0
    case MAX_CERT_EXTENSIONS_ERR:
26681
0
        return "Maximum Cert Extension Exceeded";
26682
26683
0
    case COOKIE_ERROR:
26684
0
        return "DTLS Cookie Error";
26685
26686
0
    case SEQUENCE_ERROR:
26687
0
        return "DTLS Sequence Error";
26688
26689
0
    case SUITES_ERROR:
26690
0
        return "Suites Pointer Error";
26691
26692
0
    case OUT_OF_ORDER_E:
26693
0
        return "Out of order message, fatal";
26694
26695
0
    case BAD_KEA_TYPE_E:
26696
0
        return "Bad KEA type found";
26697
26698
0
    case SANITY_CIPHER_E:
26699
0
        return "Sanity check on ciphertext failed";
26700
26701
0
    case RECV_OVERFLOW_E:
26702
0
        return "Receive callback returned more than requested";
26703
26704
0
    case GEN_COOKIE_E:
26705
0
        return "Generate Cookie Error";
26706
26707
0
    case NO_PEER_VERIFY:
26708
0
        return "Need peer certificate verify Error";
26709
26710
0
    case FWRITE_ERROR:
26711
0
        return "fwrite Error";
26712
26713
0
    case CACHE_MATCH_ERROR:
26714
0
        return "Cache restore header match Error";
26715
26716
0
    case UNKNOWN_SNI_HOST_NAME_E:
26717
0
        return "Unrecognized host name Error";
26718
26719
0
    case UNKNOWN_MAX_FRAG_LEN_E:
26720
0
        return "Unrecognized max frag len Error";
26721
26722
0
    case KEYUSE_SIGNATURE_E:
26723
0
        return "Key Use digitalSignature not set Error";
26724
26725
0
    case KEYUSE_ENCIPHER_E:
26726
0
        return "Key Use keyEncipherment not set Error";
26727
26728
0
    case EXTKEYUSE_AUTH_E:
26729
0
        return "Ext Key Use server/client auth not set Error";
26730
26731
0
    case SEND_OOB_READ_E:
26732
0
        return "Send Callback Out of Bounds Read Error";
26733
26734
0
    case SECURE_RENEGOTIATION_E:
26735
0
        return "Invalid Renegotiation Error";
26736
26737
0
    case SESSION_TICKET_LEN_E:
26738
0
        return "Session Ticket Too Long Error";
26739
26740
0
    case SESSION_TICKET_EXPECT_E:
26741
0
        return "Session Ticket Error";
26742
26743
0
    case SCR_DIFFERENT_CERT_E:
26744
0
        return "SCR Different cert error";
26745
26746
0
    case SESSION_SECRET_CB_E:
26747
0
        return "Session Secret Callback Error";
26748
26749
0
    case NO_CHANGE_CIPHER_E:
26750
0
        return "Finished received from peer before Change Cipher Error";
26751
26752
0
    case SANITY_MSG_E:
26753
0
        return "Sanity Check on message order Error";
26754
26755
0
    case DUPLICATE_MSG_E:
26756
0
        return "Duplicate HandShake message Error";
26757
26758
0
    case SNI_UNSUPPORTED:
26759
0
        return "Protocol version does not support SNI Error";
26760
26761
0
    case SOCKET_PEER_CLOSED_E:
26762
0
        return "Peer closed underlying transport Error";
26763
26764
0
    case BAD_TICKET_KEY_CB_SZ:
26765
0
        return "Bad user session ticket key callback Size Error";
26766
26767
0
    case BAD_TICKET_MSG_SZ:
26768
0
        return "Bad session ticket message Size Error";
26769
26770
0
    case BAD_TICKET_ENCRYPT:
26771
0
        return "Bad user ticket callback encrypt Error";
26772
26773
0
    case DH_KEY_SIZE_E:
26774
0
        return "DH key too small Error";
26775
26776
0
    case SNI_ABSENT_ERROR:
26777
0
        return "No Server Name Indication extension Error";
26778
26779
0
    case RSA_SIGN_FAULT:
26780
0
        return "RSA Signature Fault Error";
26781
26782
0
    case HANDSHAKE_SIZE_ERROR:
26783
0
        return "Handshake message too large Error";
26784
26785
0
    case UNKNOWN_ALPN_PROTOCOL_NAME_E:
26786
0
        return "Unrecognized protocol name Error";
26787
26788
0
    case BAD_CERTIFICATE_STATUS_ERROR:
26789
0
        return "Bad Certificate Status Message Error";
26790
26791
0
    case OCSP_INVALID_STATUS:
26792
0
        return "Invalid OCSP Status Error";
26793
26794
0
    case OCSP_WANT_READ:
26795
0
        return "OCSP nonblock wants read";
26796
26797
0
    case RSA_KEY_SIZE_E:
26798
0
        return "RSA key too small";
26799
26800
0
    case ECC_KEY_SIZE_E:
26801
0
        return "ECC key too small";
26802
26803
0
    case DTLS_EXPORT_VER_E:
26804
0
        return "Version needs updated after code change or version mismatch";
26805
26806
0
    case INPUT_SIZE_E:
26807
0
        return "Input size too large Error";
26808
26809
0
    case CTX_INIT_MUTEX_E:
26810
0
        return "Initialize ctx mutex error";
26811
26812
0
    case EXT_MASTER_SECRET_NEEDED_E:
26813
0
        return "Extended Master Secret must be enabled to resume EMS session";
26814
26815
0
    case DTLS_POOL_SZ_E:
26816
0
        return "Maximum DTLS pool size exceeded";
26817
26818
0
    case DECODE_E:
26819
0
        return "Decode handshake message error";
26820
26821
0
    case WRITE_DUP_READ_E:
26822
0
        return "Write dup write side can't read error";
26823
26824
0
    case WRITE_DUP_WRITE_E:
26825
0
        return "Write dup read side can't write error";
26826
26827
0
    case INVALID_CERT_CTX_E:
26828
0
        return "Certificate context does not match request or not empty";
26829
26830
0
    case BAD_KEY_SHARE_DATA:
26831
0
        return "The Key Share data contains group that wasn't in Client Hello";
26832
26833
0
    case MISSING_HANDSHAKE_DATA:
26834
0
        return "The handshake message is missing required data";
26835
26836
0
    case BAD_BINDER: /* OpenSSL compatibility expects this exact text */
26837
0
        return "binder does not verify";
26838
26839
0
    case EXT_NOT_ALLOWED:
26840
0
        return "Extension type not allowed in handshake message type";
26841
26842
0
    case INVALID_PARAMETER:
26843
0
        return "The security parameter is invalid";
26844
26845
0
    case UNSUPPORTED_EXTENSION:
26846
0
        return "TLS Extension not requested by the client";
26847
26848
0
    case PRF_MISSING:
26849
0
        return "Pseudo-random function is not enabled";
26850
26851
0
    case KEY_SHARE_ERROR:
26852
0
        return "Key share extension did not contain a valid named group";
26853
26854
0
    case POST_HAND_AUTH_ERROR:
26855
0
        return "Client will not do post handshake authentication";
26856
26857
0
    case HRR_COOKIE_ERROR:
26858
0
        return "Cookie does not match one sent in HelloRetryRequest";
26859
26860
0
    case MCAST_HIGHWATER_CB_E:
26861
0
        return "Multicast highwater callback returned error";
26862
26863
0
    case ALERT_COUNT_E:
26864
0
        return "Alert Count exceeded error";
26865
26866
0
    case EXT_MISSING:
26867
0
        return "Required TLS extension missing";
26868
26869
0
    case DTLS_RETX_OVER_TX:
26870
0
        return "DTLS interrupting flight transmit with retransmit";
26871
26872
0
    case DH_PARAMS_NOT_FFDHE_E:
26873
0
        return "Server DH parameters were not from the FFDHE set as required";
26874
26875
0
    case TCA_INVALID_ID_TYPE:
26876
0
        return "TLS Extension Trusted CA ID type invalid";
26877
26878
0
    case TCA_ABSENT_ERROR:
26879
0
        return "TLS Extension Trusted CA ID response absent";
26880
26881
0
    case TSIP_MAC_DIGSZ_E:
26882
0
        return "TSIP MAC size invalid, must be sized for SHA-1 or SHA-256";
26883
26884
0
    case CLIENT_CERT_CB_ERROR:
26885
0
        return "Error importing client cert or key from callback";
26886
26887
0
    case SSL_SHUTDOWN_ALREADY_DONE_E:
26888
0
        return "Shutdown has already occurred";
26889
26890
0
    case TLS13_SECRET_CB_E:
26891
0
        return "TLS1.3 Secret Callback Error";
26892
26893
0
    case DTLS_SIZE_ERROR:
26894
0
        return "DTLS trying to send too much in single datagram error";
26895
26896
0
    case NO_CERT_ERROR:
26897
0
        return "TLS1.3 No Certificate Set Error";
26898
26899
0
    case APP_DATA_READY:
26900
0
        return "Application data is available for reading";
26901
26902
0
    case TOO_MUCH_EARLY_DATA:
26903
0
        return "Too much early data";
26904
26905
0
    case SOCKET_FILTERED_E:
26906
0
        return "Session stopped by network filter";
26907
26908
0
    case UNSUPPORTED_CERTIFICATE:
26909
0
        return "Unsupported certificate type";
26910
26911
0
    case HTTP_TIMEOUT:
26912
0
        return "HTTP timeout for OCSP or CRL req";
26913
26914
0
    case HTTP_RECV_ERR:
26915
0
        return "HTTP Receive error";
26916
26917
0
    case HTTP_HEADER_ERR:
26918
0
        return "HTTP Header error";
26919
26920
0
    case HTTP_PROTO_ERR:
26921
0
        return "HTTP Protocol error";
26922
26923
0
    case HTTP_STATUS_ERR:
26924
0
        return "HTTP Status error";
26925
26926
0
    case HTTP_VERSION_ERR:
26927
0
        return "HTTP Version error";
26928
26929
0
    case HTTP_APPSTR_ERR:
26930
0
        return "HTTP Application string error";
26931
26932
0
    case UNSUPPORTED_PROTO_VERSION:
26933
        #ifdef OPENSSL_EXTRA
26934
        return "WRONG_SSL_VERSION";
26935
        #else
26936
0
        return "bad/unsupported protocol version";
26937
0
        #endif
26938
26939
0
    case FALCON_KEY_SIZE_E:
26940
0
        return "Wrong key size for Falcon.";
26941
26942
0
    case DILITHIUM_KEY_SIZE_E:
26943
0
        return "Wrong key size for Dilithium.";
26944
26945
0
    case QUIC_TP_MISSING_E:
26946
0
        return "QUIC transport parameter not set";
26947
26948
0
    case QUIC_WRONG_ENC_LEVEL:
26949
0
        return "QUIC data received at wrong encryption level";
26950
26951
0
    case DTLS_CID_ERROR:
26952
0
        return "DTLS ConnectionID mismatch or missing";
26953
26954
0
    case DTLS_TOO_MANY_FRAGMENTS_E:
26955
0
        return "Received too many fragmented messages from peer error";
26956
26957
0
    case DUPLICATE_TLS_EXT_E:
26958
0
        return "Duplicate TLS extension in message.";
26959
26960
0
    case WOLFSSL_ALPN_NOT_FOUND:
26961
0
        return "TLS extension not found";
26962
26963
0
    case WOLFSSL_BAD_CERTTYPE:
26964
0
        return "Certificate type not supported";
26965
26966
0
    case WOLFSSL_BAD_STAT:
26967
0
        return "bad status";
26968
26969
0
    case WOLFSSL_BAD_PATH:
26970
0
        return "No certificates found at designated path";
26971
26972
0
    case WOLFSSL_BAD_FILETYPE:
26973
0
        return "Data format not supported";
26974
26975
0
    case WOLFSSL_BAD_FILE:
26976
0
        return "Input/output error on file";
26977
26978
0
    case WOLFSSL_NOT_IMPLEMENTED:
26979
0
        return "Function not implemented";
26980
26981
0
    case WOLFSSL_UNKNOWN:
26982
0
        return "Unknown algorithm (EVP)";
26983
26984
0
    case WOLFSSL_FATAL_ERROR:
26985
0
        return "fatal error";
26986
26987
0
    case WOLFSSL_PEM_R_NO_START_LINE_E:
26988
0
        return "No more matching objects found (PEM)";
26989
26990
0
    case WOLFSSL_PEM_R_PROBLEMS_GETTING_PASSWORD_E:
26991
0
        return "Error getting password (PEM)";
26992
26993
0
    case WOLFSSL_PEM_R_BAD_PASSWORD_READ_E:
26994
0
        return "Bad password (PEM)";
26995
26996
0
    case WOLFSSL_PEM_R_BAD_DECRYPT_E :
26997
0
        return "Decryption failed (PEM)";
26998
26999
0
    case WOLFSSL_ASN1_R_HEADER_TOO_LONG_E:
27000
0
        return "ASN header too long (compat)";
27001
27002
0
    case WOLFSSL_EVP_R_BAD_DECRYPT_E :
27003
0
        return "Decryption failed (EVP)";
27004
27005
0
    case WOLFSSL_EVP_R_BN_DECODE_ERROR:
27006
0
        return "Bignum decode error (EVP)";
27007
27008
0
    case WOLFSSL_EVP_R_DECODE_ERROR  :
27009
0
        return "Decode error (EVP)";
27010
27011
0
    case WOLFSSL_EVP_R_PRIVATE_KEY_DECODE_ERROR:
27012
0
        return "Private key decode error (EVP)";
27013
0
    }
27014
27015
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
27016
    defined(HAVE_WEBSERVER) || defined(HAVE_MEMCACHED)
27017
27018
    switch (error) {
27019
    /* TODO: -WOLFSSL_X509_V_ERR_CERT_SIGNATURE_FAILURE. Conflicts with
27020
     *       -WOLFSSL_ERROR_WANT_CONNECT.
27021
     */
27022
27023
    case -WOLFSSL_X509_V_ERR_CERT_NOT_YET_VALID:
27024
        return "certificate not yet valid";
27025
27026
    case -WOLFSSL_X509_V_ERR_CERT_HAS_EXPIRED:
27027
        return "certificate has expired";
27028
27029
    case -WOLFSSL_X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
27030
        return "certificate signature failure";
27031
27032
    case -WOLFSSL_X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
27033
        return "format error in certificate's notAfter field";
27034
27035
    case -WOLFSSL_X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
27036
        return "self-signed certificate in certificate chain";
27037
27038
    case -WOLFSSL_X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
27039
        return "unable to get local issuer certificate";
27040
27041
    case -WOLFSSL_X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
27042
        return "unable to verify the first certificate";
27043
27044
    case -WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG:
27045
        return "certificate chain too long";
27046
27047
    case -WOLFSSL_X509_V_ERR_CERT_REVOKED:
27048
        return "certificate revoked";
27049
27050
    case -WOLFSSL_X509_V_ERR_INVALID_CA:
27051
        return "invalid CA certificate";
27052
27053
    case -WOLFSSL_X509_V_ERR_PATH_LENGTH_EXCEEDED:
27054
        return "path length constraint exceeded";
27055
27056
    case -WOLFSSL_X509_V_ERR_CERT_REJECTED:
27057
        return "certificate rejected";
27058
27059
    case -WOLFSSL_X509_V_ERR_SUBJECT_ISSUER_MISMATCH:
27060
        return "subject issuer mismatch";
27061
    }
27062
#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL || HAVE_WEBSERVER || HAVE_MEMCACHED */
27063
27064
0
    return "unknown error number";
27065
27066
0
#endif /* NO_ERROR_STRINGS */
27067
0
}
27068
27069
#ifdef WOLFSSL_DEBUG_TRACE_ERROR_CODES
27070
#include <wolfssl/debug-trace-error-codes.h>
27071
#endif
27072
27073
const char* wolfSSL_ERR_func_error_string(unsigned long e)
27074
0
{
27075
0
    (void)e;
27076
0
    WOLFSSL_MSG("wolfSSL_ERR_func_error_string does not return the name of "
27077
0
                "the function that failed. Please inspect the wolfSSL debug "
27078
0
                "logs to determine where the error occurred.");
27079
0
    return "";
27080
0
}
27081
27082
/* return library name
27083
 * @param e error code
27084
 * @return text library name,
27085
 *    if there is no suitable library found, returns empty string
27086
 */
27087
const char* wolfSSL_ERR_lib_error_string(unsigned long e)
27088
0
{
27089
0
    int libe = 0;
27090
27091
0
    (void)libe;
27092
0
    (void)e;
27093
27094
#if defined(OPENSSL_EXTRA)
27095
    libe = wolfSSL_ERR_GET_LIB(e);
27096
    switch (libe) {
27097
    case WOLFSSL_ERR_LIB_PEM:
27098
        return "wolfSSL PEM routines";
27099
    case WOLFSSL_ERR_LIB_EVP:
27100
        return "wolfSSL digital envelope routines";
27101
    default:
27102
        return "";
27103
    }
27104
#else
27105
0
    return "";
27106
0
#endif
27107
0
}
27108
27109
void SetErrorString(int error, char* str)
27110
0
{
27111
0
    XSTRNCPY(str, wolfSSL_ERR_reason_error_string((unsigned long)error), WOLFSSL_MAX_ERROR_SZ);
27112
0
    str[WOLFSSL_MAX_ERROR_SZ-1] = 0;
27113
0
}
27114
27115
#ifdef NO_CIPHER_SUITE_ALIASES
27116
    #ifndef NO_ERROR_STRINGS
27117
        #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
27118
            #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
27119
            #define SUITE_ALIAS(x,z,w,v,u) /* null expansion */
27120
        #else
27121
            #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
27122
            #define SUITE_ALIAS(x,z,w,v,u) /* null expansion */
27123
        #endif
27124
    #else
27125
        #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
27126
            #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
27127
            #define SUITE_ALIAS(x,z,w,v,u) /* null expansion */
27128
        #else
27129
            #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
27130
            #define SUITE_ALIAS(x,z,w,v,u) /* null expansion */
27131
        #endif
27132
    #endif
27133
#else /* !NO_CIPHER_SUITE_ALIASES */
27134
27135
    /* note that the comma is included at the end of the SUITE_ALIAS() macro
27136
     * definitions, to allow aliases to be gated out by the above null macros
27137
     * in the NO_CIPHER_SUITE_ALIASES section.
27138
     */
27139
27140
    #ifndef NO_ERROR_STRINGS
27141
        #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_QT) || \
27142
            defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
27143
            #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
27144
            #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
27145
        #else
27146
            #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
27147
            #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
27148
        #endif
27149
    #else
27150
        #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_QT) || \
27151
            defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
27152
            #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
27153
            #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
27154
        #else
27155
            #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
27156
            #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
27157
        #endif
27158
    #endif
27159
#endif /* NO_CIPHER_SUITE_ALIASES */
27160
27161
#ifndef NO_TLS
27162
static const CipherSuiteInfo cipher_names[] =
27163
{
27164
27165
#ifdef BUILD_TLS_AES_128_GCM_SHA256
27166
    SUITE_INFO("TLS13-AES128-GCM-SHA256","TLS_AES_128_GCM_SHA256",TLS13_BYTE,TLS_AES_128_GCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
27167
#endif
27168
27169
#ifdef BUILD_TLS_AES_256_GCM_SHA384
27170
    SUITE_INFO("TLS13-AES256-GCM-SHA384","TLS_AES_256_GCM_SHA384",TLS13_BYTE,TLS_AES_256_GCM_SHA384, TLSv1_3_MINOR, SSLv3_MAJOR),
27171
#endif
27172
27173
#ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
27174
    SUITE_INFO("TLS13-CHACHA20-POLY1305-SHA256","TLS_CHACHA20_POLY1305_SHA256",TLS13_BYTE,TLS_CHACHA20_POLY1305_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
27175
#endif
27176
27177
#ifdef BUILD_TLS_AES_128_CCM_SHA256
27178
    SUITE_INFO("TLS13-AES128-CCM-SHA256","TLS_AES_128_CCM_SHA256",TLS13_BYTE,TLS_AES_128_CCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
27179
#endif
27180
27181
#ifdef BUILD_TLS_AES_128_CCM_8_SHA256
27182
    SUITE_INFO("TLS13-AES128-CCM-8-SHA256","TLS_AES_128_CCM_8_SHA256",TLS13_BYTE,TLS_AES_128_CCM_8_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR),
27183
    SUITE_ALIAS("TLS13-AES128-CCM8-SHA256",TLS13_BYTE,TLS_AES_128_CCM_8_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR)
27184
#endif
27185
27186
#ifdef BUILD_TLS_SM4_GCM_SM3
27187
    SUITE_INFO("TLS13-SM4-GCM-SM3","TLS_SM4_GCM_SM3",CIPHER_BYTE,TLS_SM4_GCM_SM3, TLSv1_3_MINOR, SSLv3_MAJOR),
27188
#endif
27189
27190
#ifdef BUILD_TLS_SM4_CCM_SM3
27191
    SUITE_INFO("TLS13-SM4-CCM-SM3","TLS_SM4_CCM_SM3",CIPHER_BYTE,TLS_SM4_CCM_SM3, TLSv1_3_MINOR, SSLv3_MAJOR),
27192
#endif
27193
27194
#ifdef BUILD_TLS_SHA256_SHA256
27195
    SUITE_INFO("TLS13-SHA256-SHA256","TLS_SHA256_SHA256",ECC_BYTE,TLS_SHA256_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR),
27196
#endif
27197
27198
#ifdef BUILD_TLS_SHA384_SHA384
27199
    SUITE_INFO("TLS13-SHA384-SHA384","TLS_SHA384_SHA384",ECC_BYTE,TLS_SHA384_SHA384,TLSv1_3_MINOR, SSLv3_MAJOR),
27200
#endif
27201
27202
#ifndef WOLFSSL_NO_TLS12
27203
27204
#ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
27205
    SUITE_INFO("RC4-SHA","SSL_RSA_WITH_RC4_128_SHA",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_SHA,SSLv3_MINOR,SSLv3_MAJOR),
27206
#endif
27207
27208
#ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
27209
    SUITE_INFO("RC4-MD5","SSL_RSA_WITH_RC4_128_MD5",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_MD5,SSLv3_MINOR,SSLv3_MAJOR),
27210
#endif
27211
27212
#ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
27213
    SUITE_INFO("DES-CBC3-SHA","SSL_RSA_WITH_3DES_EDE_CBC_SHA",CIPHER_BYTE,SSL_RSA_WITH_3DES_EDE_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
27214
#endif
27215
27216
#ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
27217
    SUITE_INFO("AES128-SHA","TLS_RSA_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
27218
#endif
27219
27220
#ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
27221
    SUITE_INFO("AES256-SHA","TLS_RSA_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_256_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
27222
#endif
27223
27224
#ifdef BUILD_TLS_RSA_WITH_NULL_MD5
27225
    SUITE_INFO("NULL-MD5","TLS_RSA_WITH_NULL_MD5",CIPHER_BYTE,TLS_RSA_WITH_NULL_MD5,SSLv3_MINOR,SSLv3_MAJOR),
27226
#endif
27227
27228
#ifdef BUILD_TLS_RSA_WITH_NULL_SHA
27229
    SUITE_INFO("NULL-SHA","TLS_RSA_WITH_NULL_SHA",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA,SSLv3_MINOR,SSLv3_MAJOR),
27230
#endif
27231
27232
#ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
27233
    SUITE_INFO("NULL-SHA256","TLS_RSA_WITH_NULL_SHA256",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
27234
#endif
27235
27236
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
27237
    SUITE_INFO("DHE-RSA-AES128-SHA","TLS_DHE_RSA_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
27238
#endif
27239
27240
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
27241
    SUITE_INFO("DHE-RSA-AES256-SHA","TLS_DHE_RSA_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
27242
#endif
27243
27244
#ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
27245
    SUITE_INFO("DHE-PSK-AES256-GCM-SHA384","TLS_DHE_PSK_WITH_AES_256_GCM_SHA384",CIPHER_BYTE,TLS_DHE_PSK_WITH_AES_256_GCM_SHA384,TLSv1_2_MINOR,SSLv3_MAJOR),
27246
#endif
27247
27248
#ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
27249
    SUITE_INFO("DHE-PSK-AES128-GCM-SHA256","TLS_DHE_PSK_WITH_AES_128_GCM_SHA256",CIPHER_BYTE,TLS_DHE_PSK_WITH_AES_128_GCM_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
27250
#endif
27251
27252
#ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
27253
    SUITE_INFO("PSK-AES256-GCM-SHA384","TLS_PSK_WITH_AES_256_GCM_SHA384",CIPHER_BYTE,TLS_PSK_WITH_AES_256_GCM_SHA384,TLSv1_2_MINOR,SSLv3_MAJOR),
27254
#endif
27255
27256
#ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
27257
    SUITE_INFO("PSK-AES128-GCM-SHA256","TLS_PSK_WITH_AES_128_GCM_SHA256",CIPHER_BYTE,TLS_PSK_WITH_AES_128_GCM_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
27258
#endif
27259
27260
#ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
27261
    SUITE_INFO("DHE-PSK-AES256-CBC-SHA384","TLS_DHE_PSK_WITH_AES_256_CBC_SHA384",CIPHER_BYTE,TLS_DHE_PSK_WITH_AES_256_CBC_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
27262
#endif
27263
27264
#ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
27265
    SUITE_INFO("DHE-PSK-AES128-CBC-SHA256","TLS_DHE_PSK_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_DHE_PSK_WITH_AES_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
27266
#endif
27267
27268
#ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
27269
    SUITE_INFO("PSK-AES256-CBC-SHA384","TLS_PSK_WITH_AES_256_CBC_SHA384",CIPHER_BYTE,TLS_PSK_WITH_AES_256_CBC_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
27270
#endif
27271
27272
#ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
27273
    SUITE_INFO("PSK-AES128-CBC-SHA256","TLS_PSK_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_PSK_WITH_AES_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
27274
#endif
27275
27276
#ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
27277
    SUITE_INFO("PSK-AES128-CBC-SHA","TLS_PSK_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_PSK_WITH_AES_128_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
27278
#endif
27279
27280
#ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
27281
    SUITE_INFO("PSK-AES256-CBC-SHA","TLS_PSK_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_PSK_WITH_AES_256_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
27282
#endif
27283
27284
#ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
27285
    SUITE_INFO("DHE-PSK-AES128-CCM","TLS_DHE_PSK_WITH_AES_128_CCM",ECC_BYTE,TLS_DHE_PSK_WITH_AES_128_CCM,TLSv1_MINOR,SSLv3_MAJOR),
27286
#endif
27287
27288
#ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
27289
    SUITE_INFO("DHE-PSK-AES256-CCM","TLS_DHE_PSK_WITH_AES_256_CCM",ECC_BYTE,TLS_DHE_PSK_WITH_AES_256_CCM,TLSv1_MINOR,SSLv3_MAJOR),
27290
#endif
27291
27292
#ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
27293
    SUITE_INFO("PSK-AES128-CCM","TLS_PSK_WITH_AES_128_CCM",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM,TLSv1_MINOR,SSLv3_MAJOR),
27294
#endif
27295
27296
#ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
27297
    SUITE_INFO("PSK-AES256-CCM","TLS_PSK_WITH_AES_256_CCM",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM,TLSv1_MINOR,SSLv3_MAJOR),
27298
#endif
27299
27300
#ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
27301
    SUITE_INFO("PSK-AES128-CCM-8","TLS_PSK_WITH_AES_128_CCM_8",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM_8,TLSv1_MINOR,SSLv3_MAJOR),
27302
    SUITE_ALIAS("PSK-AES128-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
27303
#endif
27304
27305
#ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
27306
    SUITE_INFO("PSK-AES256-CCM-8","TLS_PSK_WITH_AES_256_CCM_8",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM_8,TLSv1_MINOR,SSLv3_MAJOR),
27307
    SUITE_ALIAS("PSK-AES256-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
27308
#endif
27309
27310
#ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
27311
    SUITE_INFO("DHE-PSK-NULL-SHA384","TLS_DHE_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
27312
#endif
27313
27314
#ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
27315
    SUITE_INFO("DHE-PSK-NULL-SHA256","TLS_DHE_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
27316
#endif
27317
27318
#ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
27319
    SUITE_INFO("PSK-NULL-SHA384","TLS_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
27320
#endif
27321
27322
#ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
27323
    SUITE_INFO("PSK-NULL-SHA256","TLS_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
27324
#endif
27325
27326
#ifdef BUILD_TLS_PSK_WITH_NULL_SHA
27327
    SUITE_INFO("PSK-NULL-SHA","TLS_PSK_WITH_NULL_SHA",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA,TLSv1_MINOR,SSLv3_MAJOR),
27328
#endif
27329
27330
#ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
27331
    SUITE_INFO("AES128-CCM-8","TLS_RSA_WITH_AES_128_CCM_8",ECC_BYTE,TLS_RSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR),
27332
    SUITE_ALIAS("AES128-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
27333
#endif
27334
27335
#ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
27336
    SUITE_INFO("AES256-CCM-8","TLS_RSA_WITH_AES_256_CCM_8",ECC_BYTE,TLS_RSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR),
27337
    SUITE_ALIAS("AES256-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
27338
#endif
27339
27340
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
27341
    SUITE_INFO("ECDHE-ECDSA-AES128-CCM","TLS_ECDHE_ECDSA_WITH_AES_128_CCM",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CCM, TLSv1_2_MINOR, SSLv3_MAJOR),
27342
#endif
27343
27344
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
27345
    SUITE_INFO("ECDHE-ECDSA-AES128-CCM-8","TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR),
27346
    SUITE_ALIAS("ECDHE-ECDSA-AES128-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
27347
#endif
27348
27349
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
27350
    SUITE_INFO("ECDHE-ECDSA-AES256-CCM-8","TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR),
27351
    SUITE_ALIAS("ECDHE-ECDSA-AES256-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
27352
#endif
27353
27354
#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
27355
    SUITE_INFO("ECDHE-RSA-AES128-SHA","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
27356
#endif
27357
27358
#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
27359
    SUITE_INFO("ECDHE-RSA-AES256-SHA","TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
27360
#endif
27361
27362
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
27363
    SUITE_INFO("ECDHE-ECDSA-AES128-SHA","TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
27364
#endif
27365
27366
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
27367
    SUITE_INFO("ECDHE-ECDSA-AES256-SHA","TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
27368
#endif
27369
27370
#ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
27371
    SUITE_INFO("ECDHE-RSA-RC4-SHA","TLS_ECDHE_RSA_WITH_RC4_128_SHA",ECC_BYTE,TLS_ECDHE_RSA_WITH_RC4_128_SHA, TLSv1_MINOR, SSLv3_MAJOR),
27372
#endif
27373
27374
#ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
27375
    SUITE_INFO("ECDHE-RSA-DES-CBC3-SHA","TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",ECC_BYTE,TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
27376
#endif
27377
27378
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
27379
    SUITE_INFO("ECDHE-ECDSA-RC4-SHA","TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, TLSv1_MINOR, SSLv3_MAJOR),
27380
#endif
27381
27382
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
27383
    SUITE_INFO("ECDHE-ECDSA-DES-CBC3-SHA","TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
27384
#endif
27385
27386
#ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
27387
    SUITE_INFO("AES128-SHA256","TLS_RSA_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA256, TLSv1_MINOR, SSLv3_MAJOR),
27388
#endif
27389
27390
#ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
27391
    SUITE_INFO("AES256-SHA256","TLS_RSA_WITH_AES_256_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_AES_256_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
27392
#endif
27393
27394
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
27395
    SUITE_INFO("DHE-RSA-AES128-SHA256","TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
27396
#endif
27397
27398
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
27399
    SUITE_INFO("DHE-RSA-AES256-SHA256","TLS_DHE_RSA_WITH_AES_256_CBC_SHA256",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
27400
#endif
27401
27402
#ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
27403
    SUITE_INFO("ECDH-RSA-AES128-SHA","TLS_ECDH_RSA_WITH_AES_128_CBC_SHA",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
27404
#endif
27405
27406
#ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
27407
    SUITE_INFO("ECDH-RSA-AES256-SHA","TLS_ECDH_RSA_WITH_AES_256_CBC_SHA",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
27408
#endif
27409
27410
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
27411
    SUITE_INFO("ECDH-ECDSA-AES128-SHA","TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
27412
#endif
27413
27414
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
27415
    SUITE_INFO("ECDH-ECDSA-AES256-SHA","TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
27416
#endif
27417
27418
#ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
27419
    SUITE_INFO("ECDH-RSA-RC4-SHA","TLS_ECDH_RSA_WITH_RC4_128_SHA",ECC_BYTE,TLS_ECDH_RSA_WITH_RC4_128_SHA, TLSv1_MINOR, SSLv3_MAJOR),
27420
#endif
27421
27422
#ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
27423
    SUITE_INFO("ECDH-RSA-DES-CBC3-SHA","TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA",ECC_BYTE,TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
27424
#endif
27425
27426
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
27427
    SUITE_INFO("ECDH-ECDSA-RC4-SHA","TLS_ECDH_ECDSA_WITH_RC4_128_SHA",ECC_BYTE,TLS_ECDH_ECDSA_WITH_RC4_128_SHA, TLSv1_MINOR, SSLv3_MAJOR),
27428
#endif
27429
27430
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
27431
    SUITE_INFO("ECDH-ECDSA-DES-CBC3-SHA","TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA",ECC_BYTE,TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
27432
#endif
27433
27434
#ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
27435
    SUITE_INFO("AES128-GCM-SHA256","TLS_RSA_WITH_AES_128_GCM_SHA256",CIPHER_BYTE,TLS_RSA_WITH_AES_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
27436
#endif
27437
27438
#ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
27439
    SUITE_INFO("AES256-GCM-SHA384","TLS_RSA_WITH_AES_256_GCM_SHA384",CIPHER_BYTE,TLS_RSA_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
27440
#endif
27441
27442
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
27443
    SUITE_INFO("DHE-RSA-AES128-GCM-SHA256","TLS_DHE_RSA_WITH_AES_128_GCM_SHA256",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
27444
#endif
27445
27446
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
27447
    SUITE_INFO("DHE-RSA-AES256-GCM-SHA384","TLS_DHE_RSA_WITH_AES_256_GCM_SHA384",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
27448
#endif
27449
27450
#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
27451
    SUITE_INFO("ECDHE-RSA-AES128-GCM-SHA256","TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
27452
#endif
27453
27454
#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
27455
    SUITE_INFO("ECDHE-RSA-AES256-GCM-SHA384","TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
27456
#endif
27457
27458
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
27459
    SUITE_INFO("ECDHE-ECDSA-AES128-GCM-SHA256","TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
27460
#endif
27461
27462
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
27463
    SUITE_INFO("ECDHE-ECDSA-AES256-GCM-SHA384","TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
27464
#endif
27465
27466
#ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
27467
    SUITE_INFO("ECDH-RSA-AES128-GCM-SHA256","TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
27468
#endif
27469
27470
#ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
27471
    SUITE_INFO("ECDH-RSA-AES256-GCM-SHA384","TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
27472
#endif
27473
27474
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
27475
    SUITE_INFO("ECDH-ECDSA-AES128-GCM-SHA256","TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
27476
#endif
27477
27478
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
27479
    SUITE_INFO("ECDH-ECDSA-AES256-GCM-SHA384","TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
27480
#endif
27481
27482
#ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
27483
    SUITE_INFO("CAMELLIA128-SHA","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
27484
#endif
27485
27486
#ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
27487
    SUITE_INFO("DHE-RSA-CAMELLIA128-SHA","TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA",CIPHER_BYTE,TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
27488
#endif
27489
27490
#ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
27491
    SUITE_INFO("CAMELLIA256-SHA","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
27492
#endif
27493
27494
#ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
27495
    SUITE_INFO("DHE-RSA-CAMELLIA256-SHA","TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA",CIPHER_BYTE,TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
27496
#endif
27497
27498
#ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
27499
    SUITE_INFO("CAMELLIA128-SHA256","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
27500
#endif
27501
27502
#ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
27503
    SUITE_INFO("DHE-RSA-CAMELLIA128-SHA256","TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256",CIPHER_BYTE,TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
27504
#endif
27505
27506
#ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
27507
    SUITE_INFO("CAMELLIA256-SHA256","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
27508
#endif
27509
27510
#ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
27511
    SUITE_INFO("DHE-RSA-CAMELLIA256-SHA256","TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256",CIPHER_BYTE,TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
27512
#endif
27513
27514
#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
27515
    SUITE_INFO("ECDHE-RSA-AES128-SHA256","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
27516
#endif
27517
27518
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
27519
    SUITE_INFO("ECDHE-ECDSA-AES128-SHA256","TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
27520
#endif
27521
27522
#ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
27523
    SUITE_INFO("ECDH-RSA-AES128-SHA256","TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
27524
#endif
27525
27526
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
27527
    SUITE_INFO("ECDH-ECDSA-AES128-SHA256","TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
27528
#endif
27529
27530
#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
27531
    SUITE_INFO("ECDHE-RSA-AES256-SHA384","TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
27532
#endif
27533
27534
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
27535
    SUITE_INFO("ECDHE-ECDSA-AES256-SHA384","TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
27536
#endif
27537
27538
#ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
27539
    SUITE_INFO("ECDH-RSA-AES256-SHA384","TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
27540
#endif
27541
27542
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
27543
    SUITE_INFO("ECDH-ECDSA-AES256-SHA384","TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
27544
#endif
27545
27546
#ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
27547
    SUITE_INFO("ECDHE-RSA-CHACHA20-POLY1305","TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
27548
#endif
27549
27550
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
27551
    SUITE_INFO("ECDHE-ECDSA-CHACHA20-POLY1305","TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
27552
#endif
27553
27554
#ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
27555
    SUITE_INFO("DHE-RSA-CHACHA20-POLY1305","TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
27556
#endif
27557
27558
#ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
27559
    SUITE_INFO("ECDHE-RSA-CHACHA20-POLY1305-OLD","TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256",CHACHA_BYTE,TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
27560
#endif
27561
27562
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
27563
    SUITE_INFO("ECDHE-ECDSA-CHACHA20-POLY1305-OLD","TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256",CHACHA_BYTE,TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
27564
#endif
27565
27566
#ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
27567
    SUITE_INFO("DHE-RSA-CHACHA20-POLY1305-OLD","TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256",CHACHA_BYTE,TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
27568
#endif
27569
27570
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
27571
    SUITE_INFO("ECDHE-ECDSA-SM4-CBC-SM3","TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3",SM_BYTE,TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3, TLSv1_2_MINOR, SSLv3_MAJOR),
27572
#endif
27573
27574
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
27575
    SUITE_INFO("ECDHE-ECDSA-SM4-GCM-SM3","TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3",SM_BYTE,TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3, TLSv1_2_MINOR, SSLv3_MAJOR),
27576
#endif
27577
27578
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
27579
    SUITE_INFO("ECDHE-ECDSA-SM4-CCM-SM3","TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3",SM_BYTE,TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3, TLSv1_2_MINOR, SSLv3_MAJOR),
27580
#endif
27581
27582
#ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
27583
    SUITE_INFO("ADH-AES128-SHA","TLS_DH_anon_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_DH_anon_WITH_AES_128_CBC_SHA, TLSv1_2_MINOR, SSLv3_MAJOR),
27584
#endif
27585
27586
#ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
27587
    SUITE_INFO("ADH-AES256-GCM-SHA384","TLS_DH_anon_WITH_AES_256_GCM_SHA384",CIPHER_BYTE,TLS_DH_anon_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
27588
#endif
27589
27590
#ifdef HAVE_RENEGOTIATION_INDICATION
27591
    SUITE_INFO("RENEGOTIATION-INFO","TLS_EMPTY_RENEGOTIATION_INFO_SCSV",CIPHER_BYTE,TLS_EMPTY_RENEGOTIATION_INFO_SCSV,SSLv3_MINOR,SSLv3_MAJOR),
27592
#endif
27593
27594
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
27595
    SUITE_INFO("ECDHE-ECDSA-NULL-SHA","TLS_ECDHE_ECDSA_WITH_NULL_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_NULL_SHA, TLSv1_MINOR, SSLv3_MAJOR),
27596
#endif
27597
27598
#ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
27599
    SUITE_INFO("ECDHE-PSK-NULL-SHA256","TLS_ECDHE_PSK_WITH_NULL_SHA256",ECC_BYTE,TLS_ECDHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
27600
#endif
27601
27602
#ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
27603
    SUITE_INFO("ECDHE-PSK-AES128-CBC-SHA256","TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256",ECC_BYTE,TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
27604
#endif
27605
27606
#ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256
27607
    SUITE_INFO("ECDHE-PSK-AES128-GCM-SHA256","TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256",ECDHE_PSK_BYTE,TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
27608
#endif
27609
27610
#ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
27611
    SUITE_INFO("PSK-CHACHA20-POLY1305","TLS_PSK_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_PSK_WITH_CHACHA20_POLY1305_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
27612
#endif
27613
27614
#ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
27615
    SUITE_INFO("ECDHE-PSK-CHACHA20-POLY1305","TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
27616
#endif
27617
27618
#ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
27619
    SUITE_INFO("DHE-PSK-CHACHA20-POLY1305","TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
27620
#endif
27621
27622
#ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
27623
    SUITE_INFO("EDH-RSA-DES-CBC3-SHA","TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA",CIPHER_BYTE,TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
27624
#endif
27625
27626
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256
27627
    SUITE_INFO("ECDHE-ECDSA-ARIA128-GCM-SHA256","TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
27628
#endif
27629
27630
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384
27631
    SUITE_INFO("ECDHE-ECDSA-ARIA256-GCM-SHA384","TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
27632
#endif
27633
27634
#ifdef BUILD_WDM_WITH_NULL_SHA256
27635
    SUITE_INFO("WDM-NULL-SHA256","WDM_WITH_NULL_SHA256",CIPHER_BYTE,WDM_WITH_NULL_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR)
27636
#endif
27637
27638
#endif /* WOLFSSL_NO_TLS12 */
27639
};
27640
27641
#else /* NO_TLS */
27642
27643
static const CipherSuiteInfo cipher_names[] =
27644
{
27645
    SUITE_INFO("NO-TLS","NO-TLS", 0, 0, 0, 0),
27646
};
27647
27648
#endif /* NO_TLS */
27649
27650
/* returns the cipher_names array */
27651
const CipherSuiteInfo* GetCipherNames(void)
27652
0
{
27653
0
    return cipher_names;
27654
0
}
27655
27656
27657
/* returns the number of elements in the cipher_names array */
27658
int GetCipherNamesSize(void)
27659
30.3k
{
27660
#ifdef NO_TLS
27661
    return 0;
27662
#else
27663
30.3k
    return (int)(sizeof(cipher_names) / sizeof(CipherSuiteInfo));
27664
30.3k
#endif
27665
30.3k
}
27666
27667
27668
const char* GetCipherNameInternal(const byte cipherSuite0, const byte cipherSuite)
27669
0
{
27670
0
    int i;
27671
0
    const char* nameInternal = "None";
27672
27673
0
    for (i = 0; i < GetCipherNamesSize(); i++) {
27674
0
        if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
27675
0
            (cipher_names[i].cipherSuite  == cipherSuite)
27676
0
#ifndef NO_CIPHER_SUITE_ALIASES
27677
0
            && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
27678
0
#endif
27679
0
            ) {
27680
0
            nameInternal = cipher_names[i].name;
27681
0
            break;
27682
0
        }
27683
0
    }
27684
0
    return nameInternal;
27685
0
}
27686
27687
#if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
27688
/* Segment cipher name into n[n0,n1,n2,n4]
27689
 * @param cipher a pointer to WOLFSSL_CIPHER
27690
 * @param n return segment cipher name
27691
 * return cipher name if cipher is in the list,
27692
 *        otherwise NULL
27693
 */
27694
const char* GetCipherSegment(const WOLFSSL_CIPHER* cipher, char n[][MAX_SEGMENT_SZ])
27695
{
27696
    int i,j,k;
27697
    int strLen;
27698
    unsigned long offset;
27699
    const char* name;
27700
27701
    /* sanity check */
27702
    if (cipher == NULL || n == NULL)
27703
        return NULL;
27704
27705
    offset = cipher->offset;
27706
27707
    if (offset >= (unsigned long)GetCipherNamesSize())
27708
        return NULL;
27709
27710
    name = cipher_names[offset].name;
27711
27712
    if (name == NULL)
27713
        return NULL;
27714
27715
    /* Segment cipher name into n[n0,n1,n2,n4]
27716
     * These are used later for comparisons to create:
27717
     * keaStr, authStr, encStr, macStr
27718
     *
27719
     * If cipher_name = ECDHE-ECDSA-AES256-SHA
27720
     * then n0 = "ECDHE", n1 = "ECDSA", n2 = "AES256", n3 = "SHA"
27721
     * and n = [n0,n1,n2,n3,0]
27722
     */
27723
    strLen = (int)XSTRLEN(name);
27724
27725
    for (i = 0, j = 0, k = 0; i <= strLen; i++) {
27726
        if (k >= MAX_SEGMENTS || j >= MAX_SEGMENT_SZ)
27727
            break;
27728
27729
        if (name[i] != '-' && name[i] != '\0') {
27730
            n[k][j] = name[i]; /* Fill kth segment string until '-' */
27731
            j++;
27732
        }
27733
        else {
27734
            n[k][j] = '\0';
27735
            j = 0;
27736
            k++;
27737
        }
27738
    }
27739
27740
    return name;
27741
}
27742
27743
/* gcc-12 and later, building with ASAN at -O2 and higher, generate spurious
27744
 * stringop-overread warnings on some (but not all...) reads of n[1] in
27745
 * GetCipherKeaStr().
27746
 */
27747
#if defined(__GNUC__) && __GNUC__ > 11 && defined(__SANITIZE_ADDRESS__)
27748
PRAGMA_GCC_DIAG_PUSH
27749
PRAGMA_GCC("GCC diagnostic ignored \"-Wstringop-overread\"")
27750
#endif
27751
27752
const char* GetCipherKeaStr(char n[][MAX_SEGMENT_SZ]) {
27753
    const char* keaStr = NULL;
27754
27755
    if (XSTRCMP(n[0],"ECDHE") == 0 && XSTRCMP(n[1],"PSK") == 0)
27756
        keaStr = "ECDHEPSK";
27757
    else if ((XSTRCMP(n[0],"ECDH") == 0) || (XSTRCMP(n[0],"ECDHE") == 0))
27758
        keaStr = "ECDH";
27759
    else if (XSTRCMP(n[0],"DHE") == 0 && XSTRCMP(n[1],"PSK") == 0)
27760
        keaStr = "DHEPSK";
27761
    else if (XSTRCMP(n[0],"DHE") == 0)
27762
        keaStr = "DH";
27763
    else if (XSTRCMP(n[0],"RSA") == 0 && XSTRCMP(n[1],"PSK") == 0)
27764
        keaStr = "RSAPSK";
27765
    else if (XSTRCMP(n[0],"SRP") == 0)
27766
        keaStr = "SRP";
27767
    else if (XSTRCMP(n[0],"PSK") == 0)
27768
        keaStr = "PSK";
27769
    else if (XSTRCMP(n[0],"EDH") == 0)
27770
        keaStr = "EDH";
27771
    else if ((XSTRNCMP(n[1],"SHA", 3) == 0) || (XSTRNCMP(n[2],"SHA", 3) == 0) ||
27772
             (XSTRNCMP(n[3],"SHA", 3) == 0) || (XSTRNCMP(n[4],"SHA", 3) == 0) ||
27773
             (XSTRCMP(n[2],"RSA") == 0) || (XSTRCMP(n[0],"AES128") == 0) ||
27774
             (XSTRCMP(n[0],"AES256") == 0) || (XSTRCMP(n[1],"MD5") == 0))
27775
        keaStr = "RSA";
27776
    else if (XSTRCMP(n[0],"NULL") == 0)
27777
        keaStr = "None";
27778
    else
27779
        keaStr = "unknown";
27780
27781
    return keaStr;
27782
}
27783
27784
#if defined(__GNUC__) && __GNUC__ > 11 && defined(__SANITIZE_ADDRESS__)
27785
PRAGMA_GCC_DIAG_POP
27786
#endif
27787
27788
const char* GetCipherAuthStr(char n[][MAX_SEGMENT_SZ]) {
27789
27790
    const char* authStr = NULL;
27791
27792
    if ((XSTRCMP(n[0],"AES128") == 0) || (XSTRCMP(n[0],"AES256") == 0)  ||
27793
        ((XSTRCMP(n[0],"TLS13") == 0) && ((XSTRCMP(n[1],"AES128") == 0) ||
27794
         (XSTRCMP(n[1],"AES256") == 0) || (XSTRCMP(n[1],"CHACHA20") == 0))) ||
27795
        (XSTRCMP(n[0],"RSA") == 0) || (XSTRCMP(n[1],"RSA") == 0) ||
27796
        (XSTRNCMP(n[1],"SHA", 3) == 0) || (XSTRNCMP(n[2],"SHA", 3) == 0) ||
27797
        (XSTRCMP(n[1],"MD5") == 0))
27798
        authStr = "RSA";
27799
    else if (XSTRCMP(n[0],"PSK") == 0 || XSTRCMP(n[1],"PSK") == 0)
27800
        authStr = "PSK";
27801
    else if (XSTRCMP(n[0],"SRP") == 0 && XSTRCMP(n[1],"AES") == 0)
27802
        authStr = "SRP";
27803
    else if (XSTRCMP(n[1],"ECDSA") == 0)
27804
        authStr = "ECDSA";
27805
    else if (XSTRCMP(n[0],"ADH") == 0 || XSTRCMP(n[0],"NULL") == 0)
27806
        authStr = "None";
27807
    else
27808
        authStr = "unknown";
27809
27810
    return authStr;
27811
}
27812
27813
const char* GetCipherEncStr(char n[][MAX_SEGMENT_SZ]) {
27814
    const char* encStr = NULL;
27815
27816
    if ((XSTRCMP(n[0],"AES256") == 0 && XSTRCMP(n[1],"GCM") == 0) ||
27817
        (XSTRCMP(n[1],"AES256") == 0 && XSTRCMP(n[2],"GCM") == 0) ||
27818
        (XSTRCMP(n[2],"AES256") == 0 && XSTRCMP(n[3],"GCM") == 0))
27819
        encStr = "AESGCM(256)";
27820
27821
    else if ((XSTRCMP(n[0],"AES128") == 0 && XSTRCMP(n[1],"GCM") == 0) ||
27822
             (XSTRCMP(n[1],"AES128") == 0 && XSTRCMP(n[2],"GCM") == 0) ||
27823
             (XSTRCMP(n[2],"AES128") == 0 && XSTRCMP(n[3],"GCM") == 0))
27824
        encStr = "AESGCM(128)";
27825
27826
    else if ((XSTRCMP(n[0],"AES128") == 0 && XSTRCMP(n[1],"CCM") == 0) ||
27827
             (XSTRCMP(n[1],"AES128") == 0 && XSTRCMP(n[2],"CCM") == 0) ||
27828
             (XSTRCMP(n[2],"AES128") == 0 && XSTRCMP(n[3],"CCM") == 0))
27829
        encStr = "AESCCM(128)";
27830
27831
    else if ((XSTRCMP(n[0],"AES128") == 0) ||
27832
             (XSTRCMP(n[1],"AES128") == 0) ||
27833
             (XSTRCMP(n[2],"AES128") == 0) ||
27834
             (XSTRCMP(n[1],"AES") == 0 && XSTRCMP(n[2],"128") == 0) ||
27835
             (XSTRCMP(n[2],"AES") == 0 && XSTRCMP(n[3],"128") == 0))
27836
        encStr = "AES(128)";
27837
27838
    else if ((XSTRCMP(n[0],"AES256") == 0) ||
27839
             (XSTRCMP(n[1],"AES256") == 0) ||
27840
             (XSTRCMP(n[2],"AES256") == 0) ||
27841
             (XSTRCMP(n[1],"AES") == 0 && XSTRCMP(n[2],"256") == 0) ||
27842
             (XSTRCMP(n[2],"AES") == 0 && XSTRCMP(n[3],"256") == 0))
27843
        encStr = "AES(256)";
27844
27845
#ifdef HAVE_ARIA
27846
    else if ((XSTRCMP(n[0],"ARIA256") == 0) ||
27847
             (XSTRCMP(n[2],"ARIA256") == 0))
27848
        encStr = "ARIA(256)";
27849
    else if ((XSTRCMP(n[0],"ARIA128") == 0) ||
27850
             (XSTRCMP(n[2],"ARIA128") == 0))
27851
        encStr = "ARIA(128)";
27852
#endif
27853
    else if ((XSTRCMP(n[0],"CAMELLIA256") == 0) ||
27854
             (XSTRCMP(n[2],"CAMELLIA256") == 0))
27855
        encStr = "CAMELLIA(256)";
27856
    else if ((XSTRCMP(n[0],"CAMELLIA128") == 0) ||
27857
             (XSTRCMP(n[2],"CAMELLIA128") == 0))
27858
        encStr = "CAMELLIA(128)";
27859
#ifdef WOLFSSL_SM4_GCM
27860
    else if ((XSTRCMP(n[0],"SM4") == 0 && XSTRCMP(n[1],"GCM") == 0) ||
27861
             (XSTRCMP(n[1],"SM4") == 0 && XSTRCMP(n[2],"GCM") == 0) ||
27862
             (XSTRCMP(n[2],"SM4") == 0 && XSTRCMP(n[3],"GCM") == 0))
27863
        encStr = "SM4-GCM";
27864
#endif
27865
#ifdef WOLFSSL_SM4_CCM
27866
    else if ((XSTRCMP(n[0],"SM4") == 0 && XSTRCMP(n[1],"CCM") == 0) ||
27867
             (XSTRCMP(n[1],"SM4") == 0 && XSTRCMP(n[2],"CCM") == 0) ||
27868
             (XSTRCMP(n[2],"SM4") == 0 && XSTRCMP(n[3],"CCM") == 0))
27869
        encStr = "SM4-CCM";
27870
#endif
27871
#ifdef WOLFSSL_SM4_CBC
27872
    else if ((XSTRCMP(n[0],"SM4") == 0) ||
27873
             (XSTRCMP(n[2],"SM4") == 0))
27874
        encStr = "SM4";
27875
#endif
27876
    else if ((XSTRCMP(n[0],"RC4") == 0) || (XSTRCMP(n[1],"RC4") == 0) ||
27877
            (XSTRCMP(n[2],"RC4") == 0))
27878
        encStr = "RC4";
27879
    else if (((XSTRCMP(n[0],"DES") == 0)  || (XSTRCMP(n[1],"DES") == 0) ||
27880
              (XSTRCMP(n[2],"DES") == 0)) &&
27881
             ((XSTRCMP(n[1],"CBC3") == 0) || (XSTRCMP(n[2],"CBC3") == 0) ||
27882
              (XSTRCMP(n[3],"CBC3") == 0)))
27883
        encStr = "3DES";
27884
    else if ((XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
27885
             (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
27886
        encStr = "CHACHA20/POLY1305(256)";
27887
    else if ((XSTRCMP(n[0],"NULL") == 0) || (XSTRCMP(n[1],"NULL") == 0) ||
27888
             (XSTRCMP(n[2],"NULL") == 0) ||
27889
             ((XSTRCMP(n[0],"TLS13") == 0) && (XSTRCMP(n[3],"") == 0)))
27890
        encStr = "None";
27891
    else
27892
        encStr = "unknown";
27893
27894
    return encStr;
27895
}
27896
27897
/* Check if a cipher is AEAD
27898
 * @param n return segment cipher name
27899
 * return 1 if the cipher is AEAD, otherwise 0
27900
 */
27901
int IsCipherAEAD(char n[][MAX_SEGMENT_SZ])
27902
{
27903
    WOLFSSL_ENTER("IsCipherAEAD");
27904
27905
    if (n == NULL) {
27906
        WOLFSSL_MSG("bad function argument. n is NULL.");
27907
        return 0;
27908
    }
27909
27910
    if ((XSTRCMP(n[2],"GCM") == 0) || (XSTRCMP(n[3],"GCM") == 0) ||
27911
        (XSTRCMP(n[1],"CCM") == 0) ||
27912
        (XSTRCMP(n[2],"CCM") == 0) || (XSTRCMP(n[3],"CCM") == 0) ||
27913
        (XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
27914
        (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
27915
        return 1;
27916
    return 0;
27917
}
27918
27919
/* Returns the MAC string of a cipher or "unknown" on failure */
27920
const char* GetCipherMacStr(char n[][MAX_SEGMENT_SZ]) {
27921
27922
    const char* macStr = NULL;
27923
27924
    if ((XSTRCMP(n[4],"SHA256") == 0) || (XSTRCMP(n[3],"SHA256") == 0) ||
27925
        (XSTRCMP(n[2],"SHA256") == 0) || (XSTRCMP(n[1],"SHA256") == 0))
27926
        macStr = "SHA256";
27927
    else if ((XSTRCMP(n[4],"SHA384") == 0) ||
27928
             (XSTRCMP(n[3],"SHA384") == 0) ||
27929
             (XSTRCMP(n[2],"SHA384") == 0) ||
27930
             (XSTRCMP(n[1],"SHA384") == 0))
27931
        macStr = "SHA384";
27932
#ifdef WOLFSSL_SM3
27933
    else if ((XSTRCMP(n[4],"SM3") == 0) ||
27934
             (XSTRCMP(n[3],"SM3") == 0) ||
27935
             (XSTRCMP(n[2],"SM3") == 0) ||
27936
             (XSTRCMP(n[1],"SM3") == 0))
27937
        macStr = "SM3";
27938
#endif
27939
    else if ((XSTRCMP(n[4],"SHA") == 0) || (XSTRCMP(n[3],"SHA") == 0) ||
27940
             (XSTRCMP(n[2],"SHA") == 0) || (XSTRCMP(n[1],"SHA") == 0) ||
27941
             (XSTRCMP(n[1],"MD5") == 0))
27942
        macStr = "SHA1";
27943
    else if ((XSTRCMP(n[3],"GCM") == 0) ||
27944
             (XSTRCMP(n[1],"CCM") == 0) ||
27945
             (XSTRCMP(n[2],"CCM") == 0) || (XSTRCMP(n[3],"CCM") == 0) ||
27946
             (XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
27947
             (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
27948
        macStr = "AEAD";
27949
    else
27950
        macStr = "unknown";
27951
27952
    return macStr;
27953
}
27954
27955
/* Returns the number of bits based on the cipher enc string, or 0 on failure */
27956
int SetCipherBits(const char* enc) {
27957
    int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
27958
27959
    if ((XSTRCMP(enc,"AESGCM(256)") == 0) ||
27960
        (XSTRCMP(enc,"AES(256)") == 0) ||
27961
        (XSTRCMP(enc,"CAMELLIA(256)") == 0) ||
27962
        (XSTRCMP(enc,"CHACHA20/POLY1305(256)") == 0))
27963
            ret = 256;
27964
    else if
27965
        ((XSTRCMP(enc,"3DES") == 0))
27966
            ret = 168;
27967
    else if
27968
        ((XSTRCMP(enc,"AESGCM(128)") == 0) ||
27969
         (XSTRCMP(enc,"AES(128)") == 0) ||
27970
         (XSTRCMP(enc,"CAMELLIA(128)") == 0) ||
27971
         (XSTRCMP(enc,"RC4") == 0))
27972
            ret = 128;
27973
   else if
27974
        ((XSTRCMP(enc,"DES") == 0))
27975
            ret = 56;
27976
27977
    return ret;
27978
}
27979
#endif /* WOLFSSL_QT || OPENSSL_ALL */
27980
27981
const char* GetCipherNameIana(const byte cipherSuite0, const byte cipherSuite)
27982
0
{
27983
0
#ifndef NO_ERROR_STRINGS
27984
0
    int i;
27985
0
    const char* nameIana = "NONE";
27986
27987
0
    for (i = 0; i < GetCipherNamesSize(); i++) {
27988
0
        if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
27989
0
            (cipher_names[i].cipherSuite  == cipherSuite)
27990
0
#ifndef NO_CIPHER_SUITE_ALIASES
27991
0
            && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
27992
0
#endif
27993
0
            ) {
27994
0
            nameIana = cipher_names[i].name_iana;
27995
0
            break;
27996
0
        }
27997
0
    }
27998
0
    return nameIana;
27999
#else
28000
    (void)cipherSuite0;
28001
    (void)cipherSuite;
28002
    return NULL;
28003
#endif
28004
0
}
28005
28006
const char* wolfSSL_get_cipher_name_internal(WOLFSSL* ssl)
28007
0
{
28008
0
    if (ssl == NULL) {
28009
0
        return NULL;
28010
0
    }
28011
28012
0
    return GetCipherNameInternal(ssl->options.cipherSuite0, ssl->options.cipherSuite);
28013
0
}
28014
28015
const char* wolfSSL_get_cipher_name_iana(WOLFSSL* ssl)
28016
0
{
28017
0
    if (ssl == NULL) {
28018
0
        return NULL;
28019
0
    }
28020
28021
0
    return GetCipherNameIana(ssl->options.cipherSuite0, ssl->options.cipherSuite);
28022
0
}
28023
28024
int GetCipherSuiteFromName(const char* name, byte* cipherSuite0,
28025
                       byte* cipherSuite, byte* major, byte* minor, int* flags)
28026
0
{
28027
0
    int           ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
28028
0
    int           i;
28029
0
    unsigned long len;
28030
0
    const char*   nameDelim;
28031
28032
0
    (void)major;
28033
0
    (void)minor;
28034
28035
    /* Support trailing : */
28036
0
    nameDelim = XSTRSTR(name, ":");
28037
0
    if (nameDelim)
28038
0
        len = (unsigned long)(nameDelim - name);
28039
0
    else
28040
0
        len = (unsigned long)XSTRLEN(name);
28041
28042
0
    for (i = 0; i < GetCipherNamesSize(); i++) {
28043
0
        int found = (XSTRNCMP(name, cipher_names[i].name, len) == 0) &&
28044
0
                    (cipher_names[i].name[len] == 0);
28045
0
#ifndef NO_ERROR_STRINGS
28046
0
        if (!found)
28047
0
            found = (XSTRNCMP(name, cipher_names[i].name_iana, len) == 0) &&
28048
0
                    (cipher_names[i].name_iana[len] == 0);
28049
0
#endif
28050
28051
0
        if (found) {
28052
0
            if (cipherSuite0 != NULL)
28053
0
                *cipherSuite0 = cipher_names[i].cipherSuite0;
28054
0
            if (cipherSuite != NULL)
28055
0
                *cipherSuite  = cipher_names[i].cipherSuite;
28056
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_QT) || \
28057
    defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
28058
            if (major != NULL)
28059
                *major = cipher_names[i].major;
28060
            if (minor != NULL)
28061
                *minor = cipher_names[i].minor;
28062
#endif
28063
0
            if (flags != NULL)
28064
0
                *flags = cipher_names[i].flags;
28065
0
            ret = 0;
28066
0
            break;
28067
0
        }
28068
0
    }
28069
28070
0
    return ret;
28071
0
}
28072
28073
/**
28074
Set the enabled cipher suites.
28075
28076
With OPENSSL_EXTRA we attempt to understand some of the available "bulk"
28077
ciphersuites. We can not perfectly filter ciphersuites based on the "bulk"
28078
names but we do what we can. Ciphersuites named explicitly take precedence to
28079
ciphersuites introduced through the "bulk" ciphersuites.
28080
28081
@param [out] suites Suites structure.
28082
@param [in]  list   List of cipher suites, only supports full name from
28083
                    cipher_names[] delimited by ':'.
28084
28085
@return true on success, else false.
28086
*/
28087
static int ParseCipherList(Suites* suites,
28088
        const char* list, ProtocolVersion version, int privateKeySz, byte side)
28089
{
28090
    int       ret              = 0;
28091
    int       idx              = 0;
28092
    int       haveSig          = 0;
28093
    word16    haveRSA          = 0;
28094
#ifdef OPENSSL_EXTRA
28095
    word16    haveDH           = 0;
28096
    word16    haveECC          = 0;
28097
    word16    haveStaticRSA    = 1; /* allowed by default if compiled in */
28098
    word16    haveStaticECC    = 0;
28099
    word16    haveNull         = 1; /* allowed by default if compiled in */
28100
    int       callInitSuites   = 0;
28101
    word16    havePSK          = 0;
28102
    word16    haveAES128       = 1; /* allowed by default if compiled in */
28103
    word16    haveSHA1         = 1; /* allowed by default if compiled in */
28104
    word16    haveRC4          = 1; /* allowed by default if compiled in */
28105
#endif
28106
    const int suiteSz       = GetCipherNamesSize();
28107
    const char* next        = list;
28108
28109
    if (suites == NULL || list == NULL) {
28110
        WOLFSSL_MSG("SetCipherList parameter error");
28111
        return 0;
28112
    }
28113
28114
    if (next[0] == '\0' ||
28115
        XSTRCMP(next, "ALL") == 0 ||
28116
        XSTRCMP(next, "DEFAULT") == 0 ||
28117
        XSTRCMP(next, "HIGH") == 0)
28118
    {
28119
        /* Add all ciphersuites except anonymous and null ciphers. Prefer RSA */
28120
#ifndef NO_RSA
28121
        haveRSA = 1;
28122
#endif
28123
        InitSuites(suites, version,
28124
#ifndef NO_CERTS
28125
                privateKeySz,
28126
#else
28127
                0,
28128
#endif
28129
                haveRSA, 1, 1, !haveRSA, 1, haveRSA, !haveRSA, 0, 0, 1,
28130
                1, 1, side
28131
        );
28132
        return 1; /* wolfSSL default */
28133
    }
28134
28135
    do {
28136
        const char* current = next;
28137
        char   name[MAX_SUITE_NAME + 1];
28138
        int    i;
28139
        word32 length;
28140
    #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
28141
        word16 allowing = 1;
28142
    #endif
28143
28144
        next = XSTRSTR(next, ":");
28145
        length = MAX_SUITE_NAME;
28146
        if (next != NULL) {
28147
            word32 currLen = (word32)(next - current);
28148
            if (length > currLen) {
28149
                length = currLen;
28150
            }
28151
            if (currLen == 0)
28152
                break;
28153
            ++next; /* increment to skip ':' */
28154
        }
28155
28156
    #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
28157
        if (length > 1) {
28158
            if (*current == '!') {
28159
                allowing = 0;
28160
                current++;
28161
                length--;
28162
            }
28163
        }
28164
    #endif
28165
28166
        XSTRNCPY(name, current, length);
28167
        name[(length == sizeof(name)) ? length - 1 : length] = 0;
28168
28169
28170
    #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
28171
        if (length > 1) {
28172
            char* substr = NULL;
28173
            char* substrCurrent = name;
28174
28175
            /* extract first public key type from a string like ECDHE+AESGCM */
28176
            substr = XSTRSTR(substrCurrent, "+");
28177
            if (substr != NULL) {
28178
                do {
28179
                    if (substr) {
28180
                        length = (word32)(substr - substrCurrent);
28181
                        substrCurrent[length] = '\0';
28182
                    }
28183
                    else {
28184
                        length = (word32)XSTRLEN(substrCurrent);
28185
                    }
28186
28187
                    /* check if is a public key type */
28188
                    if (XSTRCMP(substrCurrent, "ECDHE") == 0 ||
28189
                        XSTRCMP(substrCurrent, "RSA")   == 0 ||
28190
                        XSTRCMP(substrCurrent, "DHE")   == 0) {
28191
                        if (name != substrCurrent)
28192
                            XMEMMOVE(name, substrCurrent, length);
28193
                        name[length] = '\0';
28194
                        break;
28195
                    }
28196
28197
                    substrCurrent = substr;
28198
                    if (substr) {
28199
                        substrCurrent = substrCurrent + 1; /* +1 to skip over '+' */
28200
                        substr  = XSTRSTR(substrCurrent, "+");
28201
                    }
28202
                } while (substrCurrent != NULL);
28203
            }
28204
        }
28205
28206
        if (XSTRCMP(name, "DEFAULT") == 0 || XSTRCMP(name, "ALL") == 0) {
28207
            if (XSTRCMP(name, "ALL") == 0)
28208
                haveSig |= SIG_ANON;
28209
            else
28210
                haveSig &= ~SIG_ANON;
28211
            haveRSA = 1;
28212
            haveDH = 1;
28213
            haveECC = 1;
28214
28215
            /* having static ECC will disable all RSA use, do not set
28216
             * static ECC suites here
28217
             * haveStaticECC = 1; */
28218
            haveStaticRSA = 1;
28219
            haveSig |= SIG_RSA;
28220
            havePSK = 1;
28221
            haveNull = 0;
28222
28223
            callInitSuites = 1;
28224
            ret = 1;
28225
            continue;
28226
        }
28227
28228
        /* We don't have a way to disallow high bit sizes. Only disable unsafe
28229
         * ciphersuites. */
28230
        if (XSTRCMP(name, "HIGH") == 0 && allowing) {
28231
            /* Disable static, anonymous, and null ciphers */
28232
            haveSig &= ~SIG_ANON;
28233
            haveRSA = 1;
28234
            haveDH = 1;
28235
            haveECC = 1;
28236
            haveStaticECC = 0;
28237
            haveStaticRSA = 0;
28238
            haveSig |= SIG_RSA;
28239
            havePSK = 1;
28240
            haveNull = 0;
28241
28242
            callInitSuites = 1;
28243
            ret = 1;
28244
            continue;
28245
        }
28246
28247
        if (XSTRCMP(name, "aNULL") == 0) {
28248
            if (allowing)
28249
                haveSig |= SIG_ANON;
28250
            else
28251
                haveSig &= ~SIG_ANON;
28252
            if (allowing) {
28253
                /* Allow RSA by default. */
28254
                if (!haveECC)
28255
                    haveRSA = 1;
28256
                if ((haveSig & SIG_ECDSA) == 0)
28257
                    haveSig |= SIG_RSA;
28258
                callInitSuites = 1;
28259
                ret = 1;
28260
            }
28261
            continue;
28262
        }
28263
28264
        if (XSTRCMP(name, "eNULL") == 0 || XSTRCMP(name, "NULL") == 0) {
28265
            haveNull = allowing;
28266
            if (allowing) {
28267
                /* Allow RSA by default. */
28268
                if (!haveECC)
28269
                    haveRSA = 1;
28270
                if ((haveSig & SIG_ECDSA) == 0)
28271
                    haveSig |= SIG_RSA;
28272
                callInitSuites = 1;
28273
                ret = 1;
28274
            }
28275
            continue;
28276
        }
28277
28278
        if (XSTRCMP(name, "kDH") == 0) {
28279
            if (allowing) {
28280
                haveDH = 1;
28281
                callInitSuites = 1;
28282
                ret = 1;
28283
            }
28284
            continue;
28285
        }
28286
28287
        if (XSTRCMP(name, "DHE") == 0 || XSTRCMP(name, "EDH") == 0) {
28288
            if (allowing) {
28289
                haveDH = 1;
28290
                callInitSuites = 1;
28291
                ret = 1;
28292
            }
28293
            continue;
28294
        }
28295
28296
        if (XSTRCMP(name, "ECDHE") == 0 || XSTRCMP(name, "EECDH") == 0) {
28297
            if (allowing) {
28298
                haveECC = 1;
28299
                haveSig |= SIG_ECDSA;
28300
                callInitSuites = 1;
28301
                ret = 1;
28302
            }
28303
            continue;
28304
        }
28305
28306
        if (XSTRCMP(name, "kRSA") == 0 || XSTRCMP(name, "RSA") == 0) {
28307
            haveStaticRSA = allowing;
28308
            if (allowing) {
28309
                haveRSA = 1;
28310
                haveSig |= SIG_RSA;
28311
                callInitSuites = 1;
28312
                ret = 1;
28313
            }
28314
            continue;
28315
        }
28316
28317
        if (XSTRCMP(name, "PSK") == 0) {
28318
            havePSK = allowing;
28319
            haveSig |= SIG_RSA;
28320
            if (allowing) {
28321
                /* Allow RSA by default. */
28322
                if (!haveECC)
28323
                    haveRSA = 1;
28324
                if ((haveSig & SIG_ECDSA) == 0)
28325
                    haveSig |= SIG_RSA;
28326
                callInitSuites = 1;
28327
                ret = 1;
28328
            }
28329
            continue;
28330
        }
28331
28332
        #if defined(WOLFSSL_SYS_CRYPTO_POLICY)
28333
        if (XSTRCMP(name, "AES128") == 0) {
28334
            haveAES128 = allowing;
28335
            callInitSuites = 1;
28336
            ret = 1;
28337
            continue;
28338
        }
28339
28340
        if (XSTRCMP(name, "SHA1") == 0) {
28341
            haveSHA1 = allowing;
28342
            callInitSuites = 1;
28343
            ret = 1;
28344
            continue;
28345
        }
28346
28347
        if (XSTRCMP(name, "RC4") == 0) {
28348
            haveRC4 = allowing;
28349
            callInitSuites = 1;
28350
            ret = 1;
28351
            continue;
28352
        }
28353
        #endif /* WOLFSSL_SYS_CRYPTO_POLICY */
28354
28355
        if (XSTRCMP(name, "LOW") == 0 || XSTRCMP(name, "MEDIUM") == 0) {
28356
            /* No way to limit or allow low bit sizes */
28357
            if (allowing) {
28358
                /* Allow RSA by default */
28359
                haveRSA = 1;
28360
                haveSig |= SIG_RSA;
28361
                callInitSuites = 1;
28362
                ret = 1;
28363
            }
28364
            continue;
28365
        }
28366
28367
        if (XSTRCMP(name, "DSS") == 0) {
28368
            /* No support for DSA ciphersuites */
28369
            continue;
28370
        }
28371
28372
        if (XSTRCMP(name, "EXP") == 0 || XSTRCMP(name, "EXPORT") == 0) {
28373
            /* wolfSSL doesn't support "export" ciphers. We can skip this */
28374
            continue;
28375
        }
28376
28377
        #if defined(WOLFSSL_SYS_CRYPTO_POLICY)
28378
        if (XSTRNCMP(name, WOLFSSL_SECLEVEL_STR,
28379
                     strlen(WOLFSSL_SECLEVEL_STR)) == 0) {
28380
            /* Skip the "@SECLEVEL=N" string, we'll process it elsewhere. */
28381
            continue;
28382
        }
28383
        #endif /* WOLFSSL_SYS_CRYPTO_POLICY */
28384
    #endif /* OPENSSL_EXTRA */
28385
28386
        for (i = 0; i < suiteSz; i++) {
28387
            if (XSTRNCMP(name, cipher_names[i].name, sizeof(name)) == 0
28388
            #ifndef NO_ERROR_STRINGS
28389
                || XSTRNCMP(name, cipher_names[i].name_iana, sizeof(name)) == 0
28390
            #endif
28391
             ) {
28392
                int j;
28393
28394
            #ifdef WOLFSSL_DTLS
28395
                /* don't allow stream ciphers with DTLS */
28396
                if (version.major == DTLS_MAJOR) {
28397
                    if (XSTRSTR(name, "RC4"))
28398
                    {
28399
                        WOLFSSL_MSG("Stream ciphers not supported with DTLS");
28400
                        continue;
28401
                    }
28402
28403
                }
28404
            #endif /* WOLFSSL_DTLS */
28405
28406
                for (j = 0; j < idx; j += 2) {
28407
                    if ((suites->suites[j+0] == cipher_names[i].cipherSuite0) &&
28408
                        (suites->suites[j+1] == cipher_names[i].cipherSuite)) {
28409
                        break;
28410
                    }
28411
                }
28412
                /* Silently drop duplicates from list. */
28413
                if (j != idx) {
28414
                    break;
28415
                }
28416
28417
                if (idx + 1 >= WOLFSSL_MAX_SUITE_SZ) {
28418
                    WOLFSSL_MSG("WOLFSSL_MAX_SUITE_SZ set too low");
28419
                    return 0; /* suites buffer not large enough, error out */
28420
                }
28421
28422
                suites->suites[idx++] = cipher_names[i].cipherSuite0;
28423
                suites->suites[idx++] = cipher_names[i].cipherSuite;
28424
                /* The suites are either ECDSA, RSA, PSK, or Anon. The RSA
28425
                 * suites don't necessarily have RSA in the name. */
28426
        #ifdef WOLFSSL_TLS13
28427
                if (cipher_names[i].cipherSuite0 == TLS13_BYTE ||
28428
                         (cipher_names[i].cipherSuite0 == ECC_BYTE &&
28429
                          (cipher_names[i].cipherSuite == TLS_SHA256_SHA256 ||
28430
                           cipher_names[i].cipherSuite == TLS_SHA384_SHA384))) {
28431
                #ifndef NO_RSA
28432
                    haveSig |= SIG_RSA;
28433
                #endif
28434
                #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
28435
                                                             defined(HAVE_ED448)
28436
                    haveSig |= SIG_ECDSA;
28437
                #endif
28438
                #ifdef HAVE_FALCON
28439
                    haveSig |= SIG_FALCON;
28440
                #endif /* HAVE_FALCON */
28441
                #ifdef HAVE_DILITHIUM
28442
                    haveSig |= SIG_DILITHIUM;
28443
                #endif /* HAVE_DILITHIUM */
28444
                }
28445
                else
28446
            #ifdef BUILD_TLS_SM4_GCM_SM3
28447
                if ((cipher_names[i].cipherSuite0 == CIPHER_BYTE) &&
28448
                       (cipher_names[i].cipherSuite == TLS_SM4_GCM_SM3)) {
28449
                    haveSig |= SIG_SM2;
28450
                }
28451
                else
28452
            #endif
28453
            #ifdef BUILD_TLS_SM4_CCM_SM3
28454
                if ((cipher_names[i].cipherSuite0 == CIPHER_BYTE) &&
28455
                       (cipher_names[i].cipherSuite == TLS_SM4_CCM_SM3)) {
28456
                    haveSig |= SIG_SM2;
28457
                }
28458
                else
28459
            #endif
28460
        #endif /* WOLFSSL_TLS13 */
28461
        #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && \
28462
            (defined(WOLFSSL_SM4_CBC) || defined(WOLFSSL_SM4_GCM) || \
28463
             defined(WOLFSSL_SM4_CCM))
28464
                if ((cipher_names[i].cipherSuite0 == SM_BYTE) && (0
28465
                #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
28466
                     || (cipher_names[i].cipherSuite ==
28467
                            TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3)
28468
                #endif
28469
                #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
28470
                     || (cipher_names[i].cipherSuite ==
28471
                            TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3)
28472
                #endif
28473
                #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
28474
                     || (cipher_names[i].cipherSuite ==
28475
                            TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3)
28476
                #endif
28477
                    )) {
28478
                    haveSig |= SIG_SM2;
28479
                }
28480
                else
28481
            #endif
28482
            #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
28483
                                                             defined(HAVE_ED448)
28484
                if (XSTRSTR(name, "ECDSA"))
28485
                    haveSig |= SIG_ECDSA;
28486
                else
28487
            #endif
28488
            #ifdef HAVE_ANON
28489
                if (XSTRSTR(name, "ADH"))
28490
                    haveSig |= SIG_ANON;
28491
                else
28492
            #endif
28493
            #ifndef NO_PSK
28494
                if (XSTRSTR(name, "PSK") == NULL)
28495
            #endif
28496
                {
28497
                    /* Fall back to RSA */
28498
                    haveSig |= SIG_RSA;
28499
                }
28500
28501
                ret = 1; /* found at least one */
28502
                break;
28503
            }
28504
        }
28505
    } while (next);
28506
28507
    if (ret) {
28508
        int keySz = 0;
28509
    #ifndef NO_CERTS
28510
        keySz = privateKeySz;
28511
    #endif
28512
    #ifdef OPENSSL_EXTRA
28513
        if (callInitSuites) {
28514
            suites->setSuites = 0; /* Force InitSuites */
28515
            suites->hashSigAlgoSz = 0; /* Force InitSuitesHashSigAlgo call
28516
                                        * inside InitSuites */
28517
            InitSuites(suites, version, keySz, (word16)haveRSA,
28518
                       (word16)havePSK, (word16)haveDH,
28519
                       (word16)((haveSig & SIG_ECDSA) != 0),
28520
                       (word16)haveECC, (word16)haveStaticRSA,
28521
                       (word16)haveStaticECC,
28522
                       (word16)((haveSig & SIG_ANON) != 0),
28523
                       (word16)haveNull, (word16)haveAES128,
28524
                       (word16)haveSHA1, (word16)haveRC4, side);
28525
            /* Restore user ciphers ahead of defaults */
28526
            XMEMMOVE(suites->suites + idx, suites->suites,
28527
                    min(suites->suiteSz, WOLFSSL_MAX_SUITE_SZ-idx));
28528
            suites->suiteSz += (word16)idx;
28529
        }
28530
        else
28531
    #endif
28532
        {
28533
            suites->suiteSz   = (word16)idx;
28534
            InitSuitesHashSigAlgo(suites->hashSigAlgo, haveSig, 1, keySz,
28535
                                  &suites->hashSigAlgoSz);
28536
        }
28537
28538
#ifdef HAVE_RENEGOTIATION_INDICATION
28539
        if (side == WOLFSSL_CLIENT_END) {
28540
            if (suites->suiteSz > WOLFSSL_MAX_SUITE_SZ - 2) {
28541
                WOLFSSL_MSG("Too many ciphersuites");
28542
                return 0;
28543
            }
28544
            suites->suites[suites->suiteSz] = CIPHER_BYTE;
28545
            suites->suites[suites->suiteSz+1] =
28546
                TLS_EMPTY_RENEGOTIATION_INFO_SCSV;
28547
            suites->suiteSz += 2;
28548
        }
28549
#endif
28550
        suites->setSuites = 1;
28551
    }
28552
28553
#ifdef NO_CERTS
28554
    (void)privateKeySz;
28555
#endif
28556
28557
    return ret;
28558
}
28559
28560
int SetCipherList_ex(const WOLFSSL_CTX* ctx, const WOLFSSL* ssl,
28561
        Suites* suites, const char* list)
28562
48
{
28563
48
    ProtocolVersion version;
28564
48
    int privateKeySz = 0;
28565
48
    byte side;
28566
28567
48
    if (ctx != NULL) {
28568
48
        version = ctx->method->version;
28569
48
#ifndef NO_CERTS
28570
48
        privateKeySz = ctx->privateKeySz;
28571
48
#endif
28572
48
        side = ctx->method->side;
28573
48
    }
28574
0
    else if (ssl != NULL) {
28575
0
        version = ssl->version;
28576
0
#ifndef NO_CERTS
28577
0
        privateKeySz = ssl->buffers.keySz;
28578
0
#endif
28579
0
        side = (byte)ssl->options.side;
28580
0
    }
28581
0
    else {
28582
0
        WOLFSSL_MSG("SetCipherList_ex parameter error");
28583
0
        return 0;
28584
0
    }
28585
28586
48
    return ParseCipherList(suites, list, version, privateKeySz, side);
28587
48
}
28588
28589
int SetCipherList(const WOLFSSL_CTX* ctx, Suites* suites,
28590
                                 const char* list)
28591
0
{
28592
0
    return SetCipherList_ex(ctx, NULL, suites, list);
28593
0
}
28594
28595
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_SET_CIPHER_BYTES)
28596
int SetCipherListFromBytes(WOLFSSL_CTX* ctx, Suites* suites, const byte* list,
28597
                           const int listSz)
28598
{
28599
    int ret = 0;
28600
    int idx = 0;
28601
    int i;
28602
28603
    int haveRSAsig       = 0;
28604
    int haveECDSAsig     = 0;
28605
    int haveFalconSig    = 0;
28606
    int haveDilithiumSig = 0;
28607
    int haveAnon         = 0;
28608
28609
    if (suites == NULL || list == NULL) {
28610
        WOLFSSL_MSG("SetCipherListFromBytes parameter error");
28611
        return 0;
28612
    }
28613
28614
    if ((listSz % 2) != 0) {
28615
        return 0;
28616
    }
28617
28618
    for (i = 0; (i + 1) < listSz; i += 2) {
28619
        const byte firstByte = list[i];
28620
        const byte secondByte = list[i + 1];
28621
        const char* name = NULL;
28622
        int j;
28623
28624
        name = GetCipherNameInternal(firstByte, secondByte);
28625
        if (XSTRCMP(name, "None") == 0) {
28626
            /* bytes don't match any known cipher */
28627
            continue;
28628
        }
28629
28630
    #ifdef WOLFSSL_DTLS
28631
        /* don't allow stream ciphers with DTLS */
28632
        if (ctx->method->version.major == DTLS_MAJOR) {
28633
            if (XSTRSTR(name, "RC4")) {
28634
                WOLFSSL_MSG("Stream ciphers not supported with DTLS");
28635
                continue;
28636
            }
28637
        }
28638
    #endif /* WOLFSSL_DTLS */
28639
28640
        for (j = 0; j < idx; j += 2) {
28641
            if ((suites->suites[j+0] == firstByte) &&
28642
                    (suites->suites[j+1] == secondByte)) {
28643
                break;
28644
            }
28645
        }
28646
        /* Silently drop duplicates from list. */
28647
        if (j != idx) {
28648
            continue;
28649
        }
28650
28651
        if (idx + 1 >= WOLFSSL_MAX_SUITE_SZ) {
28652
            WOLFSSL_MSG("WOLFSSL_MAX_SUITE_SZ set too low");
28653
            return 0; /* suites buffer not large enough, error out */
28654
        }
28655
28656
        suites->suites[idx++] = firstByte;
28657
        suites->suites[idx++] = secondByte;
28658
28659
        /* The suites are either ECDSA, RSA, PSK, or Anon. The RSA
28660
         * suites don't necessarily have RSA in the name. */
28661
    #ifdef WOLFSSL_TLS13
28662
        if (firstByte == TLS13_BYTE || (firstByte == ECC_BYTE &&
28663
             (secondByte == TLS_SHA256_SHA256 ||
28664
              secondByte == TLS_SHA384_SHA384)) ||
28665
            (firstByte == CIPHER_BYTE && (secondByte == TLS_SM4_GCM_SM3 ||
28666
              secondByte == TLS_SM4_CCM_SM3))) {
28667
        #ifndef NO_RSA
28668
            haveRSAsig = 1;
28669
        #endif
28670
        #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
28671
            haveECDSAsig = 1;
28672
        #endif
28673
        #ifdef HAVE_FALCON
28674
            haveFalconSig = 1;
28675
        #endif /* HAVE_FALCON */
28676
        #ifdef HAVE_DILITHIUM
28677
            haveDilithiumSig = 1;
28678
        #endif /* HAVE_DILITHIUM */
28679
        }
28680
        else
28681
    #endif /* WOLFSSL_TLS13 */
28682
    #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
28683
        if ((haveECDSAsig == 0) && XSTRSTR(name, "ECDSA"))
28684
            haveECDSAsig = 1;
28685
        else
28686
    #endif
28687
    #ifdef HAVE_ANON
28688
        if (XSTRSTR(name, "ADH"))
28689
            haveAnon = 1;
28690
        else
28691
    #endif
28692
        if (haveRSAsig == 0
28693
        #ifndef NO_PSK
28694
            && (XSTRSTR(name, "PSK") == NULL)
28695
        #endif
28696
        ) {
28697
            haveRSAsig = 1;
28698
        }
28699
28700
        ret = 1; /* found at least one */
28701
    }
28702
28703
    if (ret) {
28704
        int keySz = 0;
28705
        int haveSig = 0;
28706
    #ifndef NO_CERTS
28707
        keySz = ctx->privateKeySz;
28708
    #endif
28709
        suites->suiteSz = (word16)idx;
28710
        haveSig |= haveECDSAsig ? SIG_ECDSA : 0;
28711
    #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
28712
        haveSig |= haveECDSAsig ? SIG_SM2 : 0;
28713
    #endif
28714
        haveSig |= haveRSAsig ? SIG_RSA : 0;
28715
        haveSig |= haveFalconSig ? SIG_FALCON : 0;
28716
        haveSig |= haveDilithiumSig ? SIG_DILITHIUM : 0;
28717
        haveSig |= haveAnon ? SIG_ANON : 0;
28718
        InitSuitesHashSigAlgo(suites->hashSigAlgo, haveSig, 1, keySz,
28719
            &suites->hashSigAlgoSz);
28720
#ifdef HAVE_RENEGOTIATION_INDICATION
28721
        if (ctx->method->side == WOLFSSL_CLIENT_END) {
28722
            if (suites->suiteSz > WOLFSSL_MAX_SUITE_SZ - 2) {
28723
                WOLFSSL_MSG("Too many ciphersuites");
28724
                return 0;
28725
            }
28726
            suites->suites[suites->suiteSz] = CIPHER_BYTE;
28727
            suites->suites[suites->suiteSz+1] =
28728
                TLS_EMPTY_RENEGOTIATION_INFO_SCSV;
28729
            suites->suiteSz += 2;
28730
        }
28731
#endif
28732
        suites->setSuites = 1;
28733
    }
28734
28735
    (void)ctx;
28736
28737
    return ret;
28738
}
28739
#endif /* OPENSSL_EXTRA || WOLFSSL_SET_CIPHER_BYTES */
28740
28741
28742
#ifdef OPENSSL_EXTRA
28743
28744
struct mac_algs {
28745
    byte alg;
28746
    const char* name;
28747
} mac_names[] = {
28748
#ifndef NO_SHA256
28749
    { sha256_mac, "SHA256" },
28750
#endif
28751
#ifdef WOLFSSL_SHA384
28752
    { sha384_mac, "SHA384" },
28753
#endif
28754
#ifdef WOLFSSL_SHA512
28755
    { sha512_mac, "SHA512" },
28756
#endif
28757
#ifdef WOLFSSL_SHA224
28758
    { sha224_mac, "SHA224" },
28759
#endif
28760
#ifdef WOLFSSL_SM3
28761
    { sm3_mac,    "SM3" },
28762
#endif
28763
#if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
28764
                                                defined(WOLFSSL_ALLOW_TLS_SHA1))
28765
    { sha_mac,    "SHA1" },
28766
#endif
28767
};
28768
#define MAC_NAMES_SZ    (int)(sizeof(mac_names)/sizeof(*mac_names))
28769
28770
/* Convert the hash algorithm string to a TLS MAC algorithm num. */
28771
static byte GetMacAlgFromName(const char* name, int len)
28772
{
28773
    byte alg = no_mac;
28774
    int i;
28775
28776
    for (i = 0; i < MAC_NAMES_SZ; i++) {
28777
        if (((int)XSTRLEN(mac_names[i].name) == len) &&
28778
                                 (XMEMCMP(mac_names[i].name, name, len) == 0)) {
28779
            alg = mac_names[i].alg;
28780
            break;
28781
        }
28782
    }
28783
28784
    return alg;
28785
}
28786
28787
struct sig_algs {
28788
    byte alg;
28789
    const char* name;
28790
} sig_names[] = {
28791
#ifndef NO_RSA
28792
    { rsa_sa_algo,     "RSA" },
28793
#ifdef WC_RSA_PSS
28794
    { rsa_pss_sa_algo, "RSA-PSS" },
28795
    { rsa_pss_sa_algo, "PSS" },
28796
#endif
28797
#endif
28798
#ifdef HAVE_ECC
28799
    { ecc_dsa_sa_algo, "ECDSA" },
28800
#endif
28801
#ifdef HAVE_ED25519
28802
    { ed25519_sa_algo, "ED25519" },
28803
#endif
28804
#ifdef HAVE_ED448
28805
    { ed448_sa_algo,   "ED448" },
28806
#endif
28807
#ifndef NO_DSA
28808
    { dsa_sa_algo,     "DSA" },
28809
#endif
28810
#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
28811
    { sm2_sa_algo,     "SM2" },
28812
#endif
28813
};
28814
#define SIG_NAMES_SZ    (int)(sizeof(sig_names)/sizeof(*sig_names))
28815
28816
/* Convert the signature algorithm string to a TLS signature algorithm num. */
28817
static byte GetSigAlgFromName(const char* name, int len)
28818
{
28819
    byte alg = anonymous_sa_algo;
28820
    int i;
28821
28822
    for (i = 0; i < SIG_NAMES_SZ; i++) {
28823
        if (((int)XSTRLEN(sig_names[i].name) == len) &&
28824
                                 (XMEMCMP(sig_names[i].name, name, len) == 0)) {
28825
            alg = sig_names[i].alg;
28826
            break;
28827
        }
28828
    }
28829
28830
    return alg;
28831
}
28832
28833
/* Set the hash/signature algorithms that are supported for certificate signing.
28834
 *
28835
 * suites  [in,out]  Cipher suites and signature algorithms.
28836
 * list    [in]      String representing hash/signature algorithms to set.
28837
 * returns  0 on failure.
28838
 *          1 on success.
28839
 */
28840
int SetSuitesHashSigAlgo(Suites* suites, const char* list)
28841
{
28842
    int ret = 1;
28843
    word16 idx = 0;
28844
    const char* s = list;
28845
    byte sig_alg = 0;
28846
    byte mac_alg = no_mac;
28847
28848
    /* Setting is destructive on error. */
28849
    suites->hashSigAlgoSz = 0;
28850
28851
    do {
28852
        if (*list == '+') {
28853
            if (mac_alg != 0) {
28854
                ret = 0;
28855
                break;
28856
            }
28857
            sig_alg = GetSigAlgFromName(s, (int)(list - s));
28858
            if (sig_alg == 0) {
28859
                ret = 0;
28860
                break;
28861
            }
28862
            s = list + 1;
28863
        }
28864
        else if (*list == ':' || *list == '\0') {
28865
            if (sig_alg == 0) {
28866
                /* No signature algorithm set yet.
28867
                 * Ed25519 and Ed448 have implied MAC algorithm.
28868
                 */
28869
                sig_alg = GetSigAlgFromName(s, (int)(list - s));
28870
                if (sig_alg != ed25519_sa_algo && sig_alg != ed448_sa_algo) {
28871
                    ret = 0;
28872
                    break;
28873
                }
28874
            }
28875
            else {
28876
                mac_alg = GetMacAlgFromName(s, (int)(list - s));
28877
                if (mac_alg == 0) {
28878
                    ret = 0;
28879
                    break;
28880
                }
28881
            }
28882
            AddSuiteHashSigAlgo(suites->hashSigAlgo, mac_alg, sig_alg, 0, &idx);
28883
            sig_alg = 0;
28884
            mac_alg = no_mac;
28885
            s = list + 1;
28886
        }
28887
28888
        list++;
28889
    }
28890
    while (*(list-1) != '\0');
28891
28892
    if (s != list && (sig_alg != 0 || mac_alg != 0)) {
28893
        ret = 0;
28894
    }
28895
    else {
28896
        suites->hashSigAlgoSz = idx;
28897
    }
28898
28899
    return ret;
28900
}
28901
28902
#endif /* OPENSSL_EXTRA */
28903
28904
#if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS)
28905
static int MatchSigAlgo(WOLFSSL* ssl, int sigAlgo)
28906
65.9k
{
28907
65.9k
#ifdef HAVE_ED25519
28908
65.9k
    if (ssl->pkCurveOID == ECC_ED25519_OID) {
28909
        /* Certificate has Ed25519 key, only match with Ed25519 sig alg  */
28910
0
        return sigAlgo == ed25519_sa_algo;
28911
0
    }
28912
65.9k
#endif
28913
65.9k
#ifdef HAVE_ED448
28914
65.9k
    if (ssl->pkCurveOID == ECC_ED448_OID) {
28915
        /* Certificate has Ed448 key, only match with Ed448 sig alg  */
28916
0
        return sigAlgo == ed448_sa_algo;
28917
0
    }
28918
65.9k
#endif
28919
#ifdef HAVE_FALCON
28920
    if (ssl->pkCurveOID == CTC_FALCON_LEVEL1) {
28921
        /* Certificate has Falcon level 1 key, only match with Falcon level 1
28922
         * sig alg  */
28923
        return sigAlgo == falcon_level1_sa_algo;
28924
    }
28925
    if (ssl->pkCurveOID == CTC_FALCON_LEVEL5) {
28926
        /* Certificate has Falcon level 5 key, only match with Falcon level 5
28927
         * sig alg  */
28928
        return sigAlgo == falcon_level5_sa_algo;
28929
    }
28930
#endif /* HAVE_FALCON */
28931
#ifdef HAVE_DILITHIUM
28932
    #ifdef WOLFSSL_DILITHIUM_FIPS204_DRAFT
28933
    if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL2) {
28934
        /* Certificate has Dilithium level 2 key, only match with it. */
28935
        return sigAlgo == dilithium_level2_sa_algo;
28936
    }
28937
    if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL3) {
28938
        /* Certificate has Dilithium level 3 key, only match with it. */
28939
        return sigAlgo == dilithium_level3_sa_algo;
28940
    }
28941
    if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL5) {
28942
        /* Certificate has Dilithium level 5 key, only match with it. */
28943
        return sigAlgo == dilithium_level5_sa_algo;
28944
    }
28945
    #endif /* WOLFSSL_DILITHIUM_FIPS204_DRAFT */
28946
    if (ssl->pkCurveOID == CTC_ML_DSA_LEVEL2) {
28947
        /* Certificate has ML-DSA level 2 key, only match with it. */
28948
        return sigAlgo == dilithium_level2_sa_algo;
28949
    }
28950
    if (ssl->pkCurveOID == CTC_ML_DSA_LEVEL3) {
28951
        /* Certificate has ML-DSA level 3 key, only match with it. */
28952
        return sigAlgo == dilithium_level3_sa_algo;
28953
    }
28954
    if (ssl->pkCurveOID == CTC_ML_DSA_LEVEL5) {
28955
        /* Certificate has ML-DSA level 5 key, only match with it. */
28956
        return sigAlgo == dilithium_level5_sa_algo;
28957
    }
28958
#endif /* HAVE_DILITHIUM */
28959
65.9k
#ifdef WC_RSA_PSS
28960
    /* RSA certificate and PSS sig alg. */
28961
65.9k
    if (ssl->options.sigAlgo == rsa_sa_algo) {
28962
28.2k
    #if defined(WOLFSSL_TLS13)
28963
        /* TLS 1.3 only supports RSA-PSS. */
28964
28.2k
        if (IsAtLeastTLSv1_3(ssl->version))
28965
5.03k
            return sigAlgo == rsa_pss_sa_algo;
28966
23.1k
    #endif
28967
        /* TLS 1.2 and below - RSA-PSS allowed. */
28968
23.1k
        if (sigAlgo == rsa_pss_sa_algo)
28969
3.76k
            return 1;
28970
23.1k
    }
28971
57.1k
#endif
28972
    /* Signature algorithm matches certificate. */
28973
57.1k
    return sigAlgo == ssl->options.sigAlgo;
28974
65.9k
}
28975
28976
#if defined(HAVE_ECC) && defined(WOLFSSL_TLS13) || \
28977
                                              defined(USE_ECDSA_KEYSZ_HASH_ALGO)
28978
static int CmpEccStrength(int hashAlgo, int curveSz)
28979
0
{
28980
0
    int dgstSz = GetMacDigestSize((byte)hashAlgo);
28981
0
    if (dgstSz <= 0)
28982
0
        return WOLFSSL_FATAL_ERROR;
28983
0
    return dgstSz - (curveSz & (~0x3));
28984
0
}
28985
#endif
28986
28987
static byte MinHashAlgo(WOLFSSL* ssl)
28988
12.3k
{
28989
12.3k
#ifdef WOLFSSL_TLS13
28990
12.3k
#ifndef NO_SHA256
28991
12.3k
    if (IsAtLeastTLSv1_3(ssl->version)) {
28992
1.34k
        return sha256_mac;
28993
1.34k
    }
28994
#elif defined(WOLFSSL_SM3)
28995
    if (IsAtLeastTLSv1_3(ssl->version)) {
28996
        return sm3_mac;
28997
    }
28998
#endif
28999
11.0k
#endif
29000
11.0k
#if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_ALLOW_TLS_SHA1)
29001
11.0k
    if (IsAtLeastTLSv1_2(ssl)) {
29002
7.35k
        return sha256_mac;
29003
7.35k
    }
29004
3.66k
#endif /* WOLFSSL_NO_TLS12 */
29005
3.66k
    (void)ssl;
29006
3.66k
    return sha_mac;
29007
11.0k
}
29008
29009
/* Check if a given peer hashSigAlgo is supported in our ssl->suites or
29010
 * ssl->ctx->suites.
29011
 *
29012
 * Returns 1 on match.
29013
 * Returns 0 otherwise.
29014
 * */
29015
static int SupportedHashSigAlgo(WOLFSSL* ssl, const byte * hashSigAlgo)
29016
6.23k
{
29017
6.23k
    const Suites * suites = NULL;
29018
6.23k
    word32         i = 0;
29019
29020
6.23k
    if (ssl == NULL || hashSigAlgo == NULL) {
29021
0
        return 0;
29022
0
    }
29023
29024
6.23k
    suites = WOLFSSL_SUITES(ssl);
29025
29026
6.23k
    if (suites == NULL || suites->hashSigAlgoSz == 0) {
29027
0
        return 0;
29028
0
    }
29029
29030
77.8k
    for (i = 0; (i+1) < suites->hashSigAlgoSz; i += HELLO_EXT_SIGALGO_SZ) {
29031
75.5k
        if (XMEMCMP(&suites->hashSigAlgo[i], hashSigAlgo,
29032
75.5k
                    HELLO_EXT_SIGALGO_SZ) == 0) {
29033
            /* Match found. */
29034
3.87k
            return 1;
29035
3.87k
        }
29036
75.5k
    }
29037
29038
2.36k
    return 0;
29039
6.23k
}
29040
29041
int PickHashSigAlgo(WOLFSSL* ssl, const byte* hashSigAlgo, word32 hashSigAlgoSz,
29042
                    int matchSuites)
29043
{
29044
    word32 i;
29045
    int ret = WC_NO_ERR_TRACE(MATCH_SUITE_ERROR);
29046
    byte minHash;
29047
29048
    /* set defaults */
29049
    if (IsAtLeastTLSv1_3(ssl->version)) {
29050
    #ifndef NO_CERTS
29051
        /* TLS 1.3 cipher suites don't have public key algorithms in them.
29052
         * Using the one in the certificate - if any.
29053
         */
29054
        ssl->options.sigAlgo = ssl->buffers.keyType;
29055
    #endif
29056
    }
29057
    else {
29058
        ssl->options.sigAlgo = ssl->specs.sig_algo;
29059
    }
29060
    if (ssl->options.sigAlgo == anonymous_sa_algo) {
29061
        /* PSK ciphersuite - get digest to use from cipher suite */
29062
        ssl->options.hashAlgo = ssl->specs.mac_algorithm;
29063
        return 0;
29064
    }
29065
    ssl->options.hashAlgo = minHash = MinHashAlgo(ssl);
29066
29067
    /* No list means go with the defaults. */
29068
    if (hashSigAlgoSz == 0)
29069
        return 0;
29070
29071
    /* i+1 since two bytes used to describe hash and signature algorithm */
29072
    for (i = 0; (i+1) < hashSigAlgoSz; i += HELLO_EXT_SIGALGO_SZ) {
29073
        byte hashAlgo = 0, sigAlgo = 0;
29074
29075
        DecodeSigAlg(&hashSigAlgo[i], &hashAlgo, &sigAlgo);
29076
        /* Keep looking if hash algorithm not strong enough. */
29077
        if (hashAlgo < minHash)
29078
            continue;
29079
        /* Keep looking if signature algorithm isn't supported by cert. */
29080
        if (!MatchSigAlgo(ssl, sigAlgo))
29081
            continue;
29082
29083
        if (matchSuites) {
29084
            /* Keep looking if peer algorithm isn't supported in our ssl->suites
29085
             * or ssl->ctx->suites. */
29086
            if (!SupportedHashSigAlgo(ssl, &hashSigAlgo[i])) {
29087
                continue;
29088
            }
29089
        }
29090
29091
    #ifdef HAVE_ED25519
29092
        if (ssl->pkCurveOID == ECC_ED25519_OID) {
29093
            /* Matched Ed25519 - set chosen and finished. */
29094
            ssl->options.sigAlgo = sigAlgo;
29095
            ssl->options.hashAlgo = hashAlgo;
29096
            ret = 0;
29097
            break;
29098
        }
29099
    #endif
29100
    #ifdef HAVE_ED448
29101
        if (ssl->pkCurveOID == ECC_ED448_OID) {
29102
            /* Matched Ed448 - set chosen and finished. */
29103
            ssl->options.sigAlgo = sigAlgo;
29104
            ssl->options.hashAlgo = hashAlgo;
29105
            ret = 0;
29106
            break;
29107
        }
29108
    #endif
29109
    #if defined(HAVE_FALCON)
29110
        if (ssl->pkCurveOID == CTC_FALCON_LEVEL1 ||
29111
            ssl->pkCurveOID == CTC_FALCON_LEVEL5 ) {
29112
            /* Matched Falcon - set chosen and finished. */
29113
            ssl->options.sigAlgo = sigAlgo;
29114
            ssl->options.hashAlgo = hashAlgo;
29115
            ret = 0;
29116
            break;
29117
        }
29118
    #endif /* HAVE_FALCON */
29119
    #if defined(HAVE_DILITHIUM)
29120
        if (ssl->pkCurveOID == CTC_ML_DSA_LEVEL2 ||
29121
            ssl->pkCurveOID == CTC_ML_DSA_LEVEL3 ||
29122
            ssl->pkCurveOID == CTC_ML_DSA_LEVEL5
29123
            #ifdef WOLFSSL_DILITHIUM_FIPS204_DRAFT
29124
         || ssl->pkCurveOID == CTC_DILITHIUM_LEVEL2
29125
         || ssl->pkCurveOID == CTC_DILITHIUM_LEVEL3
29126
         || ssl->pkCurveOID == CTC_DILITHIUM_LEVEL5
29127
            #endif /* WOLFSSL_DILITHIUM_FIPS204_DRAFT */
29128
            ) {
29129
            /* Matched ML-DSA or Dilithium - set chosen and finished. */
29130
            ssl->options.sigAlgo = sigAlgo;
29131
            ssl->options.hashAlgo = hashAlgo;
29132
            ret = 0;
29133
            break;
29134
        }
29135
    #endif /* HAVE_DILITHIUM */
29136
29137
    #if defined(WOLFSSL_ECDSA_MATCH_HASH) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
29138
        #error "WOLFSSL_ECDSA_MATCH_HASH and USE_ECDSA_KEYSZ_HASH_ALGO cannot "
29139
               "be used together"
29140
    #endif
29141
29142
    #if defined(HAVE_ECC) && (defined(WOLFSSL_TLS13) || \
29143
                                              defined(WOLFSSL_ECDSA_MATCH_HASH))
29144
    #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
29145
        if (sigAlgo == sm2_sa_algo && hashAlgo == sm3_mac
29146
        #ifndef WOLFSSL_ECDSA_MATCH_HASH
29147
            && IsAtLeastTLSv1_3(ssl->version)
29148
        #endif
29149
           ) {
29150
            /* Must be exact match. */
29151
            if (CmpEccStrength(hashAlgo, ssl->buffers.keySz) != 0)
29152
                continue;
29153
            /* Matched SM2-SM3 - set chosen and finished. */
29154
            ssl->options.sigAlgo = sigAlgo;
29155
            ssl->options.hashAlgo = hashAlgo;
29156
            ret = 0;
29157
            break;
29158
        }
29159
        else
29160
    #endif
29161
        if (sigAlgo == ecc_dsa_sa_algo
29162
        #ifndef WOLFSSL_ECDSA_MATCH_HASH
29163
            && IsAtLeastTLSv1_3(ssl->version)
29164
        #endif
29165
            ) {
29166
            /* Must be exact match. */
29167
            if (CmpEccStrength(hashAlgo, ssl->buffers.keySz) != 0)
29168
                continue;
29169
29170
            /* Matched ECDSA exactly - set chosen and finished. */
29171
            ssl->options.hashAlgo = hashAlgo;
29172
            ssl->options.sigAlgo = sigAlgo;
29173
            ret = 0;
29174
            break;
29175
        }
29176
    #endif
29177
29178
    /* For ECDSA the `USE_ECDSA_KEYSZ_HASH_ALGO` build option will choose a hash
29179
     * algorithm that matches the ephemeral ECDHE key size or the next highest
29180
     * available. This workaround resolves issue with some peer's that do not
29181
     * properly support scenarios such as a P-256 key hashed with SHA512.
29182
     */
29183
    #if defined(HAVE_ECC) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
29184
        if (sigAlgo == ecc_dsa_sa_algo) {
29185
            int cmp = CmpEccStrength(hashAlgo, ssl->eccTempKeySz);
29186
29187
            /* Keep looking if digest not strong enough. */
29188
            if (cmp < 0)
29189
                continue;
29190
29191
            /* Looking for exact match or next highest. */
29192
            if (ret != 0 || hashAlgo <= ssl->options.hashAlgo) {
29193
                ssl->options.hashAlgo = hashAlgo;
29194
                ssl->options.sigAlgo = sigAlgo;
29195
            #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
29196
                ssl->namedGroup = 0;
29197
            #endif
29198
                ret = 0;
29199
            }
29200
29201
            /* Continue looking if not the same strength. */
29202
            if (cmp > 0)
29203
                continue;
29204
            /* Exact match - finished. */
29205
            break;
29206
        }
29207
    #endif
29208
29209
        switch (hashAlgo) {
29210
        #ifndef NO_SHA
29211
            case sha_mac:
29212
        #endif
29213
        #ifdef WOLFSSL_SHA224
29214
            case sha224_mac:
29215
        #endif
29216
        #ifndef NO_SHA256
29217
            case sha256_mac:
29218
        #endif
29219
        #ifdef WOLFSSL_SHA384
29220
            case sha384_mac:
29221
        #endif
29222
        #ifdef WOLFSSL_SHA512
29223
            case sha512_mac:
29224
        #endif
29225
        #ifdef WOLFSSL_SM3
29226
            case sm3_mac:
29227
        #endif
29228
            #ifdef WOLFSSL_STRONGEST_HASH_SIG
29229
                /* Is hash algorithm weaker than chosen/min? */
29230
                if (hashAlgo < ssl->options.hashAlgo)
29231
                    break;
29232
            #else
29233
                /* Is hash algorithm stronger than last chosen? */
29234
                if (ret == 0 && hashAlgo > ssl->options.hashAlgo)
29235
                    break;
29236
            #endif
29237
                if (IsAtLeastTLSv1_2(ssl) && !IsAtLeastTLSv1_3(ssl->version) &&
29238
                        (ssl->options.side == WOLFSSL_CLIENT_END)) {
29239
                    /* TLS 1.2 client deciding hash algorithm for
29240
                     * CertificateVerify. Hash must be one of the handshake
29241
                     * hashes being maintained. */
29242
                    if (1
29243
                    #ifndef NO_SHA
29244
                        && (hashAlgo != sha_mac)
29245
                    #endif
29246
                    #ifndef NO_SHA256
29247
                        && (hashAlgo != sha256_mac)
29248
                    #endif
29249
                    #ifdef WOLFSSL_SHA384
29250
                        && (hashAlgo != sha384_mac)
29251
                    #endif
29252
                    #ifdef WOLFSSL_SHA512
29253
                        && (hashAlgo != sha512_mac)
29254
                    #endif
29255
                    #ifdef WOLFSSL_SM3
29256
                        && (hashAlgo != sm3_mac)
29257
                    #endif
29258
                        )
29259
                        {
29260
                            break;
29261
                        }
29262
                }
29263
                /* The chosen one - but keep looking. */
29264
                ssl->options.hashAlgo = hashAlgo;
29265
                ssl->options.sigAlgo = sigAlgo;
29266
                ret = 0;
29267
                break;
29268
            default:
29269
                /* Support for hash algorithm not compiled in. */
29270
                break;
29271
        }
29272
    }
29273
29274
    return ret;
29275
}
29276
#endif /* !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) */
29277
29278
#if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
29279
29280
    /* Initialize HandShakeInfo */
29281
    void InitHandShakeInfo(HandShakeInfo* info, WOLFSSL* ssl)
29282
    {
29283
        int i;
29284
29285
        info->ssl = ssl;
29286
        info->cipherName[0] = 0;
29287
        for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++)
29288
            info->packetNames[i][0] = 0;
29289
        info->numberPackets = 0;
29290
        info->negotiationError = 0;
29291
    }
29292
29293
    /* Set Final HandShakeInfo parameters */
29294
    void FinishHandShakeInfo(HandShakeInfo* info)
29295
    {
29296
        int i;
29297
        int sz = GetCipherNamesSize();
29298
29299
        for (i = 0; i < sz; i++) {
29300
#ifndef NO_CIPHER_SUITE_ALIASES
29301
            if (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS)
29302
                continue;
29303
#endif
29304
            if (info->ssl->options.cipherSuite ==
29305
                                            (byte)cipher_names[i].cipherSuite) {
29306
                if (info->ssl->options.cipherSuite0 == ECC_BYTE)
29307
                    continue;   /* ECC suites at end */
29308
                XSTRNCPY(info->cipherName, cipher_names[i].name, MAX_CIPHERNAME_SZ);
29309
                info->cipherName[MAX_CIPHERNAME_SZ] = '\0';
29310
                break;
29311
            }
29312
        }
29313
29314
        /* error max and min are negative numbers */
29315
        if (info->ssl->error <= MIN_PARAM_ERR && info->ssl->error >= MAX_PARAM_ERR)
29316
            info->negotiationError = info->ssl->error;
29317
    }
29318
29319
29320
    /* Add name to info packet names, increase packet name count */
29321
    void AddPacketName(WOLFSSL* ssl, const char* name)
29322
    {
29323
    #ifdef WOLFSSL_CALLBACKS
29324
        HandShakeInfo* info = &ssl->handShakeInfo;
29325
        if (info->numberPackets < MAX_PACKETS_HANDSHAKE) {
29326
            char* packetName = info->packetNames[info->numberPackets];
29327
            XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
29328
            packetName[MAX_PACKETNAME_SZ] = '\0';
29329
            info->numberPackets++;
29330
        }
29331
    #endif
29332
        (void)ssl;
29333
        (void)name;
29334
    }
29335
29336
29337
    #ifdef WOLFSSL_CALLBACKS
29338
    /* Initialize TimeoutInfo */
29339
    void InitTimeoutInfo(TimeoutInfo* info)
29340
    {
29341
        XMEMSET(info, 0, sizeof(TimeoutInfo));
29342
    }
29343
29344
29345
    /* Free TimeoutInfo */
29346
    void FreeTimeoutInfo(TimeoutInfo* info, void* heap)
29347
    {
29348
        int i;
29349
        (void)heap;
29350
        for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++) {
29351
            if (info->packets[i].bufferValue) {
29352
                XFREE(info->packets[i].bufferValue, heap, DYNAMIC_TYPE_INFO);
29353
                info->packets[i].bufferValue = NULL;
29354
            }
29355
        }
29356
    }
29357
29358
    /* Add packet name to previously added packet info */
29359
    void AddLateName(const char* name, TimeoutInfo* info)
29360
    {
29361
        /* make sure we have a valid previous one */
29362
        if (info->numberPackets > 0 && info->numberPackets <
29363
                                                        MAX_PACKETS_HANDSHAKE) {
29364
            char* packetName = info->packets[info->numberPackets-1].packetName;
29365
            XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
29366
            packetName[MAX_PACKETNAME_SZ] = '\0';
29367
        }
29368
    }
29369
29370
    /* Add record header to previously added packet info */
29371
    void AddLateRecordHeader(const RecordLayerHeader* rl, TimeoutInfo* info)
29372
    {
29373
        /* make sure we have a valid previous one */
29374
        if (info->numberPackets > 0 && info->numberPackets <
29375
                                                        MAX_PACKETS_HANDSHAKE) {
29376
            if (info->packets[info->numberPackets - 1].bufferValue)
29377
                XMEMCPY(info->packets[info->numberPackets - 1].bufferValue, rl,
29378
                       RECORD_HEADER_SZ);
29379
            else
29380
                XMEMCPY(info->packets[info->numberPackets - 1].value, rl,
29381
                       RECORD_HEADER_SZ);
29382
        }
29383
    }
29384
29385
    #endif /* WOLFSSL_CALLBACKS */
29386
29387
29388
    /* Add PacketInfo to TimeoutInfo
29389
     *
29390
     * ssl   WOLFSSL structure sending or receiving packet
29391
     * name  name of packet being sent
29392
     * type  type of packet being sent
29393
     * data  data bing sent with packet
29394
     * sz    size of data buffer
29395
     * lateRL  save space for record layer in TimoutInfo struct
29396
     * written 1 if this packet is being written to wire, 0 if being read
29397
     * heap  custom heap to use for mallocs/frees
29398
     */
29399
    int AddPacketInfo(WOLFSSL* ssl, const char* name, int type,
29400
            const byte* data, int sz, int written, int lateRL, void* heap)
29401
    {
29402
    #ifdef WOLFSSL_CALLBACKS
29403
        TimeoutInfo* info = &ssl->timeoutInfo;
29404
29405
        if (info->numberPackets < (MAX_PACKETS_HANDSHAKE - 1)) {
29406
            WOLFSSL_TIMEVAL currTime;
29407
            int totalSz;
29408
29409
            /* add in space for post record layer */
29410
            totalSz = sz + lateRL;
29411
29412
            /* may add name after */
29413
            if (name) {
29414
                char* packetName = info->packets[info->numberPackets].packetName;
29415
                XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
29416
                packetName[MAX_PACKETNAME_SZ] = '\0';
29417
            }
29418
29419
            /* add data, put in buffer if bigger than static buffer */
29420
            info->packets[info->numberPackets].valueSz = totalSz;
29421
            if (totalSz < MAX_VALUE_SZ) {
29422
                XMEMCPY(info->packets[info->numberPackets].value + lateRL, data,
29423
                               sz);
29424
            }
29425
            else {
29426
                info->packets[info->numberPackets].bufferValue =
29427
                               (byte*)XMALLOC(totalSz, heap, DYNAMIC_TYPE_INFO);
29428
                if (!info->packets[info->numberPackets].bufferValue) {
29429
                    /* let next alloc catch, just don't fill, not fatal here  */
29430
                    info->packets[info->numberPackets].valueSz = 0;
29431
                }
29432
                else {
29433
                    /* copy over data (which has the handshake header), leaving
29434
                     * room for post record layer header if set */
29435
                    XMEMCPY(info->packets[info->numberPackets].bufferValue +
29436
                            lateRL, data, sz);
29437
                }
29438
            }
29439
29440
            if (gettimeofday(&currTime, 0) < 0)
29441
                return SYSLIB_FAILED_E;
29442
29443
            info->packets[info->numberPackets].timestamp.tv_sec  =
29444
                                                             currTime.tv_sec;
29445
            info->packets[info->numberPackets].timestamp.tv_usec =
29446
                                                             currTime.tv_usec;
29447
            info->numberPackets++;
29448
        }
29449
    #endif /* WOLFSSL_CALLBACKS */
29450
    #ifdef OPENSSL_EXTRA
29451
        if ((ssl->protoMsgCb != NULL) && (sz > 0) &&
29452
            (ssl->keys.encryptionOn != 1)) {
29453
            /* version from hex to dec  16 is 16^1, 256 from 16^2 and
29454
               4096 from 16^3 */
29455
            int version = (ssl->version.minor & 0x0F) +
29456
                          ((ssl->version.minor & 0xF0) << 4) +
29457
                          ((ssl->version.major & 0x0F) << 8) +
29458
                          ((ssl->version.major & 0xF0) << 12);
29459
29460
            ssl->protoMsgCb(written, version, type,
29461
                         (const void *)data, (size_t)sz,
29462
                         ssl, ssl->protoMsgCtx);
29463
        }
29464
    #endif /* OPENSSL_EXTRA */
29465
        (void)written;
29466
        (void)name;
29467
        (void)heap;
29468
        (void)type;
29469
        (void)ssl;
29470
        (void)lateRL;
29471
29472
        return 0;
29473
    }
29474
29475
#endif /* WOLFSSL_CALLBACKS || OPENSSL_EXTRA */
29476
29477
#if !defined(NO_CERTS)
29478
29479
#if defined(WOLF_PRIVATE_KEY_ID) && !defined(NO_CHECK_PRIVATE_KEY)
29480
/* Create a private key for a device.
29481
 *
29482
 * pkey    Key object.
29483
 * data    Data to identify key.
29484
 * length  Length of data.
29485
 * hsType  Type of the key to create.
29486
 * heap    Custom heap to use for mallocs/frees
29487
 * devId   Id for device.
29488
 * return  0 on success.
29489
 * return  NOT_COMPILED_IN if algorithm type not supported.
29490
 * return  MEMORY_E on memory allocation failure.
29491
 * return  other internal error
29492
 */
29493
int CreateDevPrivateKey(void** pkey, byte* data, word32 length, int hsType,
29494
                        int label, int id, void* heap, int devId)
29495
0
{
29496
0
    int ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN);
29497
29498
0
    if (hsType == DYNAMIC_TYPE_RSA) {
29499
0
#ifndef NO_RSA
29500
0
        RsaKey* rsaKey;
29501
29502
0
        rsaKey = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
29503
0
        if (rsaKey == NULL) {
29504
0
            return MEMORY_E;
29505
0
        }
29506
29507
0
        if (label) {
29508
0
            ret = wc_InitRsaKey_Label(rsaKey, (char*)data, heap, devId);
29509
0
        }
29510
0
        else if (id) {
29511
0
            ret = wc_InitRsaKey_Id(rsaKey, data, (int)length, heap, devId);
29512
0
        }
29513
0
        if (ret == 0) {
29514
0
            *pkey = (void*)rsaKey;
29515
0
        }
29516
0
        else {
29517
0
            XFREE(rsaKey, heap, DYNAMIC_TYPE_RSA);
29518
0
        }
29519
0
#endif
29520
0
    }
29521
0
    else if (hsType == DYNAMIC_TYPE_ECC) {
29522
0
#ifdef HAVE_ECC
29523
0
        ecc_key* ecKey;
29524
29525
0
        ecKey = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
29526
0
        if (ecKey == NULL) {
29527
0
            return MEMORY_E;
29528
0
        }
29529
29530
0
        if (label) {
29531
0
            ret = wc_ecc_init_label(ecKey, (char*)data, heap, devId);
29532
0
        }
29533
0
        else if (id) {
29534
0
            ret = wc_ecc_init_id(ecKey, data, (int)length, heap, devId);
29535
0
        }
29536
0
        if (ret == 0) {
29537
0
            *pkey = (void*)ecKey;
29538
0
        }
29539
0
        else {
29540
0
            XFREE(ecKey, heap, DYNAMIC_TYPE_ECC);
29541
0
        }
29542
0
#endif
29543
0
    }
29544
0
    else if (hsType == DYNAMIC_TYPE_DILITHIUM) {
29545
#if defined(HAVE_DILITHIUM)
29546
        dilithium_key* dilithiumKey;
29547
29548
        dilithiumKey = (dilithium_key*)XMALLOC(sizeof(dilithium_key), heap,
29549
                                               DYNAMIC_TYPE_DILITHIUM);
29550
        if (dilithiumKey == NULL) {
29551
            return MEMORY_E;
29552
        }
29553
29554
        if (label) {
29555
            ret = wc_dilithium_init_label(dilithiumKey, (char*)data,
29556
                                          heap, devId);
29557
        }
29558
        else if (id) {
29559
            ret = wc_dilithium_init_id(dilithiumKey, data, length, heap, devId);
29560
        }
29561
        if (ret == 0) {
29562
            *pkey = (void*)dilithiumKey;
29563
        }
29564
        else {
29565
            XFREE(dilithiumKey, heap, DYNAMIC_TYPE_DILITHIUM);
29566
        }
29567
#endif
29568
0
    }
29569
0
    else if (hsType == DYNAMIC_TYPE_FALCON) {
29570
#if defined(HAVE_FALCON)
29571
        falcon_key* falconKey;
29572
29573
        falconKey = (falcon_key*)XMALLOC(sizeof(falcon_key), heap,
29574
                                         DYNAMIC_TYPE_FALCON);
29575
        if (falconKey == NULL) {
29576
            return MEMORY_E;
29577
        }
29578
29579
        if (label) {
29580
            ret = wc_falcon_init_label(falconKey, (char*)data, heap, devId);
29581
        }
29582
        else if (id) {
29583
            ret = wc_falcon_init_id(falconKey, data, length, heap, devId);
29584
        }
29585
        if (ret == 0) {
29586
            *pkey = (void*)falconKey;
29587
        }
29588
        else {
29589
            XFREE(falconKey, heap, DYNAMIC_TYPE_FALCON);
29590
        }
29591
#endif
29592
0
    }
29593
29594
0
    return ret;
29595
0
}
29596
#endif /* WOLF_PRIVATE_KEY_ID && !NO_CHECK_PRIVATE_KEY */
29597
29598
/* Decode the private key - RSA/ECC/Ed25519/Ed448/Falcon/Dilithium - and
29599
 * creates a key object.
29600
 *
29601
 * The signature type is set as well.
29602
 * The maximum length of a signature is returned.
29603
 *
29604
 * ssl     The SSL/TLS object.
29605
 * length  The length of a signature.
29606
 * returns 0 on success, otherwise failure.
29607
 */
29608
int DecodePrivateKey(WOLFSSL *ssl, word32* length)
29609
0
{
29610
0
    int      ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
29611
0
    int      keySz;
29612
0
    word32   idx;
29613
29614
    /* make sure private key exists */
29615
0
    if (ssl->buffers.key == NULL || ssl->buffers.key->buffer == NULL) {
29616
        /* allow no private key if using external */
29617
0
    #ifdef WOLF_PRIVATE_KEY_ID
29618
0
        if (ssl->devId != INVALID_DEVID
29619
        #ifdef HAVE_PK_CALLBACKS
29620
            || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
29621
        #endif
29622
0
        ) {
29623
0
            *length = (word32)GetPrivateKeySigSize(ssl);
29624
0
            return 0;
29625
0
        }
29626
0
        else
29627
0
    #endif
29628
0
        {
29629
0
            WOLFSSL_MSG("Private key missing!");
29630
0
            ERROR_OUT(NO_PRIVATE_KEY, exit_dpk);
29631
0
        }
29632
0
    }
29633
29634
0
#ifdef WOLF_PRIVATE_KEY_ID
29635
0
    if (ssl->buffers.keyDevId != INVALID_DEVID && (ssl->buffers.keyId ||
29636
0
                                                       ssl->buffers.keyLabel)) {
29637
0
        if (ssl->buffers.keyType == rsa_sa_algo)
29638
0
            ssl->hsType = DYNAMIC_TYPE_RSA;
29639
0
        else if (ssl->buffers.keyType == ecc_dsa_sa_algo)
29640
0
            ssl->hsType = DYNAMIC_TYPE_ECC;
29641
0
        else if ((ssl->buffers.keyType == falcon_level1_sa_algo) ||
29642
0
                 (ssl->buffers.keyType == falcon_level5_sa_algo))
29643
0
            ssl->hsType = DYNAMIC_TYPE_FALCON;
29644
0
        else if ((ssl->buffers.keyType == dilithium_level2_sa_algo) ||
29645
0
                 (ssl->buffers.keyType == dilithium_level3_sa_algo) ||
29646
0
                 (ssl->buffers.keyType == dilithium_level5_sa_algo))
29647
0
            ssl->hsType = DYNAMIC_TYPE_DILITHIUM;
29648
0
        ret = AllocKey(ssl, (int)(ssl->hsType), &ssl->hsKey);
29649
0
        if (ret != 0) {
29650
0
            goto exit_dpk;
29651
0
        }
29652
29653
0
        if (ssl->buffers.keyType == rsa_sa_algo) {
29654
0
    #ifndef NO_RSA
29655
0
            if (ssl->buffers.keyLabel) {
29656
0
                ret = wc_InitRsaKey_Label((RsaKey*)ssl->hsKey,
29657
0
                                          (char*)ssl->buffers.key->buffer,
29658
0
                                          ssl->heap, ssl->buffers.keyDevId);
29659
0
            }
29660
0
            else if (ssl->buffers.keyId) {
29661
0
                ret = wc_InitRsaKey_Id((RsaKey*)ssl->hsKey,
29662
0
                                    (ssl->buffers.key->buffer),
29663
0
                                    (int)(ssl->buffers.key->length),
29664
0
                                    ssl->heap,
29665
0
                                    ssl->buffers.keyDevId);
29666
0
            }
29667
0
            if (ret == 0) {
29668
0
                if (ssl->buffers.keySz < ssl->options.minRsaKeySz) {
29669
0
                    WOLFSSL_MSG("RSA key size too small");
29670
0
                    ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
29671
0
                }
29672
29673
                /* Return the maximum signature length. */
29674
0
                *length = (word32)ssl->buffers.keySz;
29675
0
            }
29676
    #else
29677
            ret = NOT_COMPILED_IN;
29678
    #endif
29679
0
        }
29680
0
        else if (ssl->buffers.keyType == ecc_dsa_sa_algo) {
29681
0
    #ifdef HAVE_ECC
29682
0
            if (ssl->buffers.keyLabel) {
29683
0
                ret = wc_ecc_init_label((ecc_key*)ssl->hsKey,
29684
0
                                        (char*)ssl->buffers.key->buffer,
29685
0
                                        ssl->heap, ssl->buffers.keyDevId);
29686
0
            }
29687
0
            else if (ssl->buffers.keyId) {
29688
0
                ret = wc_ecc_init_id((ecc_key*)ssl->hsKey,
29689
0
                                     (ssl->buffers.key->buffer),
29690
0
                                     ssl->buffers.key->length, ssl->heap,
29691
0
                                     ssl->buffers.keyDevId);
29692
0
            }
29693
0
            if (ret == 0) {
29694
0
                if (ssl->buffers.keySz < ssl->options.minEccKeySz) {
29695
0
                    WOLFSSL_MSG("ECC key size too small");
29696
0
                    ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
29697
0
                }
29698
29699
                /* Return the maximum signature length. */
29700
0
                *length = (word32)wc_ecc_sig_size_calc(ssl->buffers.keySz);
29701
0
            }
29702
    #else
29703
            ret = NOT_COMPILED_IN;
29704
    #endif
29705
0
        }
29706
0
        else if ((ssl->buffers.keyType == falcon_level1_sa_algo) ||
29707
0
                 (ssl->buffers.keyType == falcon_level5_sa_algo)) {
29708
    #if defined(HAVE_FALCON)
29709
            if (ssl->buffers.keyLabel) {
29710
                ret = wc_falcon_init_label((falcon_key*)ssl->hsKey,
29711
                                           (char*)ssl->buffers.key->buffer,
29712
                                           ssl->heap, ssl->buffers.keyDevId);
29713
            }
29714
            else if (ssl->buffers.keyId) {
29715
                ret = wc_falcon_init_id((falcon_key*)ssl->hsKey,
29716
                                        ssl->buffers.key->buffer,
29717
                                        ssl->buffers.key->length, ssl->heap,
29718
                                        ssl->buffers.keyDevId);
29719
            }
29720
            if (ret == 0) {
29721
                if (ssl->buffers.keyType == falcon_level1_sa_algo) {
29722
                    ret = wc_falcon_set_level((falcon_key*)ssl->hsKey, 1);
29723
                }
29724
                else if (ssl->buffers.keyType == falcon_level5_sa_algo) {
29725
                    ret = wc_falcon_set_level((falcon_key*)ssl->hsKey, 5);
29726
                }
29727
            }
29728
            if (ret == 0) {
29729
                if (ssl->buffers.keySz < ssl->options.minFalconKeySz) {
29730
                    WOLFSSL_MSG("Falcon key size too small");
29731
                    ERROR_OUT(FALCON_KEY_SIZE_E, exit_dpk);
29732
                }
29733
29734
                /* Return the maximum signature length. */
29735
                *length = wc_falcon_sig_size((falcon_key*)ssl->hsKey);
29736
            }
29737
    #else
29738
0
            ret = NOT_COMPILED_IN;
29739
0
    #endif
29740
0
        }
29741
0
        else if ((ssl->buffers.keyType == dilithium_level2_sa_algo) ||
29742
0
                 (ssl->buffers.keyType == dilithium_level3_sa_algo) ||
29743
0
                 (ssl->buffers.keyType == dilithium_level5_sa_algo)) {
29744
    #if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_SIGN)
29745
            if (ssl->buffers.keyLabel) {
29746
                ret = wc_dilithium_init_label((dilithium_key*)ssl->hsKey,
29747
                                              (char*)ssl->buffers.key->buffer,
29748
                                              ssl->heap, ssl->buffers.keyDevId);
29749
            }
29750
            else if (ssl->buffers.keyId) {
29751
                ret = wc_dilithium_init_id((dilithium_key*)ssl->hsKey,
29752
                                        ssl->buffers.key->buffer,
29753
                                        ssl->buffers.key->length, ssl->heap,
29754
                                        ssl->buffers.keyDevId);
29755
            }
29756
            if (ret == 0) {
29757
                if (ssl->buffers.keyType == dilithium_level2_sa_algo) {
29758
                    ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, WC_ML_DSA_44);
29759
                }
29760
                else if (ssl->buffers.keyType == dilithium_level3_sa_algo) {
29761
                    ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, WC_ML_DSA_65);
29762
                }
29763
                else if (ssl->buffers.keyType == dilithium_level5_sa_algo) {
29764
                    ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, WC_ML_DSA_87);
29765
                }
29766
            }
29767
            if (ret == 0) {
29768
                if (ssl->buffers.keySz < ssl->options.minDilithiumKeySz) {
29769
                    WOLFSSL_MSG("Dilithium key size too small");
29770
                    ERROR_OUT(DILITHIUM_KEY_SIZE_E, exit_dpk);
29771
                }
29772
29773
                /* Return the maximum signature length. */
29774
                *length = wc_dilithium_sig_size(
29775
                                    (dilithium_key*)ssl->hsKey);
29776
            }
29777
    #else
29778
0
            ret = NOT_COMPILED_IN;
29779
0
    #endif
29780
0
        }
29781
0
        goto exit_dpk;
29782
0
    }
29783
0
#endif /* WOLF_PRIVATE_KEY_ID */
29784
29785
0
#ifndef NO_RSA
29786
0
    if (ssl->buffers.keyType == rsa_sa_algo || ssl->buffers.keyType == 0) {
29787
0
        ssl->hsType = DYNAMIC_TYPE_RSA;
29788
0
        ret = AllocKey(ssl, (int)ssl->hsType, &ssl->hsKey);
29789
0
        if (ret != 0) {
29790
0
            goto exit_dpk;
29791
0
        }
29792
29793
0
        WOLFSSL_MSG("Trying RSA private key");
29794
29795
        /* Set start of data to beginning of buffer. */
29796
0
        idx = 0;
29797
        /* Decode the key assuming it is an RSA private key. */
29798
0
        ret = wc_RsaPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
29799
0
                    (RsaKey*)ssl->hsKey, ssl->buffers.key->length);
29800
0
    #ifdef WOLF_PRIVATE_KEY_ID
29801
        /* if using external key then allow using a public key */
29802
0
        if (ret != 0 && (ssl->devId != INVALID_DEVID
29803
        #ifdef HAVE_PK_CALLBACKS
29804
            || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
29805
        #endif
29806
0
        )) {
29807
0
            WOLFSSL_MSG("Trying RSA public key with crypto callbacks");
29808
0
            idx = 0;
29809
0
            ret = wc_RsaPublicKeyDecode(ssl->buffers.key->buffer, &idx,
29810
0
                        (RsaKey*)ssl->hsKey, ssl->buffers.key->length);
29811
0
        }
29812
0
    #endif
29813
0
        if (ret == 0) {
29814
0
            WOLFSSL_MSG("Using RSA private key");
29815
29816
            /* It worked so check it meets minimum key size requirements. */
29817
0
            keySz = wc_RsaEncryptSize((RsaKey*)ssl->hsKey);
29818
0
            if (keySz < 0) { /* check if keySz has error case */
29819
0
                ERROR_OUT(keySz, exit_dpk);
29820
0
            }
29821
29822
0
            if (keySz < ssl->options.minRsaKeySz) {
29823
0
                WOLFSSL_MSG("RSA key size too small");
29824
0
                ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
29825
0
            }
29826
29827
            /* Return the maximum signature length. */
29828
0
            *length = (word32)keySz;
29829
29830
0
            goto exit_dpk;
29831
0
        }
29832
0
    }
29833
0
#endif /* !NO_RSA */
29834
29835
0
#ifdef HAVE_ECC
29836
0
#ifndef NO_RSA
29837
0
    FreeKey(ssl, (int)ssl->hsType, (void**)&ssl->hsKey);
29838
0
#endif /* !NO_RSA */
29839
29840
0
    if (ssl->buffers.keyType == ecc_dsa_sa_algo || ssl->buffers.keyType == 0
29841
0
    #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
29842
0
         || ssl->buffers.keyType == sm2_sa_algo
29843
0
    #endif
29844
0
        ) {
29845
0
        ssl->hsType = DYNAMIC_TYPE_ECC;
29846
0
        ret = AllocKey(ssl, (int)ssl->hsType, &ssl->hsKey);
29847
0
        if (ret != 0) {
29848
0
            goto exit_dpk;
29849
0
        }
29850
29851
0
    #ifndef NO_RSA
29852
0
        WOLFSSL_MSG("Trying ECC private key, RSA didn't work");
29853
    #else
29854
        WOLFSSL_MSG("Trying ECC private key");
29855
    #endif
29856
29857
        /* Set start of data to beginning of buffer. */
29858
0
        idx = 0;
29859
        /* Decode the key assuming it is an ECC private key. */
29860
0
        ret = wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
29861
0
                                     (ecc_key*)ssl->hsKey,
29862
0
                                     ssl->buffers.key->length);
29863
0
    #ifdef WOLF_PRIVATE_KEY_ID
29864
        /* if using external key then allow using a public key */
29865
0
        if (ret != 0 && (ssl->devId != INVALID_DEVID
29866
        #ifdef HAVE_PK_CALLBACKS
29867
            || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
29868
        #endif
29869
0
        )) {
29870
0
            WOLFSSL_MSG("Trying ECC public key with crypto callbacks");
29871
0
            idx = 0;
29872
0
            ret = wc_EccPublicKeyDecode(ssl->buffers.key->buffer, &idx,
29873
0
                                     (ecc_key*)ssl->hsKey,
29874
0
                                     ssl->buffers.key->length);
29875
0
        }
29876
0
    #endif
29877
0
    #ifdef WOLFSSL_SM2
29878
0
        if ((ret == 0) && (ssl->buffers.keyType == sm2_sa_algo)) {
29879
0
            ret = wc_ecc_set_curve((ecc_key*)ssl->hsKey,
29880
0
                WOLFSSL_SM2_KEY_BITS / 8, ECC_SM2P256V1);
29881
0
        }
29882
0
    #endif
29883
0
        if (ret == 0) {
29884
0
            WOLFSSL_MSG("Using ECC private key");
29885
29886
            /* Check it meets the minimum ECC key size requirements. */
29887
0
            keySz = wc_ecc_size((ecc_key*)ssl->hsKey);
29888
0
            if (keySz < ssl->options.minEccKeySz) {
29889
0
                WOLFSSL_MSG("ECC key size too small");
29890
0
                ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
29891
0
            }
29892
29893
            /* Return the maximum signature length. */
29894
0
            *length = (word32)wc_ecc_sig_size((ecc_key*)ssl->hsKey);
29895
29896
0
            goto exit_dpk;
29897
0
        }
29898
0
    }
29899
0
#endif
29900
0
#if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
29901
0
    #if !defined(NO_RSA) || defined(HAVE_ECC)
29902
0
        FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
29903
0
    #endif
29904
29905
0
    if (ssl->buffers.keyType == ed25519_sa_algo || ssl->buffers.keyType == 0) {
29906
0
        ssl->hsType = DYNAMIC_TYPE_ED25519;
29907
0
        ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
29908
0
        if (ret != 0) {
29909
0
            goto exit_dpk;
29910
0
        }
29911
29912
0
        #ifdef HAVE_ECC
29913
0
            WOLFSSL_MSG("Trying ED25519 private key, ECC didn't work");
29914
        #elif !defined(NO_RSA)
29915
            WOLFSSL_MSG("Trying ED25519 private key, RSA didn't work");
29916
        #else
29917
            WOLFSSL_MSG("Trying ED25519 private key");
29918
        #endif
29919
29920
        /* Set start of data to beginning of buffer. */
29921
0
        idx = 0;
29922
        /* Decode the key assuming it is an ED25519 private key. */
29923
0
        ret = wc_Ed25519PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
29924
0
                                         (ed25519_key*)ssl->hsKey,
29925
0
                                         ssl->buffers.key->length);
29926
0
    #ifdef WOLF_PRIVATE_KEY_ID
29927
        /* if using external key then allow using a public key */
29928
0
        if (ret != 0 && (ssl->devId != INVALID_DEVID
29929
        #ifdef HAVE_PK_CALLBACKS
29930
            || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
29931
        #endif
29932
0
        )) {
29933
0
            WOLFSSL_MSG("Trying ED25519 public key with crypto callbacks");
29934
0
            idx = 0;
29935
0
            ret = wc_Ed25519PublicKeyDecode(ssl->buffers.key->buffer, &idx,
29936
0
                                           (ed25519_key*)ssl->hsKey,
29937
0
                                            ssl->buffers.key->length);
29938
0
        }
29939
0
    #endif
29940
0
        if (ret == 0) {
29941
0
            WOLFSSL_MSG("Using ED25519 private key");
29942
29943
            /* Check it meets the minimum ECC key size requirements. */
29944
0
            if (ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
29945
0
                WOLFSSL_MSG("ED25519 key size too small");
29946
0
                ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
29947
0
            }
29948
29949
            /* Return the maximum signature length. */
29950
0
            *length = ED25519_SIG_SIZE;
29951
29952
0
            goto exit_dpk;
29953
0
        }
29954
0
    }
29955
0
#endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
29956
0
#if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
29957
0
    #if !defined(NO_RSA) || defined(HAVE_ECC)
29958
0
        FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
29959
0
    #endif
29960
29961
0
    if (ssl->buffers.keyType == ed448_sa_algo || ssl->buffers.keyType == 0) {
29962
0
        ssl->hsType = DYNAMIC_TYPE_ED448;
29963
0
        ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
29964
0
        if (ret != 0) {
29965
0
            goto exit_dpk;
29966
0
        }
29967
29968
0
        #ifdef HAVE_ED25519
29969
0
            WOLFSSL_MSG("Trying ED448 private key, ED25519 didn't work");
29970
        #elif defined(HAVE_ECC)
29971
            WOLFSSL_MSG("Trying ED448 private key, ECC didn't work");
29972
        #elif !defined(NO_RSA)
29973
            WOLFSSL_MSG("Trying ED448 private key, RSA didn't work");
29974
        #else
29975
            WOLFSSL_MSG("Trying ED448 private key");
29976
        #endif
29977
29978
        /* Set start of data to beginning of buffer. */
29979
0
        idx = 0;
29980
        /* Decode the key assuming it is an ED448 private key. */
29981
0
        ret = wc_Ed448PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
29982
0
                                       (ed448_key*)ssl->hsKey,
29983
0
                                       ssl->buffers.key->length);
29984
0
    #ifdef WOLF_PRIVATE_KEY_ID
29985
        /* if using external key then allow using a public key */
29986
0
        if (ret != 0 && (ssl->devId != INVALID_DEVID
29987
        #ifdef HAVE_PK_CALLBACKS
29988
            || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
29989
        #endif
29990
0
        )) {
29991
0
            WOLFSSL_MSG("Trying ED25519 public key with crypto callbacks");
29992
0
            idx = 0;
29993
0
            ret = wc_Ed448PublicKeyDecode(ssl->buffers.key->buffer, &idx,
29994
0
                                          (ed448_key*)ssl->hsKey,
29995
0
                                          ssl->buffers.key->length);
29996
0
        }
29997
0
    #endif
29998
0
        if (ret == 0) {
29999
0
            WOLFSSL_MSG("Using ED448 private key");
30000
30001
            /* Check it meets the minimum ECC key size requirements. */
30002
0
            if (ED448_KEY_SIZE < ssl->options.minEccKeySz) {
30003
0
                WOLFSSL_MSG("ED448 key size too small");
30004
0
                ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
30005
0
            }
30006
30007
            /* Return the maximum signature length. */
30008
0
            *length = ED448_SIG_SIZE;
30009
30010
0
            goto exit_dpk;
30011
0
        }
30012
0
    }
30013
0
#endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
30014
#if defined(HAVE_FALCON)
30015
    #if !defined(NO_RSA) || defined(HAVE_ECC)
30016
        FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
30017
    #endif
30018
30019
    if (ssl->buffers.keyType == falcon_level1_sa_algo ||
30020
        ssl->buffers.keyType == falcon_level5_sa_algo ||
30021
        ssl->buffers.keyType == 0) {
30022
30023
        ssl->hsType = DYNAMIC_TYPE_FALCON;
30024
        ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
30025
        if (ret != 0) {
30026
            goto exit_dpk;
30027
        }
30028
30029
        if (ssl->buffers.keyType == falcon_level1_sa_algo) {
30030
            ret = wc_falcon_set_level((falcon_key*)ssl->hsKey, 1);
30031
        }
30032
        else if (ssl->buffers.keyType == falcon_level5_sa_algo) {
30033
            ret = wc_falcon_set_level((falcon_key*)ssl->hsKey, 5);
30034
        }
30035
        else {
30036
            /* What if ssl->buffers.keyType is 0? We might want to do something
30037
             * more graceful here. */
30038
            ret = ALGO_ID_E;
30039
        }
30040
30041
        if (ret != 0) {
30042
            goto exit_dpk;
30043
        }
30044
30045
        #if defined(HAVE_ED448)
30046
            WOLFSSL_MSG("Trying Falcon private key, ED448 didn't work");
30047
        #elif defined(HAVE_ED25519)
30048
            WOLFSSL_MSG("Trying Falcon private key, ED25519 didn't work");
30049
        #elif defined(HAVE_ECC)
30050
            WOLFSSL_MSG("Trying Falcon private key, ECC didn't work");
30051
        #elif !defined(NO_RSA)
30052
            WOLFSSL_MSG("Trying Falcon private key, RSA didn't work");
30053
        #else
30054
            WOLFSSL_MSG("Trying Falcon private key");
30055
        #endif
30056
30057
        /* Set start of data to beginning of buffer. */
30058
        idx = 0;
30059
        /* Decode the key assuming it is a Falcon private key. */
30060
        ret = wc_falcon_import_private_only(ssl->buffers.key->buffer,
30061
                                            ssl->buffers.key->length,
30062
                                            (falcon_key*)ssl->hsKey);
30063
        if (ret == 0) {
30064
            WOLFSSL_MSG("Using Falcon private key");
30065
30066
            /* Check it meets the minimum Falcon key size requirements. */
30067
            keySz = wc_falcon_size((falcon_key*)ssl->hsKey);
30068
            if (keySz < ssl->options.minFalconKeySz) {
30069
                WOLFSSL_MSG("Falcon key size too small");
30070
                ERROR_OUT(FALCON_KEY_SIZE_E, exit_dpk);
30071
            }
30072
30073
            /* Return the maximum signature length. */
30074
            *length = wc_falcon_sig_size((falcon_key*)ssl->hsKey);
30075
30076
            goto exit_dpk;
30077
        }
30078
    }
30079
#endif /* HAVE_FALCON */
30080
#if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_SIGN) && \
30081
    !defined(WOLFSSL_DILITHIUM_NO_ASN1)
30082
    #if !defined(NO_RSA) || defined(HAVE_ECC)
30083
        FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
30084
    #endif
30085
30086
    if (ssl->buffers.keyType == dilithium_level2_sa_algo ||
30087
        ssl->buffers.keyType == dilithium_level3_sa_algo ||
30088
        ssl->buffers.keyType == dilithium_level5_sa_algo ||
30089
        ssl->buffers.keyType == 0) {
30090
30091
        ssl->hsType = DYNAMIC_TYPE_DILITHIUM;
30092
        ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
30093
        if (ret != 0) {
30094
            goto exit_dpk;
30095
        }
30096
30097
        if (ssl->buffers.keyType == dilithium_level2_sa_algo) {
30098
            ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, WC_ML_DSA_44);
30099
        }
30100
        else if (ssl->buffers.keyType == dilithium_level3_sa_algo) {
30101
            ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, WC_ML_DSA_65);
30102
        }
30103
        else if (ssl->buffers.keyType == dilithium_level5_sa_algo) {
30104
            ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, WC_ML_DSA_87);
30105
        }
30106
        else {
30107
            /* What if ssl->buffers.keyType is 0? We might want to do something
30108
             * more graceful here. */
30109
            ret = ALGO_ID_E;
30110
        }
30111
30112
        if (ret != 0) {
30113
            goto exit_dpk;
30114
        }
30115
30116
        #if defined(HAVE_ED448)
30117
            WOLFSSL_MSG("Trying Dilithium private key, ED448 didn't work");
30118
        #elif defined(HAVE_ED25519)
30119
            WOLFSSL_MSG("Trying Dilithium private key, ED25519 didn't work");
30120
        #elif defined(HAVE_ECC)
30121
            WOLFSSL_MSG("Trying Dilithium private key, ECC didn't work");
30122
        #elif !defined(NO_RSA)
30123
            WOLFSSL_MSG("Trying Dilithium private key, RSA didn't work");
30124
        #elif defined(HAVE_FALCON)
30125
            WOLFSSL_MSG("Trying Dilithium private key, Falcon didn't work");
30126
        #else
30127
            WOLFSSL_MSG("Trying Dilithium private key");
30128
        #endif
30129
30130
        /* Set start of data to beginning of buffer. */
30131
        idx = 0;
30132
        /* Decode the key assuming it is a Dilithium private key. */
30133
        ret = wc_Dilithium_PrivateKeyDecode(ssl->buffers.key->buffer,
30134
                                            &idx,
30135
                                            (dilithium_key*)ssl->hsKey,
30136
                                            ssl->buffers.key->length);
30137
        if (ret == 0) {
30138
            WOLFSSL_MSG("Using Dilithium private key");
30139
30140
            /* Check it meets the minimum Dilithium key size requirements. */
30141
            keySz = wc_dilithium_size((dilithium_key*)ssl->hsKey);
30142
            if (keySz < ssl->options.minDilithiumKeySz) {
30143
                WOLFSSL_MSG("Dilithium key size too small");
30144
                ERROR_OUT(DILITHIUM_KEY_SIZE_E, exit_dpk);
30145
            }
30146
30147
            /* Return the maximum signature length. */
30148
            *length = wc_dilithium_sig_size((dilithium_key*)ssl->hsKey);
30149
30150
            goto exit_dpk;
30151
        }
30152
    }
30153
#endif /* HAVE_DILITHIUM */
30154
30155
0
    (void)idx;
30156
0
    (void)keySz;
30157
0
    (void)length;
30158
30159
0
exit_dpk:
30160
0
    if (ret != 0) {
30161
0
        WOLFSSL_ERROR_VERBOSE(ret);
30162
0
    }
30163
30164
0
    return ret;
30165
0
}
30166
30167
#if defined(WOLFSSL_DUAL_ALG_CERTS)
30168
/* This is just like the above, but only consider RSA, ECC, Falcon and
30169
 * Dilthium; Furthermore, use the alternative key, not the native key.
30170
 */
30171
int DecodeAltPrivateKey(WOLFSSL *ssl, word32* length)
30172
{
30173
    int      ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
30174
    int      keySz;
30175
    word32   idx;
30176
30177
    /* make sure alt private key exists */
30178
    if (ssl->buffers.altKey == NULL || ssl->buffers.altKey->buffer == NULL) {
30179
        WOLFSSL_MSG("Alternative Private key missing!");
30180
        ERROR_OUT(NO_PRIVATE_KEY, exit_dapk);
30181
    }
30182
30183
#ifdef WOLFSSL_BLIND_PRIVATE_KEY
30184
    wolfssl_priv_der_unblind(ssl->buffers.altKey, ssl->buffers.altKeyMask);
30185
#endif
30186
30187
#ifdef WOLF_PRIVATE_KEY_ID
30188
    if (ssl->buffers.altKeyDevId != INVALID_DEVID &&
30189
        (ssl->buffers.altKeyId || ssl->buffers.altKeyLabel)) {
30190
        if (ssl->buffers.altKeyType == rsa_sa_algo)
30191
            ssl->hsAltType = DYNAMIC_TYPE_RSA;
30192
        else if (ssl->buffers.altKeyType == ecc_dsa_sa_algo)
30193
            ssl->hsAltType = DYNAMIC_TYPE_ECC;
30194
        else if ((ssl->buffers.altKeyType == falcon_level1_sa_algo) ||
30195
                 (ssl->buffers.altKeyType == falcon_level5_sa_algo))
30196
            ssl->hsAltType = DYNAMIC_TYPE_FALCON;
30197
        else if ((ssl->buffers.altKeyType == dilithium_level2_sa_algo) ||
30198
                 (ssl->buffers.altKeyType == dilithium_level3_sa_algo) ||
30199
                 (ssl->buffers.altKeyType == dilithium_level5_sa_algo))
30200
            ssl->hsAltType = DYNAMIC_TYPE_DILITHIUM;
30201
        ret = AllocKey(ssl, ssl->hsAltType, &ssl->hsAltKey);
30202
        if (ret != 0) {
30203
            goto exit_dapk;
30204
        }
30205
30206
        if (ssl->buffers.altKeyType == rsa_sa_algo) {
30207
    #ifndef NO_RSA
30208
            if (ssl->buffers.altKeyLabel) {
30209
                ret = wc_InitRsaKey_Label((RsaKey*)ssl->hsAltKey,
30210
                                          (char*)ssl->buffers.altKey->buffer,
30211
                                          ssl->heap, ssl->buffers.altKeyDevId);
30212
            }
30213
            else if (ssl->buffers.altKeyId) {
30214
                ret = wc_InitRsaKey_Id((RsaKey*)ssl->hsAltKey,
30215
                                       ssl->buffers.altKey->buffer,
30216
                                       ssl->buffers.altKey->length, ssl->heap,
30217
                                       ssl->buffers.altKeyDevId);
30218
            }
30219
            if (ret == 0) {
30220
                if (ssl->buffers.altKeySz < ssl->options.minRsaKeySz) {
30221
                    WOLFSSL_MSG("RSA key size too small");
30222
                    ERROR_OUT(RSA_KEY_SIZE_E, exit_dapk);
30223
                }
30224
30225
                /* Return the maximum signature length. */
30226
                *length = ssl->buffers.altKeySz;
30227
            }
30228
    #else
30229
            ret = NOT_COMPILED_IN;
30230
    #endif
30231
        }
30232
        else if (ssl->buffers.altKeyType == ecc_dsa_sa_algo) {
30233
    #ifdef HAVE_ECC
30234
            if (ssl->buffers.altKeyLabel) {
30235
                ret = wc_ecc_init_label((ecc_key*)ssl->hsAltKey,
30236
                                        (char*)ssl->buffers.altKey->buffer,
30237
                                        ssl->heap, ssl->buffers.altKeyDevId);
30238
            }
30239
            else if (ssl->buffers.altKeyId) {
30240
                ret = wc_ecc_init_id((ecc_key*)ssl->hsAltKey,
30241
                                     ssl->buffers.altKey->buffer,
30242
                                     ssl->buffers.altKey->length, ssl->heap,
30243
                                     ssl->buffers.altKeyDevId);
30244
            }
30245
            if (ret == 0) {
30246
                if (ssl->buffers.altKeySz < ssl->options.minEccKeySz) {
30247
                    WOLFSSL_MSG("ECC key size too small");
30248
                    ERROR_OUT(ECC_KEY_SIZE_E, exit_dapk);
30249
                }
30250
30251
                /* Return the maximum signature length. */
30252
                *length = wc_ecc_sig_size_calc(ssl->buffers.altKeySz);
30253
            }
30254
    #else
30255
            ret = NOT_COMPILED_IN;
30256
    #endif
30257
        }
30258
        else if ((ssl->buffers.altKeyType == falcon_level1_sa_algo) ||
30259
                 (ssl->buffers.altKeyType == falcon_level5_sa_algo)) {
30260
    #if defined(HAVE_FALCON)
30261
            if (ssl->buffers.altKeyLabel) {
30262
                ret = wc_falcon_init_label((falcon_key*)ssl->hsAltKey,
30263
                                           (char*)ssl->buffers.altKey->buffer,
30264
                                           ssl->heap, ssl->buffers.altKeyDevId);
30265
            }
30266
            else if (ssl->buffers.altKeyId) {
30267
                ret = wc_falcon_init_id((falcon_key*)ssl->hsAltKey,
30268
                                        ssl->buffers.altKey->buffer,
30269
                                        ssl->buffers.altKey->length, ssl->heap,
30270
                                        ssl->buffers.altKeyDevId);
30271
            }
30272
            if (ret == 0) {
30273
                if (ssl->buffers.altKeyType == falcon_level1_sa_algo) {
30274
                    ret = wc_falcon_set_level((falcon_key*)ssl->hsAltKey, 1);
30275
                }
30276
                else if (ssl->buffers.altKeyType == falcon_level5_sa_algo) {
30277
                    ret = wc_falcon_set_level((falcon_key*)ssl->hsAltKey, 5);
30278
                }
30279
            }
30280
            if (ret == 0) {
30281
                if (ssl->buffers.altKeySz < ssl->options.minFalconKeySz) {
30282
                    WOLFSSL_MSG("Falcon key size too small");
30283
                    ERROR_OUT(FALCON_KEY_SIZE_E, exit_dapk);
30284
                }
30285
30286
                /* Return the maximum signature length. */
30287
                *length = wc_falcon_sig_size((falcon_key*)ssl->hsAltKey);
30288
            }
30289
    #else
30290
            ret = NOT_COMPILED_IN;
30291
    #endif
30292
        }
30293
        else if ((ssl->buffers.altKeyType == dilithium_level2_sa_algo) ||
30294
                 (ssl->buffers.altKeyType == dilithium_level3_sa_algo) ||
30295
                 (ssl->buffers.altKeyType == dilithium_level5_sa_algo)) {
30296
    #if defined(HAVE_DILITHIUM)
30297
            if (ssl->buffers.altKeyLabel) {
30298
                ret = wc_dilithium_init_label((dilithium_key*)ssl->hsAltKey,
30299
                                        (char*)ssl->buffers.altKey->buffer,
30300
                                        ssl->heap, ssl->buffers.altKeyDevId);
30301
            }
30302
            else if (ssl->buffers.altKeyId) {
30303
                ret = wc_dilithium_init_id((dilithium_key*)ssl->hsAltKey,
30304
                                        ssl->buffers.altKey->buffer,
30305
                                        ssl->buffers.altKey->length, ssl->heap,
30306
                                        ssl->buffers.altKeyDevId);
30307
            }
30308
            if (ret == 0) {
30309
                if (ssl->buffers.altKeyType == dilithium_level2_sa_algo) {
30310
                    ret = wc_dilithium_set_level(
30311
                                        (dilithium_key*)ssl->hsAltKey, WC_ML_DSA_44);
30312
                }
30313
                else if (ssl->buffers.altKeyType == dilithium_level3_sa_algo) {
30314
                    ret = wc_dilithium_set_level(
30315
                                        (dilithium_key*)ssl->hsAltKey, WC_ML_DSA_65);
30316
                }
30317
                else if (ssl->buffers.altKeyType == dilithium_level5_sa_algo) {
30318
                    ret = wc_dilithium_set_level(
30319
                                        (dilithium_key*)ssl->hsAltKey, WC_ML_DSA_87);
30320
                }
30321
            }
30322
            if (ret == 0) {
30323
                if (ssl->buffers.altKeySz < ssl->options.minDilithiumKeySz) {
30324
                    WOLFSSL_MSG("Dilithium key size too small");
30325
                    ERROR_OUT(DILITHIUM_KEY_SIZE_E, exit_dapk);
30326
                }
30327
30328
                /* Return the maximum signature length. */
30329
                *length = wc_dilithium_sig_size(
30330
                                    (dilithium_key*)ssl->hsAltKey);
30331
            }
30332
    #else
30333
            ret = NOT_COMPILED_IN;
30334
    #endif
30335
        }
30336
        goto exit_dapk;
30337
    }
30338
#endif /* WOLF_PRIVATE_KEY_ID */
30339
30340
#ifndef NO_RSA
30341
    if (ssl->buffers.altKeyType == rsa_sa_algo ||
30342
        ssl->buffers.altKeyType == 0) {
30343
        ssl->hsAltType = DYNAMIC_TYPE_RSA;
30344
        ret = AllocKey(ssl, ssl->hsAltType, &ssl->hsAltKey);
30345
        if (ret != 0) {
30346
            goto exit_dapk;
30347
        }
30348
30349
        WOLFSSL_MSG("Trying RSA private key");
30350
30351
        /* Set start of data to beginning of buffer. */
30352
        idx = 0;
30353
        /* Decode the key assuming it is an RSA private key. */
30354
        ret = wc_RsaPrivateKeyDecode(ssl->buffers.altKey->buffer, &idx,
30355
                    (RsaKey*)ssl->hsAltKey, ssl->buffers.altKey->length);
30356
    #ifdef WOLF_PRIVATE_KEY_ID
30357
        /* if using external key then allow using a public key */
30358
        if (ret != 0 && (ssl->devId != INVALID_DEVID
30359
        #ifdef HAVE_PK_CALLBACKS
30360
            || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
30361
        #endif
30362
        )) {
30363
            WOLFSSL_MSG("Trying RSA public key with crypto callbacks");
30364
            idx = 0;
30365
            ret = wc_RsaPublicKeyDecode(ssl->buffers.altKey->buffer, &idx,
30366
                        (RsaKey*)ssl->hsAltKey, ssl->buffers.altKey->length);
30367
        }
30368
    #endif
30369
        if (ret == 0) {
30370
            WOLFSSL_MSG("Using RSA private key");
30371
30372
            /* It worked so check it meets minimum key size requirements. */
30373
            keySz = wc_RsaEncryptSize((RsaKey*)ssl->hsAltKey);
30374
            if (keySz < 0) { /* check if keySz has error case */
30375
                ERROR_OUT(keySz, exit_dapk);
30376
            }
30377
30378
            if (keySz < ssl->options.minRsaKeySz) {
30379
                WOLFSSL_MSG("RSA key size too small");
30380
                ERROR_OUT(RSA_KEY_SIZE_E, exit_dapk);
30381
            }
30382
30383
            /* Return the maximum signature length. */
30384
            *length = keySz;
30385
30386
            goto exit_dapk;
30387
        }
30388
    }
30389
#endif /* !NO_RSA */
30390
30391
#ifdef HAVE_ECC
30392
#ifndef NO_RSA
30393
    FreeKey(ssl, ssl->hsAltType, (void**)&ssl->hsAltKey);
30394
#endif /* !NO_RSA */
30395
30396
    if (ssl->buffers.altKeyType == ecc_dsa_sa_algo ||
30397
        ssl->buffers.altKeyType == 0
30398
    #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
30399
         || ssl->buffers.altKeyType == sm2_sa_algo
30400
    #endif
30401
        ) {
30402
        ssl->hsAltType = DYNAMIC_TYPE_ECC;
30403
        ret = AllocKey(ssl, ssl->hsAltType, &ssl->hsAltKey);
30404
        if (ret != 0) {
30405
            goto exit_dapk;
30406
        }
30407
30408
    #ifndef NO_RSA
30409
        WOLFSSL_MSG("Trying ECC private key, RSA didn't work");
30410
    #else
30411
        WOLFSSL_MSG("Trying ECC private key");
30412
    #endif
30413
30414
        /* Set start of data to beginning of buffer. */
30415
        idx = 0;
30416
        /* Decode the key assuming it is an ECC private key. */
30417
        ret = wc_EccPrivateKeyDecode(ssl->buffers.altKey->buffer, &idx,
30418
                                     (ecc_key*)ssl->hsAltKey,
30419
                                     ssl->buffers.altKey->length);
30420
    #ifdef WOLF_PRIVATE_KEY_ID
30421
        /* if using external key then allow using a public key */
30422
        if (ret != 0 && (ssl->devId != INVALID_DEVID
30423
        #ifdef HAVE_PK_CALLBACKS
30424
            || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
30425
        #endif
30426
        )) {
30427
            WOLFSSL_MSG("Trying ECC public key with crypto callbacks");
30428
            idx = 0;
30429
            ret = wc_EccPublicKeyDecode(ssl->buffers.altKey->buffer, &idx,
30430
                                     (ecc_key*)ssl->hsAltKey,
30431
                                     ssl->buffers.altKey->length);
30432
        }
30433
    #endif
30434
        if (ret == 0) {
30435
            WOLFSSL_MSG("Using ECC private key");
30436
30437
            /* Check it meets the minimum ECC key size requirements. */
30438
            keySz = wc_ecc_size((ecc_key*)ssl->hsAltKey);
30439
            if (keySz < ssl->options.minEccKeySz) {
30440
                WOLFSSL_MSG("ECC key size too small");
30441
                ERROR_OUT(ECC_KEY_SIZE_E, exit_dapk);
30442
            }
30443
30444
            /* Return the maximum signature length. */
30445
            *length = wc_ecc_sig_size((ecc_key*)ssl->hsAltKey);
30446
30447
            goto exit_dapk;
30448
        }
30449
    }
30450
#endif
30451
#if defined(HAVE_FALCON)
30452
    #if !defined(NO_RSA) || defined(HAVE_ECC)
30453
        FreeKey(ssl, ssl->hsAltType, (void**)&ssl->hsAltKey);
30454
    #endif
30455
30456
    if (ssl->buffers.altKeyType == falcon_level1_sa_algo ||
30457
        ssl->buffers.altKeyType == falcon_level5_sa_algo ||
30458
        ssl->buffers.altKeyType == 0) {
30459
30460
        ssl->hsAltType = DYNAMIC_TYPE_FALCON;
30461
        ret = AllocKey(ssl, ssl->hsAltType, &ssl->hsAltKey);
30462
        if (ret != 0) {
30463
            goto exit_dapk;
30464
        }
30465
30466
        if (ssl->buffers.altKeyType == falcon_level1_sa_algo) {
30467
            ret = wc_falcon_set_level((falcon_key*)ssl->hsAltKey, 1);
30468
        }
30469
        else if (ssl->buffers.altKeyType == falcon_level5_sa_algo) {
30470
            ret = wc_falcon_set_level((falcon_key*)ssl->hsAltKey, 5);
30471
        }
30472
        else {
30473
            /* What if ssl->buffers.keyType is 0? We might want to do something
30474
             * more graceful here. */
30475
            ret = ALGO_ID_E;
30476
        }
30477
30478
        if (ret != 0) {
30479
            goto exit_dapk;
30480
        }
30481
30482
        #if defined(HAVE_ECC)
30483
            WOLFSSL_MSG("Trying Falcon private key, ECC didn't work");
30484
        #elif !defined(NO_RSA)
30485
            WOLFSSL_MSG("Trying Falcon private key, RSA didn't work");
30486
        #else
30487
            WOLFSSL_MSG("Trying Falcon private key");
30488
        #endif
30489
30490
        /* Set start of data to beginning of buffer. */
30491
        idx = 0;
30492
        /* Decode the key assuming it is a Falcon private key. */
30493
        ret = wc_falcon_import_private_only(ssl->buffers.altKey->buffer,
30494
                                            ssl->buffers.altKey->length,
30495
                                            (falcon_key*)ssl->hsAltKey);
30496
        if (ret == 0) {
30497
            WOLFSSL_MSG("Using Falcon private key");
30498
30499
            /* Check it meets the minimum Falcon key size requirements. */
30500
            keySz = wc_falcon_size((falcon_key*)ssl->hsAltKey);
30501
            if (keySz < ssl->options.minFalconKeySz) {
30502
                WOLFSSL_MSG("Falcon key size too small");
30503
                ERROR_OUT(FALCON_KEY_SIZE_E, exit_dapk);
30504
            }
30505
30506
            /* Return the maximum signature length. */
30507
            *length = wc_falcon_sig_size((falcon_key*)ssl->hsAltKey);
30508
30509
            goto exit_dapk;
30510
        }
30511
    }
30512
#endif /* HAVE_FALCON */
30513
#if defined(HAVE_DILITHIUM)
30514
    #if !defined(NO_RSA) || defined(HAVE_ECC)
30515
        FreeKey(ssl, ssl->hsAltType, (void**)&ssl->hsAltKey);
30516
    #endif
30517
30518
    if (ssl->buffers.altKeyType == dilithium_level2_sa_algo ||
30519
        ssl->buffers.altKeyType == dilithium_level3_sa_algo ||
30520
        ssl->buffers.altKeyType == dilithium_level5_sa_algo ||
30521
        ssl->buffers.altKeyType == 0) {
30522
30523
        ssl->hsAltType = DYNAMIC_TYPE_DILITHIUM;
30524
        ret = AllocKey(ssl, ssl->hsAltType, &ssl->hsAltKey);
30525
        if (ret != 0) {
30526
            goto exit_dapk;
30527
        }
30528
30529
        if (ssl->buffers.altKeyType == dilithium_level2_sa_algo) {
30530
            ret = wc_dilithium_set_level((dilithium_key*)ssl->hsAltKey, WC_ML_DSA_44);
30531
        }
30532
        else if (ssl->buffers.altKeyType == dilithium_level3_sa_algo) {
30533
            ret = wc_dilithium_set_level((dilithium_key*)ssl->hsAltKey, WC_ML_DSA_65);
30534
        }
30535
        else if (ssl->buffers.altKeyType == dilithium_level5_sa_algo) {
30536
            ret = wc_dilithium_set_level((dilithium_key*)ssl->hsAltKey, WC_ML_DSA_87);
30537
        }
30538
        else {
30539
            /* What if ssl->buffers.keyType is 0? We might want to do something
30540
             * more graceful here. */
30541
            ret = ALGO_ID_E;
30542
        }
30543
30544
        if (ret != 0) {
30545
            goto exit_dapk;
30546
        }
30547
30548
        #if defined(HAVE_FALCON)
30549
            WOLFSSL_MSG("Trying Dilithium private key, Falcon didn't work");
30550
        #elif defined(HAVE_ECC)
30551
            WOLFSSL_MSG("Trying Dilithium private key, ECC didn't work");
30552
        #elif !defined(NO_RSA)
30553
            WOLFSSL_MSG("Trying Dilithium private key, RSA didn't work");
30554
        #else
30555
            WOLFSSL_MSG("Trying Dilithium private key");
30556
        #endif
30557
30558
        /* Set start of data to beginning of buffer. */
30559
        idx = 0;
30560
        /* Decode the key assuming it is a Dilithium private key. */
30561
        ret = wc_Dilithium_PrivateKeyDecode(ssl->buffers.altKey->buffer,
30562
                                            &idx,
30563
                                            (dilithium_key*)ssl->hsAltKey,
30564
                                            ssl->buffers.altKey->length);
30565
        if (ret == 0) {
30566
            WOLFSSL_MSG("Using Dilithium private key");
30567
30568
            /* Check it meets the minimum Dilithium key size requirements. */
30569
            keySz = wc_dilithium_size((dilithium_key*)ssl->hsAltKey);
30570
            if (keySz < ssl->options.minDilithiumKeySz) {
30571
                WOLFSSL_MSG("Dilithium key size too small");
30572
                ERROR_OUT(DILITHIUM_KEY_SIZE_E, exit_dapk);
30573
            }
30574
30575
            /* Return the maximum signature length. */
30576
            *length = wc_dilithium_sig_size((dilithium_key*)ssl->hsAltKey);
30577
30578
            goto exit_dapk;
30579
        }
30580
    }
30581
#endif /* HAVE_DILITHIUM */
30582
30583
    (void)idx;
30584
    (void)keySz;
30585
    (void)length;
30586
30587
exit_dapk:
30588
#ifdef WOLFSSL_BLIND_PRIVATE_KEY
30589
    if (ret == 0) {
30590
        ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.altKey,
30591
            &ssl->buffers.altKeyMask);
30592
    }
30593
    else {
30594
        wolfssl_priv_der_unblind(ssl->buffers.key, ssl->buffers.keyMask);
30595
    }
30596
#endif
30597
30598
    if (ret != 0) {
30599
        WOLFSSL_ERROR_VERBOSE(ret);
30600
    }
30601
30602
    return ret;
30603
}
30604
#endif /* WOLFSSL_DUAL_ALG_CERTS */
30605
30606
#endif /* !NO_CERTS */
30607
30608
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
30609
    /* returns 1 if able to do TLS 1.3 otherwise 0 */
30610
    int TLSv1_3_Capable(WOLFSSL* ssl)
30611
43.0k
    {
30612
    #ifndef WOLFSSL_TLS13
30613
        return 0;
30614
    #else
30615
43.0k
        int ret = 0;
30616
30617
43.0k
        if (IsAtLeastTLSv1_3(ssl->ctx->method->version)) {
30618
22.3k
            ret = 1;
30619
22.3k
        }
30620
30621
43.0k
        if ((wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_3)) {
30622
            /* option set at run time to disable TLS 1.3 */
30623
0
            ret = 0;
30624
0
        }
30625
30626
43.0k
        return ret;
30627
43.0k
    #endif
30628
43.0k
    }
30629
#endif /* WOLFSSL_TLS13 */
30630
30631
#if !defined(NO_TLS) && !defined(WOLFSSL_NO_TLS12)
30632
#if (!defined(NO_WOLFSSL_CLIENT) && (!defined(NO_DH) || defined(HAVE_ECC) || \
30633
      defined(HAVE_CURVE25519) || defined(HAVE_CURVE448))) || \
30634
    (!defined(NO_WOLFSSL_SERVER) && (defined(HAVE_ECC) || \
30635
      ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
30636
       (defined(HAVE_ED25519) || defined(HAVE_ED448) || !defined(NO_RSA)))) || \
30637
     (!defined(NO_DH) && (!defined(NO_RSA) || defined(HAVE_ANON))))
30638
/* Returns whether the signature algorithm requires caching of messages.
30639
 *
30640
 * @param [in] sigAlgo  Signature algorithm.
30641
 * @return  1 when caching required.
30642
 * @return  0 when caching not required.
30643
 */
30644
static int SigAlgoCachesMsgs(int sigAlgo)
30645
0
{
30646
0
    int ret;
30647
30648
0
    (void)sigAlgo;
30649
30650
0
#ifdef HAVE_ED25519
30651
0
    if (sigAlgo == ed25519_sa_algo) {
30652
0
        ret = 1;
30653
0
    }
30654
0
    else
30655
0
#endif
30656
0
#ifdef HAVE_ED448
30657
0
    if (sigAlgo == ed448_sa_algo) {
30658
0
        ret = 1;
30659
0
    }
30660
0
    else
30661
0
#endif
30662
0
#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
30663
0
    if (sigAlgo == sm2_sa_algo) {
30664
0
        ret = 1;
30665
0
    }
30666
0
    else
30667
0
#endif
30668
0
    {
30669
0
        ret = 0;
30670
0
    }
30671
30672
0
    return ret;
30673
0
}
30674
30675
static int HashSkeData(WOLFSSL* ssl, enum wc_HashType hashType,
30676
    const byte* data, word32 sz, byte sigAlgo)
30677
7.78k
{
30678
7.78k
    int ret = 0;
30679
7.78k
    int digest_sz = wc_HashGetDigestSize(hashType);
30680
30681
7.78k
    if (digest_sz <= 0) {
30682
0
        ret = BUFFER_ERROR;
30683
0
    }
30684
30685
7.78k
    if (ret == 0) {
30686
7.78k
        word32 new_size = SEED_LEN;
30687
        /* buffer for signature */
30688
7.78k
        if (! WC_SAFE_SUM_WORD32(new_size, sz, new_size))
30689
0
            ret = MEMORY_E;
30690
7.78k
        else {
30691
7.78k
            ssl->buffers.sig.buffer = (byte*)XMALLOC(new_size, ssl->heap,
30692
7.78k
                                                        DYNAMIC_TYPE_SIGNATURE);
30693
7.78k
            if (ssl->buffers.sig.buffer == NULL) {
30694
35
                ret = MEMORY_E;
30695
35
            }
30696
7.78k
        }
30697
7.78k
    }
30698
7.78k
    if (ret == 0) {
30699
7.75k
        ssl->buffers.sig.length = SEED_LEN + sz;
30700
30701
        /* build message to hash */
30702
7.75k
        XMEMCPY(ssl->buffers.sig.buffer, ssl->arrays->clientRandom, RAN_LEN);
30703
7.75k
        XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN], ssl->arrays->serverRandom,
30704
7.75k
            RAN_LEN);
30705
        /* message */
30706
7.75k
        XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN * 2], data, sz);
30707
7.75k
    }
30708
7.78k
    if (ret == 0 && !SigAlgoCachesMsgs(sigAlgo)) {
30709
7.75k
        ssl->buffers.digest.length = (unsigned int)digest_sz;
30710
30711
        /* buffer for hash */
30712
7.75k
        if (!ssl->options.dontFreeDigest) {
30713
7.75k
            XFREE(ssl->buffers.digest.buffer, ssl->heap,
30714
7.75k
                  DYNAMIC_TYPE_DIGEST);
30715
7.75k
        }
30716
7.75k
        ssl->options.dontFreeDigest = 0;
30717
30718
7.75k
        ssl->buffers.digest.buffer = (byte*)XMALLOC(ssl->buffers.digest.length,
30719
7.75k
            ssl->heap, DYNAMIC_TYPE_DIGEST);
30720
7.75k
        if (ssl->buffers.digest.buffer == NULL) {
30721
14
            ret = MEMORY_E;
30722
14
        }
30723
7.75k
    }
30724
7.78k
    if (ret == 0 && !SigAlgoCachesMsgs(sigAlgo)) {
30725
        /* Perform hash. Only wc_Hash supports MD5_SHA1. */
30726
7.73k
        ret = wc_Hash(hashType, ssl->buffers.sig.buffer,
30727
7.73k
                                ssl->buffers.sig.length,
30728
7.73k
                                ssl->buffers.digest.buffer,
30729
7.73k
                                ssl->buffers.digest.length);
30730
#ifdef HAVE_PK_CALLBACKS
30731
        if (ssl->ctx->ProcessServerSigKexCb == NULL)
30732
#endif
30733
7.73k
        {
30734
            /* No further processing will be done. It can be freed. */
30735
7.73k
            XFREE(ssl->buffers.sig.buffer, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
30736
7.73k
            ssl->buffers.sig.buffer = NULL;
30737
7.73k
        }
30738
7.73k
    }
30739
30740
7.78k
    return ret;
30741
7.78k
}
30742
#endif /* !NO_WOLFSSL_CLIENT [...etc] || !NO_WOLFSSL_SERVER [...etc] */
30743
#endif /* !NO_TLS && !WOLFSSL_NO_TLS12 */
30744
30745
/* client only parts */
30746
#if !defined(NO_WOLFSSL_CLIENT) && !defined(NO_TLS)
30747
30748
    int HaveUniqueSessionObj(WOLFSSL* ssl)
30749
2.86k
    {
30750
2.86k
        if (ssl->session->ref.count > 1) {
30751
0
            WOLFSSL_SESSION* newSession = wolfSSL_SESSION_dup(ssl->session);
30752
0
            if (newSession == NULL) {
30753
0
                WOLFSSL_MSG("Session duplicate failed");
30754
0
                return 0;
30755
0
            }
30756
0
            wolfSSL_FreeSession(ssl->ctx, ssl->session);
30757
0
            ssl->session = newSession;
30758
0
        }
30759
2.86k
        return 1;
30760
2.86k
    }
30761
30762
#ifndef WOLFSSL_NO_TLS12
30763
30764
    /* handle generation of client_hello (1) */
30765
    int SendClientHello(WOLFSSL* ssl)
30766
    {
30767
        byte              *output;
30768
        word32             length, idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
30769
        int                sendSz;
30770
        int                idSz;
30771
        int                ret;
30772
        word32             extSz = 0;
30773
        const Suites*      suites;
30774
30775
        if (ssl == NULL) {
30776
            return BAD_FUNC_ARG;
30777
        }
30778
30779
#ifdef WOLFSSL_TLS13
30780
        if (IsAtLeastTLSv1_3(ssl->version))
30781
            return SendTls13ClientHello(ssl);
30782
#endif
30783
30784
#ifdef HAVE_SECURE_RENEGOTIATION
30785
        /* We don't want to resume in SCR */
30786
        if (IsSCR(ssl))
30787
            ssl->options.resuming = 0;
30788
#endif
30789
30790
        idSz = ssl->options.resuming ? ssl->session->sessionIDSz : 0;
30791
30792
30793
        WOLFSSL_START(WC_FUNC_CLIENT_HELLO_SEND);
30794
        WOLFSSL_ENTER("SendClientHello");
30795
30796
        suites = WOLFSSL_SUITES(ssl);
30797
30798
        if (suites == NULL) {
30799
            WOLFSSL_MSG("Bad suites pointer in SendClientHello");
30800
            return SUITES_ERROR;
30801
        }
30802
30803
#ifdef HAVE_SESSION_TICKET
30804
        if (ssl->options.resuming && ssl->session->ticketLen > 0) {
30805
            SessionTicket* ticket;
30806
30807
            ticket = TLSX_SessionTicket_Create(0, ssl->session->ticket,
30808
                                             ssl->session->ticketLen, ssl->heap);
30809
            if (ticket == NULL) return MEMORY_E;
30810
30811
            ret = TLSX_UseSessionTicket(&ssl->extensions, ticket, ssl->heap);
30812
            if (ret != WOLFSSL_SUCCESS) {
30813
                TLSX_SessionTicket_Free(ticket, ssl->heap);
30814
                return ret;
30815
            }
30816
30817
            idSz = 0;
30818
        }
30819
#endif /* HAVE_SESSION_TICKET */
30820
        length = VERSION_SZ + RAN_LEN
30821
               + (word32)idSz + ENUM_LEN
30822
               + SUITE_LEN
30823
               + COMP_LEN + ENUM_LEN;
30824
#ifndef NO_FORCE_SCR_SAME_SUITE
30825
        if (IsSCR(ssl))
30826
            length += SUITE_LEN;
30827
        else
30828
#endif
30829
            length += suites->suiteSz;
30830
30831
#ifdef HAVE_TLS_EXTENSIONS
30832
        /* auto populate extensions supported unless user defined */
30833
        if ((ret = TLSX_PopulateExtensions(ssl, 0)) != 0)
30834
            return ret;
30835
        extSz = 0;
30836
        ret = TLSX_GetRequestSize(ssl, client_hello, &extSz);
30837
        if (ret != 0)
30838
            return ret;
30839
        length += extSz;
30840
#else
30841
        if (IsAtLeastTLSv1_2(ssl) && suites->hashSigAlgoSz)
30842
            extSz += HELLO_EXT_SZ + HELLO_EXT_SIGALGO_SZ
30843
                   + suites->hashSigAlgoSz;
30844
#ifdef HAVE_EXTENDED_MASTER
30845
        if (ssl->options.haveEMS)
30846
            extSz += HELLO_EXT_SZ;
30847
#endif
30848
        if (extSz != 0)
30849
            length += extSz + HELLO_EXT_SZ_SZ;
30850
#endif /* HAVE_TLS_EXTENSIONS */
30851
        sendSz = (int)length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
30852
30853
        if (ssl->arrays == NULL) {
30854
            return BAD_FUNC_ARG;
30855
        }
30856
30857
#ifdef WOLFSSL_DTLS
30858
        if (ssl->options.dtls) {
30859
            length += ENUM_LEN;   /* cookie */
30860
            if (ssl->arrays->cookieSz != 0) length += ssl->arrays->cookieSz;
30861
            sendSz  = (int)length + DTLS_HANDSHAKE_HEADER_SZ + DTLS_RECORD_HEADER_SZ;
30862
            idx    += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
30863
        }
30864
#endif
30865
30866
        if (IsEncryptionOn(ssl, 1))
30867
            sendSz += MAX_MSG_EXTRA;
30868
30869
        /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
30870
         * is not advanced yet */
30871
        ssl->options.buildingMsg = 1;
30872
30873
        /* check for available size */
30874
        if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
30875
            return ret;
30876
30877
        /* get output buffer */
30878
        output = GetOutputBuffer(ssl);
30879
30880
        AddHeaders(output, length, client_hello, ssl);
30881
30882
        /* client hello, first version */
30883
        output[idx++] = ssl->version.major;
30884
        output[idx++] = ssl->version.minor;
30885
        ssl->chVersion = ssl->version;  /* store in case changed */
30886
30887
        /* then random */
30888
        if (ssl->options.connectState == CONNECT_BEGIN) {
30889
            ret = wc_RNG_GenerateBlock(ssl->rng, output + idx, RAN_LEN);
30890
            if (ret != 0)
30891
                return ret;
30892
30893
            /* store random */
30894
            XMEMCPY(ssl->arrays->clientRandom, output + idx, RAN_LEN);
30895
        } else {
30896
#ifdef WOLFSSL_DTLS
30897
            /* send same random on hello again */
30898
            XMEMCPY(output + idx, ssl->arrays->clientRandom, RAN_LEN);
30899
#endif
30900
        }
30901
        idx += RAN_LEN;
30902
30903
        /* then session id */
30904
        output[idx++] = (byte)idSz;
30905
        if (idSz) {
30906
            XMEMCPY(output + idx, ssl->session->sessionID,
30907
                                                      ssl->session->sessionIDSz);
30908
            idx += ssl->session->sessionIDSz;
30909
        }
30910
30911
        /* then DTLS cookie */
30912
#ifdef WOLFSSL_DTLS
30913
        if (ssl->options.dtls) {
30914
            byte cookieSz = ssl->arrays->cookieSz;
30915
30916
            output[idx++] = cookieSz;
30917
            if (cookieSz) {
30918
                XMEMCPY(&output[idx], ssl->arrays->cookie, cookieSz);
30919
                idx += cookieSz;
30920
            }
30921
        }
30922
#endif /* WOLFSSL_DTLS */
30923
30924
#ifndef NO_FORCE_SCR_SAME_SUITE
30925
        if (IsSCR(ssl)) {
30926
            c16toa(SUITE_LEN, output + idx);
30927
            idx += OPAQUE16_LEN;
30928
            output[idx++] = ssl->options.cipherSuite0;
30929
            output[idx++] = ssl->options.cipherSuite;
30930
        }
30931
        else
30932
#endif /* NO_FORCE_SCR_SAME_SUITE */
30933
        {
30934
            /* then cipher suites */
30935
            c16toa(suites->suiteSz, output + idx);
30936
            idx += OPAQUE16_LEN;
30937
            XMEMCPY(output + idx, &suites->suites, suites->suiteSz);
30938
            idx += suites->suiteSz;
30939
        }
30940
30941
        /* last, compression */
30942
        output[idx++] = COMP_LEN;
30943
        if (ssl->options.usingCompression)
30944
            output[idx++] = ZLIB_COMPRESSION;
30945
        else
30946
            output[idx++] = NO_COMPRESSION;
30947
30948
#ifdef HAVE_TLS_EXTENSIONS
30949
        extSz = 0;
30950
        ret = TLSX_WriteRequest(ssl, output + idx, client_hello, &extSz);
30951
        if (ret != 0)
30952
            return ret;
30953
        idx += extSz;
30954
30955
        (void)idx; /* suppress analyzer warning, keep idx current */
30956
#else
30957
        if (extSz != 0) {
30958
            c16toa((word16)(extSz), output + idx);
30959
            idx += HELLO_EXT_SZ_SZ;
30960
30961
            if (IsAtLeastTLSv1_2(ssl)) {
30962
                if (suites->hashSigAlgoSz) {
30963
                    word16 i;
30964
                    /* extension type */
30965
                    c16toa(HELLO_EXT_SIG_ALGO, output + idx);
30966
                    idx += HELLO_EXT_TYPE_SZ;
30967
                    /* extension data length */
30968
                    c16toa(HELLO_EXT_SIGALGO_SZ + suites->hashSigAlgoSz,
30969
                           output + idx);
30970
                    idx += HELLO_EXT_SZ_SZ;
30971
                    /* sig algos length */
30972
                    c16toa(suites->hashSigAlgoSz, output + idx);
30973
                    idx += HELLO_EXT_SIGALGO_SZ;
30974
                    for (i=0; i < suites->hashSigAlgoSz; i++, idx++) {
30975
                        output[idx] = suites->hashSigAlgo[i];
30976
                    }
30977
                }
30978
            }
30979
#ifdef HAVE_EXTENDED_MASTER
30980
            if (ssl->options.haveEMS) {
30981
                c16toa(HELLO_EXT_EXTMS, output + idx);
30982
                idx += HELLO_EXT_TYPE_SZ;
30983
                c16toa(0, output + idx);
30984
                idx += HELLO_EXT_SZ_SZ;
30985
            }
30986
#endif
30987
        }
30988
#endif /* HAVE_TLS_EXTENSIONS */
30989
30990
        if (IsEncryptionOn(ssl, 1)) {
30991
            byte* input;
30992
            int   inputSz = (int)idx; /* build msg adds rec hdr */
30993
            int   recordHeaderSz = RECORD_HEADER_SZ;
30994
30995
            if (ssl->options.dtls)
30996
                recordHeaderSz += DTLS_RECORD_EXTRA;
30997
            inputSz -= recordHeaderSz;
30998
            input = (byte*)XMALLOC((size_t)inputSz, ssl->heap,
30999
                    DYNAMIC_TYPE_IN_BUFFER);
31000
            if (input == NULL)
31001
                return MEMORY_E;
31002
31003
            XMEMCPY(input, output + recordHeaderSz, (size_t)(inputSz));
31004
            #ifdef WOLFSSL_DTLS
31005
            if (IsDtlsNotSctpMode(ssl) &&
31006
                    (ret = DtlsMsgPoolSave(ssl, input, (word32)inputSz,
31007
                                          client_hello)) != 0) {
31008
                XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
31009
                return ret;
31010
            }
31011
            #endif
31012
            sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
31013
                                  handshake, 1, 0, 0, CUR_ORDER);
31014
            XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
31015
31016
            if (sendSz < 0)
31017
                return sendSz;
31018
        } else {
31019
            #ifdef WOLFSSL_DTLS
31020
                if (IsDtlsNotSctpMode(ssl)) {
31021
                    if ((ret = DtlsMsgPoolSave(ssl, output, (word32)sendSz, client_hello)) != 0)
31022
                        return ret;
31023
                }
31024
                if (ssl->options.dtls)
31025
                    DtlsSEQIncrement(ssl, CUR_ORDER);
31026
            #endif
31027
            ret = HashOutput(ssl, output, sendSz, 0);
31028
            if (ret != 0)
31029
                return ret;
31030
        }
31031
31032
        ssl->options.clientState = CLIENT_HELLO_COMPLETE;
31033
#ifdef OPENSSL_EXTRA
31034
        ssl->cbmode = WOLFSSL_CB_MODE_WRITE;
31035
        if (ssl->CBIS != NULL)
31036
            ssl->CBIS(ssl, WOLFSSL_CB_CONNECT_LOOP, WOLFSSL_SUCCESS);
31037
#endif
31038
31039
#if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
31040
        if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
31041
        if (ssl->toInfoOn) {
31042
            ret = AddPacketInfo(ssl, "ClientHello", handshake, output, sendSz,
31043
                          WRITE_PROTO, 0, ssl->heap);
31044
            if (ret != 0)
31045
                return ret;
31046
        }
31047
#endif
31048
31049
        ssl->options.buildingMsg = 0;
31050
31051
        ssl->buffers.outputBuffer.length += (word32)sendSz;
31052
31053
        ret = SendBuffered(ssl);
31054
31055
        WOLFSSL_LEAVE("SendClientHello", ret);
31056
        WOLFSSL_END(WC_FUNC_CLIENT_HELLO_SEND);
31057
31058
        return ret;
31059
    }
31060
31061
31062
    /* handle processing of DTLS hello_verify_request (3) */
31063
    int DoHelloVerifyRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
31064
        word32 size)
31065
0
    {
31066
0
        ProtocolVersion pv;
31067
0
        byte            cookieSz;
31068
0
        word32          begin = *inOutIdx;
31069
31070
#ifdef WOLFSSL_CALLBACKS
31071
        if (ssl->hsInfoOn) AddPacketName(ssl, "HelloVerifyRequest");
31072
        if (ssl->toInfoOn) AddLateName("HelloVerifyRequest", &ssl->timeoutInfo);
31073
#endif
31074
31075
#ifdef WOLFSSL_DTLS
31076
        if (ssl->options.dtls)
31077
            DtlsMsgPoolReset(ssl);
31078
#endif
31079
31080
0
        if (OPAQUE16_LEN + OPAQUE8_LEN > size)
31081
0
            return BUFFER_ERROR;
31082
31083
0
        XMEMCPY(&pv, input + *inOutIdx, OPAQUE16_LEN);
31084
0
        *inOutIdx += OPAQUE16_LEN;
31085
31086
0
        if (pv.major != DTLS_MAJOR ||
31087
0
                         (pv.minor != DTLS_MINOR && pv.minor != DTLSv1_2_MINOR))
31088
0
            return VERSION_ERROR;
31089
31090
0
        cookieSz = input[(*inOutIdx)++];
31091
31092
0
        if (cookieSz) {
31093
0
            if ((*inOutIdx - begin) + cookieSz > size)
31094
0
                return BUFFER_ERROR;
31095
31096
#ifdef WOLFSSL_DTLS
31097
            if (cookieSz <= MAX_COOKIE_LEN) {
31098
                XMEMCPY(ssl->arrays->cookie, input + *inOutIdx, cookieSz);
31099
                ssl->arrays->cookieSz = cookieSz;
31100
            }
31101
#endif
31102
0
            *inOutIdx += cookieSz;
31103
0
        }
31104
31105
#if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_TLS13)
31106
        if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.dtls) {
31107
            /* we sent a TLSv1.3 ClientHello but received a
31108
             * HELLO_VERIFY_REQUEST. We only check if DTLSv1_3_MINOR is the
31109
             * min downgrade option as per the server_version field comments in
31110
             * https://www.rfc-editor.org/rfc/rfc6347#section-4.2.1 */
31111
            if (!ssl->options.downgrade ||
31112
                    ssl->options.minDowngrade <= DTLSv1_3_MINOR)
31113
                return VERSION_ERROR;
31114
31115
            /* Cannot be DTLS1.3 as HELLO_VERIFY_REQUEST */
31116
            ssl->options.tls1_3 = 0;
31117
        }
31118
#endif /* defined(WOLFSSL_DTLS13) && defined(WOLFSSL_TLS13) */
31119
31120
0
        ssl->options.serverState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
31121
31122
0
        return 0;
31123
0
    }
31124
31125
31126
    static WC_INLINE int DSH_CheckSessionId(WOLFSSL* ssl)
31127
0
    {
31128
0
        int ret = 0;
31129
31130
#ifdef HAVE_SECRET_CALLBACK
31131
        /* If a session secret callback exists, we are using that
31132
         * key instead of the saved session key. Requires a ticket. */
31133
        ret = ret || (ssl->sessionSecretCb != NULL
31134
#ifdef HAVE_SESSION_TICKET
31135
                && ssl->session->ticketLen > 0
31136
#endif
31137
                );
31138
#endif /* HAVE_SECRET_CALLBACK */
31139
31140
#ifdef HAVE_SESSION_TICKET
31141
        /* server may send blank ticket which may not be expected to indicate
31142
         * existing one ok but will also be sending a new one */
31143
        ret = ret || (ssl->session->ticketLen > 0);
31144
#endif
31145
31146
0
        ret = ret ||
31147
0
              (ssl->options.haveSessionId && ssl->arrays->sessionIDSz == ID_LEN
31148
0
                      && ssl->session->sessionIDSz == ID_LEN
31149
0
                      && XMEMCMP(ssl->arrays->sessionID,
31150
0
                              ssl->session->sessionID, ID_LEN) == 0);
31151
31152
0
        return ret;
31153
0
    }
31154
31155
    /* Check the version in the received message is valid and set protocol
31156
     * version to use.
31157
     *
31158
     * ssl  The SSL/TLS object.
31159
     * pv   The protocol version from the packet.
31160
     * returns 0 on success, otherwise failure.
31161
     */
31162
    int CheckVersion(WOLFSSL *ssl, ProtocolVersion pv)
31163
0
    {
31164
0
        byte lowerVersion, higherVersion;
31165
    #ifdef WOLFSSL_TLS13_DRAFT
31166
        if (pv.major == TLS_DRAFT_MAJOR) {
31167
            pv.major = SSLv3_MAJOR;
31168
            pv.minor = TLSv1_3_MINOR;
31169
        }
31170
    #endif
31171
31172
    #ifdef OPENSSL_EXTRA
31173
        if (ssl->CBIS != NULL) {
31174
            ssl->CBIS(ssl, WOLFSSL_CB_HANDSHAKE_START, WOLFSSL_SUCCESS);
31175
        }
31176
    #endif
31177
31178
0
        if (ssl->options.dtls) {
31179
0
            if (pv.major != DTLS_MAJOR || pv.minor == DTLS_BOGUS_MINOR) {
31180
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
31181
0
                return VERSION_ERROR;
31182
0
            }
31183
0
            lowerVersion = pv.minor > ssl->version.minor;
31184
0
            higherVersion = pv.minor < ssl->version.minor;
31185
0
        }
31186
0
        else {
31187
0
            if (pv.major != SSLv3_MAJOR) {
31188
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
31189
0
                return VERSION_ERROR;
31190
0
            }
31191
0
            lowerVersion = pv.minor < ssl->version.minor;
31192
0
            higherVersion = pv.minor > ssl->version.minor;
31193
0
        }
31194
31195
0
        if (higherVersion) {
31196
0
            WOLFSSL_MSG("Server using higher version, fatal error");
31197
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
31198
0
            return VERSION_ERROR;
31199
0
        }
31200
0
        if (lowerVersion) {
31201
0
            WOLFSSL_MSG("server using lower version");
31202
31203
            /* Check for downgrade attack. */
31204
0
            if (!ssl->options.downgrade) {
31205
0
                WOLFSSL_MSG("\tno downgrade allowed, fatal error");
31206
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
31207
0
                return VERSION_ERROR;
31208
0
            }
31209
0
            if ((!ssl->options.dtls && pv.minor < ssl->options.minDowngrade) ||
31210
0
                (ssl->options.dtls && pv.minor > ssl->options.minDowngrade)) {
31211
0
                WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
31212
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
31213
0
                return VERSION_ERROR;
31214
0
            }
31215
31216
            #ifdef HAVE_SECURE_RENEGOTIATION
31217
                if (ssl->secure_renegotiation &&
31218
                                         ssl->secure_renegotiation->enabled &&
31219
                                         ssl->options.handShakeDone) {
31220
                    WOLFSSL_MSG("Server changed version during scr");
31221
                    WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
31222
                    return VERSION_ERROR;
31223
                }
31224
            #endif /* HAVE_SECURE_RENEGOTIATION */
31225
31226
            /* Checks made - OK to downgrade. */
31227
0
                ssl->version.minor = pv.minor;
31228
0
                switch(pv.minor) {
31229
0
                case SSLv3_MINOR:
31230
                    /* turn off tls */
31231
0
                    WOLFSSL_MSG("\tdowngrading to SSLv3");
31232
0
                    ssl->options.tls    = 0;
31233
0
                    ssl->options.tls1_1 = 0;
31234
0
                    break;
31235
0
                case TLSv1_MINOR:
31236
                    /* turn off tls 1.1+ */
31237
0
                    WOLFSSL_MSG("\tdowngrading to TLSv1");
31238
0
                    ssl->options.tls1_1 = 0;
31239
0
                    break;
31240
0
                case TLSv1_1_MINOR:
31241
0
                    WOLFSSL_MSG("\tdowngrading to TLSv1.1");
31242
0
                    break;
31243
0
                case DTLS_MINOR:
31244
0
                    WOLFSSL_MSG("\tdowngrading to DTLSv1.1");
31245
0
                    break;
31246
0
                case TLSv1_2_MINOR:
31247
0
                    WOLFSSL_MSG("\tdowngrading to TLSv1.2");
31248
0
                    break;
31249
0
                case DTLSv1_2_MINOR:
31250
0
                    WOLFSSL_MSG("\tdowngrading to DTLSv1.2");
31251
0
                    break;
31252
0
                default:
31253
0
                    WOLFSSL_MSG("\tbad minor version");
31254
0
                    WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
31255
0
                    return VERSION_ERROR;
31256
0
                }
31257
0
        }
31258
31259
        /* check if option is set to not allow the current version
31260
         * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
31261
0
        if (!ssl->options.dtls && ssl->options.downgrade &&
31262
0
            ssl->options.mask > 0) {
31263
31264
0
            if (ssl->version.minor == TLSv1_2_MINOR &&
31265
0
               (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) ==
31266
0
                WOLFSSL_OP_NO_TLSv1_2) {
31267
0
                WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
31268
0
                ssl->version.minor = TLSv1_1_MINOR;
31269
0
            }
31270
31271
0
            if (ssl->version.minor == TLSv1_1_MINOR &&
31272
0
               (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) ==
31273
0
                WOLFSSL_OP_NO_TLSv1_1) {
31274
0
                WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
31275
0
                ssl->options.tls1_1 = 0;
31276
0
                ssl->version.minor = TLSv1_MINOR;
31277
0
            }
31278
31279
0
            if (ssl->version.minor == TLSv1_MINOR &&
31280
0
                (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) ==
31281
0
                WOLFSSL_OP_NO_TLSv1) {
31282
0
                WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
31283
0
                ssl->options.tls    = 0;
31284
0
                ssl->options.tls1_1 = 0;
31285
0
                ssl->version.minor = SSLv3_MINOR;
31286
0
            }
31287
31288
0
            if (ssl->version.minor == SSLv3_MINOR &&
31289
0
                (ssl->options.mask & WOLFSSL_OP_NO_SSLv3) ==
31290
0
                WOLFSSL_OP_NO_SSLv3) {
31291
0
                WOLFSSL_MSG("\tError, option set to not allow SSLv3");
31292
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
31293
0
                return VERSION_ERROR;
31294
0
            }
31295
31296
0
            if (ssl->version.minor < ssl->options.minDowngrade) {
31297
0
                WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
31298
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
31299
0
                return VERSION_ERROR;
31300
0
            }
31301
0
        }
31302
31303
0
        return 0;
31304
0
    }
31305
31306
    /* handle processing of server_hello (2) */
31307
    int DoServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
31308
                      word32 helloSz)
31309
0
    {
31310
0
        byte            cs0;   /* cipher suite bytes 0, 1 */
31311
0
        byte            cs1;
31312
0
        ProtocolVersion pv;
31313
0
        byte            compression;
31314
0
        word32          i = *inOutIdx;
31315
0
        word32          begin = i;
31316
0
        int             ret;
31317
31318
0
        WOLFSSL_START(WC_FUNC_SERVER_HELLO_DO);
31319
0
        WOLFSSL_ENTER("DoServerHello");
31320
31321
#ifdef WOLFSSL_CALLBACKS
31322
        if (ssl->hsInfoOn) AddPacketName(ssl, "ServerHello");
31323
        if (ssl->toInfoOn) AddLateName("ServerHello", &ssl->timeoutInfo);
31324
#endif
31325
31326
        /* protocol version, random and session id length check */
31327
0
        if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
31328
0
            return BUFFER_ERROR;
31329
31330
        /* protocol version */
31331
0
        XMEMCPY(&pv, input + i, OPAQUE16_LEN);
31332
0
        i += OPAQUE16_LEN;
31333
31334
0
        ret = CheckVersion(ssl, pv);
31335
0
        if (ret != 0) {
31336
0
            SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
31337
0
            return ret;
31338
0
        }
31339
31340
0
#ifdef WOLFSSL_TLS13
31341
0
        if (IsAtLeastTLSv1_3(pv)) {
31342
0
            byte type = server_hello;
31343
0
            return DoTls13ServerHello(ssl, input, inOutIdx, helloSz, &type);
31344
0
        }
31345
0
#endif
31346
31347
        /* random */
31348
0
        XMEMCPY(ssl->arrays->serverRandom, input + i, RAN_LEN);
31349
0
        i += RAN_LEN;
31350
31351
        /* session id */
31352
0
        ssl->arrays->sessionIDSz = input[i++];
31353
31354
0
        if (ssl->arrays->sessionIDSz > ID_LEN) {
31355
0
            WOLFSSL_MSG("Invalid session ID size");
31356
0
            ssl->arrays->sessionIDSz = 0;
31357
0
            return BUFFER_ERROR;
31358
0
        }
31359
0
        else if (ssl->arrays->sessionIDSz) {
31360
0
            if ((i - begin) + ssl->arrays->sessionIDSz > helloSz)
31361
0
                return BUFFER_ERROR;
31362
31363
0
            XMEMCPY(ssl->arrays->sessionID, input + i,
31364
0
                                                      ssl->arrays->sessionIDSz);
31365
0
            i += ssl->arrays->sessionIDSz;
31366
0
            ssl->options.haveSessionId = 1;
31367
0
        }
31368
31369
31370
        /* suite and compression */
31371
0
        if ((i - begin) + OPAQUE16_LEN + OPAQUE8_LEN > helloSz)
31372
0
            return BUFFER_ERROR;
31373
31374
0
        cs0 = input[i++];
31375
0
        cs1 = input[i++];
31376
31377
0
#ifndef WOLFSSL_NO_STRICT_CIPHER_SUITE
31378
#if defined(HAVE_SECURE_RENEGOTIATION) && !defined(NO_FORCE_SCR_SAME_SUITE)
31379
        if (IsSCR(ssl)) {
31380
            if (ssl->options.cipherSuite0 != cs0 ||
31381
                ssl->options.cipherSuite  != cs1) {
31382
                WOLFSSL_MSG("Server changed cipher suite during scr");
31383
                WOLFSSL_ERROR_VERBOSE(MATCH_SUITE_ERROR);
31384
                return MATCH_SUITE_ERROR;
31385
            }
31386
        }
31387
        else
31388
#endif /* HAVE_SECURE_RENEGOTIATION && !NO_FORCE_SCR_SAME_SUITE */
31389
0
        {
31390
0
            word32 idx, found = 0;
31391
0
            const Suites* suites = WOLFSSL_SUITES(ssl);
31392
            /* confirm server_hello cipher suite is one sent in client_hello */
31393
0
            for (idx = 0; idx < suites->suiteSz; idx += 2) {
31394
0
                if (suites->suites[idx]   == cs0 &&
31395
0
                    suites->suites[idx+1] == cs1) {
31396
0
                    found = 1;
31397
0
                    break;
31398
0
                }
31399
0
            }
31400
0
            if (!found) {
31401
0
                WOLFSSL_MSG("ServerHello did not use cipher suite from ClientHello");
31402
0
                WOLFSSL_ERROR_VERBOSE(MATCH_SUITE_ERROR);
31403
0
                return MATCH_SUITE_ERROR;
31404
0
            }
31405
0
        }
31406
0
#endif /* !WOLFSSL_NO_STRICT_CIPHER_SUITE */
31407
31408
0
        ssl->options.cipherSuite0 = cs0;
31409
0
        ssl->options.cipherSuite  = cs1;
31410
    #ifdef WOLFSSL_DEBUG_TLS
31411
        WOLFSSL_MSG("Chosen cipher suite:");
31412
        WOLFSSL_MSG(GetCipherNameInternal(ssl->options.cipherSuite0,
31413
                                          ssl->options.cipherSuite));
31414
    #endif
31415
31416
0
        compression = input[i++];
31417
31418
0
        if (compression != NO_COMPRESSION && !ssl->options.usingCompression) {
31419
0
            WOLFSSL_MSG("Server forcing compression w/o support");
31420
0
            WOLFSSL_ERROR_VERBOSE(COMPRESSION_ERROR);
31421
0
            return COMPRESSION_ERROR;
31422
0
        }
31423
31424
0
        if (compression != ZLIB_COMPRESSION && ssl->options.usingCompression) {
31425
0
            WOLFSSL_MSG("Server refused compression, turning off");
31426
0
            ssl->options.usingCompression = 0;  /* turn off if server refused */
31427
0
        }
31428
31429
0
        *inOutIdx = i;
31430
31431
0
#ifdef HAVE_TLS_EXTENSIONS
31432
0
        if ( (i - begin) < helloSz) {
31433
0
            if (TLSX_SupportExtensions(ssl)) {
31434
0
                word16 totalExtSz;
31435
31436
0
                if ((i - begin) + OPAQUE16_LEN > helloSz)
31437
0
                    return BUFFER_ERROR;
31438
31439
0
                ato16(&input[i], &totalExtSz);
31440
0
                i += OPAQUE16_LEN;
31441
31442
0
                if ((i - begin) + totalExtSz > helloSz)
31443
0
                    return BUFFER_ERROR;
31444
31445
0
                if ((ret = TLSX_Parse(ssl, (byte *) input + i, totalExtSz,
31446
0
                                                           server_hello, NULL)))
31447
0
                    return ret;
31448
31449
0
                i += totalExtSz;
31450
0
                *inOutIdx = i;
31451
0
            }
31452
0
            else
31453
0
                *inOutIdx = begin + helloSz; /* skip extensions */
31454
0
        }
31455
0
        else
31456
0
            ssl->options.haveEMS = 0; /* If no extensions, no EMS */
31457
#else
31458
        /* !HAVE_TLS_EXTENSIONS */
31459
        {
31460
            byte pendingEMS = 0;
31461
31462
            if ( (i - begin) < helloSz) {
31463
                int allowExt = 0;
31464
31465
                if (ssl->version.major == SSLv3_MAJOR &&
31466
                    ssl->version.minor >= TLSv1_MINOR) {
31467
31468
                    allowExt = 1;
31469
                }
31470
#ifdef WOLFSSL_DTLS
31471
                if (ssl->version.major == DTLS_MAJOR)
31472
                    allowExt = 1;
31473
#endif
31474
31475
                if (allowExt) {
31476
                    word16 totalExtSz;
31477
31478
                    if ((i - begin) + OPAQUE16_LEN > helloSz)
31479
                        return BUFFER_ERROR;
31480
31481
                    ato16(&input[i], &totalExtSz);
31482
                    i += OPAQUE16_LEN;
31483
31484
                    if ((i - begin) + totalExtSz > helloSz)
31485
                        return BUFFER_ERROR;
31486
31487
                    while (totalExtSz) {
31488
                        word16 extId, extSz;
31489
31490
                        if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz)
31491
                            return BUFFER_ERROR;
31492
31493
                        ato16(&input[i], &extId);
31494
                        i += OPAQUE16_LEN;
31495
                        ato16(&input[i], &extSz);
31496
                        i += OPAQUE16_LEN;
31497
31498
                        if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz)
31499
                            return BUFFER_ERROR;
31500
31501
                        if (extId == HELLO_EXT_EXTMS)
31502
                            pendingEMS = 1;
31503
                        else
31504
                            i += extSz;
31505
31506
                        totalExtSz -= (word16)(OPAQUE16_LEN) +
31507
                                    (word16)(OPAQUE16_LEN) +
31508
                                    extSz;
31509
                    }
31510
31511
                    *inOutIdx = i;
31512
                }
31513
                else
31514
                    *inOutIdx = begin + helloSz; /* skip extensions */
31515
            }
31516
31517
            if (!pendingEMS && ssl->options.haveEMS)
31518
                ssl->options.haveEMS = 0;
31519
        }
31520
#endif /* HAVE_TLS_EXTENSIONS */
31521
31522
#if defined(WOLFSSL_HARDEN_TLS) && !defined(WOLFSSL_HARDEN_TLS_NO_SCR_CHECK)
31523
        if (ssl->secure_renegotiation == NULL ||
31524
                !ssl->secure_renegotiation->enabled) {
31525
            /* If the server does not acknowledge the extension, the client
31526
             * MUST generate a fatal handshake_failure alert prior to
31527
             * terminating the connection.
31528
             * https://www.rfc-editor.org/rfc/rfc9325#name-renegotiation-in-tls-12 */
31529
            WOLFSSL_MSG("ServerHello did not contain SCR extension");
31530
            return SECURE_RENEGOTIATION_E;
31531
        }
31532
#endif
31533
31534
0
        ssl->options.serverState = SERVER_HELLO_COMPLETE;
31535
31536
0
        if (IsEncryptionOn(ssl, 0))
31537
0
            *inOutIdx += ssl->keys.padSz;
31538
31539
#ifdef HAVE_SECRET_CALLBACK
31540
        if (ssl->sessionSecretCb != NULL
31541
#ifdef HAVE_SESSION_TICKET
31542
                && ssl->session->ticketLen > 0
31543
#endif
31544
                ) {
31545
            int secretSz = SECRET_LEN;
31546
            ret = ssl->sessionSecretCb(ssl, ssl->session->masterSecret,
31547
                                              &secretSz, ssl->sessionSecretCtx);
31548
            if (ret != 0 || secretSz != SECRET_LEN) {
31549
                WOLFSSL_ERROR_VERBOSE(SESSION_SECRET_CB_E);
31550
                return SESSION_SECRET_CB_E;
31551
            }
31552
        }
31553
#endif /* HAVE_SECRET_CALLBACK */
31554
31555
0
        ret = CompleteServerHello(ssl);
31556
31557
0
        WOLFSSL_LEAVE("DoServerHello", ret);
31558
0
        WOLFSSL_END(WC_FUNC_SERVER_HELLO_DO);
31559
31560
0
        return ret;
31561
0
    }
31562
31563
    int CompleteServerHello(WOLFSSL* ssl)
31564
    {
31565
        int ret;
31566
31567
        if (!ssl->options.resuming) {
31568
            byte* down = ssl->arrays->serverRandom + RAN_LEN -
31569
                                                         TLS13_DOWNGRADE_SZ - 1;
31570
            byte  vers = ssl->arrays->serverRandom[RAN_LEN - 1];
31571
    #ifdef WOLFSSL_TLS13
31572
            if (TLSv1_3_Capable(ssl)) {
31573
                /* TLS v1.3 capable client not allowed to downgrade when
31574
                 * connecting to TLS v1.3 capable server unless cipher suite
31575
                 * demands it.
31576
                 */
31577
                if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
31578
                                                     (vers == 0 || vers == 1)) {
31579
                    SendAlert(ssl, alert_fatal, illegal_parameter);
31580
                    WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
31581
                    return VERSION_ERROR;
31582
                }
31583
            }
31584
            else
31585
    #endif /* WOLFSSL_TLS13 */
31586
            if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
31587
                ssl->ctx->method->version.minor == TLSv1_2_MINOR &&
31588
                (wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_2) == 0) {
31589
                /* TLS v1.2 capable client not allowed to downgrade when
31590
                 * connecting to TLS v1.2 capable server.
31591
                 */
31592
                if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
31593
                                                                    vers == 0) {
31594
                    SendAlert(ssl, alert_fatal, illegal_parameter);
31595
                    WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
31596
                    return VERSION_ERROR;
31597
                }
31598
            }
31599
        }
31600
        else {
31601
            if (DSH_CheckSessionId(ssl)) {
31602
                if (SetCipherSpecs(ssl) == 0) {
31603
                    if (!HaveUniqueSessionObj(ssl)) {
31604
                        WOLFSSL_MSG("Unable to have unique session object");
31605
                        WOLFSSL_ERROR_VERBOSE(MEMORY_ERROR);
31606
                        return MEMORY_ERROR;
31607
                    }
31608
31609
                    XMEMCPY(ssl->arrays->masterSecret,
31610
                            ssl->session->masterSecret, SECRET_LEN);
31611
            #ifdef NO_OLD_TLS
31612
                    ret = DeriveTlsKeys(ssl);
31613
            #else
31614
                    ret = -1; /* default value */
31615
                #ifndef NO_TLS
31616
                    if (ssl->options.tls)
31617
                        ret = DeriveTlsKeys(ssl);
31618
                #endif
31619
                    if (!ssl->options.tls)
31620
                        ret = DeriveKeys(ssl);
31621
            #endif /* NO_OLD_TLS */
31622
                    /* SERVER: peer auth based on session secret. */
31623
                    ssl->options.peerAuthGood = (ret == 0);
31624
                    ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
31625
31626
                    return ret;
31627
                }
31628
                else {
31629
                    WOLFSSL_MSG("Unsupported cipher suite, DoServerHello");
31630
                    WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_SUITE);
31631
                    return UNSUPPORTED_SUITE;
31632
                }
31633
            }
31634
            else {
31635
                WOLFSSL_MSG("Server denied resumption attempt");
31636
                ssl->options.resuming = 0; /* server denied resumption try */
31637
            }
31638
        }
31639
        return SetCipherSpecs(ssl);
31640
    }
31641
31642
#endif /* !WOLFSSL_NO_TLS12 */
31643
31644
31645
    /* Make sure client setup is valid for this suite, true on success */
31646
    int VerifyClientSuite(word16 havePSK, byte cipherSuite0, byte cipherSuite)
31647
    {
31648
        (void)havePSK;
31649
31650
        WOLFSSL_ENTER("VerifyClientSuite");
31651
31652
        if (CipherRequires(cipherSuite0, cipherSuite, REQUIRES_PSK)) {
31653
            WOLFSSL_MSG("Requires PSK");
31654
        #ifndef NO_PSK
31655
            if (havePSK == 0)
31656
        #endif
31657
            {
31658
                WOLFSSL_MSG("Don't have PSK");
31659
                return 0;
31660
            }
31661
        }
31662
31663
        return 1;  /* success */
31664
    }
31665
31666
#ifndef WOLFSSL_NO_TLS12
31667
31668
#ifndef NO_CERTS
31669
    /* handle processing of certificate_request (13) */
31670
    static int DoCertificateRequest(WOLFSSL* ssl, const byte* input, word32*
31671
                                    inOutIdx, word32 size)
31672
0
    {
31673
0
        word16 len;
31674
0
        word32 begin = *inOutIdx;
31675
    #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) || \
31676
        defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
31677
        int ret;
31678
    #endif
31679
    #ifdef OPENSSL_EXTRA
31680
        WOLFSSL_X509* x509 = NULL;
31681
        WOLFSSL_EVP_PKEY* pkey = NULL;
31682
    #endif
31683
31684
0
        WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_DO);
31685
0
        WOLFSSL_ENTER("DoCertificateRequest");
31686
31687
        #ifdef WOLFSSL_CALLBACKS
31688
            if (ssl->hsInfoOn)
31689
                AddPacketName(ssl, "CertificateRequest");
31690
            if (ssl->toInfoOn)
31691
                AddLateName("CertificateRequest", &ssl->timeoutInfo);
31692
        #endif
31693
31694
0
        if (OPAQUE8_LEN > size)
31695
0
            return BUFFER_ERROR;
31696
31697
0
        len = input[(*inOutIdx)++];
31698
31699
0
        if ((*inOutIdx - begin) + len > size)
31700
0
            return BUFFER_ERROR;
31701
31702
        /* types, read in here */
31703
0
        *inOutIdx += len;
31704
31705
        /* signature and hash signature algorithm */
31706
0
        if (IsAtLeastTLSv1_2(ssl)) {
31707
0
            if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
31708
0
                return BUFFER_ERROR;
31709
31710
0
            ato16(input + *inOutIdx, &len);
31711
0
            *inOutIdx += OPAQUE16_LEN;
31712
31713
0
            if ((len > size) || ((*inOutIdx - begin) + len > size))
31714
0
                return BUFFER_ERROR;
31715
31716
0
            if (PickHashSigAlgo(ssl, input + *inOutIdx, len, 0) != 0 &&
31717
0
                                             ssl->buffers.certificate &&
31718
0
                                             ssl->buffers.certificate->buffer) {
31719
            #ifdef HAVE_PK_CALLBACKS
31720
                if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
31721
                    WOLFSSL_MSG("Using PK for client private key");
31722
                    WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
31723
                    return INVALID_PARAMETER;
31724
                }
31725
            #endif
31726
0
                if (ssl->buffers.key && ssl->buffers.key->buffer) {
31727
0
                    WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
31728
0
                    return INVALID_PARAMETER;
31729
0
                }
31730
0
            }
31731
0
            *inOutIdx += len;
31732
0
    #ifdef WC_RSA_PSS
31733
0
            ssl->pssAlgo = 0;
31734
0
            if (ssl->options.sigAlgo == rsa_pss_sa_algo)
31735
0
                ssl->pssAlgo |= 1 << ssl->options.hashAlgo;
31736
0
    #endif
31737
0
        }
31738
31739
        /* authorities */
31740
0
        if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
31741
0
            return BUFFER_ERROR;
31742
31743
        /* DN seq length */
31744
0
        ato16(input + *inOutIdx, &len);
31745
0
        *inOutIdx += OPAQUE16_LEN;
31746
31747
0
        if ((*inOutIdx - begin) + len > size)
31748
0
            return BUFFER_ERROR;
31749
31750
    #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
31751
        if (ssl->client_ca_names != ssl->ctx->client_ca_names)
31752
            wolfSSL_sk_X509_NAME_pop_free(ssl->client_ca_names, NULL);
31753
        ssl->client_ca_names = wolfSSL_sk_X509_NAME_new(NULL);
31754
        if (ssl->client_ca_names == NULL) {
31755
            return MEMORY_ERROR;
31756
        }
31757
    #endif
31758
31759
0
        while (len) {
31760
0
            word16 dnSz;
31761
31762
0
            if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
31763
0
                return BUFFER_ERROR;
31764
31765
0
            ato16(input + *inOutIdx, &dnSz);
31766
0
            *inOutIdx += OPAQUE16_LEN;
31767
31768
0
            if ((*inOutIdx - begin) + dnSz > size)
31769
0
                return BUFFER_ERROR;
31770
31771
        #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
31772
            {
31773
                WOLFSSL_X509_NAME* name = NULL;
31774
                /* Use a DecodedCert struct to get access to GetName to
31775
                 * parse DN name */
31776
#ifdef WOLFSSL_SMALL_STACK
31777
                DecodedCert *cert = (DecodedCert *)XMALLOC(
31778
                    sizeof(*cert), ssl->heap, DYNAMIC_TYPE_DCERT);
31779
                if (cert == NULL)
31780
                    return MEMORY_ERROR;
31781
#else
31782
                DecodedCert cert[1];
31783
#endif
31784
31785
                InitDecodedCert(cert, input + *inOutIdx, dnSz, ssl->heap);
31786
31787
                ret = GetName(cert, ASN_SUBJECT, dnSz);
31788
31789
                if (ret == 0) {
31790
                    if ((name = wolfSSL_X509_NAME_new_ex(cert->heap)) == NULL)
31791
                        ret = MEMORY_ERROR;
31792
                }
31793
31794
                if (ret == 0) {
31795
                    CopyDecodedName(name, cert, ASN_SUBJECT);
31796
                }
31797
31798
                if (ret == 0) {
31799
                    if (wolfSSL_sk_X509_NAME_push(ssl->client_ca_names, name)
31800
                        <= 0)
31801
                    {
31802
                        ret = MEMORY_ERROR;
31803
                    }
31804
                }
31805
31806
                FreeDecodedCert(cert);
31807
31808
#ifdef WOLFSSL_SMALL_STACK
31809
                XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
31810
#endif
31811
                if (ret != 0) {
31812
                    if (name != NULL)
31813
                        wolfSSL_X509_NAME_free(name);
31814
                    return ret;
31815
                }
31816
            }
31817
        #endif
31818
31819
0
            *inOutIdx += dnSz;
31820
0
            len -= (word16)(OPAQUE16_LEN) + dnSz;
31821
0
        }
31822
31823
    #ifdef OPENSSL_EXTRA
31824
        /* call client cert callback if no cert has been loaded */
31825
        if ((ssl->ctx->CBClientCert != NULL) &&
31826
            (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer)) {
31827
31828
            ret = ssl->ctx->CBClientCert(ssl, &x509, &pkey);
31829
            if (ret == 1) {
31830
                if ((wolfSSL_use_certificate(ssl, x509) != WOLFSSL_SUCCESS) ||
31831
                    (wolfSSL_use_PrivateKey(ssl, pkey) != WOLFSSL_SUCCESS)) {
31832
                    WOLFSSL_ERROR_VERBOSE(CLIENT_CERT_CB_ERROR);
31833
                    return CLIENT_CERT_CB_ERROR;
31834
                }
31835
                wolfSSL_X509_free(x509);
31836
                x509 = NULL;
31837
                wolfSSL_EVP_PKEY_free(pkey);
31838
31839
            }
31840
            else if (ret < 0) {
31841
                return WOLFSSL_ERROR_WANT_X509_LOOKUP;
31842
            }
31843
        }
31844
        if ((ret = CertSetupCbWrapper(ssl)) != 0)
31845
            return ret;
31846
    #endif
31847
31848
        /* don't send client cert or cert verify if user hasn't provided
31849
           cert and private key */
31850
0
        if (ssl->buffers.certificate && ssl->buffers.certificate->buffer) {
31851
        #ifdef HAVE_PK_CALLBACKS
31852
            if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
31853
                WOLFSSL_MSG("Using PK for client private key");
31854
                ssl->options.sendVerify = SEND_CERT;
31855
            }
31856
        #endif
31857
0
            if (ssl->buffers.key && ssl->buffers.key->buffer) {
31858
0
                ssl->options.sendVerify = SEND_CERT;
31859
0
            }
31860
0
        }
31861
    #ifdef OPENSSL_EXTRA
31862
        else
31863
    #else
31864
0
        else if (IsTLS(ssl) || ssl->options.dtls)
31865
0
    #endif
31866
0
        {
31867
0
            ssl->options.sendVerify = SEND_BLANK_CERT;
31868
0
        }
31869
31870
0
        if (IsEncryptionOn(ssl, 0))
31871
0
            *inOutIdx += ssl->keys.padSz;
31872
31873
0
        WOLFSSL_LEAVE("DoCertificateRequest", 0);
31874
0
        WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_DO);
31875
31876
0
        return 0;
31877
0
    }
31878
#endif /* !NO_CERTS */
31879
31880
31881
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
31882
31883
    static int CheckCurveId(int tlsCurveId)
31884
0
    {
31885
0
        int ret = WC_NO_ERR_TRACE(ECC_CURVE_ERROR);
31886
31887
0
        switch (tlsCurveId) {
31888
0
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
31889
0
        #ifndef NO_ECC_SECP
31890
0
            case WOLFSSL_ECC_SECP160R1: return ECC_SECP160R1_OID;
31891
0
        #endif /* !NO_ECC_SECP */
31892
0
        #ifdef HAVE_ECC_SECPR2
31893
0
            case WOLFSSL_ECC_SECP160R2: return ECC_SECP160R2_OID;
31894
0
        #endif /* HAVE_ECC_SECPR2 */
31895
0
        #ifdef HAVE_ECC_KOBLITZ
31896
0
            case WOLFSSL_ECC_SECP160K1: return ECC_SECP160K1_OID;
31897
0
        #endif /* HAVE_ECC_KOBLITZ */
31898
0
    #endif
31899
0
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
31900
0
        #ifndef NO_ECC_SECP
31901
0
            case WOLFSSL_ECC_SECP192R1: return ECC_SECP192R1_OID;
31902
0
        #endif /* !NO_ECC_SECP */
31903
0
        #ifdef HAVE_ECC_KOBLITZ
31904
0
            case WOLFSSL_ECC_SECP192K1: return ECC_SECP192K1_OID;
31905
0
        #endif /* HAVE_ECC_KOBLITZ */
31906
0
    #endif
31907
0
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
31908
0
        #ifndef NO_ECC_SECP
31909
0
            case WOLFSSL_ECC_SECP224R1: return ECC_SECP224R1_OID;
31910
0
        #endif /* !NO_ECC_SECP */
31911
0
        #ifdef HAVE_ECC_KOBLITZ
31912
0
            case WOLFSSL_ECC_SECP224K1: return ECC_SECP224K1_OID;
31913
0
        #endif /* HAVE_ECC_KOBLITZ */
31914
0
    #endif
31915
0
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
31916
0
            case WOLFSSL_ECC_X25519: return ECC_X25519_OID;
31917
0
        #endif
31918
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
31919
0
        #ifndef NO_ECC_SECP
31920
0
            case WOLFSSL_ECC_SECP256R1: return ECC_SECP256R1_OID;
31921
0
        #endif /* !NO_ECC_SECP */
31922
0
        #ifdef HAVE_ECC_KOBLITZ
31923
0
            case WOLFSSL_ECC_SECP256K1: return ECC_SECP256K1_OID;
31924
0
        #endif /* HAVE_ECC_KOBLITZ */
31925
0
        #ifdef HAVE_ECC_BRAINPOOL
31926
0
            case WOLFSSL_ECC_BRAINPOOLP256R1: return ECC_BRAINPOOLP256R1_OID;
31927
0
        #endif /* HAVE_ECC_BRAINPOOL */
31928
0
        #ifdef WOLFSSL_SM2
31929
0
            case WOLFSSL_ECC_SM2P256V1: return ECC_SM2P256V1_OID;
31930
0
        #endif /* WOLFSSL_SM2 */
31931
0
    #endif
31932
0
        #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
31933
0
            case WOLFSSL_ECC_X448: return ECC_X448_OID;
31934
0
        #endif
31935
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
31936
0
        #ifndef NO_ECC_SECP
31937
0
            case WOLFSSL_ECC_SECP384R1: return ECC_SECP384R1_OID;
31938
0
        #endif /* !NO_ECC_SECP */
31939
0
        #ifdef HAVE_ECC_BRAINPOOL
31940
0
            case WOLFSSL_ECC_BRAINPOOLP384R1: return ECC_BRAINPOOLP384R1_OID;
31941
0
        #endif /* HAVE_ECC_BRAINPOOL */
31942
0
    #endif
31943
0
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
31944
0
        #ifdef HAVE_ECC_BRAINPOOL
31945
0
            case WOLFSSL_ECC_BRAINPOOLP512R1: return ECC_BRAINPOOLP512R1_OID;
31946
0
        #endif /* HAVE_ECC_BRAINPOOL */
31947
0
    #endif
31948
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
31949
0
        #ifndef NO_ECC_SECP
31950
0
            case WOLFSSL_ECC_SECP521R1: return ECC_SECP521R1_OID;
31951
0
        #endif /* !NO_ECC_SECP */
31952
0
    #endif
31953
0
            default:
31954
0
                ret = WC_NO_ERR_TRACE(ECC_CURVE_ERROR);
31955
0
                break;
31956
0
        }
31957
31958
0
        return ret;
31959
0
    }
31960
31961
#endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
31962
31963
/* Persistable DoServerKeyExchange arguments */
31964
typedef struct DskeArgs {
31965
    byte*  output; /* not allocated */
31966
#if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
31967
                                                          defined(HAVE_CURVE448)
31968
    byte*  verifySig;
31969
#endif
31970
    word32 idx;
31971
    word32 begin;
31972
#if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
31973
                                                          defined(HAVE_CURVE448)
31974
    word16 verifySigSz;
31975
#endif
31976
    word16 sigSz;
31977
#if !defined(NO_RSA) && defined(WC_RSA_PSS)
31978
    int    bits;
31979
#endif
31980
} DskeArgs;
31981
31982
static void FreeDskeArgs(WOLFSSL* ssl, void* pArgs)
31983
3.60k
{
31984
3.60k
    DskeArgs* args = (DskeArgs*)pArgs;
31985
31986
3.60k
    (void)ssl;
31987
3.60k
    (void)args;
31988
31989
3.60k
#if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
31990
3.60k
                                                          defined(HAVE_CURVE448)
31991
3.60k
    XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
31992
3.60k
    args->verifySig = NULL;
31993
3.60k
#endif
31994
3.60k
}
31995
31996
#ifndef NO_DH
31997
static int GetDhPublicKey(WOLFSSL* ssl, const byte* input, word32 size,
31998
                          DskeArgs* args)
31999
798
{
32000
798
    int             ret = 0;
32001
798
    word16          length;
32002
798
#ifdef HAVE_FFDHE
32003
798
#ifdef HAVE_PUBLIC_FFDHE
32004
798
    const DhParams* params = NULL;
32005
798
#endif
32006
798
    word16          group = 0;
32007
798
#endif
32008
32009
798
    if (ssl->buffers.weOwnDH) {
32010
0
        if (ssl->buffers.serverDH_P.buffer) {
32011
0
            XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
32012
0
                    DYNAMIC_TYPE_PUBLIC_KEY);
32013
0
            ssl->buffers.serverDH_P.buffer = NULL;
32014
0
        }
32015
32016
0
        if (ssl->buffers.serverDH_G.buffer) {
32017
0
            XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
32018
0
                    DYNAMIC_TYPE_PUBLIC_KEY);
32019
0
            ssl->buffers.serverDH_G.buffer = NULL;
32020
0
        }
32021
32022
0
    }
32023
32024
798
    if (ssl->buffers.serverDH_Pub.buffer) {
32025
0
        XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap,
32026
0
                DYNAMIC_TYPE_PUBLIC_KEY);
32027
0
        ssl->buffers.serverDH_Pub.buffer = NULL;
32028
0
    }
32029
32030
    /* p */
32031
798
    if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
32032
3
        ERROR_OUT(BUFFER_ERROR, exit_gdpk);
32033
0
    }
32034
32035
795
    ato16(input + args->idx, &length);
32036
795
    args->idx += OPAQUE16_LEN;
32037
32038
795
    if ((args->idx - args->begin) + length > size) {
32039
43
        ERROR_OUT(BUFFER_ERROR, exit_gdpk);
32040
0
    }
32041
32042
752
    if (length < ssl->options.minDhKeySz) {
32043
4
        WOLFSSL_MSG("Server using a DH key that is too small");
32044
4
        SendAlert(ssl, alert_fatal, handshake_failure);
32045
4
        ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
32046
0
    }
32047
748
    if (length > ssl->options.maxDhKeySz) {
32048
17
        WOLFSSL_MSG("Server using a DH key that is too big");
32049
17
        SendAlert(ssl, alert_fatal, handshake_failure);
32050
17
        ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
32051
0
    }
32052
32053
731
    ssl->buffers.serverDH_P.buffer =
32054
731
        (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
32055
731
    if (ssl->buffers.serverDH_P.buffer) {
32056
725
        ssl->buffers.serverDH_P.length = length;
32057
725
    }
32058
6
    else {
32059
6
        ERROR_OUT(MEMORY_ERROR, exit_gdpk);
32060
0
    }
32061
32062
725
    XMEMCPY(ssl->buffers.serverDH_P.buffer, input + args->idx,
32063
725
                                                        length);
32064
725
    args->idx += length;
32065
32066
725
    ssl->options.dhKeySz = length;
32067
32068
    /* g */
32069
725
    if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
32070
4
        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
32071
4
                DYNAMIC_TYPE_PUBLIC_KEY);
32072
4
        ssl->buffers.serverDH_P.buffer = NULL;
32073
4
        ERROR_OUT(BUFFER_ERROR, exit_gdpk);
32074
0
    }
32075
32076
721
    ato16(input + args->idx, &length);
32077
721
    args->idx += OPAQUE16_LEN;
32078
32079
721
    if ((args->idx - args->begin) + length > size) {
32080
30
        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
32081
30
                DYNAMIC_TYPE_PUBLIC_KEY);
32082
30
        ssl->buffers.serverDH_P.buffer = NULL;
32083
30
        ERROR_OUT(BUFFER_ERROR, exit_gdpk);
32084
0
    }
32085
32086
691
    if (length > ssl->options.maxDhKeySz) {
32087
9
        WOLFSSL_MSG("Server using a DH key generator that is too big");
32088
9
        SendAlert(ssl, alert_fatal, handshake_failure);
32089
9
        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
32090
9
                DYNAMIC_TYPE_PUBLIC_KEY);
32091
9
        ssl->buffers.serverDH_P.buffer = NULL;
32092
9
        ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
32093
0
    }
32094
32095
682
    ssl->buffers.serverDH_G.buffer =
32096
682
        (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
32097
682
    if (ssl->buffers.serverDH_G.buffer) {
32098
679
        ssl->buffers.serverDH_G.length = length;
32099
679
    }
32100
3
    else {
32101
3
        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
32102
3
                DYNAMIC_TYPE_PUBLIC_KEY);
32103
3
        ssl->buffers.serverDH_P.buffer = NULL;
32104
3
        ERROR_OUT(MEMORY_ERROR, exit_gdpk);
32105
0
    }
32106
32107
679
    XMEMCPY(ssl->buffers.serverDH_G.buffer, input + args->idx,
32108
679
                                                        length);
32109
679
    args->idx += length;
32110
32111
    /* pub */
32112
679
    if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
32113
4
        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
32114
4
                DYNAMIC_TYPE_PUBLIC_KEY);
32115
4
        ssl->buffers.serverDH_P.buffer = NULL;
32116
4
        XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
32117
4
                DYNAMIC_TYPE_PUBLIC_KEY);
32118
4
        ssl->buffers.serverDH_G.buffer = NULL;
32119
4
        ERROR_OUT(BUFFER_ERROR, exit_gdpk);
32120
0
    }
32121
32122
675
    ato16(input + args->idx, &length);
32123
675
    args->idx += OPAQUE16_LEN;
32124
32125
675
    if ((args->idx - args->begin) + length > size) {
32126
25
        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
32127
25
                DYNAMIC_TYPE_PUBLIC_KEY);
32128
25
        ssl->buffers.serverDH_P.buffer = NULL;
32129
25
        XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
32130
25
                DYNAMIC_TYPE_PUBLIC_KEY);
32131
25
        ssl->buffers.serverDH_G.buffer = NULL;
32132
25
        ERROR_OUT(BUFFER_ERROR, exit_gdpk);
32133
0
    }
32134
32135
650
    if (length > ssl->options.maxDhKeySz) {
32136
2
        WOLFSSL_MSG("Server using a public DH key that is too big");
32137
2
        SendAlert(ssl, alert_fatal, handshake_failure);
32138
2
        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
32139
2
                DYNAMIC_TYPE_PUBLIC_KEY);
32140
2
        ssl->buffers.serverDH_P.buffer = NULL;
32141
2
        XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
32142
2
                DYNAMIC_TYPE_PUBLIC_KEY);
32143
2
        ssl->buffers.serverDH_G.buffer = NULL;
32144
2
        ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
32145
0
    }
32146
32147
648
    ssl->buffers.serverDH_Pub.buffer =
32148
648
        (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
32149
648
    if (ssl->buffers.serverDH_Pub.buffer) {
32150
647
        ssl->buffers.serverDH_Pub.length = length;
32151
647
    }
32152
1
    else {
32153
1
        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
32154
1
                DYNAMIC_TYPE_PUBLIC_KEY);
32155
1
        ssl->buffers.serverDH_P.buffer = NULL;
32156
1
        XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
32157
1
                DYNAMIC_TYPE_PUBLIC_KEY);
32158
1
        ssl->buffers.serverDH_G.buffer = NULL;
32159
1
        ERROR_OUT(MEMORY_ERROR, exit_gdpk);
32160
0
    }
32161
32162
647
    XMEMCPY(ssl->buffers.serverDH_Pub.buffer, input + args->idx,
32163
647
                                                        length);
32164
647
    ssl->buffers.weOwnDH = 1;
32165
647
    args->idx += length;
32166
32167
647
#ifdef HAVE_FFDHE
32168
647
    switch (ssl->options.dhKeySz) {
32169
0
    #ifdef HAVE_FFDHE_2048
32170
64
        case 2048/8:
32171
64
            #ifdef HAVE_PUBLIC_FFDHE
32172
64
            params = wc_Dh_ffdhe2048_Get();
32173
64
            #endif
32174
64
            group = WOLFSSL_FFDHE_2048;
32175
64
            break;
32176
0
    #endif
32177
    #ifdef HAVE_FFDHE_3072
32178
        case 3072/8:
32179
            #ifdef HAVE_PUBLIC_FFDHE
32180
            params = wc_Dh_ffdhe3072_Get();
32181
            #endif
32182
            group = WOLFSSL_FFDHE_3072;
32183
            break;
32184
    #endif
32185
    #ifdef HAVE_FFDHE_4096
32186
        case 4096/8:
32187
            #ifdef HAVE_PUBLIC_FFDHE
32188
            params = wc_Dh_ffdhe4096_Get();
32189
            #endif
32190
            group = WOLFSSL_FFDHE_4096;
32191
            break;
32192
    #endif
32193
    #ifdef HAVE_FFDHE_6144
32194
        case 6144/8:
32195
            #ifdef HAVE_PUBLIC_FFDHE
32196
            params = wc_Dh_ffdhe6144_Get();
32197
            #endif
32198
            group = WOLFSSL_FFDHE_6144;
32199
            break;
32200
    #endif
32201
    #ifdef HAVE_FFDHE_8192
32202
        case 8192/8:
32203
            #ifdef HAVE_PUBLIC_FFDHE
32204
            params = wc_Dh_ffdhe8192_Get();
32205
            #endif
32206
            group = WOLFSSL_FFDHE_8192;
32207
            break;
32208
    #endif
32209
583
        default:
32210
583
            break;
32211
647
    }
32212
32213
32214
647
#ifdef HAVE_PUBLIC_FFDHE
32215
647
    if (params == NULL || params->g_len != ssl->buffers.serverDH_G.length ||
32216
647
            (XMEMCMP(ssl->buffers.serverDH_G.buffer, params->g,
32217
57
                    params->g_len) != 0) ||
32218
647
            (XMEMCMP(ssl->buffers.serverDH_P.buffer, params->p,
32219
51
                    params->p_len) != 0))
32220
#else
32221
    if (!wc_DhCmpNamedKey(group, 1,
32222
            ssl->buffers.serverDH_P.buffer, ssl->buffers.serverDH_P.length,
32223
            ssl->buffers.serverDH_G.buffer, ssl->buffers.serverDH_G.length,
32224
            NULL, 0))
32225
#endif
32226
646
    {
32227
646
        WOLFSSL_MSG("Server not using FFDHE parameters");
32228
    #ifdef WOLFSSL_REQUIRE_FFDHE
32229
        SendAlert(ssl, alert_fatal, handshake_failure);
32230
        ERROR_OUT(DH_PARAMS_NOT_FFDHE_E, exit_gdpk);
32231
    #endif
32232
646
    }
32233
1
    else {
32234
1
        ssl->namedGroup = group;
32235
1
    #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
32236
1
        !defined(HAVE_SELFTEST)
32237
1
        ssl->options.dhDoKeyTest = 0;
32238
1
    #endif
32239
1
    }
32240
647
#endif /* HAVE_FFDHE */
32241
32242
798
exit_gdpk:
32243
798
    if (ret != 0) {
32244
151
        WOLFSSL_ERROR_VERBOSE(ret);
32245
151
    }
32246
798
    return ret;
32247
647
}
32248
#endif
32249
32250
/* handle processing of server_key_exchange (12) */
32251
static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input,
32252
                               word32* inOutIdx, word32 size)
32253
{
32254
    int ret = 0;
32255
#ifdef WOLFSSL_ASYNC_CRYPT
32256
    DskeArgs* args = NULL;
32257
    WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
32258
#else
32259
    DskeArgs  args[1];
32260
#endif
32261
32262
    (void)input;
32263
    (void)size;
32264
32265
    WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
32266
    WOLFSSL_ENTER("DoServerKeyExchange");
32267
32268
#ifdef WOLFSSL_ASYNC_CRYPT
32269
    if (ssl->async == NULL) {
32270
        ssl->async = (struct WOLFSSL_ASYNC*)
32271
                XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
32272
                        DYNAMIC_TYPE_ASYNC);
32273
        if (ssl->async == NULL)
32274
            ERROR_OUT(MEMORY_E, exit_dske);
32275
    }
32276
    args = (DskeArgs*)ssl->async->args;
32277
32278
    ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
32279
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
32280
        /* Check for error */
32281
        if (ret < 0)
32282
            goto exit_dske;
32283
    }
32284
    else
32285
#endif
32286
    {
32287
        /* Reset state */
32288
        ret = 0;
32289
        ssl->options.asyncState = TLS_ASYNC_BEGIN;
32290
        XMEMSET(args, 0, sizeof(DskeArgs));
32291
        args->idx = *inOutIdx;
32292
        args->begin = *inOutIdx;
32293
        ssl->options.peerSigAlgo = ssl->specs.sig_algo;
32294
        ssl->options.peerHashAlgo = sha_mac;
32295
    #ifdef WOLFSSL_ASYNC_CRYPT
32296
        ssl->async->freeArgs = FreeDskeArgs;
32297
    #endif
32298
    }
32299
32300
    switch(ssl->options.asyncState)
32301
    {
32302
        case TLS_ASYNC_BEGIN:
32303
        {
32304
        #ifdef WOLFSSL_CALLBACKS
32305
            if (ssl->hsInfoOn)
32306
                AddPacketName(ssl, "ServerKeyExchange");
32307
            if (ssl->toInfoOn)
32308
                AddLateName("ServerKeyExchange", &ssl->timeoutInfo);
32309
        #endif
32310
32311
            switch(ssl->specs.kea)
32312
            {
32313
            #ifndef NO_PSK
32314
                case psk_kea:
32315
                {
32316
                    int srvHintLen;
32317
                    word16 length;
32318
32319
                    if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
32320
                        ERROR_OUT(BUFFER_ERROR, exit_dske);
32321
                    }
32322
32323
                    ato16(input + args->idx, &length);
32324
                    args->idx += OPAQUE16_LEN;
32325
32326
                    if ((args->idx - args->begin) + length > size) {
32327
                        ERROR_OUT(BUFFER_ERROR, exit_dske);
32328
                    }
32329
32330
                    /* get PSK server hint from the wire */
32331
                    srvHintLen = (int)min(length, MAX_PSK_ID_LEN);
32332
                    XMEMCPY(ssl->arrays->server_hint, input + args->idx,
32333
                            (size_t)(srvHintLen));
32334
                    ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
32335
                    args->idx += length;
32336
                    break;
32337
                }
32338
            #endif /* !NO_PSK */
32339
            #ifndef NO_DH
32340
                case diffie_hellman_kea:
32341
                {
32342
                    ret = GetDhPublicKey(ssl, input, size, args);
32343
                    if (ret != 0)
32344
                        goto exit_dske;
32345
                    break;
32346
                }
32347
            #endif /* !NO_DH */
32348
            #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
32349
                                                          defined(HAVE_CURVE448)
32350
                case ecc_diffie_hellman_kea:
32351
                {
32352
                    byte b;
32353
                #ifdef HAVE_ECC
32354
                    int curveId;
32355
                #endif
32356
                    int curveOid;
32357
                    word16 length;
32358
32359
                    if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
32360
                                                        OPAQUE8_LEN > size) {
32361
                        ERROR_OUT(BUFFER_ERROR, exit_dske);
32362
                    }
32363
32364
                    b = input[args->idx++];
32365
                    if (b != named_curve) {
32366
                        ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
32367
                    }
32368
32369
                    args->idx += 1;   /* curve type, eat leading 0 */
32370
                    b = input[args->idx++];
32371
                    if ((curveOid = CheckCurveId(b)) < 0) {
32372
                        ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
32373
                    }
32374
                    ssl->ecdhCurveOID = (word32)curveOid;
32375
                #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
32376
                    ssl->namedGroup = 0;
32377
                #endif
32378
32379
                    length = input[args->idx++];
32380
                    if ((args->idx - args->begin) + length > size) {
32381
                        ERROR_OUT(BUFFER_ERROR, exit_dske);
32382
                    }
32383
32384
                #ifdef HAVE_CURVE25519
32385
                    if (ssl->ecdhCurveOID == ECC_X25519_OID) {
32386
                        if (ssl->peerX25519Key == NULL) {
32387
                            ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
32388
                                           (void**)&ssl->peerX25519Key);
32389
                            if (ret != 0) {
32390
                                goto exit_dske;
32391
                            }
32392
                        } else if (ssl->peerX25519KeyPresent) {
32393
                            ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
32394
                                           ssl->peerX25519Key);
32395
                            ssl->peerX25519KeyPresent = 0;
32396
                            if (ret != 0) {
32397
                                goto exit_dske;
32398
                            }
32399
                        }
32400
32401
                        if ((ret = wc_curve25519_check_public(
32402
                                input + args->idx, length,
32403
                                EC25519_LITTLE_ENDIAN)) != 0) {
32404
                        #ifdef WOLFSSL_EXTRA_ALERTS
32405
                            if (ret == WC_NO_ERR_TRACE(BUFFER_E))
32406
                                SendAlert(ssl, alert_fatal, decode_error);
32407
                            else if (ret == WC_NO_ERR_TRACE(ECC_OUT_OF_RANGE_E))
32408
                                SendAlert(ssl, alert_fatal, bad_record_mac);
32409
                            else {
32410
                                SendAlert(ssl, alert_fatal, illegal_parameter);
32411
                            }
32412
                        #endif
32413
                            ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
32414
                        }
32415
32416
                        if (wc_curve25519_import_public_ex(input + args->idx,
32417
                                length, ssl->peerX25519Key,
32418
                                EC25519_LITTLE_ENDIAN) != 0) {
32419
                            ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
32420
                        }
32421
32422
                        args->idx += length;
32423
                        ssl->peerX25519KeyPresent = 1;
32424
                        break;
32425
                    }
32426
                #endif
32427
                #ifdef HAVE_CURVE448
32428
                    if (ssl->ecdhCurveOID == ECC_X448_OID) {
32429
                        if (ssl->peerX448Key == NULL) {
32430
                            ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
32431
                                           (void**)&ssl->peerX448Key);
32432
                            if (ret != 0) {
32433
                                goto exit_dske;
32434
                            }
32435
                        } else if (ssl->peerX448KeyPresent) {
32436
                            ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
32437
                                           ssl->peerX448Key);
32438
                            ssl->peerX448KeyPresent = 0;
32439
                            if (ret != 0) {
32440
                                goto exit_dske;
32441
                            }
32442
                        }
32443
32444
                        if ((ret = wc_curve448_check_public(
32445
                                input + args->idx, length,
32446
                                EC448_LITTLE_ENDIAN)) != 0) {
32447
                        #ifdef WOLFSSL_EXTRA_ALERTS
32448
                            if (ret == WC_NO_ERR_TRACE(BUFFER_E))
32449
                                SendAlert(ssl, alert_fatal, decode_error);
32450
                            else if (ret == WC_NO_ERR_TRACE(ECC_OUT_OF_RANGE_E))
32451
                                SendAlert(ssl, alert_fatal, bad_record_mac);
32452
                            else {
32453
                                SendAlert(ssl, alert_fatal, illegal_parameter);
32454
                            }
32455
                        #endif
32456
                            ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
32457
                        }
32458
32459
                        if (wc_curve448_import_public_ex(input + args->idx,
32460
                                length, ssl->peerX448Key,
32461
                                EC448_LITTLE_ENDIAN) != 0) {
32462
                            ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
32463
                        }
32464
32465
                        args->idx += length;
32466
                        ssl->peerX448KeyPresent = 1;
32467
                        break;
32468
                    }
32469
                #endif
32470
                #ifdef HAVE_ECC
32471
                    if (ssl->peerEccKey == NULL) {
32472
                        ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
32473
                                       (void**)&ssl->peerEccKey);
32474
                        if (ret != 0) {
32475
                            goto exit_dske;
32476
                        }
32477
                    } else if (ssl->peerEccKeyPresent) {
32478
                        ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
32479
                        ssl->peerEccKeyPresent = 0;
32480
                        if (ret != 0) {
32481
                            goto exit_dske;
32482
                        }
32483
                    }
32484
32485
                    curveId = wc_ecc_get_oid((word32)curveOid, NULL, NULL);
32486
                    if (wc_ecc_import_x963_ex(input + args->idx, length,
32487
                                        ssl->peerEccKey, curveId) != 0) {
32488
                    #ifdef WOLFSSL_EXTRA_ALERTS
32489
                        SendAlert(ssl, alert_fatal, illegal_parameter);
32490
                    #endif
32491
                        ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
32492
                    }
32493
32494
                    args->idx += length;
32495
                    ssl->peerEccKeyPresent = 1;
32496
                #endif
32497
                    break;
32498
                }
32499
            #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
32500
            #if !defined(NO_DH) && !defined(NO_PSK)
32501
                case dhe_psk_kea:
32502
                {
32503
                    int srvHintLen;
32504
                    word16 length;
32505
32506
                    if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
32507
                        ERROR_OUT(BUFFER_ERROR, exit_dske);
32508
                    }
32509
32510
                    ato16(input + args->idx, &length);
32511
                    args->idx += OPAQUE16_LEN;
32512
32513
                    if ((args->idx - args->begin) + length > size) {
32514
                        ERROR_OUT(BUFFER_ERROR, exit_dske);
32515
                    }
32516
32517
                    /* get PSK server hint from the wire */
32518
                    srvHintLen = (int)min(length, MAX_PSK_ID_LEN);
32519
                    XMEMCPY(ssl->arrays->server_hint, input + args->idx,
32520
                                                                srvHintLen);
32521
                    ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
32522
                    args->idx += length;
32523
32524
                    ret = GetDhPublicKey(ssl, input, size, args);
32525
                    if (ret != 0)
32526
                        goto exit_dske;
32527
                    break;
32528
                }
32529
            #endif /* !NO_DH && !NO_PSK */
32530
            #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
32531
                                     defined(HAVE_CURVE448)) && !defined(NO_PSK)
32532
                case ecdhe_psk_kea:
32533
                {
32534
                    byte b;
32535
                    int curveOid, curveId;
32536
                    int srvHintLen;
32537
                    word16 length;
32538
32539
                    if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
32540
                        ERROR_OUT(BUFFER_ERROR, exit_dske);
32541
                    }
32542
32543
                    ato16(input + args->idx, &length);
32544
                    args->idx += OPAQUE16_LEN;
32545
32546
                    if ((args->idx - args->begin) + length > size) {
32547
                        ERROR_OUT(BUFFER_ERROR, exit_dske);
32548
                    }
32549
32550
                    /* get PSK server hint from the wire */
32551
                    srvHintLen = (int)min(length, MAX_PSK_ID_LEN);
32552
                    XMEMCPY(ssl->arrays->server_hint, input + args->idx,
32553
                                                    (size_t)(srvHintLen));
32554
                    ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
32555
32556
                    args->idx += length;
32557
32558
                    if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
32559
                        OPAQUE8_LEN > size) {
32560
                        ERROR_OUT(BUFFER_ERROR, exit_dske);
32561
                    }
32562
32563
                    /* Check curve name and ID */
32564
                    b = input[args->idx++];
32565
                    if (b != named_curve) {
32566
                        ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
32567
                    }
32568
32569
                    args->idx += 1;   /* curve type, eat leading 0 */
32570
                    b = input[args->idx++];
32571
                    if ((curveOid = CheckCurveId(b)) < 0) {
32572
                        ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
32573
                    }
32574
                    ssl->ecdhCurveOID = (word32)curveOid;
32575
32576
                    length = input[args->idx++];
32577
                    if ((args->idx - args->begin) + length > size) {
32578
                        ERROR_OUT(BUFFER_ERROR, exit_dske);
32579
                    }
32580
32581
                #ifdef HAVE_CURVE25519
32582
                    if (ssl->ecdhCurveOID == ECC_X25519_OID) {
32583
                        if (ssl->peerX25519Key == NULL) {
32584
                            ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
32585
                                           (void**)&ssl->peerX25519Key);
32586
                            if (ret != 0) {
32587
                                goto exit_dske;
32588
                            }
32589
                        } else if (ssl->peerEccKeyPresent) {
32590
                            ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
32591
                                           ssl->peerX25519Key);
32592
                            ssl->peerX25519KeyPresent = 0;
32593
                            if (ret != 0) {
32594
                                goto exit_dske;
32595
                            }
32596
                        }
32597
32598
                        if ((ret = wc_curve25519_check_public(
32599
                                input + args->idx, length,
32600
                                EC25519_LITTLE_ENDIAN)) != 0) {
32601
                        #ifdef WOLFSSL_EXTRA_ALERTS
32602
                            if (ret == WC_NO_ERR_TRACE(BUFFER_E))
32603
                                SendAlert(ssl, alert_fatal, decode_error);
32604
                            else if (ret == WC_NO_ERR_TRACE(ECC_OUT_OF_RANGE_E))
32605
                                SendAlert(ssl, alert_fatal, bad_record_mac);
32606
                            else {
32607
                                SendAlert(ssl, alert_fatal, illegal_parameter);
32608
                            }
32609
                        #endif
32610
                            ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
32611
                        }
32612
32613
                        if (wc_curve25519_import_public_ex(input + args->idx,
32614
                                length, ssl->peerX25519Key,
32615
                                EC25519_LITTLE_ENDIAN) != 0) {
32616
                            ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
32617
                        }
32618
32619
                        args->idx += length;
32620
                        ssl->peerX25519KeyPresent = 1;
32621
                        break;
32622
                    }
32623
                #endif
32624
                #ifdef HAVE_CURVE448
32625
                    if (ssl->ecdhCurveOID == ECC_X448_OID) {
32626
                        if (ssl->peerX448Key == NULL) {
32627
                            ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
32628
                                           (void**)&ssl->peerX448Key);
32629
                            if (ret != 0) {
32630
                                goto exit_dske;
32631
                            }
32632
                        } else if (ssl->peerEccKeyPresent) {
32633
                            ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
32634
                                           ssl->peerX448Key);
32635
                            ssl->peerX448KeyPresent = 0;
32636
                            if (ret != 0) {
32637
                                goto exit_dske;
32638
                            }
32639
                        }
32640
32641
                        if ((ret = wc_curve448_check_public(
32642
                                input + args->idx, length,
32643
                                EC448_LITTLE_ENDIAN)) != 0) {
32644
                        #ifdef WOLFSSL_EXTRA_ALERTS
32645
                            if (ret == WC_NO_ERR_TRACE(BUFFER_E))
32646
                                SendAlert(ssl, alert_fatal, decode_error);
32647
                            else if (ret == WC_NO_ERR_TRACE(ECC_OUT_OF_RANGE_E))
32648
                                SendAlert(ssl, alert_fatal, bad_record_mac);
32649
                            else {
32650
                                SendAlert(ssl, alert_fatal, illegal_parameter);
32651
                            }
32652
                        #endif
32653
                            ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
32654
                        }
32655
32656
                        if (wc_curve448_import_public_ex(input + args->idx,
32657
                                length, ssl->peerX448Key,
32658
                                EC448_LITTLE_ENDIAN) != 0) {
32659
                            ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
32660
                        }
32661
32662
                        args->idx += length;
32663
                        ssl->peerX448KeyPresent = 1;
32664
                        break;
32665
                    }
32666
                #endif
32667
32668
                    if (ssl->peerEccKey == NULL) {
32669
                        ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
32670
                                 (void**)&ssl->peerEccKey);
32671
                        if (ret != 0) {
32672
                            goto exit_dske;
32673
                        }
32674
                    } else if (ssl->peerEccKeyPresent) {
32675
                        ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
32676
                        ssl->peerEccKeyPresent = 0;
32677
                        if (ret != 0) {
32678
                            goto exit_dske;
32679
                        }
32680
                    }
32681
32682
                    curveId = wc_ecc_get_oid((word32)curveOid, NULL, NULL);
32683
                    if (wc_ecc_import_x963_ex(input + args->idx, length,
32684
                        ssl->peerEccKey, curveId) != 0) {
32685
                        ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
32686
                    }
32687
32688
                    args->idx += length;
32689
                    ssl->peerEccKeyPresent = 1;
32690
                    break;
32691
                }
32692
            #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
32693
                default:
32694
                    ret = BAD_KEA_TYPE_E;
32695
            } /* switch(ssl->specs.kea) */
32696
32697
            /* Check for error */
32698
            if (ret != 0) {
32699
                goto exit_dske;
32700
            }
32701
32702
            /* Advance state and proceed */
32703
            ssl->options.asyncState = TLS_ASYNC_BUILD;
32704
        } /* case TLS_ASYNC_BEGIN */
32705
        FALL_THROUGH;
32706
32707
        case TLS_ASYNC_BUILD:
32708
        {
32709
            switch(ssl->specs.kea)
32710
            {
32711
                case psk_kea:
32712
                case dhe_psk_kea:
32713
                case ecdhe_psk_kea:
32714
                {
32715
                    /* Nothing to do in this sub-state */
32716
                    break;
32717
                }
32718
32719
                case diffie_hellman_kea:
32720
                case ecc_diffie_hellman_kea:
32721
                {
32722
            #if defined(NO_DH) && !defined(HAVE_ECC) && \
32723
                            !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
32724
                    ERROR_OUT(NOT_COMPILED_IN, exit_dske);
32725
            #else
32726
                    enum wc_HashType hashType;
32727
                    word32 verifySz;
32728
                    byte sigAlgo;
32729
32730
                    if (ssl->options.usingAnon_cipher) {
32731
                        break;
32732
                    }
32733
32734
                    verifySz = (args->idx - args->begin);
32735
                    if (verifySz > MAX_DH_SZ) {
32736
                        ERROR_OUT(BUFFER_ERROR, exit_dske);
32737
                    }
32738
32739
                    if (IsAtLeastTLSv1_2(ssl)) {
32740
                        if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN >
32741
                                                                        size) {
32742
                            ERROR_OUT(BUFFER_ERROR, exit_dske);
32743
                        }
32744
32745
                        /* Check if hashSigAlgo in Server Key Exchange is supported
32746
                         * in our ssl->suites or ssl->ctx->suites. */
32747
                        if (!SupportedHashSigAlgo(ssl, &input[args->idx])) {
32748
                        #ifdef WOLFSSL_EXTRA_ALERTS
32749
                            SendAlert(ssl, alert_fatal, handshake_failure);
32750
                        #endif
32751
                            ERROR_OUT(MATCH_SUITE_ERROR, exit_dske);
32752
                        }
32753
32754
                        DecodeSigAlg(&input[args->idx], &ssl->options.peerHashAlgo,
32755
                                     &sigAlgo);
32756
                    #ifndef NO_RSA
32757
                        if (sigAlgo == rsa_pss_sa_algo &&
32758
                                                 ssl->options.peerSigAlgo == rsa_sa_algo) {
32759
                            ssl->options.peerSigAlgo = sigAlgo;
32760
                        }
32761
                        else
32762
                    #endif
32763
                    #ifdef WC_RSA_PSS
32764
                        if (sigAlgo == rsa_pss_pss_algo &&
32765
                                ssl->options.peerSigAlgo == rsa_sa_algo) {
32766
                            ssl->options.peerSigAlgo = sigAlgo;
32767
                        }
32768
                        else
32769
                    #endif
32770
                    #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
32771
                        if (sigAlgo == sm2_sa_algo &&
32772
                                             ssl->options.peerSigAlgo == ecc_dsa_sa_algo) {
32773
                            ssl->options.peerSigAlgo = sigAlgo;
32774
                        }
32775
                        else
32776
                    #endif
32777
                    #ifdef HAVE_ED25519
32778
                        if (sigAlgo == ed25519_sa_algo &&
32779
                                             ssl->options.peerSigAlgo == ecc_dsa_sa_algo) {
32780
                            ssl->options.peerSigAlgo = sigAlgo;
32781
                        }
32782
                        else
32783
                    #endif
32784
                    #ifdef HAVE_ED448
32785
                        if (sigAlgo == ed448_sa_algo &&
32786
                                             ssl->options.peerSigAlgo == ecc_dsa_sa_algo) {
32787
                            ssl->options.peerSigAlgo = sigAlgo;
32788
                        }
32789
                        else
32790
                    #endif
32791
                        /* Signature algorithm from message must match signature
32792
                         * algorithm in cipher suite. */
32793
                        if (sigAlgo != ssl->options.peerSigAlgo) {
32794
                            ERROR_OUT(ALGO_ID_E, exit_dske);
32795
                        }
32796
                        args->idx += 2;
32797
                        hashType = HashAlgoToType(ssl->options.peerHashAlgo);
32798
                        if (hashType == WC_HASH_TYPE_NONE) {
32799
                            ERROR_OUT(ALGO_ID_E, exit_dske);
32800
                        }
32801
                    } else {
32802
                        /* only using sha and md5 for rsa */
32803
                        #ifndef NO_OLD_TLS
32804
                            hashType = WC_HASH_TYPE_SHA;
32805
                            if (ssl->options.peerSigAlgo == rsa_sa_algo) {
32806
                                hashType = WC_HASH_TYPE_MD5_SHA;
32807
                            }
32808
                        #else
32809
                            ERROR_OUT(ALGO_ID_E, exit_dske);
32810
                        #endif
32811
                    }
32812
32813
                    /* signature */
32814
                    if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
32815
                        ERROR_OUT(BUFFER_ERROR, exit_dske);
32816
                    }
32817
32818
                    ato16(input + args->idx, &args->verifySigSz);
32819
                    args->idx += OPAQUE16_LEN;
32820
32821
                    if ((args->idx - args->begin) + args->verifySigSz > size) {
32822
                        ERROR_OUT(BUFFER_ERROR, exit_dske);
32823
                    }
32824
32825
                    ret = HashSkeData(ssl, hashType, input + args->begin,
32826
                        verifySz, ssl->options.peerSigAlgo);
32827
                    if (ret != 0) {
32828
                        goto exit_dske;
32829
                    }
32830
32831
                    switch (ssl->options.peerSigAlgo)
32832
                    {
32833
                    #ifndef NO_RSA
32834
                    #ifdef WC_RSA_PSS
32835
                        case rsa_pss_sa_algo:
32836
                        case rsa_pss_pss_algo:
32837
                    #endif
32838
                        case rsa_sa_algo:
32839
                        {
32840
                            if (ssl->peerRsaKey == NULL ||
32841
                                                    !ssl->peerRsaKeyPresent) {
32842
                                ERROR_OUT(NO_PEER_KEY, exit_dske);
32843
                            }
32844
                            break;
32845
                        }
32846
                    #endif /* !NO_RSA */
32847
                    #ifdef HAVE_ECC
32848
                    #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
32849
                        case sm2_sa_algo:
32850
                    #endif
32851
                        case ecc_dsa_sa_algo:
32852
                        {
32853
                            if (!ssl->peerEccDsaKeyPresent) {
32854
                                ERROR_OUT(NO_PEER_KEY, exit_dske);
32855
                            }
32856
                            break;
32857
                        }
32858
                    #endif /* HAVE_ECC */
32859
                    #if defined(HAVE_ED25519)
32860
                        case ed25519_sa_algo:
32861
                        {
32862
                            if (!ssl->peerEd25519KeyPresent) {
32863
                                ERROR_OUT(NO_PEER_KEY, exit_dske);
32864
                            }
32865
                            break;
32866
                        }
32867
                    #endif /* HAVE_ED25519 */
32868
                    #if defined(HAVE_ED448)
32869
                        case ed448_sa_algo:
32870
                        {
32871
                            if (!ssl->peerEd448KeyPresent) {
32872
                                ERROR_OUT(NO_PEER_KEY, exit_dske);
32873
                            }
32874
                            break;
32875
                        }
32876
                    #endif /* HAVE_ED448 */
32877
32878
                    default:
32879
                        ret = ALGO_ID_E;
32880
                    } /* switch (ssl->options.peerSigAlgo) */
32881
32882
            #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
32883
                    break;
32884
                }
32885
                default:
32886
                    ret = BAD_KEA_TYPE_E;
32887
            } /* switch(ssl->specs.kea) */
32888
32889
            /* Check for error */
32890
            if (ret != 0) {
32891
                goto exit_dske;
32892
            }
32893
32894
            /* Advance state and proceed */
32895
            ssl->options.asyncState = TLS_ASYNC_DO;
32896
        } /* case TLS_ASYNC_BUILD */
32897
        FALL_THROUGH;
32898
32899
        case TLS_ASYNC_DO:
32900
        {
32901
            switch(ssl->specs.kea)
32902
            {
32903
                case psk_kea:
32904
                case dhe_psk_kea:
32905
                case ecdhe_psk_kea:
32906
                {
32907
                    /* Nothing to do in this sub-state */
32908
                    break;
32909
                }
32910
32911
                case diffie_hellman_kea:
32912
                case ecc_diffie_hellman_kea:
32913
                {
32914
            #if defined(NO_DH) && !defined(HAVE_ECC) && \
32915
                            !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
32916
                    ERROR_OUT(NOT_COMPILED_IN, exit_dske);
32917
            #else
32918
                    if (ssl->options.usingAnon_cipher) {
32919
                        break;
32920
                    }
32921
32922
                    if (args->verifySig == NULL) {
32923
                        args->verifySig = (byte*)XMALLOC(args->verifySigSz,
32924
                                            ssl->heap, DYNAMIC_TYPE_SIGNATURE);
32925
                        if (args->verifySig == NULL) {
32926
                            ERROR_OUT(MEMORY_E, exit_dske);
32927
                        }
32928
                        XMEMCPY(args->verifySig, input + args->idx,
32929
                                                            args->verifySigSz);
32930
                    }
32931
32932
                    switch (ssl->options.peerSigAlgo)
32933
                    {
32934
                    #ifndef NO_RSA
32935
                    #ifdef WC_RSA_PSS
32936
                        case rsa_pss_sa_algo:
32937
                        case rsa_pss_pss_algo:
32938
                    #endif
32939
                        case rsa_sa_algo:
32940
                        {
32941
                            ret = RsaVerify(ssl,
32942
                                args->verifySig, args->verifySigSz,
32943
                                &args->output,
32944
                                ssl->options.peerSigAlgo, ssl->options.peerHashAlgo,
32945
                                ssl->peerRsaKey,
32946
                            #ifdef HAVE_PK_CALLBACKS
32947
                                &ssl->buffers.peerRsaKey
32948
                            #else
32949
                                NULL
32950
                            #endif
32951
                            );
32952
32953
                            if (ret >= 0) {
32954
                                args->sigSz = (word16)ret;
32955
                            #ifdef WC_RSA_PSS
32956
                                args->bits = mp_count_bits(&ssl->peerRsaKey->n);
32957
                            #endif
32958
                                ret = 0;
32959
                            }
32960
                        #ifdef WOLFSSL_ASYNC_CRYPT
32961
                            if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
32962
                        #endif
32963
                            {
32964
                                /* peerRsaKey */
32965
                                FreeKey(ssl, DYNAMIC_TYPE_RSA,
32966
                                                      (void**)&ssl->peerRsaKey);
32967
                                ssl->peerRsaKeyPresent = 0;
32968
                            }
32969
                            break;
32970
                        }
32971
                    #endif /* !NO_RSA */
32972
                    #ifdef HAVE_ECC
32973
                    #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
32974
                        case sm2_sa_algo:
32975
                    #endif
32976
                        case ecc_dsa_sa_algo:
32977
                        {
32978
                            ret = NOT_COMPILED_IN;
32979
                        #ifdef HAVE_PK_CALLBACKS
32980
                            if (ssl->ctx && ssl->ctx->ProcessServerSigKexCb) {
32981
                                ret = ssl->ctx->ProcessServerSigKexCb(ssl,
32982
                                    ssl->options.peerSigAlgo,
32983
                                    args->verifySig, args->verifySigSz,
32984
                                    ssl->buffers.sig.buffer, SEED_LEN,
32985
                                    &ssl->buffers.sig.buffer[SEED_LEN],
32986
                                    (ssl->buffers.sig.length - SEED_LEN));
32987
                            }
32988
                        #endif /* HAVE_PK_CALLBACKS */
32989
                            if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
32990
                            #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
32991
                                if (ssl->options.peerSigAlgo == sm2_sa_algo) {
32992
                                    ret = Sm2wSm3Verify(ssl,
32993
                                        TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ,
32994
                                        args->verifySig, args->verifySigSz,
32995
                                        ssl->buffers.sig.buffer,
32996
                                        ssl->buffers.sig.length,
32997
                                        ssl->peerEccDsaKey,
32998
                                    #ifdef HAVE_PK_CALLBACKS
32999
                                        &ssl->buffers.peerEccDsaKey
33000
                                    #else
33001
                                        NULL
33002
                                    #endif
33003
                                    );
33004
                                }
33005
                                else
33006
                            #endif
33007
                                {
33008
                                    ret = EccVerify(ssl,
33009
                                        args->verifySig, args->verifySigSz,
33010
                                        ssl->buffers.digest.buffer,
33011
                                        ssl->buffers.digest.length,
33012
                                        ssl->peerEccDsaKey,
33013
                                    #ifdef HAVE_PK_CALLBACKS
33014
                                        &ssl->buffers.peerEccDsaKey
33015
                                    #else
33016
                                        NULL
33017
                                    #endif
33018
                                    );
33019
                                }
33020
                            }
33021
33022
                        #ifdef WOLFSSL_ASYNC_CRYPT
33023
                            if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
33024
                        #endif
33025
                            {
33026
                                /* peerEccDsaKey */
33027
                                FreeKey(ssl, DYNAMIC_TYPE_ECC,
33028
                                                   (void**)&ssl->peerEccDsaKey);
33029
                                ssl->peerEccDsaKeyPresent = 0;
33030
                            }
33031
                            /* CLIENT: Data verified with cert's public key. */
33032
                            ssl->options.peerAuthGood =
33033
                                ssl->options.havePeerCert && (ret == 0);
33034
                            break;
33035
                        }
33036
                    #endif /* HAVE_ECC */
33037
                    #if defined(HAVE_ED25519)
33038
                        case ed25519_sa_algo:
33039
                        {
33040
                            ret = Ed25519Verify(ssl,
33041
                                args->verifySig, args->verifySigSz,
33042
                                ssl->buffers.sig.buffer,
33043
                                ssl->buffers.sig.length,
33044
                                ssl->peerEd25519Key,
33045
                            #ifdef HAVE_PK_CALLBACKS
33046
                                &ssl->buffers.peerEd25519Key
33047
                            #else
33048
                                NULL
33049
                            #endif
33050
                            );
33051
33052
                        #ifdef WOLFSSL_ASYNC_CRYPT
33053
                            if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
33054
                        #endif
33055
                            {
33056
                                /* peerEccDsaKey */
33057
                                FreeKey(ssl, DYNAMIC_TYPE_ED25519,
33058
                                                  (void**)&ssl->peerEd25519Key);
33059
                                ssl->peerEd25519KeyPresent = 0;
33060
                            }
33061
                            /* CLIENT: Data verified with cert's public key. */
33062
                            ssl->options.peerAuthGood =
33063
                                ssl->options.havePeerCert && (ret == 0);
33064
                            break;
33065
                        }
33066
                    #endif /* HAVE_ED25519 */
33067
                    #if defined(HAVE_ED448)
33068
                        case ed448_sa_algo:
33069
                        {
33070
                            ret = Ed448Verify(ssl,
33071
                                args->verifySig, args->verifySigSz,
33072
                                ssl->buffers.sig.buffer,
33073
                                ssl->buffers.sig.length,
33074
                                ssl->peerEd448Key,
33075
                            #ifdef HAVE_PK_CALLBACKS
33076
                                &ssl->buffers.peerEd448Key
33077
                            #else
33078
                                NULL
33079
                            #endif
33080
                            );
33081
33082
                        #ifdef WOLFSSL_ASYNC_CRYPT
33083
                            if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
33084
                        #endif
33085
                            {
33086
                                /* peerEccDsaKey */
33087
                                FreeKey(ssl, DYNAMIC_TYPE_ED448,
33088
                                                    (void**)&ssl->peerEd448Key);
33089
                                ssl->peerEd448KeyPresent = 0;
33090
                            }
33091
                            /* CLIENT: Data verified with cert's public key. */
33092
                            ssl->options.peerAuthGood =
33093
                                ssl->options.havePeerCert && (ret == 0);
33094
                            break;
33095
                        }
33096
                    #endif /* HAVE_ED448 */
33097
33098
                    default:
33099
                        ret = ALGO_ID_E;
33100
                    } /* switch (sigAlgo) */
33101
            #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
33102
                    break;
33103
                }
33104
                default:
33105
                    ret = BAD_KEA_TYPE_E;
33106
            } /* switch(ssl->specs.kea) */
33107
33108
            /* Check for error */
33109
            if (ret != 0) {
33110
                goto exit_dske;
33111
            }
33112
33113
            /* Advance state and proceed */
33114
            ssl->options.asyncState = TLS_ASYNC_VERIFY;
33115
        } /* case TLS_ASYNC_DO */
33116
        FALL_THROUGH;
33117
33118
        case TLS_ASYNC_VERIFY:
33119
        {
33120
            switch(ssl->specs.kea)
33121
            {
33122
                case psk_kea:
33123
                case dhe_psk_kea:
33124
                case ecdhe_psk_kea:
33125
                {
33126
                    /* Nothing to do in this sub-state */
33127
                    break;
33128
                }
33129
33130
                case diffie_hellman_kea:
33131
                case ecc_diffie_hellman_kea:
33132
                {
33133
            #if defined(NO_DH) && !defined(HAVE_ECC) && \
33134
                            !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
33135
                    ERROR_OUT(NOT_COMPILED_IN, exit_dske);
33136
            #else
33137
                    if (ssl->options.usingAnon_cipher) {
33138
                        break;
33139
                    }
33140
33141
                    /* increment index after verify is done */
33142
                    args->idx += args->verifySigSz;
33143
33144
                    switch(ssl->options.peerSigAlgo)
33145
                    {
33146
                    #ifndef NO_RSA
33147
                    #ifdef WC_RSA_PSS
33148
                        case rsa_pss_sa_algo:
33149
                        case rsa_pss_pss_algo:
33150
                        #ifdef HAVE_SELFTEST
33151
                            ret = wc_RsaPSS_CheckPadding(
33152
                                             ssl->buffers.digest.buffer,
33153
                                             ssl->buffers.digest.length,
33154
                                             args->output, args->sigSz,
33155
                                             HashAlgoToType(ssl->options.peerHashAlgo));
33156
                        #else
33157
                            ret = wc_RsaPSS_CheckPadding_ex(
33158
                                             ssl->buffers.digest.buffer,
33159
                                             ssl->buffers.digest.length,
33160
                                             args->output, args->sigSz,
33161
                                             HashAlgoToType(ssl->options.peerHashAlgo),
33162
                                             -1, args->bits);
33163
                        #endif
33164
                            if (ret != 0)
33165
                                goto exit_dske;
33166
                            /* CLIENT: Data verified with cert's public key. */
33167
                            ssl->options.peerAuthGood =
33168
                                ssl->options.havePeerCert;
33169
                            break;
33170
                    #endif
33171
                        case rsa_sa_algo:
33172
                        {
33173
                            #if (defined(WOLFSSL_RENESAS_FSPSM_TLS) && \
33174
                                defined(WOLFSSL_RENESAS_FSPSM_ECC)) || \
33175
                                defined(WOLFSSL_RENESAS_TSIP_TLS)
33176
                            /* already checked signature result by SCE */
33177
                            /* skip the sign checks below              */
33178
                            if (Renesas_cmn_usable(ssl, 0)) {
33179
                                break;
33180
                             }
33181
                            #endif
33182
                            if (IsAtLeastTLSv1_2(ssl)) {
33183
                            #ifdef WOLFSSL_SMALL_STACK
33184
                                byte*  encodedSig;
33185
                            #else
33186
                                byte   encodedSig[MAX_ENCODED_SIG_SZ];
33187
                            #endif
33188
                                word32 encSigSz;
33189
33190
                            #ifdef WOLFSSL_SMALL_STACK
33191
                                encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
33192
                                                ssl->heap, DYNAMIC_TYPE_SIGNATURE);
33193
                                if (encodedSig == NULL) {
33194
                                    ERROR_OUT(MEMORY_E, exit_dske);
33195
                                }
33196
                            #endif
33197
33198
                                encSigSz = wc_EncodeSignature(encodedSig,
33199
                                    ssl->buffers.digest.buffer,
33200
                                    ssl->buffers.digest.length,
33201
                                    TypeHash(ssl->options.peerHashAlgo));
33202
                                if (encSigSz != args->sigSz || !args->output ||
33203
                                    XMEMCMP(args->output, encodedSig,
33204
                                            min(encSigSz, MAX_ENCODED_SIG_SZ)) != 0) {
33205
                                    ret = VERIFY_SIGN_ERROR;
33206
                                }
33207
                            #ifdef WOLFSSL_SMALL_STACK
33208
                                XFREE(encodedSig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
33209
                            #endif
33210
                                if (ret != 0) {
33211
                                    goto exit_dske;
33212
                                }
33213
                            }
33214
                            else if (args->sigSz != FINISHED_SZ ||
33215
                                    !args->output ||
33216
                                    XMEMCMP(args->output,
33217
                                            ssl->buffers.digest.buffer,
33218
                                            FINISHED_SZ) != 0) {
33219
                                ERROR_OUT(VERIFY_SIGN_ERROR, exit_dske);
33220
                            }
33221
                            /* CLIENT: Data verified with cert's public key. */
33222
                            ssl->options.peerAuthGood =
33223
                                ssl->options.havePeerCert;
33224
                            break;
33225
                        }
33226
                    #endif /* !NO_RSA */
33227
                    #ifdef HAVE_ECC
33228
                        case ecc_dsa_sa_algo:
33229
                            /* Nothing to do in this algo */
33230
                            break;
33231
                    #endif /* HAVE_ECC */
33232
                    #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
33233
                        case sm2_sa_algo:
33234
                            /* Nothing to do in this algo */
33235
                            break;
33236
                    #endif /* WOLFSSL_SM2 && WOLFSSL_SM3 */
33237
                    #if defined(HAVE_ED25519)
33238
                        case ed25519_sa_algo:
33239
                            /* Nothing to do in this algo */
33240
                            break;
33241
                    #endif /* HAVE_ED25519 */
33242
                    #if defined(HAVE_ED448)
33243
                        case ed448_sa_algo:
33244
                            /* Nothing to do in this algo */
33245
                            break;
33246
                    #endif /* HAVE_ED448 */
33247
                        default:
33248
                            ret = ALGO_ID_E;
33249
                    } /* switch (sigAlgo) */
33250
            #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
33251
                    break;
33252
                }
33253
                default:
33254
                    ret = BAD_KEA_TYPE_E;
33255
            } /* switch(ssl->specs.kea) */
33256
33257
            /* Check for error */
33258
            if (ret != 0) {
33259
                goto exit_dske;
33260
            }
33261
33262
            /* Advance state and proceed */
33263
            ssl->options.asyncState = TLS_ASYNC_FINALIZE;
33264
        } /* case TLS_ASYNC_VERIFY */
33265
        FALL_THROUGH;
33266
33267
        case TLS_ASYNC_FINALIZE:
33268
        {
33269
            if (IsEncryptionOn(ssl, 0))
33270
                args->idx += ssl->keys.padSz;
33271
33272
            /* Advance state and proceed */
33273
            ssl->options.asyncState = TLS_ASYNC_END;
33274
        } /* case TLS_ASYNC_FINALIZE */
33275
        FALL_THROUGH;
33276
33277
        case TLS_ASYNC_END:
33278
        {
33279
            /* return index */
33280
            *inOutIdx = args->idx;
33281
33282
            ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
33283
            break;
33284
        }
33285
        default:
33286
            ret = INPUT_CASE_ERROR;
33287
    } /* switch(ssl->options.asyncState) */
33288
33289
exit_dske:
33290
33291
    WOLFSSL_LEAVE("DoServerKeyExchange", ret);
33292
    WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
33293
33294
#ifdef WOLFSSL_ASYNC_CRYPT
33295
    /* Handle async operation */
33296
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
33297
        /* Mark message as not received so it can process again */
33298
        ssl->msgsReceived.got_server_key_exchange = 0;
33299
33300
        return ret;
33301
    }
33302
    /* Cleanup async */
33303
    FreeAsyncCtx(ssl, 0);
33304
#else
33305
    FreeDskeArgs(ssl, args);
33306
#endif /* WOLFSSL_ASYNC_CRYPT */
33307
33308
    /* Final cleanup */
33309
    FreeKeyExchange(ssl);
33310
33311
    if (ret != 0) {
33312
        WOLFSSL_ERROR_VERBOSE(ret);
33313
    }
33314
    return ret;
33315
}
33316
33317
typedef struct SckeArgs {
33318
    byte*  output; /* not allocated */
33319
    byte*  encSecret;
33320
    byte*  input;
33321
    word32 encSz;
33322
    word32 length;
33323
    int    sendSz;
33324
    int    inputSz;
33325
} SckeArgs;
33326
33327
static void FreeSckeArgs(WOLFSSL* ssl, void* pArgs)
33328
1.20k
{
33329
1.20k
    SckeArgs* args = (SckeArgs*)pArgs;
33330
33331
1.20k
    (void)ssl;
33332
33333
1.20k
    XFREE(args->encSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
33334
1.20k
    args->encSecret = NULL;
33335
1.20k
    XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
33336
1.20k
    args->input = NULL;
33337
1.20k
}
33338
33339
/* handle generation client_key_exchange (16) */
33340
int SendClientKeyExchange(WOLFSSL* ssl)
33341
0
{
33342
0
    int ret = 0;
33343
0
#ifdef WOLFSSL_ASYNC_IO
33344
0
    SckeArgs* args = NULL;
33345
0
    WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
33346
#else
33347
    SckeArgs  args[1];
33348
#endif
33349
33350
0
    WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
33351
0
    WOLFSSL_ENTER("SendClientKeyExchange");
33352
33353
#ifdef OPENSSL_EXTRA
33354
    ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
33355
    ssl->cbmode = WOLFSSL_CB_MODE_WRITE;
33356
    if (ssl->CBIS != NULL)
33357
        ssl->CBIS(ssl, WOLFSSL_CB_CONNECT_LOOP, WOLFSSL_SUCCESS);
33358
#endif
33359
33360
0
#ifdef WOLFSSL_ASYNC_IO
33361
0
    if (ssl->async == NULL) {
33362
0
        ssl->async = (struct WOLFSSL_ASYNC*)
33363
0
                XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
33364
0
                        DYNAMIC_TYPE_ASYNC);
33365
0
        if (ssl->async == NULL)
33366
0
            ERROR_OUT(MEMORY_E, exit_scke);
33367
0
        XMEMSET(ssl->async, 0, sizeof(struct WOLFSSL_ASYNC));
33368
0
    }
33369
0
    args = (SckeArgs*)ssl->async->args;
33370
33371
#ifdef WOLFSSL_ASYNC_CRYPT
33372
    ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
33373
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
33374
        /* Check for error */
33375
        if (ret < 0)
33376
            goto exit_scke;
33377
    }
33378
    else
33379
#endif
33380
0
    if (ssl->options.buildingMsg) {
33381
        /* Continue building the message */
33382
0
    }
33383
0
    else
33384
0
#endif
33385
0
    {
33386
        /* Reset state */
33387
0
        ret = 0;
33388
0
        ssl->options.asyncState = TLS_ASYNC_BEGIN;
33389
0
        XMEMSET(args, 0, sizeof(SckeArgs));
33390
        /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
33391
         * is not advanced yet */
33392
0
        ssl->options.buildingMsg = 1;
33393
0
    #ifdef WOLFSSL_ASYNC_IO
33394
0
        ssl->async->freeArgs = FreeSckeArgs;
33395
0
    #endif
33396
0
    }
33397
33398
0
    switch(ssl->options.asyncState)
33399
0
    {
33400
0
        case TLS_ASYNC_BEGIN:
33401
0
        {
33402
0
            switch (ssl->specs.kea) {
33403
0
            #ifndef NO_RSA
33404
0
                case rsa_kea:
33405
0
                    if (ssl->peerRsaKey == NULL ||
33406
0
                        ssl->peerRsaKeyPresent == 0) {
33407
0
                        ERROR_OUT(NO_PEER_KEY, exit_scke);
33408
0
                    }
33409
0
                    break;
33410
0
            #endif
33411
0
            #ifndef NO_DH
33412
0
                case diffie_hellman_kea:
33413
0
                    if (ssl->buffers.serverDH_P.buffer == NULL ||
33414
0
                        ssl->buffers.serverDH_G.buffer == NULL ||
33415
0
                        ssl->buffers.serverDH_Pub.buffer == NULL) {
33416
0
                        ERROR_OUT(NO_PEER_KEY, exit_scke);
33417
0
                    }
33418
0
                    break;
33419
0
            #endif /* NO_DH */
33420
            #ifndef NO_PSK
33421
                case psk_kea:
33422
                    /* sanity check that PSK client callback has been set */
33423
                    if (ssl->options.client_psk_cb == NULL) {
33424
                        WOLFSSL_MSG("No client PSK callback set");
33425
                        ERROR_OUT(PSK_KEY_ERROR, exit_scke);
33426
                    }
33427
                    break;
33428
            #endif /* NO_PSK */
33429
            #if !defined(NO_DH) && !defined(NO_PSK)
33430
                case dhe_psk_kea:
33431
                    if (ssl->buffers.serverDH_P.buffer == NULL ||
33432
                        ssl->buffers.serverDH_G.buffer == NULL ||
33433
                        ssl->buffers.serverDH_Pub.buffer == NULL) {
33434
                        ERROR_OUT(NO_PEER_KEY, exit_scke);
33435
                    }
33436
33437
                    /* sanity check that PSK client callback has been set */
33438
                    if (ssl->options.client_psk_cb == NULL) {
33439
                        WOLFSSL_MSG("No client PSK callback set");
33440
                        ERROR_OUT(PSK_KEY_ERROR, exit_scke);
33441
                    }
33442
                    break;
33443
            #endif /* !NO_DH && !NO_PSK */
33444
            #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
33445
                                     defined(HAVE_CURVE448)) && !defined(NO_PSK)
33446
                case ecdhe_psk_kea:
33447
                    /* sanity check that PSK client callback has been set */
33448
                    if (ssl->options.client_psk_cb == NULL) {
33449
                        WOLFSSL_MSG("No client PSK callback set");
33450
                        ERROR_OUT(PSK_KEY_ERROR, exit_scke);
33451
                    }
33452
33453
                #ifdef HAVE_CURVE25519
33454
                    if (ssl->peerX25519KeyPresent) {
33455
                        /* Check client ECC public key */
33456
                        if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
33457
                            ERROR_OUT(NO_PEER_KEY, exit_scke);
33458
                        }
33459
33460
                    #ifdef HAVE_PK_CALLBACKS
33461
                        /* if callback then use it for shared secret */
33462
                        if (ssl->ctx->X25519SharedSecretCb != NULL) {
33463
                            break;
33464
                        }
33465
                    #endif
33466
33467
                        /* create private key */
33468
                        ssl->hsType = DYNAMIC_TYPE_CURVE25519;
33469
                        ret = AllocKey(ssl, (int)(ssl->hsType), &ssl->hsKey);
33470
                        if (ret != 0) {
33471
                            goto exit_scke;
33472
                        }
33473
33474
                        ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
33475
                                            ssl->peerX25519Key);
33476
                        break;
33477
                    }
33478
                #endif
33479
                #ifdef HAVE_CURVE448
33480
                    if (ssl->peerX448KeyPresent) {
33481
                        /* Check client ECC public key */
33482
                        if (!ssl->peerX448Key) {
33483
                            ERROR_OUT(NO_PEER_KEY, exit_scke);
33484
                        }
33485
33486
                    #ifdef HAVE_PK_CALLBACKS
33487
                        /* if callback then use it for shared secret */
33488
                        if (ssl->ctx->X448SharedSecretCb != NULL) {
33489
                            break;
33490
                        }
33491
                    #endif
33492
33493
                        /* create private key */
33494
                        ssl->hsType = DYNAMIC_TYPE_CURVE448;
33495
                        ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
33496
                        if (ret != 0) {
33497
                            goto exit_scke;
33498
                        }
33499
33500
                        ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
33501
                                          ssl->peerX448Key);
33502
                        break;
33503
                    }
33504
                #endif
33505
                    /* Check client ECC public key */
33506
                    if (!ssl->peerEccKey || !ssl->peerEccKeyPresent ||
33507
                                            !ssl->peerEccKey->dp) {
33508
                        ERROR_OUT(NO_PEER_KEY, exit_scke);
33509
                    }
33510
33511
                #ifdef HAVE_PK_CALLBACKS
33512
                    /* if callback then use it for shared secret */
33513
                    if (ssl->ctx->EccSharedSecretCb != NULL) {
33514
                        break;
33515
                    }
33516
                #endif
33517
33518
                    /* create ephemeral private key */
33519
                    ssl->hsType = DYNAMIC_TYPE_ECC;
33520
                    ret = AllocKey(ssl, (int)(ssl->hsType), &ssl->hsKey);
33521
                    if (ret != 0) {
33522
                        goto exit_scke;
33523
                    }
33524
33525
                    ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, ssl->peerEccKey);
33526
33527
                    break;
33528
            #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
33529
0
            #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
33530
0
                                                          defined(HAVE_CURVE448)
33531
0
                case ecc_diffie_hellman_kea:
33532
0
                {
33533
0
                #ifdef HAVE_ECC
33534
0
                    ecc_key* peerKey;
33535
0
                #endif
33536
33537
            #ifdef HAVE_PK_CALLBACKS
33538
                    /* if callback then use it for shared secret */
33539
                #ifdef HAVE_CURVE25519
33540
                    if (ssl->ecdhCurveOID == ECC_X25519_OID) {
33541
                        if (ssl->ctx->X25519SharedSecretCb != NULL)
33542
                            break;
33543
                    }
33544
                    else
33545
                #endif
33546
                #ifdef HAVE_CURVE448
33547
                    if (ssl->ecdhCurveOID == ECC_X448_OID) {
33548
                        if (ssl->ctx->X448SharedSecretCb != NULL)
33549
                            break;
33550
                    }
33551
                    else
33552
                #endif
33553
                #ifdef HAVE_ECC
33554
                    if (ssl->ctx->EccSharedSecretCb != NULL) {
33555
                        break;
33556
                    }
33557
                    else
33558
                #endif
33559
                    {
33560
                    }
33561
            #endif /* HAVE_PK_CALLBACKS */
33562
33563
0
                #ifdef HAVE_CURVE25519
33564
0
                    if (ssl->peerX25519KeyPresent) {
33565
0
                        if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
33566
0
                            ERROR_OUT(NO_PEER_KEY, exit_scke);
33567
0
                        }
33568
33569
                        /* create private key */
33570
0
                        ssl->hsType = DYNAMIC_TYPE_CURVE25519;
33571
0
                        ret = AllocKey(ssl, (int)(ssl->hsType), &ssl->hsKey);
33572
0
                        if (ret != 0) {
33573
0
                            goto exit_scke;
33574
0
                        }
33575
33576
0
                        ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
33577
0
                                            ssl->peerX25519Key);
33578
0
                        break;
33579
0
                    }
33580
0
                #endif
33581
0
                #ifdef HAVE_CURVE448
33582
0
                    if (ssl->peerX448KeyPresent) {
33583
0
                        if (!ssl->peerX448Key) {
33584
0
                            ERROR_OUT(NO_PEER_KEY, exit_scke);
33585
0
                        }
33586
33587
                        /* create private key */
33588
0
                        ssl->hsType = DYNAMIC_TYPE_CURVE448;
33589
0
                        ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
33590
0
                        if (ret != 0) {
33591
0
                            goto exit_scke;
33592
0
                        }
33593
33594
0
                        ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
33595
0
                                          ssl->peerX448Key);
33596
0
                        break;
33597
0
                    }
33598
0
                #endif
33599
0
                #ifdef HAVE_ECC
33600
0
                    if (ssl->specs.static_ecdh) {
33601
                        /* Note: EccDsa is really fixed Ecc key here */
33602
0
                        if (!ssl->peerEccDsaKey || !ssl->peerEccDsaKeyPresent) {
33603
0
                            ERROR_OUT(NO_PEER_KEY, exit_scke);
33604
0
                        }
33605
0
                        peerKey = ssl->peerEccDsaKey;
33606
0
                    }
33607
0
                    else {
33608
0
                        if (!ssl->peerEccKey || !ssl->peerEccKeyPresent) {
33609
0
                            ERROR_OUT(NO_PEER_KEY, exit_scke);
33610
0
                        }
33611
0
                        peerKey = ssl->peerEccKey;
33612
0
                    }
33613
0
                    if (peerKey == NULL) {
33614
0
                        ERROR_OUT(NO_PEER_KEY, exit_scke);
33615
0
                    }
33616
33617
                    /* create ephemeral private key */
33618
0
                    ssl->hsType = DYNAMIC_TYPE_ECC;
33619
0
                    ret = AllocKey(ssl, (int)ssl->hsType, &ssl->hsKey);
33620
0
                    if (ret != 0) {
33621
0
                        goto exit_scke;
33622
0
                    }
33623
33624
0
                    ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, peerKey);
33625
0
                #endif /* HAVE_ECC */
33626
33627
0
                    break;
33628
0
                }
33629
0
            #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
33630
33631
0
                default:
33632
0
                    ret = BAD_KEA_TYPE_E;
33633
0
            } /* switch(ssl->specs.kea) */
33634
33635
            /* Check for error */
33636
0
            if (ret != 0) {
33637
0
                goto exit_scke;
33638
0
            }
33639
33640
            /* Advance state and proceed */
33641
0
            ssl->options.asyncState = TLS_ASYNC_BUILD;
33642
0
        } /* case TLS_ASYNC_BEGIN */
33643
0
        FALL_THROUGH;
33644
33645
0
        case TLS_ASYNC_BUILD:
33646
0
        {
33647
0
            args->encSz = MAX_ENCRYPT_SZ;
33648
0
            args->encSecret = (byte*)XMALLOC(MAX_ENCRYPT_SZ, ssl->heap,
33649
0
                                                    DYNAMIC_TYPE_SECRET);
33650
0
            if (args->encSecret == NULL) {
33651
0
                ERROR_OUT(MEMORY_E, exit_scke);
33652
0
            }
33653
0
            if (ssl->arrays->preMasterSecret == NULL) {
33654
0
                ssl->arrays->preMasterSz = ENCRYPT_LEN;
33655
0
                ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
33656
0
                                                ssl->heap, DYNAMIC_TYPE_SECRET);
33657
0
                if (ssl->arrays->preMasterSecret == NULL) {
33658
0
                    ERROR_OUT(MEMORY_E, exit_scke);
33659
0
                }
33660
0
                XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
33661
0
            }
33662
33663
0
            switch(ssl->specs.kea)
33664
0
            {
33665
0
            #ifndef NO_RSA
33666
0
                case rsa_kea:
33667
0
                {
33668
                    #ifdef HAVE_PK_CALLBACKS
33669
                    if (ssl->ctx->GenPreMasterCb) {
33670
                        void* ctx = wolfSSL_GetGenPreMasterCtx(ssl);
33671
                        ret = ssl->ctx->GenPreMasterCb(ssl,
33672
                            ssl->arrays->preMasterSecret, ENCRYPT_LEN, ctx);
33673
                        if (ret != 0 &&
33674
                            ret != WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE)) {
33675
                            goto exit_scke;
33676
                        }
33677
                    }
33678
                    if (!ssl->ctx->GenPreMasterCb ||
33679
                        ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
33680
                    #endif
33681
0
                    {
33682
                        /* build PreMasterSecret with RNG data */
33683
0
                        ret = wc_RNG_GenerateBlock(ssl->rng,
33684
0
                            &ssl->arrays->preMasterSecret[VERSION_SZ],
33685
0
                            SECRET_LEN - VERSION_SZ);
33686
0
                        if (ret != 0) {
33687
0
                            goto exit_scke;
33688
0
                        }
33689
33690
0
                        ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
33691
0
                        ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
33692
33693
0
                        ssl->arrays->preMasterSz = SECRET_LEN;
33694
0
                    }
33695
0
                    break;
33696
0
                }
33697
0
            #endif /* !NO_RSA */
33698
0
            #ifndef NO_DH
33699
0
                case diffie_hellman_kea:
33700
0
                {
33701
0
                    ssl->buffers.sig.length = ENCRYPT_LEN;
33702
0
                    ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
33703
0
                                            ssl->heap, DYNAMIC_TYPE_SIGNATURE);
33704
0
                    if (ssl->buffers.sig.buffer == NULL) {
33705
0
                        ERROR_OUT(MEMORY_E, exit_scke);
33706
0
                    }
33707
33708
0
                    ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
33709
0
                                            (void**)&ssl->buffers.serverDH_Key);
33710
0
                    if (ret != 0) {
33711
0
                        goto exit_scke;
33712
0
                    }
33713
33714
#if defined(HAVE_FFDHE) && !defined(HAVE_PUBLIC_FFDHE)
33715
                    if (ssl->namedGroup) {
33716
                        ret = wc_DhSetNamedKey(ssl->buffers.serverDH_Key,
33717
                                ssl->namedGroup);
33718
                        if (ret != 0) {
33719
                            goto exit_scke;
33720
                        }
33721
                        ssl->buffers.sig.length =
33722
                            wc_DhGetNamedKeyMinSize(ssl->namedGroup);
33723
                    }
33724
                    else
33725
#endif
33726
0
                    #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
33727
0
                        !defined(WOLFSSL_OLD_PRIME_CHECK)
33728
0
                    if (ssl->options.dhDoKeyTest &&
33729
0
                        !ssl->options.dhKeyTested)
33730
0
                    {
33731
0
                        ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
33732
0
                            ssl->buffers.serverDH_P.buffer,
33733
0
                            ssl->buffers.serverDH_P.length,
33734
0
                            ssl->buffers.serverDH_G.buffer,
33735
0
                            ssl->buffers.serverDH_G.length,
33736
0
                            NULL, 0, 0, ssl->rng);
33737
0
                        if (ret != 0) {
33738
0
                            goto exit_scke;
33739
0
                        }
33740
0
                        ssl->options.dhKeyTested = 1;
33741
0
                    }
33742
0
                    else
33743
0
                    #endif
33744
0
                    {
33745
0
                        ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
33746
0
                            ssl->buffers.serverDH_P.buffer,
33747
0
                            ssl->buffers.serverDH_P.length,
33748
0
                            ssl->buffers.serverDH_G.buffer,
33749
0
                            ssl->buffers.serverDH_G.length);
33750
0
                        if (ret != 0) {
33751
0
                            goto exit_scke;
33752
0
                        }
33753
0
                    }
33754
33755
                    /* for DH, encSecret is Yc, agree is pre-master */
33756
0
                    ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
33757
0
                        ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
33758
0
                        args->encSecret, &args->encSz);
33759
33760
                    /* set the max agree result size */
33761
0
                    ssl->arrays->preMasterSz = ENCRYPT_LEN;
33762
0
                    break;
33763
0
                }
33764
0
            #endif /* !NO_DH */
33765
            #ifndef NO_PSK
33766
                case psk_kea:
33767
                {
33768
                    byte* pms = ssl->arrays->preMasterSecret;
33769
                    ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
33770
                        ssl->arrays->server_hint, ssl->arrays->client_identity,
33771
                        MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
33772
                    if (ssl->arrays->psk_keySz == 0 ||
33773
                            (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
33774
                        (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
33775
                        ERROR_OUT(PSK_KEY_ERROR, exit_scke);
33776
                    }
33777
33778
                    /* Ensure the buffer is null-terminated. */
33779
                    ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
33780
                    args->encSz = (word32)XSTRLEN(ssl->arrays->client_identity);
33781
                    if (args->encSz > MAX_PSK_ID_LEN) {
33782
                        ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
33783
                    }
33784
                    XMEMCPY(args->encSecret, ssl->arrays->client_identity,
33785
                            args->encSz);
33786
                    ssl->options.peerAuthGood = 1;
33787
                    if ((int)ssl->arrays->psk_keySz > 0) {
33788
                        /* CLIENT: Pre-shared Key for peer authentication. */
33789
33790
                        /* make psk pre master secret */
33791
                        /* length of key + length 0s + length of key + key */
33792
                        c16toa((word16)ssl->arrays->psk_keySz, pms);
33793
                        pms += OPAQUE16_LEN;
33794
                        XMEMSET(pms, 0, ssl->arrays->psk_keySz);
33795
                        pms += ssl->arrays->psk_keySz;
33796
                        c16toa((word16)ssl->arrays->psk_keySz, pms);
33797
                        pms += OPAQUE16_LEN;
33798
                        XMEMCPY(pms, ssl->arrays->psk_key,
33799
                                ssl->arrays->psk_keySz);
33800
                        ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2)
33801
                                                   + (2 * OPAQUE16_LEN);
33802
                        ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
33803
                    }
33804
                    ssl->arrays->psk_keySz = 0; /* No further need */
33805
                    break;
33806
                }
33807
            #endif /* !NO_PSK */
33808
            #if !defined(NO_DH) && !defined(NO_PSK)
33809
                case dhe_psk_kea:
33810
                {
33811
                    word32 esSz = 0;
33812
                    args->output = args->encSecret;
33813
33814
                    ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
33815
                        ssl->arrays->server_hint, ssl->arrays->client_identity,
33816
                        MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
33817
                    if (ssl->arrays->psk_keySz == 0 ||
33818
                            (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
33819
                        (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
33820
                        ERROR_OUT(PSK_KEY_ERROR, exit_scke);
33821
                    }
33822
33823
                    ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
33824
                    esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
33825
33826
                    if (esSz > MAX_PSK_ID_LEN) {
33827
                        ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
33828
                    }
33829
                    /* CLIENT: Pre-shared Key for peer authentication. */
33830
                    ssl->options.peerAuthGood = 1;
33831
33832
                    ssl->buffers.sig.length = ENCRYPT_LEN;
33833
                    ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
33834
                                            ssl->heap, DYNAMIC_TYPE_SIGNATURE);
33835
                    if (ssl->buffers.sig.buffer == NULL) {
33836
                        ERROR_OUT(MEMORY_E, exit_scke);
33837
                    }
33838
33839
                    c16toa((word16)esSz, args->output);
33840
                    args->output += OPAQUE16_LEN;
33841
                    XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
33842
                    args->output += esSz;
33843
                    args->length = args->encSz - esSz - OPAQUE16_LEN;
33844
                    args->encSz = esSz + OPAQUE16_LEN;
33845
33846
                    ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
33847
                                            (void**)&ssl->buffers.serverDH_Key);
33848
                    if (ret != 0) {
33849
                        goto exit_scke;
33850
                    }
33851
33852
                    #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
33853
                        !defined(WOLFSSL_OLD_PRIME_CHECK)
33854
                    if (ssl->options.dhDoKeyTest &&
33855
                        !ssl->options.dhKeyTested)
33856
                    {
33857
                        ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
33858
                            ssl->buffers.serverDH_P.buffer,
33859
                            ssl->buffers.serverDH_P.length,
33860
                            ssl->buffers.serverDH_G.buffer,
33861
                            ssl->buffers.serverDH_G.length,
33862
                            NULL, 0, 0, ssl->rng);
33863
                        if (ret != 0) {
33864
                            goto exit_scke;
33865
                        }
33866
                        ssl->options.dhKeyTested = 1;
33867
                    }
33868
                    else
33869
                    #endif
33870
                    {
33871
                        ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
33872
                            ssl->buffers.serverDH_P.buffer,
33873
                            ssl->buffers.serverDH_P.length,
33874
                            ssl->buffers.serverDH_G.buffer,
33875
                            ssl->buffers.serverDH_G.length);
33876
                        if (ret != 0) {
33877
                            goto exit_scke;
33878
                        }
33879
                    }
33880
33881
                    /* for DH, encSecret is Yc, agree is pre-master */
33882
                    ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
33883
                            ssl->buffers.sig.buffer,
33884
                            (word32*)&ssl->buffers.sig.length,
33885
                            args->output + OPAQUE16_LEN, &args->length);
33886
                    break;
33887
                }
33888
            #endif /* !NO_DH && !NO_PSK */
33889
            #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
33890
                                     defined(HAVE_CURVE448)) && !defined(NO_PSK)
33891
                case ecdhe_psk_kea:
33892
                {
33893
                    word32 esSz = 0;
33894
                    args->output = args->encSecret;
33895
33896
                    /* Send PSK client identity */
33897
                    ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
33898
                        ssl->arrays->server_hint, ssl->arrays->client_identity,
33899
                        MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
33900
                    if (ssl->arrays->psk_keySz == 0 ||
33901
                            (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
33902
                        (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
33903
                        ERROR_OUT(PSK_KEY_ERROR, exit_scke);
33904
                    }
33905
33906
                    ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
33907
                    esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
33908
                    if (esSz > MAX_PSK_ID_LEN) {
33909
                        ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
33910
                    }
33911
                    /* CLIENT: Pre-shared Key for peer authentication. */
33912
                    ssl->options.peerAuthGood = 1;
33913
33914
                    /* place size and identity in output buffer sz:identity */
33915
                    c16toa((word16)esSz, args->output);
33916
                    args->output += OPAQUE16_LEN;
33917
                    XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
33918
                    args->output += esSz;
33919
                    args->encSz = esSz + OPAQUE16_LEN;
33920
33921
                    /* length is used for public key size */
33922
                    args->length = MAX_ENCRYPT_SZ;
33923
33924
                    /* Create shared ECC key leaving room at the beginning
33925
                     * of buffer for size of shared key. */
33926
                    ssl->arrays->preMasterSz = ENCRYPT_LEN - OPAQUE16_LEN;
33927
33928
                #ifdef HAVE_CURVE25519
33929
                    if (ssl->ecdhCurveOID == ECC_X25519_OID) {
33930
                    #ifdef HAVE_PK_CALLBACKS
33931
                        /* if callback then use it for shared secret */
33932
                        if (ssl->ctx->X25519SharedSecretCb != NULL) {
33933
                            break;
33934
                        }
33935
                    #endif
33936
33937
                        ret = wc_curve25519_export_public_ex(
33938
                                (curve25519_key*)ssl->hsKey,
33939
                                args->output + OPAQUE8_LEN, &args->length,
33940
                                EC25519_LITTLE_ENDIAN);
33941
                        if (ret != 0) {
33942
                            ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
33943
                        }
33944
33945
                        break;
33946
                    }
33947
                #endif
33948
                #ifdef HAVE_CURVE448
33949
                    if (ssl->ecdhCurveOID == ECC_X448_OID) {
33950
                    #ifdef HAVE_PK_CALLBACKS
33951
                        /* if callback then use it for shared secret */
33952
                        if (ssl->ctx->X448SharedSecretCb != NULL) {
33953
                            break;
33954
                        }
33955
                    #endif
33956
33957
                        ret = wc_curve448_export_public_ex(
33958
                                (curve448_key*)ssl->hsKey,
33959
                                args->output + OPAQUE8_LEN, &args->length,
33960
                                EC448_LITTLE_ENDIAN);
33961
                        if (ret != 0) {
33962
                            ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
33963
                        }
33964
33965
                        break;
33966
                    }
33967
                #endif
33968
                #ifdef HAVE_PK_CALLBACKS
33969
                    /* if callback then use it for shared secret */
33970
                    if (ssl->ctx->EccSharedSecretCb != NULL) {
33971
                        break;
33972
                    }
33973
                #endif
33974
33975
                    /* Place ECC key in output buffer, leaving room for size */
33976
                    PRIVATE_KEY_UNLOCK();
33977
                    ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
33978
                                    args->output + OPAQUE8_LEN, &args->length);
33979
                    PRIVATE_KEY_LOCK();
33980
                    if (ret != 0) {
33981
                        ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
33982
                    }
33983
33984
                    break;
33985
                }
33986
            #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
33987
0
            #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
33988
0
                                                          defined(HAVE_CURVE448)
33989
0
                case ecc_diffie_hellman_kea:
33990
0
                {
33991
0
                    ssl->arrays->preMasterSz = ENCRYPT_LEN;
33992
33993
0
                #ifdef HAVE_CURVE25519
33994
0
                    if (ssl->hsType == DYNAMIC_TYPE_CURVE25519) {
33995
                    #ifdef HAVE_PK_CALLBACKS
33996
                        /* if callback then use it for shared secret */
33997
                        if (ssl->ctx->X25519SharedSecretCb != NULL) {
33998
                            break;
33999
                        }
34000
                    #endif
34001
34002
0
                        ret = wc_curve25519_export_public_ex(
34003
0
                                (curve25519_key*)ssl->hsKey,
34004
0
                                args->encSecret + OPAQUE8_LEN, &args->encSz,
34005
0
                                EC25519_LITTLE_ENDIAN);
34006
0
                        if (ret != 0) {
34007
0
                            ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
34008
0
                        }
34009
34010
0
                        break;
34011
0
                    }
34012
0
                #endif
34013
0
                #ifdef HAVE_CURVE448
34014
0
                    if (ssl->hsType == DYNAMIC_TYPE_CURVE448) {
34015
                    #ifdef HAVE_PK_CALLBACKS
34016
                        /* if callback then use it for shared secret */
34017
                        if (ssl->ctx->X448SharedSecretCb != NULL) {
34018
                            break;
34019
                        }
34020
                    #endif
34021
34022
0
                        ret = wc_curve448_export_public_ex(
34023
0
                                (curve448_key*)ssl->hsKey,
34024
0
                                args->encSecret + OPAQUE8_LEN, &args->encSz,
34025
0
                                EC448_LITTLE_ENDIAN);
34026
0
                        if (ret != 0) {
34027
0
                            ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
34028
0
                        }
34029
34030
0
                        break;
34031
0
                    }
34032
0
                #endif
34033
0
                #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
34034
                #ifdef HAVE_PK_CALLBACKS
34035
                    /* if callback then use it for shared secret */
34036
                    if (ssl->ctx->EccSharedSecretCb != NULL) {
34037
                        break;
34038
                    }
34039
                #endif
34040
34041
                    /* Place ECC key in buffer, leaving room for size */
34042
0
                    PRIVATE_KEY_UNLOCK();
34043
0
                    ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
34044
0
                                args->encSecret + OPAQUE8_LEN, &args->encSz);
34045
0
                    PRIVATE_KEY_LOCK();
34046
0
                    if (ret != 0) {
34047
0
                        ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
34048
0
                    }
34049
0
                #endif /* HAVE_ECC */
34050
0
                    break;
34051
0
                }
34052
0
            #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
34053
34054
0
                default:
34055
0
                    ret = BAD_KEA_TYPE_E;
34056
0
            } /* switch(ssl->specs.kea) */
34057
34058
            /* Check for error */
34059
0
            if (ret != 0) {
34060
0
                goto exit_scke;
34061
0
            }
34062
34063
            /* Advance state and proceed */
34064
0
            ssl->options.asyncState = TLS_ASYNC_DO;
34065
0
        } /* case TLS_ASYNC_BUILD */
34066
0
        FALL_THROUGH;
34067
34068
0
        case TLS_ASYNC_DO:
34069
0
        {
34070
0
            switch(ssl->specs.kea)
34071
0
            {
34072
0
            #ifndef NO_RSA
34073
0
                case rsa_kea:
34074
0
                {
34075
0
                        ret = RsaEnc(ssl,
34076
0
                            ssl->arrays->preMasterSecret, SECRET_LEN,
34077
0
                            args->encSecret, &args->encSz,
34078
0
                            ssl->peerRsaKey,
34079
                        #if defined(HAVE_PK_CALLBACKS)
34080
                            &ssl->buffers.peerRsaKey
34081
                        #else
34082
0
                            NULL
34083
0
                        #endif
34084
0
                        );
34085
34086
0
                    break;
34087
0
                }
34088
0
            #endif /* !NO_RSA */
34089
0
            #ifndef NO_DH
34090
0
                case diffie_hellman_kea:
34091
0
                {
34092
0
                    ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
34093
0
                        ssl->buffers.sig.buffer, ssl->buffers.sig.length,
34094
0
                        ssl->buffers.serverDH_Pub.buffer,
34095
0
                        ssl->buffers.serverDH_Pub.length,
34096
0
                        ssl->arrays->preMasterSecret,
34097
0
                        &ssl->arrays->preMasterSz,
34098
0
                        ssl->buffers.serverDH_P.buffer,
34099
0
                        ssl->buffers.serverDH_P.length);
34100
0
                    break;
34101
0
                }
34102
0
            #endif /* !NO_DH */
34103
            #ifndef NO_PSK
34104
                case psk_kea:
34105
                {
34106
                    break;
34107
                }
34108
            #endif /* !NO_PSK */
34109
            #if !defined(NO_DH) && !defined(NO_PSK)
34110
                case dhe_psk_kea:
34111
                {
34112
                    ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
34113
                        ssl->buffers.sig.buffer, ssl->buffers.sig.length,
34114
                        ssl->buffers.serverDH_Pub.buffer,
34115
                        ssl->buffers.serverDH_Pub.length,
34116
                        ssl->arrays->preMasterSecret + OPAQUE16_LEN,
34117
                        &ssl->arrays->preMasterSz,
34118
                        ssl->buffers.serverDH_P.buffer,
34119
                        ssl->buffers.serverDH_P.length);
34120
                    break;
34121
                }
34122
            #endif /* !NO_DH && !NO_PSK */
34123
            #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
34124
                                     defined(HAVE_CURVE448)) && !defined(NO_PSK)
34125
                case ecdhe_psk_kea:
34126
                {
34127
                #ifdef HAVE_CURVE25519
34128
                    if (ssl->peerX25519KeyPresent) {
34129
                        ret = X25519SharedSecret(ssl,
34130
                            (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
34131
                            args->output + OPAQUE8_LEN, &args->length,
34132
                            ssl->arrays->preMasterSecret + OPAQUE16_LEN,
34133
                            &ssl->arrays->preMasterSz,
34134
                            WOLFSSL_CLIENT_END
34135
                        );
34136
                        if (!ssl->specs.static_ecdh
34137
                        #ifdef WOLFSSL_ASYNC_CRYPT
34138
                            && ret != WC_NO_ERR_TRACE(WC_PENDING_E)
34139
                        #endif
34140
                        ) {
34141
                            FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
34142
                                                   (void**)&ssl->peerX25519Key);
34143
                            ssl->peerX25519KeyPresent = 0;
34144
                        }
34145
                        break;
34146
                    }
34147
                #endif
34148
                #ifdef HAVE_CURVE448
34149
                    if (ssl->peerX448KeyPresent) {
34150
                        ret = X448SharedSecret(ssl,
34151
                            (curve448_key*)ssl->hsKey, ssl->peerX448Key,
34152
                            args->output + OPAQUE8_LEN, &args->length,
34153
                            ssl->arrays->preMasterSecret + OPAQUE16_LEN,
34154
                            &ssl->arrays->preMasterSz,
34155
                            WOLFSSL_CLIENT_END
34156
                        );
34157
                        if (!ssl->specs.static_ecdh
34158
                        #ifdef WOLFSSL_ASYNC_CRYPT
34159
                            && ret != WC_NO_ERR_TRACE(WC_PENDING_E)
34160
                        #endif
34161
                        ) {
34162
                            FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
34163
                                                     (void**)&ssl->peerX448Key);
34164
                            ssl->peerX448KeyPresent = 0;
34165
                        }
34166
                        break;
34167
                    }
34168
                #endif
34169
                    ret = EccSharedSecret(ssl,
34170
                        (ecc_key*)ssl->hsKey, ssl->peerEccKey,
34171
                        args->output + OPAQUE8_LEN, &args->length,
34172
                        ssl->arrays->preMasterSecret + OPAQUE16_LEN,
34173
                        &ssl->arrays->preMasterSz,
34174
                        WOLFSSL_CLIENT_END
34175
                    );
34176
                #ifdef WOLFSSL_ASYNC_CRYPT
34177
                    if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
34178
                #endif
34179
                    {
34180
                        FreeKey(ssl, DYNAMIC_TYPE_ECC,
34181
                                                      (void**)&ssl->peerEccKey);
34182
                        ssl->peerEccKeyPresent = 0;
34183
                    }
34184
                    break;
34185
                }
34186
            #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
34187
0
            #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
34188
0
                                                          defined(HAVE_CURVE448)
34189
0
                case ecc_diffie_hellman_kea:
34190
0
                {
34191
0
                #ifdef HAVE_ECC
34192
0
                    ecc_key* peerKey;
34193
0
                #endif
34194
34195
0
                #ifdef HAVE_CURVE25519
34196
0
                    if (ssl->peerX25519KeyPresent) {
34197
0
                        ret = X25519SharedSecret(ssl,
34198
0
                            (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
34199
0
                            args->encSecret + OPAQUE8_LEN, &args->encSz,
34200
0
                            ssl->arrays->preMasterSecret,
34201
0
                            &ssl->arrays->preMasterSz,
34202
0
                            WOLFSSL_CLIENT_END
34203
0
                        );
34204
0
                        if (!ssl->specs.static_ecdh
34205
                        #ifdef WOLFSSL_ASYNC_CRYPT
34206
                            && ret != WC_NO_ERR_TRACE(WC_PENDING_E)
34207
                        #endif
34208
0
                        ) {
34209
0
                            FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
34210
0
                                                   (void**)&ssl->peerX25519Key);
34211
0
                            ssl->peerX25519KeyPresent = 0;
34212
0
                        }
34213
0
                        break;
34214
0
                    }
34215
0
                #endif
34216
0
                #ifdef HAVE_CURVE448
34217
0
                    if (ssl->peerX448KeyPresent) {
34218
0
                        ret = X448SharedSecret(ssl,
34219
0
                            (curve448_key*)ssl->hsKey, ssl->peerX448Key,
34220
0
                            args->encSecret + OPAQUE8_LEN, &args->encSz,
34221
0
                            ssl->arrays->preMasterSecret,
34222
0
                            &ssl->arrays->preMasterSz,
34223
0
                            WOLFSSL_CLIENT_END
34224
0
                        );
34225
0
                        if (!ssl->specs.static_ecdh
34226
                        #ifdef WOLFSSL_ASYNC_CRYPT
34227
                            && ret != WC_NO_ERR_TRACE(WC_PENDING_E)
34228
                        #endif
34229
0
                        ) {
34230
0
                            FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
34231
0
                                                     (void**)&ssl->peerX448Key);
34232
0
                            ssl->peerX448KeyPresent = 0;
34233
0
                        }
34234
0
                        break;
34235
0
                    }
34236
0
                #endif
34237
0
                #ifdef HAVE_ECC
34238
0
                    peerKey = (ssl->specs.static_ecdh) ?
34239
0
                              ssl->peerEccDsaKey : ssl->peerEccKey;
34240
34241
0
                    ret = EccSharedSecret(ssl,
34242
0
                              (ecc_key*)ssl->hsKey, peerKey,
34243
0
                              args->encSecret + OPAQUE8_LEN, &args->encSz,
34244
0
                              ssl->arrays->preMasterSecret,
34245
0
                              &ssl->arrays->preMasterSz,
34246
0
                              WOLFSSL_CLIENT_END);
34247
34248
0
                    if (!ssl->specs.static_ecdh
34249
                #ifdef WOLFSSL_ASYNC_CRYPT
34250
                        && ret != WC_NO_ERR_TRACE(WC_PENDING_E)
34251
                #endif
34252
0
                     && !ssl->options.keepResources) {
34253
0
                        FreeKey(ssl, DYNAMIC_TYPE_ECC,
34254
0
                                                      (void**)&ssl->peerEccKey);
34255
0
                        ssl->peerEccKeyPresent = 0;
34256
0
                    }
34257
0
                #endif
34258
34259
0
                    break;
34260
0
                }
34261
0
            #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
34262
34263
0
                default:
34264
0
                    ret = BAD_KEA_TYPE_E;
34265
0
            } /* switch(ssl->specs.kea) */
34266
34267
            /* Check for error */
34268
0
            if (ret != 0) {
34269
0
                goto exit_scke;
34270
0
            }
34271
34272
            /* Advance state and proceed */
34273
0
            ssl->options.asyncState = TLS_ASYNC_VERIFY;
34274
0
        } /* case TLS_ASYNC_DO */
34275
0
        FALL_THROUGH;
34276
34277
0
        case TLS_ASYNC_VERIFY:
34278
0
        {
34279
0
            switch(ssl->specs.kea)
34280
0
            {
34281
0
            #ifndef NO_RSA
34282
0
                case rsa_kea:
34283
0
                {
34284
0
                    break;
34285
0
                }
34286
0
            #endif /* !NO_RSA */
34287
0
            #ifndef NO_DH
34288
0
                case diffie_hellman_kea:
34289
0
                {
34290
0
                    break;
34291
0
                }
34292
0
            #endif /* !NO_DH */
34293
            #ifndef NO_PSK
34294
                case psk_kea:
34295
                {
34296
                    break;
34297
                }
34298
            #endif /* !NO_PSK */
34299
            #if !defined(NO_DH) && !defined(NO_PSK)
34300
                case dhe_psk_kea:
34301
                {
34302
                    byte* pms = ssl->arrays->preMasterSecret;
34303
34304
                    /* validate args */
34305
                    if (args->output == NULL || args->length == 0) {
34306
                        ERROR_OUT(BAD_FUNC_ARG, exit_scke);
34307
                    }
34308
34309
                    c16toa((word16)args->length, args->output);
34310
                    args->encSz += args->length + OPAQUE16_LEN;
34311
                    c16toa((word16)ssl->arrays->preMasterSz, pms);
34312
                    ssl->arrays->preMasterSz += OPAQUE16_LEN;
34313
                    pms += ssl->arrays->preMasterSz;
34314
34315
                    /* make psk pre master secret */
34316
                    if ((int)ssl->arrays->psk_keySz > 0) {
34317
                        /* length of key + length 0s + length of key + key */
34318
                        c16toa((word16)ssl->arrays->psk_keySz, pms);
34319
                        pms += OPAQUE16_LEN;
34320
                        XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
34321
                        ssl->arrays->preMasterSz +=
34322
                                            ssl->arrays->psk_keySz + OPAQUE16_LEN;
34323
                        ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
34324
                    }
34325
                    ssl->arrays->psk_keySz = 0; /* No further need */
34326
                    break;
34327
                }
34328
            #endif /* !NO_DH && !NO_PSK */
34329
            #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
34330
                                     defined(HAVE_CURVE448)) && !defined(NO_PSK)
34331
                case ecdhe_psk_kea:
34332
                {
34333
                    byte* pms = ssl->arrays->preMasterSecret;
34334
34335
                    /* validate args */
34336
                    if (args->output == NULL || args->length > ENCRYPT_LEN) {
34337
                        ERROR_OUT(BAD_FUNC_ARG, exit_scke);
34338
                    }
34339
34340
                    /* place size of public key in output buffer */
34341
                    *args->output = (byte)args->length;
34342
                    args->encSz += args->length + OPAQUE8_LEN;
34343
34344
                    /* Create pre master secret is the concatenation of
34345
                     * eccSize + eccSharedKey + pskSize + pskKey */
34346
                    c16toa((word16)ssl->arrays->preMasterSz, pms);
34347
                    ssl->arrays->preMasterSz += OPAQUE16_LEN;
34348
                    pms += ssl->arrays->preMasterSz;
34349
34350
                    if ((int)ssl->arrays->psk_keySz > 0) {
34351
                        c16toa((word16)ssl->arrays->psk_keySz, pms);
34352
                        pms += OPAQUE16_LEN;
34353
                        XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
34354
                        ssl->arrays->preMasterSz += ssl->arrays->psk_keySz + OPAQUE16_LEN;
34355
34356
                        ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
34357
                    }
34358
                    ssl->arrays->psk_keySz = 0; /* No further need */
34359
                    break;
34360
                }
34361
            #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
34362
0
            #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
34363
0
                                                          defined(HAVE_CURVE448)
34364
0
                case ecc_diffie_hellman_kea:
34365
0
                {
34366
0
                    if (args->encSecret == NULL) {
34367
0
                        ret = BAD_STATE_E;
34368
0
                        goto exit_scke;
34369
0
                    }
34370
0
                    else {
34371
                        /* place size of public key in buffer */
34372
0
                        *args->encSecret = (byte)args->encSz;
34373
0
                        args->encSz += OPAQUE8_LEN;
34374
0
                    }
34375
0
                    break;
34376
0
                }
34377
0
            #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
34378
34379
0
                default:
34380
0
                    ret = BAD_KEA_TYPE_E;
34381
0
            } /* switch(ssl->specs.kea) */
34382
34383
            /* Check for error */
34384
0
            if (ret != 0) {
34385
0
                goto exit_scke;
34386
0
            }
34387
34388
            /* Advance state and proceed */
34389
0
            ssl->options.asyncState = TLS_ASYNC_FINALIZE;
34390
0
        } /* case TLS_ASYNC_VERIFY */
34391
0
        FALL_THROUGH;
34392
34393
0
        case TLS_ASYNC_FINALIZE:
34394
0
        {
34395
0
            word32 tlsSz = 0;
34396
0
            word32 idx = 0;
34397
34398
0
            if (ssl->options.tls || ssl->specs.kea == diffie_hellman_kea) {
34399
0
                tlsSz = 2;
34400
0
            }
34401
34402
0
            if (ssl->specs.kea == ecc_diffie_hellman_kea ||
34403
0
                ssl->specs.kea == dhe_psk_kea ||
34404
0
                ssl->specs.kea == ecdhe_psk_kea) { /* always off */
34405
0
                tlsSz = 0;
34406
0
            }
34407
34408
0
            idx = HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
34409
0
            args->sendSz = (int)(args->encSz + tlsSz + idx);
34410
34411
        #ifdef WOLFSSL_DTLS
34412
            if (ssl->options.dtls) {
34413
                idx    += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
34414
                args->sendSz += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
34415
            }
34416
        #endif
34417
34418
0
            if (IsEncryptionOn(ssl, 1)) {
34419
0
                args->sendSz += MAX_MSG_EXTRA;
34420
0
            }
34421
34422
            /* check for available size */
34423
0
            if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0)
34424
0
                goto exit_scke;
34425
34426
            /* get output buffer */
34427
0
            args->output = GetOutputBuffer(ssl);
34428
34429
0
            AddHeaders(args->output, args->encSz + tlsSz, client_key_exchange, ssl);
34430
34431
0
            if (tlsSz) {
34432
0
                c16toa((word16)args->encSz, &args->output[idx]);
34433
0
                idx += OPAQUE16_LEN;
34434
0
            }
34435
0
            XMEMCPY(args->output + idx, args->encSecret, args->encSz);
34436
0
            idx += args->encSz;
34437
34438
0
            if (IsEncryptionOn(ssl, 1)) {
34439
0
                int recordHeaderSz = RECORD_HEADER_SZ;
34440
34441
0
                if (ssl->options.dtls)
34442
0
                    recordHeaderSz += DTLS_RECORD_EXTRA;
34443
0
                args->inputSz = (int)idx - recordHeaderSz; /* buildmsg adds rechdr */
34444
0
                args->input = (byte*)XMALLOC((size_t)args->inputSz, ssl->heap,
34445
0
                                                       DYNAMIC_TYPE_IN_BUFFER);
34446
0
                if (args->input == NULL) {
34447
0
                    ERROR_OUT(MEMORY_E, exit_scke);
34448
0
                }
34449
34450
0
                XMEMCPY(args->input, args->output + recordHeaderSz,
34451
0
                                                                args->inputSz);
34452
0
            }
34453
34454
            /* Advance state and proceed */
34455
0
            ssl->options.asyncState = TLS_ASYNC_END;
34456
0
        } /* case TLS_ASYNC_FINALIZE */
34457
0
        FALL_THROUGH;
34458
34459
0
        case TLS_ASYNC_END:
34460
0
        {
34461
0
            if (IsEncryptionOn(ssl, 1)) {
34462
            #ifdef WOLFSSL_DTLS
34463
                if (IsDtlsNotSctpMode(ssl) &&
34464
                        (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, client_key_exchange)) != 0) {
34465
                    goto exit_scke;
34466
                }
34467
            #endif
34468
0
                ret = BuildMessage(ssl, args->output, args->sendSz,
34469
0
                            args->input, args->inputSz, handshake, 1, 0, 0, CUR_ORDER);
34470
0
                XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
34471
0
                args->input = NULL; /* make sure its not double free'd on cleanup */
34472
34473
0
                if (ret >= 0) {
34474
0
                    args->sendSz = ret;
34475
0
                    ret = 0;
34476
0
                }
34477
0
            }
34478
0
            else {
34479
            #ifdef WOLFSSL_DTLS
34480
                if (IsDtlsNotSctpMode(ssl)) {
34481
                    if ((ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz, client_key_exchange)) != 0) {
34482
                        goto exit_scke;
34483
                    }
34484
                }
34485
                if (ssl->options.dtls)
34486
                    DtlsSEQIncrement(ssl, CUR_ORDER);
34487
            #endif
34488
0
                ret = HashOutput(ssl, args->output, args->sendSz, 0);
34489
0
            }
34490
34491
0
            if (ret != 0) {
34492
0
                goto exit_scke;
34493
0
            }
34494
34495
        #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
34496
            if (ssl->hsInfoOn)
34497
                AddPacketName(ssl, "ClientKeyExchange");
34498
            if (ssl->toInfoOn) {
34499
                ret = AddPacketInfo(ssl, "ClientKeyExchange", handshake,
34500
                         args->output, args->sendSz, WRITE_PROTO, 0, ssl->heap);
34501
                if (ret != 0) {
34502
                    goto exit_scke;
34503
                }
34504
            }
34505
        #endif
34506
34507
0
            ssl->buffers.outputBuffer.length += (word32)args->sendSz;
34508
34509
0
            if (!ssl->options.groupMessages) {
34510
0
                ret = SendBuffered(ssl);
34511
0
            }
34512
0
            if (ret == 0 || ret == WC_NO_ERR_TRACE(WANT_WRITE)) {
34513
0
                int tmpRet = MakeMasterSecret(ssl);
34514
0
                if (tmpRet != 0) {
34515
0
                    ret = tmpRet;   /* save WANT_WRITE unless more serious */
34516
0
                }
34517
0
                ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
34518
0
                ssl->options.buildingMsg = 0;
34519
0
            }
34520
        #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
34521
            if (ssl->keyLogCb != NULL) {
34522
                int secretSz = SECRET_LEN;
34523
                ret = ssl->keyLogCb(ssl, ssl->arrays->masterSecret, &secretSz,
34524
                                                                        NULL);
34525
                if (ret != 0 || secretSz != SECRET_LEN)
34526
                    return SESSION_SECRET_CB_E;
34527
            }
34528
        #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
34529
0
            break;
34530
0
        }
34531
0
        default:
34532
0
            ret = INPUT_CASE_ERROR;
34533
0
    } /* switch(ssl->options.asyncState) */
34534
34535
0
exit_scke:
34536
34537
0
    WOLFSSL_LEAVE("SendClientKeyExchange", ret);
34538
0
    WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
34539
34540
0
#ifdef WOLFSSL_ASYNC_IO
34541
    /* Handle async operation */
34542
0
    if (ret == WC_NO_ERR_TRACE(WC_PENDING_E) ||
34543
0
        ret == WC_NO_ERR_TRACE(WANT_WRITE))
34544
0
    {
34545
0
        if (ssl->options.buildingMsg)
34546
0
            return ret;
34547
        /* If we have completed all states then we will not enter this function
34548
         * again. We need to do clean up now. */
34549
0
    }
34550
0
#endif
34551
34552
    /* No further need for PMS */
34553
0
    if (ssl->arrays->preMasterSecret != NULL) {
34554
0
        ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
34555
0
    }
34556
0
    ssl->arrays->preMasterSz = 0;
34557
34558
    /* Final cleanup */
34559
0
#ifdef WOLFSSL_ASYNC_IO
34560
    /* Cleanup async */
34561
0
    FreeAsyncCtx(ssl, 0);
34562
#else
34563
    FreeSckeArgs(ssl, args);
34564
#endif
34565
0
    FreeKeyExchange(ssl);
34566
34567
0
    if (ret != 0) {
34568
0
        WOLFSSL_ERROR_VERBOSE(ret);
34569
0
    }
34570
0
    return ret;
34571
0
}
34572
34573
#endif /* !WOLFSSL_NO_TLS12 */
34574
34575
#ifndef NO_CERTS
34576
34577
#ifndef WOLFSSL_NO_TLS12
34578
34579
#ifndef WOLFSSL_NO_CLIENT_AUTH
34580
typedef struct ScvArgs {
34581
    byte*  output; /* not allocated */
34582
#ifndef NO_RSA
34583
    byte*  verifySig;
34584
#endif
34585
    byte*  verify; /* not allocated */
34586
    byte*  input;
34587
    word32 idx;
34588
    word32 extraSz;
34589
    word32 sigSz;
34590
    int    sendSz;
34591
    int    inputSz;
34592
    word32 length;
34593
    byte   sigAlgo;
34594
} ScvArgs;
34595
34596
static void FreeScvArgs(WOLFSSL* ssl, void* pArgs)
34597
2
{
34598
2
    ScvArgs* args = (ScvArgs*)pArgs;
34599
34600
2
    (void)ssl;
34601
34602
2
#ifndef NO_RSA
34603
2
    XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
34604
2
    args->verifySig = NULL;
34605
2
#endif
34606
2
    XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
34607
2
    args->input = NULL;
34608
2
}
34609
34610
/* handle generation of certificate_verify (15) */
34611
int SendCertificateVerify(WOLFSSL* ssl)
34612
{
34613
    int ret = 0;
34614
#ifdef WOLFSSL_ASYNC_IO
34615
    ScvArgs* args = NULL;
34616
    WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
34617
#else
34618
    ScvArgs  args[1];
34619
#endif
34620
34621
    WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_SEND);
34622
    WOLFSSL_ENTER("SendCertificateVerify");
34623
34624
#ifdef WOLFSSL_BLIND_PRIVATE_KEY
34625
    wolfssl_priv_der_unblind(ssl->buffers.key, ssl->buffers.keyMask);
34626
#endif
34627
34628
#ifdef WOLFSSL_ASYNC_IO
34629
    if (ssl->async == NULL) {
34630
        ssl->async = (struct WOLFSSL_ASYNC*)
34631
                XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
34632
                        DYNAMIC_TYPE_ASYNC);
34633
        if (ssl->async == NULL)
34634
            ERROR_OUT(MEMORY_E, exit_scv);
34635
        XMEMSET(ssl->async, 0, sizeof(struct WOLFSSL_ASYNC));
34636
    }
34637
    args = (ScvArgs*)ssl->async->args;
34638
#ifdef WOLFSSL_ASYNC_CRYPT
34639
    /* BuildMessage does its own Pop */
34640
    if (ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E) ||
34641
            ssl->options.asyncState != TLS_ASYNC_END)
34642
        ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
34643
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
34644
        /* Check for error */
34645
        if (ret < 0)
34646
            goto exit_scv;
34647
    }
34648
    else
34649
#endif
34650
    if (ssl->options.buildingMsg) {
34651
        /* We should be in the sending state. */
34652
        if (ssl->options.asyncState != TLS_ASYNC_END) {
34653
            ret = BAD_STATE_E;
34654
            goto exit_scv;
34655
        }
34656
    }
34657
    else
34658
#endif
34659
    {
34660
        /* Reset state */
34661
        ret = 0;
34662
        ssl->options.asyncState = TLS_ASYNC_BEGIN;
34663
        XMEMSET(args, 0, sizeof(ScvArgs));
34664
    #ifdef WOLFSSL_ASYNC_IO
34665
        ssl->async->freeArgs = FreeScvArgs;
34666
    #endif
34667
    }
34668
34669
    switch(ssl->options.asyncState)
34670
    {
34671
        case TLS_ASYNC_BEGIN:
34672
        {
34673
            if (ssl->options.sendVerify == SEND_BLANK_CERT) {
34674
            #ifdef WOLFSSL_BLIND_PRIVATE_KEY
34675
                wolfssl_priv_der_unblind(ssl->buffers.key,
34676
                    ssl->buffers.keyMask);
34677
            #endif
34678
                return 0;  /* sent blank cert, can't verify */
34679
            }
34680
34681
            args->sendSz = WC_MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA;
34682
            if (IsEncryptionOn(ssl, 1)) {
34683
                args->sendSz += MAX_MSG_EXTRA;
34684
            }
34685
34686
            /* Use tmp buffer */
34687
            args->input = (byte*)XMALLOC((size_t)args->sendSz,
34688
                    ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
34689
            if (args->input == NULL)
34690
                ERROR_OUT(MEMORY_E, exit_scv);
34691
            args->output = args->input;
34692
34693
            /* Advance state and proceed */
34694
            ssl->options.asyncState = TLS_ASYNC_BUILD;
34695
        } /* case TLS_ASYNC_BEGIN */
34696
        FALL_THROUGH;
34697
34698
        case TLS_ASYNC_BUILD:
34699
        {
34700
            ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
34701
            if (ret != 0) {
34702
                goto exit_scv;
34703
            }
34704
34705
            if (ssl->buffers.key == NULL) {
34706
            #ifdef HAVE_PK_CALLBACKS
34707
                if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
34708
                    args->length = (word16)GetPrivateKeySigSize(ssl);
34709
                else
34710
            #endif
34711
                    ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
34712
            }
34713
            else {
34714
                /* Decode private key. */
34715
                ret = DecodePrivateKey(ssl, &args->length);
34716
                if (ret != 0) {
34717
                    goto exit_scv;
34718
                }
34719
            }
34720
34721
            if (args->length == 0) {
34722
                ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
34723
            }
34724
34725
            /* idx is used to track verify pointer offset to output */
34726
            args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
34727
            args->verify = &args->output[RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ];
34728
            args->extraSz = 0;  /* tls 1.2 hash/sig */
34729
34730
            /* build encoded signature buffer */
34731
            ssl->buffers.sig.length = MAX_ENCODED_SIG_SZ;
34732
            ssl->buffers.sig.buffer = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
34733
                                        ssl->heap, DYNAMIC_TYPE_SIGNATURE);
34734
            if (ssl->buffers.sig.buffer == NULL) {
34735
                ERROR_OUT(MEMORY_E, exit_scv);
34736
            }
34737
34738
        #ifdef WOLFSSL_DTLS
34739
            if (ssl->options.dtls) {
34740
                args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
34741
                args->verify += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
34742
            }
34743
        #endif
34744
34745
            if (!IsAtLeastTLSv1_2(ssl)) {
34746
        #ifndef NO_OLD_TLS
34747
            #ifndef NO_SHA
34748
                /* old tls default */
34749
                SetDigest(ssl, sha_mac);
34750
            #endif
34751
        #else
34752
            #ifndef NO_SHA256
34753
                /* new tls default */
34754
                SetDigest(ssl, sha256_mac);
34755
            #endif
34756
        #endif /* !NO_OLD_TLS */
34757
            }
34758
            else {
34759
                SetDigest(ssl, ssl->options.hashAlgo);
34760
            }
34761
34762
            if (ssl->hsType == DYNAMIC_TYPE_RSA) {
34763
        #ifdef WC_RSA_PSS
34764
                if (IsAtLeastTLSv1_2(ssl) &&
34765
                                (ssl->pssAlgo & (1 << ssl->options.hashAlgo))) {
34766
                    args->sigAlgo = rsa_pss_sa_algo;
34767
                }
34768
                else
34769
        #endif
34770
                    args->sigAlgo = rsa_sa_algo;
34771
            }
34772
            else if (ssl->hsType == DYNAMIC_TYPE_ECC)
34773
        #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
34774
                if (ssl->buffers.keyType == sm2_sa_algo) {
34775
                    args->sigAlgo = sm2_sa_algo;
34776
                }
34777
                else
34778
        #endif
34779
                {
34780
                    args->sigAlgo = ecc_dsa_sa_algo;
34781
                }
34782
            else if (ssl->hsType == DYNAMIC_TYPE_ED25519)
34783
                args->sigAlgo = ed25519_sa_algo;
34784
            else if (ssl->hsType == DYNAMIC_TYPE_ED448)
34785
                args->sigAlgo = ed448_sa_algo;
34786
34787
            if (IsAtLeastTLSv1_2(ssl)) {
34788
                EncodeSigAlg(ssl->options.hashAlgo, args->sigAlgo,
34789
                             args->verify);
34790
                args->extraSz = HASH_SIG_SIZE;
34791
                SetDigest(ssl, ssl->options.hashAlgo);
34792
            }
34793
        #ifndef NO_OLD_TLS
34794
            else {
34795
                /* if old TLS load MD5 and SHA hash as value to sign
34796
                 * MD5 and SHA must be first two buffers in structure */
34797
                XMEMCPY(ssl->buffers.sig.buffer,
34798
                                (byte*)&ssl->hsHashes->certHashes, FINISHED_SZ);
34799
            }
34800
        #endif
34801
34802
        #ifndef NO_RSA
34803
            if (args->sigAlgo == rsa_sa_algo) {
34804
                ssl->buffers.sig.length = FINISHED_SZ;
34805
                args->sigSz = ENCRYPT_LEN;
34806
34807
                if (IsAtLeastTLSv1_2(ssl)) {
34808
                    ssl->buffers.sig.length = wc_EncodeSignature(
34809
                            ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
34810
                            ssl->buffers.digest.length,
34811
                            TypeHash(ssl->options.hashAlgo));
34812
                }
34813
34814
                /* prepend hdr */
34815
                c16toa((word16)args->length, args->verify + args->extraSz);
34816
            }
34817
            #ifdef WC_RSA_PSS
34818
            else if (args->sigAlgo == rsa_pss_sa_algo) {
34819
                XMEMCPY(ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
34820
                        ssl->buffers.digest.length);
34821
                ssl->buffers.sig.length = ssl->buffers.digest.length;
34822
                args->sigSz = ENCRYPT_LEN;
34823
34824
                /* prepend hdr */
34825
                c16toa((word16)args->length, args->verify + args->extraSz);
34826
            }
34827
            #endif
34828
        #endif /* !NO_RSA */
34829
        #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
34830
            if (args->sigAlgo == ed25519_sa_algo) {
34831
                ret = Ed25519CheckPubKey(ssl);
34832
                if (ret != 0)
34833
                    goto exit_scv;
34834
            }
34835
        #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
34836
        #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
34837
            if (args->sigAlgo == ed448_sa_algo) {
34838
                ret = Ed448CheckPubKey(ssl);
34839
                if (ret != 0)
34840
                    goto exit_scv;
34841
            }
34842
        #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
34843
34844
            /* Advance state and proceed */
34845
            ssl->options.asyncState = TLS_ASYNC_DO;
34846
        } /* case TLS_ASYNC_BUILD */
34847
        FALL_THROUGH;
34848
34849
        case TLS_ASYNC_DO:
34850
        {
34851
        #ifdef HAVE_ECC
34852
            if (ssl->hsType == DYNAMIC_TYPE_ECC) {
34853
                ecc_key* key = (ecc_key*)ssl->hsKey;
34854
34855
            #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
34856
                if (args->sigAlgo == sm2_sa_algo) {
34857
                    ret = Sm2wSm3Sign(ssl,
34858
                        TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ,
34859
                        ssl->hsHashes->messages, ssl->hsHashes->length,
34860
                        ssl->buffers.sig.buffer,
34861
                        (word32*)&ssl->buffers.sig.length,
34862
                        key,
34863
                #ifdef HAVE_PK_CALLBACKS
34864
                        ssl->buffers.key
34865
                #else
34866
                        NULL
34867
                #endif
34868
                    );
34869
                }
34870
                else
34871
            #endif
34872
                {
34873
                    ret = EccSign(ssl,
34874
                        ssl->buffers.digest.buffer, ssl->buffers.digest.length,
34875
                        ssl->buffers.sig.buffer,
34876
                        (word32*)&ssl->buffers.sig.length,
34877
                        key,
34878
                #ifdef HAVE_PK_CALLBACKS
34879
                        ssl->buffers.key
34880
                #else
34881
                        NULL
34882
                #endif
34883
                    );
34884
                }
34885
            }
34886
        #endif /* HAVE_ECC */
34887
        #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
34888
           if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
34889
                ed25519_key* key = (ed25519_key*)ssl->hsKey;
34890
34891
                ret = Ed25519Sign(ssl,
34892
                    ssl->hsHashes->messages, ssl->hsHashes->length,
34893
                    ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
34894
                    key,
34895
            #ifdef HAVE_PK_CALLBACKS
34896
                    ssl->buffers.key
34897
            #else
34898
                    NULL
34899
            #endif
34900
                );
34901
            }
34902
        #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
34903
        #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
34904
           if (ssl->hsType == DYNAMIC_TYPE_ED448) {
34905
                ed448_key* key = (ed448_key*)ssl->hsKey;
34906
34907
                ret = Ed448Sign(ssl,
34908
                    ssl->hsHashes->messages, ssl->hsHashes->length,
34909
                    ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
34910
                    key,
34911
            #ifdef HAVE_PK_CALLBACKS
34912
                    ssl->buffers.key
34913
            #else
34914
                    NULL
34915
            #endif
34916
                );
34917
            }
34918
        #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
34919
        #ifndef NO_RSA
34920
            if (ssl->hsType == DYNAMIC_TYPE_RSA) {
34921
                RsaKey* key = (RsaKey*)ssl->hsKey;
34922
34923
                /* restore verify pointer */
34924
                args->verify = &args->output[args->idx];
34925
34926
                ret = RsaSign(ssl,
34927
                    ssl->buffers.sig.buffer, ssl->buffers.sig.length,
34928
                    args->verify + args->extraSz + VERIFY_HEADER, &args->sigSz,
34929
                    args->sigAlgo, ssl->options.hashAlgo, key,
34930
                    ssl->buffers.key
34931
                );
34932
            }
34933
        #endif /* !NO_RSA */
34934
34935
            /* Check for error */
34936
            if (ret != 0) {
34937
                goto exit_scv;
34938
            }
34939
34940
            /* Advance state and proceed */
34941
            ssl->options.asyncState = TLS_ASYNC_VERIFY;
34942
        } /* case TLS_ASYNC_DO */
34943
        FALL_THROUGH;
34944
34945
        case TLS_ASYNC_VERIFY:
34946
        {
34947
            /* restore verify pointer */
34948
            args->verify = &args->output[args->idx];
34949
34950
            switch (ssl->hsType) {
34951
    #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
34952
        #ifdef HAVE_ECC
34953
                case DYNAMIC_TYPE_ECC:
34954
            #ifdef WOLFSSL_CHECK_SIG_FAULTS
34955
                {
34956
                    ecc_key* key = (ecc_key*)ssl->hsKey;
34957
34958
                #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
34959
                    if (ssl->buffers.keyType == sm2_sa_algo) {
34960
                    #ifdef HAVE_PK_CALLBACKS
34961
                        buffer tmp;
34962
34963
                        tmp.length = ssl->buffers.key->length;
34964
                        tmp.buffer = ssl->buffers.key->buffer;
34965
                    #endif
34966
34967
                        ret = Sm3wSm2Verify(ssl,
34968
                            TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ,
34969
                            ssl->buffers.sig.buffer, ssl->buffers.sig.length,
34970
                            ssl->buffers.digest.buffer,
34971
                            ssl->buffers.digest.length, key,
34972
                        #ifdef HAVE_PK_CALLBACKS
34973
                            &tmp
34974
                        #else
34975
                            NULL
34976
                        #endif
34977
                        );
34978
                    }
34979
                    else
34980
                #endif
34981
                    {
34982
                    #ifdef HAVE_PK_CALLBACKS
34983
                        buffer tmp;
34984
34985
                        tmp.length = ssl->buffers.key->length;
34986
                        tmp.buffer = ssl->buffers.key->buffer;
34987
                    #endif
34988
34989
                        ret = EccVerify(ssl,
34990
                            ssl->buffers.sig.buffer, ssl->buffers.sig.length,
34991
                            ssl->buffers.digest.buffer,
34992
                            ssl->buffers.digest.length, key,
34993
                        #ifdef HAVE_PK_CALLBACKS
34994
                            &tmp
34995
                        #else
34996
                            NULL
34997
                        #endif
34998
                        );
34999
                    }
35000
                    if (ret != 0) {
35001
                        WOLFSSL_MSG("Failed to verify ECC signature");
35002
                        goto exit_scv;
35003
                    }
35004
                }
35005
                #if defined(HAVE_ED25519) || defined(HAVE_ED448)
35006
                FALL_THROUGH;
35007
                #endif
35008
            #endif /* WOLFSSL_CHECK_SIG_FAULTS */
35009
        #endif /* HAVE_ECC */
35010
        #ifdef HAVE_ED25519
35011
                case DYNAMIC_TYPE_ED25519:
35012
        #endif
35013
        #ifdef HAVE_ED448
35014
                case DYNAMIC_TYPE_ED448:
35015
        #endif
35016
                    args->length = (word16)ssl->buffers.sig.length;
35017
                    /* prepend hdr */
35018
                    c16toa((word16)args->length, args->verify + args->extraSz);
35019
                    XMEMCPY(args->verify + args->extraSz + VERIFY_HEADER,
35020
                            ssl->buffers.sig.buffer, ssl->buffers.sig.length);
35021
                    break;
35022
    #endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
35023
            #ifndef NO_RSA
35024
                case DYNAMIC_TYPE_RSA:
35025
                {
35026
                    RsaKey* key = (RsaKey*)ssl->hsKey;
35027
35028
                    if (args->verifySig == NULL) {
35029
                        args->verifySig = (byte*)XMALLOC(args->sigSz, ssl->heap,
35030
                                          DYNAMIC_TYPE_SIGNATURE);
35031
                        if (args->verifySig == NULL) {
35032
                            ERROR_OUT(MEMORY_E, exit_scv);
35033
                        }
35034
                        XMEMCPY(args->verifySig, args->verify + args->extraSz +
35035
                                                    VERIFY_HEADER, args->sigSz);
35036
                    }
35037
35038
                    /* check for signature faults */
35039
                    ret = VerifyRsaSign(ssl,
35040
                        args->verifySig, args->sigSz,
35041
                        ssl->buffers.sig.buffer, ssl->buffers.sig.length,
35042
                        args->sigAlgo, ssl->options.hashAlgo, key,
35043
                        ssl->buffers.key
35044
                    );
35045
35046
                    /* free temporary buffer now */
35047
                    if (ret != WC_NO_ERR_TRACE(WC_PENDING_E)) {
35048
                        XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
35049
                        args->verifySig = NULL;
35050
                    }
35051
                    break;
35052
                }
35053
            #endif /* !NO_RSA */
35054
                default:
35055
                    break;
35056
            }
35057
35058
            /* Check for error */
35059
            if (ret != 0) {
35060
                goto exit_scv;
35061
            }
35062
35063
            /* Advance state and proceed */
35064
            ssl->options.asyncState = TLS_ASYNC_FINALIZE;
35065
        } /* case TLS_ASYNC_VERIFY */
35066
        FALL_THROUGH;
35067
35068
        case TLS_ASYNC_FINALIZE:
35069
        {
35070
            if (args->output == NULL) {
35071
                ERROR_OUT(BUFFER_ERROR, exit_scv);
35072
            }
35073
            AddHeaders(args->output, (word32)args->length + args->extraSz +
35074
                                        VERIFY_HEADER, certificate_verify, ssl);
35075
35076
            /* Advance state and proceed */
35077
            ssl->options.asyncState = TLS_ASYNC_END;
35078
        } /* case TLS_ASYNC_FINALIZE */
35079
        FALL_THROUGH;
35080
35081
        case TLS_ASYNC_END:
35082
        {
35083
            ret = SendHandshakeMsg(ssl, args->output,
35084
                (word32)args->length + args->extraSz + VERIFY_HEADER,
35085
                certificate_verify, "CertificateVerify");
35086
            if (ret != 0)
35087
                goto exit_scv;
35088
35089
            break;
35090
        }
35091
        default:
35092
            ret = INPUT_CASE_ERROR;
35093
    } /* switch(ssl->options.asyncState) */
35094
35095
exit_scv:
35096
#ifdef WOLFSSL_BLIND_PRIVATE_KEY
35097
    if (ret == 0) {
35098
        ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.key,
35099
            &ssl->buffers.keyMask);
35100
    }
35101
    else {
35102
        wolfssl_priv_der_unblind(ssl->buffers.key, ssl->buffers.keyMask);
35103
    }
35104
#endif
35105
35106
    WOLFSSL_LEAVE("SendCertificateVerify", ret);
35107
    WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_SEND);
35108
35109
#ifdef WOLFSSL_ASYNC_IO
35110
    /* Handle async operation */
35111
    if (ret == WC_NO_ERR_TRACE(WANT_WRITE)
35112
#ifdef WOLFSSL_ASYNC_CRYPT
35113
            || ret == WC_NO_ERR_TRACE(WC_PENDING_E)
35114
#endif
35115
            )
35116
        return ret;
35117
#endif /* WOLFSSL_ASYNC_IO */
35118
35119
    /* Digest is not allocated, so do this to prevent free */
35120
    if(ssl->buffers.digest.buffer) {
35121
        if (!ssl->options.dontFreeDigest) {
35122
            /*This should not happen*/
35123
            XFREE(ssl->buffers.digest.buffer,
35124
                ssl->heap, DYNAMIC_TYPE_DIGEST);
35125
        }
35126
    }
35127
    ssl->buffers.digest.buffer = NULL;
35128
    ssl->buffers.digest.length = 0;
35129
    ssl->options.dontFreeDigest = 0;
35130
35131
    /* Final cleanup */
35132
#ifdef WOLFSSL_ASYNC_IO
35133
    /* Cleanup async */
35134
    FreeAsyncCtx(ssl, 0);
35135
#else
35136
    FreeScvArgs(ssl, args);
35137
#endif
35138
    FreeKeyExchange(ssl);
35139
35140
    if (ret != 0) {
35141
        WOLFSSL_ERROR_VERBOSE(ret);
35142
    }
35143
35144
    return ret;
35145
}
35146
#endif /* WOLFSSL_NO_CLIENT_AUTH */
35147
35148
#endif /* WOLFSSL_NO_TLS12 */
35149
35150
#endif /* NO_CERTS */
35151
35152
35153
#ifdef HAVE_SESSION_TICKET
35154
int SetTicket(WOLFSSL* ssl, const byte* ticket, word32 length)
35155
{
35156
    if (!HaveUniqueSessionObj(ssl))
35157
        return MEMORY_ERROR;
35158
35159
    /* Free old dynamic ticket if we already had one */
35160
    if (ssl->session->ticketLenAlloc > 0) {
35161
        XFREE(ssl->session->ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
35162
        ssl->session->ticket = ssl->session->staticTicket;
35163
        ssl->session->ticketLenAlloc = 0;
35164
    }
35165
35166
    if (length > sizeof(ssl->session->staticTicket)) {
35167
        byte* sessionTicket =
35168
                   (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
35169
        if (sessionTicket == NULL)
35170
            return MEMORY_E;
35171
        ssl->session->ticket = sessionTicket;
35172
        ssl->session->ticketLenAlloc = (word16)length;
35173
    }
35174
    ssl->session->ticketLen = (word16)length;
35175
35176
    if (length > 0) {
35177
        XMEMCPY(ssl->session->ticket, ticket, length);
35178
        if (ssl->session_ticket_cb != NULL) {
35179
            ssl->session_ticket_cb(ssl,
35180
                                   ssl->session->ticket, ssl->session->ticketLen,
35181
                                   ssl->session_ticket_ctx);
35182
        }
35183
        /* Create a fake sessionID based on the ticket, this will
35184
         * supersede the existing session cache info. */
35185
        ssl->options.haveSessionId = 1;
35186
#ifdef WOLFSSL_TLS13
35187
        if (ssl->options.tls1_3) {
35188
            XMEMCPY(ssl->session->sessionID,
35189
                                 ssl->session->ticket + length - ID_LEN, ID_LEN);
35190
            ssl->session->sessionIDSz = ID_LEN;
35191
        }
35192
        else
35193
#endif
35194
        {
35195
            XMEMCPY(ssl->arrays->sessionID,
35196
                                 ssl->session->ticket + length - ID_LEN, ID_LEN);
35197
            ssl->arrays->sessionIDSz = ID_LEN;
35198
        }
35199
    }
35200
35201
    return 0;
35202
}
35203
35204
#ifndef WOLFSSL_NO_TLS12
35205
35206
/* handle processing of session_ticket (4) */
35207
static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
35208
    word32 size)
35209
{
35210
    word32 begin = *inOutIdx;
35211
    word32 lifetime;
35212
    word16 length;
35213
    int    ret;
35214
35215
    if (ssl->expect_session_ticket == 0) {
35216
        WOLFSSL_MSG("Unexpected session ticket");
35217
        WOLFSSL_ERROR_VERBOSE(SESSION_TICKET_EXPECT_E);
35218
        return SESSION_TICKET_EXPECT_E;
35219
    }
35220
35221
    if (OPAQUE32_LEN > size)
35222
        return BUFFER_ERROR;
35223
35224
    ato32(input + *inOutIdx, &lifetime);
35225
    *inOutIdx += OPAQUE32_LEN;
35226
35227
    if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
35228
        return BUFFER_ERROR;
35229
35230
    ato16(input + *inOutIdx, &length);
35231
    *inOutIdx += OPAQUE16_LEN;
35232
35233
    if ((*inOutIdx - begin) + length > size)
35234
        return BUFFER_ERROR;
35235
35236
    if ((ret = SetTicket(ssl, input + *inOutIdx, length)) != 0)
35237
        return ret;
35238
    *inOutIdx += length;
35239
    if (length > 0) {
35240
        ssl->timeout = lifetime;
35241
        SetupSession(ssl);
35242
#ifndef NO_SESSION_CACHE
35243
        AddSession(ssl);
35244
#endif
35245
    }
35246
35247
    if (IsEncryptionOn(ssl, 0))
35248
        *inOutIdx += ssl->keys.padSz;
35249
35250
    ssl->expect_session_ticket = 0;
35251
35252
    return 0;
35253
}
35254
35255
#endif /* !WOLFSSL_NO_TLS12 */
35256
35257
#endif /* HAVE_SESSION_TICKET */
35258
35259
#endif /* !NO_WOLFSSL_CLIENT && !NO_TLS */
35260
/* end client only parts */
35261
35262
35263
#ifndef NO_CERTS
35264
35265
#if defined(WOLF_PRIVATE_KEY_ID) || defined(HAVE_PK_CALLBACKS)
35266
    int GetPrivateKeySigSize(WOLFSSL* ssl)
35267
0
    {
35268
0
        int sigSz = 0;
35269
35270
0
        if (ssl == NULL)
35271
0
            return 0;
35272
35273
0
        switch (ssl->buffers.keyType) {
35274
0
        #ifndef NO_RSA
35275
0
        #ifdef WC_RSA_PSS
35276
0
            case rsa_pss_sa_algo:
35277
0
        #endif
35278
0
            case rsa_sa_algo:
35279
0
                sigSz = ssl->buffers.keySz;
35280
0
                ssl->hsType = DYNAMIC_TYPE_RSA;
35281
0
                break;
35282
0
        #endif
35283
0
        #ifdef HAVE_ECC
35284
0
            case ecc_dsa_sa_algo:
35285
0
                sigSz = wc_ecc_sig_size_calc(ssl->buffers.keySz);
35286
0
                ssl->hsType = DYNAMIC_TYPE_ECC;
35287
0
                break;
35288
0
        #endif
35289
0
        #ifdef HAVE_ED25519
35290
0
            case ed25519_sa_algo:
35291
0
                sigSz = ED25519_SIG_SIZE; /* fixed known value */
35292
0
                ssl->hsType = DYNAMIC_TYPE_ED25519;
35293
0
                break;
35294
0
        #endif
35295
0
        #ifdef HAVE_ED448
35296
0
            case ed448_sa_algo:
35297
0
                sigSz = ED448_SIG_SIZE; /* fixed known value */
35298
0
                ssl->hsType = DYNAMIC_TYPE_ED448;
35299
0
                break;
35300
0
        #endif
35301
0
            default:
35302
0
                break;
35303
0
        }
35304
0
        return sigSz;
35305
0
    }
35306
#endif /* WOLF_PRIVATE_KEY_ID || HAVE_PK_CALLBACKS */
35307
35308
#endif /* !NO_CERTS */
35309
35310
#ifdef HAVE_ECC
35311
    /* returns the WOLFSSL_* version of the curve from the OID sum */
35312
0
    word16 GetCurveByOID(int oidSum) {
35313
0
        switch(oidSum) {
35314
0
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
35315
0
        #ifndef NO_ECC_SECP
35316
0
            case ECC_SECP160R1_OID:
35317
0
                return WOLFSSL_ECC_SECP160R1;
35318
0
        #endif /* !NO_ECC_SECP */
35319
0
        #ifdef HAVE_ECC_SECPR2
35320
0
            case ECC_SECP160R2_OID:
35321
0
                return WOLFSSL_ECC_SECP160R2;
35322
0
        #endif /* HAVE_ECC_SECPR2 */
35323
0
        #ifdef HAVE_ECC_KOBLITZ
35324
0
            case ECC_SECP160K1_OID:
35325
0
                return WOLFSSL_ECC_SECP160K1;
35326
0
        #endif /* HAVE_ECC_KOBLITZ */
35327
0
    #endif
35328
0
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
35329
0
        #ifndef NO_ECC_SECP
35330
0
            case ECC_SECP192R1_OID:
35331
0
                return WOLFSSL_ECC_SECP192R1;
35332
0
        #endif /* !NO_ECC_SECP */
35333
0
        #ifdef HAVE_ECC_KOBLITZ
35334
0
            case ECC_SECP192K1_OID:
35335
0
                return WOLFSSL_ECC_SECP192K1;
35336
0
        #endif /* HAVE_ECC_KOBLITZ */
35337
0
    #endif
35338
0
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
35339
0
        #ifndef NO_ECC_SECP
35340
0
            case ECC_SECP224R1_OID:
35341
0
                return WOLFSSL_ECC_SECP224R1;
35342
0
        #endif /* !NO_ECC_SECP */
35343
0
        #ifdef HAVE_ECC_KOBLITZ
35344
0
            case ECC_SECP224K1_OID:
35345
0
                return WOLFSSL_ECC_SECP224K1;
35346
0
        #endif /* HAVE_ECC_KOBLITZ */
35347
0
    #endif
35348
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
35349
0
        #ifndef NO_ECC_SECP
35350
0
            case ECC_SECP256R1_OID:
35351
0
                return WOLFSSL_ECC_SECP256R1;
35352
0
        #endif /* !NO_ECC_SECP */
35353
0
        #ifdef HAVE_ECC_KOBLITZ
35354
0
            case ECC_SECP256K1_OID:
35355
0
                return WOLFSSL_ECC_SECP256K1;
35356
0
        #endif /* HAVE_ECC_KOBLITZ */
35357
0
        #ifdef HAVE_ECC_BRAINPOOL
35358
0
            case ECC_BRAINPOOLP256R1_OID:
35359
0
                return WOLFSSL_ECC_BRAINPOOLP256R1;
35360
0
        #endif /* HAVE_ECC_BRAINPOOL */
35361
0
        #ifdef WOLFSSL_SM2
35362
0
            case ECC_SM2P256V1_OID:
35363
0
                return WOLFSSL_ECC_SM2P256V1;
35364
0
        #endif /* WOLFSSL_SM2 */
35365
0
    #endif
35366
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
35367
0
        #ifndef NO_ECC_SECP
35368
0
            case ECC_SECP384R1_OID:
35369
0
                return WOLFSSL_ECC_SECP384R1;
35370
0
        #endif /* !NO_ECC_SECP */
35371
0
        #ifdef HAVE_ECC_BRAINPOOL
35372
0
            case ECC_BRAINPOOLP384R1_OID:
35373
0
                return WOLFSSL_ECC_BRAINPOOLP384R1;
35374
0
        #endif /* HAVE_ECC_BRAINPOOL */
35375
0
    #endif
35376
0
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
35377
0
        #ifdef HAVE_ECC_BRAINPOOL
35378
0
            case ECC_BRAINPOOLP512R1_OID:
35379
0
                return WOLFSSL_ECC_BRAINPOOLP512R1;
35380
0
        #endif /* HAVE_ECC_BRAINPOOL */
35381
0
    #endif
35382
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
35383
0
        #ifndef NO_ECC_SECP
35384
0
            case ECC_SECP521R1_OID:
35385
0
                return WOLFSSL_ECC_SECP521R1;
35386
0
        #endif /* !NO_ECC_SECP */
35387
0
    #endif
35388
0
            default:
35389
0
                WOLFSSL_MSG("Curve OID not compiled in or implemented");
35390
0
                return 0;
35391
0
        }
35392
0
    }
35393
#endif /* HAVE_ECC */
35394
35395
#ifdef WOLFSSL_HAVE_MLKEM
35396
    /* Returns 1 when the given group is a PQC group, 0 otherwise. */
35397
    int NamedGroupIsPqc(int group)
35398
    {
35399
        switch (group) {
35400
        #ifndef WOLFSSL_NO_ML_KEM
35401
            case WOLFSSL_ML_KEM_512:
35402
            case WOLFSSL_ML_KEM_768:
35403
            case WOLFSSL_ML_KEM_1024:
35404
        #endif
35405
        #ifdef WOLFSSL_MLKEM_KYBER
35406
            case WOLFSSL_KYBER_LEVEL1:
35407
            case WOLFSSL_KYBER_LEVEL3:
35408
            case WOLFSSL_KYBER_LEVEL5:
35409
        #endif
35410
                return 1;
35411
            default:
35412
                return 0;
35413
        }
35414
    }
35415
35416
    /* Returns 1 when the given group is a PQC hybrid group, 0 otherwise. */
35417
    int NamedGroupIsPqcHybrid(int group)
35418
    {
35419
        switch (group) {
35420
        #ifndef WOLFSSL_NO_ML_KEM
35421
            case WOLFSSL_P256_ML_KEM_768:
35422
            case WOLFSSL_X25519_ML_KEM_768:
35423
            case WOLFSSL_P384_ML_KEM_1024:
35424
            case WOLFSSL_P256_ML_KEM_512:
35425
            case WOLFSSL_P384_ML_KEM_768:
35426
            case WOLFSSL_P521_ML_KEM_1024:
35427
            case WOLFSSL_X25519_ML_KEM_512:
35428
            case WOLFSSL_X448_ML_KEM_768:
35429
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
35430
            case WOLFSSL_P256_ML_KEM_512_OLD:
35431
            case WOLFSSL_P384_ML_KEM_768_OLD:
35432
            case WOLFSSL_P521_ML_KEM_1024_OLD:
35433
#endif
35434
        #endif
35435
        #ifdef WOLFSSL_MLKEM_KYBER
35436
            case WOLFSSL_P256_KYBER_LEVEL3:
35437
            case WOLFSSL_X25519_KYBER_LEVEL3:
35438
            case WOLFSSL_P256_KYBER_LEVEL1:
35439
            case WOLFSSL_P384_KYBER_LEVEL3:
35440
            case WOLFSSL_P521_KYBER_LEVEL5:
35441
            case WOLFSSL_X25519_KYBER_LEVEL1:
35442
            case WOLFSSL_X448_KYBER_LEVEL3:
35443
        #endif
35444
                return 1;
35445
            default:
35446
                return 0;
35447
        }
35448
    }
35449
#endif /* WOLFSSL_HAVE_MLKEM */
35450
35451
    int TranslateErrorToAlert(int err)
35452
42.2k
    {
35453
42.2k
        switch (err) {
35454
21.9k
            case WC_NO_ERR_TRACE(BUFFER_ERROR):
35455
21.9k
                return decode_error;
35456
28
            case WC_NO_ERR_TRACE(EXT_NOT_ALLOWED):
35457
28
            case WC_NO_ERR_TRACE(PEER_KEY_ERROR):
35458
32
            case WC_NO_ERR_TRACE(ECC_PEERKEY_ERROR):
35459
80
            case WC_NO_ERR_TRACE(BAD_KEY_SHARE_DATA):
35460
93
            case WC_NO_ERR_TRACE(PSK_KEY_ERROR):
35461
209
            case WC_NO_ERR_TRACE(INVALID_PARAMETER):
35462
217
            case WC_NO_ERR_TRACE(HRR_COOKIE_ERROR):
35463
217
            case WC_NO_ERR_TRACE(BAD_BINDER):
35464
217
                return illegal_parameter;
35465
130
            case WC_NO_ERR_TRACE(INCOMPLETE_DATA):
35466
130
                return missing_extension;
35467
152
            case WC_NO_ERR_TRACE(MATCH_SUITE_ERROR):
35468
152
            case WC_NO_ERR_TRACE(MISSING_HANDSHAKE_DATA):
35469
152
                return handshake_failure;
35470
8.58k
            case WC_NO_ERR_TRACE(VERSION_ERROR):
35471
8.58k
                return wolfssl_alert_protocol_version;
35472
11.1k
            default:
35473
11.1k
                return invalid_alert;
35474
42.2k
        }
35475
42.2k
    }
35476
35477
    /* search suites for specific one, idx on success, negative on error */
35478
    int FindSuite(const Suites* suites, byte first, byte second)
35479
37.6k
    {
35480
37.6k
        int i;
35481
35482
37.6k
        if (suites == NULL || suites->suiteSz == 0) {
35483
1.37k
            WOLFSSL_MSG("Suites pointer error or suiteSz 0");
35484
1.37k
            return SUITES_ERROR;
35485
1.37k
        }
35486
35487
410k
        for (i = 0; i < suites->suiteSz-1; i += SUITE_LEN) {
35488
376k
            if (suites->suites[i]   == first &&
35489
376k
                suites->suites[i+1] == second )
35490
2.60k
                return i;
35491
376k
        }
35492
35493
33.6k
        return MATCH_SUITE_ERROR;
35494
36.2k
    }
35495
35496
#if !defined(NO_WOLFSSL_SERVER) && !defined(NO_TLS)
35497
35498
#ifndef WOLFSSL_NO_TLS12
35499
35500
    static int getSessionID(WOLFSSL* ssl)
35501
0
    {
35502
0
        int sessIdSz = 0;
35503
0
        (void)ssl;
35504
0
#ifndef NO_SESSION_CACHE
35505
        /* if no session cache don't send a session ID */
35506
0
        if (!ssl->options.sessionCacheOff)
35507
0
            sessIdSz = ID_LEN;
35508
0
#endif
35509
#ifdef HAVE_SESSION_TICKET
35510
        /* we may be echoing an ID as part of session tickets */
35511
        if (ssl->options.useTicket) {
35512
            /* echo session id sz can be 0,32 or bogus len in between */
35513
            sessIdSz = ssl->arrays->sessionIDSz;
35514
            if (sessIdSz > ID_LEN) {
35515
                WOLFSSL_MSG("Bad bogus session id len");
35516
                return BUFFER_ERROR;
35517
            }
35518
        }
35519
#endif /* HAVE_SESSION_TICKET */
35520
0
        return sessIdSz;
35521
0
    }
35522
35523
    /* handle generation of server_hello (2) */
35524
    int SendServerHello(WOLFSSL* ssl)
35525
0
    {
35526
0
        int    ret;
35527
0
        byte   *output;
35528
0
        word16 length;
35529
0
        word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
35530
0
        int    sendSz;
35531
0
        byte   sessIdSz;
35532
35533
0
        WOLFSSL_START(WC_FUNC_SERVER_HELLO_SEND);
35534
0
        WOLFSSL_ENTER("SendServerHello");
35535
35536
0
        ret = getSessionID(ssl);
35537
0
        if (ret < 0)
35538
0
            return ret;
35539
0
        sessIdSz = (byte)ret;
35540
35541
0
        length = VERSION_SZ + RAN_LEN
35542
0
               + ENUM_LEN + sessIdSz
35543
0
               + SUITE_LEN
35544
0
               + ENUM_LEN;
35545
35546
0
#ifdef HAVE_TLS_EXTENSIONS
35547
0
        ret = TLSX_GetResponseSize(ssl, server_hello, &length);
35548
0
        if (ret != 0)
35549
0
            return ret;
35550
#else
35551
        if (ssl->options.haveEMS) {
35552
            length += HELLO_EXT_SZ_SZ + HELLO_EXT_SZ;
35553
        }
35554
#endif
35555
35556
0
        sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
35557
        #ifdef WOLFSSL_DTLS
35558
        if (ssl->options.dtls) {
35559
            idx    += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
35560
            sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
35561
        }
35562
        #endif /* WOLFSSL_DTLS */
35563
35564
0
        if (IsEncryptionOn(ssl, 1))
35565
0
            sendSz += MAX_MSG_EXTRA;
35566
35567
        /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
35568
         * is not advanced yet */
35569
0
        ssl->options.buildingMsg = 1;
35570
35571
        /* check for available size */
35572
0
        if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
35573
0
            return ret;
35574
35575
        /* get output buffer */
35576
0
        output = GetOutputBuffer(ssl);
35577
0
        AddHeaders(output, length, server_hello, ssl);
35578
35579
        /* now write to output */
35580
        /* first version */
35581
0
        output[idx++] = (byte)ssl->version.major;
35582
0
        output[idx++] = (byte)ssl->version.minor;
35583
35584
        /* then random and session id */
35585
0
        if (!ssl->options.resuming) {
35586
0
            word32 genRanLen = RAN_LEN;
35587
35588
0
#ifdef WOLFSSL_TLS13
35589
0
            if (TLSv1_3_Capable(ssl)) {
35590
                /* TLS v1.3 capable server downgraded. */
35591
0
                XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
35592
0
                        tls13Downgrade, TLS13_DOWNGRADE_SZ);
35593
0
                output[idx + RAN_LEN - 1] = (byte)IsAtLeastTLSv1_2(ssl);
35594
0
                genRanLen -= TLS13_DOWNGRADE_SZ + 1;
35595
0
            }
35596
0
            else
35597
0
#endif
35598
0
            if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
35599
0
                ssl->ctx->method->version.minor == TLSv1_2_MINOR &&
35600
0
                (wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_2) == 0 &&
35601
0
                !IsAtLeastTLSv1_2(ssl)) {
35602
                /* TLS v1.2 capable server downgraded. */
35603
0
                XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
35604
0
                        tls13Downgrade, TLS13_DOWNGRADE_SZ);
35605
0
                output[idx + RAN_LEN - 1] = 0;
35606
0
                genRanLen -= TLS13_DOWNGRADE_SZ + 1;
35607
0
            }
35608
35609
            /* generate random part */
35610
0
            ret = wc_RNG_GenerateBlock(ssl->rng, output + idx, genRanLen);
35611
0
            if (ret != 0)
35612
0
                return ret;
35613
0
            XMEMCPY(ssl->arrays->serverRandom, output + idx, RAN_LEN);
35614
0
            idx += RAN_LEN;
35615
35616
            /* generate session id */
35617
0
            output[idx++] = sessIdSz;
35618
0
            ret = wc_RNG_GenerateBlock(ssl->rng, output + idx, sessIdSz);
35619
0
            if (ret != 0)
35620
0
                return ret;
35621
0
            XMEMCPY(ssl->arrays->sessionID, output + idx, sessIdSz);
35622
0
            ssl->arrays->sessionIDSz = sessIdSz;
35623
0
        }
35624
0
        else {
35625
            /* If resuming, use info from SSL */
35626
0
            XMEMCPY(output + idx, ssl->arrays->serverRandom, RAN_LEN);
35627
0
            idx += RAN_LEN;
35628
0
            output[idx++] = sessIdSz;
35629
0
            XMEMCPY(output + idx, ssl->arrays->sessionID, sessIdSz);
35630
0
        }
35631
0
        idx += sessIdSz;
35632
35633
#ifdef SHOW_SECRETS
35634
        {
35635
            int j;
35636
            printf("server random: ");
35637
            for (j = 0; j < RAN_LEN; j++)
35638
                printf("%02x", ssl->arrays->serverRandom[j]);
35639
            printf("\n");
35640
        }
35641
#endif
35642
35643
        /* then cipher suite */
35644
0
        output[idx++] = ssl->options.cipherSuite0;
35645
0
        output[idx++] = ssl->options.cipherSuite;
35646
35647
        /* then compression */
35648
0
        if (ssl->options.usingCompression)
35649
0
            output[idx++] = ZLIB_COMPRESSION;
35650
0
        else
35651
0
            output[idx++] = NO_COMPRESSION;
35652
35653
        /* last, extensions */
35654
0
#ifdef HAVE_TLS_EXTENSIONS
35655
0
        {
35656
0
            word16 offset = 0;
35657
0
            ret = TLSX_WriteResponse(ssl, output + idx, server_hello, &offset);
35658
0
            if (ret != 0)
35659
0
                return ret;
35660
0
            idx += offset;
35661
0
        }
35662
#else
35663
#ifdef HAVE_EXTENDED_MASTER
35664
        if (ssl->options.haveEMS) {
35665
            c16toa(HELLO_EXT_SZ, output + idx);
35666
            idx += HELLO_EXT_SZ_SZ;
35667
35668
            c16toa(HELLO_EXT_EXTMS, output + idx);
35669
            idx += HELLO_EXT_TYPE_SZ;
35670
            c16toa(0, output + idx);
35671
            /*idx += HELLO_EXT_SZ_SZ;*/
35672
            /* idx is not used after this point. uncomment the line above
35673
             * if adding any more extensions in the future. */
35674
        }
35675
#endif
35676
#endif
35677
35678
0
        if (IsEncryptionOn(ssl, 1)) {
35679
0
            byte* input;
35680
0
            int   inputSz = (int)idx; /* build msg adds rec hdr */
35681
0
            int   recordHeaderSz = RECORD_HEADER_SZ;
35682
35683
0
            if (ssl->options.dtls)
35684
0
                recordHeaderSz += DTLS_RECORD_EXTRA;
35685
0
            inputSz -= recordHeaderSz;
35686
0
            input = (byte*)XMALLOC((size_t)inputSz, ssl->heap,
35687
0
                    DYNAMIC_TYPE_IN_BUFFER);
35688
0
            if (input == NULL)
35689
0
                return MEMORY_E;
35690
35691
0
            XMEMCPY(input, output + recordHeaderSz, (size_t)(inputSz));
35692
            #ifdef WOLFSSL_DTLS
35693
            if (IsDtlsNotSctpMode(ssl) &&
35694
                    (ret = DtlsMsgPoolSave(ssl, input, (word32)inputSz, server_hello)) != 0) {
35695
                XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
35696
                return ret;
35697
            }
35698
            #endif
35699
0
            sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
35700
0
                                  handshake, 1, 0, 0, CUR_ORDER);
35701
0
            XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
35702
35703
0
            if (sendSz < 0)
35704
0
                return sendSz;
35705
0
        } else {
35706
            #ifdef WOLFSSL_DTLS
35707
                if (IsDtlsNotSctpMode(ssl)) {
35708
                    if ((ret = DtlsMsgPoolSave(ssl, output, (word32)sendSz, server_hello)) != 0)
35709
                        return ret;
35710
                }
35711
                if (ssl->options.dtls)
35712
                    DtlsSEQIncrement(ssl, CUR_ORDER);
35713
            #endif
35714
0
            ret = HashOutput(ssl, output, sendSz, 0);
35715
0
            if (ret != 0)
35716
0
                return ret;
35717
0
        }
35718
35719
    #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
35720
        if (ssl->hsInfoOn)
35721
            AddPacketName(ssl, "ServerHello");
35722
        if (ssl->toInfoOn) {
35723
            ret = AddPacketInfo(ssl, "ServerHello", handshake, output, sendSz,
35724
                          WRITE_PROTO, 0, ssl->heap);
35725
            if (ret != 0)
35726
                return ret;
35727
        }
35728
    #endif
35729
35730
0
        ssl->options.serverState = SERVER_HELLO_COMPLETE;
35731
0
        ssl->options.buildingMsg = 0;
35732
0
        ssl->buffers.outputBuffer.length += (word32)sendSz;
35733
35734
0
        if (ssl->options.groupMessages)
35735
0
            ret = 0;
35736
0
        else
35737
0
            ret = SendBuffered(ssl);
35738
35739
0
        WOLFSSL_LEAVE("SendServerHello", ret);
35740
0
        WOLFSSL_END(WC_FUNC_SERVER_HELLO_SEND);
35741
35742
0
        return ret;
35743
0
    }
35744
35745
35746
#if defined(HAVE_ECC)
35747
35748
    static byte SetCurveId(ecc_key* key)
35749
5.14k
    {
35750
5.14k
        if (key == NULL || key->dp == NULL) {
35751
0
            WOLFSSL_MSG("SetCurveId: Invalid key!");
35752
0
            return 0;
35753
0
        }
35754
35755
5.14k
        return (byte)GetCurveByOID((int)key->dp->oidSum);
35756
5.14k
    }
35757
35758
#endif /* HAVE_ECC */
35759
35760
    typedef struct SskeArgs {
35761
        byte*  output; /* not allocated */
35762
    #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
35763
        byte*  exportBuf;
35764
    #endif
35765
    #ifndef NO_RSA
35766
        byte*  verifySig;
35767
    #endif
35768
        byte*  input;
35769
        word32 idx;
35770
        word32 tmpSigSz;
35771
        word32 length;
35772
        word32 sigSz;
35773
    #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
35774
                                                                !defined(NO_RSA)
35775
        word32 sigDataSz;
35776
    #endif
35777
    #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
35778
        word32 exportSz;
35779
    #endif
35780
        word32 sendSz;
35781
        int    inputSz;
35782
    } SskeArgs;
35783
35784
    static void FreeSskeArgs(WOLFSSL* ssl, void* pArgs)
35785
9.45k
    {
35786
9.45k
        SskeArgs* args = (SskeArgs*)pArgs;
35787
35788
9.45k
        (void)ssl;
35789
35790
9.45k
        if (args == NULL)
35791
0
            return;
35792
35793
9.45k
    #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
35794
9.45k
        XFREE(args->exportBuf, ssl->heap, DYNAMIC_TYPE_DER);
35795
9.45k
        args->exportBuf = NULL;
35796
9.45k
    #endif
35797
9.45k
    #ifndef NO_RSA
35798
9.45k
        XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
35799
9.45k
        args->verifySig = NULL;
35800
9.45k
    #endif
35801
35802
9.45k
        if (args->input != NULL) {
35803
0
            XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
35804
0
            args->input = NULL;
35805
0
        }
35806
9.45k
    }
35807
35808
    /* handle generation of server_key_exchange (12) */
35809
    int SendServerKeyExchange(WOLFSSL* ssl)
35810
    {
35811
        int ret = 0;
35812
    #ifdef WOLFSSL_ASYNC_IO
35813
        SskeArgs* args = NULL;
35814
        WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
35815
    #else
35816
        SskeArgs  args[1];
35817
    #endif
35818
35819
        WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
35820
        WOLFSSL_ENTER("SendServerKeyExchange");
35821
35822
    #ifdef WOLFSSL_BLIND_PRIVATE_KEY
35823
        wolfssl_priv_der_unblind(ssl->buffers.key, ssl->buffers.keyMask);
35824
    #endif
35825
35826
    #ifdef WOLFSSL_ASYNC_IO
35827
        if (ssl->async == NULL) {
35828
            ssl->async = (struct WOLFSSL_ASYNC*)
35829
                    XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
35830
                            DYNAMIC_TYPE_ASYNC);
35831
            if (ssl->async == NULL)
35832
                ERROR_OUT(MEMORY_E, exit_sske);
35833
            XMEMSET(ssl->async, 0, sizeof(struct WOLFSSL_ASYNC));
35834
        }
35835
        args = (SskeArgs*)ssl->async->args;
35836
    #ifdef WOLFSSL_ASYNC_CRYPT
35837
        ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
35838
        if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
35839
            /* Check for error */
35840
            if (ret < 0)
35841
                goto exit_sske;
35842
        }
35843
        else
35844
    #endif
35845
        if (ssl->options.buildingMsg) {
35846
            /* We should be in the sending state. */
35847
            if (ssl->options.asyncState != TLS_ASYNC_END) {
35848
                ret = BAD_STATE_E;
35849
                goto exit_sske;
35850
            }
35851
        }
35852
        else
35853
    #endif
35854
        {
35855
            /* Reset state */
35856
            ret = 0;
35857
            ssl->options.asyncState = TLS_ASYNC_BEGIN;
35858
            XMEMSET(args, 0, sizeof(SskeArgs));
35859
        #ifdef WOLFSSL_ASYNC_IO
35860
            ssl->async->freeArgs = FreeSskeArgs;
35861
        #endif
35862
        }
35863
35864
        switch(ssl->options.asyncState)
35865
        {
35866
            case TLS_ASYNC_BEGIN:
35867
            {
35868
                /* Do some checks / debug msgs */
35869
                switch(ssl->specs.kea)
35870
                {
35871
                #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
35872
                                     defined(HAVE_CURVE448)) && !defined(NO_PSK)
35873
                    case ecdhe_psk_kea:
35874
                    {
35875
                        WOLFSSL_MSG("Using ephemeral ECDH PSK");
35876
                        break;
35877
                    }
35878
                #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
35879
                #if defined(HAVE_ECC)
35880
                    case ecc_diffie_hellman_kea:
35881
                    {
35882
                        if (ssl->specs.static_ecdh) {
35883
                            WOLFSSL_MSG("Using Static ECDH, not sending "
35884
                                        "ServerKeyExchange");
35885
                            ERROR_OUT(0, exit_sske);
35886
                        }
35887
35888
                        WOLFSSL_MSG("Using ephemeral ECDH");
35889
                        break;
35890
                    }
35891
                #endif /* HAVE_ECC */
35892
                }
35893
35894
                /* Preparing keys */
35895
                switch(ssl->specs.kea)
35896
                {
35897
                #ifndef NO_PSK
35898
                    case psk_kea:
35899
                    {
35900
                        /* Nothing to do in this sub-state */
35901
                        break;
35902
                    }
35903
                #endif /* !NO_PSK */
35904
                #if !defined(NO_DH) && (!defined(NO_PSK) || !defined(NO_RSA) \
35905
                          || (defined(HAVE_ANON) && !defined(WOLFSSL_NO_TLS12)))
35906
                #if !defined(NO_PSK)
35907
                    case dhe_psk_kea:
35908
                #endif
35909
                #if !defined(NO_RSA) || (defined(HAVE_ANON) && \
35910
                                         !defined(WOLFSSL_NO_TLS12))
35911
                    case diffie_hellman_kea:
35912
                #endif
35913
#if (defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)) && !defined(HAVE_PUBLIC_FFDHE)
35914
                    if (ssl->namedGroup) {
35915
                        word32 pSz = 0;
35916
35917
                        ret = wc_DhGetNamedKeyParamSize(ssl->namedGroup, &pSz,
35918
                                NULL, NULL);
35919
                        if (ret != 0)
35920
                            goto exit_sske;
35921
35922
                        if (ssl->buffers.serverDH_Pub.buffer == NULL) {
35923
                            /* Free'd in wolfSSL_ResourceFree and
35924
                             * FreeHandshakeResources */
35925
                            ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
35926
                                    pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
35927
                            if (ssl->buffers.serverDH_Pub.buffer == NULL) {
35928
                                ERROR_OUT(MEMORY_E, exit_sske);
35929
                            }
35930
                            ssl->buffers.serverDH_Pub.length = pSz;
35931
                        }
35932
                        ssl->options.dhKeySz =(word16)pSz;
35933
35934
                        pSz = wc_DhGetNamedKeyMinSize(ssl->namedGroup);
35935
35936
                        if (ssl->buffers.serverDH_Priv.buffer == NULL) {
35937
                            /* Free'd in wolfSSL_ResourceFree and
35938
                             * FreeHandshakeResources */
35939
                            ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
35940
                                    pSz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
35941
                            if (ssl->buffers.serverDH_Priv.buffer == NULL) {
35942
                                ERROR_OUT(MEMORY_E, exit_sske);
35943
                            }
35944
                            ssl->buffers.serverDH_Priv.length = pSz;
35945
                        }
35946
35947
                        ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
35948
                                            (void**)&ssl->buffers.serverDH_Key);
35949
                        if (ret != 0) {
35950
                            goto exit_sske;
35951
                        }
35952
35953
                        ret = wc_DhSetNamedKey(ssl->buffers.serverDH_Key,
35954
                                ssl->namedGroup);
35955
                        if (ret != 0) {
35956
                            goto exit_sske;
35957
                        }
35958
    #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
35959
        !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
35960
                        ssl->options.dhKeyTested = 1;
35961
    #endif
35962
35963
                #ifdef HAVE_SECURE_RENEGOTIATION
35964
                        /* Check that the DH public key buffer is large
35965
                         * enough to hold the key. This may occur on a
35966
                         * renegotiation when the key generated in the
35967
                         * initial handshake is shorter than the key
35968
                         * generated in the renegotiation. */
35969
                        if (ssl->buffers.serverDH_Pub.length <
35970
                                ssl->buffers.serverDH_P.length) {
35971
                            byte* tmp = (byte*)XREALLOC(
35972
                                    ssl->buffers.serverDH_Pub.buffer,
35973
                                    ssl->buffers.serverDH_P.length +
35974
                                        OPAQUE16_LEN,
35975
                                    ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
35976
                            if (tmp == NULL)
35977
                                ERROR_OUT(MEMORY_E, exit_sske);
35978
                            ssl->buffers.serverDH_Pub.buffer = tmp;
35979
                            ssl->buffers.serverDH_Pub.length =
35980
                                ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
35981
                        }
35982
                #endif
35983
35984
                        ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
35985
                            ssl->buffers.serverDH_Priv.buffer,
35986
                            (word32*)&ssl->buffers.serverDH_Priv.length,
35987
                            ssl->buffers.serverDH_Pub.buffer,
35988
                            (word32*)&ssl->buffers.serverDH_Pub.length);
35989
                    #ifdef WOLFSSL_CHECK_MEM_ZERO
35990
                        wc_MemZero_Add("DH private key buffer",
35991
                            ssl->buffers.serverDH_Priv.buffer,
35992
                            ssl->buffers.serverDH_Priv.length);
35993
                    #endif
35994
                        break;
35995
                    }
35996
                    else
35997
#endif
35998
                    {
35999
                        /* Allocate DH key buffers and generate key */
36000
                        if (ssl->buffers.serverDH_P.buffer == NULL ||
36001
                            ssl->buffers.serverDH_G.buffer == NULL) {
36002
                            ERROR_OUT(NO_DH_PARAMS, exit_sske);
36003
                        }
36004
36005
                        if (ssl->buffers.serverDH_Pub.buffer == NULL) {
36006
                            /* Free'd in wolfSSL_ResourceFree
36007
                             * and FreeHandshakeResources
36008
                             */
36009
                            ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
36010
                                    ssl->buffers.serverDH_P.length,
36011
                                    ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
36012
                            if (ssl->buffers.serverDH_Pub.buffer == NULL) {
36013
                                ERROR_OUT(MEMORY_E, exit_sske);
36014
                            }
36015
                            ssl->buffers.serverDH_Pub.length =
36016
                                ssl->buffers.serverDH_P.length;
36017
                        }
36018
36019
                        if (ssl->buffers.serverDH_Priv.buffer == NULL) {
36020
                            /* Free'd in wolfSSL_ResourceFree
36021
                             * and FreeHandshakeResources
36022
                             */
36023
                            ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
36024
                                    ssl->buffers.serverDH_P.length,
36025
                                    ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
36026
                            if (ssl->buffers.serverDH_Priv.buffer == NULL) {
36027
                                ERROR_OUT(MEMORY_E, exit_sske);
36028
                            }
36029
                            ssl->buffers.serverDH_Priv.length =
36030
                                ssl->buffers.serverDH_P.length;
36031
                        }
36032
36033
                        ssl->options.dhKeySz =
36034
                                (word16)ssl->buffers.serverDH_P.length;
36035
36036
                        ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
36037
                                            (void**)&ssl->buffers.serverDH_Key);
36038
                        if (ret != 0) {
36039
                            goto exit_sske;
36040
                        }
36041
36042
                        #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
36043
                            !defined(HAVE_FIPS) && \
36044
                            !defined(HAVE_SELFTEST)
36045
                        if (ssl->options.dhDoKeyTest &&
36046
                            !ssl->options.dhKeyTested)
36047
                        {
36048
                            ret = wc_DhSetCheckKey(
36049
                                ssl->buffers.serverDH_Key,
36050
                                ssl->buffers.serverDH_P.buffer,
36051
                                ssl->buffers.serverDH_P.length,
36052
                                ssl->buffers.serverDH_G.buffer,
36053
                                ssl->buffers.serverDH_G.length,
36054
                                NULL, 0, 0, ssl->rng);
36055
                            if (ret != 0) {
36056
                                goto exit_sske;
36057
                            }
36058
                            ssl->options.dhKeyTested = 1;
36059
                        }
36060
                        else
36061
                        #endif
36062
                        {
36063
                            ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
36064
                                ssl->buffers.serverDH_P.buffer,
36065
                                ssl->buffers.serverDH_P.length,
36066
                                ssl->buffers.serverDH_G.buffer,
36067
                                ssl->buffers.serverDH_G.length);
36068
                            if (ret != 0) {
36069
                                goto exit_sske;
36070
                            }
36071
                        }
36072
36073
                #ifdef HAVE_SECURE_RENEGOTIATION
36074
                        /* Check that the DH public key buffer is large
36075
                         * enough to hold the key. This may occur on a
36076
                         * renegotiation when the key generated in the
36077
                         * initial handshake is shorter than the key
36078
                         * generated in the renegotiation. */
36079
                        if (ssl->buffers.serverDH_Pub.length <
36080
                                ssl->buffers.serverDH_P.length) {
36081
                            byte* tmp = (byte*)XREALLOC(
36082
                                    ssl->buffers.serverDH_Pub.buffer,
36083
                                    ssl->buffers.serverDH_P.length +
36084
                                        OPAQUE16_LEN,
36085
                                    ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
36086
                            if (tmp == NULL)
36087
                                ERROR_OUT(MEMORY_E, exit_sske);
36088
                            ssl->buffers.serverDH_Pub.buffer = tmp;
36089
                            ssl->buffers.serverDH_Pub.length =
36090
                                ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
36091
                        }
36092
                #endif
36093
                        ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
36094
                            ssl->buffers.serverDH_Priv.buffer,
36095
                            (word32*)&ssl->buffers.serverDH_Priv.length,
36096
                            ssl->buffers.serverDH_Pub.buffer,
36097
                            (word32*)&ssl->buffers.serverDH_Pub.length);
36098
                    #ifdef WOLFSSL_CHECK_MEM_ZERO
36099
                        wc_MemZero_Add("DH private key buffer",
36100
                            ssl->buffers.serverDH_Priv.buffer,
36101
                            ssl->buffers.serverDH_Priv.length);
36102
                    #endif
36103
                        break;
36104
                    }
36105
                #endif /* !NO_DH && (!NO_PSK || !NO_RSA) */
36106
                #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
36107
                                     defined(HAVE_CURVE448)) && !defined(NO_PSK)
36108
                    case ecdhe_psk_kea:
36109
                        /* Fall through to create temp ECC key */
36110
                #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
36111
                #if defined(HAVE_ECC) || \
36112
                    ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
36113
                     (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
36114
                      !defined(NO_RSA)))
36115
                    case ecc_diffie_hellman_kea:
36116
                    {
36117
                    #ifdef HAVE_CURVE25519
36118
                        if (ssl->ecdhCurveOID == ECC_X25519_OID) {
36119
                            /* need ephemeral key now, create it if missing */
36120
                            if (ssl->eccTempKey == NULL) {
36121
                                /* alloc/init on demand */
36122
                                ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
36123
                                    (void**)&ssl->eccTempKey);
36124
                                if (ret != 0) {
36125
                                    goto exit_sske;
36126
                                }
36127
                            }
36128
36129
                            if (ssl->eccTempKeyPresent == 0) {
36130
                                ret = X25519MakeKey(ssl,
36131
                                        (curve25519_key*)ssl->eccTempKey, NULL);
36132
                                if (ret == 0 ||
36133
                                    ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
36134
                                    ssl->eccTempKeyPresent =
36135
                                        DYNAMIC_TYPE_CURVE25519;
36136
                                }
36137
                                else {
36138
                                    FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
36139
                                    (void**)&ssl->eccTempKey);
36140
                                }
36141
                            }
36142
                            break;
36143
                        }
36144
                    #endif
36145
                    #ifdef HAVE_CURVE448
36146
                        if (ssl->ecdhCurveOID == ECC_X448_OID) {
36147
                            /* need ephemeral key now, create it if missing */
36148
                            if (ssl->eccTempKey == NULL) {
36149
                                /* alloc/init on demand */
36150
                                ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
36151
                                    (void**)&ssl->eccTempKey);
36152
                                if (ret != 0) {
36153
                                    goto exit_sske;
36154
                                }
36155
                            }
36156
36157
                            if (ssl->eccTempKeyPresent == 0) {
36158
                                ret = X448MakeKey(ssl,
36159
                                          (curve448_key*)ssl->eccTempKey, NULL);
36160
                                if (ret == 0 ||
36161
                                    ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
36162
                                    ssl->eccTempKeyPresent =
36163
                                        DYNAMIC_TYPE_CURVE448;
36164
                                }
36165
                                else {
36166
                                    FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
36167
                                    (void**)&ssl->eccTempKey);
36168
                                }
36169
                            }
36170
                            break;
36171
                        }
36172
                    #endif
36173
                    #ifdef HAVE_ECC
36174
                        /* need ephemeral key now, create it if missing */
36175
                        if (ssl->eccTempKey == NULL) {
36176
                            /* alloc/init on demand */
36177
                            ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
36178
                                (void**)&ssl->eccTempKey);
36179
                            if (ret != 0) {
36180
                                goto exit_sske;
36181
                            }
36182
                        }
36183
36184
                        if (ssl->eccTempKeyPresent == 0) {
36185
                            ret = EccMakeKey(ssl, ssl->eccTempKey, NULL);
36186
                            if (ret == 0 ||
36187
                                ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
36188
                                ssl->eccTempKeyPresent = DYNAMIC_TYPE_ECC;
36189
                            }
36190
                        }
36191
                    #endif
36192
                        break;
36193
                    }
36194
                #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
36195
                    default:
36196
                        /* Skip ServerKeyExchange */
36197
                        goto exit_sske;
36198
                } /* switch(ssl->specs.kea) */
36199
36200
                /* Check for error */
36201
                if (ret != 0) {
36202
                    goto exit_sske;
36203
                }
36204
36205
                /* Advance state and proceed */
36206
                ssl->options.asyncState = TLS_ASYNC_BUILD;
36207
            } /* case TLS_ASYNC_BEGIN */
36208
            FALL_THROUGH;
36209
36210
            case TLS_ASYNC_BUILD:
36211
            {
36212
                switch(ssl->specs.kea)
36213
                {
36214
                #ifndef NO_PSK
36215
                    case psk_kea:
36216
                    {
36217
                        args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
36218
36219
                        if (ssl->arrays->server_hint[0] == 0) {
36220
                            ERROR_OUT(0, exit_sske); /* don't send */
36221
                        }
36222
36223
                        /* include size part */
36224
                        args->length = (word32)XSTRLEN(ssl->arrays->server_hint);
36225
                        if (args->length > MAX_PSK_ID_LEN) {
36226
                            ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
36227
                        }
36228
36229
                        args->length += HINT_LEN_SZ;
36230
                        args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
36231
                                                            RECORD_HEADER_SZ;
36232
36233
                    #ifdef WOLFSSL_DTLS
36234
                        if (ssl->options.dtls) {
36235
                            args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
36236
                            args->idx    += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
36237
                        }
36238
                    #endif
36239
36240
                        if (IsEncryptionOn(ssl, 1)) {
36241
                            args->sendSz += MAX_MSG_EXTRA;
36242
                        }
36243
36244
                        /* Use tmp buffer */
36245
                        args->input = (byte*)XMALLOC(args->sendSz,
36246
                                ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
36247
                        if (args->input == NULL)
36248
                            ERROR_OUT(MEMORY_E, exit_sske);
36249
                        args->output = args->input;
36250
36251
                        AddHeaders(args->output, args->length,
36252
                                                    server_key_exchange, ssl);
36253
36254
                        /* key data */
36255
                        c16toa((word16)(args->length - HINT_LEN_SZ),
36256
                                                      args->output + args->idx);
36257
36258
                        args->idx += HINT_LEN_SZ;
36259
                        XMEMCPY(args->output + args->idx,
36260
                                ssl->arrays->server_hint,
36261
                                args->length - HINT_LEN_SZ);
36262
                        break;
36263
                    }
36264
                #endif /* !NO_PSK */
36265
                #if !defined(NO_DH) && !defined(NO_PSK)
36266
                    case dhe_psk_kea:
36267
                    {
36268
                        word32 hintLen;
36269
36270
                        args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
36271
                        args->length = LENGTH_SZ * 3 + /* p, g, pub */
36272
                                 ssl->buffers.serverDH_P.length +
36273
                                 ssl->buffers.serverDH_G.length +
36274
                                 ssl->buffers.serverDH_Pub.length;
36275
36276
                        /* include size part */
36277
                        hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
36278
                        if (hintLen > MAX_PSK_ID_LEN) {
36279
                            ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
36280
                        }
36281
                        args->length += hintLen + HINT_LEN_SZ;
36282
                        args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
36283
                                                            RECORD_HEADER_SZ;
36284
36285
                    #ifdef WOLFSSL_DTLS
36286
                        if (ssl->options.dtls) {
36287
                            args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
36288
                            args->idx    += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
36289
                        }
36290
                    #endif
36291
36292
                        if (IsEncryptionOn(ssl, 1)) {
36293
                            args->sendSz += MAX_MSG_EXTRA;
36294
                        }
36295
36296
                        /* Use tmp buffer */
36297
                        args->input = (byte*)XMALLOC(args->sendSz,
36298
                                ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
36299
                        if (args->input == NULL)
36300
                            ERROR_OUT(MEMORY_E, exit_sske);
36301
                        args->output = args->input;
36302
36303
                        AddHeaders(args->output, args->length,
36304
                                                    server_key_exchange, ssl);
36305
36306
                        /* key data */
36307
                        c16toa((word16)hintLen, args->output + args->idx);
36308
                        args->idx += HINT_LEN_SZ;
36309
                        XMEMCPY(args->output + args->idx,
36310
                                            ssl->arrays->server_hint, hintLen);
36311
                        args->idx += hintLen;
36312
36313
                        /* add p, g, pub */
36314
                        c16toa((word16)ssl->buffers.serverDH_P.length,
36315
                            args->output + args->idx);
36316
                        args->idx += LENGTH_SZ;
36317
                        XMEMCPY(args->output + args->idx,
36318
                                ssl->buffers.serverDH_P.buffer,
36319
                                ssl->buffers.serverDH_P.length);
36320
                        args->idx += ssl->buffers.serverDH_P.length;
36321
36322
                        /*  g */
36323
                        c16toa((word16)ssl->buffers.serverDH_G.length,
36324
                            args->output + args->idx);
36325
                        args->idx += LENGTH_SZ;
36326
                        XMEMCPY(args->output + args->idx,
36327
                                ssl->buffers.serverDH_G.buffer,
36328
                                ssl->buffers.serverDH_G.length);
36329
                        args->idx += ssl->buffers.serverDH_G.length;
36330
36331
                        /*  pub */
36332
                        c16toa((word16)ssl->buffers.serverDH_Pub.length,
36333
                            args->output + args->idx);
36334
                        args->idx += LENGTH_SZ;
36335
                        XMEMCPY(args->output + args->idx,
36336
                                ssl->buffers.serverDH_Pub.buffer,
36337
                                ssl->buffers.serverDH_Pub.length);
36338
                        /* No need to update idx, since sizes are already set */
36339
                        /* args->idx += ssl->buffers.serverDH_Pub.length; */
36340
                        break;
36341
                    }
36342
                #endif /* !defined(NO_DH) && !defined(NO_PSK) */
36343
                #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
36344
                                     defined(HAVE_CURVE448)) && !defined(NO_PSK)
36345
                    case ecdhe_psk_kea:
36346
                    {
36347
                        word32 hintLen;
36348
36349
                        /* curve type, named curve, length(1) */
36350
                        args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
36351
                        args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
36352
36353
                        args->exportSz = MAX_EXPORT_ECC_SZ;
36354
                        args->exportBuf = (byte*)XMALLOC(MAX_EXPORT_ECC_SZ,
36355
                                            ssl->heap, DYNAMIC_TYPE_DER);
36356
                        if (args->exportBuf == NULL) {
36357
                            ERROR_OUT(MEMORY_E, exit_sske);
36358
                        }
36359
                    #ifdef HAVE_CURVE25519
36360
                        if (ssl->ecdhCurveOID == ECC_X25519_OID) {
36361
                            if (wc_curve25519_export_public_ex(
36362
                                    (curve25519_key*)ssl->eccTempKey,
36363
                                    args->exportBuf, &args->exportSz,
36364
                                    EC25519_LITTLE_ENDIAN) != 0) {
36365
                                ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
36366
                            }
36367
                        }
36368
                        else
36369
                    #endif
36370
                    #ifdef HAVE_CURVE448
36371
                        if (ssl->ecdhCurveOID == ECC_X448_OID) {
36372
                            if (wc_curve448_export_public_ex(
36373
                                    (curve448_key*)ssl->eccTempKey,
36374
                                    args->exportBuf, &args->exportSz,
36375
                                    EC448_LITTLE_ENDIAN) != 0) {
36376
                                ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
36377
                            }
36378
                        }
36379
                        else
36380
                    #endif
36381
                        {
36382
                            PRIVATE_KEY_UNLOCK();
36383
                            ret = wc_ecc_export_x963(ssl->eccTempKey,
36384
                                       args->exportBuf, &args->exportSz);
36385
                            PRIVATE_KEY_LOCK();
36386
                            if (ret != 0) {
36387
                                ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
36388
                            }
36389
                        }
36390
                        args->length += args->exportSz;
36391
36392
                        /* include size part */
36393
                        hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
36394
                        if (hintLen > MAX_PSK_ID_LEN) {
36395
                            ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
36396
                        }
36397
                        args->length += hintLen + HINT_LEN_SZ;
36398
                        args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
36399
36400
                    #ifdef WOLFSSL_DTLS
36401
                        if (ssl->options.dtls) {
36402
                            args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
36403
                            args->idx    += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
36404
                        }
36405
                    #endif
36406
36407
                        if (IsEncryptionOn(ssl, 1)) {
36408
                            args->sendSz += MAX_MSG_EXTRA;
36409
                        }
36410
36411
                        /* Use tmp buffer */
36412
                        args->input = (byte*)XMALLOC(args->sendSz,
36413
                                ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
36414
                        if (args->input == NULL)
36415
                            ERROR_OUT(MEMORY_E, exit_sske);
36416
                        args->output = args->input;
36417
36418
                        /* key data */
36419
                        c16toa((word16)hintLen, args->output + args->idx);
36420
                        args->idx += HINT_LEN_SZ;
36421
                        XMEMCPY(args->output + args->idx,
36422
                                            ssl->arrays->server_hint, hintLen);
36423
                        args->idx += hintLen;
36424
36425
                        /* ECC key exchange data */
36426
                        args->output[args->idx++] = named_curve;
36427
                        args->output[args->idx++] = 0x00;          /* leading zero */
36428
                    #ifdef HAVE_CURVE25519
36429
                        if (ssl->ecdhCurveOID == ECC_X25519_OID)
36430
                            args->output[args->idx++] = WOLFSSL_ECC_X25519;
36431
                        else
36432
                    #endif
36433
                    #ifdef HAVE_CURVE448
36434
                        if (ssl->ecdhCurveOID == ECC_X448_OID)
36435
                            args->output[args->idx++] = WOLFSSL_ECC_X448;
36436
                        else
36437
                    #endif
36438
                        {
36439
                    #ifdef HAVE_ECC
36440
                            args->output[args->idx++] =
36441
                                                    SetCurveId(ssl->eccTempKey);
36442
                    #endif
36443
                        }
36444
                        args->output[args->idx++] = (byte)args->exportSz;
36445
                        XMEMCPY(args->output + args->idx, args->exportBuf,
36446
                                                                args->exportSz);
36447
                        break;
36448
                    }
36449
                #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
36450
                #if defined(HAVE_ECC) || \
36451
                    ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
36452
                     (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
36453
                      !defined(NO_RSA)))
36454
                    case ecc_diffie_hellman_kea:
36455
                    {
36456
                        enum wc_HashType hashType;
36457
                        word32 preSigSz, preSigIdx;
36458
36459
                        /* curve type, named curve, length(1) */
36460
                        args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
36461
                        args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
36462
36463
                        /* Export temp ECC key and add to length */
36464
                        args->exportSz = MAX_EXPORT_ECC_SZ;
36465
                        args->exportBuf = (byte*)XMALLOC(MAX_EXPORT_ECC_SZ,
36466
                                            ssl->heap, DYNAMIC_TYPE_DER);
36467
                        if (args->exportBuf == NULL) {
36468
                            ERROR_OUT(MEMORY_E, exit_sske);
36469
                        }
36470
                    #ifdef HAVE_CURVE25519
36471
                        if (ssl->ecdhCurveOID == ECC_X25519_OID) {
36472
                            if (wc_curve25519_export_public_ex(
36473
                                        (curve25519_key*)ssl->eccTempKey,
36474
                                        args->exportBuf, &args->exportSz,
36475
                                        EC25519_LITTLE_ENDIAN) != 0) {
36476
                                ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
36477
                            }
36478
                        }
36479
                        else
36480
                    #endif
36481
                    #ifdef HAVE_CURVE448
36482
                        if (ssl->ecdhCurveOID == ECC_X448_OID) {
36483
                            if (wc_curve448_export_public_ex(
36484
                                        (curve448_key*)ssl->eccTempKey,
36485
                                        args->exportBuf, &args->exportSz,
36486
                                        EC448_LITTLE_ENDIAN) != 0) {
36487
                                ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
36488
                            }
36489
                        }
36490
                        else
36491
                    #endif
36492
                        {
36493
                    #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
36494
                            PRIVATE_KEY_UNLOCK();
36495
                            ret = wc_ecc_export_x963(ssl->eccTempKey,
36496
                                    args->exportBuf, &args->exportSz);
36497
                            PRIVATE_KEY_LOCK();
36498
                            if (ret != 0) {
36499
                                ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
36500
                            }
36501
                    #endif
36502
                        }
36503
                        args->length += args->exportSz;
36504
36505
                        preSigSz  = args->length;
36506
                        preSigIdx = args->idx;
36507
36508
                        if (ssl->buffers.key == NULL) {
36509
                        #ifdef HAVE_PK_CALLBACKS
36510
                            if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
36511
                                args->tmpSigSz = (word32)GetPrivateKeySigSize(ssl);
36512
                                if (args->tmpSigSz == 0) {
36513
                                    ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
36514
                                }
36515
                            }
36516
                            else
36517
                        #endif
36518
                                ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
36519
                        }
36520
                        else {
36521
                            switch(ssl->options.sigAlgo) {
36522
                        #ifndef NO_RSA
36523
                        #ifdef WC_RSA_PSS
36524
                            case rsa_pss_sa_algo:
36525
                        #endif
36526
                            case rsa_sa_algo:
36527
                            {
36528
                                word32 keySz;
36529
36530
                                ssl->buffers.keyType = rsa_sa_algo;
36531
                                ret = DecodePrivateKey(ssl, &keySz);
36532
                                if (ret != 0) {
36533
                                    goto exit_sske;
36534
                                }
36535
36536
                                args->tmpSigSz = (word32)keySz;
36537
                                break;
36538
                            }
36539
                        #endif /* !NO_RSA */
36540
                        #ifdef HAVE_ECC
36541
                        #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
36542
                            case sm2_sa_algo:
36543
                        #endif
36544
                            case ecc_dsa_sa_algo:
36545
                            {
36546
                                word32 keySz;
36547
36548
                                ssl->buffers.keyType = ssl->options.sigAlgo;
36549
                                ret = DecodePrivateKey(ssl, &keySz);
36550
                                if (ret != 0) {
36551
                                    goto exit_sske;
36552
                                }
36553
                                /* worst case estimate */
36554
                                args->tmpSigSz = keySz;
36555
                                break;
36556
                            }
36557
                        #endif
36558
                        #ifdef HAVE_ED25519
36559
                            case ed25519_sa_algo:
36560
                            {
36561
                                word32 keySz;
36562
36563
                                ssl->buffers.keyType = ed25519_sa_algo;
36564
                                ret = DecodePrivateKey(ssl, &keySz);
36565
                                if (ret != 0) {
36566
                                    goto exit_sske;
36567
                                }
36568
36569
                                /* worst case estimate */
36570
                                args->tmpSigSz = ED25519_SIG_SIZE;
36571
                                break;
36572
                            }
36573
                        #endif /* HAVE_ED25519 */
36574
                        #ifdef HAVE_ED448
36575
                            case ed448_sa_algo:
36576
                            {
36577
                                word32 keySz;
36578
36579
                                ssl->buffers.keyType = ed448_sa_algo;
36580
                                ret = DecodePrivateKey(ssl, &keySz);
36581
                                if (ret != 0) {
36582
                                    goto exit_sske;
36583
                                }
36584
36585
                                /* worst case estimate */
36586
                                args->tmpSigSz = ED448_SIG_SIZE;
36587
                                break;
36588
                            }
36589
                        #endif /* HAVE_ED448 */
36590
                            default:
36591
                                ERROR_OUT(ALGO_ID_E, exit_sske);  /* unsupported type */
36592
                            } /* switch(ssl->specs.sig_algo) */
36593
                        }
36594
36595
                        /* sig length */
36596
                        args->length += LENGTH_SZ;
36597
                        args->length += args->tmpSigSz;
36598
36599
                        if (IsAtLeastTLSv1_2(ssl)) {
36600
                            args->length += HASH_SIG_SIZE;
36601
                        }
36602
36603
                        args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
36604
36605
                    #ifdef WOLFSSL_DTLS
36606
                        if (ssl->options.dtls) {
36607
                            args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
36608
                            args->idx    += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
36609
                            preSigIdx = args->idx;
36610
                        }
36611
                    #endif
36612
                        if (IsEncryptionOn(ssl, 1)) {
36613
                            args->sendSz += MAX_MSG_EXTRA;
36614
                        }
36615
36616
                        /* Use tmp buffer */
36617
                        args->input = (byte*)XMALLOC(args->sendSz,
36618
                                ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
36619
                        if (args->input == NULL)
36620
                            ERROR_OUT(MEMORY_E, exit_sske);
36621
                        args->output = args->input;
36622
36623
                        /* record and message headers will be added below, when we're sure
36624
                           of the sig length */
36625
36626
                        /* key exchange data */
36627
                        args->output[args->idx++] = named_curve;
36628
                        args->output[args->idx++] = 0x00;          /* leading zero */
36629
                    #ifdef HAVE_CURVE25519
36630
                        if (ssl->ecdhCurveOID == ECC_X25519_OID)
36631
                            args->output[args->idx++] = WOLFSSL_ECC_X25519;
36632
                        else
36633
                    #endif
36634
                    #ifdef HAVE_CURVE448
36635
                        if (ssl->ecdhCurveOID == ECC_X448_OID)
36636
                            args->output[args->idx++] = WOLFSSL_ECC_X448;
36637
                        else
36638
                    #endif
36639
                        {
36640
                    #ifdef HAVE_ECC
36641
                            args->output[args->idx++] =
36642
                                                    SetCurveId(ssl->eccTempKey);
36643
                    #endif
36644
                        }
36645
                        args->output[args->idx++] = (byte)args->exportSz;
36646
                        XMEMCPY(args->output + args->idx, args->exportBuf, args->exportSz);
36647
                        args->idx += args->exportSz;
36648
36649
                        /* Determine hash type */
36650
                        if (IsAtLeastTLSv1_2(ssl)) {
36651
                            EncodeSigAlg(ssl->options.hashAlgo,
36652
                                         ssl->options.sigAlgo,
36653
                                         &args->output[args->idx]);
36654
                            args->idx += 2;
36655
36656
                            hashType = HashAlgoToType(ssl->options.hashAlgo);
36657
                            if (hashType == WC_HASH_TYPE_NONE) {
36658
                                ERROR_OUT(ALGO_ID_E, exit_sske);
36659
                            }
36660
36661
                        } else {
36662
                            /* only using sha and md5 for rsa */
36663
                        #ifndef NO_OLD_TLS
36664
                            hashType = WC_HASH_TYPE_SHA;
36665
                            if (ssl->options.sigAlgo == rsa_sa_algo) {
36666
                                hashType = WC_HASH_TYPE_MD5_SHA;
36667
                            }
36668
                        #else
36669
                            ERROR_OUT(ALGO_ID_E, exit_sske);
36670
                        #endif
36671
                        }
36672
36673
                        /* Signature length will be written later, when we're sure what it is */
36674
36675
                    #ifdef HAVE_FUZZER
36676
                        if (ssl->fuzzerCb) {
36677
                            ssl->fuzzerCb(ssl, args->output + preSigIdx,
36678
                                preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
36679
                        }
36680
                    #endif
36681
36682
                        ret = HashSkeData(ssl, hashType,
36683
                            args->output + preSigIdx, preSigSz,
36684
                            ssl->options.sigAlgo);
36685
                        if (ret != 0) {
36686
                            goto exit_sske;
36687
                        }
36688
36689
                        args->sigSz = args->tmpSigSz;
36690
36691
                        /* Sign hash to create signature */
36692
                        switch (ssl->options.sigAlgo)
36693
                        {
36694
                        #ifndef NO_RSA
36695
                            case rsa_sa_algo:
36696
                            {
36697
                                /* For TLS 1.2 re-encode signature */
36698
                                if (IsAtLeastTLSv1_2(ssl)) {
36699
                                    byte* encodedSig = (byte*)XMALLOC(
36700
                                                  MAX_ENCODED_SIG_SZ, ssl->heap,
36701
                                                           DYNAMIC_TYPE_DIGEST);
36702
                                    if (encodedSig == NULL) {
36703
                                        ERROR_OUT(MEMORY_E, exit_sske);
36704
                                    }
36705
36706
                                    ssl->buffers.digest.length =
36707
                                        wc_EncodeSignature(encodedSig,
36708
                                            ssl->buffers.digest.buffer,
36709
                                            ssl->buffers.digest.length,
36710
                                            TypeHash(ssl->options.hashAlgo));
36711
36712
                                    /* Replace sig buffer with new one */
36713
                                    if (!ssl->options.dontFreeDigest) {
36714
                                        XFREE(ssl->buffers.digest.buffer,
36715
                                            ssl->heap, DYNAMIC_TYPE_DIGEST);
36716
                                    }
36717
                                    ssl->options.dontFreeDigest = 0;
36718
                                    ssl->buffers.digest.buffer = encodedSig;
36719
                                }
36720
36721
                                /* write sig size here */
36722
                                c16toa((word16)args->sigSz,
36723
                                    args->output + args->idx);
36724
                                args->idx += LENGTH_SZ;
36725
                                break;
36726
                            }
36727
                        #ifdef WC_RSA_PSS
36728
                            case rsa_pss_sa_algo:
36729
                                /* write sig size here */
36730
                                c16toa((word16)args->sigSz,
36731
                                    args->output + args->idx);
36732
                                args->idx += LENGTH_SZ;
36733
                                break;
36734
                        #endif
36735
                        #endif /* !NO_RSA */
36736
                        #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
36737
                            case sm2_sa_algo:
36738
                        #endif
36739
                            case ecc_dsa_sa_algo:
36740
                            {
36741
                                break;
36742
                            }
36743
                        #ifdef  HAVE_ED25519
36744
                            case ed25519_sa_algo:
36745
                                ret = Ed25519CheckPubKey(ssl);
36746
                                if (ret != 0)
36747
                                    goto exit_sske;
36748
                                break;
36749
                        #endif /* HAVE_ED25519 */
36750
                        #ifdef  HAVE_ED448
36751
                            case ed448_sa_algo:
36752
                                ret = Ed448CheckPubKey(ssl);
36753
                                if (ret != 0)
36754
                                    goto exit_sske;
36755
                                break;
36756
                        #endif /* HAVE_ED448 */
36757
                            default:
36758
                                break;
36759
                        } /* switch(ssl->specs.sig_algo) */
36760
                        break;
36761
                    }
36762
                #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
36763
                #if !defined(NO_DH) && (!defined(NO_RSA) || \
36764
                             (defined(HAVE_ANON) && !defined(WOLFSSL_NO_TLS12)))
36765
                    case diffie_hellman_kea:
36766
                    {
36767
                        enum wc_HashType hashType;
36768
                        word32 preSigSz, preSigIdx;
36769
36770
                        args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
36771
                        args->length = LENGTH_SZ * 3;  /* p, g, pub */
36772
                        args->length += ssl->buffers.serverDH_P.length +
36773
                                        ssl->buffers.serverDH_G.length +
36774
                                        ssl->buffers.serverDH_Pub.length;
36775
36776
                        preSigIdx = args->idx;
36777
                        preSigSz  = args->length;
36778
36779
                        if (!ssl->options.usingAnon_cipher) {
36780
                            word32 keySz = 0;
36781
36782
                            /* sig length */
36783
                            args->length += LENGTH_SZ;
36784
36785
                            if (ssl->buffers.key == NULL) {
36786
                            #ifdef HAVE_PK_CALLBACKS
36787
                                if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
36788
                                    keySz = (word16)GetPrivateKeySigSize(ssl);
36789
                                else
36790
                            #endif
36791
                                    ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
36792
                            }
36793
                            else
36794
                            {
36795
                                if (ssl->buffers.keyType == 0)
36796
                                    ssl->buffers.keyType = rsa_sa_algo;
36797
                                ret = DecodePrivateKey(ssl, &keySz);
36798
                                if (ret != 0) {
36799
                                    goto exit_sske;
36800
                                }
36801
                            }
36802
36803
                            /* test if keySz has error */
36804
                            if (keySz == 0) {
36805
                                ERROR_OUT(keySz, exit_sske);
36806
                            }
36807
36808
                            args->tmpSigSz = (word32)keySz;
36809
                            args->length += args->tmpSigSz;
36810
36811
                            if (IsAtLeastTLSv1_2(ssl)) {
36812
                                args->length += HASH_SIG_SIZE;
36813
                            }
36814
                        }
36815
36816
                        args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
36817
                                                            RECORD_HEADER_SZ;
36818
36819
                    #ifdef WOLFSSL_DTLS
36820
                        if (ssl->options.dtls) {
36821
                            args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
36822
                            args->idx    += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
36823
                            preSigIdx = args->idx;
36824
                        }
36825
                    #endif
36826
36827
                        if (IsEncryptionOn(ssl, 1)) {
36828
                            args->sendSz += MAX_MSG_EXTRA;
36829
                        }
36830
36831
                        /* Use tmp buffer */
36832
                        args->input = (byte*)XMALLOC(args->sendSz,
36833
                                ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
36834
                        if (args->input == NULL)
36835
                            ERROR_OUT(MEMORY_E, exit_sske);
36836
                        args->output = args->input;
36837
36838
                        AddHeaders(args->output, args->length,
36839
                                                    server_key_exchange, ssl);
36840
36841
                        /* add p, g, pub */
36842
                        c16toa((word16)ssl->buffers.serverDH_P.length,
36843
                                                    args->output + args->idx);
36844
                        args->idx += LENGTH_SZ;
36845
                        XMEMCPY(args->output + args->idx,
36846
                                              ssl->buffers.serverDH_P.buffer,
36847
                                              ssl->buffers.serverDH_P.length);
36848
                        args->idx += ssl->buffers.serverDH_P.length;
36849
36850
                        /*  g */
36851
                        c16toa((word16)ssl->buffers.serverDH_G.length,
36852
                                                    args->output + args->idx);
36853
                        args->idx += LENGTH_SZ;
36854
                        XMEMCPY(args->output + args->idx,
36855
                                              ssl->buffers.serverDH_G.buffer,
36856
                                              ssl->buffers.serverDH_G.length);
36857
                        args->idx += ssl->buffers.serverDH_G.length;
36858
36859
                        /*  pub */
36860
                        c16toa((word16)ssl->buffers.serverDH_Pub.length,
36861
                                                    args->output + args->idx);
36862
                        args->idx += LENGTH_SZ;
36863
                        XMEMCPY(args->output + args->idx,
36864
                                              ssl->buffers.serverDH_Pub.buffer,
36865
                                              ssl->buffers.serverDH_Pub.length);
36866
                        args->idx += ssl->buffers.serverDH_Pub.length;
36867
36868
                    #ifdef HAVE_FUZZER
36869
                        if (ssl->fuzzerCb) {
36870
                            ssl->fuzzerCb(ssl, args->output + preSigIdx,
36871
                                preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
36872
                        }
36873
                    #endif
36874
36875
                        if (ssl->options.usingAnon_cipher) {
36876
                            break;
36877
                        }
36878
36879
                        /* Determine hash type */
36880
                        if (IsAtLeastTLSv1_2(ssl)) {
36881
                            EncodeSigAlg(ssl->options.hashAlgo,
36882
                                         ssl->options.sigAlgo,
36883
                                         &args->output[args->idx]);
36884
                            args->idx += 2;
36885
36886
                            hashType = HashAlgoToType(ssl->options.hashAlgo);
36887
                            if (hashType == WC_HASH_TYPE_NONE) {
36888
                                ERROR_OUT(ALGO_ID_E, exit_sske);
36889
                            }
36890
                        } else {
36891
                            /* only using sha and md5 for rsa */
36892
                        #ifndef NO_OLD_TLS
36893
                            hashType = WC_HASH_TYPE_SHA;
36894
                            if (ssl->options.sigAlgo == rsa_sa_algo) {
36895
                                hashType = WC_HASH_TYPE_MD5_SHA;
36896
                            }
36897
                        #else
36898
                            ERROR_OUT(ALGO_ID_E, exit_sske);
36899
                        #endif
36900
                        }
36901
36902
                        /* signature size */
36903
                        c16toa((word16)args->tmpSigSz, args->output + args->idx);
36904
                        args->idx += LENGTH_SZ;
36905
36906
                        ret = HashSkeData(ssl, hashType,
36907
                            args->output + preSigIdx, preSigSz,
36908
                            ssl->options.sigAlgo);
36909
                        if (ret != 0) {
36910
                            goto exit_sske;
36911
                        }
36912
36913
                        args->sigSz = args->tmpSigSz;
36914
36915
                        /* Sign hash to create signature */
36916
                        switch (ssl->options.sigAlgo)
36917
                        {
36918
                        #ifndef NO_RSA
36919
                            case rsa_sa_algo:
36920
                            {
36921
                                /* For TLS 1.2 re-encode signature */
36922
                                if (IsAtLeastTLSv1_2(ssl)) {
36923
                                    byte* encodedSig = (byte*)XMALLOC(
36924
                                                  MAX_ENCODED_SIG_SZ, ssl->heap,
36925
                                                           DYNAMIC_TYPE_DIGEST);
36926
                                    if (encodedSig == NULL) {
36927
                                        ERROR_OUT(MEMORY_E, exit_sske);
36928
                                    }
36929
36930
                                    ssl->buffers.digest.length =
36931
                                        wc_EncodeSignature(encodedSig,
36932
                                            ssl->buffers.digest.buffer,
36933
                                            ssl->buffers.digest.length,
36934
                                            TypeHash(ssl->options.hashAlgo));
36935
36936
                                    /* Replace sig buffer with new one */
36937
                                    if (!ssl->options.dontFreeDigest) {
36938
                                        XFREE(ssl->buffers.digest.buffer,
36939
                                            ssl->heap, DYNAMIC_TYPE_DIGEST);
36940
                                    }
36941
                                    ssl->options.dontFreeDigest = 0;
36942
                                    ssl->buffers.digest.buffer = encodedSig;
36943
                                }
36944
                                break;
36945
                            }
36946
                        #endif /* NO_RSA */
36947
                            default:
36948
                                break;
36949
                        } /* switch (ssl->options.sigAlgo) */
36950
                        break;
36951
                    }
36952
                #endif /* !defined(NO_DH) && !defined(NO_RSA) */
36953
                    default:
36954
                        break;
36955
                } /* switch(ssl->specs.kea) */
36956
36957
                /* Check for error */
36958
                if (ret != 0) {
36959
                    goto exit_sske;
36960
                }
36961
36962
                /* Advance state and proceed */
36963
                ssl->options.asyncState = TLS_ASYNC_DO;
36964
            } /* case TLS_ASYNC_BUILD */
36965
            FALL_THROUGH;
36966
36967
            case TLS_ASYNC_DO:
36968
            {
36969
                switch(ssl->specs.kea)
36970
                {
36971
                #ifndef NO_PSK
36972
                    case psk_kea:
36973
                    {
36974
                        break;
36975
                    }
36976
                #endif /* !NO_PSK */
36977
                #if !defined(NO_DH) && !defined(NO_PSK)
36978
                    case dhe_psk_kea:
36979
                    {
36980
                        break;
36981
                    }
36982
                #endif /* !defined(NO_DH) && !defined(NO_PSK) */
36983
                #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
36984
                                     defined(HAVE_CURVE448)) && !defined(NO_PSK)
36985
                    case ecdhe_psk_kea:
36986
                    {
36987
                        break;
36988
                    }
36989
                #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
36990
                #if defined(HAVE_ECC)  || defined(HAVE_CURVE25519) || \
36991
                                                          defined(HAVE_CURVE448)
36992
                    case ecc_diffie_hellman_kea:
36993
                    {
36994
                        /* Sign hash to create signature */
36995
                        switch (ssl->options.sigAlgo)
36996
                        {
36997
                        #ifndef NO_RSA
36998
                        #ifdef WC_RSA_PSS
36999
                            case rsa_pss_sa_algo:
37000
                        #endif
37001
                            case rsa_sa_algo:
37002
                            {
37003
                                RsaKey* key = (RsaKey*)ssl->hsKey;
37004
37005
                                ret = RsaSign(ssl,
37006
                                    ssl->buffers.digest.buffer,
37007
                                    ssl->buffers.digest.length,
37008
                                    args->output + args->idx,
37009
                                    &args->sigSz,
37010
                                    ssl->options.sigAlgo, ssl->options.hashAlgo,
37011
                                    key,
37012
                                    ssl->buffers.key
37013
                                );
37014
                                break;
37015
                            }
37016
                        #endif /* !NO_RSA */
37017
                        #ifdef HAVE_ECC
37018
                        #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
37019
                            case sm2_sa_algo:
37020
                            {
37021
                                ecc_key* key = (ecc_key*)ssl->hsKey;
37022
37023
                                ret = Sm2wSm3Sign(ssl,
37024
                                    TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ,
37025
                                    ssl->buffers.sig.buffer,
37026
                                    ssl->buffers.sig.length,
37027
                                    args->output + LENGTH_SZ + args->idx,
37028
                                    &args->sigSz,
37029
                                    key,
37030
                            #ifdef HAVE_PK_CALLBACKS
37031
                                    ssl->buffers.key
37032
                            #else
37033
                                    NULL
37034
                            #endif
37035
                                );
37036
                                break;
37037
                            }
37038
                        #endif
37039
                            case ecc_dsa_sa_algo:
37040
                            {
37041
                                ecc_key* key = (ecc_key*)ssl->hsKey;
37042
37043
                                ret = EccSign(ssl,
37044
                                    ssl->buffers.digest.buffer,
37045
                                    ssl->buffers.digest.length,
37046
                                    args->output + LENGTH_SZ + args->idx,
37047
                                    &args->sigSz,
37048
                                    key,
37049
                            #ifdef HAVE_PK_CALLBACKS
37050
                                    ssl->buffers.key
37051
                            #else
37052
                                    NULL
37053
                            #endif
37054
                                );
37055
                                break;
37056
                            }
37057
                        #endif /* HAVE_ECC */
37058
                        #ifdef HAVE_ED25519
37059
                            case ed25519_sa_algo:
37060
                            {
37061
                                ed25519_key* key = (ed25519_key*)ssl->hsKey;
37062
37063
                                ret = Ed25519Sign(ssl,
37064
                                    ssl->buffers.sig.buffer,
37065
                                    ssl->buffers.sig.length,
37066
                                    args->output + LENGTH_SZ + args->idx,
37067
                                    &args->sigSz,
37068
                                    key,
37069
                            #ifdef HAVE_PK_CALLBACKS
37070
                                    ssl->buffers.key
37071
                            #else
37072
                                    NULL
37073
                            #endif
37074
                                );
37075
                                break;
37076
                            }
37077
                        #endif
37078
                        #ifdef HAVE_ED448
37079
                            case ed448_sa_algo:
37080
                            {
37081
                                ed448_key* key = (ed448_key*)ssl->hsKey;
37082
37083
                                ret = Ed448Sign(ssl,
37084
                                    ssl->buffers.sig.buffer,
37085
                                    ssl->buffers.sig.length,
37086
                                    args->output + LENGTH_SZ + args->idx,
37087
                                    &args->sigSz,
37088
                                    key,
37089
                            #ifdef HAVE_PK_CALLBACKS
37090
                                    ssl->buffers.key
37091
                            #else
37092
                                    NULL
37093
                            #endif
37094
                                );
37095
                                break;
37096
                            }
37097
                        #endif
37098
                            default:
37099
                                ERROR_OUT(ALGO_ID_E, exit_sske);
37100
                        } /* switch(ssl->specs.sig_algo) */
37101
                        break;
37102
                    }
37103
                #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
37104
                #if !defined(NO_DH) && !defined(NO_RSA)
37105
                    case diffie_hellman_kea:
37106
                    {
37107
                        /* Sign hash to create signature */
37108
                        switch (ssl->options.sigAlgo)
37109
                        {
37110
                        #ifndef NO_RSA
37111
                        #ifdef WC_RSA_PSS
37112
                            case rsa_pss_sa_algo:
37113
                        #endif
37114
                            case rsa_sa_algo:
37115
                            {
37116
                                RsaKey* key = (RsaKey*)ssl->hsKey;
37117
37118
                                if (ssl->options.usingAnon_cipher) {
37119
                                    break;
37120
                                }
37121
37122
                                ret = RsaSign(ssl,
37123
                                    ssl->buffers.digest.buffer,
37124
                                    ssl->buffers.digest.length,
37125
                                    args->output + args->idx,
37126
                                    &args->sigSz,
37127
                                    ssl->options.sigAlgo, ssl->options.hashAlgo,
37128
                                    key,
37129
                                    ssl->buffers.key
37130
                                );
37131
                                break;
37132
                            }
37133
                        #endif /* NO_RSA */
37134
                            default:
37135
                                break;
37136
                        } /* switch (ssl->options.sigAlgo) */
37137
37138
                        break;
37139
                    }
37140
                #endif /* !defined(NO_DH) && !defined(NO_RSA) */
37141
                    default:
37142
                        break;
37143
                } /* switch(ssl->specs.kea) */
37144
37145
                /* Check for error */
37146
                if (ret != 0) {
37147
                    goto exit_sske;
37148
                }
37149
37150
                /* Advance state and proceed */
37151
                ssl->options.asyncState = TLS_ASYNC_VERIFY;
37152
            } /* case TLS_ASYNC_DO */
37153
            FALL_THROUGH;
37154
37155
            case TLS_ASYNC_VERIFY:
37156
            {
37157
                switch(ssl->specs.kea)
37158
                {
37159
                #ifndef NO_PSK
37160
                    case psk_kea:
37161
                    {
37162
                        /* Nothing to do in this sub-state */
37163
                        break;
37164
                    }
37165
                #endif /* !NO_PSK */
37166
                #if !defined(NO_DH) && !defined(NO_PSK)
37167
                    case dhe_psk_kea:
37168
                    {
37169
                        /* Nothing to do in this sub-state */
37170
                        break;
37171
                    }
37172
                #endif /* !defined(NO_DH) && !defined(NO_PSK) */
37173
                #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) ||  \
37174
                                     defined(HAVE_CURVE448)) && !defined(NO_PSK)
37175
                    case ecdhe_psk_kea:
37176
                    {
37177
                        /* Nothing to do in this sub-state */
37178
                        break;
37179
                    }
37180
                #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
37181
                #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
37182
                                                          defined(HAVE_CURVE448)
37183
                    case ecc_diffie_hellman_kea:
37184
                    {
37185
                        switch(ssl->options.sigAlgo)
37186
                        {
37187
                        #ifndef NO_RSA
37188
                        #ifdef WC_RSA_PSS
37189
                            case rsa_pss_sa_algo:
37190
                        #endif
37191
                            case rsa_sa_algo:
37192
                            {
37193
                                RsaKey* key = (RsaKey*)ssl->hsKey;
37194
37195
                                if (args->verifySig == NULL) {
37196
                                    if (args->sigSz == 0) {
37197
                                        ERROR_OUT(BAD_COND_E, exit_sske);
37198
                                    }
37199
                                    args->verifySig = (byte*)XMALLOC(
37200
                                                    args->sigSz, ssl->heap,
37201
                                                    DYNAMIC_TYPE_SIGNATURE);
37202
                                    if (!args->verifySig) {
37203
                                        ERROR_OUT(MEMORY_E, exit_sske);
37204
                                    }
37205
                                    XMEMCPY(args->verifySig,
37206
                                        args->output + args->idx, args->sigSz);
37207
                                }
37208
37209
                                /* check for signature faults */
37210
                                ret = VerifyRsaSign(ssl,
37211
                                    args->verifySig, args->sigSz,
37212
                                    ssl->buffers.digest.buffer,
37213
                                    ssl->buffers.digest.length,
37214
                                    ssl->options.sigAlgo, ssl->options.hashAlgo,
37215
                                    key, ssl->buffers.key
37216
                                );
37217
                                break;
37218
                            }
37219
                        #endif
37220
                        #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
37221
                            case sm2_sa_algo:
37222
                        #endif /* WOLFSSL_SM2 */
37223
                            case ecc_dsa_sa_algo:
37224
                        #ifdef WOLFSSL_CHECK_SIG_FAULTS
37225
                            {
37226
                                ecc_key* key = (ecc_key*)ssl->hsKey;
37227
37228
                            #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
37229
                                if (ssl->options.sigAlgo == sm2_sa_algo) {
37230
                                    ret = Sm2wSm3Verify(ssl,
37231
                                        TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ,
37232
                                        args->output + LENGTH_SZ + args->idx,
37233
                                        args->sigSz,
37234
                                        ssl->buffers.sig.buffer,
37235
                                        ssl->buffers.sig.length,
37236
                                        key,
37237
                                    #ifdef HAVE_PK_CALLBACKS
37238
                                        ssl->buffers.key
37239
                                    #else
37240
                                        NULL
37241
                                    #endif
37242
                                    );
37243
                                }
37244
                                else
37245
                            #endif /* WOLFSSL_SM2 */
37246
                                {
37247
                                #ifdef HAVE_PK_CALLBACKS
37248
                                    buffer tmp;
37249
37250
                                    tmp.length = ssl->buffers.key->length;
37251
                                    tmp.buffer = ssl->buffers.key->buffer;
37252
                                #endif
37253
37254
                                    ret = EccVerify(ssl,
37255
                                        args->output + LENGTH_SZ + args->idx,
37256
                                        args->sigSz,
37257
                                        ssl->buffers.digest.buffer,
37258
                                        ssl->buffers.digest.length,
37259
                                        key,
37260
                                    #ifdef HAVE_PK_CALLBACKS
37261
                                        &tmp
37262
                                    #else
37263
                                        NULL
37264
                                    #endif
37265
                                    );
37266
                                }
37267
                                if (ret != 0) {
37268
                                    WOLFSSL_MSG(
37269
                                        "Failed to verify ECC signature");
37270
                                    goto exit_sske;
37271
                                }
37272
                            }
37273
                            #if defined(HAVE_ED25519) || defined(HAVE_ED448)
37274
                            FALL_THROUGH;
37275
                            #endif
37276
                        #endif /*  WOLFSSL_CHECK_SIG_FAULTS */
37277
                        #ifdef HAVE_ED25519
37278
                            case ed25519_sa_algo:
37279
                        #endif
37280
                        #ifdef HAVE_ED448
37281
                            case ed448_sa_algo:
37282
                        #endif
37283
                            {
37284
                                /* Now that we know the real sig size, write it. */
37285
                                c16toa((word16)args->sigSz,
37286
                                                    args->output + args->idx);
37287
37288
                                /* And adjust length and sendSz from estimates */
37289
                                args->length += args->sigSz - args->tmpSigSz;
37290
                                args->sendSz += args->sigSz - args->tmpSigSz;
37291
                                break;
37292
                            }
37293
                            default:
37294
                                ERROR_OUT(ALGO_ID_E, exit_sske);  /* unsupported type */
37295
                        } /* switch(ssl->specs.sig_algo) */
37296
                        break;
37297
                    }
37298
                #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
37299
                #if !defined(NO_DH) && !defined(NO_RSA)
37300
                    case diffie_hellman_kea:
37301
                    {
37302
                        switch (ssl->options.sigAlgo)
37303
                        {
37304
                        #ifndef NO_RSA
37305
                        #ifndef WC_RSA_PSS
37306
                            case rsa_pss_sa_algo:
37307
                        #endif
37308
                            case rsa_sa_algo:
37309
                            {
37310
                                RsaKey* key = (RsaKey*)ssl->hsKey;
37311
37312
                                if (ssl->options.usingAnon_cipher) {
37313
                                    break;
37314
                                }
37315
37316
                                if (args->verifySig == NULL) {
37317
                                    if (args->sigSz == 0) {
37318
                                        ERROR_OUT(BAD_COND_E, exit_sske);
37319
                                    }
37320
                                    args->verifySig = (byte*)XMALLOC(
37321
                                                      args->sigSz, ssl->heap,
37322
                                                      DYNAMIC_TYPE_SIGNATURE);
37323
                                    if (!args->verifySig) {
37324
                                        ERROR_OUT(MEMORY_E, exit_sske);
37325
                                    }
37326
                                    XMEMCPY(args->verifySig,
37327
                                        args->output + args->idx, args->sigSz);
37328
                                }
37329
37330
                                /* check for signature faults */
37331
                                ret = VerifyRsaSign(ssl,
37332
                                    args->verifySig, args->sigSz,
37333
                                    ssl->buffers.digest.buffer,
37334
                                    ssl->buffers.digest.length,
37335
                                    ssl->options.sigAlgo, ssl->options.hashAlgo,
37336
                                    key, ssl->buffers.key
37337
                                );
37338
                                break;
37339
                            }
37340
                        #endif
37341
                        } /* switch (ssl->options.sigAlgo) */
37342
                        break;
37343
                    }
37344
                #endif /* !defined(NO_DH) && !defined(NO_RSA) */
37345
                    default:
37346
                        break;
37347
                } /* switch(ssl->specs.kea) */
37348
37349
                /* Check for error */
37350
                if (ret != 0) {
37351
                    goto exit_sske;
37352
                }
37353
37354
                /* Advance state and proceed */
37355
                ssl->options.asyncState = TLS_ASYNC_FINALIZE;
37356
            } /* case TLS_ASYNC_VERIFY */
37357
            FALL_THROUGH;
37358
37359
            case TLS_ASYNC_FINALIZE:
37360
            {
37361
            #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
37362
                                                          defined(HAVE_CURVE448)
37363
                if (ssl->specs.kea == ecdhe_psk_kea ||
37364
                    ssl->specs.kea == ecc_diffie_hellman_kea) {
37365
                    /* Check output to make sure it was set */
37366
                    if (args->output) {
37367
                        AddHeaders(args->output, args->length,
37368
                                                    server_key_exchange, ssl);
37369
                    }
37370
                    else {
37371
                        ERROR_OUT(BUFFER_ERROR, exit_sske);
37372
                    }
37373
                }
37374
            #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
37375
37376
                /* Advance state and proceed */
37377
                ssl->options.asyncState = TLS_ASYNC_END;
37378
            } /* case TLS_ASYNC_FINALIZE */
37379
            FALL_THROUGH;
37380
37381
            case TLS_ASYNC_END:
37382
            {
37383
                ret = SendHandshakeMsg(ssl, args->output, args->length,
37384
                        server_key_exchange, "ServerKeyExchange");
37385
                if (ret != 0)
37386
                    goto exit_sske;
37387
                ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
37388
                break;
37389
            }
37390
            default:
37391
                ret = INPUT_CASE_ERROR;
37392
        } /* switch(ssl->options.asyncState) */
37393
37394
    exit_sske:
37395
37396
    #ifdef WOLFSSL_BLIND_PRIVATE_KEY
37397
        if (ret == 0) {
37398
            ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.key,
37399
                &ssl->buffers.keyMask);
37400
        }
37401
        else {
37402
            wolfssl_priv_der_unblind(ssl->buffers.key, ssl->buffers.keyMask);
37403
        }
37404
    #endif
37405
37406
        WOLFSSL_LEAVE("SendServerKeyExchange", ret);
37407
        WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
37408
37409
    #ifdef WOLFSSL_ASYNC_IO
37410
        /* Handle async operation */
37411
        if (ret == WC_NO_ERR_TRACE(WANT_WRITE)
37412
        #ifdef WOLFSSL_ASYNC_CRYPT
37413
                || ret == WC_NO_ERR_TRACE(WC_PENDING_E)
37414
        #endif
37415
                )
37416
            return ret;
37417
    #endif /* WOLFSSL_ASYNC_IO */
37418
37419
        /* Final cleanup */
37420
        if (
37421
        #ifdef WOLFSSL_ASYNC_IO
37422
            args != NULL &&
37423
        #endif
37424
            args->input != NULL) {
37425
            XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
37426
            args->input = NULL;
37427
        }
37428
    #ifdef WOLFSSL_ASYNC_IO
37429
        /* Cleanup async */
37430
        FreeAsyncCtx(ssl, 0);
37431
    #else
37432
        FreeSskeArgs(ssl, args);
37433
    #endif
37434
        FreeKeyExchange(ssl);
37435
37436
        if (ret != 0) {
37437
            WOLFSSL_ERROR_VERBOSE(ret);
37438
        }
37439
37440
        return ret;
37441
    }
37442
37443
#endif /* !WOLFSSL_NO_TLS12 */
37444
37445
    /* Make sure server cert/key are valid for this suite, true on success
37446
     * Returns 1 for valid server suite or 0 if not found
37447
     * For asynchronous this can return WC_PENDING_E
37448
     */
37449
    static int VerifyServerSuite(const WOLFSSL* ssl, const Suites* suites,
37450
                                 word16 idx, CipherSuite* cs, TLSX* extensions)
37451
0
    {
37452
    #ifndef NO_PSK
37453
        int  havePSK = ssl->options.havePSK;
37454
    #endif
37455
0
        byte first;
37456
0
        byte second;
37457
37458
0
        (void)cs;
37459
0
        (void)extensions;
37460
37461
0
        WOLFSSL_ENTER("VerifyServerSuite");
37462
37463
0
        if (suites == NULL) {
37464
0
            WOLFSSL_MSG("Suites pointer error");
37465
0
            return 0;
37466
0
        }
37467
37468
0
        first   = suites->suites[idx];
37469
0
        second  = suites->suites[idx+1];
37470
37471
0
        if (CipherRequires(first, second, REQUIRES_RSA)) {
37472
0
            WOLFSSL_MSG("Requires RSA");
37473
0
            if (ssl->options.haveRSA == 0) {
37474
0
                WOLFSSL_MSG("Don't have RSA");
37475
0
                return 0;
37476
0
            }
37477
0
        }
37478
37479
0
        if (CipherRequires(first, second, REQUIRES_DHE)) {
37480
0
            WOLFSSL_MSG("Requires DHE");
37481
0
            if (ssl->options.haveDH == 0) {
37482
0
                WOLFSSL_MSG("Don't have DHE");
37483
0
                return 0;
37484
0
            }
37485
0
        }
37486
37487
0
        if (CipherRequires(first, second, REQUIRES_ECC)) {
37488
0
            WOLFSSL_MSG("Requires ECC");
37489
0
            if (ssl->options.haveECC == 0) {
37490
0
                WOLFSSL_MSG("Don't have ECC");
37491
0
                return 0;
37492
0
            }
37493
0
        }
37494
37495
0
        if (CipherRequires(first, second, REQUIRES_ECC_STATIC)) {
37496
0
            WOLFSSL_MSG("Requires static ECC");
37497
0
            if (ssl->options.haveStaticECC == 0) {
37498
0
                WOLFSSL_MSG("Don't have static ECC");
37499
0
                return 0;
37500
0
            }
37501
0
        }
37502
37503
0
        if (CipherRequires(first, second, REQUIRES_PSK)) {
37504
0
            WOLFSSL_MSG("Requires PSK");
37505
        #ifndef NO_PSK
37506
            if (havePSK == 0)
37507
        #endif
37508
0
            {
37509
0
                WOLFSSL_MSG("Don't have PSK");
37510
0
                return 0;
37511
0
            }
37512
0
        }
37513
37514
0
        if (CipherRequires(first, second, REQUIRES_RSA_SIG)) {
37515
0
            WOLFSSL_MSG("Requires RSA Signature");
37516
0
            if (ssl->options.side == WOLFSSL_SERVER_END &&
37517
0
                                           ssl->options.haveECDSAsig == 1) {
37518
0
                WOLFSSL_MSG("Don't have RSA Signature");
37519
0
                return 0;
37520
0
            }
37521
0
        }
37522
37523
0
#if !defined(WOLFSSL_OLDTLS_AEAD_CIPHERSUITES)
37524
0
        if (CipherRequires(first, second, REQUIRES_AEAD)) {
37525
0
            WOLFSSL_MSG("Requires AEAD");
37526
0
            if (ssl->version.major == SSLv3_MAJOR &&
37527
0
                                           ssl->version.minor < TLSv1_2_MINOR) {
37528
0
                WOLFSSL_MSG("Version of SSL does not support AEAD ciphers");
37529
0
                return 0;
37530
0
            }
37531
37532
0
        }
37533
0
#endif
37534
37535
0
#if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
37536
0
                       defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES)
37537
0
        if (!TLSX_ValidateSupportedCurves(ssl, first, second,
37538
0
                                          &cs->ecdhCurveOID)) {
37539
0
            WOLFSSL_MSG("Don't have matching curves");
37540
0
            return 0;
37541
0
        }
37542
0
#endif
37543
37544
0
#ifdef WOLFSSL_TLS13
37545
0
        if (IsAtLeastTLSv1_3(ssl->version) &&
37546
0
                                      ssl->options.side == WOLFSSL_SERVER_END) {
37547
0
    #ifdef HAVE_SUPPORTED_CURVES
37548
0
            byte searched = 0;
37549
0
            int ret = TLSX_KeyShare_Choose(ssl, extensions, first, second,
37550
0
                                           &cs->clientKSE, &searched);
37551
37552
0
            if (ret == WC_NO_ERR_TRACE(MEMORY_E)) {
37553
0
                WOLFSSL_MSG("TLSX_KeyShare_Choose() failed in "
37554
0
                            "VerifyServerSuite() with MEMORY_E");
37555
0
                return 0;
37556
0
            }
37557
0
            if (cs->clientKSE == NULL && searched) {
37558
            #ifdef WOLFSSL_SEND_HRR_COOKIE
37559
                /* If the CH contains a cookie then we need to send an alert to
37560
                 * start from scratch. */
37561
                if (TLSX_Find(extensions, TLSX_COOKIE) != NULL)
37562
                    return INVALID_PARAMETER;
37563
            #endif
37564
0
                cs->doHelloRetry = 1;
37565
0
            }
37566
        #ifdef WOLFSSL_ASYNC_CRYPT
37567
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
37568
                return ret;
37569
        #endif
37570
0
            if (!cs->doHelloRetry && ret != 0)
37571
0
                return 0; /* not found */
37572
0
    #endif /* HAVE_SUPPORTED_CURVES */
37573
0
        }
37574
0
        else if ((first == TLS13_BYTE) || ((first == ECC_BYTE) &&
37575
0
                 ((second == TLS_SHA256_SHA256) ||
37576
0
                  (second == TLS_SHA384_SHA384))) ||
37577
0
                 ((first == CIPHER_BYTE) && ((second == TLS_SM4_GCM_SM3) ||
37578
0
                  (second == TLS_SM4_CCM_SM3)))) {
37579
            /* Can't negotiate TLS 1.3 cipher suites with lower protocol
37580
             * version. */
37581
0
            return 0;
37582
0
        }
37583
0
#endif /* WOLFSSL_TLS13 */
37584
37585
0
        return 1;
37586
0
    }
37587
37588
    static int CompareSuites(const WOLFSSL* ssl, const Suites* suites,
37589
                             Suites* peerSuites, word16 i, word16 j,
37590
                             CipherSuite* cs, TLSX* extensions)
37591
6.84M
    {
37592
6.84M
        if (suites->suites[i]   == peerSuites->suites[j] &&
37593
6.84M
            suites->suites[i+1] == peerSuites->suites[j+1] ) {
37594
37595
27.4k
            int ret = VerifyServerSuite(ssl, suites, i, cs, extensions);
37596
27.4k
            if (ret < 0) {
37597
0
                return ret;
37598
0
            }
37599
27.4k
            if (ret) {
37600
11.8k
                WOLFSSL_MSG("Verified suite validity");
37601
11.8k
                cs->cipherSuite0 = suites->suites[i];
37602
11.8k
                cs->cipherSuite  = suites->suites[i+1];
37603
11.8k
                return 0;
37604
11.8k
            }
37605
15.5k
            else {
37606
15.5k
                WOLFSSL_MSG("Could not verify suite validity, continue");
37607
15.5k
            }
37608
27.4k
        }
37609
37610
6.83M
        return MATCH_SUITE_ERROR;
37611
6.84M
    }
37612
37613
    int MatchSuite_ex(const WOLFSSL* ssl, Suites* peerSuites, CipherSuite* cs,
37614
                      TLSX* extensions)
37615
16.8k
    {
37616
16.8k
        int ret;
37617
16.8k
        word16 i, j;
37618
16.8k
        const Suites* suites = WOLFSSL_SUITES(ssl);
37619
37620
16.8k
        WOLFSSL_ENTER("MatchSuite");
37621
37622
        /* & 0x1 equivalent % 2 */
37623
16.8k
        if (peerSuites->suiteSz == 0 || peerSuites->suiteSz & 0x1)
37624
134
            return BUFFER_ERROR;
37625
37626
16.7k
        if (suites == NULL)
37627
0
            return SUITES_ERROR;
37628
37629
16.7k
        if (!ssl->options.useClientOrder) {
37630
            /* Server order */
37631
798k
            for (i = 0; i < suites->suiteSz; i += 2) {
37632
7.62M
                for (j = 0; j < peerSuites->suiteSz; j += 2) {
37633
6.84M
                    ret = CompareSuites(ssl, suites, peerSuites, i, j, cs, extensions);
37634
6.84M
                    if (ret != WC_NO_ERR_TRACE(MATCH_SUITE_ERROR))
37635
11.8k
                        return ret;
37636
6.84M
                }
37637
793k
            }
37638
16.7k
        }
37639
0
        else {
37640
            /* Client order */
37641
0
            for (j = 0; j < peerSuites->suiteSz; j += 2) {
37642
0
                for (i = 0; i < suites->suiteSz; i += 2) {
37643
0
                    ret = CompareSuites(ssl, suites, peerSuites, i, j, cs, extensions);
37644
0
                    if (ret != WC_NO_ERR_TRACE(MATCH_SUITE_ERROR))
37645
0
                        return ret;
37646
0
                }
37647
0
            }
37648
0
        }
37649
37650
4.90k
        WOLFSSL_ERROR_VERBOSE(MATCH_SUITE_ERROR);
37651
4.90k
        return MATCH_SUITE_ERROR;
37652
37653
16.7k
    }
37654
37655
    int MatchSuite(WOLFSSL* ssl, Suites* peerSuites)
37656
16.8k
    {
37657
16.8k
        int ret;
37658
16.8k
        CipherSuite cs;
37659
37660
16.8k
        XMEMSET(&cs, 0, sizeof(cs));
37661
37662
16.8k
        ret = MatchSuite_ex(ssl, peerSuites, &cs,
37663
16.8k
#ifdef HAVE_TLS_EXTENSIONS
37664
16.8k
                ssl->extensions
37665
#else
37666
                NULL
37667
#endif
37668
16.8k
                );
37669
16.8k
        if (ret != 0)
37670
5.04k
            return ret;
37671
37672
11.8k
        ssl->options.cipherSuite0 = cs.cipherSuite0;
37673
11.8k
        ssl->options.cipherSuite  = cs.cipherSuite;
37674
11.8k
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_CURVE25519) || \
37675
11.8k
    defined(HAVE_ED448) || defined(HAVE_CURVE448)
37676
11.8k
        ssl->ecdhCurveOID = cs.ecdhCurveOID;
37677
11.8k
#endif
37678
37679
11.8k
        ret = SetCipherSpecs(ssl);
37680
11.8k
        if (ret != 0)
37681
0
            return ret;
37682
11.8k
        ret = PickHashSigAlgo(ssl, peerSuites->hashSigAlgo,
37683
11.8k
                              peerSuites->hashSigAlgoSz, 1);
37684
11.8k
        if (ret != 0)
37685
185
            return ret;
37686
37687
11.6k
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
37688
11.6k
        if (cs.doHelloRetry) {
37689
            /* Make sure we don't send HRR twice */
37690
200
            if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE)
37691
1
                return INVALID_PARAMETER;
37692
199
            ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
37693
199
            return TLSX_KeyShare_SetSupported(ssl, &ssl->extensions);
37694
200
        }
37695
11.4k
#endif
37696
37697
11.4k
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
37698
11.4k
        if (IsAtLeastTLSv1_3(ssl->version) &&
37699
11.4k
                                      ssl->options.side == WOLFSSL_SERVER_END) {
37700
1.09k
            ret = TLSX_KeyShare_Setup(ssl, cs.clientKSE);
37701
1.09k
            if (ret != 0)
37702
303
                return ret;
37703
1.09k
        }
37704
11.1k
#endif
37705
11.1k
        return ret;
37706
11.4k
    }
37707
37708
#ifdef OLD_HELLO_ALLOWED
37709
37710
    /* process old style client hello, deprecate? */
37711
    int ProcessOldClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
37712
                              word32 inSz, word16 sz)
37713
    {
37714
        word32          idx = *inOutIdx;
37715
        word16          sessionSz;
37716
        word16          randomSz;
37717
        word16          i, j;
37718
        ProtocolVersion pv;
37719
        Suites          clSuites;
37720
        int ret = -1;
37721
37722
        (void)inSz;
37723
        WOLFSSL_MSG("Got old format client hello");
37724
#ifdef WOLFSSL_CALLBACKS
37725
        if (ssl->hsInfoOn)
37726
            AddPacketName(ssl, "ClientHello");
37727
        if (ssl->toInfoOn)
37728
            AddLateName("ClientHello", &ssl->timeoutInfo);
37729
#endif
37730
37731
        /* manually hash input since different format */
37732
#ifndef NO_OLD_TLS
37733
#ifndef NO_MD5
37734
        wc_Md5Update(&ssl->hsHashes->hashMd5, input + idx, sz);
37735
#endif
37736
#ifndef NO_SHA
37737
        wc_ShaUpdate(&ssl->hsHashes->hashSha, input + idx, sz);
37738
#endif
37739
#endif /* !NO_OLD_TLS */
37740
#ifndef NO_SHA256
37741
        if (IsAtLeastTLSv1_2(ssl)) {
37742
            int shaRet = wc_Sha256Update(&ssl->hsHashes->hashSha256,
37743
                                         input + idx, sz);
37744
            if (shaRet != 0)
37745
                return shaRet;
37746
        }
37747
#endif
37748
37749
        /* does this value mean client_hello? */
37750
        idx++;
37751
37752
        /* version */
37753
        pv.major = input[idx++];
37754
        pv.minor = input[idx++];
37755
        ssl->chVersion = pv;  /* store */
37756
37757
        if (ssl->version.minor > pv.minor) {
37758
            byte haveRSA = 0;
37759
            byte havePSK = 0;
37760
            int  keySz   = 0;
37761
37762
            if (!ssl->options.downgrade) {
37763
                WOLFSSL_MSG("Client trying to connect with lesser version");
37764
                return VERSION_ERROR;
37765
            }
37766
            if (pv.minor < ssl->options.minDowngrade) {
37767
                WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
37768
                return VERSION_ERROR;
37769
            }
37770
            if (pv.minor == SSLv3_MINOR) {
37771
                /* turn off tls */
37772
                WOLFSSL_MSG("\tdowngrading to SSLv3");
37773
                ssl->options.tls    = 0;
37774
                ssl->options.tls1_1 = 0;
37775
                ssl->version.minor  = SSLv3_MINOR;
37776
            }
37777
            else if (pv.minor == TLSv1_MINOR) {
37778
                WOLFSSL_MSG("\tdowngrading to TLSv1");
37779
                /* turn off tls 1.1+ */
37780
                ssl->options.tls1_1 = 0;
37781
                ssl->version.minor  = TLSv1_MINOR;
37782
            }
37783
            else if (pv.minor == TLSv1_1_MINOR) {
37784
                WOLFSSL_MSG("\tdowngrading to TLSv1.1");
37785
                ssl->version.minor  = TLSv1_1_MINOR;
37786
            }
37787
            else if (pv.minor == TLSv1_2_MINOR) {
37788
                WOLFSSL_MSG("    downgrading to TLSv1.2");
37789
                ssl->version.minor  = TLSv1_2_MINOR;
37790
            }
37791
#ifndef NO_RSA
37792
            haveRSA = 1;
37793
#endif
37794
#ifndef NO_PSK
37795
            havePSK = ssl->options.havePSK;
37796
#endif
37797
#ifndef NO_CERTS
37798
            keySz = ssl->buffers.keySz;
37799
#endif
37800
            ret = AllocateSuites(ssl);
37801
            if (ret != 0)
37802
                return ret;
37803
            InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
37804
                       ssl->options.haveDH, ssl->options.haveECDSAsig,
37805
                       ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
37806
                       ssl->options.useAnon,
37807
                       TRUE, TRUE, TRUE, TRUE, ssl->options.side);
37808
        }
37809
37810
        /* suite size */
37811
        ato16(&input[idx], &clSuites.suiteSz);
37812
        idx += OPAQUE16_LEN;
37813
37814
        if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ)
37815
            return BUFFER_ERROR;
37816
        /* Make sure the suiteSz is a multiple of 3. (Old Client Hello) */
37817
        if (clSuites.suiteSz % 3 != 0)
37818
            return BUFFER_ERROR;
37819
        clSuites.hashSigAlgoSz = 0;
37820
37821
        /* session size */
37822
        ato16(&input[idx], &sessionSz);
37823
        idx += OPAQUE16_LEN;
37824
37825
        if (sessionSz > ID_LEN)
37826
            return BUFFER_ERROR;
37827
37828
        /* random size */
37829
        ato16(&input[idx], &randomSz);
37830
        idx += OPAQUE16_LEN;
37831
37832
        if (randomSz > RAN_LEN)
37833
            return BUFFER_ERROR;
37834
37835
        /* suites */
37836
        for (i = 0, j = 0; i < clSuites.suiteSz; i += 3) {
37837
            byte first = input[idx++];
37838
            if (!first) { /* implicit: skip sslv2 type */
37839
                XMEMCPY(&clSuites.suites[j], &input[idx], SUITE_LEN);
37840
                j += SUITE_LEN;
37841
            }
37842
            idx += SUITE_LEN;
37843
        }
37844
        clSuites.suiteSz = j;
37845
37846
        /* session id */
37847
        if (sessionSz) {
37848
            XMEMCPY(ssl->arrays->sessionID, input + idx, sessionSz);
37849
            ssl->arrays->sessionIDSz = (byte)sessionSz;
37850
            idx += sessionSz;
37851
            ssl->options.resuming = 1;
37852
        }
37853
37854
        /* random */
37855
        if (randomSz < RAN_LEN)
37856
            XMEMSET(ssl->arrays->clientRandom, 0, RAN_LEN - randomSz);
37857
        XMEMCPY(&ssl->arrays->clientRandom[RAN_LEN - randomSz], input + idx,
37858
               randomSz);
37859
        idx += randomSz;
37860
37861
        if (ssl->options.usingCompression)
37862
            ssl->options.usingCompression = 0;  /* turn off */
37863
37864
        ssl->options.clientState = CLIENT_HELLO_COMPLETE;
37865
        ssl->cbmode = WOLFSSL_CB_MODE_WRITE;
37866
        *inOutIdx = idx;
37867
37868
        ssl->options.haveSessionId = 1;
37869
        /* DoClientHello uses same resume code */
37870
        if (ssl->options.resuming) {  /* let's try */
37871
            WOLFSSL_SESSION* session;
37872
        #ifdef HAVE_SESSION_TICKET
37873
            if (ssl->options.useTicket == 1) {
37874
                session = ssl->session;
37875
            }
37876
            else
37877
        #endif
37878
            {
37879
                session = wolfSSL_GetSession(ssl, ssl->arrays->masterSecret, 1);
37880
            }
37881
            if (!session) {
37882
                WOLFSSL_MSG("Session lookup for resume failed");
37883
                ssl->options.resuming = 0;
37884
            } else {
37885
                if (MatchSuite(ssl, &clSuites) < 0) {
37886
                    WOLFSSL_MSG("Unsupported cipher suite, OldClientHello");
37887
                    return UNSUPPORTED_SUITE;
37888
                }
37889
37890
                ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom,
37891
                                                                       RAN_LEN);
37892
                if (ret != 0)
37893
                    return ret;
37894
37895
                #ifdef NO_OLD_TLS
37896
                    ret = DeriveTlsKeys(ssl);
37897
                #else
37898
                    #ifndef NO_TLS
37899
                        if (ssl->options.tls)
37900
                            ret = DeriveTlsKeys(ssl);
37901
                    #endif
37902
                        if (!ssl->options.tls)
37903
                            ret = DeriveKeys(ssl);
37904
                #endif
37905
                /* SERVER: peer auth based on session secret. */
37906
                ssl->options.peerAuthGood = (ret == 0);
37907
                ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
37908
37909
                return ret;
37910
            }
37911
        }
37912
37913
        ret = MatchSuite(ssl, &clSuites);
37914
        if (ret != 0)return ret;
37915
        return SanityCheckMsgReceived(ssl, client_hello);
37916
    }
37917
37918
#endif /* OLD_HELLO_ALLOWED */
37919
37920
#ifndef WOLFSSL_NO_TLS12
37921
37922
    /**
37923
     *  Handles session resumption.
37924
     *  Session tickets are checked for validity based on the time each ticket
37925
     *  was created, timeout value and the current time. If the tickets are
37926
     *  judged expired, falls back to full-handshake. If you want disable this
37927
     *  session ticket validation check in TLS1.2 and below, define
37928
     *  WOLFSSL_NO_TICKET_EXPIRE.
37929
     */
37930
    int HandleTlsResumption(WOLFSSL* ssl, Suites* clSuites)
37931
    {
37932
        int ret = 0;
37933
        WOLFSSL_SESSION* session;
37934
37935
#ifdef HAVE_SECRET_CALLBACK
37936
        if (ssl->sessionSecretCb != NULL
37937
#ifdef HAVE_SESSION_TICKET
37938
                && ssl->session->ticketLen > 0
37939
#endif
37940
                ) {
37941
            int secretSz = SECRET_LEN;
37942
            WOLFSSL_MSG("Calling session secret callback");
37943
            ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom,
37944
                                       RAN_LEN);
37945
            if (ret == 0) {
37946
                ret = ssl->sessionSecretCb(ssl, ssl->arrays->masterSecret,
37947
                                              &secretSz, ssl->sessionSecretCtx);
37948
                if (secretSz != SECRET_LEN)
37949
                    ret = SESSION_SECRET_CB_E;
37950
            }
37951
            if (ret == 0)
37952
                ret = MatchSuite(ssl, clSuites);
37953
            if (ret == 0) {
37954
                #ifdef NO_OLD_TLS
37955
                    ret = DeriveTlsKeys(ssl);
37956
                #else
37957
                    #ifndef NO_TLS
37958
                        if (ssl->options.tls)
37959
                            ret = DeriveTlsKeys(ssl);
37960
                    #endif
37961
                        if (!ssl->options.tls)
37962
                            ret = DeriveKeys(ssl);
37963
                #endif
37964
                /* SERVER: peer auth based on session secret. */
37965
                ssl->options.peerAuthGood = (ret == 0);
37966
                ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
37967
            }
37968
            if (ret != 0)
37969
                WOLFSSL_ERROR_VERBOSE(ret);
37970
            WOLFSSL_LEAVE("HandleTlsResumption", ret);
37971
            return ret;
37972
        }
37973
#endif /* HAVE_SECRET_CALLBACK */
37974
37975
    #ifdef HAVE_SESSION_TICKET
37976
        if (ssl->options.useTicket == 1) {
37977
            session = ssl->session;
37978
        }
37979
        else
37980
    #endif
37981
        {
37982
            session = wolfSSL_GetSession(ssl, ssl->arrays->masterSecret, 1);
37983
        }
37984
        if (!session) {
37985
            WOLFSSL_MSG("Session lookup for resume failed");
37986
            ssl->options.resuming = 0;
37987
            return ret;
37988
        }
37989
#if !defined(WOLFSSL_NO_TICKET_EXPIRE) && !defined(NO_ASN_TIME)
37990
        /* check if the ticket is valid */
37991
        if (LowResTimer() > session->bornOn + ssl->timeout) {
37992
            WOLFSSL_MSG("Expired session, fall back to full handshake.");
37993
            ssl->options.resuming = 0;
37994
        }
37995
#endif /* !WOLFSSL_NO_TICKET_EXPIRE && !NO_ASN_TIME */
37996
37997
        else if (session->haveEMS != ssl->options.haveEMS) {
37998
            /* RFC 7627, 5.3, server-side */
37999
            /* if old sess didn't have EMS, but new does, full handshake */
38000
            if (!session->haveEMS && ssl->options.haveEMS) {
38001
                WOLFSSL_MSG("Attempting to resume a session that didn't "
38002
                            "use EMS with a new session with EMS. Do full "
38003
                            "handshake.");
38004
                ssl->options.resuming = 0;
38005
            }
38006
            /* if old sess used EMS, but new doesn't, MUST abort */
38007
            else if (session->haveEMS && !ssl->options.haveEMS) {
38008
                WOLFSSL_MSG("Trying to resume a session with EMS without "
38009
                            "using EMS");
38010
            #ifdef WOLFSSL_EXTRA_ALERTS
38011
                SendAlert(ssl, alert_fatal, handshake_failure);
38012
            #endif
38013
                ret = EXT_MASTER_SECRET_NEEDED_E;
38014
                WOLFSSL_ERROR_VERBOSE(ret);
38015
            }
38016
        }
38017
        else {
38018
        #ifndef NO_RESUME_SUITE_CHECK
38019
            int j;
38020
38021
            /* Check client suites include the one in session */
38022
            for (j = 0; j < clSuites->suiteSz; j += 2) {
38023
                if (clSuites->suites[j] == session->cipherSuite0 &&
38024
                                clSuites->suites[j+1] == session->cipherSuite) {
38025
                    break;
38026
                }
38027
            }
38028
            if (j == clSuites->suiteSz) {
38029
                WOLFSSL_MSG("Prev session's cipher suite not in ClientHello");
38030
            #ifdef WOLFSSL_EXTRA_ALERTS
38031
                SendAlert(ssl, alert_fatal, illegal_parameter);
38032
            #endif
38033
                ret = UNSUPPORTED_SUITE;
38034
                WOLFSSL_ERROR_VERBOSE(ret);
38035
            }
38036
        #endif
38037
38038
            if (ret == 0 && ssl->options.resuming) {
38039
                /* for resumption use the cipher suite from session */
38040
                ssl->options.cipherSuite0 = session->cipherSuite0;
38041
                ssl->options.cipherSuite =  session->cipherSuite;
38042
                ret = SetCipherSpecs(ssl);
38043
                if (ret == 0) {
38044
                    ret = PickHashSigAlgo(ssl, clSuites->hashSigAlgo,
38045
                                          clSuites->hashSigAlgoSz, 0);
38046
                }
38047
            }
38048
            else if (ret == 0) {
38049
                if (MatchSuite(ssl, clSuites) < 0) {
38050
                    WOLFSSL_MSG("Unsupported cipher suite, ClientHello");
38051
                    ret = UNSUPPORTED_SUITE;
38052
                    WOLFSSL_ERROR_VERBOSE(ret);
38053
                }
38054
            }
38055
            if (ret == 0) {
38056
                ret = wc_RNG_GenerateBlock(ssl->rng,
38057
                                           ssl->arrays->serverRandom, RAN_LEN);
38058
            }
38059
            if (ret == 0) {
38060
                #ifdef NO_OLD_TLS
38061
                    ret = DeriveTlsKeys(ssl);
38062
                #else
38063
                    #ifndef NO_TLS
38064
                        if (ssl->options.tls)
38065
                            ret = DeriveTlsKeys(ssl);
38066
                    #endif
38067
                        if (!ssl->options.tls)
38068
                            ret = DeriveKeys(ssl);
38069
                #endif
38070
                /* SERVER: peer auth based on session secret. */
38071
                ssl->options.peerAuthGood = (ret == 0);
38072
                ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
38073
            }
38074
        }
38075
38076
38077
        return ret;
38078
    }
38079
38080
38081
    /* handle processing of client_hello (1) */
38082
    int DoClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
38083
                             word32 helloSz)
38084
0
    {
38085
0
        byte            b;
38086
0
        ProtocolVersion pv;
38087
0
        word32          i = *inOutIdx;
38088
0
        word32          begin = i;
38089
0
        int             ret = 0;
38090
0
        byte            lesserVersion;
38091
38092
0
        WOLFSSL_START(WC_FUNC_CLIENT_HELLO_DO);
38093
0
        WOLFSSL_ENTER("DoClientHello");
38094
38095
#ifdef WOLFSSL_CALLBACKS
38096
        if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
38097
        if (ssl->toInfoOn) AddLateName("ClientHello", &ssl->timeoutInfo);
38098
#endif
38099
        /* do not change state in the SSL object before the next region of code
38100
         * to be able to statelessly compute a DTLS cookie */
38101
#ifdef WOLFSSL_DTLS
38102
        /* Update the ssl->options.dtlsStateful setting `if` statement in
38103
         * wolfSSL_accept when changing this one. */
38104
        if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl) &&
38105
                !ssl->options.dtlsStateful) {
38106
            DtlsSetSeqNumForReply(ssl);
38107
            ret = DoClientHelloStateless(ssl, input + *inOutIdx, helloSz, 0,
38108
                    NULL);
38109
            if (ret != 0 || !ssl->options.dtlsStateful) {
38110
                int alertType = TranslateErrorToAlert(ret);
38111
                if (alertType != invalid_alert) {
38112
                    int err;
38113
38114
                    /* propagate socket errors to avoid re-calling send alert */
38115
                    err = SendAlert(ssl, alert_fatal, alertType);
38116
                    if (err == WC_NO_ERR_TRACE(SOCKET_ERROR_E))
38117
                        ret = SOCKET_ERROR_E;
38118
                }
38119
                *inOutIdx += helloSz;
38120
                DtlsResetState(ssl);
38121
                if (DtlsIgnoreError(ret))
38122
                    ret = 0;
38123
                return ret;
38124
            }
38125
            if (ssl->chGoodCb != NULL) {
38126
                int cbret = ssl->chGoodCb(ssl, ssl->chGoodCtx);
38127
                if (cbret < 0) {
38128
                    ssl->error = cbret;
38129
                    WOLFSSL_MSG("ClientHello Good Cb don't continue error");
38130
                    return WOLFSSL_FATAL_ERROR;
38131
                }
38132
            }
38133
        }
38134
        ssl->options.dtlsStateful = 1;
38135
#endif /* WOLFSSL_DTLS */
38136
38137
        /* Reset to sane value for SCR */
38138
0
        ssl->options.resuming = 0;
38139
0
        ssl->arrays->sessionIDSz = 0;
38140
38141
        /* protocol version, random and session id length check */
38142
0
        if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
38143
0
            return BUFFER_ERROR;
38144
38145
        /* protocol version */
38146
0
        XMEMCPY(&pv, input + i, OPAQUE16_LEN);
38147
0
        ssl->chVersion = pv;   /* store */
38148
0
        i += OPAQUE16_LEN;
38149
38150
        /* Legacy protocol version cannot negotiate TLS 1.3 or higher. */
38151
0
        if (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR)
38152
0
            pv.minor = TLSv1_2_MINOR;
38153
38154
0
        lesserVersion = (byte)(!ssl->options.dtls &&
38155
0
                                    ssl->version.minor > pv.minor);
38156
0
        lesserVersion |= ssl->options.dtls &&ssl->version.minor < pv.minor;
38157
38158
0
        if (lesserVersion) {
38159
0
            byte   belowMinDowngrade;
38160
0
            word16 haveRSA = 0;
38161
0
            word16 havePSK = 0;
38162
0
            int    keySz   = 0;
38163
38164
0
            if (!ssl->options.downgrade) {
38165
0
                WOLFSSL_MSG("Client trying to connect with lesser version");
38166
0
                ret = VERSION_ERROR;
38167
0
                goto out;
38168
0
            }
38169
38170
0
            belowMinDowngrade = pv.minor < ssl->options.minDowngrade;
38171
38172
            /* DTLS versions increase backwards (-1,-2,-3) ecc  */
38173
0
            if (ssl->options.dtls)
38174
0
                belowMinDowngrade = ssl->options.dtls
38175
0
                    && pv.minor > ssl->options.minDowngrade;
38176
38177
0
            if (belowMinDowngrade) {
38178
0
                WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
38179
0
                ret = VERSION_ERROR;
38180
0
                goto out;
38181
0
            }
38182
38183
0
            if (!ssl->options.dtls) {
38184
0
                if (pv.minor == SSLv3_MINOR) {
38185
                    /* turn off tls */
38186
0
                    WOLFSSL_MSG("\tdowngrading to SSLv3");
38187
0
                    ssl->options.tls    = 0;
38188
0
                    ssl->options.tls1_1 = 0;
38189
0
                    ssl->version.minor  = SSLv3_MINOR;
38190
0
                }
38191
0
                else if (pv.minor == TLSv1_MINOR) {
38192
                    /* turn off tls 1.1+ */
38193
0
                    WOLFSSL_MSG("\tdowngrading to TLSv1");
38194
0
                    ssl->options.tls1_1 = 0;
38195
0
                    ssl->version.minor  = TLSv1_MINOR;
38196
0
                }
38197
0
                else if (pv.minor == TLSv1_1_MINOR) {
38198
0
                    WOLFSSL_MSG("\tdowngrading to TLSv1.1");
38199
0
                    ssl->version.minor  = TLSv1_1_MINOR;
38200
0
                }
38201
0
                else if (pv.minor == TLSv1_2_MINOR) {
38202
0
                    WOLFSSL_MSG("    downgrading to TLSv1.2");
38203
0
                    ssl->version.minor  = TLSv1_2_MINOR;
38204
0
                }
38205
0
            }
38206
0
            else {
38207
0
                if (pv.minor == DTLSv1_2_MINOR) {
38208
0
                    WOLFSSL_MSG("\tDowngrading to DTLSv1.2");
38209
0
                    ssl->options.tls1_3 = 0;
38210
0
                    ssl->version.minor = DTLSv1_2_MINOR;
38211
0
                }
38212
0
                else if (pv.minor == DTLS_MINOR) {
38213
0
                    WOLFSSL_MSG("\tDowngrading to DTLSv1.0");
38214
0
                    ssl->options.tls1_3 = 0;
38215
0
                    ssl->version.minor = DTLS_MINOR;
38216
0
                }
38217
0
            }
38218
0
#ifndef NO_RSA
38219
0
            haveRSA = 1;
38220
0
#endif
38221
#ifndef NO_PSK
38222
            havePSK = ssl->options.havePSK;
38223
#endif
38224
0
#ifndef NO_CERTS
38225
0
            keySz = ssl->buffers.keySz;
38226
0
#endif
38227
0
            ret = AllocateSuites(ssl);
38228
0
            if (ret != 0)
38229
0
                goto out;
38230
0
            InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
38231
0
                       ssl->options.haveDH, ssl->options.haveECDSAsig,
38232
0
                       ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
38233
0
                       ssl->options.useAnon,
38234
0
                       TRUE, TRUE, TRUE, TRUE, ssl->options.side);
38235
0
        }
38236
38237
        /* check if option is set to not allow the current version
38238
         * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
38239
0
        if (!ssl->options.dtls && ssl->options.downgrade &&
38240
0
            ssl->options.mask > 0) {
38241
38242
0
            int reset = 0;
38243
38244
0
            if (ssl->version.minor == TLSv1_2_MINOR &&
38245
0
               (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) ==
38246
0
                WOLFSSL_OP_NO_TLSv1_2) {
38247
0
                WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
38248
0
                ssl->version.minor = TLSv1_1_MINOR;
38249
0
                reset = 1;
38250
0
            }
38251
38252
0
            if (ssl->version.minor == TLSv1_1_MINOR &&
38253
0
               (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) ==
38254
0
                WOLFSSL_OP_NO_TLSv1_1) {
38255
0
                WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
38256
0
                ssl->options.tls1_1 = 0;
38257
0
                ssl->version.minor = TLSv1_MINOR;
38258
0
                reset = 1;
38259
0
            }
38260
38261
0
            if (ssl->version.minor == TLSv1_MINOR &&
38262
0
               (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) ==
38263
0
                WOLFSSL_OP_NO_TLSv1) {
38264
0
                WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
38265
0
                ssl->options.tls    = 0;
38266
0
                ssl->options.tls1_1 = 0;
38267
0
                ssl->version.minor = SSLv3_MINOR;
38268
0
                reset = 1;
38269
0
            }
38270
38271
0
            if (ssl->version.minor == SSLv3_MINOR &&
38272
0
               (ssl->options.mask & WOLFSSL_OP_NO_SSLv3) ==
38273
0
                WOLFSSL_OP_NO_SSLv3) {
38274
0
                WOLFSSL_MSG("\tError, option set to not allow SSLv3");
38275
0
                ret = VERSION_ERROR;
38276
#ifdef WOLFSSL_EXTRA_ALERTS
38277
                SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
38278
#endif
38279
0
                goto out;
38280
0
            }
38281
38282
0
            if (ssl->version.minor < ssl->options.minDowngrade) {
38283
0
                WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
38284
0
                ret = VERSION_ERROR;
38285
0
                goto out;
38286
0
            }
38287
38288
0
            if (reset) {
38289
0
                word16 haveRSA = 0;
38290
0
                word16 havePSK = 0;
38291
0
                int    keySz   = 0;
38292
38293
0
            #ifndef NO_RSA
38294
0
                haveRSA = 1;
38295
0
            #endif
38296
            #ifndef NO_PSK
38297
                havePSK = ssl->options.havePSK;
38298
            #endif
38299
0
            #ifndef NO_CERTS
38300
0
                keySz = ssl->buffers.keySz;
38301
0
            #endif
38302
38303
0
                ret = AllocateSuites(ssl);
38304
0
                if (ret != 0)
38305
0
                    goto out;
38306
                /* reset cipher suites to account for TLS version change */
38307
0
                InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
38308
0
                           ssl->options.haveDH, ssl->options.haveECDSAsig,
38309
0
                           ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
38310
0
                           ssl->options.useAnon,
38311
0
                           TRUE, TRUE, TRUE, TRUE, ssl->options.side);
38312
0
            }
38313
0
        }
38314
38315
        /* random */
38316
0
        XMEMCPY(ssl->arrays->clientRandom, input + i, RAN_LEN);
38317
0
        i += RAN_LEN;
38318
38319
#ifdef SHOW_SECRETS
38320
        {
38321
            int j;
38322
            printf("client random: ");
38323
            for (j = 0; j < RAN_LEN; j++)
38324
                printf("%02x", ssl->arrays->clientRandom[j]);
38325
            printf("\n");
38326
        }
38327
#endif
38328
38329
        /* session id */
38330
0
        b = input[i++];
38331
0
        if (b > ID_LEN) {
38332
0
            WOLFSSL_MSG("Invalid session ID size");
38333
0
            ret = BUFFER_ERROR; /* session ID greater than 32 bytes long */
38334
0
            goto out;
38335
0
        }
38336
0
        else if (b > 0 && !IsSCR(ssl)) {
38337
0
            if ((i - begin) + b > helloSz) {
38338
0
                ret = BUFFER_ERROR;
38339
0
                goto out;
38340
0
            }
38341
38342
            /* Always save session ID in case we want to echo it. */
38343
0
            XMEMCPY(ssl->arrays->sessionID, input + i, b);
38344
0
            ssl->arrays->sessionIDSz = b;
38345
38346
0
            if (b == ID_LEN)
38347
0
                ssl->options.resuming = 1; /* client wants to resume */
38348
0
            WOLFSSL_MSG("Client wants to resume session");
38349
0
        }
38350
0
        i += b;
38351
38352
#ifdef WOLFSSL_DTLS
38353
            /* cookie */
38354
            if (ssl->options.dtls) {
38355
                word8 peerCookieSz;
38356
                if ((i - begin) + OPAQUE8_LEN > helloSz) {
38357
                    ret = BUFFER_ERROR;
38358
                    goto out;
38359
                }
38360
38361
                peerCookieSz = input[i++];
38362
38363
                if (peerCookieSz) {
38364
                    if (peerCookieSz > MAX_COOKIE_LEN) {
38365
                        ret = BUFFER_ERROR;
38366
                        goto out;
38367
                    }
38368
38369
                    if ((i - begin) + peerCookieSz > helloSz) {
38370
                        ret = BUFFER_ERROR;
38371
                        goto out;
38372
                    }
38373
38374
                    i += peerCookieSz;
38375
                }
38376
            }
38377
#endif /* WOLFSSL_DTLS */
38378
38379
        /* suites */
38380
0
        if ((i - begin) + OPAQUE16_LEN > helloSz) {
38381
0
            ret = BUFFER_ERROR;
38382
0
            goto out;
38383
0
        }
38384
38385
0
        XFREE(ssl->clSuites, ssl->heap, DYNAMIC_TYPE_SUITES);
38386
0
        ssl->clSuites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
38387
0
                                       DYNAMIC_TYPE_SUITES);
38388
0
        if (ssl->clSuites == NULL) {
38389
0
            ret = MEMORY_E;
38390
0
            goto out;
38391
0
        }
38392
0
        XMEMSET(ssl->clSuites, 0, sizeof(Suites));
38393
0
        ato16(&input[i], &ssl->clSuites->suiteSz);
38394
0
        i += OPAQUE16_LEN;
38395
38396
        /* Cipher suite lists are always multiples of two in length. */
38397
0
        if (ssl->clSuites->suiteSz % 2 != 0) {
38398
0
            ret = BUFFER_ERROR;
38399
0
            goto out;
38400
0
        }
38401
38402
        /* suites and compression length check */
38403
0
        if ((i - begin) + ssl->clSuites->suiteSz + OPAQUE8_LEN > helloSz) {
38404
0
            ret = BUFFER_ERROR;
38405
0
            goto out;
38406
0
        }
38407
38408
0
        if (ssl->clSuites->suiteSz > WOLFSSL_MAX_SUITE_SZ) {
38409
0
            ret = BUFFER_ERROR;
38410
0
            goto out;
38411
0
        }
38412
38413
0
        XMEMCPY(ssl->clSuites->suites, input + i, ssl->clSuites->suiteSz);
38414
38415
0
#ifdef HAVE_SERVER_RENEGOTIATION_INFO
38416
        /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
38417
0
        if (FindSuite(ssl->clSuites, 0, TLS_EMPTY_RENEGOTIATION_INFO_SCSV) >=
38418
0
                0) {
38419
0
            TLSX* extension;
38420
38421
            /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
38422
0
            ret = TLSX_AddEmptyRenegotiationInfo(&ssl->extensions, ssl->heap);
38423
0
            if (ret != WOLFSSL_SUCCESS) {
38424
0
                ret = SECURE_RENEGOTIATION_E;
38425
0
                goto out;
38426
0
            } else {
38427
0
                ret = 0;
38428
0
            }
38429
38430
0
            extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
38431
0
            if (extension) {
38432
0
                ssl->secure_renegotiation =
38433
0
                                          (SecureRenegotiation*)extension->data;
38434
0
                ssl->secure_renegotiation->enabled = 1;
38435
0
            }
38436
0
        }
38437
0
#endif /* HAVE_SERVER_RENEGOTIATION_INFO */
38438
#if defined(HAVE_FALLBACK_SCSV) || defined(OPENSSL_ALL)
38439
        /* check for TLS_FALLBACK_SCSV suite */
38440
        if (FindSuite(ssl->clSuites, TLS_FALLBACK_SCSV, 0) >= 0) {
38441
            WOLFSSL_MSG("Found Fallback SCSV");
38442
            if (ssl->ctx->method->version.minor > pv.minor) {
38443
                WOLFSSL_MSG("Client trying to connect with lesser version");
38444
                SendAlert(ssl, alert_fatal, inappropriate_fallback);
38445
                ret = VERSION_ERROR;
38446
                goto out;
38447
            }
38448
        }
38449
#endif
38450
38451
0
        i += ssl->clSuites->suiteSz;
38452
0
        ssl->clSuites->hashSigAlgoSz = 0;
38453
38454
        /* compression length */
38455
0
        b = input[i++];
38456
38457
0
        if ((i - begin) + b > helloSz) {
38458
0
            ret = BUFFER_ERROR;
38459
0
            goto out;
38460
0
        }
38461
38462
0
        if (b == 0) {
38463
0
            WOLFSSL_MSG("No compression types in list");
38464
#ifdef WOLFSSL_EXTRA_ALERTS
38465
            SendAlert(ssl, alert_fatal, decode_error);
38466
#endif
38467
0
            ret = COMPRESSION_ERROR;
38468
0
            goto out;
38469
0
        }
38470
38471
0
        {
38472
            /* compression match types */
38473
0
            int matchNo = 0;
38474
0
            int matchZlib = 0;
38475
38476
0
            while (b--) {
38477
0
                byte comp = input[i++];
38478
38479
0
                if (comp == NO_COMPRESSION) {
38480
0
                    matchNo = 1;
38481
0
                }
38482
0
                if (comp == ZLIB_COMPRESSION) {
38483
0
                    matchZlib = 1;
38484
0
                }
38485
0
            }
38486
38487
0
            if (ssl->options.usingCompression == 0 && matchNo) {
38488
0
                WOLFSSL_MSG("Matched No Compression");
38489
0
            } else if (ssl->options.usingCompression && matchZlib) {
38490
0
                WOLFSSL_MSG("Matched zlib Compression");
38491
0
            } else if (ssl->options.usingCompression && matchNo) {
38492
0
                WOLFSSL_MSG("Could only match no compression, turning off");
38493
0
                ssl->options.usingCompression = 0;  /* turn off */
38494
0
            } else {
38495
0
                WOLFSSL_MSG("Could not match compression");
38496
#ifdef WOLFSSL_EXTRA_ALERTS
38497
                SendAlert(ssl, alert_fatal, illegal_parameter);
38498
#endif
38499
0
                ret = COMPRESSION_ERROR;
38500
0
                goto out;
38501
0
            }
38502
0
        }
38503
38504
0
        *inOutIdx = i;
38505
38506
        /* tls extensions */
38507
0
        if ((i - begin) < helloSz) {
38508
0
#ifdef HAVE_TLS_EXTENSIONS
38509
0
            if (TLSX_SupportExtensions(ssl))
38510
#else
38511
            if (IsAtLeastTLSv1_2(ssl))
38512
#endif
38513
0
            {
38514
                /* Process the hello extension. Skip unsupported. */
38515
0
                word16 totalExtSz;
38516
38517
0
#ifdef HAVE_TLS_EXTENSIONS
38518
                /* auto populate extensions supported unless user defined */
38519
0
                if ((ret = TLSX_PopulateExtensions(ssl, 1)) != 0)
38520
0
                    goto out;
38521
0
#endif
38522
38523
0
                if ((i - begin) + OPAQUE16_LEN > helloSz) {
38524
0
                    ret = BUFFER_ERROR;
38525
0
                    goto out;
38526
0
                }
38527
38528
0
                ato16(&input[i], &totalExtSz);
38529
0
                i += OPAQUE16_LEN;
38530
38531
0
                if ((i - begin) + totalExtSz > helloSz) {
38532
0
                    ret = BUFFER_ERROR;
38533
0
                    goto out;
38534
0
                }
38535
38536
0
#ifdef HAVE_TLS_EXTENSIONS
38537
                /* tls extensions */
38538
0
                if ((ret = TLSX_Parse(ssl, input + i, totalExtSz, client_hello,
38539
0
                                                                ssl->clSuites)))
38540
0
                    goto out;
38541
0
    #ifdef WOLFSSL_TLS13
38542
0
                if (TLSX_Find(ssl->extensions,
38543
0
                                             TLSX_SUPPORTED_VERSIONS) != NULL) {
38544
0
                    WOLFSSL_MSG(
38545
0
                            "Client attempting to connect with higher version");
38546
0
                    ret = VERSION_ERROR;
38547
0
                    goto out;
38548
0
                }
38549
0
    #endif
38550
0
    #ifdef HAVE_SNI
38551
0
                if((ret=SNI_Callback(ssl)))
38552
0
                    goto out;
38553
0
    #endif
38554
    #ifdef HAVE_ALPN
38555
                if((ret=ALPN_Select(ssl)))
38556
                    goto out;
38557
    #endif
38558
38559
0
                i += totalExtSz;
38560
#else
38561
                while (totalExtSz) {
38562
                    word16 extId, extSz;
38563
38564
                    if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz) {
38565
                        ret = BUFFER_ERROR;
38566
                        goto out;
38567
                    }
38568
38569
                    ato16(&input[i], &extId);
38570
                    i += OPAQUE16_LEN;
38571
                    ato16(&input[i], &extSz);
38572
                    i += OPAQUE16_LEN;
38573
38574
                    if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz) {
38575
                        ret = BUFFER_ERROR;
38576
                        goto out;
38577
                    }
38578
38579
                    if (extId == HELLO_EXT_SIG_ALGO) {
38580
                        word16 hashSigAlgoSz;
38581
38582
                        ato16(&input[i], &hashSigAlgoSz);
38583
                        i += OPAQUE16_LEN;
38584
38585
                        if (OPAQUE16_LEN + hashSigAlgoSz > extSz) {
38586
                            ret = BUFFER_ERROR;
38587
                            goto out;
38588
                        }
38589
38590
                        if (hashSigAlgoSz % 2 != 0) {
38591
                            ret = BUFFER_ERROR;
38592
                            goto out;
38593
                        }
38594
38595
                        ssl->clSuites->hashSigAlgoSz = hashSigAlgoSz;
38596
                        if (ssl->clSuites->hashSigAlgoSz >
38597
                                WOLFSSL_MAX_SIGALGO) {
38598
                            WOLFSSL_MSG("ClientHello SigAlgo list exceeds max, "
38599
                                                                  "truncating");
38600
                            ssl->clSuites->hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
38601
                        }
38602
38603
                        XMEMCPY(ssl->clSuites->hashSigAlgo, &input[i],
38604
                                                  ssl->clSuites->hashSigAlgoSz);
38605
38606
                        i += hashSigAlgoSz;
38607
                    }
38608
#ifdef HAVE_EXTENDED_MASTER
38609
                    else if (extId == HELLO_EXT_EXTMS)
38610
                        ssl->options.haveEMS = 1;
38611
#endif
38612
                    else
38613
                        i += extSz;
38614
38615
                    totalExtSz -= (word16)(OPAQUE16_LEN + OPAQUE16_LEN) + extSz;
38616
                }
38617
#endif
38618
0
                *inOutIdx = i;
38619
0
            }
38620
0
            else
38621
0
                *inOutIdx = begin + helloSz; /* skip extensions */
38622
0
        }
38623
38624
#ifdef WOLFSSL_DTLS_CID
38625
        if (ssl->options.useDtlsCID)
38626
            DtlsCIDOnExtensionsParsed(ssl);
38627
#endif /* WOLFSSL_DTLS_CID */
38628
38629
0
        ssl->options.clientState   = CLIENT_HELLO_COMPLETE;
38630
0
        ssl->options.haveSessionId = 1;
38631
38632
        /* ProcessOld uses same resume code */
38633
0
        WOLFSSL_MSG_EX("ssl->options.resuming %d", ssl->options.resuming);
38634
0
        if (ssl->options.resuming) {
38635
0
            ret = HandleTlsResumption(ssl, ssl->clSuites);
38636
0
            if (ret != 0)
38637
0
                goto out;
38638
38639
0
#if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_ENCRYPT_THEN_MAC) && \
38640
0
    !defined(WOLFSSL_AEAD_ONLY)
38641
0
            if (ssl->options.encThenMac && ssl->specs.cipher_type == block) {
38642
0
                ret = TLSX_EncryptThenMac_Respond(ssl);
38643
0
                if (ret != 0)
38644
0
                    goto out;
38645
0
            }
38646
0
            else
38647
0
                ssl->options.encThenMac = 0;
38648
0
#endif
38649
0
            if (ssl->options.clientState == CLIENT_KEYEXCHANGE_COMPLETE) {
38650
0
                WOLFSSL_LEAVE("DoClientHello", ret);
38651
0
                WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
38652
38653
0
                goto out;
38654
0
            }
38655
0
        }
38656
38657
38658
0
#if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_DH_DEFAULT_PARAMS)
38659
0
    #if defined(HAVE_FFDHE) && defined(HAVE_SUPPORTED_CURVES)
38660
0
        if (TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS) != NULL) {
38661
            /* Set FFDHE parameters or clear DHE parameters if FFDH parameters
38662
             * present and no matches in the server's list. */
38663
0
            ret = TLSX_SupportedFFDHE_Set(ssl);
38664
0
            if (ret != 0)
38665
0
                goto out;
38666
0
        }
38667
0
    #endif
38668
0
#endif
38669
38670
#ifdef OPENSSL_EXTRA
38671
        /* Give user last chance to provide a cert for cipher selection */
38672
        if (ret == 0 && ssl->ctx->certSetupCb != NULL)
38673
            ret = CertSetupCbWrapper(ssl);
38674
#endif
38675
0
        if (ret == 0)
38676
0
            ret = MatchSuite(ssl, ssl->clSuites);
38677
38678
0
#if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_ENCRYPT_THEN_MAC) && \
38679
0
    !defined(WOLFSSL_AEAD_ONLY)
38680
0
        if (ret == 0 && ssl->options.encThenMac &&
38681
0
                                              ssl->specs.cipher_type == block) {
38682
0
            ret = TLSX_EncryptThenMac_Respond(ssl);
38683
0
        }
38684
0
        else
38685
0
            ssl->options.encThenMac = 0;
38686
0
#endif
38687
38688
#ifdef WOLFSSL_DTLS
38689
        if (ret == 0 && ssl->options.dtls)
38690
            DtlsMsgPoolReset(ssl);
38691
#endif
38692
38693
0
    out:
38694
0
#if !defined(OPENSSL_EXTRA)
38695
0
        XFREE(ssl->clSuites, ssl->heap, DYNAMIC_TYPE_SUITES);
38696
0
        ssl->clSuites = NULL;
38697
0
#endif
38698
0
        WOLFSSL_LEAVE("DoClientHello", ret);
38699
0
        WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
38700
38701
0
        if (ret != 0) {
38702
0
            WOLFSSL_ERROR_VERBOSE(ret);
38703
0
        }
38704
38705
0
        return ret;
38706
0
    }
38707
38708
38709
#if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
38710
                        defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
38711
38712
    typedef struct DcvArgs {
38713
        byte*  output; /* not allocated */
38714
        word32 sendSz;
38715
        word16 sz;
38716
        word32 sigSz;
38717
        word32 idx;
38718
        word32 begin;
38719
    } DcvArgs;
38720
38721
    static void FreeDcvArgs(WOLFSSL* ssl, void* pArgs)
38722
33
    {
38723
33
        DcvArgs* args = (DcvArgs*)pArgs;
38724
38725
33
        (void)ssl;
38726
33
        (void)args;
38727
33
    }
38728
38729
    /* handle processing of certificate_verify (15) */
38730
    static int DoCertificateVerify(WOLFSSL* ssl, byte* input,
38731
                                word32* inOutIdx, word32 size)
38732
0
    {
38733
0
        int ret = 0;
38734
    #ifdef WOLFSSL_ASYNC_CRYPT
38735
        DcvArgs* args = NULL;
38736
        WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
38737
    #else
38738
0
        DcvArgs  args[1];
38739
0
    #endif
38740
38741
0
        WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_DO);
38742
0
        WOLFSSL_ENTER("DoCertificateVerify");
38743
38744
    #ifdef WOLFSSL_ASYNC_CRYPT
38745
        if (ssl->async == NULL) {
38746
            ssl->async = (struct WOLFSSL_ASYNC*)
38747
                    XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
38748
                            DYNAMIC_TYPE_ASYNC);
38749
            if (ssl->async == NULL)
38750
                ERROR_OUT(MEMORY_E, exit_dcv);
38751
        }
38752
        args = (DcvArgs*)ssl->async->args;
38753
38754
        ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
38755
        if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
38756
            /* Check for error */
38757
            if (ret < 0)
38758
                goto exit_dcv;
38759
        }
38760
        else
38761
    #endif
38762
0
        {
38763
            /* Reset state */
38764
0
            ret = 0;
38765
0
            ssl->options.asyncState = TLS_ASYNC_BEGIN;
38766
0
            XMEMSET(args, 0, sizeof(DcvArgs));
38767
0
            ssl->options.peerHashAlgo = sha_mac;
38768
0
            ssl->options.peerSigAlgo = anonymous_sa_algo;
38769
0
            args->idx = *inOutIdx;
38770
0
            args->begin = *inOutIdx;
38771
        #ifdef WOLFSSL_ASYNC_CRYPT
38772
            ssl->async->freeArgs = FreeDcvArgs;
38773
        #endif
38774
0
        }
38775
38776
0
        switch(ssl->options.asyncState)
38777
0
        {
38778
0
            case TLS_ASYNC_BEGIN:
38779
0
            {
38780
            #ifdef WOLFSSL_CALLBACKS
38781
                if (ssl->hsInfoOn)
38782
                    AddPacketName(ssl, "CertificateVerify");
38783
                if (ssl->toInfoOn)
38784
                    AddLateName("CertificateVerify", &ssl->timeoutInfo);
38785
            #endif
38786
38787
                /* Advance state and proceed */
38788
0
                ssl->options.asyncState = TLS_ASYNC_BUILD;
38789
0
            } /* case TLS_ASYNC_BEGIN */
38790
0
            FALL_THROUGH;
38791
38792
0
            case TLS_ASYNC_BUILD:
38793
0
            {
38794
0
                if (IsAtLeastTLSv1_2(ssl)) {
38795
0
                    if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN > size) {
38796
0
                        ERROR_OUT(BUFFER_ERROR, exit_dcv);
38797
0
                    }
38798
38799
0
                    DecodeSigAlg(&input[args->idx], &ssl->options.peerHashAlgo,
38800
0
                                 &ssl->options.peerSigAlgo);
38801
0
                    args->idx += 2;
38802
0
                }
38803
0
            #ifndef NO_RSA
38804
0
                else if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0)
38805
0
                    ssl->options.peerSigAlgo = rsa_sa_algo;
38806
0
            #endif
38807
0
            #ifdef HAVE_ECC
38808
0
                else if (ssl->peerEccDsaKeyPresent) {
38809
0
                #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
38810
0
                    if (ssl->peerEccDsaKey->dp->id == ECC_SM2P256V1) {
38811
0
                        ssl->options.peerSigAlgo = sm2_sa_algo;
38812
0
                    }
38813
0
                    else
38814
0
                #endif
38815
0
                    {
38816
0
                        ssl->options.peerSigAlgo = ecc_dsa_sa_algo;
38817
0
                    }
38818
0
                }
38819
0
            #endif
38820
0
            #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
38821
0
                else if (ssl->peerEd25519KeyPresent)
38822
0
                    ssl->options.peerSigAlgo = ed25519_sa_algo;
38823
0
            #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
38824
0
            #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
38825
0
                else if (ssl->peerEd448KeyPresent)
38826
0
                    ssl->options.peerSigAlgo = ed448_sa_algo;
38827
0
            #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
38828
38829
0
                if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
38830
0
                    ERROR_OUT(BUFFER_ERROR, exit_dcv);
38831
0
                }
38832
38833
0
                ato16(input + args->idx, &args->sz);
38834
0
                args->idx += OPAQUE16_LEN;
38835
38836
0
                if ((args->idx - args->begin) + args->sz > size ||
38837
0
                                                    args->sz > ENCRYPT_LEN) {
38838
0
                    ERROR_OUT(BUFFER_ERROR, exit_dcv);
38839
0
                }
38840
38841
0
            #ifdef HAVE_ECC
38842
0
                if (ssl->peerEccDsaKeyPresent) {
38843
38844
0
                    WOLFSSL_MSG("Doing ECC peer cert verify");
38845
38846
                /* make sure a default is defined */
38847
0
                #if !defined(NO_SHA)
38848
0
                    SetDigest(ssl, sha_mac);
38849
                #elif !defined(NO_SHA256)
38850
                    SetDigest(ssl, sha256_mac);
38851
                #elif defined(WOLFSSL_SM3)
38852
                    SetDigest(ssl, sm3_mac);
38853
                #elif defined(WOLFSSL_SHA384)
38854
                    SetDigest(ssl, sha384_mac);
38855
                #elif defined(WOLFSSL_SHA512)
38856
                    SetDigest(ssl, sha512_mac);
38857
                #else
38858
                    #error No digest enabled for ECC sig verify
38859
                #endif
38860
38861
0
                    if (IsAtLeastTLSv1_2(ssl)) {
38862
0
                        if (ssl->options.peerSigAlgo != ecc_dsa_sa_algo
38863
0
                        #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
38864
0
                            && ssl->options.peerSigAlgo != sm2_sa_algo
38865
0
                        #endif
38866
0
                            ) {
38867
0
                            WOLFSSL_MSG("Oops, peer sent ECC key but not in verify");
38868
0
                        }
38869
38870
0
                        SetDigest(ssl, ssl->options.peerHashAlgo);
38871
0
                    }
38872
0
                }
38873
0
            #endif /* HAVE_ECC */
38874
0
            #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
38875
0
                if (ssl->peerEd25519KeyPresent) {
38876
0
                    WOLFSSL_MSG("Doing ED25519 peer cert verify");
38877
0
                    if (IsAtLeastTLSv1_2(ssl) &&
38878
0
                                             ssl->options.peerSigAlgo != ed25519_sa_algo) {
38879
0
                        WOLFSSL_MSG(
38880
0
                               "Oops, peer sent ED25519 key but not in verify");
38881
0
                    }
38882
0
                }
38883
0
            #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
38884
0
            #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
38885
0
                if (ssl->peerEd448KeyPresent) {
38886
0
                    WOLFSSL_MSG("Doing ED448 peer cert verify");
38887
0
                    if (IsAtLeastTLSv1_2(ssl) &&
38888
0
                                               ssl->options.peerSigAlgo != ed448_sa_algo) {
38889
0
                        WOLFSSL_MSG(
38890
0
                                 "Oops, peer sent ED448 key but not in verify");
38891
0
                    }
38892
0
                }
38893
0
            #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
38894
38895
                /* Advance state and proceed */
38896
0
                ssl->options.asyncState = TLS_ASYNC_DO;
38897
0
            } /* case TLS_ASYNC_BUILD */
38898
0
            FALL_THROUGH;
38899
38900
0
            case TLS_ASYNC_DO:
38901
0
            {
38902
0
            #ifndef NO_RSA
38903
0
                if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
38904
0
                    WOLFSSL_MSG("Doing RSA peer cert verify");
38905
38906
0
                    ret = RsaVerify(ssl,
38907
0
                        input + args->idx,
38908
0
                        args->sz,
38909
0
                        &args->output,
38910
0
                        ssl->options.peerSigAlgo, ssl->options.peerHashAlgo,
38911
0
                        ssl->peerRsaKey,
38912
                    #ifdef HAVE_PK_CALLBACKS
38913
                        &ssl->buffers.peerRsaKey
38914
                    #else
38915
0
                        NULL
38916
0
                    #endif
38917
0
                    );
38918
0
                    if (ret >= 0) {
38919
0
                        if (ssl->options.peerSigAlgo == rsa_sa_algo)
38920
0
                            args->sendSz = (word32)ret;
38921
0
                        else {
38922
0
                            args->sigSz = (word32)ret;
38923
0
                            args->sendSz = ssl->buffers.digest.length;
38924
0
                        }
38925
0
                        ret = 0;
38926
0
                    }
38927
0
                }
38928
0
            #endif /* !NO_RSA */
38929
0
            #ifdef HAVE_ECC
38930
0
                if (ssl->peerEccDsaKeyPresent) {
38931
0
                    WOLFSSL_MSG("Doing ECC peer cert verify");
38932
38933
0
                #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
38934
0
                    if (ssl->options.peerSigAlgo == sm2_sa_algo) {
38935
0
                        ret = Sm2wSm3Verify(ssl,
38936
0
                            TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ,
38937
0
                            input + args->idx, args->sz,
38938
0
                            ssl->hsHashes->messages, ssl->hsHashes->prevLen,
38939
0
                            ssl->peerEccDsaKey,
38940
                        #ifdef HAVE_PK_CALLBACKS
38941
                            &ssl->buffers.peerEccDsaKey
38942
                        #else
38943
0
                            NULL
38944
0
                        #endif
38945
0
                        );
38946
0
                    }
38947
0
                    else
38948
0
                #endif
38949
0
                    {
38950
0
                        ret = EccVerify(ssl,
38951
0
                            input + args->idx, args->sz,
38952
0
                            ssl->buffers.digest.buffer,
38953
0
                            ssl->buffers.digest.length,
38954
0
                            ssl->peerEccDsaKey,
38955
                        #ifdef HAVE_PK_CALLBACKS
38956
                            &ssl->buffers.peerEccDsaKey
38957
                        #else
38958
0
                            NULL
38959
0
                        #endif
38960
0
                        );
38961
0
                    }
38962
                    /* SERVER: Data verified with certificate's public key. */
38963
0
                    ssl->options.peerAuthGood = ssl->options.havePeerCert &&
38964
0
                                                (ret == 0);
38965
0
                }
38966
0
            #endif /* HAVE_ECC */
38967
0
            #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
38968
0
                if (ssl->peerEd25519KeyPresent) {
38969
0
                    WOLFSSL_MSG("Doing Ed25519 peer cert verify");
38970
38971
0
                    ret = Ed25519Verify(ssl,
38972
0
                        input + args->idx, args->sz,
38973
0
                        ssl->hsHashes->messages, ssl->hsHashes->prevLen,
38974
0
                        ssl->peerEd25519Key,
38975
                    #ifdef HAVE_PK_CALLBACKS
38976
                        &ssl->buffers.peerEd25519Key
38977
                    #else
38978
0
                        NULL
38979
0
                    #endif
38980
0
                    );
38981
                    /* SERVER: Data verified with certificate's public key. */
38982
0
                    ssl->options.peerAuthGood = ssl->options.havePeerCert &&
38983
0
                                                (ret == 0);
38984
0
                }
38985
0
            #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
38986
0
            #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
38987
0
                if (ssl->peerEd448KeyPresent) {
38988
0
                    WOLFSSL_MSG("Doing Ed448 peer cert verify");
38989
38990
0
                    ret = Ed448Verify(ssl,
38991
0
                        input + args->idx, args->sz,
38992
0
                        ssl->hsHashes->messages, ssl->hsHashes->prevLen,
38993
0
                        ssl->peerEd448Key,
38994
                    #ifdef HAVE_PK_CALLBACKS
38995
                        &ssl->buffers.peerEd448Key
38996
                    #else
38997
0
                        NULL
38998
0
                    #endif
38999
0
                    );
39000
                    /* SERVER: Data verified with certificate's public key. */
39001
0
                    ssl->options.peerAuthGood = ssl->options.havePeerCert &&
39002
0
                                                (ret == 0);
39003
0
                }
39004
0
            #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
39005
39006
            #ifdef WOLFSSL_ASYNC_CRYPT
39007
                /* handle async pending */
39008
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
39009
                    goto exit_dcv;
39010
            #endif
39011
39012
                /* Check for error */
39013
0
                if (ret != 0) {
39014
0
                    ret = SIG_VERIFY_E;
39015
0
                    goto exit_dcv;
39016
0
                }
39017
39018
                /* Advance state and proceed */
39019
0
                ssl->options.asyncState = TLS_ASYNC_VERIFY;
39020
0
            } /* case TLS_ASYNC_DO */
39021
0
            FALL_THROUGH;
39022
39023
0
            case TLS_ASYNC_VERIFY:
39024
0
            {
39025
0
            #ifndef NO_RSA
39026
0
                if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
39027
0
                    if (IsAtLeastTLSv1_2(ssl)) {
39028
0
                    #ifdef WC_RSA_PSS
39029
0
                        if (ssl->options.peerSigAlgo == rsa_pss_sa_algo) {
39030
0
                            SetDigest(ssl, ssl->options.peerHashAlgo);
39031
39032
                        #ifdef HAVE_SELFTEST
39033
                            ret = wc_RsaPSS_CheckPadding(
39034
                                            ssl->buffers.digest.buffer,
39035
                                            ssl->buffers.digest.length,
39036
                                            args->output, args->sigSz,
39037
                                            HashAlgoToType(ssl->options.peerHashAlgo));
39038
                        #else
39039
0
                            ret = wc_RsaPSS_CheckPadding_ex(
39040
0
                                            ssl->buffers.digest.buffer,
39041
0
                                            ssl->buffers.digest.length,
39042
0
                                            args->output, args->sigSz,
39043
0
                                            HashAlgoToType(ssl->options.peerHashAlgo), -1,
39044
0
                                            mp_count_bits(&ssl->peerRsaKey->n));
39045
0
                        #endif
39046
0
                            if (ret != 0) {
39047
0
                                ret = SIG_VERIFY_E;
39048
0
                                goto exit_dcv;
39049
0
                            }
39050
0
                        }
39051
0
                        else
39052
0
                    #endif
39053
0
                        {
39054
                        #ifndef WOLFSSL_SMALL_STACK
39055
                            byte  encodedSig[MAX_ENCODED_SIG_SZ];
39056
                        #else
39057
0
                            byte* encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
39058
0
                                             ssl->heap, DYNAMIC_TYPE_SIGNATURE);
39059
0
                            if (encodedSig == NULL) {
39060
0
                                ERROR_OUT(MEMORY_E, exit_dcv);
39061
0
                            }
39062
0
                        #endif
39063
39064
0
                            if (ssl->options.peerSigAlgo != rsa_sa_algo) {
39065
0
                                WOLFSSL_MSG("Oops, peer sent RSA key but not "
39066
0
                                            "in verify");
39067
0
                            }
39068
39069
0
                            SetDigest(ssl, ssl->options.peerHashAlgo);
39070
39071
0
                            args->sigSz = wc_EncodeSignature(encodedSig,
39072
0
                                ssl->buffers.digest.buffer,
39073
0
                                ssl->buffers.digest.length,
39074
0
                                TypeHash(ssl->options.peerHashAlgo));
39075
39076
0
                            if (args->sendSz != args->sigSz || !args->output ||
39077
0
                                XMEMCMP(args->output, encodedSig,
39078
0
                                   min(args->sigSz, MAX_ENCODED_SIG_SZ)) != 0) {
39079
0
                                ret = VERIFY_CERT_ERROR;
39080
0
                            }
39081
39082
0
                        #ifdef WOLFSSL_SMALL_STACK
39083
0
                            XFREE(encodedSig, ssl->heap,
39084
0
                                  DYNAMIC_TYPE_SIGNATURE);
39085
0
                        #endif
39086
0
                        }
39087
0
                    }
39088
0
                    else {
39089
0
                        if (args->sendSz != FINISHED_SZ || !args->output ||
39090
0
                            XMEMCMP(args->output,
39091
0
                                &ssl->hsHashes->certHashes, FINISHED_SZ) != 0) {
39092
0
                            ret = VERIFY_CERT_ERROR;
39093
0
                        }
39094
0
                    }
39095
0
                    if (ret == 0) {
39096
                        /* SERVER: Data verified with cert's public key. */
39097
0
                        ssl->options.peerAuthGood = ssl->options.havePeerCert &&
39098
0
                                                    (ret == 0);
39099
0
                    }
39100
0
                }
39101
0
            #endif /* !NO_RSA */
39102
0
                if (ret != 0)
39103
0
                    break;
39104
39105
                /* Advance state and proceed */
39106
0
                ssl->options.asyncState = TLS_ASYNC_FINALIZE;
39107
0
            } /* case TLS_ASYNC_VERIFY */
39108
0
            FALL_THROUGH;
39109
39110
0
            case TLS_ASYNC_FINALIZE:
39111
0
            {
39112
0
                if (IsEncryptionOn(ssl, 0))
39113
0
                    args->idx += ssl->keys.padSz;
39114
39115
0
                ssl->options.havePeerVerify = 1;
39116
39117
                /* Set final index */
39118
0
                args->idx += args->sz;
39119
0
                *inOutIdx = args->idx;
39120
39121
                /* Advance state and proceed */
39122
0
                ssl->options.asyncState = TLS_ASYNC_END;
39123
0
            } /* case TLS_ASYNC_FINALIZE */
39124
0
            FALL_THROUGH;
39125
39126
0
            case TLS_ASYNC_END:
39127
0
            {
39128
0
                break;
39129
0
            }
39130
0
            default:
39131
0
                ret = INPUT_CASE_ERROR;
39132
0
        } /* switch(ssl->options.asyncState) */
39133
39134
0
    exit_dcv:
39135
39136
0
        WOLFSSL_LEAVE("DoCertificateVerify", ret);
39137
0
        WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_DO);
39138
39139
    #ifdef WOLFSSL_ASYNC_CRYPT
39140
        /* Handle async operation */
39141
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
39142
            /* Mark message as not received so it can process again */
39143
            ssl->msgsReceived.got_certificate_verify = 0;
39144
39145
            return ret;
39146
        }
39147
    #endif /* WOLFSSL_ASYNC_CRYPT */
39148
    #ifdef WOLFSSL_EXTRA_ALERTS
39149
        if (ret == WC_NO_ERR_TRACE(BUFFER_ERROR))
39150
            SendAlert(ssl, alert_fatal, decode_error);
39151
        else if (ret == WC_NO_ERR_TRACE(SIG_VERIFY_E))
39152
            SendAlert(ssl, alert_fatal, decrypt_error);
39153
        else if (ret != 0)
39154
            SendAlert(ssl, alert_fatal, bad_certificate);
39155
    #endif
39156
        /* Digest is not allocated, so do this to prevent free */
39157
0
        if(ssl->buffers.digest.buffer) {
39158
0
            if (!ssl->options.dontFreeDigest) {
39159
                /*This should not happen*/
39160
0
                XFREE(ssl->buffers.digest.buffer,
39161
0
                    ssl->heap, DYNAMIC_TYPE_DIGEST);
39162
0
            }
39163
0
        }
39164
0
        ssl->buffers.digest.buffer = NULL;
39165
0
        ssl->buffers.digest.length = 0;
39166
0
        ssl->options.dontFreeDigest = 0;
39167
39168
    #ifdef WOLFSSL_ASYNC_CRYPT
39169
        /* Cleanup async */
39170
        FreeAsyncCtx(ssl, 0);
39171
    #else
39172
0
        FreeDcvArgs(ssl, args);
39173
0
    #endif
39174
        /* Final cleanup */
39175
0
        FreeKeyExchange(ssl);
39176
39177
0
        if (ret != 0) {
39178
0
            WOLFSSL_ERROR_VERBOSE(ret);
39179
0
        }
39180
39181
0
        return ret;
39182
0
    }
39183
39184
#endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
39185
39186
    /* handle generation of server_hello_done (14) */
39187
    int SendServerHelloDone(WOLFSSL* ssl)
39188
0
    {
39189
0
        byte* output;
39190
0
        int   sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
39191
0
        int   ret;
39192
39193
0
        WOLFSSL_START(WC_FUNC_SERVER_HELLO_DONE_SEND);
39194
0
        WOLFSSL_ENTER("SendServerHelloDone");
39195
39196
    #ifdef WOLFSSL_DTLS
39197
        if (ssl->options.dtls)
39198
            sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
39199
    #endif
39200
39201
0
        if (IsEncryptionOn(ssl, 1))
39202
0
            sendSz += MAX_MSG_EXTRA;
39203
39204
        /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
39205
         * is not advanced yet */
39206
0
        ssl->options.buildingMsg = 1;
39207
39208
        /* check for available size */
39209
0
        if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
39210
0
            return ret;
39211
39212
        /* get output buffer */
39213
0
        output = GetOutputBuffer(ssl);
39214
0
        AddHeaders(output, 0, server_hello_done, ssl);
39215
39216
0
        if (IsEncryptionOn(ssl, 1)) {
39217
0
            byte* input;
39218
0
            int   inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
39219
0
            int   recordHeaderSz = RECORD_HEADER_SZ;
39220
39221
0
            if (ssl->options.dtls) {
39222
0
                recordHeaderSz += DTLS_RECORD_EXTRA;
39223
0
                inputSz += DTLS_HANDSHAKE_EXTRA;
39224
0
            }
39225
39226
0
            input = (byte*)XMALLOC((size_t)inputSz, ssl->heap,
39227
0
                    DYNAMIC_TYPE_IN_BUFFER);
39228
0
            if (input == NULL)
39229
0
                return MEMORY_E;
39230
39231
0
            XMEMCPY(input, output + recordHeaderSz, (size_t)(inputSz));
39232
            #ifdef WOLFSSL_DTLS
39233
            if (IsDtlsNotSctpMode(ssl) &&
39234
                    (ret = DtlsMsgPoolSave(ssl, input, (word32)inputSz, server_hello_done)) != 0) {
39235
                XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
39236
                return ret;
39237
            }
39238
            #endif
39239
0
            sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
39240
0
                                  handshake, 1, 0, 0, CUR_ORDER);
39241
0
            XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
39242
39243
0
            if (sendSz < 0)
39244
0
                return sendSz;
39245
0
        } else {
39246
            #ifdef WOLFSSL_DTLS
39247
                if (IsDtlsNotSctpMode(ssl)) {
39248
                    if ((ret = DtlsMsgPoolSave(ssl, output, (word32)sendSz, server_hello_done)) != 0)
39249
                        return ret;
39250
                }
39251
                if (ssl->options.dtls)
39252
                    DtlsSEQIncrement(ssl, CUR_ORDER);
39253
            #endif
39254
0
            ret = HashOutput(ssl, output, sendSz, 0);
39255
0
            if (ret != 0)
39256
0
                return ret;
39257
0
        }
39258
39259
    #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
39260
        if (ssl->hsInfoOn)
39261
            AddPacketName(ssl, "ServerHelloDone");
39262
        if (ssl->toInfoOn) {
39263
            ret = AddPacketInfo(ssl, "ServerHelloDone", handshake, output,
39264
                    sendSz, WRITE_PROTO, 0, ssl->heap);
39265
            if (ret != 0)
39266
                return ret;
39267
        }
39268
    #endif
39269
0
        ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
39270
0
        ssl->options.buildingMsg = 0;
39271
39272
0
        ssl->buffers.outputBuffer.length += (word32)sendSz;
39273
39274
0
        ret = SendBuffered(ssl);
39275
39276
0
        WOLFSSL_LEAVE("SendServerHelloDone", ret);
39277
0
        WOLFSSL_END(WC_FUNC_SERVER_HELLO_DONE_SEND);
39278
39279
0
        return ret;
39280
0
    }
39281
39282
#endif /* !WOLFSSL_NO_TLS12 */
39283
39284
#ifdef HAVE_SESSION_TICKET
39285
39286
#ifdef WOLFSSL_TICKET_HAVE_ID
39287
    static void GetRealSessionID(WOLFSSL* ssl, const byte** id, byte* idSz)
39288
    {
39289
        if (ssl->session->haveAltSessionID) {
39290
            *id = ssl->session->altSessionID;
39291
            *idSz = ID_LEN;
39292
        }
39293
        else if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL) {
39294
            *id = ssl->arrays->sessionID;
39295
            *idSz = ssl->arrays->sessionIDSz;
39296
        }
39297
        else {
39298
            *id = ssl->session->sessionID;
39299
            *idSz = ssl->session->sessionIDSz;
39300
        }
39301
    }
39302
#endif
39303
39304
    int SetupTicket(WOLFSSL* ssl)
39305
    {
39306
        int ret = 0;
39307
39308
        (void)ssl;
39309
39310
#ifdef WOLFSSL_TLS13
39311
        {
39312
            /* Client adds to ticket age to obfuscate. */
39313
            byte ageAdd[AGEADD_LEN]; /* Obfuscation of age */
39314
            ret = wc_RNG_GenerateBlock(ssl->rng, ageAdd, AGEADD_LEN);
39315
            if (ret != 0)
39316
                return ret;
39317
            ato32(ageAdd, &ssl->session->ticketAdd);
39318
        }
39319
#endif
39320
39321
#ifdef WOLFSSL_TICKET_HAVE_ID
39322
        {
39323
            const byte* id = NULL;
39324
            byte idSz = 0;
39325
39326
            GetRealSessionID(ssl, &id, &idSz);
39327
            if (idSz == 0) {
39328
                ret = wc_RNG_GenerateBlock(ssl->rng, ssl->session->altSessionID,
39329
                                           ID_LEN);
39330
                if (ret != 0)
39331
                    return ret;
39332
                ssl->session->haveAltSessionID = 1;
39333
            }
39334
        }
39335
#endif
39336
        return ret;
39337
    }
39338
39339
    /* create a new session ticket, 0 on success
39340
     * Do any kind of setup in SetupTicket */
39341
    int CreateTicket(WOLFSSL* ssl)
39342
    {
39343
        InternalTicket* it;
39344
        ExternalTicket* et;
39345
        int encLen;
39346
        int ret;
39347
        int error;
39348
        word32 itHash = 0;
39349
        byte zeros[WOLFSSL_TICKET_MAC_SZ];   /* biggest cmp size */
39350
39351
        WOLFSSL_ASSERT_SIZEOF_GE(ssl->session->staticTicket, *et);
39352
        WOLFSSL_ASSERT_SIZEOF_GE(et->enc_ticket, *it);
39353
39354
        if (ssl->session->ticket != ssl->session->staticTicket) {
39355
            /* Always use the static ticket buffer */
39356
            XFREE(ssl->session->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
39357
            ssl->session->ticket = ssl->session->staticTicket;
39358
            ssl->session->ticketLenAlloc = 0;
39359
        }
39360
39361
        et = (ExternalTicket*)ssl->session->ticket;
39362
        it = (InternalTicket*)et->enc_ticket;
39363
39364
    #ifdef WOLFSSL_ASYNC_CRYPT
39365
        if (ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E))
39366
    #endif
39367
        {
39368
            XMEMSET(et, 0, sizeof(*et));
39369
        }
39370
39371
        /* build internal */
39372
        it->pv.major = ssl->version.major;
39373
        it->pv.minor = ssl->version.minor;
39374
39375
        it->suite[0] = ssl->options.cipherSuite0;
39376
        it->suite[1] = ssl->options.cipherSuite;
39377
39378
    #ifdef WOLFSSL_EARLY_DATA
39379
        c32toa(ssl->options.maxEarlyDataSz, it->maxEarlyDataSz);
39380
    #endif
39381
39382
        if (!ssl->options.tls1_3) {
39383
            if (ssl->arrays == NULL) {
39384
                WOLFSSL_MSG("CreateTicket called with null arrays");
39385
                ret = BAD_FUNC_ARG;
39386
                goto error;
39387
            }
39388
            XMEMCPY(it->msecret, ssl->arrays->masterSecret, SECRET_LEN);
39389
#ifndef NO_ASN_TIME
39390
            c32toa(LowResTimer(), it->timestamp);
39391
#endif
39392
            it->haveEMS = (byte) ssl->options.haveEMS;
39393
        }
39394
        else {
39395
#ifdef WOLFSSL_TLS13
39396
        #ifdef WOLFSSL_32BIT_MILLI_TIME
39397
            word32 now = TimeNowInMilliseconds();
39398
        #else
39399
            sword64 now = TimeNowInMilliseconds();
39400
        #endif
39401
            if (now == 0) {
39402
                ret = GETTIME_ERROR;
39403
                goto error;
39404
            }
39405
39406
            c32toa(ssl->session->ticketAdd, it->ageAdd);
39407
            c16toa(ssl->session->namedGroup, it->namedGroup);
39408
        #ifdef WOLFSSL_32BIT_MILLI_TIME
39409
            c32toa(now, it->timestamp);
39410
        #else
39411
            c32toa((word32)(now >> 32), it->timestamp);
39412
            c32toa((word32)now        , it->timestamp + OPAQUE32_LEN);
39413
        #endif
39414
            /* Resumption master secret. */
39415
            XMEMCPY(it->msecret, ssl->session->masterSecret, SECRET_LEN);
39416
            if (ssl->session->ticketNonce.len > MAX_TICKET_NONCE_STATIC_SZ) {
39417
                WOLFSSL_MSG("Bad ticket nonce value");
39418
                ret = BAD_TICKET_MSG_SZ;
39419
                goto error;
39420
            }
39421
            XMEMCPY(it->ticketNonce, ssl->session->ticketNonce.data,
39422
                ssl->session->ticketNonce.len);
39423
            it->ticketNonceLen = ssl->session->ticketNonce.len;
39424
#endif
39425
        }
39426
39427
#ifdef OPENSSL_EXTRA
39428
        it->sessionCtxSz = ssl->sessionCtxSz;
39429
        XMEMCPY(it->sessionCtx, ssl->sessionCtx, ID_LEN);
39430
#endif
39431
39432
#ifdef WOLFSSL_TICKET_HAVE_ID
39433
        {
39434
            const byte* id = NULL;
39435
            byte idSz = 0;
39436
            GetRealSessionID(ssl, &id, &idSz);
39437
            /* make sure idSz is not larger than ID_LEN */
39438
            if (idSz > ID_LEN)
39439
                idSz = ID_LEN;
39440
            XMEMCPY(it->id, id, idSz);
39441
        }
39442
#endif
39443
39444
        /* encrypt */
39445
        encLen = WOLFSSL_TICKET_ENC_SZ;  /* max size user can use */
39446
        if (ssl->ctx->ticketEncCb == NULL
39447
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL)
39448
                ||
39449
                /* WOLFSSL_OP_NO_TICKET turns off tickets in <= 1.2. Forces
39450
                 * "stateful" tickets for 1.3 so just use the regular
39451
                 * stateless ones. */
39452
                (!IsAtLeastTLSv1_3(ssl->version) &&
39453
                        (ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0)
39454
#endif
39455
                        ) {
39456
            /* Use BAD_TICKET_ENCRYPT to signal missing ticket callback */
39457
            ret = BAD_TICKET_ENCRYPT;
39458
        }
39459
        else {
39460
            itHash = HashObject((byte*)it, sizeof(*it), &error);
39461
            if (error == 0) {
39462
                ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv, et->mac,
39463
                        1, et->enc_ticket, WOLFSSL_INTERNAL_TICKET_LEN, &encLen,
39464
                        SSL_TICKET_CTX(ssl));
39465
            }
39466
            else {
39467
                ret = WOLFSSL_TICKET_RET_FATAL;
39468
            }
39469
        }
39470
        if (ret != WOLFSSL_TICKET_RET_OK) {
39471
#ifdef WOLFSSL_ASYNC_CRYPT
39472
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
39473
                return ret;
39474
            }
39475
#endif
39476
            goto error;
39477
        }
39478
        if (encLen < (int)WOLFSSL_INTERNAL_TICKET_LEN ||
39479
                encLen > (int)WOLFSSL_TICKET_ENC_SZ) {
39480
            WOLFSSL_MSG("Bad user ticket encrypt size");
39481
            ret = BAD_TICKET_KEY_CB_SZ;
39482
        }
39483
39484
        /* sanity checks on encrypt callback */
39485
39486
        /* internal ticket can't be the same if encrypted */
39487
        if (itHash == HashObject((byte*)it, sizeof(*it), &error) || error != 0)
39488
        {
39489
            WOLFSSL_MSG("User ticket encrypt didn't encrypt or hash failed");
39490
            ret = BAD_TICKET_ENCRYPT;
39491
            goto error;
39492
        }
39493
39494
        XMEMSET(zeros, 0, sizeof(zeros));
39495
39496
        /* name */
39497
        if (XMEMCMP(et->key_name, zeros, WOLFSSL_TICKET_NAME_SZ) == 0) {
39498
            WOLFSSL_MSG("User ticket encrypt didn't set name");
39499
            ret = BAD_TICKET_ENCRYPT;
39500
            goto error;
39501
        }
39502
39503
        /* iv */
39504
        if (XMEMCMP(et->iv, zeros, WOLFSSL_TICKET_IV_SZ) == 0) {
39505
            WOLFSSL_MSG("User ticket encrypt didn't set iv");
39506
            ret = BAD_TICKET_ENCRYPT;
39507
            goto error;
39508
        }
39509
39510
        /* mac */
39511
        if (XMEMCMP(et->mac, zeros, WOLFSSL_TICKET_MAC_SZ) == 0) {
39512
            WOLFSSL_MSG("User ticket encrypt didn't set mac");
39513
            ret = BAD_TICKET_ENCRYPT;
39514
            goto error;
39515
        }
39516
39517
        /* set size */
39518
        c16toa((word16)encLen, et->enc_len);
39519
        if (encLen < (int)WOLFSSL_TICKET_ENC_SZ) {
39520
            /* move mac up since whole enc buffer not used */
39521
            XMEMMOVE(et->enc_ticket + encLen, et->mac,
39522
                    WOLFSSL_TICKET_MAC_SZ);
39523
        }
39524
        ssl->session->ticketLen =
39525
                (word16)(encLen + WOLFSSL_TICKET_FIXED_SZ);
39526
39527
        return ret;
39528
    error:
39529
#ifdef WOLFSSL_CHECK_MEM_ZERO
39530
        /* Ticket has sensitive data in it now. */
39531
        wc_MemZero_Add("Create Ticket internal", it, sizeof(InternalTicket));
39532
#endif
39533
        ForceZero(it, sizeof(*it));
39534
#ifdef WOLFSSL_CHECK_MEM_ZERO
39535
        wc_MemZero_Check(it, sizeof(InternalTicket));
39536
#endif
39537
        WOLFSSL_ERROR_VERBOSE(ret);
39538
        return ret;
39539
39540
    }
39541
39542
    int DoDecryptTicket(const WOLFSSL* ssl, const byte* input, word32 len,
39543
        InternalTicket **it)
39544
    {
39545
        ExternalTicket* et;
39546
        int             ret;
39547
        int             outLen;
39548
        word16          inLen;
39549
39550
        WOLFSSL_START(WC_FUNC_TICKET_DO);
39551
        WOLFSSL_ENTER("DoDecryptTicket");
39552
39553
        if (len > SESSION_TICKET_LEN ||
39554
            len < (word32)(WOLFSSL_INTERNAL_TICKET_LEN +
39555
                           WOLFSSL_TICKET_FIXED_SZ)) {
39556
            WOLFSSL_ERROR_VERBOSE(BAD_TICKET_MSG_SZ);
39557
            return WOLFSSL_TICKET_RET_REJECT;
39558
        }
39559
39560
        et = (ExternalTicket*)input;
39561
39562
        /* decrypt */
39563
        ato16(et->enc_len, &inLen);
39564
        if (inLen > WOLFSSL_TICKET_ENC_SZ) {
39565
            WOLFSSL_ERROR_VERBOSE(BAD_TICKET_MSG_SZ);
39566
            return WOLFSSL_TICKET_RET_REJECT;
39567
        }
39568
        outLen = (int)inLen;   /* may be reduced by user padding */
39569
39570
        if (ssl->ctx->ticketEncCb == NULL
39571
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL)
39572
                ||
39573
                /* WOLFSSL_OP_NO_TICKET turns off tickets in < 1.2. Forces
39574
                 * "stateful" tickets for 1.3 so just use the regular
39575
                 * stateless ones. */
39576
                (!IsAtLeastTLSv1_3(ssl->version) &&
39577
                        (ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0)
39578
#endif
39579
                        ) {
39580
            /* Use BAD_TICKET_ENCRYPT to signal missing ticket callback */
39581
            WOLFSSL_ERROR_VERBOSE(BAD_TICKET_ENCRYPT);
39582
            ret = WOLFSSL_TICKET_RET_REJECT;
39583
        }
39584
        else {
39585
            /* Callback uses ssl without const but for DTLS, it really shouldn't
39586
             * modify its state. */
39587
            ret = ssl->ctx->ticketEncCb((WOLFSSL*)ssl, et->key_name, et->iv,
39588
                                    et->enc_ticket + inLen, 0,
39589
                                    et->enc_ticket, inLen, &outLen,
39590
                                    SSL_TICKET_CTX(ssl));
39591
        }
39592
        if (ret != WOLFSSL_TICKET_RET_OK) {
39593
        #ifdef WOLFSSL_ASYNC_CRYPT
39594
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
39595
                return ret;
39596
            }
39597
        #endif /* WOLFSSL_ASYNC_CRYPT */
39598
            if (ret != WOLFSSL_TICKET_RET_CREATE) {
39599
                WOLFSSL_ERROR_VERBOSE(BAD_TICKET_KEY_CB_SZ);
39600
                return WOLFSSL_TICKET_RET_REJECT;
39601
            }
39602
        }
39603
        if (outLen > (int)inLen || outLen < (int)WOLFSSL_INTERNAL_TICKET_LEN) {
39604
            WOLFSSL_MSG("Bad user ticket decrypt len");
39605
            WOLFSSL_ERROR_VERBOSE(BAD_TICKET_KEY_CB_SZ);
39606
            return BAD_TICKET_KEY_CB_SZ;
39607
        }
39608
        *it = (InternalTicket*)et->enc_ticket;
39609
        return ret;
39610
    }
39611
39612
    static int DoClientTicketCheckVersion(const WOLFSSL* ssl,
39613
            InternalTicket* it)
39614
    {
39615
        if (ssl->version.minor < it->pv.minor) {
39616
            WOLFSSL_MSG("Ticket has greater version");
39617
            return VERSION_ERROR;
39618
        }
39619
        else if (ssl->version.minor > it->pv.minor) {
39620
            if (IsAtLeastTLSv1_3(it->pv) != IsAtLeastTLSv1_3(ssl->version)) {
39621
                WOLFSSL_MSG("Tickets cannot be shared between "
39622
                                           "TLS 1.3 and TLS 1.2 and lower");
39623
                return VERSION_ERROR;
39624
            }
39625
39626
            if (!ssl->options.downgrade) {
39627
                WOLFSSL_MSG("Ticket has lesser version");
39628
                return VERSION_ERROR;
39629
            }
39630
39631
            WOLFSSL_MSG("Downgrading protocol due to ticket");
39632
39633
            if (it->pv.minor < ssl->options.minDowngrade) {
39634
                WOLFSSL_MSG("Ticket has lesser version than allowed");
39635
                return VERSION_ERROR;
39636
            }
39637
        }
39638
    #ifdef WOLFSSL_TLS13
39639
        /* Check resumption master secret. */
39640
        if (IsAtLeastTLSv1_3(it->pv) &&
39641
                it->ticketNonceLen > MAX_TICKET_NONCE_STATIC_SZ) {
39642
            WOLFSSL_MSG("Unsupported ticketNonce len in ticket");
39643
            return BAD_TICKET_ENCRYPT;
39644
        }
39645
    #endif
39646
        return 0;
39647
    }
39648
39649
#if defined(WOLFSSL_TLS13)
39650
    /* Return 0 when check successful. <0 on failure. */
39651
    int DoClientTicketCheck(const WOLFSSL* ssl, const PreSharedKey* psk,
39652
            sword64 timeout, const byte* suite)
39653
    {
39654
        word32 ticketAdd;
39655
#ifdef WOLFSSL_32BIT_MILLI_TIME
39656
        word32 now;
39657
        sword64 diff;
39658
        word32 ticketSeen;        /* Time ticket seen (ms) */
39659
39660
        ato32(psk->it->timestamp, &ticketSeen);
39661
39662
        now = TimeNowInMilliseconds();
39663
        if (now == 0)
39664
            return GETTIME_ERROR;
39665
        /* Difference between now and time ticket constructed
39666
         * (from decrypted ticket). */
39667
        diff = now;
39668
        diff -= ticketSeen;
39669
        if (diff > timeout * 1000 ||
39670
            diff > (sword64)TLS13_MAX_TICKET_AGE * 1000)
39671
            return WOLFSSL_FATAL_ERROR;
39672
#else
39673
        sword64 diff;
39674
        sword64 ticketSeen; /* Time ticket seen (ms) */
39675
        word32 seenHi, seenLo;
39676
39677
        ato32(psk->it->timestamp               , &seenHi);
39678
        ato32(psk->it->timestamp + OPAQUE32_LEN, &seenLo);
39679
        ticketSeen = ((sword64)seenHi << 32) + seenLo;
39680
39681
        diff = TimeNowInMilliseconds();
39682
        if (diff == 0)
39683
            return GETTIME_ERROR;
39684
        /* Difference between now and time ticket constructed
39685
         * (from decrypted ticket). */
39686
        diff -= ticketSeen;
39687
        if (diff > timeout * 1000 ||
39688
            diff > (sword64)TLS13_MAX_TICKET_AGE * 1000)
39689
            return WOLFSSL_FATAL_ERROR;
39690
#endif
39691
        ato32(psk->it->ageAdd, &ticketAdd);
39692
        /* Subtract client's ticket age and unobfuscate. */
39693
        diff -= psk->ticketAge;
39694
        diff += ticketAdd;
39695
        /* Check session and ticket age timeout.
39696
         * Allow +/- 1000 milliseconds on ticket age.
39697
         */
39698
        if (diff < -1000 || diff - MAX_TICKET_AGE_DIFF * 1000 > 1000)
39699
            return WOLFSSL_FATAL_ERROR;
39700
39701
#if !defined(WOLFSSL_PSK_ONE_ID) && !defined(WOLFSSL_PRIORITIZE_PSK)
39702
        /* Check whether resumption is possible based on suites in SSL and
39703
         * ciphersuite in ticket.
39704
         */
39705
        (void)ssl;
39706
        if (XMEMCMP(suite, psk->it->suite, SUITE_LEN) != 0)
39707
            return WOLFSSL_FATAL_ERROR;
39708
#else
39709
        (void)suite;
39710
        if (!FindSuiteSSL(ssl, psk->it->suite))
39711
            return WOLFSSL_FATAL_ERROR;
39712
#endif
39713
#ifdef OPENSSL_EXTRA
39714
        if (ssl->sessionCtxSz > 0 &&
39715
               (psk->it->sessionCtxSz != ssl->sessionCtxSz ||
39716
                XMEMCMP(psk->it->sessionCtx, ssl->sessionCtx,
39717
                        ssl->sessionCtxSz) != 0))
39718
            return WOLFSSL_FATAL_ERROR;
39719
#endif
39720
        return 0;
39721
    }
39722
#endif /* WOLFSSL_SLT13 */
39723
39724
    void DoClientTicketFinalize(WOLFSSL* ssl, InternalTicket* it,
39725
            const WOLFSSL_SESSION* sess)
39726
    {
39727
#ifdef WOLFSSL_TICKET_HAVE_ID
39728
        ssl->session->haveAltSessionID = 1;
39729
        XMEMCPY(ssl->session->altSessionID, it->id, ID_LEN);
39730
#endif
39731
        if (sess != NULL) {
39732
            byte bogusID[ID_LEN];
39733
            byte bogusIDSz = ssl->session->sessionIDSz;
39734
            XMEMCPY(bogusID, ssl->session->sessionID, ID_LEN);
39735
            /* Failure here should not interrupt the resumption. We already have
39736
             * all the cipher material we need in `it` */
39737
            WOLFSSL_MSG("Copying in session from passed in arg");
39738
            (void)wolfSSL_DupSession(sess, ssl->session, 1);
39739
            /* Restore the fake ID */
39740
            XMEMCPY(ssl->session->sessionID, bogusID, ID_LEN);
39741
            ssl->session->sessionIDSz= bogusIDSz;
39742
        }
39743
#ifdef WOLFSSL_TICKET_HAVE_ID
39744
        else {
39745
            if (wolfSSL_GetSession(ssl, NULL, 1) != NULL) {
39746
                WOLFSSL_MSG("Found session matching the session id"
39747
                            " found in the ticket");
39748
            }
39749
            else {
39750
                WOLFSSL_MSG("Can't find session matching the session id"
39751
                            " found in the ticket");
39752
            }
39753
        }
39754
#endif
39755
39756
        if (!IsAtLeastTLSv1_3(ssl->version)) {
39757
            XMEMCPY(ssl->arrays->masterSecret, it->msecret, SECRET_LEN);
39758
            /* Copy the haveExtendedMasterSecret property from the ticket to
39759
             * the saved session, so the property may be checked later. */
39760
            ssl->session->haveEMS = it->haveEMS;
39761
            ato32((const byte*)&it->timestamp, &ssl->session->bornOn);
39762
#ifndef NO_RESUME_SUITE_CHECK
39763
            ssl->session->cipherSuite0 = it->suite[0];
39764
            ssl->session->cipherSuite = it->suite[1];
39765
#endif
39766
        }
39767
        else {
39768
#ifdef WOLFSSL_TLS13
39769
            /* This should have been already checked in
39770
             * DoClientTicketCheckVersion */
39771
            if (it->ticketNonceLen > MAX_TICKET_NONCE_STATIC_SZ) {
39772
                WOLFSSL_MSG("Unsupported ticketNonce len in ticket");
39773
                return;
39774
            }
39775
            /* Restore information to renegotiate. */
39776
#ifdef WOLFSSL_32BIT_MILLI_TIME
39777
            ato32(it->timestamp, &ssl->session->ticketSeen);
39778
#else
39779
            {
39780
                word32 seenHi, seenLo;
39781
39782
                ato32(it->timestamp               , &seenHi);
39783
                ato32(it->timestamp + OPAQUE32_LEN, &seenLo);
39784
                ssl->session->ticketSeen = ((sword64)seenHi << 32) + seenLo;
39785
            }
39786
#endif
39787
            ato32(it->ageAdd, &ssl->session->ticketAdd);
39788
            ssl->session->cipherSuite0 = it->suite[0];
39789
            ssl->session->cipherSuite = it->suite[1];
39790
#ifdef WOLFSSL_EARLY_DATA
39791
            ato32(it->maxEarlyDataSz, &ssl->session->maxEarlyDataSz);
39792
#endif
39793
            /* Resumption master secret. */
39794
            XMEMCPY(ssl->session->masterSecret, it->msecret, SECRET_LEN);
39795
#if defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
39796
     (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
39797
            if (ssl->session->ticketNonce.data
39798
                   != ssl->session->ticketNonce.dataStatic) {
39799
                XFREE(ssl->session->ticketNonce.data, ssl->heap,
39800
                    DYNAMIC_TYPE_SESSION_TICK);
39801
                ssl->session->ticketNonce.data =
39802
                    ssl->session->ticketNonce.dataStatic;
39803
            }
39804
#endif /* defined(WOLFSSL_TICKET_NONCE_MALLOC) && FIPS_VERSION_GE(5,3) */
39805
            XMEMCPY(ssl->session->ticketNonce.data, it->ticketNonce,
39806
                it->ticketNonceLen);
39807
            ssl->session->ticketNonce.len = it->ticketNonceLen;
39808
            ato16(it->namedGroup, &ssl->session->namedGroup);
39809
#endif
39810
        }
39811
        ssl->version.minor = it->pv.minor;
39812
    }
39813
39814
#if defined(WOLFSSL_TLS13)
39815
    static void PopulateInternalTicketFromSession(const WOLFSSL_SESSION* sess,
39816
            InternalTicket* it)
39817
    {
39818
#ifdef WOLFSSL_32BIT_MILLI_TIME
39819
        word32 milliBornOn = sess->bornOn;
39820
#else
39821
        sword64 milliBornOn = (sword64)sess->bornOn;
39822
#endif
39823
        /* Convert to milliseconds */
39824
        milliBornOn *= 1000;
39825
        it->pv = sess->version;
39826
        it->suite[0] = sess->cipherSuite0;
39827
        it->suite[1] = sess->cipherSuite;
39828
        XMEMCPY(it->msecret, sess->masterSecret, SECRET_LEN);
39829
#ifdef WOLFSSL_32BIT_MILLI_TIME
39830
        c32toa(milliBornOn, it->timestamp);
39831
#else
39832
        c32toa((word32)(milliBornOn >> 32), it->timestamp);
39833
        c32toa((word32)milliBornOn        , it->timestamp + OPAQUE32_LEN);
39834
#endif
39835
        it->haveEMS = (byte)sess->haveEMS;
39836
        c32toa(sess->ticketAdd, it->ageAdd);
39837
        c16toa(sess->namedGroup, it->namedGroup);
39838
        if (sess->ticketNonce.len <= MAX_TICKET_NONCE_STATIC_SZ) {
39839
            it->ticketNonceLen = sess->ticketNonce.len;
39840
            XMEMCPY(it->ticketNonce, sess->ticketNonce.data,
39841
                    sess->ticketNonce.len);
39842
        }
39843
#ifdef WOLFSSL_EARLY_DATA
39844
        c32toa(sess->maxEarlyDataSz, it->maxEarlyDataSz);
39845
#endif
39846
#ifdef WOLFSSL_TICKET_HAVE_ID
39847
        if (sess->haveAltSessionID)
39848
            XMEMCPY(it->id, sess->altSessionID, ID_LEN);
39849
        else
39850
            XMEMCPY(it->id, sess->sessionID, ID_LEN);
39851
#endif
39852
#ifdef OPENSSL_EXTRA
39853
        it->sessionCtxSz = sess->sessionCtxSz;
39854
        XMEMCPY(it->sessionCtx, sess->sessionCtx, sess->sessionCtxSz);
39855
#endif
39856
    }
39857
39858
39859
    static const WOLFSSL_SESSION* GetSesionFromCacheOrExt(const WOLFSSL* ssl,
39860
            const byte* id, psk_sess_free_cb_ctx* freeCtx)
39861
    {
39862
        const WOLFSSL_SESSION* sess = NULL;
39863
        int ret;
39864
        XMEMSET(freeCtx, 0, sizeof(*freeCtx));
39865
#ifdef HAVE_EXT_CACHE
39866
        if (ssl->ctx->get_sess_cb != NULL) {
39867
            int copy = 0;
39868
            sess = ssl->ctx->get_sess_cb((WOLFSSL*)ssl,
39869
                    id, ID_LEN, &copy);
39870
            if (sess != NULL) {
39871
                freeCtx->extCache = 1;
39872
                /* If copy not set then free immediately */
39873
                if (!copy)
39874
                    freeCtx->freeSess = 1;
39875
            }
39876
        }
39877
#endif
39878
        if (sess == NULL) {
39879
            ret = TlsSessionCacheGetAndRdLock(id, &sess, &freeCtx->row,
39880
                    (byte)ssl->options.side);
39881
            if (ret != 0)
39882
                sess = NULL;
39883
        }
39884
        return sess;
39885
    }
39886
39887
    static void FreeSessionFromCacheOrExt(const WOLFSSL* ssl,
39888
            const WOLFSSL_SESSION* sess, psk_sess_free_cb_ctx* freeCtx)
39889
    {
39890
        (void)ssl;
39891
        (void)sess;
39892
#ifdef HAVE_EXT_CACHE
39893
        if (freeCtx->extCache) {
39894
            if (freeCtx->freeSess)
39895
                /* In this case sess is not longer const and the external cache
39896
                 * wants us to free it. */
39897
                wolfSSL_FreeSession(ssl->ctx, (WOLFSSL_SESSION*)sess);
39898
        }
39899
        else
39900
#endif
39901
            TlsSessionCacheUnlockRow(freeCtx->row);
39902
    }
39903
39904
    /* Parse ticket sent by client, returns callback return value. Doesn't
39905
     * modify ssl and stores the InternalTicket inside psk */
39906
    int DoClientTicket_ex(const WOLFSSL* ssl, PreSharedKey* psk, int retainSess)
39907
    {
39908
        int ret;
39909
        int decryptRet = WOLFSSL_TICKET_RET_REJECT;
39910
39911
        WOLFSSL_START(WC_FUNC_TICKET_DO);
39912
        WOLFSSL_ENTER("DoClientTicket_ex");
39913
39914
        if (psk->identityLen == ID_LEN && IsAtLeastTLSv1_3(ssl->version)) {
39915
            /* This is a stateful ticket. We can be sure about this because
39916
             * stateless tickets are much longer. */
39917
            const WOLFSSL_SESSION* sess = NULL;
39918
            sess = GetSesionFromCacheOrExt(ssl, psk->identity,
39919
                    &psk->sess_free_cb_ctx);
39920
            if (sess != NULL) {
39921
                /* Session found in cache. Copy in relevant info to psk */
39922
                byte* tmp;
39923
                WOLFSSL_MSG("Found session matching the session id"
39924
                            " found in the ticket");
39925
                /* Allocate and populate an InternalTicket */
39926
            #ifdef WOLFSSL_NO_REALLOC
39927
                tmp = (byte*)XMALLOC(sizeof(InternalTicket), ssl->heap,
39928
                        DYNAMIC_TYPE_TLSX);
39929
                if (tmp != NULL && psk->identity != NULL)
39930
                {
39931
                   XMEMCPY(tmp, psk->identity, psk->identityLen);
39932
                   XFREE(psk->identity, ssl->heap, DYNAMIC_TYPE_TLSX);
39933
                   psk->identity = NULL;
39934
                }
39935
            #else
39936
                tmp = (byte*)XREALLOC(psk->identity, sizeof(InternalTicket),
39937
                        ssl->heap, DYNAMIC_TYPE_TLSX);
39938
            #endif
39939
                if (tmp != NULL) {
39940
                    XMEMSET(tmp, 0, sizeof(InternalTicket));
39941
                    psk->identity = tmp;
39942
                    psk->identityLen = sizeof(InternalTicket);
39943
                    psk->it = (InternalTicket*)tmp;
39944
                    PopulateInternalTicketFromSession(sess, psk->it);
39945
                    decryptRet = WOLFSSL_TICKET_RET_OK;
39946
                    if (retainSess) {
39947
                        psk->sess = sess;
39948
                        psk->sess_free_cb = FreeSessionFromCacheOrExt;
39949
                    }
39950
                }
39951
                if (psk->sess == NULL) {
39952
                    FreeSessionFromCacheOrExt(ssl, sess,
39953
                            &psk->sess_free_cb_ctx);
39954
                    XMEMSET(&psk->sess_free_cb_ctx, 0,
39955
                            sizeof(psk_sess_free_cb_ctx));
39956
                }
39957
            }
39958
        }
39959
        else {
39960
            decryptRet = DoDecryptTicket(ssl, psk->identity, psk->identityLen,
39961
                    &psk->it);
39962
        }
39963
        switch (decryptRet) {
39964
        case WOLFSSL_TICKET_RET_OK:
39965
            psk->decryptRet = PSK_DECRYPT_OK;
39966
            break;
39967
        case WOLFSSL_TICKET_RET_CREATE:
39968
            psk->decryptRet = PSK_DECRYPT_CREATE;
39969
            break;
39970
        default:
39971
            psk->decryptRet = PSK_DECRYPT_FAIL;
39972
            WOLFSSL_LEAVE("DoClientTicket_ex", decryptRet);
39973
            return decryptRet;
39974
        }
39975
#ifdef WOLFSSL_CHECK_MEM_ZERO
39976
        /* Internal ticket successfully decrypted. */
39977
        wc_MemZero_Add("Do Client Ticket internal", psk->it,
39978
            sizeof(InternalTicket));
39979
#endif
39980
39981
        ret = DoClientTicketCheckVersion(ssl, psk->it);
39982
        if (ret != 0) {
39983
            psk->decryptRet = PSK_DECRYPT_FAIL;
39984
            ForceZero(psk->identity, psk->identityLen);
39985
#ifdef WOLFSSL_CHECK_MEM_ZERO
39986
            wc_MemZero_Check(psk->it, sizeof(InternalTicket));
39987
#endif
39988
            WOLFSSL_LEAVE("DoClientTicket_ex", ret);
39989
            return ret;
39990
        }
39991
        WOLFSSL_LEAVE("DoClientTicket_ex", decryptRet);
39992
        return decryptRet;
39993
    }
39994
#endif /* WOLFSL_TLS13 */
39995
39996
    /* Parse ticket sent by client, returns callback return value */
39997
    int DoClientTicket(WOLFSSL* ssl, const byte* input, word32 len)
39998
    {
39999
        int decryptRet = WOLFSSL_TICKET_RET_REJECT;
40000
        int ret;
40001
        InternalTicket* it = NULL;
40002
#ifdef WOLFSSL_TLS13
40003
        InternalTicket staticIt;
40004
        const WOLFSSL_SESSION* sess = NULL;
40005
        psk_sess_free_cb_ctx freeCtx;
40006
40007
        XMEMSET(&freeCtx, 0, sizeof(psk_sess_free_cb_ctx));
40008
#endif
40009
40010
        WOLFSSL_START(WC_FUNC_TICKET_DO);
40011
        WOLFSSL_ENTER("DoClientTicket");
40012
40013
#ifdef HAVE_SECRET_CALLBACK
40014
        if (ssl->ticketParseCb != NULL) {
40015
            decryptRet = WOLFSSL_TICKET_RET_OK;
40016
            if (!ssl->ticketParseCb(ssl, input, len, ssl->ticketParseCtx)) {
40017
                /* Failure kills the connection */
40018
                decryptRet = WOLFSSL_TICKET_RET_FATAL;
40019
            }
40020
            else {
40021
                if (wolfSSL_set_SessionTicket(ssl, input, len) !=
40022
                        WOLFSSL_SUCCESS)
40023
                    decryptRet = WOLFSSL_TICKET_RET_REJECT;
40024
            }
40025
            goto cleanup;
40026
        }
40027
        else
40028
#endif
40029
#ifdef WOLFSSL_TLS13
40030
        if (len == ID_LEN && IsAtLeastTLSv1_3(ssl->version)) {
40031
            /* This is a stateful ticket. We can be sure about this because
40032
             * stateless tickets are much longer. */
40033
            sess = GetSesionFromCacheOrExt(ssl, input, &freeCtx);
40034
            if (sess != NULL) {
40035
                it = &staticIt;
40036
                XMEMSET(it, 0, sizeof(InternalTicket));
40037
                PopulateInternalTicketFromSession(sess, it);
40038
                decryptRet = WOLFSSL_TICKET_RET_OK;
40039
            }
40040
        }
40041
        else
40042
#endif
40043
        if (len >= sizeof(*it))
40044
            decryptRet = DoDecryptTicket(ssl, input, len, &it);
40045
        else
40046
            WOLFSSL_MSG("Ticket is smaller than InternalTicket. Rejecting.");
40047
40048
40049
        if (decryptRet != WOLFSSL_TICKET_RET_OK &&
40050
                decryptRet != WOLFSSL_TICKET_RET_CREATE) {
40051
            it = NULL;
40052
            goto cleanup;
40053
        }
40054
    #ifdef WOLFSSL_CHECK_MEM_ZERO
40055
        /* Internal ticket successfully decrypted. */
40056
        wc_MemZero_Add("Do Client Ticket internal", it, sizeof(InternalTicket));
40057
    #endif
40058
40059
        ret = DoClientTicketCheckVersion(ssl, it);
40060
        if (ret != 0) {
40061
            decryptRet = ret;
40062
            goto cleanup;
40063
        }
40064
40065
        DoClientTicketFinalize(ssl, it, NULL);
40066
40067
cleanup:
40068
        if (it != NULL) {
40069
            ForceZero(it, sizeof(*it));
40070
#ifdef WOLFSSL_CHECK_MEM_ZERO
40071
            wc_MemZero_Check(it, sizeof(InternalTicket));
40072
#endif
40073
        }
40074
#ifdef WOLFSSL_TLS13
40075
        if (sess != NULL)
40076
            FreeSessionFromCacheOrExt(ssl, sess, &freeCtx);
40077
#endif
40078
        return decryptRet;
40079
    }
40080
40081
#ifdef WOLFSSL_TLS13
40082
    void CleanupClientTickets(PreSharedKey* psk)
40083
    {
40084
        for (; psk != NULL; psk = psk->next) {
40085
            if (psk->decryptRet == PSK_DECRYPT_OK ||
40086
                    psk->decryptRet == PSK_DECRYPT_CREATE) {
40087
                psk->decryptRet = PSK_DECRYPT_NONE;
40088
                ForceZero(psk->identity, psk->identityLen);
40089
#ifdef WOLFSSL_CHECK_MEM_ZERO
40090
                /* We want to check the InternalTicket area since that is what
40091
                 * we registered in DoClientTicket_ex */
40092
                wc_MemZero_Check((((ExternalTicket*)psk->identity)->enc_ticket),
40093
                        sizeof(InternalTicket));
40094
#endif
40095
            }
40096
        }
40097
    }
40098
#endif /* WOLFSSL_TLS13 */
40099
40100
40101
    /* send Session Ticket */
40102
    int SendTicket(WOLFSSL* ssl)
40103
    {
40104
        byte*              output;
40105
        int                ret;
40106
        int                sendSz;
40107
        word32             length = SESSION_HINT_SZ + LENGTH_SZ;
40108
        word32             idx    = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
40109
40110
        WOLFSSL_START(WC_FUNC_TICKET_SEND);
40111
        WOLFSSL_ENTER("SendTicket");
40112
40113
        if (ssl->options.createTicket) {
40114
            ret = SetupTicket(ssl);
40115
            if (ret != 0)
40116
                return ret;
40117
            ret = CreateTicket(ssl);
40118
            if (ret != 0)
40119
                return ret;
40120
        }
40121
40122
        length += ssl->session->ticketLen;
40123
        sendSz = (int)length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
40124
40125
        if (!ssl->options.dtls) {
40126
            if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
40127
                sendSz += MAX_MSG_EXTRA;
40128
        }
40129
        else {
40130
        #ifdef WOLFSSL_DTLS
40131
            sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
40132
            idx    += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
40133
        #endif
40134
        }
40135
40136
        if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
40137
            sendSz += cipherExtraData(ssl);
40138
40139
        /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
40140
         * is not advanced yet */
40141
        ssl->options.buildingMsg = 1;
40142
40143
        /* check for available size */
40144
        if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
40145
            return ret;
40146
40147
        /* get output buffer */
40148
        output = GetOutputBuffer(ssl);
40149
        AddHeaders(output, length, session_ticket, ssl);
40150
40151
        /* hint */
40152
        c32toa(ssl->ctx->ticketHint, output + idx);
40153
        idx += SESSION_HINT_SZ;
40154
40155
        /* length */
40156
        c16toa(ssl->session->ticketLen, output + idx);
40157
        idx += LENGTH_SZ;
40158
40159
        /* ticket */
40160
        XMEMCPY(output + idx, ssl->session->ticket, ssl->session->ticketLen);
40161
        idx += ssl->session->ticketLen;
40162
40163
        if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
40164
            byte* input;
40165
            int   inputSz = (int)idx; /* build msg adds rec hdr */
40166
            int   recordHeaderSz = RECORD_HEADER_SZ;
40167
40168
            if (ssl->options.dtls)
40169
                recordHeaderSz += DTLS_RECORD_EXTRA;
40170
            inputSz -= recordHeaderSz;
40171
            input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
40172
            if (input == NULL)
40173
                return MEMORY_E;
40174
40175
            XMEMCPY(input, output + recordHeaderSz, inputSz);
40176
            sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
40177
                                  handshake, 1, 0, 0, CUR_ORDER);
40178
            XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
40179
40180
            if (sendSz < 0)
40181
                return sendSz;
40182
        }
40183
        else {
40184
            #ifdef WOLFSSL_DTLS
40185
            if (ssl->options.dtls) {
40186
                if ((ret = DtlsMsgPoolSave(ssl, output, (word32)sendSz, session_ticket)) != 0)
40187
                    return ret;
40188
40189
                DtlsSEQIncrement(ssl, CUR_ORDER);
40190
            }
40191
            #endif
40192
            ret = HashOutput(ssl, output, sendSz, 0);
40193
            if (ret != 0)
40194
                return ret;
40195
        }
40196
40197
        ssl->buffers.outputBuffer.length += sendSz;
40198
        ssl->options.buildingMsg = 0;
40199
40200
        if (!ssl->options.groupMessages)
40201
            ret = SendBuffered(ssl);
40202
40203
        WOLFSSL_LEAVE("SendTicket", ret);
40204
        WOLFSSL_END(WC_FUNC_TICKET_SEND);
40205
40206
        return ret;
40207
    }
40208
40209
#if !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && !defined(NO_TLS)
40210
40211
/* Initialize the context for session ticket encryption.
40212
 *
40213
 * @param [in]  ctx     SSL context.
40214
 * @param [in]  keyCtx  Context for session ticket encryption.
40215
 * @return  0 on success.
40216
 * @return  BAD_MUTEX_E when initializing mutex fails.
40217
 */
40218
static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx, TicketEncCbCtx* keyCtx)
40219
{
40220
    int ret = 0;
40221
40222
    XMEMSET(keyCtx, 0, sizeof(*keyCtx));
40223
    keyCtx->ctx = ctx;
40224
40225
#ifdef WOLFSSL_CHECK_MEM_ZERO
40226
    wc_MemZero_Add("TicketEncCbCtx_Init keyCtx->name", keyCtx->name,
40227
        sizeof(keyCtx->name));
40228
    wc_MemZero_Add("TicketEncCbCtx_Init keyCtx->key[0]", keyCtx->key[0],
40229
        sizeof(keyCtx->key[0]));
40230
    wc_MemZero_Add("TicketEncCbCtx_Init keyCtx->key[1]", keyCtx->key[1],
40231
        sizeof(keyCtx->key[1]));
40232
#endif
40233
40234
#ifndef SINGLE_THREADED
40235
    ret = wc_InitMutex(&keyCtx->mutex);
40236
#endif
40237
40238
    return ret;
40239
}
40240
40241
/* Setup the session ticket encryption context for this.
40242
 *
40243
 * Initialize RNG, generate name, generate primary key and set primary key
40244
 * expirary.
40245
 *
40246
 * @param [in]  keyCtx  Context for session ticket encryption.
40247
 * @param [in]  heap    Dynamic memory allocation hint.
40248
 * @param [in]  devId   Device identifier.
40249
 * @return  0 on success.
40250
 * @return  Other value when random number generator fails.
40251
 */
40252
static int TicketEncCbCtx_Setup(TicketEncCbCtx* keyCtx, void* heap, int devId)
40253
{
40254
    int ret;
40255
40256
#ifndef SINGLE_THREADED
40257
    ret = 0;
40258
40259
    /* Check that key wasn't set up while waiting. */
40260
    if (keyCtx->expirary[0] == 0)
40261
#endif
40262
    {
40263
        ret = wc_InitRng_ex(&keyCtx->rng, heap, devId);
40264
        if (ret == 0) {
40265
            ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->name,
40266
                                       sizeof(keyCtx->name));
40267
        }
40268
        if (ret == 0) {
40269
            /* Mask of the bottom bit - used for index of key. */
40270
            keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1] &= 0xfe;
40271
40272
            /* Generate initial primary key. */
40273
            ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[0],
40274
                                       WOLFSSL_TICKET_KEY_SZ);
40275
        }
40276
        if (ret == 0) {
40277
            keyCtx->expirary[0] = LowResTimer() + WOLFSSL_TICKET_KEY_LIFETIME;
40278
        }
40279
    }
40280
40281
    return ret;
40282
}
40283
/* Free the context for session ticket encryption.
40284
 *
40285
 * Zeroize keys and name.
40286
 *
40287
 * @param [in]  keyCtx  Context for session ticket encryption.
40288
 */
40289
static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx)
40290
{
40291
    /* Zeroize sensitive data. */
40292
    ForceZero(keyCtx->name, sizeof(keyCtx->name));
40293
    ForceZero(keyCtx->key[0], sizeof(keyCtx->key[0]));
40294
    ForceZero(keyCtx->key[1], sizeof(keyCtx->key[1]));
40295
40296
#ifdef WOLFSSL_CHECK_MEM_ZERO
40297
    wc_MemZero_Check(keyCtx->name, sizeof(keyCtx->name));
40298
    wc_MemZero_Check(keyCtx->key[0], sizeof(keyCtx->key[0]));
40299
    wc_MemZero_Check(keyCtx->key[1], sizeof(keyCtx->key[1]));
40300
#endif
40301
40302
#ifndef SINGLE_THREADED
40303
    wc_FreeMutex(&keyCtx->mutex);
40304
#endif
40305
    wc_FreeRng(&keyCtx->rng);
40306
}
40307
40308
#ifdef WOLFSSL_TICKET_ENC_CBC_HMAC
40309
/* Ticket encryption/decryption implementation.
40310
 *
40311
 * @param [in]   key     Key for encryption/decryption and HMAC.
40312
 * @param [in]   keyLen  Length of key in bytes.
40313
 * @param [in]   iv      IV/Nonce for encryption/decryption.
40314
 * @param [in]   aad     Additional authentication data.
40315
 * @param [in]   aadSz   Length of additional authentication data.
40316
 * @param [in]   in      Data to encrypt/decrypt.
40317
 * @param [in]   inLen   Length of encrypted data.
40318
 * @param [out]  out     Resulting data from encrypt/decrypt.
40319
 * @param [out]  outLen  Size of resulting data.
40320
 * @param [in]   tag     Authentication tag for encrypted data.
40321
 * @param [in]   heap    Dynamic memory allocation data hint.
40322
 * @param [in]   enc     1 when encrypting, 0 when decrypting.
40323
 * @return  0 on success.
40324
 * @return  Other value when encryption/decryption fails.
40325
 */
40326
static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
40327
                        byte* in, int inLen, byte* out, int* outLen, byte* tag,
40328
                        void* heap, int enc)
40329
{
40330
    int ret;
40331
#ifdef WOLFSSL_SMALL_STACK
40332
    Aes*  aes;
40333
    Hmac* hmac;
40334
#else
40335
    Aes  aes[1];
40336
    Hmac hmac[1];
40337
#endif
40338
40339
    (void)heap;
40340
40341
#ifdef WOLFSSL_SMALL_STACK
40342
    aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_TMP_BUFFER);
40343
    if (aes == NULL)
40344
        return MEMORY_E;
40345
    hmac = (Hmac*)XMALLOC(sizeof(Hmac), heap, DYNAMIC_TYPE_TMP_BUFFER);
40346
    if (hmac == NULL) {
40347
        XFREE(aes, heap, DYNAMIC_TYPE_TMP_BUFFER);
40348
        return MEMORY_E;
40349
    }
40350
#endif
40351
40352
    XMEMSET(aes, 0, sizeof(Aes));
40353
    XMEMSET(hmac, 0, sizeof(Hmac));
40354
40355
    ret = wc_HmacInit(hmac, heap, DYNAMIC_TYPE_TMP_BUFFER);
40356
    if (ret == 0) {
40357
        ret = wc_HmacSetKey(hmac, WOLFSSL_TICKET_ENC_HMAC, key + keyLen -
40358
            WOLFSSL_TICKET_HMAC_KEY_SZ, WOLFSSL_TICKET_HMAC_KEY_SZ);
40359
    }
40360
    if (ret == 0) {
40361
        ret = wc_HmacUpdate(hmac, aad, aadSz);
40362
    }
40363
40364
    if (ret == 0) {
40365
        if (enc) {
40366
            ret = wc_AesInit(aes, NULL, INVALID_DEVID);
40367
            if (ret == 0) {
40368
                ret = wc_AesSetKey(aes, key,
40369
                    keyLen - WOLFSSL_TICKET_HMAC_KEY_SZ, iv, AES_ENCRYPTION);
40370
            }
40371
            if (ret == 0) {
40372
                ret = wc_HmacUpdate(hmac, in, inLen);
40373
            }
40374
            if (ret == 0) {
40375
                ret = wc_AesCbcEncrypt(aes, in, out, inLen);
40376
            }
40377
            if (ret == 0) {
40378
                XMEMSET(tag, 0, WOLFSSL_TICKET_MAC_SZ);
40379
                ret = wc_HmacFinal(hmac, tag);
40380
            }
40381
            wc_AesFree(aes);
40382
        }
40383
        else {
40384
            unsigned char calcTag[WOLFSSL_TICKET_MAC_SZ];
40385
40386
            ret = wc_AesInit(aes, NULL, INVALID_DEVID);
40387
            if (ret == 0) {
40388
                ret = wc_AesSetKey(aes, key,
40389
                    keyLen - WOLFSSL_TICKET_HMAC_KEY_SZ, iv, AES_DECRYPTION);
40390
            }
40391
            if (ret == 0) {
40392
                ret = wc_AesCbcDecrypt(aes, in, out, inLen);
40393
            }
40394
            if (ret == 0) {
40395
                ret = wc_HmacUpdate(hmac, out, inLen);
40396
            }
40397
            if (ret == 0) {
40398
                XMEMSET(calcTag, 0, WOLFSSL_TICKET_MAC_SZ);
40399
                ret = wc_HmacFinal(hmac, calcTag);
40400
            }
40401
            if (ret == 0) {
40402
                int i;
40403
                calcTag[0] ^= tag[0];
40404
                for (i = 1; i < WOLFSSL_TICKET_MAC_SZ; i++) {
40405
                    calcTag[0] |= calcTag[i] ^ tag[i];
40406
                }
40407
                /* Return a negative value when no match. */
40408
                ret = -calcTag[0];
40409
            }
40410
            wc_AesFree(aes);
40411
        }
40412
    }
40413
    wc_HmacFree(hmac);
40414
40415
#ifdef WOLFSSL_SMALL_STACK
40416
    XFREE(hmac, heap, DYNAMIC_TYPE_TMP_BUFFER);
40417
    XFREE(aes, heap, DYNAMIC_TYPE_TMP_BUFFER);
40418
#endif
40419
40420
    *outLen = inLen;
40421
40422
    return ret;
40423
}
40424
#elif defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
40425
    !defined(WOLFSSL_TICKET_ENC_AES128_GCM) && \
40426
    !defined(WOLFSSL_TICKET_ENC_AES256_GCM)
40427
/* Ticket encryption/decryption implementation.
40428
 *
40429
 * @param [in]   key     Key for encryption/decryption.
40430
 * @param [in]   keyLen  Length of key in bytes.
40431
 * @param [in]   iv      IV/Nonce for encryption/decryption.
40432
 * @param [in]   aad     Additional authentication data.
40433
 * @param [in]   aadSz   Length of additional authentication data.
40434
 * @param [in]   in      Data to encrypt/decrypt.
40435
 * @param [in]   inLen   Length of encrypted data.
40436
 * @param [out]  out     Resulting data from encrypt/decrypt.
40437
 * @param [out]  outLen  Size of resulting data.
40438
 * @param [in]   tag     Authentication tag for encrypted data.
40439
 * @param [in]   heap    Dynamic memory allocation data hint.
40440
 * @param [in]   enc     1 when encrypting, 0 when decrypting.
40441
 * @return  0 on success.
40442
 * @return  Other value when encryption/decryption fails.
40443
 */
40444
static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
40445
                        byte* in, int inLen, byte* out, int* outLen, byte* tag,
40446
                        void* heap, int enc)
40447
{
40448
    int ret;
40449
40450
    (void)keyLen;
40451
    (void)heap;
40452
40453
    if (enc) {
40454
        ret = wc_ChaCha20Poly1305_Encrypt(key, iv, aad, aadSz, in, inLen, out,
40455
                                          tag);
40456
    }
40457
    else {
40458
        ret = wc_ChaCha20Poly1305_Decrypt(key, iv, aad, aadSz, in, inLen, tag,
40459
                                          out);
40460
    }
40461
40462
    *outLen = inLen;
40463
40464
    return ret;
40465
}
40466
#elif defined(HAVE_AESGCM)
40467
/* Ticket encryption/decryption implementation.
40468
 *
40469
 * @param [in]   key     Key for encryption/decryption.
40470
 * @param [in]   keyLen  Length of key in bytes.
40471
 * @param [in]   iv      IV/Nonce for encryption/decryption.
40472
 * @param [in]   aad     Additional authentication data.
40473
 * @param [in]   aadSz   Length of additional authentication data.
40474
 * @param [in]   in      Data to encrypt/decrypt.
40475
 * @param [in]   inLen   Length of encrypted data.
40476
 * @param [out]  out     Resulting data from encrypt/decrypt.
40477
 * @param [out]  outLen  Size of resulting data.
40478
 * @param [in]   tag     Authentication tag for encrypted data.
40479
 * @param [in]   heap    Dynamic memory allocation data hint.
40480
 * @param [in]   enc     1 when encrypting, 0 when decrypting.
40481
 * @return  0 on success.
40482
 * @return  MEMORY_E when dynamic memory allocation fails.
40483
 * @return  Other value when encryption/decryption fails.
40484
 */
40485
static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
40486
                        byte* in, int inLen, byte* out, int* outLen, byte* tag,
40487
                        void* heap, int enc)
40488
{
40489
    int ret;
40490
#ifdef WOLFSSL_SMALL_STACK
40491
    Aes* aes;
40492
#else
40493
    Aes aes[1];
40494
#endif
40495
40496
    (void)heap;
40497
40498
#ifdef WOLFSSL_SMALL_STACK
40499
    aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_TMP_BUFFER);
40500
    if (aes == NULL)
40501
        return MEMORY_E;
40502
#endif
40503
40504
    if (enc) {
40505
        ret = wc_AesInit(aes, NULL, INVALID_DEVID);
40506
        if (ret == 0) {
40507
            ret = wc_AesGcmSetKey(aes, key, keyLen);
40508
        }
40509
        if (ret == 0) {
40510
            ret = wc_AesGcmEncrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
40511
                                   tag, WC_AES_BLOCK_SIZE, aad, aadSz);
40512
        }
40513
        wc_AesFree(aes);
40514
    }
40515
    else {
40516
        ret = wc_AesInit(aes, NULL, INVALID_DEVID);
40517
        if (ret == 0) {
40518
            ret = wc_AesGcmSetKey(aes, key, keyLen);
40519
        }
40520
        if (ret == 0) {
40521
            ret = wc_AesGcmDecrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
40522
                                   tag, WC_AES_BLOCK_SIZE, aad, aadSz);
40523
        }
40524
        wc_AesFree(aes);
40525
    }
40526
40527
#ifdef WOLFSSL_SMALL_STACK
40528
    XFREE(aes, heap, DYNAMIC_TYPE_TMP_BUFFER);
40529
#endif
40530
40531
    *outLen = inLen;
40532
40533
    return ret;
40534
}
40535
#elif defined(WOLFSSL_SM4_GCM)
40536
/* Ticket encryption/decryption implementation.
40537
 *
40538
 * @param [in]   key     Key for encryption/decryption.
40539
 * @param [in]   keyLen  Length of key in bytes.
40540
 * @param [in]   iv      IV/Nonce for encryption/decryption.
40541
 * @param [in]   aad     Additional authentication data.
40542
 * @param [in]   aadSz   Length of additional authentication data.
40543
 * @param [in]   in      Data to encrypt/decrypt.
40544
 * @param [in]   inLen   Length of encrypted data.
40545
 * @param [out]  out     Resulting data from encrypt/decrypt.
40546
 * @param [out]  outLen  Size of resulting data.
40547
 * @param [in]   tag     Authentication tag for encrypted data.
40548
 * @param [in]   heap    Dynamic memory allocation data hint.
40549
 * @param [in]   enc     1 when encrypting, 0 when decrypting.
40550
 * @return  0 on success.
40551
 * @return  MEMORY_E when dynamic memory allocation fails.
40552
 * @return  Other value when encryption/decryption fails.
40553
 */
40554
static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
40555
                        byte* in, int inLen, byte* out, int* outLen, byte* tag,
40556
                        void* heap, int enc)
40557
{
40558
    int ret;
40559
#ifdef WOLFSSL_SMALL_STACK
40560
    wc_Sm4* sm4;
40561
#else
40562
    wc_Sm4 sm4[1];
40563
#endif
40564
40565
    (void)heap;
40566
40567
#ifdef WOLFSSL_SMALL_STACK
40568
    sm4 = (wc_Sm4*)XMALLOC(sizeof(wc_Sm4), heap, DYNAMIC_TYPE_TMP_BUFFER);
40569
    if (sm4 == NULL)
40570
        return MEMORY_E;
40571
#endif
40572
40573
    if (enc) {
40574
        ret = wc_Sm4Init(sm4, NULL, INVALID_DEVID);
40575
        if (ret == 0) {
40576
            ret = wc_Sm4GcmSetKey(sm4, key, keyLen);
40577
        }
40578
        if (ret == 0) {
40579
            ret = wc_Sm4GcmEncrypt(sm4, in, out, inLen, iv, GCM_NONCE_MID_SZ,
40580
                                   tag, SM4_BLOCK_SIZE, aad, aadSz);
40581
        }
40582
        wc_Sm4Free(sm4);
40583
    }
40584
    else {
40585
        ret = wc_Sm4Init(sm4, NULL, INVALID_DEVID);
40586
        if (ret == 0) {
40587
            ret = wc_Sm4GcmSetKey(sm4, key, keyLen);
40588
        }
40589
        if (ret == 0) {
40590
            ret = wc_Sm4GcmDecrypt(sm4, in, out, inLen, iv, GCM_NONCE_MID_SZ,
40591
                                   tag, SM$_BLOCK_SIZE, aad, aadSz);
40592
        }
40593
        wc_Sm4Free(sm4);
40594
    }
40595
40596
#ifdef WOLFSSL_SMALL_STACK
40597
    XFREE(sm4, heap, DYNAMIC_TYPE_TMP_BUFFER);
40598
#endif
40599
40600
    *outLen = inLen;
40601
40602
    return ret;
40603
}
40604
#else
40605
    #error "No encryption algorithm available for default ticket encryption."
40606
#endif
40607
40608
/* Choose a key to use for encryption.
40609
 *
40610
 * Generate a new key if the current ones are expired.
40611
 * If the secondary key has not been used and the primary key has expired then
40612
 * generate a new primary key.
40613
 *
40614
 * @param [in]   Ticket encryption callback context.
40615
 * @param [in]   Session ticket lifetime.
40616
 * @param [out]  Index of key to use for encryption.
40617
 * @return  0 on success.
40618
 * @return  Other value when random number generation fails.
40619
 */
40620
static int TicketEncCbCtx_ChooseKey(TicketEncCbCtx* keyCtx, int ticketHint,
40621
                                    int* keyIdx)
40622
{
40623
    int ret = 0;
40624
40625
    /* Get new current time as lock may have taken some time. */
40626
    word32 now = LowResTimer();
40627
40628
    /* Check expirary of primary key for encrypt. */
40629
    if (keyCtx->expirary[0] >= now + ticketHint) {
40630
        *keyIdx = 0;
40631
    }
40632
    /* Check expirary of primary key for encrypt. */
40633
    else if (keyCtx->expirary[1] >= now + ticketHint) {
40634
        *keyIdx = 1;
40635
    }
40636
    /* No key available to use. */
40637
    else {
40638
        int genKey;
40639
40640
        /* Generate which ever key is expired for decrypt - primary first. */
40641
        if (keyCtx->expirary[0] < now) {
40642
            genKey = 0;
40643
        }
40644
        else if (keyCtx->expirary[1] < now) {
40645
            genKey = 1;
40646
        }
40647
        /* Timeouts and expirary should not allow this to happen. */
40648
        else {
40649
            return BAD_STATE_E;
40650
        }
40651
40652
        /* Generate the required key */
40653
        ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[genKey],
40654
                                   WOLFSSL_TICKET_KEY_SZ);
40655
        if (ret == 0) {
40656
            keyCtx->expirary[genKey] = now + WOLFSSL_TICKET_KEY_LIFETIME;
40657
            *keyIdx = genKey;
40658
        }
40659
    }
40660
40661
    return ret;
40662
}
40663
40664
/* Default Session Ticket encryption/decryption callback.
40665
 *
40666
 * Use ChaCha20-Poly1305, AES-GCM or SM4-GCM to encrypt/decrypt the ticket.
40667
 * Two keys are used:
40668
 *  - When the first expires for encryption, then use the other.
40669
 *  - Don't encrypt with key if the ticket lifetime will go beyond expirary.
40670
 *  - Generate a new primary key when primary key expired for decrypt and
40671
 *    no secondary key is activate for encryption.
40672
 *  - Generate a new secondary key when expired and needed.
40673
 *  - Calculate expirary starting from first encrypted ticket.
40674
 *  - Key name has last bit set to indicate index of key.
40675
 * Keys expire for decryption after ticket key lifetime from the first encrypted
40676
 * ticket.
40677
 * Keys can only be use for encryption while the ticket hint does not exceed
40678
 * the key lifetime.
40679
 * Lifetime of a key must be greater than the lifetime of a ticket. This means
40680
 * that if one ticket is only valid for decryption, then the other will be
40681
 * valid for encryption.
40682
 * AAD = key_name | iv | ticket len (16-bits network order)
40683
 *
40684
 * @param [in]      ssl       SSL connection.
40685
 * @param [in,out]  key_name  Name of key from client.
40686
 *                            Encrypt: name of key returned.
40687
 *                            Decrypt: name from ticket message to check.
40688
 * @param [in]      iv        IV to use in encryption/decryption.
40689
 * @param [in]      mac       MAC for authentication of encrypted data.
40690
 * @param [in]      enc       1 when encrypting ticket, 0 when decrypting.
40691
 * @param [in,out]  ticket    Encrypted/decrypted session ticket bytes.
40692
 * @param [in]      inLen     Length of incoming ticket.
40693
 * @param [out]     outLen    Length of outgoing ticket.
40694
 * @param [in]      userCtx   Context for encryption/decryption of ticket.
40695
 * @return  WOLFSSL_TICKET_RET_OK when successful.
40696
 * @return  WOLFSSL_TICKET_RET_CREATE when successful and a new ticket is to
40697
 *          be created for TLS 1.2 and below.
40698
 * @return  WOLFSSL_TICKET_RET_REJECT when failed to produce valid encrypted or
40699
 *          decrypted ticket.
40700
 * @return  WOLFSSL_TICKET_RET_FATAL when key name does not match.
40701
 */
40702
static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
40703
                          byte iv[WOLFSSL_TICKET_IV_SZ],
40704
                          byte mac[WOLFSSL_TICKET_MAC_SZ],
40705
                          int enc, byte* ticket, int inLen, int* outLen,
40706
                          void* userCtx)
40707
{
40708
    int ret;
40709
    TicketEncCbCtx* keyCtx = (TicketEncCbCtx*)userCtx;
40710
    WOLFSSL_CTX* ctx = keyCtx->ctx;
40711
    word16 sLen = XHTONS((word16)inLen);
40712
    byte aad[WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen)];
40713
    int  aadSz = WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen);
40714
    byte* p = aad;
40715
    int keyIdx = 0;
40716
40717
    WOLFSSL_ENTER("DefTicketEncCb");
40718
40719
    if ((!enc) && (inLen != WOLFSSL_INTERNAL_TICKET_LEN)) {
40720
        return BUFFER_E;
40721
    }
40722
40723
    /* Check we have setup the RNG, name and primary key. */
40724
    if (keyCtx->expirary[0] == 0) {
40725
#ifndef SINGLE_THREADED
40726
        /* Lock around access to expirary and key - stop initial key being
40727
         * generated twice at the same time. */
40728
        if (wc_LockMutex(&keyCtx->mutex) != 0) {
40729
            WOLFSSL_MSG("Couldn't lock key context mutex");
40730
            return WOLFSSL_TICKET_RET_REJECT;
40731
        }
40732
#endif
40733
        /* Sets expirary of primary key in setup. */
40734
        ret = TicketEncCbCtx_Setup(keyCtx, ssl->ctx->heap, ssl->ctx->devId);
40735
#ifndef SINGLE_THREADED
40736
        wc_UnLockMutex(&keyCtx->mutex);
40737
#endif
40738
        if (ret != 0)
40739
            return ret;
40740
    }
40741
40742
    if (enc) {
40743
        /* Return the name of the key - missing key index. */
40744
        XMEMCPY(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
40745
40746
        /* Generate a new IV into buffer to be returned.
40747
         * Don't use the RNG in keyCtx as it's for generating private data. */
40748
        ret = wc_RNG_GenerateBlock(ssl->rng, iv, WOLFSSL_TICKET_IV_SZ);
40749
        if (ret != 0) {
40750
            return WOLFSSL_TICKET_RET_REJECT;
40751
        }
40752
    }
40753
    else {
40754
        /* Mask of last bit that is the key index. */
40755
        byte lastByte = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0xfe;
40756
40757
        /* For decryption, see if we know this key - check all but last byte. */
40758
        if (XMEMCMP(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ - 1) != 0) {
40759
            return WOLFSSL_TICKET_RET_FATAL;
40760
        }
40761
        /* Ensure last byte without index bit matches too. */
40762
        if (lastByte != keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1]) {
40763
            return WOLFSSL_TICKET_RET_FATAL;
40764
        }
40765
    }
40766
40767
    /* Build AAD from: key name, iv, and length of ticket. */
40768
    XMEMCPY(p, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
40769
    p += WOLFSSL_TICKET_NAME_SZ;
40770
    XMEMCPY(p, iv, WOLFSSL_TICKET_IV_SZ);
40771
    p += WOLFSSL_TICKET_IV_SZ;
40772
    XMEMCPY(p, &sLen, sizeof(sLen));
40773
40774
    /* Encrypt ticket. */
40775
    if (enc) {
40776
        word32 now;
40777
40778
        now = LowResTimer();
40779
        /* As long as encryption expirary isn't imminent - no lock. */
40780
        if (keyCtx->expirary[0] > now + ctx->ticketHint) {
40781
            keyIdx = 0;
40782
        }
40783
        else if (keyCtx->expirary[1] > now + ctx->ticketHint) {
40784
            keyIdx = 1;
40785
        }
40786
        else {
40787
#ifndef SINGLE_THREADED
40788
            /* Lock around access to expirary and key - stop key being generated
40789
             * twice at the same time. */
40790
            if (wc_LockMutex(&keyCtx->mutex) != 0) {
40791
                WOLFSSL_MSG("Couldn't lock key context mutex");
40792
                return WOLFSSL_TICKET_RET_REJECT;
40793
            }
40794
#endif
40795
            ret = TicketEncCbCtx_ChooseKey(keyCtx, ctx->ticketHint, &keyIdx);
40796
#ifndef SINGLE_THREADED
40797
            wc_UnLockMutex(&keyCtx->mutex);
40798
#endif
40799
            if (ret != 0) {
40800
                return WOLFSSL_TICKET_RET_REJECT;
40801
            }
40802
        }
40803
        /* Set the name of the key to the index chosen. */
40804
        key_name[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
40805
        /* Update AAD too. */
40806
        aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
40807
40808
        /* Encrypt ticket data. */
40809
        ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
40810
                           aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
40811
                           1);
40812
        if (ret != 0) return WOLFSSL_TICKET_RET_REJECT;
40813
    }
40814
    /* Decrypt ticket. */
40815
    else {
40816
        /* Get index of key from name. */
40817
        keyIdx = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0x1;
40818
        /* Update AAD with index. */
40819
        aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
40820
40821
        /* Check expirary */
40822
        if (keyCtx->expirary[keyIdx] <= LowResTimer()) {
40823
            return WOLFSSL_TICKET_RET_REJECT;
40824
        }
40825
40826
        /* Decrypt ticket data. */
40827
        ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
40828
                           aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
40829
                           0);
40830
        if (ret != 0) {
40831
            return WOLFSSL_TICKET_RET_REJECT;
40832
        }
40833
    }
40834
40835
#ifndef WOLFSSL_TICKET_DECRYPT_NO_CREATE
40836
    if (!IsAtLeastTLSv1_3(ssl->version) && !enc)
40837
        return WOLFSSL_TICKET_RET_CREATE;
40838
#endif
40839
    return WOLFSSL_TICKET_RET_OK;
40840
}
40841
40842
#endif /* !WOLFSSL_NO_DEF_TICKET_ENC_CB */
40843
40844
#endif /* HAVE_SESSION_TICKET */
40845
40846
#ifndef WOLFSSL_NO_TLS12
40847
40848
#if defined(HAVE_SECURE_RENEGOTIATION) && \
40849
    !defined(NO_WOLFSSL_SERVER)
40850
40851
    /* handle generation of server's hello_request (0) */
40852
    int SendHelloRequest(WOLFSSL* ssl)
40853
    {
40854
        byte* output;
40855
        int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
40856
        int ret;
40857
40858
        WOLFSSL_START(WC_FUNC_HELLO_REQUEST_SEND);
40859
        WOLFSSL_ENTER("SendHelloRequest");
40860
40861
        if (IsEncryptionOn(ssl, 1))
40862
            sendSz += MAX_MSG_EXTRA;
40863
40864
        if (ssl->options.dtls)
40865
            sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
40866
40867
        /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
40868
         * is not advanced yet */
40869
        ssl->options.buildingMsg = 1;
40870
40871
        /* check for available size */
40872
        if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
40873
            return ret;
40874
40875
        /* get output buffer */
40876
        output = GetOutputBuffer(ssl);
40877
        AddHeaders(output, 0, hello_request, ssl);
40878
40879
        if (IsEncryptionOn(ssl, 1)) {
40880
            byte* input;
40881
            int   inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
40882
            int   recordHeaderSz = RECORD_HEADER_SZ;
40883
40884
            if (ssl->options.dtls) {
40885
                recordHeaderSz += DTLS_RECORD_EXTRA;
40886
                inputSz += DTLS_HANDSHAKE_EXTRA;
40887
            }
40888
40889
            input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
40890
            if (input == NULL)
40891
                return MEMORY_E;
40892
40893
            XMEMCPY(input, output + recordHeaderSz, inputSz);
40894
            #ifdef WOLFSSL_DTLS
40895
            if (IsDtlsNotSctpMode(ssl) &&
40896
                    (ret = DtlsMsgPoolSave(ssl, input, inputSz, hello_request)) != 0) {
40897
                XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
40898
                return ret;
40899
            }
40900
            #endif
40901
            sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
40902
                                  handshake, 0, 0, 0, CUR_ORDER);
40903
            XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
40904
40905
            if (sendSz < 0)
40906
                return sendSz;
40907
        }
40908
40909
        ssl->buffers.outputBuffer.length += sendSz;
40910
        ssl->options.buildingMsg = 0;
40911
40912
        ret = SendBuffered(ssl);
40913
40914
        WOLFSSL_LEAVE("SendHelloRequest", ret);
40915
        WOLFSSL_END(WC_FUNC_HELLO_REQUEST_SEND);
40916
40917
        return ret;
40918
    }
40919
40920
#endif /* HAVE_SECURE_RENEGOTIATION && !NO_WOLFSSL_SERVER */
40921
40922
#ifdef WOLFSSL_DTLS
40923
    /* handle generation of DTLS hello_verify_request (3) */
40924
    int SendHelloVerifyRequest(WOLFSSL* ssl,
40925
                               const byte* cookie, byte cookieSz)
40926
    {
40927
        byte* output;
40928
        int   length = VERSION_SZ + ENUM_LEN + cookieSz;
40929
        int   idx    = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
40930
        int   sendSz = length + idx;
40931
        int   ret;
40932
40933
        /* are we in scr */
40934
        if (IsEncryptionOn(ssl, 1)) {
40935
            sendSz += MAX_MSG_EXTRA;
40936
        }
40937
40938
        /* reset hashes  */
40939
        ret = InitHandshakeHashes(ssl);
40940
        if (ret != 0)
40941
            return ret;
40942
40943
        /* check for available size */
40944
        if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
40945
            return ret;
40946
40947
        /* get output buffer */
40948
        output = GetOutputBuffer(ssl);
40949
40950
        /* Hello Verify Request should use the same sequence number
40951
         * as the Client Hello unless we are in renegotiation then
40952
         * don't change numbers */
40953
#ifdef HAVE_SECURE_RENEGOTIATION
40954
        if (!IsSCR(ssl))
40955
#endif
40956
        {
40957
            ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
40958
            ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
40959
        }
40960
        AddHeaders(output, (word32)length, hello_verify_request, ssl);
40961
40962
        output[idx++] = DTLS_MAJOR;
40963
        output[idx++] = DTLS_MINOR;
40964
40965
        output[idx++] = cookieSz;
40966
        if (cookie == NULL || cookieSz == 0)
40967
            return COOKIE_ERROR;
40968
40969
        XMEMCPY(output + idx, cookie, cookieSz);
40970
40971
#if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
40972
        if (ssl->hsInfoOn)
40973
            AddPacketName(ssl, "HelloVerifyRequest");
40974
        if (ssl->toInfoOn) {
40975
            ret = AddPacketInfo(ssl, "HelloVerifyRequest", handshake, output,
40976
                          sendSz, WRITE_PROTO, 0, ssl->heap);
40977
            if (ret != 0)
40978
                return ret;
40979
        }
40980
#endif
40981
40982
        /* are we in scr */
40983
        if (IsEncryptionOn(ssl, 1)) {
40984
            byte* input;
40985
            int   inputSz = DTLS_HANDSHAKE_HEADER_SZ + length; /* build msg adds rec hdr */
40986
            int   recordHeaderSz = DTLS_RECORD_HEADER_SZ;
40987
40988
            input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
40989
            if (input == NULL)
40990
                return MEMORY_E;
40991
40992
            XMEMCPY(input, output + recordHeaderSz, inputSz);
40993
            sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
40994
                                  handshake, 0, 0, 0, CUR_ORDER);
40995
            XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
40996
40997
            if (sendSz < 0)
40998
                return sendSz;
40999
        }
41000
41001
        ssl->buffers.outputBuffer.length += sendSz;
41002
41003
        return SendBuffered(ssl);
41004
    }
41005
#endif /* WOLFSSL_DTLS */
41006
41007
    typedef struct DckeArgs {
41008
        byte*  output; /* not allocated */
41009
        word32 length;
41010
        word32 idx;
41011
        word32 begin;
41012
        word32 sigSz;
41013
    #ifndef NO_RSA
41014
        int    lastErr;
41015
    #endif
41016
    } DckeArgs;
41017
41018
    static void FreeDckeArgs(WOLFSSL* ssl, void* pArgs)
41019
1.02k
    {
41020
1.02k
        DckeArgs* args = (DckeArgs*)pArgs;
41021
41022
1.02k
        (void)ssl;
41023
1.02k
        (void)args;
41024
1.02k
    }
41025
41026
    /* handle processing client_key_exchange (16) */
41027
    static int DoClientKeyExchange(WOLFSSL* ssl, byte* input, word32* inOutIdx,
41028
                                                                    word32 size)
41029
0
    {
41030
0
        int ret;
41031
    #ifdef WOLFSSL_ASYNC_CRYPT
41032
        DckeArgs* args = NULL;
41033
        WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
41034
    #else
41035
0
        DckeArgs  args[1];
41036
0
    #endif
41037
41038
0
        (void)size;
41039
0
        (void)input;
41040
41041
0
        WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
41042
0
        WOLFSSL_ENTER("DoClientKeyExchange");
41043
41044
    #ifdef WOLFSSL_BLIND_PRIVATE_KEY
41045
        wolfssl_priv_der_unblind(ssl->buffers.key, ssl->buffers.keyMask);
41046
    #endif
41047
41048
    #ifdef WOLFSSL_ASYNC_CRYPT
41049
        if (ssl->async == NULL) {
41050
            ssl->async = (struct WOLFSSL_ASYNC*)
41051
                    XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
41052
                            DYNAMIC_TYPE_ASYNC);
41053
            if (ssl->async == NULL)
41054
                ERROR_OUT(MEMORY_E, exit_dcke);
41055
        }
41056
        args = (DckeArgs*)ssl->async->args;
41057
41058
        ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
41059
        if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) {
41060
            /* Check for error */
41061
            if (ret < 0)
41062
                goto exit_dcke;
41063
        }
41064
        else
41065
    #endif /* WOLFSSL_ASYNC_CRYPT */
41066
0
        {
41067
            /* Reset state */
41068
0
            ret = 0;
41069
0
            ssl->options.asyncState = TLS_ASYNC_BEGIN;
41070
0
            XMEMSET(args, 0, sizeof(DckeArgs));
41071
0
            args->idx = *inOutIdx;
41072
0
            args->begin = *inOutIdx;
41073
        #ifdef WOLFSSL_ASYNC_CRYPT
41074
            ssl->async->freeArgs = FreeDckeArgs;
41075
        #endif
41076
0
        }
41077
41078
        /* Do Client Key Exchange State Machine */
41079
0
        switch(ssl->options.asyncState)
41080
0
        {
41081
0
            case TLS_ASYNC_BEGIN:
41082
0
            {
41083
                /* Sanity checks */
41084
                /* server side checked in SanityCheckMsgReceived */
41085
0
                if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
41086
0
                    WOLFSSL_MSG("Client sending keyexchange at wrong time");
41087
0
                    SendAlert(ssl, alert_fatal, unexpected_message);
41088
0
                    ERROR_OUT(OUT_OF_ORDER_E, exit_dcke);
41089
0
                }
41090
41091
0
            #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
41092
0
                if (ssl->options.verifyPeer &&
41093
0
                         (ssl->options.mutualAuth || ssl->options.failNoCert)) {
41094
0
                    if (!ssl->options.havePeerCert) {
41095
0
                        WOLFSSL_MSG("client didn't present peer cert");
41096
0
                        ERROR_OUT(NO_PEER_CERT, exit_dcke);
41097
0
                    }
41098
0
                }
41099
41100
0
                if (ssl->options.verifyPeer && ssl->options.failNoCertxPSK) {
41101
0
                    if (!ssl->options.havePeerCert &&
41102
0
                                             !ssl->options.usingPSK_cipher) {
41103
0
                        WOLFSSL_MSG("client didn't present peer cert");
41104
0
                        ERROR_OUT(NO_PEER_CERT, exit_dcke);
41105
0
                    }
41106
0
                }
41107
0
            #endif /* !NO_CERTS && !WOLFSSL_NO_CLIENT_AUTH */
41108
41109
            #if defined(WOLFSSL_CALLBACKS)
41110
                if (ssl->hsInfoOn) {
41111
                    AddPacketName(ssl, "ClientKeyExchange");
41112
                }
41113
                if (ssl->toInfoOn) {
41114
                    AddLateName("ClientKeyExchange", &ssl->timeoutInfo);
41115
                }
41116
            #endif
41117
41118
0
                if (ssl->arrays->preMasterSecret == NULL) {
41119
0
                    ssl->arrays->preMasterSz = ENCRYPT_LEN;
41120
0
                    ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
41121
0
                                                ssl->heap, DYNAMIC_TYPE_SECRET);
41122
0
                    if (ssl->arrays->preMasterSecret == NULL) {
41123
0
                        ERROR_OUT(MEMORY_E, exit_dcke);
41124
0
                    }
41125
0
                    XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
41126
0
                }
41127
41128
0
                switch (ssl->specs.kea) {
41129
0
                #ifndef NO_RSA
41130
0
                    case rsa_kea:
41131
0
                    {
41132
0
                        break;
41133
0
                    } /* rsa_kea */
41134
0
                #endif /* !NO_RSA */
41135
                #ifndef NO_PSK
41136
                    case psk_kea:
41137
                    {
41138
                        /* sanity check that PSK server callback has been set */
41139
                        if (ssl->options.server_psk_cb == NULL) {
41140
                           WOLFSSL_MSG("No server PSK callback set");
41141
                           ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
41142
                        }
41143
                        break;
41144
                    }
41145
                #endif /* !NO_PSK */
41146
0
                #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
41147
0
                                                          defined(HAVE_CURVE448)
41148
0
                    case ecc_diffie_hellman_kea:
41149
0
                    {
41150
0
                        break;
41151
0
                    }
41152
0
                #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
41153
0
                #ifndef NO_DH
41154
0
                    case diffie_hellman_kea:
41155
0
                    {
41156
0
                        break;
41157
0
                    }
41158
0
                #endif /* !NO_DH */
41159
                #if !defined(NO_DH) && !defined(NO_PSK)
41160
                    case dhe_psk_kea:
41161
                    {
41162
                        /* sanity check that PSK server callback has been set */
41163
                        if (ssl->options.server_psk_cb == NULL) {
41164
                            WOLFSSL_MSG("No server PSK callback set");
41165
                            ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
41166
                        }
41167
                        break;
41168
                    }
41169
                #endif /* !NO_DH && !NO_PSK */
41170
                #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
41171
                                     defined(HAVE_CURVE448)) && !defined(NO_PSK)
41172
                    case ecdhe_psk_kea:
41173
                    {
41174
                        /* sanity check that PSK server callback has been set */
41175
                        if (ssl->options.server_psk_cb == NULL) {
41176
                            WOLFSSL_MSG("No server PSK callback set");
41177
                            ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
41178
                        }
41179
                        break;
41180
                    }
41181
                #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
41182
0
                    default:
41183
0
                        WOLFSSL_MSG("Bad kea type");
41184
0
                        ret = BAD_KEA_TYPE_E;
41185
0
                } /* switch (ssl->specs.kea) */
41186
41187
                /* Check for error */
41188
0
                if (ret != 0) {
41189
0
                    goto exit_dcke;
41190
0
                }
41191
41192
                /* Advance state and proceed */
41193
0
                ssl->options.asyncState = TLS_ASYNC_BUILD;
41194
0
            } /* TLS_ASYNC_BEGIN */
41195
0
            FALL_THROUGH;
41196
41197
0
            case TLS_ASYNC_BUILD:
41198
0
            {
41199
0
                switch (ssl->specs.kea) {
41200
0
                #ifndef NO_RSA
41201
0
                    case rsa_kea:
41202
0
                    {
41203
0
                        word32 keySz;
41204
41205
0
                        ssl->buffers.keyType = rsa_sa_algo;
41206
0
                        ret = DecodePrivateKey(ssl, &keySz);
41207
0
                        if (ret != 0) {
41208
0
                            goto exit_dcke;
41209
0
                        }
41210
0
                        args->length = (word32)keySz;
41211
0
                        ssl->arrays->preMasterSz = SECRET_LEN;
41212
41213
0
                        if (ssl->options.tls) {
41214
0
                            word16 check;
41215
41216
0
                            if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
41217
0
                                ERROR_OUT(BUFFER_ERROR, exit_dcke);
41218
0
                            }
41219
41220
0
                            ato16(input + args->idx, &check);
41221
0
                            args->idx += OPAQUE16_LEN;
41222
41223
0
                            if ((word32)check != args->length) {
41224
0
                                WOLFSSL_MSG("RSA explicit size doesn't match");
41225
                        #ifdef WOLFSSL_EXTRA_ALERTS
41226
                                SendAlert(ssl, alert_fatal, bad_record_mac);
41227
                        #endif
41228
0
                                ERROR_OUT(RSA_PRIVATE_ERROR, exit_dcke);
41229
0
                            }
41230
0
                        }
41231
41232
0
                        if ((args->idx - args->begin) + args->length > size) {
41233
0
                            WOLFSSL_MSG("RSA message too big");
41234
0
                            ERROR_OUT(BUFFER_ERROR, exit_dcke);
41235
0
                        }
41236
41237
                        /* pre-load PreMasterSecret with RNG data */
41238
0
                        ret = wc_RNG_GenerateBlock(ssl->rng,
41239
0
                            &ssl->arrays->preMasterSecret[VERSION_SZ],
41240
0
                            SECRET_LEN - VERSION_SZ);
41241
0
                        if (ret != 0) {
41242
0
                            goto exit_dcke;
41243
0
                        }
41244
41245
0
                        args->output = NULL;
41246
0
                        break;
41247
0
                    } /* rsa_kea */
41248
0
                #endif /* !NO_RSA */
41249
                #ifndef NO_PSK
41250
                    case psk_kea:
41251
                    {
41252
                        byte* pms = ssl->arrays->preMasterSecret;
41253
                        word16 ci_sz;
41254
41255
                        if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
41256
                            ERROR_OUT(BUFFER_ERROR, exit_dcke);
41257
                        }
41258
41259
                        ato16(input + args->idx, &ci_sz);
41260
                        args->idx += OPAQUE16_LEN;
41261
41262
                        if (ci_sz > MAX_PSK_ID_LEN) {
41263
                            ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
41264
                        }
41265
41266
                        if ((args->idx - args->begin) + ci_sz > size) {
41267
                            ERROR_OUT(BUFFER_ERROR, exit_dcke);
41268
                        }
41269
41270
                        XMEMCPY(ssl->arrays->client_identity,
41271
                                                    input + args->idx, ci_sz);
41272
                        args->idx += ci_sz;
41273
41274
                        ssl->arrays->client_identity[ci_sz] = '\0'; /* null term */
41275
                        ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
41276
                            ssl->arrays->client_identity, ssl->arrays->psk_key,
41277
                            MAX_PSK_KEY_LEN);
41278
41279
                        if (ssl->arrays->psk_keySz == 0 ||
41280
                            (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
41281
                        (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
41282
                        #if defined(WOLFSSL_EXTRA_ALERTS) || \
41283
                            defined(WOLFSSL_PSK_IDENTITY_ALERT)
41284
                            SendAlert(ssl, alert_fatal,
41285
                                    unknown_psk_identity);
41286
                        #endif
41287
                            ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
41288
                        }
41289
                        /* SERVER: Pre-shared Key for peer authentication. */
41290
                        ssl->options.peerAuthGood = 1;
41291
41292
                        /* make psk pre master secret */
41293
                        if ((int)ssl->arrays->psk_keySz > 0) {
41294
                            /* length of key + length 0s + length of key + key */
41295
                            c16toa((word16) ssl->arrays->psk_keySz, pms);
41296
                            pms += OPAQUE16_LEN;
41297
41298
                            XMEMSET(pms, 0, ssl->arrays->psk_keySz);
41299
                            pms += ssl->arrays->psk_keySz;
41300
41301
                            c16toa((word16) ssl->arrays->psk_keySz, pms);
41302
                            pms += OPAQUE16_LEN;
41303
41304
                            XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
41305
                            ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2) +
41306
                                (OPAQUE16_LEN * 2);
41307
                        }
41308
                        ssl->arrays->psk_keySz = 0; /* no further need */
41309
                        break;
41310
                    }
41311
                #endif /* !NO_PSK */
41312
0
                #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
41313
0
                                                          defined(HAVE_CURVE448)
41314
0
                    case ecc_diffie_hellman_kea:
41315
0
                    {
41316
0
                    #ifdef HAVE_ECC
41317
0
                        ecc_key* private_key = ssl->eccTempKey;
41318
41319
                        /* handle static private key */
41320
0
                        if (ssl->specs.static_ecdh &&
41321
0
                                          ssl->ecdhCurveOID != ECC_X25519_OID &&
41322
0
                                          ssl->ecdhCurveOID != ECC_X448_OID) {
41323
0
                            word32 keySz;
41324
41325
0
                            ssl->buffers.keyType = ecc_dsa_sa_algo;
41326
0
                            ret = DecodePrivateKey(ssl, &keySz);
41327
0
                            if (ret != 0) {
41328
0
                                goto exit_dcke;
41329
0
                            }
41330
0
                            private_key = (ecc_key*)ssl->hsKey;
41331
0
                        }
41332
0
                    #endif
41333
41334
                        /* import peer ECC key */
41335
0
                        if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
41336
0
                            ERROR_OUT(BUFFER_ERROR, exit_dcke);
41337
0
                        }
41338
41339
0
                        args->length = input[args->idx++];
41340
41341
0
                        if ((args->idx - args->begin) + args->length > size) {
41342
0
                            ERROR_OUT(BUFFER_ERROR, exit_dcke);
41343
0
                        }
41344
41345
0
                    #ifdef HAVE_CURVE25519
41346
0
                        if (ssl->ecdhCurveOID == ECC_X25519_OID) {
41347
                        #ifdef HAVE_PK_CALLBACKS
41348
                            /* if callback then use it for shared secret */
41349
                            if (ssl->ctx->X25519SharedSecretCb != NULL) {
41350
                                break;
41351
                            }
41352
                        #endif
41353
0
                            if (ssl->peerX25519Key == NULL) {
41354
                                /* alloc/init on demand */
41355
0
                                ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
41356
0
                                    (void**)&ssl->peerX25519Key);
41357
0
                                if (ret != 0) {
41358
0
                                    goto exit_dcke;
41359
0
                                }
41360
0
                            } else if (ssl->peerX25519KeyPresent) {
41361
0
                                ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
41362
0
                                               ssl->peerX25519Key);
41363
0
                                ssl->peerX25519KeyPresent = 0;
41364
0
                                if (ret != 0) {
41365
0
                                    goto exit_dcke;
41366
0
                                }
41367
0
                            }
41368
41369
0
                            if ((ret = wc_curve25519_check_public(
41370
0
                                    input + args->idx, args->length,
41371
0
                                    EC25519_LITTLE_ENDIAN)) != 0) {
41372
                        #ifdef WOLFSSL_EXTRA_ALERTS
41373
                                if (ret == WC_NO_ERR_TRACE(BUFFER_E))
41374
                                    SendAlert(ssl, alert_fatal, decode_error);
41375
                                else if (ret == WC_NO_ERR_TRACE(ECC_OUT_OF_RANGE_E))
41376
                                    SendAlert(ssl, alert_fatal, bad_record_mac);
41377
                                else {
41378
                                    SendAlert(ssl, alert_fatal,
41379
                                                             illegal_parameter);
41380
                                }
41381
                        #endif
41382
0
                                ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
41383
0
                            }
41384
41385
0
                            if (wc_curve25519_import_public_ex(
41386
0
                                    input + args->idx, args->length,
41387
0
                                    ssl->peerX25519Key,
41388
0
                                    EC25519_LITTLE_ENDIAN)) {
41389
                        #ifdef WOLFSSL_EXTRA_ALERTS
41390
                                SendAlert(ssl, alert_fatal, illegal_parameter);
41391
                        #endif
41392
0
                                ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
41393
0
                            }
41394
41395
0
                            ssl->arrays->preMasterSz = CURVE25519_KEYSIZE;
41396
41397
0
                            ssl->peerX25519KeyPresent = 1;
41398
41399
0
                            break;
41400
0
                        }
41401
0
                    #endif
41402
0
                    #ifdef HAVE_CURVE448
41403
0
                        if (ssl->ecdhCurveOID == ECC_X448_OID) {
41404
                        #ifdef HAVE_PK_CALLBACKS
41405
                            /* if callback then use it for shared secret */
41406
                            if (ssl->ctx->X448SharedSecretCb != NULL) {
41407
                                break;
41408
                            }
41409
                        #endif
41410
0
                            if (ssl->peerX448Key == NULL) {
41411
                                /* alloc/init on demand */
41412
0
                                ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
41413
0
                                    (void**)&ssl->peerX448Key);
41414
0
                                if (ret != 0) {
41415
0
                                    goto exit_dcke;
41416
0
                                }
41417
0
                            } else if (ssl->peerX448KeyPresent) {
41418
0
                                ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
41419
0
                                               ssl->peerX448Key);
41420
0
                                ssl->peerX448KeyPresent = 0;
41421
0
                                if (ret != 0) {
41422
0
                                    goto exit_dcke;
41423
0
                                }
41424
0
                            }
41425
41426
0
                            if ((ret = wc_curve448_check_public(
41427
0
                                    input + args->idx, args->length,
41428
0
                                    EC448_LITTLE_ENDIAN)) != 0) {
41429
                        #ifdef WOLFSSL_EXTRA_ALERTS
41430
                                if (ret == WC_NO_ERR_TRACE(BUFFER_E))
41431
                                    SendAlert(ssl, alert_fatal, decode_error);
41432
                                else if (ret == WC_NO_ERR_TRACE(ECC_OUT_OF_RANGE_E))
41433
                                    SendAlert(ssl, alert_fatal, bad_record_mac);
41434
                                else {
41435
                                    SendAlert(ssl, alert_fatal,
41436
                                                             illegal_parameter);
41437
                                }
41438
                        #endif
41439
0
                                ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
41440
0
                            }
41441
41442
0
                            if (wc_curve448_import_public_ex(
41443
0
                                    input + args->idx, args->length,
41444
0
                                    ssl->peerX448Key,
41445
0
                                    EC448_LITTLE_ENDIAN)) {
41446
                        #ifdef WOLFSSL_EXTRA_ALERTS
41447
                                SendAlert(ssl, alert_fatal, illegal_parameter);
41448
                        #endif
41449
0
                                ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
41450
0
                            }
41451
41452
0
                            ssl->arrays->preMasterSz = CURVE448_KEY_SIZE;
41453
41454
0
                            ssl->peerX448KeyPresent = 1;
41455
41456
0
                            break;
41457
0
                        }
41458
0
                    #endif
41459
0
                #ifdef HAVE_ECC
41460
                    #ifdef HAVE_PK_CALLBACKS
41461
                        /* if callback then use it for shared secret */
41462
                        if (ssl->ctx->EccSharedSecretCb != NULL) {
41463
                            break;
41464
                        }
41465
                    #endif
41466
41467
0
                        if (!ssl->specs.static_ecdh &&
41468
0
                            ssl->eccTempKeyPresent == 0) {
41469
0
                            WOLFSSL_MSG("Ecc ephemeral key not made correctly");
41470
0
                            ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
41471
0
                        }
41472
41473
0
                        if (ssl->peerEccKey == NULL) {
41474
                            /* alloc/init on demand */
41475
0
                            ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
41476
0
                                (void**)&ssl->peerEccKey);
41477
0
                            if (ret != 0) {
41478
0
                                goto exit_dcke;
41479
0
                            }
41480
0
                        } else if (ssl->peerEccKeyPresent) {
41481
0
                            ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
41482
0
                                           ssl->peerEccKey);
41483
0
                            ssl->peerEccKeyPresent = 0;
41484
0
                            if (ret != 0) {
41485
0
                                goto exit_dcke;
41486
0
                            }
41487
0
                        }
41488
41489
0
                        if (wc_ecc_import_x963_ex(input + args->idx,
41490
0
                                                  args->length, ssl->peerEccKey,
41491
0
                                                  private_key->dp->id)) {
41492
                        #ifdef WOLFSSL_EXTRA_ALERTS
41493
                            SendAlert(ssl, alert_fatal, illegal_parameter);
41494
                        #endif
41495
0
                            ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
41496
0
                        }
41497
41498
0
                        ssl->arrays->preMasterSz = (word32)private_key->dp->size;
41499
41500
0
                        ssl->peerEccKeyPresent = 1;
41501
41502
0
                    #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
41503
                        /* client_hello may have sent FFEDH2048, which sets namedGroup,
41504
                            but that is not being used, so clear it */
41505
                        /* resolves issue with server side wolfSSL_get_curve_name */
41506
0
                        ssl->namedGroup = 0;
41507
0
                    #endif
41508
0
                #endif /* HAVE_ECC */
41509
41510
0
                        break;
41511
0
                    }
41512
0
                #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
41513
0
                #ifndef NO_DH
41514
0
                    case diffie_hellman_kea:
41515
0
                    {
41516
0
                        word16 clientPubSz;
41517
41518
0
                        if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
41519
0
                            ERROR_OUT(BUFFER_ERROR, exit_dcke);
41520
0
                        }
41521
41522
0
                        ato16(input + args->idx, &clientPubSz);
41523
0
                        args->idx += OPAQUE16_LEN;
41524
41525
0
                        if ((args->idx - args->begin) + clientPubSz > size) {
41526
0
                            ERROR_OUT(BUFFER_ERROR, exit_dcke);
41527
0
                        }
41528
41529
0
                        args->sigSz = clientPubSz;
41530
41531
0
                        ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
41532
0
                                            (void**)&ssl->buffers.serverDH_Key);
41533
0
                        if (ret != 0) {
41534
0
                            goto exit_dcke;
41535
0
                        }
41536
41537
0
                        ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
41538
0
                            ssl->buffers.serverDH_P.buffer,
41539
0
                            ssl->buffers.serverDH_P.length,
41540
0
                            ssl->buffers.serverDH_G.buffer,
41541
0
                            ssl->buffers.serverDH_G.length);
41542
41543
                        /* set the max agree result size */
41544
0
                        ssl->arrays->preMasterSz = ENCRYPT_LEN;
41545
0
                        break;
41546
0
                    }
41547
0
                #endif /* !NO_DH */
41548
                #if !defined(NO_DH) && !defined(NO_PSK)
41549
                    case dhe_psk_kea:
41550
                    {
41551
                        word16 clientSz;
41552
41553
                        /* Read in the PSK hint */
41554
                        if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
41555
                            ERROR_OUT(BUFFER_ERROR, exit_dcke);
41556
                        }
41557
41558
                        ato16(input + args->idx, &clientSz);
41559
                        args->idx += OPAQUE16_LEN;
41560
                        if (clientSz > MAX_PSK_ID_LEN) {
41561
                            ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
41562
                        }
41563
41564
                        if ((args->idx - args->begin) + clientSz > size) {
41565
                            ERROR_OUT(BUFFER_ERROR, exit_dcke);
41566
                        }
41567
41568
                        XMEMCPY(ssl->arrays->client_identity, input + args->idx,
41569
                                                                    clientSz);
41570
                        args->idx += clientSz;
41571
                        ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
41572
41573
                        /* Read in the DHE business */
41574
                        if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
41575
                            ERROR_OUT(BUFFER_ERROR, exit_dcke);
41576
                        }
41577
41578
                        ato16(input + args->idx, &clientSz);
41579
                        args->idx += OPAQUE16_LEN;
41580
41581
                        if ((args->idx - args->begin) + clientSz > size) {
41582
                            ERROR_OUT(BUFFER_ERROR, exit_dcke);
41583
                        }
41584
41585
                        args->sigSz = clientSz;
41586
41587
                        ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
41588
                                            (void**)&ssl->buffers.serverDH_Key);
41589
                        if (ret != 0) {
41590
                            goto exit_dcke;
41591
                        }
41592
41593
                        ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
41594
                            ssl->buffers.serverDH_P.buffer,
41595
                            ssl->buffers.serverDH_P.length,
41596
                            ssl->buffers.serverDH_G.buffer,
41597
                            ssl->buffers.serverDH_G.length);
41598
41599
                        break;
41600
                    }
41601
                #endif /* !NO_DH && !NO_PSK */
41602
                #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
41603
                                     defined(HAVE_CURVE448)) && !defined(NO_PSK)
41604
                    case ecdhe_psk_kea:
41605
                    {
41606
                        word16 clientSz;
41607
41608
                        /* Read in the PSK hint */
41609
                        if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
41610
                            ERROR_OUT(BUFFER_ERROR, exit_dcke);
41611
                        }
41612
41613
                        ato16(input + args->idx, &clientSz);
41614
                        args->idx += OPAQUE16_LEN;
41615
                        if (clientSz > MAX_PSK_ID_LEN) {
41616
                            ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
41617
                        }
41618
                        if ((args->idx - args->begin) + clientSz > size) {
41619
                            ERROR_OUT(BUFFER_ERROR, exit_dcke);
41620
                        }
41621
41622
                        XMEMCPY(ssl->arrays->client_identity,
41623
                                                   input + args->idx, clientSz);
41624
                        args->idx += clientSz;
41625
                        ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
41626
41627
                        /* import peer ECC key */
41628
                        if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
41629
                            ERROR_OUT(BUFFER_ERROR, exit_dcke);
41630
                        }
41631
41632
                        args->length = input[args->idx++];
41633
41634
                        if ((args->idx - args->begin) + args->length > size) {
41635
                            ERROR_OUT(BUFFER_ERROR, exit_dcke);
41636
                        }
41637
41638
                        args->sigSz = ENCRYPT_LEN - OPAQUE16_LEN;
41639
41640
                    #ifdef HAVE_CURVE25519
41641
                        if (ssl->ecdhCurveOID == ECC_X25519_OID) {
41642
                        #ifdef HAVE_PK_CALLBACKS
41643
                            /* if callback then use it for shared secret */
41644
                            if (ssl->ctx->X25519SharedSecretCb != NULL) {
41645
                                break;
41646
                            }
41647
                        #endif
41648
41649
                            if (ssl->eccTempKeyPresent == 0) {
41650
                                WOLFSSL_MSG(
41651
                                     "X25519 ephemeral key not made correctly");
41652
                                ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
41653
                            }
41654
41655
                            if (ssl->peerX25519Key == NULL) {
41656
                                /* alloc/init on demand */
41657
                                ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
41658
                                    (void**)&ssl->peerX25519Key);
41659
                                if (ret != 0) {
41660
                                    goto exit_dcke;
41661
                                }
41662
                            } else if (ssl->peerX25519KeyPresent) {
41663
                                ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
41664
                                               ssl->peerX25519Key);
41665
                                ssl->peerX25519KeyPresent = 0;
41666
                                if (ret != 0) {
41667
                                    goto exit_dcke;
41668
                                }
41669
                            }
41670
41671
                            if ((ret = wc_curve25519_check_public(
41672
                                    input + args->idx, args->length,
41673
                                    EC25519_LITTLE_ENDIAN)) != 0) {
41674
                        #ifdef WOLFSSL_EXTRA_ALERTS
41675
                                if (ret == WC_NO_ERR_TRACE(BUFFER_E))
41676
                                    SendAlert(ssl, alert_fatal, decode_error);
41677
                                else if (ret == WC_NO_ERR_TRACE(ECC_OUT_OF_RANGE_E))
41678
                                    SendAlert(ssl, alert_fatal, bad_record_mac);
41679
                                else {
41680
                                    SendAlert(ssl, alert_fatal,
41681
                                                             illegal_parameter);
41682
                                }
41683
                        #endif
41684
                                ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
41685
                            }
41686
41687
                            if (wc_curve25519_import_public_ex(
41688
                                    input + args->idx, args->length,
41689
                                    ssl->peerX25519Key,
41690
                                    EC25519_LITTLE_ENDIAN)) {
41691
                                ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
41692
                            }
41693
41694
                            ssl->peerX25519KeyPresent = 1;
41695
41696
                            break;
41697
                        }
41698
                    #endif
41699
                    #ifdef HAVE_CURVE448
41700
                        if (ssl->ecdhCurveOID == ECC_X448_OID) {
41701
                        #ifdef HAVE_PK_CALLBACKS
41702
                            /* if callback then use it for shared secret */
41703
                            if (ssl->ctx->X448SharedSecretCb != NULL) {
41704
                                break;
41705
                            }
41706
                        #endif
41707
41708
                            if (ssl->eccTempKeyPresent == 0) {
41709
                                WOLFSSL_MSG(
41710
                                       "X448 ephemeral key not made correctly");
41711
                                ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
41712
                            }
41713
41714
                            if (ssl->peerX448Key == NULL) {
41715
                                /* alloc/init on demand */
41716
                                ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
41717
                                    (void**)&ssl->peerX448Key);
41718
                                if (ret != 0) {
41719
                                    goto exit_dcke;
41720
                                }
41721
                            } else if (ssl->peerX448KeyPresent) {
41722
                                ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
41723
                                               ssl->peerX448Key);
41724
                                ssl->peerX448KeyPresent = 0;
41725
                                if (ret != 0) {
41726
                                    goto exit_dcke;
41727
                                }
41728
                            }
41729
41730
                            if ((ret = wc_curve448_check_public(
41731
                                    input + args->idx, args->length,
41732
                                    EC448_LITTLE_ENDIAN)) != 0) {
41733
                        #ifdef WOLFSSL_EXTRA_ALERTS
41734
                                if (ret == WC_NO_ERR_TRACE(BUFFER_E))
41735
                                    SendAlert(ssl, alert_fatal, decode_error);
41736
                                else if (ret == WC_NO_ERR_TRACE(ECC_OUT_OF_RANGE_E))
41737
                                    SendAlert(ssl, alert_fatal, bad_record_mac);
41738
                                else {
41739
                                    SendAlert(ssl, alert_fatal,
41740
                                                             illegal_parameter);
41741
                                }
41742
                        #endif
41743
                                ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
41744
                            }
41745
41746
                            if (wc_curve448_import_public_ex(
41747
                                    input + args->idx, args->length,
41748
                                    ssl->peerX448Key,
41749
                                    EC448_LITTLE_ENDIAN)) {
41750
                                ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
41751
                            }
41752
41753
                            ssl->peerX448KeyPresent = 1;
41754
41755
                            break;
41756
                        }
41757
                    #endif
41758
                    #ifdef HAVE_PK_CALLBACKS
41759
                        /* if callback then use it for shared secret */
41760
                        if (ssl->ctx->EccSharedSecretCb != NULL) {
41761
                            break;
41762
                        }
41763
                    #endif
41764
41765
                        if (ssl->eccTempKeyPresent == 0) {
41766
                            WOLFSSL_MSG("Ecc ephemeral key not made correctly");
41767
                            ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
41768
                        }
41769
41770
                        if (ssl->peerEccKey == NULL) {
41771
                            /* alloc/init on demand */
41772
                            ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
41773
                                (void**)&ssl->peerEccKey);
41774
                            if (ret != 0) {
41775
                                goto exit_dcke;
41776
                            }
41777
                        }
41778
                        else if (ssl->peerEccKeyPresent) {
41779
                            ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
41780
                                           ssl->peerEccKey);
41781
                            ssl->peerEccKeyPresent = 0;
41782
                            if (ret != 0) {
41783
                                goto exit_dcke;
41784
                            }
41785
                        }
41786
                        if (wc_ecc_import_x963_ex(input + args->idx,
41787
                                 args->length, ssl->peerEccKey,
41788
                                 ssl->eccTempKey->dp->id)) {
41789
                            ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
41790
                        }
41791
41792
                        ssl->peerEccKeyPresent = 1;
41793
                        break;
41794
                    }
41795
                #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
41796
0
                    default:
41797
0
                        ret = BAD_KEA_TYPE_E;
41798
0
                } /* switch (ssl->specs.kea) */
41799
41800
                /* Check for error */
41801
0
                if (ret != 0) {
41802
0
                    goto exit_dcke;
41803
0
                }
41804
41805
                /* Advance state and proceed */
41806
0
                ssl->options.asyncState = TLS_ASYNC_DO;
41807
0
            } /* TLS_ASYNC_BUILD */
41808
0
            FALL_THROUGH;
41809
41810
0
            case TLS_ASYNC_DO:
41811
0
            {
41812
0
                switch (ssl->specs.kea) {
41813
0
                #ifndef NO_RSA
41814
0
                    case rsa_kea:
41815
0
                    {
41816
0
                        RsaKey* key = (RsaKey*)ssl->hsKey;
41817
0
                        int lenErrMask;
41818
41819
0
                        ret = RsaDec(ssl,
41820
0
                            input + args->idx,
41821
0
                            args->length,
41822
0
                            &args->output,
41823
0
                            &args->sigSz,
41824
0
                            key,
41825
                        #ifdef HAVE_PK_CALLBACKS
41826
                            ssl->buffers.key
41827
                        #else
41828
0
                            NULL
41829
0
                        #endif
41830
0
                        );
41831
41832
                        /*  Errors that can occur here that should be
41833
                         *  indistinguishable:
41834
                         *       RSA_BUFFER_E, RSA_PAD_E and RSA_PRIVATE_ERROR
41835
                         */
41836
                    #ifdef WOLFSSL_ASYNC_CRYPT
41837
                        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
41838
                            goto exit_dcke;
41839
                    #endif
41840
0
                        if (ret == WC_NO_ERR_TRACE(BAD_FUNC_ARG))
41841
0
                            goto exit_dcke;
41842
41843
0
                        lenErrMask = 0 - (SECRET_LEN != args->sigSz);
41844
0
                        args->lastErr = (ret & (~lenErrMask)) |
41845
0
                            (WC_NO_ERR_TRACE(RSA_PAD_E) & lenErrMask);
41846
0
                        ret = 0;
41847
0
                        break;
41848
0
                    } /* rsa_kea */
41849
0
                #endif /* !NO_RSA */
41850
                #ifndef NO_PSK
41851
                    case psk_kea:
41852
                    {
41853
                        break;
41854
                    }
41855
                #endif /* !NO_PSK */
41856
0
                #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
41857
0
                                                          defined(HAVE_CURVE448)
41858
0
                    case ecc_diffie_hellman_kea:
41859
0
                    {
41860
0
                        void* private_key = ssl->eccTempKey;
41861
0
                        (void)private_key;
41862
41863
0
                    #ifdef HAVE_CURVE25519
41864
0
                        if (ssl->ecdhCurveOID == ECC_X25519_OID) {
41865
0
                            ret = X25519SharedSecret(ssl,
41866
0
                                (curve25519_key*)private_key,
41867
0
                                ssl->peerX25519Key,
41868
0
                                input + args->idx, &args->length,
41869
0
                                ssl->arrays->preMasterSecret,
41870
0
                                &ssl->arrays->preMasterSz,
41871
0
                                WOLFSSL_SERVER_END
41872
0
                            );
41873
0
                            break;
41874
0
                        }
41875
0
                    #endif
41876
0
                    #ifdef HAVE_CURVE448
41877
0
                        if (ssl->ecdhCurveOID == ECC_X448_OID) {
41878
0
                            ret = X448SharedSecret(ssl,
41879
0
                                (curve448_key*)private_key,
41880
0
                                ssl->peerX448Key,
41881
0
                                input + args->idx, &args->length,
41882
0
                                ssl->arrays->preMasterSecret,
41883
0
                                &ssl->arrays->preMasterSz,
41884
0
                                WOLFSSL_SERVER_END
41885
0
                            );
41886
0
                            break;
41887
0
                        }
41888
0
                    #endif
41889
0
                    #ifdef HAVE_ECC
41890
0
                        if (ssl->specs.static_ecdh) {
41891
0
                            private_key = ssl->hsKey;
41892
0
                        }
41893
41894
                        /* Generate shared secret */
41895
0
                        ret = EccSharedSecret(ssl,
41896
0
                            (ecc_key*)private_key, ssl->peerEccKey,
41897
0
                            input + args->idx, &args->length,
41898
0
                            ssl->arrays->preMasterSecret,
41899
0
                            &ssl->arrays->preMasterSz,
41900
0
                            WOLFSSL_SERVER_END
41901
0
                        );
41902
                    #ifdef WOLFSSL_ASYNC_CRYPT
41903
                        if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
41904
                    #endif
41905
0
                        {
41906
0
                            FreeKey(ssl, DYNAMIC_TYPE_ECC,
41907
0
                                                      (void**)&ssl->peerEccKey);
41908
0
                            ssl->peerEccKeyPresent = 0;
41909
0
                        }
41910
0
                    #endif
41911
0
                        break;
41912
0
                    }
41913
0
                #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
41914
0
                #ifndef NO_DH
41915
0
                    case diffie_hellman_kea:
41916
0
                    {
41917
0
                        ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
41918
0
                            ssl->buffers.serverDH_Priv.buffer,
41919
0
                            ssl->buffers.serverDH_Priv.length,
41920
0
                            input + args->idx,
41921
0
                            (word16)args->sigSz,
41922
0
                            ssl->arrays->preMasterSecret,
41923
0
                            &ssl->arrays->preMasterSz,
41924
0
                            ssl->buffers.serverDH_P.buffer,
41925
0
                            ssl->buffers.serverDH_P.length);
41926
0
                        break;
41927
0
                    }
41928
0
                #endif /* !NO_DH */
41929
                #if !defined(NO_DH) && !defined(NO_PSK)
41930
                    case dhe_psk_kea:
41931
                    {
41932
                        ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
41933
                            ssl->buffers.serverDH_Priv.buffer,
41934
                            ssl->buffers.serverDH_Priv.length,
41935
                            input + args->idx,
41936
                            (word16)args->sigSz,
41937
                            ssl->arrays->preMasterSecret + OPAQUE16_LEN,
41938
                            &ssl->arrays->preMasterSz,
41939
                            ssl->buffers.serverDH_P.buffer,
41940
                            ssl->buffers.serverDH_P.length);
41941
                        break;
41942
                    }
41943
                #endif /* !NO_DH && !NO_PSK */
41944
                #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
41945
                                     defined(HAVE_CURVE448)) && !defined(NO_PSK)
41946
                    case ecdhe_psk_kea:
41947
                    {
41948
                    #ifdef HAVE_CURVE25519
41949
                        if (ssl->ecdhCurveOID == ECC_X25519_OID) {
41950
                            ret = X25519SharedSecret(ssl,
41951
                                (curve25519_key*)ssl->eccTempKey,
41952
                                ssl->peerX25519Key,
41953
                                input + args->idx, &args->length,
41954
                                ssl->arrays->preMasterSecret + OPAQUE16_LEN,
41955
                                &args->sigSz,
41956
                                WOLFSSL_SERVER_END
41957
                            );
41958
                        #ifdef WOLFSSL_ASYNC_CRYPT
41959
                            if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
41960
                        #endif
41961
                            {
41962
                                FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
41963
                                                   (void**)&ssl->peerX25519Key);
41964
                                ssl->peerX25519KeyPresent = 0;
41965
                            }
41966
                            break;
41967
                        }
41968
                    #endif
41969
                    #ifdef HAVE_CURVE448
41970
                        if (ssl->ecdhCurveOID == ECC_X448_OID) {
41971
                            ret = X448SharedSecret(ssl,
41972
                                (curve448_key*)ssl->eccTempKey,
41973
                                ssl->peerX448Key,
41974
                                input + args->idx, &args->length,
41975
                                ssl->arrays->preMasterSecret + OPAQUE16_LEN,
41976
                                &args->sigSz,
41977
                                WOLFSSL_SERVER_END
41978
                            );
41979
                        #ifdef WOLFSSL_ASYNC_CRYPT
41980
                            if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
41981
                        #endif
41982
                            {
41983
                                FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
41984
                                                     (void**)&ssl->peerX448Key);
41985
                                ssl->peerX448KeyPresent = 0;
41986
                            }
41987
                            break;
41988
                        }
41989
                    #endif
41990
                        /* Generate shared secret */
41991
                        ret = EccSharedSecret(ssl,
41992
                            ssl->eccTempKey, ssl->peerEccKey,
41993
                            input + args->idx, &args->length,
41994
                            ssl->arrays->preMasterSecret + OPAQUE16_LEN,
41995
                            &args->sigSz,
41996
                            WOLFSSL_SERVER_END
41997
                        );
41998
                        if (!ssl->specs.static_ecdh
41999
                    #ifdef WOLFSSL_ASYNC_CRYPT
42000
                            && ret != WC_NO_ERR_TRACE(WC_PENDING_E)
42001
                    #endif
42002
                        ) {
42003
                            FreeKey(ssl, DYNAMIC_TYPE_ECC,
42004
                                                      (void**)&ssl->peerEccKey);
42005
                            ssl->peerEccKeyPresent = 0;
42006
                        }
42007
                        break;
42008
                    }
42009
                #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
42010
0
                    default:
42011
0
                        ret = BAD_KEA_TYPE_E;
42012
0
                } /* switch (ssl->specs.kea) */
42013
42014
                /* Check for error */
42015
0
                if (ret != 0) {
42016
0
                    goto exit_dcke;
42017
0
                }
42018
42019
                /* Advance state and proceed */
42020
0
                ssl->options.asyncState = TLS_ASYNC_VERIFY;
42021
0
            } /* TLS_ASYNC_DO */
42022
0
            FALL_THROUGH;
42023
42024
0
            case TLS_ASYNC_VERIFY:
42025
0
            {
42026
0
                switch (ssl->specs.kea) {
42027
0
                #ifndef NO_RSA
42028
0
                    case rsa_kea:
42029
0
                    {
42030
0
                        byte *tmpRsa;
42031
0
                        byte mask;
42032
42033
                        /* Add the signature length to idx */
42034
0
                        args->idx += args->length;
42035
42036
                    #ifdef DEBUG_WOLFSSL
42037
                        /* check version (debug warning message only) */
42038
                        if (args->output != NULL) {
42039
                            if (args->output[0] != ssl->chVersion.major ||
42040
                                args->output[1] != ssl->chVersion.minor) {
42041
                                WOLFSSL_MSG("preMasterSecret version mismatch");
42042
                            }
42043
                        }
42044
                    #endif
42045
42046
                        /* RFC5246 7.4.7.1:
42047
                         * Treat incorrectly formatted message blocks and/or
42048
                         * mismatched version numbers in a manner
42049
                         * indistinguishable from correctly formatted RSA blocks
42050
                         */
42051
42052
0
                        ret = args->lastErr;
42053
0
                        args->lastErr = 0; /* reset */
42054
                        /* On error 'ret' will be negative */
42055
0
                        mask = (byte)(((unsigned int)ret >> ((sizeof(ret) * 8) - 1)) - 1);
42056
42057
                        /* build PreMasterSecret */
42058
0
                        ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
42059
0
                        ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
42060
42061
0
                        tmpRsa = input + args->idx - VERSION_SZ - SECRET_LEN;
42062
0
                        ctMaskCopy(~mask, (byte*)&args->output, (byte*)&tmpRsa,
42063
0
                            sizeof(args->output));
42064
0
                        if (args->output != NULL) {
42065
0
                            int i;
42066
                            /* Use random secret on error */
42067
0
                            for (i = VERSION_SZ; i < SECRET_LEN; i++) {
42068
0
                                ssl->arrays->preMasterSecret[i] =
42069
0
                                     ctMaskSel(mask, args->output[i],
42070
0
                                               ssl->arrays->preMasterSecret[i]);
42071
0
                            }
42072
0
                        }
42073
                        /* preMasterSecret has RNG and version set
42074
                         * return proper length and ignore error
42075
                         * error will be caught as decryption error
42076
                         */
42077
0
                        args->sigSz = SECRET_LEN;
42078
0
                        ret = 0;
42079
0
                        break;
42080
0
                    } /* rsa_kea */
42081
0
                #endif /* !NO_RSA */
42082
                #ifndef NO_PSK
42083
                    case psk_kea:
42084
                    {
42085
                        break;
42086
                    }
42087
                #endif /* !NO_PSK */
42088
0
                #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
42089
0
                                                          defined(HAVE_CURVE448)
42090
0
                    case ecc_diffie_hellman_kea:
42091
0
                    {
42092
                        /* skip past the imported peer key */
42093
0
                        args->idx += args->length;
42094
0
                        break;
42095
0
                    }
42096
0
                #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
42097
0
                #ifndef NO_DH
42098
0
                    case diffie_hellman_kea:
42099
0
                    {
42100
0
                        args->idx += (word16)args->sigSz;
42101
0
                        break;
42102
0
                    }
42103
0
                #endif /* !NO_DH */
42104
                #if !defined(NO_DH) && !defined(NO_PSK)
42105
                    case dhe_psk_kea:
42106
                    {
42107
                        byte* pms = ssl->arrays->preMasterSecret;
42108
                        word16 clientSz = (word16)args->sigSz;
42109
42110
                        args->idx += clientSz;
42111
                        c16toa((word16)ssl->arrays->preMasterSz, pms);
42112
                        ssl->arrays->preMasterSz += OPAQUE16_LEN;
42113
                        pms += ssl->arrays->preMasterSz;
42114
42115
                        /* Use the PSK hint to look up the PSK and add it to the
42116
                         * preMasterSecret here. */
42117
                        ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
42118
                            ssl->arrays->client_identity, ssl->arrays->psk_key,
42119
                            MAX_PSK_KEY_LEN);
42120
42121
                        if (ssl->arrays->psk_keySz == 0 ||
42122
                            (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
42123
                        (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
42124
                        #if defined(WOLFSSL_EXTRA_ALERTS) || \
42125
                            defined(WOLFSSL_PSK_IDENTITY_ALERT)
42126
                            SendAlert(ssl, alert_fatal,
42127
                                    unknown_psk_identity);
42128
                        #endif
42129
                            ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
42130
                        }
42131
                        /* SERVER: Pre-shared Key for peer authentication. */
42132
                        ssl->options.peerAuthGood = 1;
42133
42134
                        if ((int)ssl->arrays->psk_keySz > 0) {
42135
                            c16toa((word16) ssl->arrays->psk_keySz, pms);
42136
                            pms += OPAQUE16_LEN;
42137
42138
                            XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
42139
                            ssl->arrays->preMasterSz += ssl->arrays->psk_keySz + OPAQUE16_LEN;
42140
                            ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
42141
                        }
42142
                        ssl->arrays->psk_keySz = 0; /* no further need */
42143
                        break;
42144
                    }
42145
                #endif /* !NO_DH && !NO_PSK */
42146
                #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
42147
                                     defined(HAVE_CURVE448)) && !defined(NO_PSK)
42148
                    case ecdhe_psk_kea:
42149
                    {
42150
                        byte* pms = ssl->arrays->preMasterSecret;
42151
                        word16 clientSz = (word16)args->sigSz;
42152
42153
                        /* skip past the imported peer key */
42154
                        args->idx += args->length;
42155
42156
                        /* Add preMasterSecret */
42157
                        c16toa(clientSz, pms);
42158
                        ssl->arrays->preMasterSz = OPAQUE16_LEN + clientSz;
42159
                        pms += ssl->arrays->preMasterSz;
42160
42161
                        /* Use the PSK hint to look up the PSK and add it to the
42162
                         * preMasterSecret here. */
42163
                        ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
42164
                            ssl->arrays->client_identity, ssl->arrays->psk_key,
42165
                            MAX_PSK_KEY_LEN);
42166
42167
                        if (ssl->arrays->psk_keySz == 0 ||
42168
                            (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
42169
                        (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
42170
                            ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
42171
                        }
42172
                        /* SERVER: Pre-shared Key for peer authentication. */
42173
                        ssl->options.peerAuthGood = 1;
42174
                        if ((int)ssl->arrays->psk_keySz > 0) {
42175
                            c16toa((word16) ssl->arrays->psk_keySz, pms);
42176
                            pms += OPAQUE16_LEN;
42177
42178
                            XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
42179
                            ssl->arrays->preMasterSz += ssl->arrays->psk_keySz + OPAQUE16_LEN;
42180
                            ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
42181
                        }
42182
                        ssl->arrays->psk_keySz = 0; /* no further need */
42183
                        break;
42184
                    }
42185
                #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
42186
0
                    default:
42187
0
                        ret = BAD_KEA_TYPE_E;
42188
0
                } /* switch (ssl->specs.kea) */
42189
42190
                /* Check for error */
42191
0
                if (ret != 0) {
42192
0
                    goto exit_dcke;
42193
0
                }
42194
42195
                /* Advance state and proceed */
42196
0
                ssl->options.asyncState = TLS_ASYNC_FINALIZE;
42197
0
            } /* TLS_ASYNC_VERIFY */
42198
0
            FALL_THROUGH;
42199
42200
0
            case TLS_ASYNC_FINALIZE:
42201
0
            {
42202
0
                if (IsEncryptionOn(ssl, 0))
42203
0
                    args->idx += ssl->keys.padSz;
42204
42205
0
                ret = MakeMasterSecret(ssl);
42206
42207
                /* Check for error */
42208
0
                if (ret != 0) {
42209
0
                    goto exit_dcke;
42210
0
                }
42211
42212
                /* Advance state and proceed */
42213
0
                ssl->options.asyncState = TLS_ASYNC_END;
42214
0
            } /* TLS_ASYNC_FINALIZE */
42215
0
            FALL_THROUGH;
42216
42217
0
            case TLS_ASYNC_END:
42218
0
            {
42219
                /* Set final index */
42220
0
                *inOutIdx = args->idx;
42221
42222
0
                ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
42223
0
            #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
42224
0
                if (ssl->options.verifyPeer) {
42225
0
                    ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
42226
0
                }
42227
0
            #endif
42228
0
                break;
42229
0
            } /* TLS_ASYNC_END */
42230
0
            default:
42231
0
                ret = INPUT_CASE_ERROR;
42232
0
        } /* switch(ssl->options.asyncState) */
42233
42234
0
    exit_dcke:
42235
42236
    #ifdef WOLFSSL_BLIND_PRIVATE_KEY
42237
        if (ret == 0) {
42238
            ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.key,
42239
                &ssl->buffers.keyMask);
42240
        }
42241
        else {
42242
            wolfssl_priv_der_unblind(ssl->buffers.key, ssl->buffers.keyMask);
42243
        }
42244
    #endif
42245
42246
0
        WOLFSSL_LEAVE("DoClientKeyExchange", ret);
42247
0
        WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
42248
    #ifdef WOLFSSL_ASYNC_CRYPT
42249
        /* Handle async operation */
42250
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
42251
            /* Mark message as not received so it can process again */
42252
            ssl->msgsReceived.got_client_key_exchange = 0;
42253
42254
            return ret;
42255
        }
42256
        /* Cleanup async */
42257
        FreeAsyncCtx(ssl, 0);
42258
    #else
42259
0
        FreeDckeArgs(ssl, args);
42260
0
    #endif /* WOLFSSL_ASYNC_CRYPT */
42261
    #ifdef OPENSSL_ALL
42262
        /* add error ret value to error queue */
42263
        if (ret != 0) {
42264
            WOLFSSL_ERROR(ret);
42265
        }
42266
    #endif
42267
42268
42269
        /* Cleanup PMS */
42270
0
        if (ssl->arrays->preMasterSecret != NULL) {
42271
0
            ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
42272
0
        }
42273
0
        ssl->arrays->preMasterSz = 0;
42274
42275
        /* Final cleanup */
42276
0
        FreeKeyExchange(ssl);
42277
42278
0
        return ret;
42279
0
    }
42280
42281
#endif /* !WOLFSSL_NO_TLS12 */
42282
42283
#ifdef HAVE_SNI
42284
    int SNI_Callback(WOLFSSL* ssl)
42285
9.12k
    {
42286
9.12k
        int ad = 0;
42287
9.12k
        int sniRet = 0;
42288
9.12k
        int ret = 0;
42289
42290
        /* OpenSSL defaults alert to SSL_AD_UNRECOGNIZED_NAME, use this if
42291
           WOLFSSL_EXTRA_ALERTS is defined, indicating user is OK with
42292
           potential information disclosure from alerts. */
42293
#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_EXTRA_ALERTS)
42294
        ad = WOLFSSL_AD_UNRECOGNIZED_NAME;
42295
#endif
42296
        /* Stunnel supports a custom sni callback to switch an SSL's ctx
42297
        * when SNI is received. Call it now if exists */
42298
9.12k
        if(ssl && ssl->ctx && ssl->ctx->sniRecvCb) {
42299
0
            WOLFSSL_MSG("Calling custom sni callback");
42300
0
            sniRet = ssl->ctx->sniRecvCb(ssl, &ad, ssl->ctx->sniRecvCbArg);
42301
0
            switch (sniRet) {
42302
0
                case warning_return:
42303
0
                    WOLFSSL_MSG("Error in custom sni callback. Warning alert");
42304
0
                    ret = SendAlert(ssl, alert_warning, ad);
42305
0
                    break;
42306
0
                case fatal_return:
42307
0
                    WOLFSSL_MSG("Error in custom sni callback. Fatal alert");
42308
0
                    SendAlert(ssl, alert_fatal, ad);
42309
0
                    return FATAL_ERROR;
42310
0
                case noack_return:
42311
0
                    WOLFSSL_MSG("Server quietly not acking servername.");
42312
0
                    break;
42313
0
                default:
42314
0
                    break;
42315
0
            }
42316
0
        }
42317
9.12k
        return ret;
42318
9.12k
    }
42319
#endif /* HAVE_SNI */
42320
42321
#endif /* !NO_WOLFSSL_SERVER && !NO_TLS */
42322
42323
42324
#ifdef WOLFSSL_ASYNC_CRYPT
42325
int wolfSSL_AsyncPop(WOLFSSL* ssl, byte* state)
42326
{
42327
    int ret = 0;
42328
    WC_ASYNC_DEV* asyncDev;
42329
    WOLF_EVENT* event;
42330
42331
    if (ssl == NULL) {
42332
        return BAD_FUNC_ARG;
42333
    }
42334
42335
    /* check for pending async */
42336
    asyncDev = ssl->asyncDev;
42337
    if (asyncDev) {
42338
        /* grab event pointer */
42339
        event = &asyncDev->event;
42340
42341
        ret = wolfAsync_EventPop(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL);
42342
        if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E) &&
42343
            ret != WC_NO_ERR_TRACE(WC_PENDING_E)) {
42344
            /* advance key share state if doesn't need called again */
42345
            if (state && (asyncDev->event.flags & WC_ASYNC_FLAG_CALL_AGAIN) == 0) {
42346
                (*state)++;
42347
            }
42348
            /* clear event and async device */
42349
            XMEMSET(&asyncDev->event, 0, sizeof(WOLF_EVENT));
42350
            ssl->asyncDev = NULL;
42351
        }
42352
        /* for crypto or PK callback, if pending remove from queue */
42353
    #if (defined(WOLF_CRYPTO_CB) || defined(HAVE_PK_CALLBACKS)) && \
42354
        !defined(WOLFSSL_ASYNC_CRYPT_SW) && !defined(HAVE_INTEL_QA) && \
42355
        !defined(HAVE_CAVIUM)
42356
        else if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
42357
            /* Allow the underlying crypto API to be called again to trigger the
42358
             * crypto or PK callback. The actual callback must be called, since
42359
             * the completion is not detected in the poll like Intel QAT or
42360
             * Nitrox */
42361
            ret = wolfEventQueue_Remove(&ssl->ctx->event_queue, event);
42362
42363
        }
42364
    #endif
42365
    }
42366
    else {
42367
        ret = WC_NO_PENDING_E;
42368
    }
42369
42370
    WOLFSSL_LEAVE("wolfSSL_AsyncPop", ret);
42371
42372
    return ret;
42373
}
42374
42375
int wolfSSL_AsyncInit(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev, word32 flags)
42376
{
42377
    int ret;
42378
    WOLF_EVENT* event;
42379
42380
    if (ssl == NULL || asyncDev == NULL) {
42381
        return BAD_FUNC_ARG;
42382
    }
42383
42384
    /* grab event pointer */
42385
    event = &asyncDev->event;
42386
42387
    /* init event */
42388
    ret = wolfAsync_EventInit(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL, ssl, flags);
42389
42390
    WOLFSSL_LEAVE("wolfSSL_AsyncInit", ret);
42391
42392
    return ret;
42393
}
42394
42395
int wolfSSL_AsyncPush(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev)
42396
{
42397
    int ret;
42398
    WOLF_EVENT* event;
42399
42400
    if (ssl == NULL || asyncDev == NULL) {
42401
        return BAD_FUNC_ARG;
42402
    }
42403
42404
    /* grab event pointer */
42405
    event = &asyncDev->event;
42406
42407
    /* store reference to active async operation */
42408
    ssl->asyncDev = asyncDev;
42409
42410
    /* place event into queue */
42411
    ret = wolfAsync_EventQueuePush(&ssl->ctx->event_queue, event);
42412
42413
    /* success means return WC_PENDING_E */
42414
    if (ret == 0) {
42415
        ret = WC_PENDING_E;
42416
    }
42417
42418
    WOLFSSL_LEAVE("wolfSSL_AsyncPush", ret);
42419
42420
    return ret;
42421
}
42422
42423
#endif /* WOLFSSL_ASYNC_CRYPT */
42424
42425
42426
/**
42427
 * Return the max fragment size. This is essentially the maximum
42428
 * fragment_length available.
42429
 * @param ssl         WOLFSSL object containing ciphersuite information.
42430
 * @param maxFragment The amount of space we want to check is available. This
42431
 *                    is only the fragment length WITHOUT the (D)TLS headers.
42432
 * @return            Max fragment size
42433
 */
42434
int wolfSSL_GetMaxFragSize(WOLFSSL* ssl, int maxFragment)
42435
0
{
42436
0
    (void) ssl; /* Avoid compiler warnings */
42437
42438
0
    if (maxFragment > MAX_RECORD_SIZE) {
42439
0
        maxFragment = MAX_RECORD_SIZE;
42440
0
    }
42441
42442
#ifdef HAVE_MAX_FRAGMENT
42443
    if ((ssl->max_fragment != 0) && ((word16)maxFragment > ssl->max_fragment)) {
42444
        maxFragment = ssl->max_fragment;
42445
    }
42446
#endif /* HAVE_MAX_FRAGMENT */
42447
#ifdef WOLFSSL_DTLS
42448
    if (IsDtlsNotSctpMode(ssl)) {
42449
        int outputSz, mtuSz;
42450
42451
        /* Given a input buffer size of maxFragment, how big will the
42452
         * encrypted output be? */
42453
        if (IsEncryptionOn(ssl, 1)) {
42454
            outputSz = BuildMessage(ssl, NULL, 0, NULL,
42455
                    maxFragment + DTLS_HANDSHAKE_HEADER_SZ,
42456
                    application_data, 0, 1, 0, CUR_ORDER);
42457
        }
42458
        else {
42459
            outputSz = maxFragment + DTLS_RECORD_HEADER_SZ +
42460
                    DTLS_HANDSHAKE_HEADER_SZ;
42461
        }
42462
42463
        /* Readjust maxFragment for MTU size. */
42464
        #if defined(WOLFSSL_DTLS_MTU)
42465
            mtuSz = ssl->dtlsMtuSz;
42466
        #else
42467
            mtuSz = MAX_MTU;
42468
        #endif
42469
        maxFragment = ModifyForMTU(ssl, maxFragment, outputSz, mtuSz);
42470
    }
42471
#endif
42472
42473
0
    return maxFragment;
42474
0
}
42475
42476
#if defined(WOLFSSL_IOTSAFE) && defined(HAVE_PK_CALLBACKS)
42477
42478
IOTSAFE *wolfSSL_get_iotsafe_ctx(WOLFSSL *ssl)
42479
{
42480
    if (ssl == NULL)
42481
        return NULL;
42482
    return &ssl->iotsafe;
42483
42484
}
42485
42486
int wolfSSL_set_iotsafe_ctx(WOLFSSL *ssl, IOTSAFE *iotsafe)
42487
{
42488
    if ((ssl == NULL) || (iotsafe == NULL))
42489
        return BAD_FUNC_ARG;
42490
    XMEMCPY(&ssl->iotsafe, iotsafe, sizeof(IOTSAFE));
42491
    return 0;
42492
}
42493
42494
#endif /* WOLFSSL_IOTSAFE && HAVE_PK_CALLBACKS */
42495
42496
#if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
42497
/* create an instance of WOLFSSL_BY_DIR_HASH structure */
42498
WOLFSSL_BY_DIR_HASH* wolfSSL_BY_DIR_HASH_new(void)
42499
{
42500
    WOLFSSL_BY_DIR_HASH* dir_hash;
42501
42502
    WOLFSSL_ENTER("wolfSSL_BY_DIR_HASH_new");
42503
42504
    dir_hash = (WOLFSSL_BY_DIR_HASH*)XMALLOC(sizeof(WOLFSSL_BY_DIR_HASH), NULL,
42505
        DYNAMIC_TYPE_OPENSSL);
42506
    if (dir_hash) {
42507
        XMEMSET(dir_hash, 0, sizeof(WOLFSSL_BY_DIR_HASH));
42508
    }
42509
    return dir_hash;
42510
}
42511
/* release a WOLFSSL_BY_DIR_HASH resource */
42512
void wolfSSL_BY_DIR_HASH_free(WOLFSSL_BY_DIR_HASH* dir_hash)
42513
{
42514
    if (dir_hash == NULL)
42515
        return;
42516
42517
    XFREE(dir_hash, NULL, DYNAMIC_TYPE_OPENSSL);
42518
}
42519
/* create an instance of WOLFSSL_STACK for STACK_TYPE_BY_DIR_hash */
42520
WOLFSSL_STACK* wolfSSL_sk_BY_DIR_HASH_new_null(void)
42521
{
42522
    WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
42523
42524
    WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_new_null");
42525
42526
    if (sk) {
42527
        sk->type = STACK_TYPE_BY_DIR_hash;
42528
    }
42529
    return sk;
42530
}
42531
42532
/* returns value less than 0 on fail to match
42533
 * On a successful match the priority level found is returned
42534
 */
42535
int wolfSSL_sk_BY_DIR_HASH_find(
42536
   WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk, const WOLFSSL_BY_DIR_HASH* toFind)
42537
{
42538
    WOLFSSL_STACK* next;
42539
    int i, sz;
42540
42541
    WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_find");
42542
42543
    if (sk == NULL || toFind == NULL) {
42544
        return WOLFSSL_FAILURE;
42545
    }
42546
42547
    sz   = wolfSSL_sk_BY_DIR_HASH_num(sk);
42548
    next = sk;
42549
    for (i = 0; i < sz && next != NULL; i++) {
42550
        if (next->data.dir_hash->hash_value == toFind->hash_value) {
42551
            return sz - i; /* reverse because stack pushed highest on first */
42552
        }
42553
        next = next->next;
42554
    }
42555
    return WOLFSSL_FATAL_ERROR;
42556
}
42557
/* return a number of WOLFSSL_BY_DIR_HASH in stack */
42558
int wolfSSL_sk_BY_DIR_HASH_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk)
42559
{
42560
    WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_num");
42561
42562
    if (sk == NULL)
42563
        return WOLFSSL_FATAL_ERROR;
42564
    return (int)sk->num;
42565
}
42566
/* return WOLFSSL_BY_DIR_HASH instance at i */
42567
WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_value(
42568
                        const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk, int i)
42569
{
42570
    WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_value");
42571
42572
    for (; sk != NULL && i > 0; i--)
42573
        sk = sk->next;
42574
42575
    if (i != 0 || sk == NULL)
42576
        return NULL;
42577
    return sk->data.dir_hash;
42578
}
42579
/* pop WOLFSSL_BY_DIR_HASH instance, and remove its node from stack */
42580
WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_pop(
42581
                                WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk)
42582
{
42583
    return (WOLFSSL_BY_DIR_HASH *)wolfSSL_sk_pop(sk);
42584
}
42585
/* release all contents in stack, and then release stack itself. */
42586
/* Second argument is a function pointer to release resources.   */
42587
/* It calls the function to release resources when it is passed  */
42588
/* instead of wolfSSL_BY_DIR_HASH_free().                        */
42589
void wolfSSL_sk_BY_DIR_HASH_pop_free(WOLF_STACK_OF(BY_DIR_HASH)* sk,
42590
    void (*f) (WOLFSSL_BY_DIR_HASH*))
42591
{
42592
    WOLFSSL_STACK* node;
42593
42594
    WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop_free");
42595
42596
    if (sk == NULL) {
42597
        return;
42598
    }
42599
42600
    /* parse through stack freeing each node */
42601
    node = sk->next;
42602
    while (node && sk->num > 1) {
42603
        WOLFSSL_STACK* tmp = node;
42604
        node = node->next;
42605
42606
        if (f)
42607
            f(tmp->data.dir_hash);
42608
        else
42609
            wolfSSL_BY_DIR_HASH_free(tmp->data.dir_hash);
42610
        tmp->data.dir_hash = NULL;
42611
        XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
42612
        sk->num -= 1;
42613
    }
42614
42615
    /* free head of stack */
42616
    if (sk->num == 1) {
42617
        if (f)
42618
            f(sk->data.dir_hash);
42619
        else
42620
            wolfSSL_BY_DIR_HASH_free(sk->data.dir_hash);
42621
        sk->data.dir_hash = NULL;
42622
    }
42623
    XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
42624
}
42625
/* release all contents in stack, and then release stack itself */
42626
void wolfSSL_sk_BY_DIR_HASH_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk)
42627
{
42628
    wolfSSL_sk_BY_DIR_HASH_pop_free(sk, NULL);
42629
}
42630
/* Adds the WOLFSSL_BY_DIR_HASH to the stack "sk". "sk" takes control of "in" and
42631
 * tries to free it when the stack is free'd.
42632
 *
42633
 * return 1 on success 0 on fail
42634
 */
42635
int wolfSSL_sk_BY_DIR_HASH_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk,
42636
                                               WOLFSSL_BY_DIR_HASH* in)
42637
{
42638
    WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_push");
42639
42640
    if (sk == NULL || in == NULL) {
42641
        return WOLFSSL_FAILURE;
42642
    }
42643
42644
    return wolfSSL_sk_push(sk, in);
42645
}
42646
/* create an instance of WOLFSSL_BY_DIR_entry structure */
42647
WOLFSSL_BY_DIR_entry* wolfSSL_BY_DIR_entry_new(void)
42648
{
42649
    WOLFSSL_BY_DIR_entry* entry;
42650
42651
    WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_new");
42652
42653
    entry = (WOLFSSL_BY_DIR_entry*)XMALLOC(sizeof(WOLFSSL_BY_DIR_entry), NULL,
42654
        DYNAMIC_TYPE_OPENSSL);
42655
42656
    if (entry) {
42657
        XMEMSET(entry, 0, sizeof(WOLFSSL_BY_DIR_entry));
42658
    }
42659
    return entry;
42660
}
42661
/* release a WOLFSSL_BY_DIR_entry resource */
42662
void wolfSSL_BY_DIR_entry_free(WOLFSSL_BY_DIR_entry* entry)
42663
{
42664
    WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_free");
42665
42666
    if (entry == NULL)
42667
        return;
42668
42669
    if (entry->hashes) {
42670
        wolfSSL_sk_BY_DIR_HASH_free(entry->hashes);
42671
    }
42672
42673
    XFREE(entry->dir_name, NULL, DYNAMIC_TYPE_OPENSSL);
42674
42675
    XFREE(entry, NULL, DYNAMIC_TYPE_OPENSSL);
42676
}
42677
42678
WOLFSSL_STACK* wolfSSL_sk_BY_DIR_entry_new_null(void)
42679
{
42680
    WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
42681
42682
    WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_new_null");
42683
42684
    if (sk) {
42685
        sk->type = STACK_TYPE_BY_DIR_entry;
42686
    }
42687
    return sk;
42688
}
42689
/* return a number of WOLFSSL_BY_DIR_entry in stack */
42690
int wolfSSL_sk_BY_DIR_entry_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk)
42691
{
42692
    WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_num");
42693
42694
    if (sk == NULL)
42695
        return WOLFSSL_FATAL_ERROR;
42696
    return (int)sk->num;
42697
}
42698
/* return WOLFSSL_BY_DIR_entry instance at i */
42699
WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_value(
42700
                        const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk, int i)
42701
{
42702
    WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_value");
42703
42704
    for (; sk != NULL && i > 0; i--)
42705
        sk = sk->next;
42706
42707
    if (i != 0 || sk == NULL)
42708
        return NULL;
42709
    return sk->data.dir_entry;
42710
}
42711
/* pop WOLFSSL_BY_DIR_entry instance first, and remove its node from stack */
42712
WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_pop(
42713
                                WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk)
42714
{
42715
    return (WOLFSSL_BY_DIR_entry *)wolfSSL_sk_pop(sk);
42716
}
42717
/* release all contents in stack, and then release stack itself. */
42718
/* Second argument is a function pointer to release resources.   */
42719
/* It calls the function to release resources when it is passed  */
42720
/* instead of wolfSSL_BY_DIR_entry_free().                       */
42721
void wolfSSL_sk_BY_DIR_entry_pop_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk,
42722
    void (*f) (WOLFSSL_BY_DIR_entry*))
42723
{
42724
    WOLFSSL_STACK* node;
42725
42726
    WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop_free");
42727
42728
    if (sk == NULL) {
42729
        return;
42730
    }
42731
42732
    /* parse through stack freeing each node */
42733
    node = sk->next;
42734
    while (node && sk->num > 1) {
42735
        WOLFSSL_STACK* tmp = node;
42736
        node = node->next;
42737
42738
        if (f)
42739
            f(tmp->data.dir_entry);
42740
        else
42741
            wolfSSL_BY_DIR_entry_free(tmp->data.dir_entry);
42742
        tmp->data.dir_entry = NULL;
42743
        XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
42744
        sk->num -= 1;
42745
    }
42746
42747
    /* free head of stack */
42748
    if (sk->num == 1) {
42749
        if (f)
42750
            f(sk->data.dir_entry);
42751
        else
42752
            wolfSSL_BY_DIR_entry_free(sk->data.dir_entry);
42753
        sk->data.dir_entry = NULL;
42754
    }
42755
    XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
42756
}
42757
/* release all contents in stack, and then release stack itself */
42758
void wolfSSL_sk_BY_DIR_entry_free(WOLF_STACK_OF(wolfSSL_BY_DIR_entry) *sk)
42759
{
42760
    wolfSSL_sk_BY_DIR_entry_pop_free(sk, NULL);
42761
}
42762
42763
/* Adds the wolfSSL_BY_DIR_entry to the stack "sk". "sk" takes control of "in" and
42764
 * tries to free it when the stack is free'd.
42765
 *
42766
 * return 1 on success 0 on fail
42767
 */
42768
int wolfSSL_sk_BY_DIR_entry_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk,
42769
                                               WOLFSSL_BY_DIR_entry* in)
42770
{
42771
    WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_push");
42772
42773
    if (sk == NULL || in == NULL) {
42774
        return WOLFSSL_FAILURE;
42775
    }
42776
42777
    return wolfSSL_sk_push(sk, in);
42778
}
42779
42780
#endif /* OPENSSL_ALL && !NO_FILESYSTEM && !NO_FILESYSTEM */
42781
42782
#if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS)
42783
42784
/*
42785
 * Converts a DER formatted certificate to a SecCertificateRef
42786
 *
42787
 * @param derCert pointer to the DER formatted certificate
42788
 * @param derLen length of the DER formatted cert, in bytes
42789
 *
42790
 * @return The newly created SecCertificateRef. Must be freed by caller when
42791
 * no longer in use
42792
 */
42793
static SecCertificateRef ConvertToSecCertificateRef(const byte* derCert,
42794
                                                    int derLen)
42795
{
42796
    CFDataRef         derData = NULL;
42797
    SecCertificateRef secCert = NULL;
42798
42799
    WOLFSSL_ENTER("ConvertToSecCertificateRef");
42800
42801
    /* Create a CFDataRef from the DER encoded certificate */
42802
    derData = CFDataCreate(kCFAllocatorDefault, derCert, derLen);
42803
    if (!derData) {
42804
        WOLFSSL_MSG("Error: can't create CFDataRef object for DER cert");
42805
        goto cleanup;
42806
    }
42807
42808
    /* Create a SecCertificateRef from the CFDataRef */
42809
    secCert = SecCertificateCreateWithData(kCFAllocatorDefault, derData);
42810
    if (!secCert) {
42811
        WOLFSSL_MSG("Error: can't create SecCertificateRef from CFDataRef");
42812
        goto cleanup;
42813
    }
42814
42815
cleanup:
42816
    if (derData) {
42817
        CFRelease(derData);
42818
    }
42819
42820
    WOLFSSL_LEAVE("ConvertToSecCertificateRef", !!secCert);
42821
42822
    return secCert;
42823
}
42824
42825
static int DisplaySecTrustError(CFErrorRef error, SecTrustRef trust)
42826
{
42827
    CFStringRef        desc;
42828
    CFStringRef        domain;
42829
    SecTrustResultType trustResult;
42830
    CFDictionaryRef    info;
42831
42832
    /* Description */
42833
    desc = CFErrorCopyDescription(error);
42834
    if (desc) {
42835
        char buffer[256];
42836
        if (CFStringGetCString(desc, buffer, sizeof(buffer),
42837
                               kCFStringEncodingUTF8)) {
42838
            WOLFSSL_MSG_EX("SecTrustEvaluateWithError Error description: %s\n",
42839
                           buffer);
42840
        }
42841
        CFRelease(desc);
42842
    }
42843
42844
    /* Domain */
42845
    domain = CFErrorGetDomain(error);
42846
    if (domain) {
42847
        char domainStr[128];
42848
        if (CFStringGetCString(domain, domainStr, sizeof(domainStr),
42849
                               kCFStringEncodingUTF8)) {
42850
            WOLFSSL_MSG_EX("SecTrustEvaluateWithError Domain: %s\n", domainStr);
42851
        }
42852
    }
42853
42854
    /* Get additional trust result info */
42855
    if (SecTrustGetTrustResult(trust, &trustResult) == errSecSuccess) {
42856
        WOLFSSL_MSG_EX("SecTrustResultType: %d\n", trustResult);
42857
        /* Optional: decode the enum */
42858
        switch (trustResult) {
42859
            case kSecTrustResultInvalid:
42860
                WOLFSSL_MSG("TrustResult: Invalid\n");
42861
                break;
42862
            case kSecTrustResultProceed:
42863
                WOLFSSL_MSG("TrustResult: Proceed\n");
42864
                break;
42865
            case kSecTrustResultDeny:
42866
                WOLFSSL_MSG("TrustResult: Deny\n");
42867
                break;
42868
            case kSecTrustResultUnspecified:
42869
                WOLFSSL_MSG("TrustResult: Unspecified (implicitly trusted)\n");
42870
                break;
42871
            case kSecTrustResultRecoverableTrustFailure:
42872
                WOLFSSL_MSG("TrustResult: Recoverable trust failure\n");
42873
                break;
42874
            case kSecTrustResultFatalTrustFailure:
42875
                WOLFSSL_MSG("TrustResult: Fatal trust failure\n");
42876
                break;
42877
            case kSecTrustResultOtherError:
42878
                WOLFSSL_MSG("TrustResult: Other error\n");
42879
                break;
42880
            default:
42881
                WOLFSSL_MSG("TrustResult: Unknown\n");
42882
                break;
42883
        }
42884
    }
42885
    else {
42886
        WOLFSSL_MSG("SecTrustGetTrustResult failed\n");
42887
    }
42888
42889
    info = CFErrorCopyUserInfo(error);
42890
    if (info) {
42891
        WOLFSSL_MSG("Trust error info dump:\n");
42892
        CFShow(info);
42893
        CFRelease(info);
42894
    }
42895
42896
    return 0;
42897
}
42898
42899
#if defined(WOLFSSL_APPLE_NATIVE_CERT_VALIDATION) && \
42900
    defined (WOLFSSL_TEST_APPLE_NATIVE_CERT_VALIDATION)
42901
static int MaxValidityPeriodErrorOnly(CFErrorRef error)
42902
{
42903
    int multiple = 0;
42904
42905
    CFDictionaryRef userInfo = CFErrorCopyUserInfo(error);
42906
    if (userInfo) {
42907
        /* Get underlying error */
42908
        CFTypeRef underlying  =
42909
            CFDictionaryGetValue(userInfo, kCFErrorUnderlyingErrorKey);
42910
        if (underlying) {
42911
            /* Get underlying error value*/
42912
            CFDictionaryRef underlyingDict =
42913
                CFErrorCopyUserInfo((CFErrorRef)underlying);
42914
            if (underlyingDict) {
42915
                char buffer[512];
42916
                CFStringRef values =
42917
                    CFDictionaryGetValue(underlyingDict,
42918
                        kCFErrorLocalizedDescriptionKey);
42919
                if(CFStringGetCString(values, buffer, sizeof(buffer),
42920
                    kCFStringEncodingUTF8)) {
42921
                    if (XSTRSTR(buffer, "Certificate exceeds maximum "
42922
                            "temporal validity period") &&
42923
                        (!XSTRSTR(buffer, "Certificate exceeds maximum "
42924
                            "temporal validity period,") ||
42925
                        !XSTRSTR(buffer, ", Certificate exceeds maximum "
42926
                            "temporal validity period"))) {
42927
                        WOLFSSL_MSG("Maximum validity period error only");
42928
                    } else {
42929
                        WOLFSSL_MSG("Found other errors");
42930
                        multiple = 1;
42931
                    }
42932
                }
42933
                CFRelease(underlyingDict);
42934
            }
42935
        }
42936
        CFRelease(userInfo);
42937
    }
42938
    return multiple;
42939
}
42940
#endif
42941
/*
42942
 * Validates a chain of certificates using the Apple system trust APIs
42943
 *
42944
 * @param certs pointer to the certificate chain to validate
42945
 * @param totalCerts the number of certificates in certs
42946
 *
42947
 * @return 1 if chain is valid and trusted
42948
 * @return 0 if chain is invalid or untrusted
42949
 *
42950
 * As of MacOS 14.0 we are still able to access system certificates and load
42951
 * them manually into wolfSSL. For other apple devices, apple has removed the
42952
 * ability to obtain certificates from the trust store, so we can't use
42953
 * wolfSSL's built-in certificate validation mechanisms anymore. We instead
42954
 * must call into the Security Framework APIs to authenticate peer certificates
42955
 */
42956
static int DoAppleNativeCertValidation(WOLFSSL*                   ssl,
42957
                                       const WOLFSSL_BUFFER_INFO* certs,
42958
                                       int                        totalCerts)
42959
{
42960
    int               i;
42961
    int               ret;
42962
    OSStatus          status;
42963
    CFMutableArrayRef certArray = NULL;
42964
    SecCertificateRef secCert   = NULL;
42965
    SecTrustRef       trust     = NULL;
42966
    SecPolicyRef      policy    = NULL;
42967
    CFStringRef       hostname  = NULL;
42968
    CFErrorRef        error     = NULL;
42969
42970
    WOLFSSL_ENTER("DoAppleNativeCertValidation");
42971
42972
    certArray = CFArrayCreateMutable(kCFAllocatorDefault, totalCerts,
42973
                                     &kCFTypeArrayCallBacks);
42974
    if (!certArray) {
42975
        WOLFSSL_MSG("Error: can't allocate CFArray for certificates");
42976
        ret = 0;
42977
        goto cleanup;
42978
    }
42979
42980
    for (i = 0; i < totalCerts; i++) {
42981
        secCert =
42982
            ConvertToSecCertificateRef(certs[i].buffer, (int)certs[i].length);
42983
        if (!secCert) {
42984
            WOLFSSL_MSG("Error: can't convert DER cert to SecCertificateRef");
42985
            ret = 0;
42986
            goto cleanup;
42987
        }
42988
        else {
42989
            CFArrayAppendValue(certArray, secCert);
42990
            /* Release, since the array now holds the reference */
42991
            CFRelease(secCert);
42992
        }
42993
    }
42994
42995
    /* Create trust object for SecCertifiate Ref */
42996
    if (ssl->buffers.domainName.buffer && ssl->buffers.domainName.length > 0) {
42997
        /* Create policy with specified value to require host name match */
42998
        hostname = CFStringCreateWithCString(
42999
            kCFAllocatorDefault, (const char*)ssl->buffers.domainName.buffer,
43000
            kCFStringEncodingUTF8);
43001
    }
43002
    if (hostname != NULL) {
43003
        policy = SecPolicyCreateSSL(true, hostname);
43004
    }
43005
    else {
43006
        policy = SecPolicyCreateSSL(true, NULL);
43007
    }
43008
    status = SecTrustCreateWithCertificates(certArray, policy, &trust);
43009
    if (status != errSecSuccess) {
43010
        WOLFSSL_MSG_EX("Error creating trust object, "
43011
                       "SecTrustCreateWithCertificates returned %d",
43012
                       status);
43013
        ret = 0;
43014
        goto cleanup;
43015
    }
43016
43017
#if defined(WOLFSSL_TEST_APPLE_NATIVE_CERT_VALIDATION)
43018
    /* TEST ONLY CODE:
43019
     * Set accumulated list of trusted CA certificates as trust anchors */
43020
    WOLFSSL_MSG("Setting anchor certificates");
43021
    if (ssl->ctx->testTrustedCAs != NULL) {
43022
        status = SecTrustSetAnchorCertificates(trust, ssl->ctx->testTrustedCAs);
43023
        if (status != errSecSuccess) {
43024
            WOLFSSL_MSG_EX("Error setting anchor certificates: %d", status);
43025
            ret = 0;
43026
            goto cleanup;
43027
        }
43028
    }
43029
#endif
43030
43031
    /* Evaluate the certificate's authenticity */
43032
    WOLFSSL_MSG("Performing Apple native cert validation via "
43033
                "SecTrustEvaluateWithError");
43034
    ret              = SecTrustEvaluateWithError(trust, &error);
43035
    if (ret != 1) {
43036
        if (error) {
43037
            CFIndex code;
43038
            code = CFErrorGetCode(error);
43039
            WOLFSSL_MSG_EX("SecTrustEvaluateWithError failed with code: %ld\n",
43040
                           code);
43041
            DisplaySecTrustError(error, trust);
43042
43043
#ifdef WOLFSSL_TEST_APPLE_NATIVE_CERT_VALIDATION
43044
            /* TEST ONLY CODE:
43045
             * wolfSSL API tests use a cert with a validity period that is too
43046
             * long for the Apple system trust APIs
43047
             * (See: https://support.apple.com/en-us/103769)
43048
             * therefore we should skip over this particular error */
43049
            if (code == errSecCertificateValidityPeriodTooLong) {
43050
                if (MaxValidityPeriodErrorOnly(error)) {
43051
                    WOLFSSL_MSG("Multiple reasons for validity period error, "
43052
                                "not skipping");
43053
                    ret = 0;
43054
                } else {
43055
                    WOLFSSL_MSG("Skipping certificate validity period error");
43056
                    ret = 1;
43057
                }
43058
            }
43059
#endif
43060
            (void)code;
43061
            CFRelease(error);
43062
        }
43063
        else {
43064
            WOLFSSL_MSG(
43065
                "SecTrustEvaluateWithError failed with unknown error.\n");
43066
        }
43067
    }
43068
    else {
43069
        WOLFSSL_MSG("SecTrustEvaluateWithError succeeded");
43070
    }
43071
43072
    /* Cleanup */
43073
cleanup:
43074
    if (certArray) {
43075
        CFRelease(certArray);
43076
    }
43077
    if (trust) {
43078
        CFRelease(trust);
43079
    }
43080
    if (policy) {
43081
        CFRelease(policy);
43082
    }
43083
    if (hostname) {
43084
        CFRelease(hostname);
43085
    }
43086
43087
    WOLFSSL_LEAVE("DoAppleNativeCertValidation", ret);
43088
43089
    return ret;
43090
}
43091
43092
#if defined(WOLFSSL_TEST_APPLE_NATIVE_CERT_VALIDATION)
43093
int wolfSSL_TestAppleNativeCertValidation_AppendCA(WOLFSSL_CTX* ctx,
43094
                                                   const byte*  derCert,
43095
                                                   int          derLen)
43096
{
43097
    SecCertificateRef certRef;
43098
43099
    if (derCert == NULL || derLen == 0) {
43100
        return WOLFSSL_FAILURE;
43101
    }
43102
43103
    /* Create the base array for trust anchors if it doesn't exist */
43104
    if (ctx->testTrustedCAs == NULL) {
43105
        ctx->testTrustedCAs =
43106
            CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
43107
        if (!ctx->testTrustedCAs) {
43108
            return WOLFSSL_FAILURE;
43109
        }
43110
    }
43111
43112
    certRef = ConvertToSecCertificateRef(derCert, derLen);
43113
    if (!certRef) {
43114
        return false;
43115
    }
43116
43117
    CFArrayAppendValue(ctx->testTrustedCAs, certRef);
43118
    CFRelease(certRef);
43119
    return WOLFSSL_SUCCESS;
43120
}
43121
#endif /* WOLFSSL_TEST_APPLE_NATIVE_CERT_VALIDATION */
43122
43123
#endif /* defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) */
43124
43125
#undef ERROR_OUT
43126
43127
#endif /* !WOLFCRYPT_ONLY */