Coverage Report

Created: 2026-10-13 06:23

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/nss/lib/ssl/tls13con.c
Line
Count
Source
1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
/*
3
 * TLS 1.3 Protocol
4
 *
5
 * This Source Code Form is subject to the terms of the Mozilla Public
6
 * License, v. 2.0. If a copy of the MPL was not distributed with this
7
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
8
9
#include "sslt.h"
10
#include "stdarg.h"
11
#include "cert.h"
12
#include "ssl.h"
13
#include "keyhi.h"
14
#include "pk11func.h"
15
#include "prerr.h"
16
#include "secitem.h"
17
#include "secmod.h"
18
#include "sslimpl.h"
19
#include "sslproto.h"
20
#include "sslerr.h"
21
#include "ssl3exthandle.h"
22
#include "tls13hkdf.h"
23
#include "tls13con.h"
24
#include "tls13err.h"
25
#include "tls13ech.h"
26
#include "tls13exthandle.h"
27
#include "tls13hashstate.h"
28
#include "tls13subcerts.h"
29
#include "tls13psk.h"
30
31
static SECStatus tls13_SetCipherSpec(sslSocket *ss, PRUint16 epoch,
32
                                     SSLSecretDirection install,
33
                                     PRBool deleteSecret);
34
static SECStatus tls13_SendServerHelloSequence(sslSocket *ss);
35
static SECStatus tls13_SendEncryptedExtensions(sslSocket *ss);
36
static void tls13_SetKeyExchangeType(sslSocket *ss, const sslNamedGroupDef *group);
37
static SECStatus tls13_HandleClientKeyShare(sslSocket *ss,
38
                                            TLS13KeyShareEntry *peerShare);
39
static SECStatus tls13_SendHelloRetryRequest(
40
    sslSocket *ss, const sslNamedGroupDef *selectedGroup,
41
    const PRUint8 *token, unsigned int tokenLen);
42
43
static SECStatus tls13_HandleServerKeyShare(sslSocket *ss);
44
static SECStatus tls13_HandleEncryptedExtensions(sslSocket *ss, PRUint8 *b,
45
                                                 PRUint32 length);
46
static SECStatus tls13_SendCertificate(sslSocket *ss);
47
static SECStatus tls13_HandleCertificateDecode(
48
    sslSocket *ss, PRUint8 *b, PRUint32 length);
49
static SECStatus tls13_HandleCertificate(
50
    sslSocket *ss, PRUint8 *b, PRUint32 length, PRBool alreadyHashed);
51
static SECStatus tls13_ReinjectHandshakeTranscript(sslSocket *ss);
52
static SECStatus tls13_SendCertificateRequest(sslSocket *ss);
53
static SECStatus tls13_HandleCertificateRequest(sslSocket *ss, PRUint8 *b,
54
                                                PRUint32 length);
55
static SECStatus
56
tls13_SendCertificateVerify(sslSocket *ss, SECKEYPrivateKey *privKey);
57
static SECStatus tls13_HandleCertificateVerify(
58
    sslSocket *ss, PRUint8 *b, PRUint32 length);
59
static SECStatus tls13_RecoverWrappedSharedSecret(sslSocket *ss,
60
                                                  sslSessionID *sid);
61
static SECStatus
62
tls13_DeriveSecretWrap(sslSocket *ss, PK11SymKey *key,
63
                       const char *prefix,
64
                       const char *suffix,
65
                       const char *keylogLabel,
66
                       PK11SymKey **dest);
67
SECStatus
68
tls13_DeriveSecret(sslSocket *ss, PK11SymKey *key,
69
                   const char *label,
70
                   unsigned int labelLen,
71
                   const SSL3Hashes *hashes,
72
                   PK11SymKey **dest,
73
                   SSLHashType hash);
74
static SECStatus tls13_SendEndOfEarlyData(sslSocket *ss);
75
static SECStatus tls13_HandleEndOfEarlyData(sslSocket *ss, const PRUint8 *b,
76
                                            PRUint32 length);
77
static SECStatus tls13_MaybeHandleSuppressedEndOfEarlyData(sslSocket *ss);
78
static SECStatus tls13_SendFinished(sslSocket *ss, PK11SymKey *baseKey);
79
static SECStatus tls13_ComputePskBinderHash(sslSocket *ss, PRUint8 *b, size_t length,
80
                                            SSL3Hashes *hashes, SSLHashType type);
81
static SECStatus tls13_VerifyFinished(sslSocket *ss, SSLHandshakeType message,
82
                                      PK11SymKey *secret,
83
                                      PRUint8 *b, PRUint32 length,
84
                                      const SSL3Hashes *hashes);
85
static SECStatus tls13_ClientHandleFinished(sslSocket *ss,
86
                                            PRUint8 *b, PRUint32 length);
87
static SECStatus tls13_ServerHandleFinished(sslSocket *ss,
88
                                            PRUint8 *b, PRUint32 length);
89
static SECStatus tls13_SendNewSessionTicket(sslSocket *ss,
90
                                            const PRUint8 *appToken,
91
                                            unsigned int appTokenLen);
92
static SECStatus tls13_HandleNewSessionTicket(sslSocket *ss, PRUint8 *b,
93
                                              PRUint32 length);
94
static SECStatus tls13_ComputeEarlySecretsWithPsk(sslSocket *ss);
95
static SECStatus tls13_ComputeHandshakeSecrets(sslSocket *ss);
96
static SECStatus tls13_ComputeApplicationSecrets(sslSocket *ss);
97
static SECStatus tls13_ComputeFinalSecrets(sslSocket *ss);
98
static SECStatus tls13_ComputeFinished(
99
    sslSocket *ss, PK11SymKey *baseKey, SSLHashType hashType,
100
    const SSL3Hashes *hashes, PRBool sending, PRUint8 *output,
101
    unsigned int *outputLen, unsigned int maxOutputLen);
102
static SECStatus tls13_SendClientSecondRound(sslSocket *ss);
103
static SECStatus tls13_SendClientSecondFlight(sslSocket *ss);
104
static SECStatus tls13_FinishHandshake(sslSocket *ss);
105
106
const char kHkdfLabelClient[] = "c";
107
const char kHkdfLabelServer[] = "s";
108
const char kHkdfLabelDerivedSecret[] = "derived";
109
const char kHkdfLabelResPskBinderKey[] = "res binder";
110
const char kHkdfLabelExtPskBinderKey[] = "ext binder";
111
const char kHkdfLabelEarlyTrafficSecret[] = "e traffic";
112
const char kHkdfLabelEarlyExporterSecret[] = "e exp master";
113
const char kHkdfLabelHandshakeTrafficSecret[] = "hs traffic";
114
const char kHkdfLabelApplicationTrafficSecret[] = "ap traffic";
115
const char kHkdfLabelFinishedSecret[] = "finished";
116
const char kHkdfLabelResumptionMasterSecret[] = "res master";
117
const char kHkdfLabelExporterMasterSecret[] = "exp master";
118
const char kHkdfLabelResumption[] = "resumption";
119
const char kHkdfLabelTrafficUpdate[] = "traffic upd";
120
const char kHkdfPurposeKey[] = "key";
121
const char kHkdfPurposeSn[] = "sn";
122
const char kHkdfPurposeIv[] = "iv";
123
124
const char keylogLabelClientEarlyTrafficSecret[] = "CLIENT_EARLY_TRAFFIC_SECRET";
125
const char keylogLabelClientHsTrafficSecret[] = "CLIENT_HANDSHAKE_TRAFFIC_SECRET";
126
const char keylogLabelServerHsTrafficSecret[] = "SERVER_HANDSHAKE_TRAFFIC_SECRET";
127
const char keylogLabelClientTrafficSecret[] = "CLIENT_TRAFFIC_SECRET_0";
128
const char keylogLabelServerTrafficSecret[] = "SERVER_TRAFFIC_SECRET_0";
129
const char keylogLabelEarlyExporterSecret[] = "EARLY_EXPORTER_SECRET";
130
const char keylogLabelExporterSecret[] = "EXPORTER_SECRET";
131
132
/* Belt and suspenders in case we ever add a TLS 1.4. */
133
PR_STATIC_ASSERT(SSL_LIBRARY_VERSION_MAX_SUPPORTED <=
134
                 SSL_LIBRARY_VERSION_TLS_1_3);
135
136
void
137
tls13_FatalError(sslSocket *ss, PRErrorCode prError, SSL3AlertDescription desc)
138
3.39k
{
139
3.39k
    PORT_Assert(desc != internal_error); /* These should never happen */
140
3.39k
    (void)SSL3_SendAlert(ss, alert_fatal, desc);
141
3.39k
    PORT_SetError(prError);
142
3.39k
}
143
144
#ifdef TRACE
145
#define STATE_CASE(a) \
146
5.57k
    case a:           \
147
5.57k
        return #a
148
static char *
149
tls13_HandshakeState(SSL3WaitState st)
150
5.57k
{
151
5.57k
    switch (st) {
152
548
        STATE_CASE(idle_handshake);
153
0
        STATE_CASE(wait_client_hello);
154
0
        STATE_CASE(wait_end_of_early_data);
155
1.26k
        STATE_CASE(wait_client_cert);
156
0
        STATE_CASE(wait_client_key);
157
0
        STATE_CASE(wait_cert_verify);
158
0
        STATE_CASE(wait_change_cipher);
159
1.46k
        STATE_CASE(wait_finished);
160
0
        STATE_CASE(wait_server_hello);
161
0
        STATE_CASE(wait_certificate_status);
162
0
        STATE_CASE(wait_server_cert);
163
0
        STATE_CASE(wait_server_key);
164
0
        STATE_CASE(wait_cert_request);
165
0
        STATE_CASE(wait_hello_done);
166
0
        STATE_CASE(wait_new_session_ticket);
167
2.29k
        STATE_CASE(wait_encrypted_extensions);
168
0
        default:
169
0
            break;
170
5.57k
    }
171
0
    PORT_Assert(0);
172
0
    return "unknown";
173
5.57k
}
174
#endif
175
176
149k
#define TLS13_WAIT_STATE_MASK 0x80
177
178
#define TLS13_BASE_WAIT_STATE(ws) (ws & ~TLS13_WAIT_STATE_MASK)
179
/* We don't mask idle_handshake because other parts of the code use it*/
180
144k
#define TLS13_WAIT_STATE(ws) (((ws == idle_handshake) || (ws == wait_server_hello)) ? ws : ws | TLS13_WAIT_STATE_MASK)
181
#define TLS13_CHECK_HS_STATE(ss, err, ...)                          \
182
137k
    tls13_CheckHsState(ss, err, #err, __func__, __FILE__, __LINE__, \
183
137k
                       __VA_ARGS__,                                 \
184
137k
                       wait_invalid)
185
void
186
tls13_SetHsState(sslSocket *ss, SSL3WaitState ws,
187
                 const char *func, const char *file, int line)
188
5.57k
{
189
5.57k
#ifdef TRACE
190
5.57k
    const char *new_state_name =
191
5.57k
        tls13_HandshakeState(ws);
192
193
5.57k
    SSL_TRC(3, ("%d: TLS13[%d]: %s state change from %s->%s in %s (%s:%d)",
194
5.57k
                SSL_GETPID(), ss->fd, SSL_ROLE(ss),
195
5.57k
                tls13_HandshakeState(TLS13_BASE_WAIT_STATE(ss->ssl3.hs.ws)),
196
5.57k
                new_state_name,
197
5.57k
                func, file, line));
198
5.57k
#endif
199
200
5.57k
    ss->ssl3.hs.ws = TLS13_WAIT_STATE(ws);
201
5.57k
}
202
203
static PRBool
204
tls13_InHsStateV(sslSocket *ss, va_list ap)
205
138k
{
206
138k
    SSL3WaitState ws;
207
208
138k
    while ((ws = va_arg(ap, SSL3WaitState)) != wait_invalid) {
209
138k
        if (TLS13_WAIT_STATE(ws) == ss->ssl3.hs.ws) {
210
138k
            return PR_TRUE;
211
138k
        }
212
138k
    }
213
321
    return PR_FALSE;
214
138k
}
215
216
PRBool
217
tls13_InHsState(sslSocket *ss, ...)
218
873
{
219
873
    PRBool found;
220
873
    va_list ap;
221
222
873
    va_start(ap, ss);
223
873
    found = tls13_InHsStateV(ss, ap);
224
873
    va_end(ap);
225
226
873
    return found;
227
873
}
228
229
static SECStatus
230
tls13_CheckHsState(sslSocket *ss, int err, const char *error_name,
231
                   const char *func, const char *file, int line,
232
                   ...)
233
137k
{
234
137k
    va_list ap;
235
137k
    va_start(ap, line);
236
137k
    if (tls13_InHsStateV(ss, ap)) {
237
137k
        va_end(ap);
238
137k
        return SECSuccess;
239
137k
    }
240
137k
    va_end(ap);
241
242
91
    SSL_TRC(3, ("%d: TLS13[%d]: error %s state is (%s) at %s (%s:%d)",
243
91
                SSL_GETPID(), ss->fd,
244
91
                error_name,
245
91
                tls13_HandshakeState(TLS13_BASE_WAIT_STATE(ss->ssl3.hs.ws)),
246
91
                func, file, line));
247
91
    tls13_FatalError(ss, err, unexpected_message);
248
91
    return SECFailure;
249
137k
}
250
251
PRBool
252
tls13_IsPostHandshake(const sslSocket *ss)
253
464k
{
254
464k
    return ss->version >= SSL_LIBRARY_VERSION_TLS_1_3 && ss->firstHsDone;
255
464k
}
256
257
SSLHashType
258
tls13_GetHashForCipherSuite(ssl3CipherSuite suite)
259
17
{
260
17
    const ssl3CipherSuiteDef *cipherDef =
261
17
        ssl_LookupCipherSuiteDef(suite);
262
17
    PORT_Assert(cipherDef);
263
17
    if (!cipherDef) {
264
0
        return ssl_hash_none;
265
0
    }
266
17
    return cipherDef->prf_hash;
267
17
}
268
269
SSLHashType
270
tls13_GetHash(const sslSocket *ss)
271
793k
{
272
    /* suite_def may not be set yet when doing EPSK 0-Rtt. */
273
793k
    if (!ss->ssl3.hs.suite_def) {
274
0
        if (ss->xtnData.selectedPsk) {
275
0
            return ss->xtnData.selectedPsk->hash;
276
0
        }
277
        /* This should never happen. */
278
0
        PORT_Assert(0);
279
0
        return ssl_hash_none;
280
0
    }
281
282
    /* All TLS 1.3 cipher suites must have an explict PRF hash. */
283
793k
    PORT_Assert(ss->ssl3.hs.suite_def->prf_hash != ssl_hash_none);
284
793k
    return ss->ssl3.hs.suite_def->prf_hash;
285
793k
}
286
287
SECStatus
288
tls13_GetHashAndCipher(PRUint16 version, PRUint16 cipherSuite,
289
                       SSLHashType *hash, const ssl3BulkCipherDef **cipher)
290
5.20k
{
291
5.20k
    if (version < SSL_LIBRARY_VERSION_TLS_1_3) {
292
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
293
0
        return SECFailure;
294
0
    }
295
296
    // Lookup and check the suite.
297
5.20k
    SSLVersionRange vrange = { version, version };
298
5.20k
    if (!ssl3_CipherSuiteAllowedForVersionRange(cipherSuite, &vrange)) {
299
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
300
0
        return SECFailure;
301
0
    }
302
5.20k
    const ssl3CipherSuiteDef *suiteDef = ssl_LookupCipherSuiteDef(cipherSuite);
303
5.20k
    const ssl3BulkCipherDef *cipherDef = ssl_GetBulkCipherDef(suiteDef);
304
5.20k
    if (cipherDef->type != type_aead) {
305
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
306
0
        return SECFailure;
307
0
    }
308
5.20k
    *hash = suiteDef->prf_hash;
309
5.20k
    if (cipher != NULL) {
310
5.20k
        *cipher = cipherDef;
311
5.20k
    }
312
5.20k
    return SECSuccess;
313
5.20k
}
314
315
unsigned int
316
tls13_GetHashSizeForHash(SSLHashType hash)
317
272k
{
318
272k
    switch (hash) {
319
96.4k
        case ssl_hash_sha256:
320
96.4k
            return 32;
321
176k
        case ssl_hash_sha384:
322
176k
            return 48;
323
0
        default:
324
0
            PORT_Assert(0);
325
272k
    }
326
0
    return 32;
327
272k
}
328
329
unsigned int
330
tls13_GetHashSize(const sslSocket *ss)
331
165k
{
332
165k
    return tls13_GetHashSizeForHash(tls13_GetHash(ss));
333
165k
}
334
335
static CK_MECHANISM_TYPE
336
tls13_GetHmacMechanismFromHash(SSLHashType hashType)
337
159k
{
338
159k
    switch (hashType) {
339
32.8k
        case ssl_hash_sha256:
340
32.8k
            return CKM_SHA256_HMAC;
341
126k
        case ssl_hash_sha384:
342
126k
            return CKM_SHA384_HMAC;
343
0
        default:
344
0
            PORT_Assert(0);
345
159k
    }
346
0
    return CKM_SHA256_HMAC;
347
159k
}
348
349
static CK_MECHANISM_TYPE
350
tls13_GetHmacMechanism(const sslSocket *ss)
351
136k
{
352
136k
    return tls13_GetHmacMechanismFromHash(tls13_GetHash(ss));
353
136k
}
354
355
SECStatus
356
tls13_ComputeHash(sslSocket *ss, SSL3Hashes *hashes,
357
                  const PRUint8 *buf, unsigned int len,
358
                  SSLHashType hash)
359
20.9k
{
360
20.9k
    SECStatus rv;
361
362
20.9k
    rv = PK11_HashBuf(ssl3_HashTypeToOID(hash), hashes->u.raw, buf, len);
363
20.9k
    if (rv != SECSuccess) {
364
0
        FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
365
0
        return SECFailure;
366
0
    }
367
20.9k
    hashes->len = tls13_GetHashSizeForHash(hash);
368
369
20.9k
    return SECSuccess;
370
20.9k
}
371
372
static SECStatus
373
tls13_CreateKEMKeyPair(sslSocket *ss, const sslNamedGroupDef *groupDef,
374
                       sslKeyPair **outKeyPair)
375
13.5k
{
376
13.5k
    PORT_Assert(groupDef);
377
378
13.5k
    sslKeyPair *keyPair = NULL;
379
13.5k
    SECKEYPrivateKey *privKey = NULL;
380
13.5k
    SECKEYPublicKey *pubKey = NULL;
381
13.5k
    CK_MECHANISM_TYPE mechanism;
382
13.5k
    CK_NSS_KEM_PARAMETER_SET_TYPE paramSet;
383
384
13.5k
    switch (groupDef->name) {
385
13.4k
        case ssl_grp_kem_mlkem768x25519:
386
13.4k
        case ssl_grp_kem_secp256r1mlkem768:
387
13.4k
            mechanism = CKM_ML_KEM_KEY_PAIR_GEN;
388
13.4k
            paramSet = CKP_ML_KEM_768;
389
13.4k
            break;
390
44
        case ssl_grp_kem_secp384r1mlkem1024:
391
44
        case ssl_grp_kem_mlkem1024:
392
44
            mechanism = CKM_ML_KEM_KEY_PAIR_GEN;
393
44
            paramSet = CKP_ML_KEM_1024;
394
44
            break;
395
0
        default:
396
0
            PORT_Assert(0);
397
0
            PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
398
0
            return SECFailure;
399
13.5k
    }
400
401
13.5k
    PK11SlotInfo *slot = PK11_GetBestSlot(mechanism, ss->pkcs11PinArg);
402
13.5k
    if (!slot) {
403
0
        goto loser;
404
0
    }
405
406
    /* avoid pairwise check in non-FIPS mode */
407
    /* the only difference between CKM_ML_KEM_KEY_PAIR_GEN and
408
     * CKM_NSS_ML_KEM_KEY_PAIR_GEN is the latter skips the pairwise consistency
409
     * check and is only supported by softoken */
410
13.5k
    if ((mechanism == CKM_ML_KEM_KEY_PAIR_GEN) && !PK11_IsFIPS() &&
411
13.5k
        PK11_DoesMechanism(slot, CKM_NSS_ML_KEM_KEY_PAIR_GEN)) {
412
13.5k
        mechanism = CKM_NSS_ML_KEM_KEY_PAIR_GEN;
413
13.5k
    }
414
415
13.5k
    privKey = PK11_GenerateKeyPairWithOpFlags(slot, mechanism,
416
13.5k
                                              &paramSet, &pubKey,
417
13.5k
                                              PK11_ATTR_SESSION | PK11_ATTR_INSENSITIVE | PK11_ATTR_PUBLIC,
418
13.5k
                                              CKF_ENCAPSULATE | CKF_DECAPSULATE,
419
13.5k
                                              CKF_ENCAPSULATE | CKF_DECAPSULATE,
420
13.5k
                                              ss->pkcs11PinArg);
421
422
13.5k
    if (!privKey) {
423
0
        privKey = PK11_GenerateKeyPairWithOpFlags(slot, mechanism,
424
0
                                                  &paramSet, &pubKey,
425
0
                                                  PK11_ATTR_SESSION | PK11_ATTR_SENSITIVE | PK11_ATTR_PRIVATE,
426
0
                                                  CKF_ENCAPSULATE | CKF_DECAPSULATE,
427
0
                                                  CKF_ENCAPSULATE | CKF_DECAPSULATE,
428
0
                                                  ss->pkcs11PinArg);
429
0
    }
430
431
13.5k
    PK11_FreeSlot(slot);
432
13.5k
    if (!privKey || !pubKey) {
433
0
        goto loser;
434
0
    }
435
436
13.5k
    keyPair = ssl_NewKeyPair(privKey, pubKey);
437
13.5k
    if (!keyPair) {
438
0
        goto loser;
439
0
    }
440
441
13.5k
    SSL_TRC(50, ("%d: SSL[%d]: Create Kyber ephemeral key %d",
442
13.5k
                 SSL_GETPID(), ss ? ss->fd : NULL, groupDef->name));
443
13.5k
    PRINT_BUF(50, (ss, "Public Key", pubKey->u.kyber.publicValue.data,
444
13.5k
                   pubKey->u.kyber.publicValue.len));
445
13.5k
#ifdef TRACE
446
13.5k
    if (ssl_trace >= 50) {
447
0
        SECItem d = { siBuffer, NULL, 0 };
448
0
        SECStatus rv = PK11_ReadRawAttribute(PK11_TypePrivKey, privKey, CKA_VALUE, &d);
449
0
        if (rv == SECSuccess) {
450
0
            PRINT_BUF(50, (ss, "Private Key", d.data, d.len));
451
0
            SECITEM_FreeItem(&d, PR_FALSE);
452
0
        } else {
453
0
            SSL_TRC(50, ("Error extracting private key"));
454
0
        }
455
0
    }
456
13.5k
#endif
457
458
13.5k
    *outKeyPair = keyPair;
459
13.5k
    return SECSuccess;
460
461
0
loser:
462
0
    SECKEY_DestroyPrivateKey(privKey);
463
0
    SECKEY_DestroyPublicKey(pubKey);
464
0
    ssl_MapLowLevelError(SEC_ERROR_KEYGEN_FAIL);
465
0
    return SECFailure;
466
13.5k
}
467
468
/* only copy the ECDH component of an ephemeral KeyPair */
469
sslEphemeralKeyPair *
470
tls13_CopyECDHKeyFromHybrid(sslEphemeralKeyPair *copyKeyPair,
471
                            const sslNamedGroupDef *groupDef)
472
0
{
473
    /* We could use ssl_CopyEphemeralKeyPair here, but we would need to free
474
     * the KEM components. So we only copy the ECDH keys */
475
0
    sslEphemeralKeyPair *keyPair = PORT_ZNew(sslEphemeralKeyPair);
476
0
    if (!keyPair) {
477
0
        return NULL;
478
0
    }
479
0
    PR_INIT_CLIST(&keyPair->link);
480
0
    keyPair->group = groupDef;
481
0
    keyPair->keys = ssl_GetKeyPairRef(copyKeyPair->keys);
482
0
    return keyPair;
483
0
}
484
485
/*
486
 * find a hybrid key Pair they might contain the same ecdh key so we
487
 * can reuse them. Each ec group can map to more than one hybrid Pair
488
 */
489
sslEphemeralKeyPair *
490
tls13_FindHybridKeyPair(sslSocket *ss, const sslNamedGroupDef *groupDef)
491
2.41k
{
492
2.41k
    sslEphemeralKeyPair *hybridPair = NULL;
493
2.41k
    switch (groupDef->name) {
494
818
        case ssl_grp_ec_secp256r1:
495
            /* future, this may be a loop to check multiple named groups */
496
818
            hybridPair = ssl_LookupEphemeralKeyPair(ss,
497
818
                                                    ssl_LookupNamedGroup(ssl_grp_kem_secp256r1mlkem768));
498
818
            break;
499
578
        case ssl_grp_ec_secp384r1:
500
578
            hybridPair = ssl_LookupEphemeralKeyPair(ss,
501
578
                                                    ssl_LookupNamedGroup(ssl_grp_kem_secp384r1mlkem1024));
502
578
            break;
503
939
        case ssl_grp_ec_curve25519: {
504
            /* a loop to check multiple named groups */
505
939
            SSLNamedGroup gnames[] = { ssl_grp_kem_mlkem768x25519 };
506
1.87k
            for (int i = 0; i < PR_ARRAY_SIZE(gnames); i++) {
507
939
                hybridPair = ssl_LookupEphemeralKeyPair(ss,
508
939
                                                        ssl_LookupNamedGroup(gnames[i]));
509
939
                if (hybridPair != NULL) {
510
0
                    break;
511
0
                }
512
939
            }
513
939
            break;
514
0
        }
515
83
        default:
516
83
            PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
517
83
            return NULL;
518
2.41k
    }
519
2.33k
    return hybridPair;
520
2.41k
}
521
522
SECStatus
523
tls13_CreateKeyShare(sslSocket *ss, const sslNamedGroupDef *groupDef,
524
                     sslEphemeralKeyPair **outKeyPair)
525
19.2k
{
526
19.2k
    SECStatus rv;
527
19.2k
    const ssl3DHParams *params;
528
19.2k
    sslEphemeralKeyPair *keyPair = NULL;
529
19.2k
    const sslNamedGroupDef *ecGroup = NULL;
530
531
19.2k
    PORT_Assert(groupDef);
532
19.2k
    switch (groupDef->keaType) {
533
14.2k
        case ssl_kea_ecdh_hybrid:
534
14.2k
            switch (groupDef->name) {
535
187
                case ssl_grp_kem_secp256r1mlkem768:
536
187
                    ecGroup = ssl_LookupNamedGroup(ssl_grp_ec_secp256r1);
537
187
                    break;
538
417
                case ssl_grp_kem_secp384r1mlkem1024:
539
417
                    ecGroup = ssl_LookupNamedGroup(ssl_grp_ec_secp384r1);
540
417
                    break;
541
13.6k
                case ssl_grp_kem_mlkem768x25519:
542
13.6k
                    ecGroup = ssl_LookupNamedGroup(ssl_grp_ec_curve25519);
543
13.6k
                    break;
544
0
                default:
545
0
                    PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
546
0
                    return SECFailure;
547
14.2k
            }
548
14.2k
            if (ecGroup == NULL) {
549
0
                PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
550
0
                return SECFailure;
551
0
            }
552
14.2k
            keyPair = ssl_LookupEphemeralKeyPair(ss, ecGroup);
553
14.2k
            if (keyPair) {
554
0
                keyPair = ssl_CopyEphemeralKeyPair(keyPair);
555
0
            }
556
14.2k
            if (!keyPair) {
557
14.2k
                rv = ssl_CreateECDHEphemeralKeyPair(ss, ecGroup, &keyPair);
558
14.2k
                if (rv != SECSuccess) {
559
66
                    return SECFailure;
560
66
                }
561
14.2k
            }
562
14.1k
            keyPair->group = groupDef;
563
14.1k
            break;
564
2.41k
        case ssl_kea_ecdh:
565
2.41k
            keyPair = tls13_FindHybridKeyPair(ss, groupDef);
566
2.41k
            if (keyPair) {
567
0
                keyPair = tls13_CopyECDHKeyFromHybrid(keyPair, groupDef);
568
0
            }
569
2.41k
            if (!keyPair) {
570
2.41k
                rv = ssl_CreateECDHEphemeralKeyPair(ss, groupDef, &keyPair);
571
2.41k
                if (rv != SECSuccess) {
572
27
                    return SECFailure;
573
27
                }
574
2.41k
            }
575
2.39k
            break;
576
2.60k
        case ssl_kea_dh:
577
2.60k
            params = ssl_GetDHEParams(groupDef);
578
2.60k
            PORT_Assert(params->name != ssl_grp_ffdhe_custom);
579
2.60k
            rv = ssl_CreateDHEKeyPair(groupDef, params, &keyPair);
580
2.60k
            if (rv != SECSuccess) {
581
4
                return SECFailure;
582
4
            }
583
2.60k
            break;
584
2.60k
        case ssl_kea_kem:
585
            /* Allocate an sslEphemeralKeyPair with a NULL `keys` field; the
586
             * client's KEM key pair is generated below. */
587
0
            keyPair = ssl_NewEphemeralKeyPairWithKeys(groupDef, NULL);
588
0
            if (!keyPair) {
589
0
                return SECFailure;
590
0
            }
591
0
            break;
592
0
        default:
593
0
            PORT_Assert(0);
594
0
            PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
595
0
            return SECFailure;
596
19.2k
    }
597
598
    // If we're creating a share with a KEM component (an ECDH + KEM hybrid or a
599
    // standalone KEM) and we're the client, then we still need to generate the
600
    // KEM key pair. Otherwise we're done.
601
19.1k
    if ((groupDef->keaType == ssl_kea_ecdh_hybrid ||
602
4.99k
         groupDef->keaType == ssl_kea_kem) &&
603
14.1k
        !ss->sec.isServer) {
604
13.5k
        rv = tls13_CreateKEMKeyPair(ss, groupDef, &keyPair->kemKeys);
605
13.5k
        if (rv != SECSuccess) {
606
0
            ssl_FreeEphemeralKeyPair(keyPair);
607
0
            return SECFailure;
608
0
        }
609
13.5k
    }
610
611
19.1k
    *outKeyPair = keyPair;
612
19.1k
    return SECSuccess;
613
19.1k
}
614
615
SECStatus
616
tls13_AddKeyShare(sslSocket *ss, const sslNamedGroupDef *groupDef)
617
19.2k
{
618
19.2k
    sslEphemeralKeyPair *keyPair = NULL;
619
19.2k
    SECStatus rv;
620
621
19.2k
    rv = tls13_CreateKeyShare(ss, groupDef, &keyPair);
622
19.2k
    if (rv != SECSuccess) {
623
97
        return SECFailure;
624
97
    }
625
19.1k
    PR_APPEND_LINK(&keyPair->link, &ss->ephemeralKeyPairs);
626
19.1k
    return SECSuccess;
627
19.2k
}
628
629
SECStatus
630
SSL_SendAdditionalKeyShares(PRFileDesc *fd, unsigned int count)
631
0
{
632
0
    sslSocket *ss = ssl_FindSocket(fd);
633
0
    if (!ss) {
634
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
635
0
        return SECFailure;
636
0
    }
637
638
0
    ss->additionalShares = count;
639
0
    return SECSuccess;
640
0
}
641
642
/*
643
 * Generate shares for ECDHE and FFDHE.  This picks the first enabled group of
644
 * the requisite type and creates a share for that.
645
 *
646
 * Called from ssl3_SendClientHello.
647
 */
648
SECStatus
649
tls13_SetupClientHello(sslSocket *ss, sslClientHelloType chType)
650
17.2k
{
651
17.2k
    unsigned int i;
652
17.2k
    SSL3Statistics *ssl3stats = SSL_GetStatistics();
653
17.2k
    NewSessionTicket *session_ticket = NULL;
654
17.2k
    sslSessionID *sid = ss->sec.ci.sid;
655
17.2k
    unsigned int numShares = 0;
656
17.2k
    SECStatus rv;
657
658
17.2k
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
659
17.2k
    PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss));
660
661
17.2k
    rv = tls13_ClientSetupEch(ss, chType);
662
17.2k
    if (rv != SECSuccess) {
663
29
        return SECFailure;
664
29
    }
665
666
    /* Everything below here is only run on the first CH. */
667
17.1k
    if (chType != client_hello_initial) {
668
3.69k
        return SECSuccess;
669
3.69k
    }
670
671
13.4k
    rv = tls13_ClientGreaseSetup(ss);
672
13.4k
    if (rv != SECSuccess) {
673
0
        return SECFailure;
674
0
    }
675
676
    /* Select the first enabled group.
677
     * TODO(ekr@rtfm.com): be smarter about offering the group
678
     * that the other side negotiated if we are resuming. */
679
13.4k
    PORT_Assert(PR_CLIST_IS_EMPTY(&ss->ephemeralKeyPairs));
680
13.4k
    for (i = 0; i < SSL_NAMED_GROUP_COUNT; ++i) {
681
13.4k
        if (!ss->namedGroupPreferences[i]) {
682
0
            continue;
683
0
        }
684
13.4k
        rv = tls13_AddKeyShare(ss, ss->namedGroupPreferences[i]);
685
13.4k
        if (rv != SECSuccess) {
686
63
            return SECFailure;
687
63
        }
688
13.4k
        if (++numShares > ss->additionalShares) {
689
13.4k
            break;
690
13.4k
        }
691
13.4k
    }
692
693
13.4k
    if (PR_CLIST_IS_EMPTY(&ss->ephemeralKeyPairs)) {
694
0
        PORT_SetError(SSL_ERROR_NO_CIPHERS_SUPPORTED);
695
0
        return SECFailure;
696
0
    }
697
698
    /* Try to do stateless resumption, if we can. */
699
13.4k
    if (sid->cached != never_cached &&
700
0
        sid->version >= SSL_LIBRARY_VERSION_TLS_1_3) {
701
        /* The caller must be holding sid->u.ssl3.lock for reading. */
702
0
        session_ticket = &sid->u.ssl3.locked.sessionTicket;
703
0
        PORT_Assert(session_ticket && session_ticket->ticket.data);
704
705
0
        if (ssl_TicketTimeValid(ss, session_ticket)) {
706
0
            ss->statelessResume = PR_TRUE;
707
0
        }
708
709
0
        if (ss->statelessResume) {
710
0
            PORT_Assert(ss->sec.ci.sid);
711
0
            rv = tls13_RecoverWrappedSharedSecret(ss, ss->sec.ci.sid);
712
0
            if (rv != SECSuccess) {
713
0
                FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
714
0
                SSL_AtomicIncrementLong(&ssl3stats->sch_sid_cache_not_ok);
715
0
                ssl_UncacheSessionID(ss);
716
0
                ssl_SetSocketSID(ss, NULL);
717
0
                return SECFailure;
718
0
            }
719
720
0
            ss->ssl3.hs.cipher_suite = ss->sec.ci.sid->u.ssl3.cipherSuite;
721
0
            rv = ssl3_SetupCipherSuite(ss, PR_FALSE);
722
0
            if (rv != SECSuccess) {
723
0
                FATAL_ERROR(ss, PORT_GetError(), internal_error);
724
0
                return SECFailure;
725
0
            }
726
0
            PORT_Assert(!PR_CLIST_IS_EMPTY(&ss->ssl3.hs.psks));
727
0
        }
728
0
    }
729
730
    /* Derive the binder keys if any PSKs. */
731
13.4k
    if (!PR_CLIST_IS_EMPTY(&ss->ssl3.hs.psks)) {
732
        /* If an External PSK specified a suite, use that. */
733
6.74k
        sslPsk *psk = (sslPsk *)PR_LIST_HEAD(&ss->ssl3.hs.psks);
734
6.74k
        if (!ss->statelessResume &&
735
6.74k
            psk->type == ssl_psk_external &&
736
6.74k
            psk->zeroRttSuite != TLS_NULL_WITH_NULL_NULL) {
737
0
            ss->ssl3.hs.cipher_suite = psk->zeroRttSuite;
738
0
        }
739
740
6.74k
        rv = tls13_ComputeEarlySecretsWithPsk(ss);
741
6.74k
        if (rv != SECSuccess) {
742
0
            FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
743
0
            return SECFailure;
744
0
        }
745
6.74k
    }
746
747
13.4k
    tls13_EchKeyLog(ss);
748
13.4k
    return SECSuccess;
749
13.4k
}
750
751
static SECStatus
752
tls13_ImportDHEKeyShare(SECKEYPublicKey *peerKey,
753
                        PRUint8 *b, PRUint32 length,
754
                        SECKEYPublicKey *pubKey)
755
2.24k
{
756
2.24k
    SECStatus rv;
757
2.24k
    SECItem publicValue = { siBuffer, NULL, 0 };
758
759
2.24k
    publicValue.data = b;
760
2.24k
    publicValue.len = length;
761
2.24k
    if (!ssl_IsValidDHEShare(&pubKey->u.dh.prime, &publicValue)) {
762
12
        PORT_SetError(SSL_ERROR_RX_MALFORMED_DHE_KEY_SHARE);
763
12
        return SECFailure;
764
12
    }
765
766
2.22k
    peerKey->keyType = dhKey;
767
2.22k
    rv = SECITEM_CopyItem(peerKey->arena, &peerKey->u.dh.prime,
768
2.22k
                          &pubKey->u.dh.prime);
769
2.22k
    if (rv != SECSuccess)
770
0
        return SECFailure;
771
2.22k
    rv = SECITEM_CopyItem(peerKey->arena, &peerKey->u.dh.base,
772
2.22k
                          &pubKey->u.dh.base);
773
2.22k
    if (rv != SECSuccess)
774
0
        return SECFailure;
775
2.22k
    rv = SECITEM_CopyItem(peerKey->arena, &peerKey->u.dh.publicValue,
776
2.22k
                          &publicValue);
777
2.22k
    if (rv != SECSuccess)
778
0
        return SECFailure;
779
780
2.22k
    return SECSuccess;
781
2.22k
}
782
783
static SECStatus
784
tls13_ImportKEMKeyShare(SECKEYPublicKey *peerKey, TLS13KeyShareEntry *entry)
785
666
{
786
666
    SECItem pk = { siBuffer, NULL, 0 };
787
666
    SECStatus rv;
788
666
    size_t expected_len;
789
790
666
    switch (entry->group->name) {
791
139
        case ssl_grp_kem_mlkem768x25519:
792
139
            expected_len = X25519_PUBLIC_KEY_BYTES + KYBER768_PUBLIC_KEY_BYTES;
793
139
            break;
794
155
        case ssl_grp_kem_secp256r1mlkem768:
795
155
            expected_len = SECP256_PUBLIC_KEY_BYTES + KYBER768_PUBLIC_KEY_BYTES;
796
155
            break;
797
372
        case ssl_grp_kem_secp384r1mlkem1024:
798
372
            expected_len = SECP384_PUBLIC_KEY_BYTES + MLKEM1024_PUBLIC_KEY_BYTES;
799
372
            break;
800
0
        case ssl_grp_kem_mlkem1024:
801
0
            expected_len = MLKEM1024_PUBLIC_KEY_BYTES;
802
0
            break;
803
0
        default:
804
0
            PORT_SetError(SEC_ERROR_UNSUPPORTED_KEYALG);
805
0
            return SECFailure;
806
666
    }
807
808
666
    if (entry->key_exchange.len != expected_len) {
809
5
        PORT_SetError(entry->group->keaType == ssl_kea_kem
810
5
                          ? SSL_ERROR_RX_MALFORMED_KEY_SHARE
811
5
                          : SSL_ERROR_RX_MALFORMED_HYBRID_KEY_SHARE);
812
5
        return SECFailure;
813
5
    }
814
815
661
    switch (entry->group->name) {
816
136
        case ssl_grp_kem_mlkem768x25519:
817
136
            peerKey->keyType = kyberKey;
818
136
            peerKey->u.kyber.params = params_ml_kem768;
819
            // key_exchange.data is `mlkem768 || x25519`
820
136
            pk.data = entry->key_exchange.data;
821
136
            pk.len = KYBER768_PUBLIC_KEY_BYTES;
822
136
            break;
823
153
        case ssl_grp_kem_secp256r1mlkem768:
824
153
            peerKey->keyType = kyberKey;
825
153
            peerKey->u.kyber.params = params_ml_kem768;
826
            /* key_exchange.data is `secp256 || mlkem768` */
827
153
            pk.data = entry->key_exchange.data + SECP256_PUBLIC_KEY_BYTES;
828
153
            pk.len = KYBER768_PUBLIC_KEY_BYTES;
829
153
            break;
830
372
        case ssl_grp_kem_secp384r1mlkem1024:
831
372
            peerKey->keyType = kyberKey;
832
372
            peerKey->u.kyber.params = params_ml_kem1024;
833
            /* key_exchange.data is `secp384 || mlkem1024` */
834
372
            pk.data = entry->key_exchange.data + SECP384_PUBLIC_KEY_BYTES;
835
372
            pk.len = MLKEM1024_PUBLIC_KEY_BYTES;
836
372
            break;
837
0
        case ssl_grp_kem_mlkem1024:
838
0
            peerKey->keyType = kyberKey;
839
0
            peerKey->u.kyber.params = params_ml_kem1024;
840
0
            pk.data = entry->key_exchange.data;
841
0
            pk.len = MLKEM1024_PUBLIC_KEY_BYTES;
842
0
            break;
843
0
        default:
844
0
            PORT_Assert(0);
845
0
            PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
846
0
            return SECFailure;
847
661
    }
848
849
661
    rv = SECITEM_CopyItem(peerKey->arena, &peerKey->u.kyber.publicValue, &pk);
850
661
    if (rv != SECSuccess) {
851
0
        PORT_SetError(SEC_ERROR_NO_MEMORY);
852
0
        return SECFailure;
853
0
    }
854
855
661
    return SECSuccess;
856
661
}
857
858
static SECStatus
859
tls13_HandleKEMCiphertext(sslSocket *ss, TLS13KeyShareEntry *entry, sslKeyPair *keyPair, PK11SymKey **outKey)
860
131
{
861
131
    SECItem ct = { siBuffer, NULL, 0 };
862
131
    SECStatus rv;
863
864
131
    switch (entry->group->name) {
865
131
        case ssl_grp_kem_mlkem768x25519:
866
131
            if (entry->key_exchange.len != X25519_PUBLIC_KEY_BYTES + KYBER768_CIPHERTEXT_BYTES) {
867
22
                ssl_MapLowLevelError(SSL_ERROR_RX_MALFORMED_HYBRID_KEY_SHARE);
868
22
                return SECFailure;
869
22
            }
870
109
            ct.data = entry->key_exchange.data;
871
109
            ct.len = KYBER768_CIPHERTEXT_BYTES;
872
109
            break;
873
0
        case ssl_grp_kem_secp256r1mlkem768:
874
0
            if (entry->key_exchange.len != SECP256_PUBLIC_KEY_BYTES + KYBER768_CIPHERTEXT_BYTES) {
875
0
                ssl_MapLowLevelError(SSL_ERROR_RX_MALFORMED_HYBRID_KEY_SHARE);
876
0
                return SECFailure;
877
0
            }
878
0
            ct.data = entry->key_exchange.data + SECP256_PUBLIC_KEY_BYTES;
879
0
            ct.len = KYBER768_CIPHERTEXT_BYTES;
880
0
            break;
881
0
        case ssl_grp_kem_secp384r1mlkem1024:
882
0
            if (entry->key_exchange.len != SECP384_PUBLIC_KEY_BYTES + MLKEM1024_CIPHERTEXT_BYTES) {
883
0
                ssl_MapLowLevelError(SSL_ERROR_RX_MALFORMED_HYBRID_KEY_SHARE);
884
0
                return SECFailure;
885
0
            }
886
0
            ct.data = entry->key_exchange.data + SECP384_PUBLIC_KEY_BYTES;
887
0
            ct.len = MLKEM1024_CIPHERTEXT_BYTES;
888
0
            break;
889
0
        case ssl_grp_kem_mlkem1024:
890
0
            if (entry->key_exchange.len != MLKEM1024_CIPHERTEXT_BYTES) {
891
0
                ssl_MapLowLevelError(SSL_ERROR_RX_MALFORMED_KEY_SHARE);
892
0
                return SECFailure;
893
0
            }
894
0
            ct.data = entry->key_exchange.data;
895
0
            ct.len = MLKEM1024_CIPHERTEXT_BYTES;
896
0
            break;
897
0
        default:
898
0
            PORT_Assert(0);
899
0
            ssl_MapLowLevelError(SEC_ERROR_LIBRARY_FAILURE);
900
0
            return SECFailure;
901
131
    }
902
903
109
    rv = PK11_Decapsulate(keyPair->privKey, &ct, CKM_HKDF_DERIVE,
904
109
                          PK11_ATTR_SESSION | PK11_ATTR_INSENSITIVE,
905
109
                          CKF_DERIVE, outKey);
906
109
    if (rv != SECSuccess) {
907
0
        rv = PK11_Decapsulate(keyPair->privKey, &ct, CKM_HKDF_DERIVE,
908
0
                              PK11_ATTR_SESSION | PK11_ATTR_SENSITIVE,
909
0
                              CKF_DERIVE, outKey);
910
0
        if (rv != SECSuccess) {
911
0
            ssl_MapLowLevelError(SSL_ERROR_KEY_EXCHANGE_FAILURE);
912
0
        }
913
0
    }
914
109
    return rv;
915
131
}
916
917
static SECStatus
918
tls13_HandleKEMKey(sslSocket *ss,
919
                   TLS13KeyShareEntry *entry,
920
                   PK11SymKey **key,
921
                   SECItem **ciphertext)
922
666
{
923
666
    PORTCheapArenaPool arena;
924
666
    SECKEYPublicKey *peerKey;
925
666
    CK_OBJECT_HANDLE handle;
926
666
    SECStatus rv;
927
928
666
    PORT_InitCheapArena(&arena, DER_DEFAULT_CHUNKSIZE);
929
666
    peerKey = PORT_ArenaZNew(&arena.arena, SECKEYPublicKey);
930
666
    if (peerKey == NULL) {
931
0
        goto loser;
932
0
    }
933
666
    peerKey->arena = &arena.arena;
934
666
    peerKey->pkcs11Slot = NULL;
935
666
    peerKey->pkcs11ID = CK_INVALID_HANDLE;
936
937
666
    rv = tls13_ImportKEMKeyShare(peerKey, entry);
938
666
    if (rv != SECSuccess) {
939
5
        goto loser;
940
5
    }
941
942
661
    PK11SlotInfo *slot = PK11_GetBestSlot(CKM_ML_KEM, ss->pkcs11PinArg);
943
661
    if (!slot) {
944
0
        goto loser;
945
0
    }
946
947
661
    handle = PK11_ImportPublicKey(slot, peerKey, PR_FALSE);
948
661
    PK11_FreeSlot(slot); /* peerKey holds a slot reference on success. */
949
661
    if (handle == CK_INVALID_HANDLE) {
950
0
        goto loser;
951
0
    }
952
953
661
    rv = PK11_Encapsulate(peerKey, CKM_HKDF_DERIVE,
954
661
                          PK11_ATTR_SESSION | PK11_ATTR_INSENSITIVE,
955
661
                          CKF_DERIVE, key, ciphertext);
956
661
    if (rv != SECSuccess) {
957
84
        rv = PK11_Encapsulate(peerKey, CKM_HKDF_DERIVE,
958
84
                              PK11_ATTR_SESSION | PK11_ATTR_SENSITIVE,
959
84
                              CKF_DERIVE, key, ciphertext);
960
84
    }
961
962
    /* Destroy the imported public key */
963
661
    PORT_Assert(peerKey->pkcs11Slot);
964
661
    PK11_DestroyObject(peerKey->pkcs11Slot, peerKey->pkcs11ID);
965
661
    PK11_FreeSlot(peerKey->pkcs11Slot);
966
967
661
    PORT_DestroyCheapArena(&arena);
968
661
    return rv;
969
970
5
loser:
971
5
    PORT_DestroyCheapArena(&arena);
972
5
    return SECFailure;
973
661
}
974
975
SECStatus
976
tls13_HandleKeyShare(sslSocket *ss,
977
                     TLS13KeyShareEntry *entry,
978
                     sslKeyPair *keyPair,
979
                     SSLHashType hash,
980
                     PK11SymKey **out)
981
5.32k
{
982
5.32k
    PORTCheapArenaPool arena;
983
5.32k
    SECKEYPublicKey *peerKey;
984
5.32k
    CK_MECHANISM_TYPE mechanism;
985
5.32k
    PK11SymKey *key;
986
5.32k
    unsigned char *ec_data;
987
5.32k
    SECStatus rv;
988
5.32k
    int keySize = 0;
989
5.32k
    const sslNamedGroupDef *ecGroup = NULL;
990
5.32k
    int ec_len = 0;
991
992
    /* Every group handled here has an ECDH/DH component and so requires our
993
     * key pair; a standalone KEM group has no `keys` and never reaches here. */
994
5.32k
    if (!keyPair) {
995
0
        PORT_Assert(0);
996
0
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
997
0
        return SECFailure;
998
0
    }
999
1000
5.32k
    PORT_InitCheapArena(&arena, DER_DEFAULT_CHUNKSIZE);
1001
5.32k
    peerKey = PORT_ArenaZNew(&arena.arena, SECKEYPublicKey);
1002
5.32k
    if (peerKey == NULL) {
1003
0
        goto loser;
1004
0
    }
1005
5.32k
    peerKey->arena = &arena.arena;
1006
5.32k
    peerKey->pkcs11Slot = NULL;
1007
5.32k
    peerKey->pkcs11ID = CK_INVALID_HANDLE;
1008
1009
5.32k
    switch (entry->group->keaType) {
1010
811
        case ssl_kea_ecdh_hybrid:
1011
811
            switch (entry->group->name) {
1012
281
                case ssl_grp_kem_mlkem768x25519:
1013
281
                    ec_len = X25519_PUBLIC_KEY_BYTES;
1014
                    // x25519 share is at the end
1015
281
                    ec_data = entry->key_exchange.len < ec_len
1016
281
                                  ? NULL
1017
281
                                  : entry->key_exchange.data + entry->key_exchange.len - ec_len;
1018
281
                    ecGroup = ssl_LookupNamedGroup(ssl_grp_ec_curve25519);
1019
281
                    break;
1020
157
                case ssl_grp_kem_secp256r1mlkem768:
1021
157
                    ec_len = SECP256_PUBLIC_KEY_BYTES;
1022
                    /* secp256 share is at the beginning */
1023
157
                    ec_data = entry->key_exchange.len < ec_len
1024
157
                                  ? NULL
1025
157
                                  : entry->key_exchange.data;
1026
157
                    ecGroup = ssl_LookupNamedGroup(ssl_grp_ec_secp256r1);
1027
157
                    break;
1028
373
                case ssl_grp_kem_secp384r1mlkem1024:
1029
373
                    ec_len = SECP384_PUBLIC_KEY_BYTES;
1030
                    /* secp384 share is at the beginning */
1031
373
                    ec_data = entry->key_exchange.len < ec_len
1032
373
                                  ? NULL
1033
373
                                  : entry->key_exchange.data;
1034
373
                    ecGroup = ssl_LookupNamedGroup(ssl_grp_ec_secp384r1);
1035
373
                    break;
1036
0
                default:
1037
0
                    ec_data = NULL;
1038
0
                    break;
1039
811
            }
1040
811
            if (!ec_data) {
1041
9
                PORT_SetError(SSL_ERROR_RX_MALFORMED_HYBRID_KEY_SHARE);
1042
9
                goto loser;
1043
9
            }
1044
802
            rv = ssl_ImportECDHKeyShare(peerKey, ec_data, ec_len, ecGroup);
1045
802
            mechanism = CKM_ECDH1_DERIVE;
1046
802
            break;
1047
2.27k
        case ssl_kea_ecdh:
1048
2.27k
            rv = ssl_ImportECDHKeyShare(peerKey,
1049
2.27k
                                        entry->key_exchange.data,
1050
2.27k
                                        entry->key_exchange.len,
1051
2.27k
                                        entry->group);
1052
2.27k
            mechanism = CKM_ECDH1_DERIVE;
1053
2.27k
            break;
1054
2.24k
        case ssl_kea_dh:
1055
2.24k
            rv = tls13_ImportDHEKeyShare(peerKey,
1056
2.24k
                                         entry->key_exchange.data,
1057
2.24k
                                         entry->key_exchange.len,
1058
2.24k
                                         keyPair->pubKey);
1059
2.24k
            mechanism = CKM_DH_PKCS_DERIVE;
1060
2.24k
            keySize = peerKey->u.dh.publicValue.len;
1061
2.24k
            break;
1062
0
        default:
1063
0
            PORT_Assert(0);
1064
0
            goto loser;
1065
5.32k
    }
1066
5.31k
    if (rv != SECSuccess) {
1067
39
        goto loser;
1068
39
    }
1069
1070
5.27k
    key = PK11_PubDeriveWithKDF(
1071
5.27k
        keyPair->privKey, peerKey, PR_FALSE, NULL, NULL, mechanism,
1072
5.27k
        CKM_HKDF_DERIVE, CKA_DERIVE, keySize, CKD_NULL, NULL, NULL);
1073
5.27k
    if (!key) {
1074
157
        ssl_MapLowLevelError(SSL_ERROR_KEY_EXCHANGE_FAILURE);
1075
157
        goto loser;
1076
157
    }
1077
1078
5.12k
    *out = key;
1079
5.12k
    PORT_DestroyCheapArena(&arena);
1080
5.12k
    return SECSuccess;
1081
1082
205
loser:
1083
205
    PORT_DestroyCheapArena(&arena);
1084
205
    return SECFailure;
1085
5.27k
}
1086
1087
/* Combine the optional ECDH and KEM secrets into the value that feeds the
1088
 * TLS 1.3 key schedule in place of the (EC)DHE shared secret, according to the
1089
 * group's construction. Either input may be NULL (a standalone KEM group has
1090
 * no ECDH secret; a plain ECDH/DH group has no KEM secret). This does not
1091
 * consume its inputs: the caller retains ownership of both and must free them.
1092
 * The returned key holds its own reference. */
1093
static PK11SymKey *
1094
tls13_CombineKeyShareSecrets(const sslNamedGroupDef *group,
1095
                             PK11SymKey *dheSecret, PK11SymKey *kemSecret)
1096
5.01k
{
1097
5.01k
    switch (group->keaType) {
1098
0
        case ssl_kea_kem:
1099
            /* Standalone KEM: the secret is just the KEM shared secret. */
1100
0
            return PK11_ReferenceSymKey(kemSecret);
1101
686
        case ssl_kea_ecdh_hybrid:
1102
            /* ML-KEM-768 + X25519 places the KEM secret first; the other
1103
             * hybrids place the ECDH secret first. */
1104
686
            if (group->name == ssl_grp_kem_mlkem768x25519) {
1105
224
                return PK11_ConcatSymKeys(kemSecret, dheSecret, CKM_HKDF_DERIVE,
1106
224
                                          CKA_DERIVE);
1107
224
            }
1108
462
            return PK11_ConcatSymKeys(dheSecret, kemSecret, CKM_HKDF_DERIVE,
1109
462
                                      CKA_DERIVE);
1110
4.32k
        default:
1111
            /* Plain ECDH or DH: the secret is just the (EC)DHE shared secret. */
1112
4.32k
            return PK11_ReferenceSymKey(dheSecret);
1113
5.01k
    }
1114
5.01k
}
1115
1116
static PRBool
1117
tls13_UseServerSecret(sslSocket *ss, SSLSecretDirection direction)
1118
284k
{
1119
284k
    return ss->sec.isServer == (direction == ssl_secret_write);
1120
284k
}
1121
1122
static PK11SymKey **
1123
tls13_TrafficSecretRef(sslSocket *ss, SSLSecretDirection direction)
1124
136k
{
1125
136k
    if (tls13_UseServerSecret(ss, direction)) {
1126
17.4k
        return &ss->ssl3.hs.serverTrafficSecret;
1127
17.4k
    }
1128
119k
    return &ss->ssl3.hs.clientTrafficSecret;
1129
136k
}
1130
1131
SECStatus
1132
tls13_UpdateTrafficKeys(sslSocket *ss, SSLSecretDirection direction)
1133
136k
{
1134
136k
    PK11SymKey **secret;
1135
136k
    PK11SymKey *updatedSecret;
1136
136k
    PRUint16 epoch;
1137
136k
    SECStatus rv;
1138
1139
136k
    secret = tls13_TrafficSecretRef(ss, direction);
1140
136k
    rv = tls13_HkdfExpandLabel(*secret, tls13_GetHash(ss),
1141
136k
                               NULL, 0,
1142
136k
                               kHkdfLabelTrafficUpdate,
1143
136k
                               strlen(kHkdfLabelTrafficUpdate),
1144
136k
                               tls13_GetHmacMechanism(ss),
1145
136k
                               tls13_GetHashSize(ss),
1146
136k
                               ss->protocolVariant,
1147
136k
                               &updatedSecret);
1148
136k
    if (rv != SECSuccess) {
1149
0
        return SECFailure;
1150
0
    }
1151
1152
136k
    PK11_FreeSymKey(*secret);
1153
136k
    *secret = updatedSecret;
1154
1155
136k
    ssl_GetSpecReadLock(ss);
1156
136k
    if (direction == ssl_secret_read) {
1157
119k
        epoch = ss->ssl3.crSpec->epoch;
1158
119k
    } else {
1159
17.4k
        epoch = ss->ssl3.cwSpec->epoch;
1160
17.4k
    }
1161
136k
    ssl_ReleaseSpecReadLock(ss);
1162
1163
136k
    if (epoch == PR_UINT16_MAX) {
1164
        /* Good chance that this is an overflow from too many updates. */
1165
0
        SSL_TRC(3, ("%d: TLS13[%d]: %s epoch exhausted by too many key updates",
1166
0
                    SSL_GETPID(), ss->fd, SSL_ROLE(ss)));
1167
0
        (void)SSL3_SendAlert(ss, alert_fatal, internal_error);
1168
0
        PORT_SetError(SSL_ERROR_TOO_MANY_KEY_UPDATES);
1169
0
        return SECFailure;
1170
0
    }
1171
136k
    ++epoch;
1172
1173
136k
    if (ss->secretCallback) {
1174
0
        ss->secretCallback(ss->fd, epoch, direction, updatedSecret,
1175
0
                           ss->secretCallbackArg);
1176
0
    }
1177
136k
    rv = tls13_SetCipherSpec(ss, epoch, direction, PR_FALSE);
1178
136k
    if (rv != SECSuccess) {
1179
0
        FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
1180
0
        return SECFailure;
1181
0
    }
1182
136k
    return SECSuccess;
1183
136k
}
1184
1185
SECStatus
1186
tls13_SendKeyUpdate(sslSocket *ss, tls13KeyUpdateRequest request, PRBool buffer)
1187
17.5k
{
1188
17.5k
    SECStatus rv;
1189
1190
17.5k
    SSL_TRC(3, ("%d: TLS13[%d]: %s send key update, response %s",
1191
17.5k
                SSL_GETPID(), ss->fd, SSL_ROLE(ss),
1192
17.5k
                (request == update_requested) ? "requested"
1193
17.5k
                                              : "not requested"));
1194
1195
17.5k
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
1196
17.5k
    PORT_Assert(!ss->sec.isServer || !ss->ssl3.clientCertRequested);
1197
1198
17.5k
    if (!tls13_IsPostHandshake(ss)) {
1199
0
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
1200
0
        return SECFailure;
1201
0
    }
1202
1203
17.5k
    rv = TLS13_CHECK_HS_STATE(ss, SEC_ERROR_LIBRARY_FAILURE,
1204
17.5k
                              idle_handshake);
1205
17.5k
    if (rv != SECSuccess) {
1206
0
        return SECFailure;
1207
0
    }
1208
1209
17.5k
    if (IS_DTLS(ss)) {
1210
104
        rv = dtls13_MaybeSendKeyUpdate(ss, request, buffer);
1211
104
        if (rv != SECSuccess) {
1212
            /* Error code set already. */
1213
0
            return SECFailure;
1214
0
        }
1215
104
        return rv;
1216
104
    }
1217
1218
17.4k
    ssl_GetXmitBufLock(ss);
1219
17.4k
    rv = ssl3_AppendHandshakeHeader(ss, ssl_hs_key_update, 1);
1220
17.4k
    if (rv != SECSuccess) {
1221
0
        FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
1222
0
        goto loser;
1223
0
    }
1224
17.4k
    rv = ssl3_AppendHandshakeNumber(ss, request, 1);
1225
17.4k
    if (rv != SECSuccess) {
1226
0
        FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
1227
0
        goto loser;
1228
0
    }
1229
1230
    /* If we have been asked to buffer, then do so.  This allows us to coalesce
1231
     * a KeyUpdate with a pending write. */
1232
17.4k
    rv = ssl3_FlushHandshake(ss, buffer ? ssl_SEND_FLAG_FORCE_INTO_BUFFER : 0);
1233
17.4k
    if (rv != SECSuccess) {
1234
0
        goto loser; /* error code set by ssl3_FlushHandshake */
1235
0
    }
1236
17.4k
    ssl_ReleaseXmitBufLock(ss);
1237
1238
17.4k
    rv = tls13_UpdateTrafficKeys(ss, ssl_secret_write);
1239
17.4k
    if (rv != SECSuccess) {
1240
0
        goto loser; /* error code set by tls13_UpdateTrafficKeys */
1241
0
    }
1242
1243
17.4k
    return SECSuccess;
1244
1245
0
loser:
1246
0
    ssl_ReleaseXmitBufLock(ss);
1247
0
    return SECFailure;
1248
17.4k
}
1249
1250
SECStatus
1251
SSLExp_KeyUpdate(PRFileDesc *fd, PRBool requestUpdate)
1252
0
{
1253
0
    SECStatus rv;
1254
0
    sslSocket *ss = ssl_FindSocket(fd);
1255
0
    if (!ss) {
1256
0
        return SECFailure;
1257
0
    }
1258
1259
0
    if (!tls13_IsPostHandshake(ss)) {
1260
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
1261
0
        return SECFailure;
1262
0
    }
1263
1264
0
    if (ss->ssl3.clientCertRequested) {
1265
0
        PORT_SetError(PR_WOULD_BLOCK_ERROR);
1266
0
        return SECFailure;
1267
0
    }
1268
1269
0
    rv = TLS13_CHECK_HS_STATE(ss, SEC_ERROR_INVALID_ARGS,
1270
0
                              idle_handshake);
1271
0
    if (rv != SECSuccess) {
1272
0
        return SECFailure;
1273
0
    }
1274
1275
0
    ssl_GetSSL3HandshakeLock(ss);
1276
0
    rv = tls13_SendKeyUpdate(ss, requestUpdate ? update_requested : update_not_requested,
1277
0
                             PR_FALSE /* don't buffer */);
1278
1279
    /* Remember that we are the ones that initiated this KeyUpdate. */
1280
0
    if (rv == SECSuccess) {
1281
0
        ss->ssl3.peerRequestedKeyUpdate = PR_FALSE;
1282
0
    }
1283
0
    ssl_ReleaseSSL3HandshakeLock(ss);
1284
0
    return rv;
1285
0
}
1286
1287
SECStatus
1288
SSLExp_SetCertificateCompressionAlgorithm(PRFileDesc *fd, SSLCertificateCompressionAlgorithm alg)
1289
31.1k
{
1290
31.1k
    sslSocket *ss = ssl_FindSocket(fd);
1291
31.1k
    if (!ss) {
1292
0
        return SECFailure; /* Code already set. */
1293
0
    }
1294
1295
31.1k
    ssl_GetSSL3HandshakeLock(ss);
1296
31.1k
    if (ss->ssl3.supportedCertCompressionAlgorithmsCount == MAX_SUPPORTED_CERTIFICATE_COMPRESSION_ALGS) {
1297
0
        goto loser;
1298
0
    }
1299
1300
    /* Reserved ID */
1301
31.1k
    if (alg.id == 0) {
1302
0
        goto loser;
1303
0
    }
1304
1305
31.1k
    if (alg.encode == NULL && alg.decode == NULL) {
1306
0
        goto loser;
1307
0
    }
1308
1309
    /* Checking that we have not yet registed an algorithm with the same ID. */
1310
31.1k
    for (int i = 0; i < ss->ssl3.supportedCertCompressionAlgorithmsCount; i++) {
1311
0
        if (ss->ssl3.supportedCertCompressionAlgorithms[i].id == alg.id) {
1312
0
            goto loser;
1313
0
        }
1314
0
    }
1315
1316
31.1k
    PORT_Memcpy(&ss->ssl3.supportedCertCompressionAlgorithms
1317
31.1k
                     [ss->ssl3.supportedCertCompressionAlgorithmsCount],
1318
31.1k
                &alg, sizeof(alg));
1319
31.1k
    ss->ssl3.supportedCertCompressionAlgorithmsCount += 1;
1320
31.1k
    ssl_ReleaseSSL3HandshakeLock(ss);
1321
31.1k
    return SECSuccess;
1322
1323
0
loser:
1324
0
    PORT_SetError(SEC_ERROR_INVALID_ARGS);
1325
0
    ssl_ReleaseSSL3HandshakeLock(ss);
1326
0
    return SECFailure;
1327
31.1k
}
1328
1329
/*
1330
 * enum {
1331
 *     update_not_requested(0), update_requested(1), (255)
1332
 * } KeyUpdateRequest;
1333
 *
1334
 * struct {
1335
 *     KeyUpdateRequest request_update;
1336
 * } KeyUpdate;
1337
 */
1338
1339
/* If we're handing the DTLS1.3 message, we silently fail if there is a parsing problem. */
1340
static SECStatus
1341
tls13_HandleKeyUpdate(sslSocket *ss, PRUint8 *b, unsigned int length)
1342
119k
{
1343
119k
    SECStatus rv;
1344
119k
    PRUint32 update;
1345
1346
119k
    SSL_TRC(3, ("%d: TLS13[%d]: %s handle key update",
1347
119k
                SSL_GETPID(), ss->fd, SSL_ROLE(ss)));
1348
1349
119k
    PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss));
1350
119k
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
1351
1352
119k
    if (!tls13_IsPostHandshake(ss)) {
1353
14
        FATAL_ERROR(ss, SSL_ERROR_RX_UNEXPECTED_KEY_UPDATE, unexpected_message);
1354
14
        return SECFailure;
1355
14
    }
1356
1357
119k
    rv = TLS13_CHECK_HS_STATE(ss, SSL_ERROR_RX_UNEXPECTED_KEY_UPDATE,
1358
119k
                              idle_handshake);
1359
119k
    if (rv != SECSuccess) {
1360
        /* We should never be idle_handshake prior to firstHsDone. */
1361
0
        FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
1362
0
        return SECFailure;
1363
0
    }
1364
1365
119k
    rv = ssl3_ConsumeHandshakeNumber(ss, &update, 1, &b, &length);
1366
119k
    if (rv != SECSuccess) {
1367
4
        return SECFailure; /* Error code set already. */
1368
4
    }
1369
119k
    if (length != 0) {
1370
9
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_KEY_UPDATE, decode_error);
1371
9
        return SECFailure;
1372
9
    }
1373
119k
    if (!(update == update_requested ||
1374
124
          update == update_not_requested)) {
1375
        /* See RFC 9846, Section 4.7.3. */
1376
6
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_KEY_UPDATE, illegal_parameter);
1377
6
        return SECFailure;
1378
6
    }
1379
1380
119k
    if (IS_DTLS(ss)) {
1381
0
        return dtls13_HandleKeyUpdate(ss, b, length, update);
1382
0
    }
1383
1384
119k
    rv = tls13_UpdateTrafficKeys(ss, ssl_secret_read);
1385
119k
    if (rv != SECSuccess) {
1386
0
        return SECFailure; /* Error code set by tls13_UpdateTrafficKeys. */
1387
0
    }
1388
1389
119k
    if (update == update_requested) {
1390
119k
        PRBool sendUpdate;
1391
119k
        if (ss->ssl3.clientCertRequested) {
1392
            /* Post-handshake auth is in progress; defer sending a key update. */
1393
0
            ss->ssl3.hs.keyUpdateDeferred = PR_TRUE;
1394
0
            ss->ssl3.hs.deferredKeyUpdateRequest = update_not_requested;
1395
0
            sendUpdate = PR_FALSE;
1396
119k
        } else if (ss->ssl3.peerRequestedKeyUpdate) {
1397
            /* Only send an update if we have sent with the current spec.  This
1398
             * prevents us from being forced to crank forward pointlessly. */
1399
118k
            ssl_GetSpecReadLock(ss);
1400
118k
            sendUpdate = ss->ssl3.cwSpec->nextSeqNum > 0;
1401
118k
            ssl_ReleaseSpecReadLock(ss);
1402
118k
        } else {
1403
371
            sendUpdate = PR_TRUE;
1404
371
        }
1405
119k
        if (sendUpdate) {
1406
            /* Respond immediately (don't buffer). */
1407
17.4k
            rv = tls13_SendKeyUpdate(ss, update_not_requested, PR_FALSE);
1408
17.4k
            if (rv != SECSuccess) {
1409
0
                return SECFailure; /* Error already set. */
1410
0
            }
1411
17.4k
        }
1412
119k
        ss->ssl3.peerRequestedKeyUpdate = PR_TRUE;
1413
119k
    }
1414
1415
119k
    return SECSuccess;
1416
119k
}
1417
1418
SECStatus
1419
SSLExp_SendCertificateRequest(PRFileDesc *fd)
1420
0
{
1421
0
    SECStatus rv;
1422
0
    sslSocket *ss = ssl_FindSocket(fd);
1423
0
    if (!ss) {
1424
0
        return SECFailure;
1425
0
    }
1426
1427
    /* Not supported. */
1428
0
    if (IS_DTLS(ss)) {
1429
0
        PORT_SetError(SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_VERSION);
1430
0
        return SECFailure;
1431
0
    }
1432
1433
0
    if (!tls13_IsPostHandshake(ss)) {
1434
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
1435
0
        return SECFailure;
1436
0
    }
1437
1438
0
    if (ss->ssl3.clientCertRequested) {
1439
0
        PORT_SetError(PR_WOULD_BLOCK_ERROR);
1440
0
        return SECFailure;
1441
0
    }
1442
1443
    /* Disallow a CertificateRequest if this connection uses an external PSK. */
1444
0
    if (ss->sec.authType == ssl_auth_psk) {
1445
0
        PORT_SetError(SSL_ERROR_FEATURE_DISABLED);
1446
0
        return SECFailure;
1447
0
    }
1448
1449
0
    rv = TLS13_CHECK_HS_STATE(ss, SEC_ERROR_INVALID_ARGS,
1450
0
                              idle_handshake);
1451
0
    if (rv != SECSuccess) {
1452
0
        return SECFailure;
1453
0
    }
1454
1455
0
    if (!ssl3_ExtensionNegotiated(ss, ssl_tls13_post_handshake_auth_xtn)) {
1456
0
        PORT_SetError(SSL_ERROR_MISSING_POST_HANDSHAKE_AUTH_EXTENSION);
1457
0
        return SECFailure;
1458
0
    }
1459
1460
0
    ssl_GetSSL3HandshakeLock(ss);
1461
1462
0
    rv = tls13_SendCertificateRequest(ss);
1463
0
    if (rv == SECSuccess) {
1464
0
        ssl_GetXmitBufLock(ss);
1465
0
        rv = ssl3_FlushHandshake(ss, 0);
1466
0
        ssl_ReleaseXmitBufLock(ss);
1467
0
        ss->ssl3.clientCertRequested = PR_TRUE;
1468
0
    }
1469
1470
0
    ssl_ReleaseSSL3HandshakeLock(ss);
1471
0
    return rv;
1472
0
}
1473
1474
SECStatus
1475
tls13_HandlePostHelloHandshakeMessage(sslSocket *ss, PRUint8 *b, PRUint32 length)
1476
120k
{
1477
120k
    if (ss->sec.isServer && ss->ssl3.hs.zeroRttIgnore != ssl_0rtt_ignore_none) {
1478
30
        SSL_TRC(3, ("%d: TLS13[%d]: successfully decrypted handshake after "
1479
30
                    "failed 0-RTT",
1480
30
                    SSL_GETPID(), ss->fd));
1481
30
        ss->ssl3.hs.zeroRttIgnore = ssl_0rtt_ignore_none;
1482
30
    }
1483
1484
    /* TODO(ekr@rtfm.com): Would it be better to check all the states here? */
1485
120k
    switch (ss->ssl3.hs.msg_type) {
1486
75
        case ssl_hs_certificate:
1487
75
            return tls13_HandleCertificate(ss, b, length, PR_FALSE);
1488
112
        case ssl_hs_compressed_certificate:
1489
112
            return tls13_HandleCertificateDecode(ss, b, length);
1490
14
        case ssl_hs_certificate_request:
1491
14
            return tls13_HandleCertificateRequest(ss, b, length);
1492
1493
13
        case ssl_hs_certificate_verify:
1494
13
            return tls13_HandleCertificateVerify(ss, b, length);
1495
1496
14
        case ssl_hs_encrypted_extensions:
1497
14
            return tls13_HandleEncryptedExtensions(ss, b, length);
1498
1499
10
        case ssl_hs_new_session_ticket:
1500
10
            return tls13_HandleNewSessionTicket(ss, b, length);
1501
1502
575
        case ssl_hs_finished:
1503
575
            if (ss->sec.isServer) {
1504
571
                return tls13_ServerHandleFinished(ss, b, length);
1505
571
            } else {
1506
4
                return tls13_ClientHandleFinished(ss, b, length);
1507
4
            }
1508
1509
12
        case ssl_hs_end_of_early_data:
1510
12
            return tls13_HandleEndOfEarlyData(ss, b, length);
1511
1512
119k
        case ssl_hs_key_update:
1513
119k
            return tls13_HandleKeyUpdate(ss, b, length);
1514
1515
31
        default:
1516
31
            FATAL_ERROR(ss, SSL_ERROR_RX_UNKNOWN_HANDSHAKE, unexpected_message);
1517
31
            return SECFailure;
1518
120k
    }
1519
1520
0
    PORT_Assert(0); /* Unreached */
1521
0
    return SECFailure;
1522
120k
}
1523
1524
static SECStatus
1525
tls13_RecoverWrappedSharedSecret(sslSocket *ss, sslSessionID *sid)
1526
0
{
1527
0
    PK11SymKey *wrapKey; /* wrapping key */
1528
0
    SECItem wrappedMS = { siBuffer, NULL, 0 };
1529
0
    SSLHashType hashType;
1530
1531
0
    SSL_TRC(3, ("%d: TLS13[%d]: recovering static secret (%s)",
1532
0
                SSL_GETPID(), ss->fd, SSL_ROLE(ss)));
1533
1534
    /* Now find the hash used as the PRF for the previous handshake. */
1535
0
    hashType = tls13_GetHashForCipherSuite(sid->u.ssl3.cipherSuite);
1536
1537
    /* If we are the server, we compute the wrapping key, but if we
1538
     * are the client, its coordinates are stored with the ticket. */
1539
0
    if (ss->sec.isServer) {
1540
0
        wrapKey = ssl3_GetWrappingKey(ss, NULL,
1541
0
                                      sid->u.ssl3.masterWrapMech,
1542
0
                                      ss->pkcs11PinArg);
1543
0
    } else {
1544
0
        PK11SlotInfo *slot = SECMOD_LookupSlot(sid->u.ssl3.masterModuleID,
1545
0
                                               sid->u.ssl3.masterSlotID);
1546
0
        if (!slot)
1547
0
            return SECFailure;
1548
1549
0
        wrapKey = PK11_GetWrapKey(slot,
1550
0
                                  sid->u.ssl3.masterWrapIndex,
1551
0
                                  sid->u.ssl3.masterWrapMech,
1552
0
                                  sid->u.ssl3.masterWrapSeries,
1553
0
                                  ss->pkcs11PinArg);
1554
0
        PK11_FreeSlot(slot);
1555
0
    }
1556
0
    if (!wrapKey) {
1557
0
        return SECFailure;
1558
0
    }
1559
1560
0
    wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret;
1561
0
    wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len;
1562
1563
0
    PK11SymKey *unwrappedPsk = ssl_unwrapSymKey(wrapKey, sid->u.ssl3.masterWrapMech,
1564
0
                                                NULL, &wrappedMS, CKM_SSL3_MASTER_KEY_DERIVE,
1565
0
                                                CKA_DERIVE, tls13_GetHashSizeForHash(hashType),
1566
0
                                                CKF_SIGN | CKF_VERIFY, ss->pkcs11PinArg);
1567
0
    PK11_FreeSymKey(wrapKey);
1568
0
    if (!unwrappedPsk) {
1569
0
        return SECFailure;
1570
0
    }
1571
0
    sslPsk *rpsk = tls13_MakePsk(unwrappedPsk, ssl_psk_resume, hashType, NULL);
1572
0
    if (!rpsk) {
1573
0
        PK11_FreeSymKey(unwrappedPsk);
1574
0
        return SECFailure;
1575
0
    }
1576
0
    if (sid->u.ssl3.locked.sessionTicket.flags & ticket_allow_early_data) {
1577
0
        rpsk->maxEarlyData = sid->u.ssl3.locked.sessionTicket.max_early_data_size;
1578
0
        rpsk->zeroRttSuite = sid->u.ssl3.cipherSuite;
1579
0
    }
1580
0
    PRINT_KEY(50, (ss, "Recovered RMS", rpsk->key));
1581
0
    PORT_Assert(PR_CLIST_IS_EMPTY(&ss->ssl3.hs.psks) ||
1582
0
                ((sslPsk *)PR_LIST_HEAD(&ss->ssl3.hs.psks))->type != ssl_psk_resume);
1583
1584
0
    if (ss->sec.isServer) {
1585
        /* In server, we couldn't select the RPSK in the extension handler
1586
         * since it was not unwrapped yet. We're committed now, so select
1587
         * it and add it to the list (to ensure it is freed). */
1588
0
        ss->xtnData.selectedPsk = rpsk;
1589
0
    }
1590
0
    PR_APPEND_LINK(&rpsk->link, &ss->ssl3.hs.psks);
1591
1592
0
    return SECSuccess;
1593
0
}
1594
1595
/* Key Derivation Functions.
1596
 *
1597
 *                 0
1598
 *                 |
1599
 *                 v
1600
 *   PSK ->  HKDF-Extract = Early Secret
1601
 *                 |
1602
 *                 +-----> Derive-Secret(., "ext binder" | "res binder", "")
1603
 *                 |                     = binder_key
1604
 *                 |
1605
 *                 +-----> Derive-Secret(., "c e traffic",
1606
 *                 |                     ClientHello)
1607
 *                 |                     = client_early_traffic_secret
1608
 *                 |
1609
 *                 +-----> Derive-Secret(., "e exp master",
1610
 *                 |                     ClientHello)
1611
 *                 |                     = early_exporter_secret
1612
 *                 v
1613
 *           Derive-Secret(., "derived", "")
1614
 *                 |
1615
 *                 v
1616
 *(EC)DHE -> HKDF-Extract = Handshake Secret
1617
 *                 |
1618
 *                 +-----> Derive-Secret(., "c hs traffic",
1619
 *                 |                     ClientHello...ServerHello)
1620
 *                 |                     = client_handshake_traffic_secret
1621
 *                 |
1622
 *                 +-----> Derive-Secret(., "s hs traffic",
1623
 *                 |                     ClientHello...ServerHello)
1624
 *                 |                     = server_handshake_traffic_secret
1625
 *                 v
1626
 *           Derive-Secret(., "derived", "")
1627
 *                 |
1628
 *                 v
1629
 *      0 -> HKDF-Extract = Master Secret
1630
 *                 |
1631
 *                 +-----> Derive-Secret(., "c ap traffic",
1632
 *                 |                     ClientHello...Server Finished)
1633
 *                 |                     = client_traffic_secret_0
1634
 *                 |
1635
 *                 +-----> Derive-Secret(., "s ap traffic",
1636
 *                 |                     ClientHello...Server Finished)
1637
 *                 |                     = server_traffic_secret_0
1638
 *                 |
1639
 *                 +-----> Derive-Secret(., "exp master",
1640
 *                 |                     ClientHello...Server Finished)
1641
 *                 |                     = exporter_secret
1642
 *                 |
1643
 *                 +-----> Derive-Secret(., "res master",
1644
 *                                       ClientHello...Client Finished)
1645
 *                                       = resumption_master_secret
1646
 *
1647
 */
1648
static SECStatus
1649
tls13_ComputeEarlySecretsWithPsk(sslSocket *ss)
1650
6.74k
{
1651
6.74k
    SECStatus rv;
1652
1653
6.74k
    SSL_TRC(5, ("%d: TLS13[%d]: compute early secrets (%s)",
1654
6.74k
                SSL_GETPID(), ss->fd, SSL_ROLE(ss)));
1655
1656
6.74k
    PORT_Assert(!ss->ssl3.hs.currentSecret);
1657
6.74k
    sslPsk *psk = NULL;
1658
1659
6.74k
    if (ss->sec.isServer) {
1660
0
        psk = ss->xtnData.selectedPsk;
1661
6.74k
    } else {
1662
        /* Client to use the first PSK for early secrets. */
1663
6.74k
        PORT_Assert(!PR_CLIST_IS_EMPTY(&ss->ssl3.hs.psks));
1664
6.74k
        psk = (sslPsk *)PR_LIST_HEAD(&ss->ssl3.hs.psks);
1665
6.74k
    }
1666
6.74k
    PORT_Assert(psk && psk->key);
1667
6.74k
    PORT_Assert(psk->hash != ssl_hash_none);
1668
1669
6.74k
    PK11SymKey *earlySecret = NULL;
1670
6.74k
    rv = tls13_HkdfExtract(NULL, psk->key, psk->hash, &earlySecret);
1671
6.74k
    if (rv != SECSuccess) {
1672
0
        return SECFailure;
1673
0
    }
1674
1675
    /* No longer need the raw input key */
1676
6.74k
    PK11_FreeSymKey(psk->key);
1677
6.74k
    psk->key = NULL;
1678
6.74k
    const char *label = (psk->type == ssl_psk_resume) ? kHkdfLabelResPskBinderKey : kHkdfLabelExtPskBinderKey;
1679
6.74k
    rv = tls13_DeriveSecretNullHash(ss, earlySecret,
1680
6.74k
                                    label, strlen(label),
1681
6.74k
                                    &psk->binderKey, psk->hash);
1682
6.74k
    if (rv != SECSuccess) {
1683
0
        PK11_FreeSymKey(earlySecret);
1684
0
        return SECFailure;
1685
0
    }
1686
6.74k
    ss->ssl3.hs.currentSecret = earlySecret;
1687
1688
6.74k
    return SECSuccess;
1689
6.74k
}
1690
1691
/* This derives the early traffic and early exporter secrets. */
1692
static SECStatus
1693
tls13_DeriveEarlySecrets(sslSocket *ss)
1694
0
{
1695
0
    SECStatus rv;
1696
0
    PORT_Assert(ss->ssl3.hs.currentSecret);
1697
0
    rv = tls13_DeriveSecretWrap(ss, ss->ssl3.hs.currentSecret,
1698
0
                                kHkdfLabelClient,
1699
0
                                kHkdfLabelEarlyTrafficSecret,
1700
0
                                keylogLabelClientEarlyTrafficSecret,
1701
0
                                &ss->ssl3.hs.clientEarlyTrafficSecret);
1702
0
    if (rv != SECSuccess) {
1703
0
        return SECFailure;
1704
0
    }
1705
1706
0
    if (ss->secretCallback) {
1707
0
        ss->secretCallback(ss->fd, (PRUint16)TrafficKeyEarlyApplicationData,
1708
0
                           ss->sec.isServer ? ssl_secret_read : ssl_secret_write,
1709
0
                           ss->ssl3.hs.clientEarlyTrafficSecret,
1710
0
                           ss->secretCallbackArg);
1711
0
    }
1712
1713
0
    rv = tls13_DeriveSecretWrap(ss, ss->ssl3.hs.currentSecret,
1714
0
                                NULL, kHkdfLabelEarlyExporterSecret,
1715
0
                                keylogLabelEarlyExporterSecret,
1716
0
                                &ss->ssl3.hs.earlyExporterSecret);
1717
0
    if (rv != SECSuccess) {
1718
0
        return SECFailure;
1719
0
    }
1720
1721
0
    return SECSuccess;
1722
0
}
1723
1724
static SECStatus
1725
tls13_ComputeHandshakeSecret(sslSocket *ss)
1726
5.01k
{
1727
5.01k
    SECStatus rv;
1728
5.01k
    PK11SymKey *derivedSecret = NULL;
1729
5.01k
    PK11SymKey *newSecret = NULL;
1730
5.01k
    SSL_TRC(5, ("%d: TLS13[%d]: compute handshake secret (%s)",
1731
5.01k
                SSL_GETPID(), ss->fd, SSL_ROLE(ss)));
1732
1733
    /* If no PSK, generate the default early secret. */
1734
5.01k
    if (!ss->ssl3.hs.currentSecret) {
1735
5.00k
        PORT_Assert(!ss->xtnData.selectedPsk);
1736
5.00k
        rv = tls13_HkdfExtract(NULL, NULL,
1737
5.00k
                               tls13_GetHash(ss), &ss->ssl3.hs.currentSecret);
1738
5.00k
        if (rv != SECSuccess) {
1739
0
            return SECFailure;
1740
0
        }
1741
5.00k
    }
1742
5.01k
    PORT_Assert(ss->ssl3.hs.currentSecret);
1743
5.01k
    PORT_Assert(ss->ssl3.hs.dheSecret);
1744
1745
    /* Derive-Secret(., "derived", "") */
1746
5.01k
    rv = tls13_DeriveSecretNullHash(ss, ss->ssl3.hs.currentSecret,
1747
5.01k
                                    kHkdfLabelDerivedSecret,
1748
5.01k
                                    strlen(kHkdfLabelDerivedSecret),
1749
5.01k
                                    &derivedSecret, tls13_GetHash(ss));
1750
5.01k
    if (rv != SECSuccess) {
1751
0
        LOG_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE);
1752
0
        return rv;
1753
0
    }
1754
1755
    /* HKDF-Extract(ECDHE, .) = Handshake Secret */
1756
5.01k
    rv = tls13_HkdfExtract(derivedSecret, ss->ssl3.hs.dheSecret,
1757
5.01k
                           tls13_GetHash(ss), &newSecret);
1758
5.01k
    PK11_FreeSymKey(derivedSecret);
1759
5.01k
    if (rv != SECSuccess) {
1760
0
        LOG_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE);
1761
0
        return rv;
1762
0
    }
1763
1764
5.01k
    PK11_FreeSymKey(ss->ssl3.hs.currentSecret);
1765
5.01k
    ss->ssl3.hs.currentSecret = newSecret;
1766
5.01k
    return SECSuccess;
1767
5.01k
}
1768
1769
static SECStatus
1770
tls13_ComputeHandshakeSecrets(sslSocket *ss)
1771
5.01k
{
1772
5.01k
    SECStatus rv;
1773
5.01k
    PK11SymKey *derivedSecret = NULL;
1774
5.01k
    PK11SymKey *newSecret = NULL;
1775
1776
5.01k
    PK11_FreeSymKey(ss->ssl3.hs.dheSecret);
1777
5.01k
    ss->ssl3.hs.dheSecret = NULL;
1778
1779
5.01k
    SSL_TRC(5, ("%d: TLS13[%d]: compute handshake secrets (%s)",
1780
5.01k
                SSL_GETPID(), ss->fd, SSL_ROLE(ss)));
1781
1782
    /* Now compute |*HsTrafficSecret| */
1783
5.01k
    rv = tls13_DeriveSecretWrap(ss, ss->ssl3.hs.currentSecret,
1784
5.01k
                                kHkdfLabelClient,
1785
5.01k
                                kHkdfLabelHandshakeTrafficSecret,
1786
5.01k
                                keylogLabelClientHsTrafficSecret,
1787
5.01k
                                &ss->ssl3.hs.clientHsTrafficSecret);
1788
5.01k
    if (rv != SECSuccess) {
1789
0
        LOG_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE);
1790
0
        return rv;
1791
0
    }
1792
5.01k
    rv = tls13_DeriveSecretWrap(ss, ss->ssl3.hs.currentSecret,
1793
5.01k
                                kHkdfLabelServer,
1794
5.01k
                                kHkdfLabelHandshakeTrafficSecret,
1795
5.01k
                                keylogLabelServerHsTrafficSecret,
1796
5.01k
                                &ss->ssl3.hs.serverHsTrafficSecret);
1797
5.01k
    if (rv != SECSuccess) {
1798
0
        LOG_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE);
1799
0
        return rv;
1800
0
    }
1801
1802
5.01k
    if (ss->secretCallback) {
1803
0
        SSLSecretDirection dir =
1804
0
            ss->sec.isServer ? ssl_secret_read : ssl_secret_write;
1805
0
        ss->secretCallback(ss->fd, (PRUint16)TrafficKeyHandshake, dir,
1806
0
                           ss->ssl3.hs.clientHsTrafficSecret,
1807
0
                           ss->secretCallbackArg);
1808
0
        dir = ss->sec.isServer ? ssl_secret_write : ssl_secret_read;
1809
0
        ss->secretCallback(ss->fd, (PRUint16)TrafficKeyHandshake, dir,
1810
0
                           ss->ssl3.hs.serverHsTrafficSecret,
1811
0
                           ss->secretCallbackArg);
1812
0
    }
1813
1814
5.01k
    SSL_TRC(5, ("%d: TLS13[%d]: compute master secret (%s)",
1815
5.01k
                SSL_GETPID(), ss->fd, SSL_ROLE(ss)));
1816
1817
    /* Crank HKDF forward to make master secret, which we
1818
     * stuff in current secret. */
1819
5.01k
    rv = tls13_DeriveSecretNullHash(ss, ss->ssl3.hs.currentSecret,
1820
5.01k
                                    kHkdfLabelDerivedSecret,
1821
5.01k
                                    strlen(kHkdfLabelDerivedSecret),
1822
5.01k
                                    &derivedSecret, tls13_GetHash(ss));
1823
5.01k
    if (rv != SECSuccess) {
1824
0
        LOG_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE);
1825
0
        return rv;
1826
0
    }
1827
5.01k
    rv = tls13_HkdfExtract(derivedSecret,
1828
5.01k
                           NULL,
1829
5.01k
                           tls13_GetHash(ss),
1830
5.01k
                           &newSecret);
1831
5.01k
    PK11_FreeSymKey(derivedSecret);
1832
5.01k
    if (rv != SECSuccess) {
1833
0
        LOG_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE);
1834
0
        return SECFailure;
1835
0
    }
1836
5.01k
    PK11_FreeSymKey(ss->ssl3.hs.currentSecret);
1837
5.01k
    ss->ssl3.hs.currentSecret = newSecret;
1838
1839
5.01k
    return SECSuccess;
1840
5.01k
}
1841
1842
static SECStatus
1843
tls13_ComputeApplicationSecrets(sslSocket *ss)
1844
2.71k
{
1845
2.71k
    SECStatus rv;
1846
1847
2.71k
    rv = tls13_DeriveSecretWrap(ss, ss->ssl3.hs.currentSecret,
1848
2.71k
                                kHkdfLabelClient,
1849
2.71k
                                kHkdfLabelApplicationTrafficSecret,
1850
2.71k
                                keylogLabelClientTrafficSecret,
1851
2.71k
                                &ss->ssl3.hs.clientTrafficSecret);
1852
2.71k
    if (rv != SECSuccess) {
1853
0
        return SECFailure;
1854
0
    }
1855
2.71k
    rv = tls13_DeriveSecretWrap(ss, ss->ssl3.hs.currentSecret,
1856
2.71k
                                kHkdfLabelServer,
1857
2.71k
                                kHkdfLabelApplicationTrafficSecret,
1858
2.71k
                                keylogLabelServerTrafficSecret,
1859
2.71k
                                &ss->ssl3.hs.serverTrafficSecret);
1860
2.71k
    if (rv != SECSuccess) {
1861
0
        return SECFailure;
1862
0
    }
1863
1864
2.71k
    if (ss->secretCallback) {
1865
0
        SSLSecretDirection dir =
1866
0
            ss->sec.isServer ? ssl_secret_read : ssl_secret_write;
1867
0
        ss->secretCallback(ss->fd, (PRUint16)TrafficKeyApplicationData,
1868
0
                           dir, ss->ssl3.hs.clientTrafficSecret,
1869
0
                           ss->secretCallbackArg);
1870
0
        dir = ss->sec.isServer ? ssl_secret_write : ssl_secret_read;
1871
0
        ss->secretCallback(ss->fd, (PRUint16)TrafficKeyApplicationData,
1872
0
                           dir, ss->ssl3.hs.serverTrafficSecret,
1873
0
                           ss->secretCallbackArg);
1874
0
    }
1875
1876
2.71k
    rv = tls13_DeriveSecretWrap(ss, ss->ssl3.hs.currentSecret,
1877
2.71k
                                NULL, kHkdfLabelExporterMasterSecret,
1878
2.71k
                                keylogLabelExporterSecret,
1879
2.71k
                                &ss->ssl3.hs.exporterSecret);
1880
2.71k
    if (rv != SECSuccess) {
1881
0
        return SECFailure;
1882
0
    }
1883
1884
2.71k
    return SECSuccess;
1885
2.71k
}
1886
1887
static SECStatus
1888
tls13_ComputeFinalSecrets(sslSocket *ss)
1889
548
{
1890
548
    SECStatus rv;
1891
1892
548
    PORT_Assert(!ss->ssl3.crSpec->masterSecret);
1893
548
    PORT_Assert(!ss->ssl3.cwSpec->masterSecret);
1894
548
    PORT_Assert(ss->ssl3.hs.currentSecret);
1895
548
    rv = tls13_DeriveSecretWrap(ss, ss->ssl3.hs.currentSecret,
1896
548
                                NULL, kHkdfLabelResumptionMasterSecret,
1897
548
                                NULL,
1898
548
                                &ss->ssl3.hs.resumptionMasterSecret);
1899
548
    PK11_FreeSymKey(ss->ssl3.hs.currentSecret);
1900
548
    ss->ssl3.hs.currentSecret = NULL;
1901
548
    if (rv != SECSuccess) {
1902
0
        return SECFailure;
1903
0
    }
1904
1905
548
    return SECSuccess;
1906
548
}
1907
1908
static void
1909
tls13_RestoreCipherInfo(sslSocket *ss, sslSessionID *sid)
1910
0
{
1911
    /* Set these to match the cached value.
1912
     * TODO(ekr@rtfm.com): Make a version with the "true" values.
1913
     * Bug 1256137.
1914
     */
1915
0
    ss->sec.authType = sid->authType;
1916
0
    ss->sec.authKeyBits = sid->authKeyBits;
1917
0
    ss->sec.originalKeaGroup = ssl_LookupNamedGroup(sid->keaGroup);
1918
0
    ss->sec.signatureScheme = sid->sigScheme;
1919
0
}
1920
1921
/* Check whether resumption-PSK is allowed. */
1922
static PRBool
1923
tls13_CanResume(sslSocket *ss, const sslSessionID *sid)
1924
59
{
1925
59
    const sslServerCert *sc;
1926
1927
59
    if (!sid) {
1928
0
        return PR_FALSE;
1929
0
    }
1930
1931
59
    if (sid->version != ss->version) {
1932
34
        return PR_FALSE;
1933
34
    }
1934
1935
25
#ifdef UNSAFE_FUZZER_MODE
1936
    /* When fuzzing, sid could contain garbage that will crash tls13_GetHashForCipherSuite.
1937
     * Do a direct comparison of cipher suites.  This makes us refuse to resume when the
1938
     * protocol allows it, but resumption is discretionary anyway. */
1939
25
    if (sid->u.ssl3.cipherSuite != ss->ssl3.hs.cipher_suite) {
1940
#else
1941
    if (tls13_GetHashForCipherSuite(sid->u.ssl3.cipherSuite) != tls13_GetHashForCipherSuite(ss->ssl3.hs.cipher_suite)) {
1942
#endif
1943
17
        return PR_FALSE;
1944
17
    }
1945
1946
    /* Server sids don't remember the server cert we previously sent, but they
1947
     * do remember the type of certificate we originally used, so we can locate
1948
     * it again, provided that the current ssl socket has had its server certs
1949
     * configured the same as the previous one. */
1950
8
    sc = ssl_FindServerCert(ss, sid->authType, sid->namedCurve);
1951
8
    if (!sc || !sc->serverCert) {
1952
3
        return PR_FALSE;
1953
3
    }
1954
1955
5
    return PR_TRUE;
1956
8
}
1957
1958
static PRBool
1959
tls13_CanNegotiateZeroRtt(sslSocket *ss, const sslSessionID *sid)
1960
357
{
1961
357
    PORT_Assert(ss->ssl3.hs.zeroRttState == ssl_0rtt_sent);
1962
357
    sslPsk *psk = ss->xtnData.selectedPsk;
1963
1964
357
    if (!ss->opt.enable0RttData) {
1965
179
        return PR_FALSE;
1966
179
    }
1967
178
    if (!psk) {
1968
178
        return PR_FALSE;
1969
178
    }
1970
0
    if (psk->zeroRttSuite == TLS_NULL_WITH_NULL_NULL) {
1971
0
        return PR_FALSE;
1972
0
    }
1973
0
    if (!psk->maxEarlyData) {
1974
0
        return PR_FALSE;
1975
0
    }
1976
0
    if (ss->ssl3.hs.cipher_suite != psk->zeroRttSuite) {
1977
0
        return PR_FALSE;
1978
0
    }
1979
0
    if (psk->type == ssl_psk_resume) {
1980
0
        if (!sid) {
1981
0
            return PR_FALSE;
1982
0
        }
1983
0
        PORT_Assert(sid->u.ssl3.locked.sessionTicket.flags & ticket_allow_early_data);
1984
0
        PORT_Assert(ss->statelessResume);
1985
0
        if (!ss->statelessResume) {
1986
0
            return PR_FALSE;
1987
0
        }
1988
0
        if (SECITEM_CompareItem(&ss->xtnData.nextProto,
1989
0
                                &sid->u.ssl3.alpnSelection) != 0) {
1990
0
            return PR_FALSE;
1991
0
        }
1992
0
    } else if (psk->type != ssl_psk_external) {
1993
0
        PORT_Assert(0);
1994
0
        return PR_FALSE;
1995
0
    }
1996
1997
0
    if (tls13_IsReplay(ss, sid)) {
1998
0
        return PR_FALSE;
1999
0
    }
2000
2001
0
    return PR_TRUE;
2002
0
}
2003
2004
/* Called from tls13_HandleClientHelloPart2 to update the state of 0-RTT handling.
2005
 *
2006
 * 0-RTT is only permitted if:
2007
 * 1. The early data extension was present.
2008
 * 2. We are resuming a session.
2009
 * 3. The 0-RTT option is set.
2010
 * 4. The ticket allowed 0-RTT.
2011
 * 5. We negotiated the same ALPN value as in the ticket.
2012
 */
2013
static void
2014
tls13_NegotiateZeroRtt(sslSocket *ss, const sslSessionID *sid)
2015
2.89k
{
2016
2.89k
    SSL_TRC(3, ("%d: TLS13[%d]: negotiate 0-RTT %p",
2017
2.89k
                SSL_GETPID(), ss->fd, sid));
2018
2019
    /* tls13_ServerHandleEarlyDataXtn sets this to ssl_0rtt_sent, so this will
2020
     * be ssl_0rtt_none unless early_data is present. */
2021
2.89k
    if (ss->ssl3.hs.zeroRttState == ssl_0rtt_none) {
2022
2.53k
        return;
2023
2.53k
    }
2024
2025
357
    if (ss->ssl3.hs.zeroRttState == ssl_0rtt_ignored) {
2026
        /* HelloRetryRequest causes 0-RTT to be ignored. On the second
2027
         * ClientHello, reset the ignore state so that decryption failure is
2028
         * handled normally. */
2029
0
        if (ss->ssl3.hs.zeroRttIgnore == ssl_0rtt_ignore_hrr) {
2030
0
            PORT_Assert(ss->ssl3.hs.helloRetry);
2031
0
            ss->ssl3.hs.zeroRttState = ssl_0rtt_none;
2032
0
            ss->ssl3.hs.zeroRttIgnore = ssl_0rtt_ignore_none;
2033
0
        } else {
2034
0
            SSL_TRC(3, ("%d: TLS13[%d]: application ignored 0-RTT",
2035
0
                        SSL_GETPID(), ss->fd));
2036
0
        }
2037
0
        return;
2038
0
    }
2039
2040
357
    if (!tls13_CanNegotiateZeroRtt(ss, sid)) {
2041
357
        SSL_TRC(3, ("%d: TLS13[%d]: ignore 0-RTT", SSL_GETPID(), ss->fd));
2042
357
        ss->ssl3.hs.zeroRttState = ssl_0rtt_ignored;
2043
357
        ss->ssl3.hs.zeroRttIgnore = ssl_0rtt_ignore_trial;
2044
357
        return;
2045
357
    }
2046
2047
0
    SSL_TRC(3, ("%d: TLS13[%d]: enable 0-RTT", SSL_GETPID(), ss->fd));
2048
0
    PORT_Assert(ss->xtnData.selectedPsk);
2049
0
    ss->ssl3.hs.zeroRttState = ssl_0rtt_accepted;
2050
0
    ss->ssl3.hs.zeroRttIgnore = ssl_0rtt_ignore_none;
2051
0
    ss->ssl3.hs.zeroRttSuite = ss->ssl3.hs.cipher_suite;
2052
0
    ss->ssl3.hs.preliminaryInfo |= ssl_preinfo_0rtt_cipher_suite;
2053
0
}
2054
2055
/* Check if the offered group is acceptable. */
2056
static PRBool
2057
tls13_isGroupAcceptable(const sslNamedGroupDef *offered,
2058
                        const sslNamedGroupDef *preferredGroup)
2059
100
{
2060
    /* We accept epsilon (e) bits around the offered group size. */
2061
100
    const unsigned int e = 2;
2062
2063
100
    PORT_Assert(offered);
2064
100
    PORT_Assert(preferredGroup);
2065
2066
100
    if (offered->bits >= preferredGroup->bits - e &&
2067
99
        offered->bits <= preferredGroup->bits + e) {
2068
81
        return PR_TRUE;
2069
81
    }
2070
2071
19
    return PR_FALSE;
2072
100
}
2073
2074
/* Find remote key share for given group and return it.
2075
 * Returns NULL if no key share is found. */
2076
static TLS13KeyShareEntry *
2077
tls13_FindKeyShareEntry(sslSocket *ss, const sslNamedGroupDef *group)
2078
4.05k
{
2079
4.05k
    PRCList *cur_p = PR_NEXT_LINK(&ss->xtnData.remoteKeyShares);
2080
4.68k
    while (cur_p != &ss->xtnData.remoteKeyShares) {
2081
3.56k
        TLS13KeyShareEntry *offer = (TLS13KeyShareEntry *)cur_p;
2082
3.56k
        if (offer->group == group) {
2083
2.93k
            return offer;
2084
2.93k
        }
2085
633
        cur_p = PR_NEXT_LINK(cur_p);
2086
633
    }
2087
1.12k
    return NULL;
2088
4.05k
}
2089
2090
static SECStatus
2091
tls13_NegotiateKeyExchange(sslSocket *ss,
2092
                           const sslNamedGroupDef **requestedGroup,
2093
                           TLS13KeyShareEntry **clientShare)
2094
3.91k
{
2095
3.91k
    unsigned int index;
2096
3.91k
    TLS13KeyShareEntry *entry = NULL;
2097
3.91k
    const sslNamedGroupDef *preferredGroup = NULL;
2098
2099
    /* We insist on DHE. */
2100
3.91k
    if (ssl3_ExtensionNegotiated(ss, ssl_tls13_pre_shared_key_xtn)) {
2101
67
        if (!ssl3_ExtensionNegotiated(ss, ssl_tls13_psk_key_exchange_modes_xtn)) {
2102
22
            FATAL_ERROR(ss, SSL_ERROR_MISSING_PSK_KEY_EXCHANGE_MODES,
2103
22
                        missing_extension);
2104
22
            return SECFailure;
2105
22
        }
2106
        /* Since the server insists on DHE to provide forward secracy, for
2107
         * every other PskKem value but DHE stateless resumption is disabled,
2108
         * this includes other specified and GREASE values. */
2109
45
        if (!memchr(ss->xtnData.psk_ke_modes.data, tls13_psk_dh_ke,
2110
45
                    ss->xtnData.psk_ke_modes.len)) {
2111
38
            SSL_TRC(3, ("%d: TLS13[%d]: client offered PSK without DH",
2112
38
                        SSL_GETPID(), ss->fd));
2113
38
            ss->statelessResume = PR_FALSE;
2114
38
        }
2115
45
    }
2116
2117
    /* Now figure out which key share we like the best out of the
2118
     * mutually supported groups, regardless of what the client offered
2119
     * for key shares.
2120
     */
2121
3.89k
    if (!ssl3_ExtensionNegotiated(ss, ssl_supported_groups_xtn)) {
2122
43
        FATAL_ERROR(ss, SSL_ERROR_MISSING_SUPPORTED_GROUPS_EXTENSION,
2123
43
                    missing_extension);
2124
43
        return SECFailure;
2125
43
    }
2126
2127
3.85k
    SSL_TRC(3, ("%d: TLS13[%d]: selected KE = %s", SSL_GETPID(),
2128
3.85k
                ss->fd, ss->statelessResume || ss->xtnData.selectedPsk ? "PSK + (EC)DHE" : "(EC)DHE"));
2129
2130
    /* Find the preferred group and an according client key share available. */
2131
16.8k
    for (index = 0; index < SSL_NAMED_GROUP_COUNT; ++index) {
2132
        /* Continue to the next group if this one is not enabled. */
2133
16.8k
        if (!ss->namedGroupPreferences[index]) {
2134
            /* There's a gap in the preferred groups list. Assume this is a group
2135
             * that's not supported by the client but preferred by the server. */
2136
12.8k
            if (preferredGroup) {
2137
804
                entry = NULL;
2138
804
                break;
2139
804
            }
2140
12.0k
            continue;
2141
12.8k
        }
2142
2143
        /* Check if the client sent a key share for this group. */
2144
4.05k
        entry = tls13_FindKeyShareEntry(ss, ss->namedGroupPreferences[index]);
2145
2146
4.05k
        if (preferredGroup) {
2147
            /* We already found our preferred group but the group didn't have a share. */
2148
208
            if (entry) {
2149
                /* The client sent a key share with group ss->namedGroupPreferences[index] */
2150
100
                if (tls13_isGroupAcceptable(ss->namedGroupPreferences[index],
2151
100
                                            preferredGroup)) {
2152
                    /* This is not the preferred group, but it's acceptable */
2153
81
                    preferredGroup = ss->namedGroupPreferences[index];
2154
81
                } else {
2155
                    /* The proposed group is not acceptable. */
2156
19
                    entry = NULL;
2157
19
                }
2158
100
            }
2159
208
            break;
2160
3.84k
        } else {
2161
            /* The first enabled group is the preferred group. */
2162
3.84k
            preferredGroup = ss->namedGroupPreferences[index];
2163
3.84k
            if (entry) {
2164
2.83k
                break;
2165
2.83k
            }
2166
3.84k
        }
2167
4.05k
    }
2168
2169
3.85k
    if (!preferredGroup) {
2170
10
        FATAL_ERROR(ss, SSL_ERROR_NO_CYPHER_OVERLAP, handshake_failure);
2171
10
        return SECFailure;
2172
10
    }
2173
3.84k
    SSL_TRC(3, ("%d: TLS13[%d]: group = %d", SSL_GETPID(), ss->fd,
2174
3.84k
                preferredGroup->name));
2175
2176
    /* Either provide a share, or provide a group that should be requested in a
2177
     * HelloRetryRequest, but not both. */
2178
3.84k
    if (entry) {
2179
2.91k
        PORT_Assert(preferredGroup == entry->group);
2180
2.91k
        *clientShare = entry;
2181
2.91k
        *requestedGroup = NULL;
2182
2.91k
    } else {
2183
931
        *clientShare = NULL;
2184
931
        *requestedGroup = preferredGroup;
2185
931
    }
2186
3.84k
    return SECSuccess;
2187
3.85k
}
2188
2189
SECStatus
2190
tls13_SelectServerCert(sslSocket *ss)
2191
2.91k
{
2192
2.91k
    PRCList *cursor;
2193
2.91k
    SECStatus rv;
2194
2195
2.91k
    if (!ssl3_ExtensionNegotiated(ss, ssl_signature_algorithms_xtn)) {
2196
4
        FATAL_ERROR(ss, SSL_ERROR_MISSING_SIGNATURE_ALGORITHMS_EXTENSION,
2197
4
                    missing_extension);
2198
4
        return SECFailure;
2199
4
    }
2200
2201
    /* This picks the first certificate that has:
2202
     * a) the right authentication method, and
2203
     * b) the right named curve (EC only)
2204
     *
2205
     * We might want to do some sort of ranking here later.  For now, it's all
2206
     * based on what order they are configured in. */
2207
2.90k
    for (cursor = PR_NEXT_LINK(&ss->serverCerts);
2208
6.88k
         cursor != &ss->serverCerts;
2209
6.87k
         cursor = PR_NEXT_LINK(cursor)) {
2210
6.87k
        sslServerCert *cert = (sslServerCert *)cursor;
2211
2212
6.87k
        if (SSL_CERT_IS_ONLY(cert, ssl_auth_rsa_decrypt)) {
2213
0
            continue;
2214
0
        }
2215
2216
6.87k
        rv = ssl_PickSignatureScheme(ss,
2217
6.87k
                                     cert->serverCert,
2218
6.87k
                                     cert->serverKeyPair->pubKey,
2219
6.87k
                                     cert->serverKeyPair->privKey,
2220
6.87k
                                     ss->xtnData.sigSchemes,
2221
6.87k
                                     ss->xtnData.numSigSchemes,
2222
6.87k
                                     PR_FALSE,
2223
6.87k
                                     &ss->ssl3.hs.signatureScheme);
2224
6.87k
        if (rv == SECSuccess) {
2225
            /* Found one. */
2226
2.89k
            ss->sec.serverCert = cert;
2227
2228
            /* If we can use a delegated credential (DC) for authentication in
2229
             * the current handshake, then commit to using it now. We'll send a
2230
             * DC as an extension and use the DC private key to sign the
2231
             * handshake.
2232
             *
2233
             * This sets the signature scheme to be the signature scheme
2234
             * indicated by the DC.
2235
             */
2236
2.89k
            rv = tls13_MaybeSetDelegatedCredential(ss);
2237
2.89k
            if (rv != SECSuccess) {
2238
0
                return SECFailure; /* Failure indicates an internal error. */
2239
0
            }
2240
2241
2.89k
            ss->sec.authType = ss->ssl3.hs.kea_def_mutable.authKeyType =
2242
2.89k
                ssl_SignatureSchemeToAuthType(ss->ssl3.hs.signatureScheme);
2243
2.89k
            ss->sec.authKeyBits = cert->serverKeyBits;
2244
2.89k
            return SECSuccess;
2245
2.89k
        }
2246
6.87k
    }
2247
2248
13
    FATAL_ERROR(ss, SSL_ERROR_UNSUPPORTED_SIGNATURE_ALGORITHM,
2249
13
                handshake_failure);
2250
13
    return SECFailure;
2251
2.90k
}
2252
2253
/* Note: |requestedGroup| is non-NULL when we send a key_share extension. */
2254
static SECStatus
2255
tls13_MaybeSendHelloRetry(sslSocket *ss, const sslNamedGroupDef *requestedGroup,
2256
                          PRBool *hrrSent)
2257
3.84k
{
2258
3.84k
    SSLHelloRetryRequestAction action = ssl_hello_retry_accept;
2259
3.84k
    PRUint8 token[256] = { 0 };
2260
3.84k
    unsigned int tokenLen = 0;
2261
3.84k
    SECStatus rv;
2262
2263
3.84k
    if (ss->hrrCallback) {
2264
0
        action = ss->hrrCallback(!ss->ssl3.hs.helloRetry,
2265
0
                                 ss->xtnData.applicationToken.data,
2266
0
                                 ss->xtnData.applicationToken.len,
2267
0
                                 token, &tokenLen, sizeof(token),
2268
0
                                 ss->hrrCallbackArg);
2269
0
    }
2270
2271
    /* These use SSL3_SendAlert directly to avoid an assertion in
2272
     * tls13_FatalError(), which is ordinarily OK. */
2273
3.84k
    if (action == ssl_hello_retry_request && ss->ssl3.hs.helloRetry) {
2274
0
        (void)SSL3_SendAlert(ss, alert_fatal, internal_error);
2275
0
        PORT_SetError(SSL_ERROR_APP_CALLBACK_ERROR);
2276
0
        return SECFailure;
2277
0
    }
2278
2279
3.84k
    if (action != ssl_hello_retry_request && tokenLen) {
2280
0
        (void)SSL3_SendAlert(ss, alert_fatal, internal_error);
2281
0
        PORT_SetError(SSL_ERROR_APP_CALLBACK_ERROR);
2282
0
        return SECFailure;
2283
0
    }
2284
2285
3.84k
    if (tokenLen > sizeof(token)) {
2286
0
        (void)SSL3_SendAlert(ss, alert_fatal, internal_error);
2287
0
        PORT_SetError(SSL_ERROR_APP_CALLBACK_ERROR);
2288
0
        return SECFailure;
2289
0
    }
2290
2291
3.84k
    if (action == ssl_hello_retry_fail) {
2292
0
        FATAL_ERROR(ss, SSL_ERROR_APPLICATION_ABORT, handshake_failure);
2293
0
        return SECFailure;
2294
0
    }
2295
2296
3.84k
    if (action == ssl_hello_retry_reject_0rtt) {
2297
0
        ss->ssl3.hs.zeroRttState = ssl_0rtt_ignored;
2298
0
        ss->ssl3.hs.zeroRttIgnore = ssl_0rtt_ignore_trial;
2299
0
    }
2300
2301
3.84k
    if (!requestedGroup && action != ssl_hello_retry_request) {
2302
2.91k
        return SECSuccess;
2303
2.91k
    }
2304
2305
931
    rv = tls13_SendHelloRetryRequest(ss, requestedGroup, token, tokenLen);
2306
931
    if (rv != SECSuccess) {
2307
0
        return SECFailure; /* Code already set. */
2308
0
    }
2309
2310
    /* We may have received ECH, but have to start over with CH2. */
2311
931
    ss->ssl3.hs.echAccepted = PR_FALSE;
2312
931
    PK11_HPKE_DestroyContext(ss->ssl3.hs.echHpkeCtx, PR_TRUE);
2313
931
    ss->ssl3.hs.echHpkeCtx = NULL;
2314
2315
931
    *hrrSent = PR_TRUE;
2316
931
    return SECSuccess;
2317
931
}
2318
2319
static SECStatus
2320
tls13_NegotiateAuthentication(sslSocket *ss)
2321
2.91k
{
2322
2.91k
    if (ss->statelessResume) {
2323
0
        SSL_TRC(3, ("%d: TLS13[%d]: selected resumption PSK authentication",
2324
0
                    SSL_GETPID(), ss->fd));
2325
0
        ss->ssl3.hs.signatureScheme = ssl_sig_none;
2326
0
        ss->ssl3.hs.kea_def_mutable.authKeyType = ssl_auth_psk;
2327
        /* Overwritten by tls13_RestoreCipherInfo. */
2328
0
        ss->sec.authType = ssl_auth_psk;
2329
0
        return SECSuccess;
2330
2.91k
    } else if (ss->xtnData.selectedPsk) {
2331
        /* If the EPSK doesn't specify a suite, use what was negotiated.
2332
         * Else, only use the EPSK if we negotiated that suite. */
2333
0
        if (ss->xtnData.selectedPsk->zeroRttSuite == TLS_NULL_WITH_NULL_NULL ||
2334
0
            ss->ssl3.hs.cipher_suite == ss->xtnData.selectedPsk->zeroRttSuite) {
2335
0
            SSL_TRC(3, ("%d: TLS13[%d]: selected external PSK authentication",
2336
0
                        SSL_GETPID(), ss->fd));
2337
0
            ss->ssl3.hs.signatureScheme = ssl_sig_none;
2338
0
            ss->ssl3.hs.kea_def_mutable.authKeyType = ssl_auth_psk;
2339
0
            ss->sec.authType = ssl_auth_psk;
2340
0
            return SECSuccess;
2341
0
        }
2342
0
    }
2343
2344
    /* If there were PSKs, they are no longer needed. */
2345
2.91k
    if (ss->xtnData.selectedPsk) {
2346
0
        tls13_DestroyPskList(&ss->ssl3.hs.psks);
2347
0
        ss->xtnData.selectedPsk = NULL;
2348
0
    }
2349
2350
2.91k
    SSL_TRC(3, ("%d: TLS13[%d]: selected certificate authentication",
2351
2.91k
                SSL_GETPID(), ss->fd));
2352
2.91k
    SECStatus rv = tls13_SelectServerCert(ss);
2353
2.91k
    if (rv != SECSuccess) {
2354
17
        return SECFailure;
2355
17
    }
2356
2.89k
    return SECSuccess;
2357
2.91k
}
2358
/* Called from ssl3_HandleClientHello after we have parsed the
2359
 * ClientHello and are sure that we are going to do TLS 1.3
2360
 * or fail. */
2361
SECStatus
2362
tls13_HandleClientHelloPart2(sslSocket *ss,
2363
                             const SECItem *suites,
2364
                             sslSessionID *sid,
2365
                             const PRUint8 *msg,
2366
                             unsigned int len)
2367
4.31k
{
2368
4.31k
    SECStatus rv;
2369
4.31k
    SSL3Statistics *ssl3stats = SSL_GetStatistics();
2370
4.31k
    const sslNamedGroupDef *requestedGroup = NULL;
2371
4.31k
    TLS13KeyShareEntry *clientShare = NULL;
2372
4.31k
    ssl3CipherSuite previousCipherSuite = 0;
2373
4.31k
    const sslNamedGroupDef *previousGroup = NULL;
2374
4.31k
    PRBool hrr = PR_FALSE;
2375
4.31k
    PRBool previousOfferedEch;
2376
2377
    /* If the legacy_version field is set to 0x300 or smaller,
2378
     * reject the connection with protocol_version alert. */
2379
4.31k
    if (ss->clientHelloVersion <= SSL_LIBRARY_VERSION_3_0) {
2380
42
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_CLIENT_HELLO, protocol_version);
2381
42
        goto loser;
2382
42
    }
2383
2384
4.27k
    ss->ssl3.hs.endOfFlight = PR_TRUE;
2385
2386
4.27k
    if (ssl3_ExtensionNegotiated(ss, ssl_tls13_early_data_xtn)) {
2387
551
        ss->ssl3.hs.zeroRttState = ssl_0rtt_sent;
2388
551
    }
2389
2390
    /* Negotiate cipher suite. */
2391
4.27k
    rv = ssl3_NegotiateCipherSuite(ss, suites, PR_FALSE);
2392
4.27k
    if (rv != SECSuccess) {
2393
108
        FATAL_ERROR(ss, PORT_GetError(), handshake_failure);
2394
108
        goto loser;
2395
108
    }
2396
2397
    /* If we are going around again, then we should make sure that the cipher
2398
     * suite selection doesn't change. That's a sign of client shennanigans. */
2399
4.16k
    if (ss->ssl3.hs.helloRetry) {
2400
2401
        /* Update sequence numbers before checking the cookie so that any alerts
2402
         * we generate are sent with the right sequence numbers. */
2403
245
        if (IS_DTLS(ss)) {
2404
            /* Count the first ClientHello and the HelloRetryRequest. */
2405
118
            ss->ssl3.hs.sendMessageSeq = 1;
2406
118
            ss->ssl3.hs.recvMessageSeq = 1;
2407
118
            ssl_GetSpecWriteLock(ss);
2408
            /* Increase the write sequence number.  The read sequence number
2409
             * will be reset after this to early data or handshake. */
2410
118
            ss->ssl3.cwSpec->nextSeqNum = 1;
2411
118
            ssl_ReleaseSpecWriteLock(ss);
2412
118
        }
2413
2414
245
        if (!ssl3_ExtensionNegotiated(ss, ssl_tls13_cookie_xtn) ||
2415
123
            !ss->xtnData.cookie.len) {
2416
123
            FATAL_ERROR(ss, SSL_ERROR_MISSING_COOKIE_EXTENSION,
2417
123
                        missing_extension);
2418
123
            goto loser;
2419
123
        }
2420
122
        PRINT_BUF(50, (ss, "Client sent cookie",
2421
122
                       ss->xtnData.cookie.data, ss->xtnData.cookie.len));
2422
2423
122
        rv = tls13_HandleHrrCookie(ss, ss->xtnData.cookie.data,
2424
122
                                   ss->xtnData.cookie.len,
2425
122
                                   &previousCipherSuite,
2426
122
                                   &previousGroup,
2427
122
                                   &previousOfferedEch, NULL, PR_TRUE);
2428
2429
122
        if (rv != SECSuccess) {
2430
122
            FATAL_ERROR(ss, SSL_ERROR_BAD_2ND_CLIENT_HELLO, illegal_parameter);
2431
122
            goto loser;
2432
122
        }
2433
122
    }
2434
2435
    /* Now merge the ClientHello into the hash state. */
2436
3.91k
    rv = ssl_HashHandshakeMessage(ss, ssl_hs_client_hello, msg, len);
2437
3.91k
    if (rv != SECSuccess) {
2438
0
        FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
2439
0
        goto loser;
2440
0
    }
2441
2442
    /* Now create a synthetic kea_def that we can tweak. */
2443
3.91k
    ss->ssl3.hs.kea_def_mutable = *ss->ssl3.hs.kea_def;
2444
3.91k
    ss->ssl3.hs.kea_def = &ss->ssl3.hs.kea_def_mutable;
2445
2446
    /* Note: We call this quite a bit earlier than with TLS 1.2 and
2447
     * before. */
2448
3.91k
    rv = ssl3_ServerCallSNICallback(ss);
2449
3.91k
    if (rv != SECSuccess) {
2450
0
        goto loser; /* An alert has already been sent. */
2451
0
    }
2452
2453
    /* Check if we could in principle resume. */
2454
3.91k
    if (ss->statelessResume) {
2455
59
        PORT_Assert(sid);
2456
59
        if (!sid) {
2457
0
            FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
2458
0
            return SECFailure;
2459
0
        }
2460
59
        if (!tls13_CanResume(ss, sid)) {
2461
54
            ss->statelessResume = PR_FALSE;
2462
54
        }
2463
59
    }
2464
2465
    /* Select key exchange. */
2466
3.91k
    rv = tls13_NegotiateKeyExchange(ss, &requestedGroup, &clientShare);
2467
3.91k
    if (rv != SECSuccess) {
2468
75
        goto loser;
2469
75
    }
2470
    /* We should get either one of these, but not both. */
2471
3.84k
    PORT_Assert((requestedGroup && !clientShare) ||
2472
3.84k
                (!requestedGroup && clientShare));
2473
2474
    /* After HelloRetryRequest, check consistency of cipher and group. */
2475
3.84k
    if (ss->ssl3.hs.helloRetry) {
2476
0
        PORT_Assert(previousCipherSuite);
2477
0
        if (ss->ssl3.hs.cipher_suite != previousCipherSuite) {
2478
0
            FATAL_ERROR(ss, SSL_ERROR_BAD_2ND_CLIENT_HELLO,
2479
0
                        illegal_parameter);
2480
0
            goto loser;
2481
0
        }
2482
0
        if (!clientShare) {
2483
0
            FATAL_ERROR(ss, SSL_ERROR_BAD_2ND_CLIENT_HELLO,
2484
0
                        illegal_parameter);
2485
0
            goto loser;
2486
0
        }
2487
2488
        /* CH1/CH2 must either both include ECH, or both exclude it. */
2489
0
        if (previousOfferedEch != (ss->xtnData.ech != NULL)) {
2490
0
            FATAL_ERROR(ss, SSL_ERROR_BAD_2ND_CLIENT_HELLO,
2491
0
                        previousOfferedEch ? missing_extension : illegal_parameter);
2492
0
            goto loser;
2493
0
        }
2494
2495
        /* If we requested a new key share, check that the client provided just
2496
         * one of the right type. */
2497
0
        if (previousGroup) {
2498
0
            if (PR_PREV_LINK(&ss->xtnData.remoteKeyShares) !=
2499
0
                PR_NEXT_LINK(&ss->xtnData.remoteKeyShares)) {
2500
0
                FATAL_ERROR(ss, SSL_ERROR_BAD_2ND_CLIENT_HELLO,
2501
0
                            illegal_parameter);
2502
0
                goto loser;
2503
0
            }
2504
0
            if (clientShare->group != previousGroup) {
2505
0
                FATAL_ERROR(ss, SSL_ERROR_BAD_2ND_CLIENT_HELLO,
2506
0
                            illegal_parameter);
2507
0
                goto loser;
2508
0
            }
2509
0
        }
2510
0
    }
2511
2512
3.84k
    rv = tls13_MaybeSendHelloRetry(ss, requestedGroup, &hrr);
2513
3.84k
    if (rv != SECSuccess) {
2514
0
        goto loser;
2515
0
    }
2516
3.84k
    if (hrr) {
2517
931
        if (sid) { /* Free the sid. */
2518
30
            ssl_UncacheSessionID(ss);
2519
30
            ssl_FreeSID(sid);
2520
30
        }
2521
931
        PORT_Assert(ss->ssl3.hs.helloRetry);
2522
931
        return SECSuccess;
2523
931
    }
2524
2525
    /* Select the authentication (this is also handshake shape). */
2526
2.91k
    rv = tls13_NegotiateAuthentication(ss);
2527
2.91k
    if (rv != SECSuccess) {
2528
17
        goto loser;
2529
17
    }
2530
2531
2.89k
    if (ss->sec.authType == ssl_auth_psk) {
2532
0
        if (ss->statelessResume) {
2533
            /* We are now committed to trying to resume. */
2534
0
            PORT_Assert(sid);
2535
            /* Check that the negotiated SNI and the cached SNI match. */
2536
0
            if (SECITEM_CompareItem(&sid->u.ssl3.srvName,
2537
0
                                    &ss->ssl3.hs.srvVirtName) != SECEqual) {
2538
0
                FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_CLIENT_HELLO,
2539
0
                            handshake_failure);
2540
0
                goto loser;
2541
0
            }
2542
2543
0
            ss->sec.serverCert = ssl_FindServerCert(ss, sid->authType,
2544
0
                                                    sid->namedCurve);
2545
0
            PORT_Assert(ss->sec.serverCert);
2546
2547
0
            rv = tls13_RecoverWrappedSharedSecret(ss, sid);
2548
0
            if (rv != SECSuccess) {
2549
0
                SSL_AtomicIncrementLong(&ssl3stats->hch_sid_cache_not_ok);
2550
0
                FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
2551
0
                goto loser;
2552
0
            }
2553
0
            tls13_RestoreCipherInfo(ss, sid);
2554
2555
0
            PORT_Assert(!ss->sec.localCert);
2556
0
            ss->sec.localCert = CERT_DupCertificate(ss->sec.serverCert->serverCert);
2557
0
            if (sid->peerCertDER.data != NULL) {
2558
0
                rv = ssl_SetPeerCertificate(&ss->sec, &sid->peerCertDER);
2559
0
                if (rv != SECSuccess) {
2560
0
                    FATAL_ERROR(ss, PORT_GetError(), internal_error);
2561
0
                    goto loser;
2562
0
                }
2563
0
            }
2564
0
        } else if (sid) {
2565
            /* We should never have a SID in the non-resumption case. */
2566
0
            PORT_Assert(0);
2567
0
            ssl_UncacheSessionID(ss);
2568
0
            ssl_FreeSID(sid);
2569
0
            sid = NULL;
2570
0
        }
2571
0
        ssl3_RegisterExtensionSender(
2572
0
            ss, &ss->xtnData,
2573
0
            ssl_tls13_pre_shared_key_xtn, tls13_ServerSendPreSharedKeyXtn);
2574
0
        tls13_NegotiateZeroRtt(ss, sid);
2575
2576
0
        rv = tls13_ComputeEarlySecretsWithPsk(ss);
2577
0
        if (rv != SECSuccess) {
2578
0
            FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
2579
0
            return SECFailure;
2580
0
        }
2581
2.89k
    } else {
2582
2.89k
        if (sid) { /* we had a sid, but it's no longer valid, free it */
2583
3
            SSL_AtomicIncrementLong(&ssl3stats->hch_sid_cache_not_ok);
2584
3
            ssl_UncacheSessionID(ss);
2585
3
            ssl_FreeSID(sid);
2586
3
            sid = NULL;
2587
3
        }
2588
2.89k
        tls13_NegotiateZeroRtt(ss, NULL);
2589
2.89k
    }
2590
2591
2.89k
    if (ss->statelessResume) {
2592
0
        PORT_Assert(ss->xtnData.selectedPsk);
2593
0
        PORT_Assert(ss->ssl3.hs.kea_def_mutable.authKeyType == ssl_auth_psk);
2594
0
    }
2595
2596
    /* Now that we have the binder key, check the binder. */
2597
2.89k
    if (ss->xtnData.selectedPsk) {
2598
0
        SSL3Hashes hashes;
2599
0
        PORT_Assert(ss->ssl3.hs.messages.len > ss->xtnData.pskBindersLen);
2600
0
        rv = tls13_ComputePskBinderHash(
2601
0
            ss,
2602
0
            ss->ssl3.hs.messages.buf,
2603
0
            ss->ssl3.hs.messages.len - ss->xtnData.pskBindersLen,
2604
0
            &hashes, tls13_GetHash(ss));
2605
0
        if (rv != SECSuccess) {
2606
0
            FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
2607
0
            goto loser;
2608
0
        }
2609
2610
0
        PORT_Assert(ss->xtnData.selectedPsk->hash == tls13_GetHash(ss));
2611
0
        PORT_Assert(ss->ssl3.hs.suite_def);
2612
0
        rv = tls13_VerifyFinished(ss, ssl_hs_client_hello,
2613
0
                                  ss->xtnData.selectedPsk->binderKey,
2614
0
                                  ss->xtnData.pskBinder.data,
2615
0
                                  ss->xtnData.pskBinder.len,
2616
0
                                  &hashes);
2617
0
    }
2618
2.89k
    if (rv != SECSuccess) {
2619
0
        goto loser;
2620
0
    }
2621
2622
    /* This needs to go after we verify the psk binder. */
2623
2.89k
    rv = ssl3_InitHandshakeHashes(ss);
2624
2.89k
    if (rv != SECSuccess) {
2625
0
        goto loser;
2626
0
    }
2627
2628
    /* If this is TLS 1.3 we are expecting a ClientKeyShare
2629
     * extension. Missing/absent extension cause failure
2630
     * below. */
2631
2.89k
    rv = tls13_HandleClientKeyShare(ss, clientShare);
2632
2.89k
    if (rv != SECSuccess) {
2633
182
        goto loser; /* An alert was sent already. */
2634
182
    }
2635
2636
    /* From this point we are either committed to resumption, or not. */
2637
2.71k
    if (ss->statelessResume) {
2638
0
        SSL_AtomicIncrementLong(&ssl3stats->hch_sid_cache_hits);
2639
0
        SSL_AtomicIncrementLong(&ssl3stats->hch_sid_stateless_resumes);
2640
2.71k
    } else {
2641
2.71k
        if (sid) {
2642
            /* We had a sid, but it's no longer valid, free it. */
2643
0
            SSL_AtomicIncrementLong(&ssl3stats->hch_sid_cache_not_ok);
2644
0
            ssl_UncacheSessionID(ss);
2645
0
            ssl_FreeSID(sid);
2646
2.71k
        } else if (!ss->xtnData.selectedPsk) {
2647
2.71k
            SSL_AtomicIncrementLong(&ssl3stats->hch_sid_cache_misses);
2648
2.71k
        }
2649
2650
2.71k
        sid = ssl3_NewSessionID(ss, PR_TRUE);
2651
2.71k
        if (!sid) {
2652
0
            FATAL_ERROR(ss, PORT_GetError(), internal_error);
2653
0
            return SECFailure;
2654
0
        }
2655
2.71k
    }
2656
    /* Take ownership of the session. */
2657
2.71k
    ssl_SetSocketSID(ss, sid);
2658
2.71k
    sid = NULL;
2659
2660
2.71k
    if (ss->ssl3.hs.zeroRttState == ssl_0rtt_accepted) {
2661
0
        rv = tls13_DeriveEarlySecrets(ss);
2662
0
        if (rv != SECSuccess) {
2663
0
            FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
2664
0
            return SECFailure;
2665
0
        }
2666
0
    }
2667
2668
2.71k
    ssl_GetXmitBufLock(ss);
2669
2.71k
    rv = tls13_SendServerHelloSequence(ss);
2670
2.71k
    ssl_ReleaseXmitBufLock(ss);
2671
2.71k
    if (rv != SECSuccess) {
2672
0
        FATAL_ERROR(ss, PORT_GetError(), handshake_failure);
2673
0
        return SECFailure;
2674
0
    }
2675
2676
    /* We're done with PSKs */
2677
2.71k
    tls13_DestroyPskList(&ss->ssl3.hs.psks);
2678
2.71k
    ss->xtnData.selectedPsk = NULL;
2679
2680
2.71k
    return SECSuccess;
2681
2682
669
loser:
2683
669
    if (sid) {
2684
32
        ssl_UncacheSessionID(ss);
2685
32
        ssl_FreeSID(sid);
2686
32
    }
2687
669
    return SECFailure;
2688
2.71k
}
2689
2690
SECStatus
2691
SSLExp_HelloRetryRequestCallback(PRFileDesc *fd,
2692
                                 SSLHelloRetryRequestCallback cb, void *arg)
2693
0
{
2694
0
    sslSocket *ss = ssl_FindSocket(fd);
2695
0
    if (!ss) {
2696
0
        return SECFailure; /* Code already set. */
2697
0
    }
2698
2699
0
    ss->hrrCallback = cb;
2700
0
    ss->hrrCallbackArg = arg;
2701
0
    return SECSuccess;
2702
0
}
2703
2704
/*
2705
 * struct {
2706
 *     ProtocolVersion server_version;
2707
 *     CipherSuite cipher_suite;
2708
 *     Extension extensions<2..2^16-1>;
2709
 * } HelloRetryRequest;
2710
 *
2711
 * Note: this function takes an empty buffer and returns
2712
 * a non-empty one on success, in which case the caller must
2713
 * eventually clean up.
2714
 */
2715
SECStatus
2716
tls13_ConstructHelloRetryRequest(sslSocket *ss,
2717
                                 ssl3CipherSuite cipherSuite,
2718
                                 const sslNamedGroupDef *selectedGroup,
2719
                                 PRUint8 *cookie, unsigned int cookieLen,
2720
                                 const PRUint8 *cookieGreaseEchSignal,
2721
                                 sslBuffer *buffer)
2722
931
{
2723
931
    SECStatus rv;
2724
931
    sslBuffer extensionsBuf = SSL_BUFFER_EMPTY;
2725
931
    PORT_Assert(buffer->len == 0);
2726
2727
    /* Note: cookie is pointing to a stack variable, so is only valid
2728
     * now. */
2729
931
    ss->xtnData.selectedGroup = selectedGroup;
2730
931
    ss->xtnData.cookie.data = cookie;
2731
931
    ss->xtnData.cookie.len = cookieLen;
2732
2733
    /* Set restored ss->ssl3.hs.greaseEchBuf value for ECH HRR extension
2734
     * reconstruction. */
2735
931
    if (cookieGreaseEchSignal) {
2736
0
        PORT_Assert(!ss->ssl3.hs.greaseEchBuf.len);
2737
0
        rv = sslBuffer_Append(&ss->ssl3.hs.greaseEchBuf,
2738
0
                              cookieGreaseEchSignal,
2739
0
                              TLS13_ECH_SIGNAL_LEN);
2740
0
        if (rv != SECSuccess) {
2741
0
            goto loser;
2742
0
        }
2743
0
    }
2744
931
    rv = ssl_ConstructExtensions(ss, &extensionsBuf,
2745
931
                                 ssl_hs_hello_retry_request);
2746
    /* Reset ss->ssl3.hs.greaseEchBuf if it was changed. */
2747
931
    if (cookieGreaseEchSignal) {
2748
0
        sslBuffer_Clear(&ss->ssl3.hs.greaseEchBuf);
2749
0
    }
2750
931
    if (rv != SECSuccess) {
2751
0
        goto loser;
2752
0
    }
2753
    /* These extensions can't be empty. */
2754
931
    PORT_Assert(SSL_BUFFER_LEN(&extensionsBuf) > 0);
2755
2756
    /* Clean up cookie so we're not pointing at random memory. */
2757
931
    ss->xtnData.cookie.data = NULL;
2758
931
    ss->xtnData.cookie.len = 0;
2759
2760
931
    rv = ssl_ConstructServerHello(ss, PR_TRUE, &extensionsBuf, buffer);
2761
931
    if (rv != SECSuccess) {
2762
0
        goto loser;
2763
0
    }
2764
931
    sslBuffer_Clear(&extensionsBuf);
2765
931
    return SECSuccess;
2766
2767
0
loser:
2768
0
    sslBuffer_Clear(&extensionsBuf);
2769
0
    sslBuffer_Clear(buffer);
2770
0
    return SECFailure;
2771
931
}
2772
2773
static SECStatus
2774
tls13_SendHelloRetryRequest(sslSocket *ss,
2775
                            const sslNamedGroupDef *requestedGroup,
2776
                            const PRUint8 *appToken, unsigned int appTokenLen)
2777
931
{
2778
931
    SECStatus rv;
2779
931
    unsigned int cookieLen;
2780
931
    PRUint8 cookie[1024];
2781
931
    sslBuffer messageBuf = SSL_BUFFER_EMPTY;
2782
2783
931
    SSL_TRC(3, ("%d: TLS13[%d]: send hello retry request handshake",
2784
931
                SSL_GETPID(), ss->fd));
2785
2786
931
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
2787
2788
    /* If an ECH backend or shared-mode server accepted ECH when offered,
2789
     * the HRR extension's payload must be set to 8 zero bytes, these are
2790
     * overwritten with the accept_confirmation value after the handshake
2791
     * transcript calculation.
2792
     * If a client-facing or shared-mode server did not accept ECH when offered
2793
     * OR if ECH GREASE is enabled on the server and a ECH extension was
2794
     * received, a 8 byte random value is set as the extension's payload
2795
     * [draft-ietf-tls-esni-14, Section 7].
2796
     *
2797
     * The (temporary) payload is written to the extension in tls13exthandle.c/
2798
     * tls13_ServerSendHrrEchXtn(). */
2799
931
    if (ss->xtnData.ech) {
2800
44
        PRUint8 echGreaseRaw[TLS13_ECH_SIGNAL_LEN] = { 0 };
2801
44
        if (!(ss->ssl3.hs.echAccepted ||
2802
44
              (ss->opt.enableTls13BackendEch &&
2803
33
               ss->xtnData.ech &&
2804
33
               ss->xtnData.ech->receivedInnerXtn))) {
2805
22
            rv = PK11_GenerateRandom(echGreaseRaw, TLS13_ECH_SIGNAL_LEN);
2806
22
            if (rv != SECSuccess) {
2807
0
                return SECFailure;
2808
0
            }
2809
22
            SSL_TRC(100, ("Generated random value for ECH HRR GREASE."));
2810
22
        }
2811
44
        sslBuffer echGreaseBuffer = SSL_BUFFER_EMPTY;
2812
44
        rv = sslBuffer_Append(&echGreaseBuffer, echGreaseRaw, sizeof(echGreaseRaw));
2813
44
        if (rv != SECSuccess) {
2814
0
            return SECFailure;
2815
0
        }
2816
        /* HRR GREASE/accept_confirmation zero bytes placeholder buffer. */
2817
44
        ss->ssl3.hs.greaseEchBuf = echGreaseBuffer;
2818
44
    }
2819
2820
    /* Compute the cookie we are going to need. */
2821
931
    rv = tls13_MakeHrrCookie(ss, requestedGroup,
2822
931
                             appToken, appTokenLen,
2823
931
                             cookie, &cookieLen, sizeof(cookie));
2824
931
    if (rv != SECSuccess) {
2825
0
        FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
2826
0
        return SECFailure;
2827
0
    }
2828
2829
    /* Now build the body of the message. */
2830
931
    rv = tls13_ConstructHelloRetryRequest(ss, ss->ssl3.hs.cipher_suite,
2831
931
                                          requestedGroup,
2832
931
                                          cookie, cookieLen,
2833
931
                                          NULL, &messageBuf);
2834
931
    if (rv != SECSuccess) {
2835
0
        FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
2836
0
        return SECFailure;
2837
0
    }
2838
2839
    /* The ECH HRR signal has been written to the message and preserved in the
2840
     * cookie, from which it is restored when reconstructing the transcript on
2841
     * the second ClientHello. Clear the transient buffer so that reconstruction
2842
     * starts from an empty state. */
2843
931
    sslBuffer_Clear(&ss->ssl3.hs.greaseEchBuf);
2844
2845
    /* And send it. */
2846
931
    ssl_GetXmitBufLock(ss);
2847
931
    rv = ssl3_AppendHandshakeHeader(ss, ssl_hs_server_hello,
2848
931
                                    SSL_BUFFER_LEN(&messageBuf));
2849
931
    if (rv != SECSuccess) {
2850
0
        goto loser;
2851
0
    }
2852
931
    rv = ssl3_AppendBufferToHandshake(ss, &messageBuf);
2853
931
    if (rv != SECSuccess) {
2854
0
        goto loser;
2855
0
    }
2856
931
    sslBuffer_Clear(&messageBuf); /* Done with messageBuf */
2857
2858
931
    if (ss->ssl3.hs.fakeSid.len) {
2859
27
        PRInt32 sent;
2860
2861
27
        PORT_Assert(!IS_DTLS(ss));
2862
27
        rv = ssl3_SendChangeCipherSpecsInt(ss);
2863
27
        if (rv != SECSuccess) {
2864
0
            goto loser;
2865
0
        }
2866
        /* ssl3_SendChangeCipherSpecsInt() only flushes to the output buffer, so we
2867
         * have to force a send. */
2868
27
        sent = ssl_SendSavedWriteData(ss);
2869
27
        if (sent < 0 && PORT_GetError() != PR_WOULD_BLOCK_ERROR) {
2870
0
            PORT_SetError(SSL_ERROR_SOCKET_WRITE_FAILURE);
2871
0
            goto loser;
2872
0
        }
2873
904
    } else {
2874
904
        rv = ssl3_FlushHandshake(ss, 0);
2875
904
        if (rv != SECSuccess) {
2876
0
            goto loser; /* error code set by ssl3_FlushHandshake */
2877
0
        }
2878
904
    }
2879
2880
    /* We depend on this being exactly one record and one message. */
2881
931
    PORT_Assert(!IS_DTLS(ss) || (ss->ssl3.hs.sendMessageSeq == 1 &&
2882
931
                                 ss->ssl3.cwSpec->nextSeqNum == 1));
2883
931
    ssl_ReleaseXmitBufLock(ss);
2884
2885
931
    ss->ssl3.hs.helloRetry = PR_TRUE;
2886
2887
    /* We received early data but have to ignore it because we sent a retry. */
2888
931
    if (ss->ssl3.hs.zeroRttState == ssl_0rtt_sent) {
2889
184
        ss->ssl3.hs.zeroRttState = ssl_0rtt_ignored;
2890
184
        ss->ssl3.hs.zeroRttIgnore = ssl_0rtt_ignore_hrr;
2891
184
    }
2892
2893
931
    return SECSuccess;
2894
2895
0
loser:
2896
0
    sslBuffer_Clear(&messageBuf);
2897
0
    ssl_ReleaseXmitBufLock(ss);
2898
0
    return SECFailure;
2899
931
}
2900
2901
/* Called from tls13_HandleClientHello.
2902
 *
2903
 * Caller must hold Handshake and RecvBuf locks.
2904
 */
2905
2906
static SECStatus
2907
tls13_HandleClientKeyShare(sslSocket *ss, TLS13KeyShareEntry *peerShare)
2908
2.89k
{
2909
2.89k
    SECStatus rv;
2910
2.89k
    sslEphemeralKeyPair *keyPair; /* ours */
2911
2.89k
    SECItem *ciphertext = NULL;
2912
2.89k
    PK11SymKey *dheSecret = NULL;
2913
2.89k
    PK11SymKey *kemSecret = NULL;
2914
2915
2.89k
    SSL_TRC(3, ("%d: TLS13[%d]: handle client_key_share handshake",
2916
2.89k
                SSL_GETPID(), ss->fd));
2917
2918
2.89k
    PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss));
2919
2.89k
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
2920
2.89k
    PORT_Assert(peerShare);
2921
2922
2.89k
    tls13_SetKeyExchangeType(ss, peerShare->group);
2923
2924
    /* Generate our key */
2925
2.89k
    rv = tls13_AddKeyShare(ss, peerShare->group);
2926
2.89k
    if (rv != SECSuccess) {
2927
34
        return rv;
2928
34
    }
2929
2930
    /* We should have exactly one key share. */
2931
2.86k
    PORT_Assert(!PR_CLIST_IS_EMPTY(&ss->ephemeralKeyPairs));
2932
2.86k
    PORT_Assert(PR_PREV_LINK(&ss->ephemeralKeyPairs) ==
2933
2.86k
                PR_NEXT_LINK(&ss->ephemeralKeyPairs));
2934
2935
2.86k
    keyPair = ((sslEphemeralKeyPair *)PR_NEXT_LINK(&ss->ephemeralKeyPairs));
2936
    /* A standalone KEM share has no ECDH `keys`; report the group's strength. */
2937
2.86k
    ss->sec.keaKeyBits =
2938
2.86k
        keyPair->keys ? SECKEY_PublicKeyStrengthInBits(keyPair->keys->pubKey)
2939
2.86k
                      : keyPair->group->bits;
2940
2941
    /* Register the sender */
2942
2.86k
    rv = ssl3_RegisterExtensionSender(ss, &ss->xtnData, ssl_tls13_key_share_xtn,
2943
2.86k
                                      tls13_ServerSendKeyShareXtn);
2944
2.86k
    if (rv != SECSuccess) {
2945
0
        return SECFailure; /* Error code set already. */
2946
0
    }
2947
2948
2.86k
    SSLKEAType keaType = peerShare->group->keaType;
2949
2950
    /* ECDH/DH component: present for everything except a standalone KEM. */
2951
2.86k
    if (keaType != ssl_kea_kem) {
2952
2.86k
        rv = tls13_HandleKeyShare(ss, peerShare, keyPair->keys,
2953
2.86k
                                  tls13_GetHash(ss), &dheSecret);
2954
2.86k
        if (rv != SECSuccess) {
2955
59
            goto loser; /* Error code already set. */
2956
59
        }
2957
2.86k
    }
2958
2959
    /* KEM component: present for a standalone KEM and the ECDH + KEM hybrids.
2960
     * As the server we encapsulate to the peer's key, yielding the ciphertext
2961
     * to send back in our key share. */
2962
2.80k
    if (keaType == ssl_kea_kem || keaType == ssl_kea_ecdh_hybrid) {
2963
666
        rv = tls13_HandleKEMKey(ss, peerShare, &kemSecret, &ciphertext);
2964
666
        if (rv != SECSuccess) {
2965
89
            goto loser; /* Error set by tls13_HandleKEMKey */
2966
89
        }
2967
577
        keyPair->kemCt = ciphertext;
2968
577
        ciphertext = NULL; /* ownership transferred to keyPair->kemCt */
2969
577
    }
2970
2971
2.71k
    ss->ssl3.hs.dheSecret =
2972
2.71k
        tls13_CombineKeyShareSecrets(peerShare->group, dheSecret, kemSecret);
2973
2.71k
    if (!ss->ssl3.hs.dheSecret) {
2974
0
        goto loser; /* Error set by tls13_CombineKeyShareSecrets */
2975
0
    }
2976
2977
2.71k
    PK11_FreeSymKey(dheSecret);
2978
2.71k
    PK11_FreeSymKey(kemSecret);
2979
2.71k
    return SECSuccess;
2980
2981
148
loser:
2982
148
    SECITEM_FreeItem(ciphertext, PR_TRUE);
2983
148
    PK11_FreeSymKey(dheSecret);
2984
148
    PK11_FreeSymKey(kemSecret);
2985
148
    FATAL_ERROR(ss, PORT_GetError(), illegal_parameter);
2986
148
    return SECFailure;
2987
2.71k
}
2988
2989
/*
2990
 *     [draft-ietf-tls-tls13-11] Section 6.3.3.2
2991
 *
2992
 *     opaque DistinguishedName<1..2^16-1>;
2993
 *
2994
 *     struct {
2995
 *         opaque certificate_extension_oid<1..2^8-1>;
2996
 *         opaque certificate_extension_values<0..2^16-1>;
2997
 *     } CertificateExtension;
2998
 *
2999
 *     struct {
3000
 *         opaque certificate_request_context<0..2^8-1>;
3001
 *         SignatureAndHashAlgorithm
3002
 *           supported_signature_algorithms<2..2^16-2>;
3003
 *         DistinguishedName certificate_authorities<0..2^16-1>;
3004
 *         CertificateExtension certificate_extensions<0..2^16-1>;
3005
 *     } CertificateRequest;
3006
 */
3007
static SECStatus
3008
tls13_SendCertificateRequest(sslSocket *ss)
3009
1.26k
{
3010
1.26k
    SECStatus rv;
3011
1.26k
    sslBuffer extensionBuf = SSL_BUFFER_EMPTY;
3012
1.26k
    unsigned int offset = 0;
3013
3014
1.26k
    SSL_TRC(3, ("%d: TLS13[%d]: begin send certificate_request",
3015
1.26k
                SSL_GETPID(), ss->fd));
3016
3017
1.26k
    if (ss->firstHsDone) {
3018
0
        PORT_Assert(ss->ssl3.hs.shaPostHandshake == NULL);
3019
0
        ss->ssl3.hs.shaPostHandshake = PK11_CloneContext(ss->ssl3.hs.sha);
3020
0
        if (ss->ssl3.hs.shaPostHandshake == NULL) {
3021
0
            ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
3022
0
            return SECFailure;
3023
0
        }
3024
0
    }
3025
3026
1.26k
    rv = ssl_ConstructExtensions(ss, &extensionBuf, ssl_hs_certificate_request);
3027
1.26k
    if (rv != SECSuccess) {
3028
0
        return SECFailure; /* Code already set. */
3029
0
    }
3030
    /* We should always have at least one of these. */
3031
1.26k
    PORT_Assert(SSL_BUFFER_LEN(&extensionBuf) > 0);
3032
3033
    /* Create a new request context for post-handshake authentication */
3034
1.26k
    if (ss->firstHsDone) {
3035
0
        PRUint8 context[16];
3036
0
        SECItem contextItem = { siBuffer, context, sizeof(context) };
3037
3038
0
        rv = PK11_GenerateRandom(context, sizeof(context));
3039
0
        if (rv != SECSuccess) {
3040
0
            goto loser;
3041
0
        }
3042
3043
0
        SECITEM_FreeItem(&ss->xtnData.certReqContext, PR_FALSE);
3044
0
        rv = SECITEM_CopyItem(NULL, &ss->xtnData.certReqContext, &contextItem);
3045
0
        if (rv != SECSuccess) {
3046
0
            FATAL_ERROR(ss, SEC_ERROR_NO_MEMORY, internal_error);
3047
0
            goto loser;
3048
0
        }
3049
3050
0
        offset = SSL_BUFFER_LEN(&ss->sec.ci.sendBuf);
3051
0
    }
3052
3053
1.26k
    rv = ssl3_AppendHandshakeHeader(ss, ssl_hs_certificate_request,
3054
1.26k
                                    1 + /* request context length */
3055
1.26k
                                        ss->xtnData.certReqContext.len +
3056
1.26k
                                        2 + /* extension length */
3057
1.26k
                                        SSL_BUFFER_LEN(&extensionBuf));
3058
1.26k
    if (rv != SECSuccess) {
3059
0
        goto loser; /* err set by AppendHandshake. */
3060
0
    }
3061
3062
    /* Context. */
3063
1.26k
    rv = ssl3_AppendHandshakeVariable(ss, ss->xtnData.certReqContext.data,
3064
1.26k
                                      ss->xtnData.certReqContext.len, 1);
3065
1.26k
    if (rv != SECSuccess) {
3066
0
        goto loser; /* err set by AppendHandshake. */
3067
0
    }
3068
    /* Extensions. */
3069
1.26k
    rv = ssl3_AppendBufferToHandshakeVariable(ss, &extensionBuf, 2);
3070
1.26k
    if (rv != SECSuccess) {
3071
0
        goto loser; /* err set by AppendHandshake. */
3072
0
    }
3073
3074
1.26k
    if (ss->firstHsDone) {
3075
0
        rv = ssl3_UpdatePostHandshakeHashes(ss,
3076
0
                                            SSL_BUFFER_BASE(&ss->sec.ci.sendBuf) + offset,
3077
0
                                            SSL_BUFFER_LEN(&ss->sec.ci.sendBuf) - offset);
3078
0
        if (rv != SECSuccess) {
3079
0
            goto loser;
3080
0
        }
3081
0
    }
3082
3083
1.26k
    sslBuffer_Clear(&extensionBuf);
3084
1.26k
    return SECSuccess;
3085
3086
0
loser:
3087
0
    sslBuffer_Clear(&extensionBuf);
3088
0
    return SECFailure;
3089
1.26k
}
3090
3091
/* [draft-ietf-tls-tls13; S 4.4.1] says:
3092
 *
3093
 *     Transcript-Hash(ClientHello1, HelloRetryRequest, ... MN) =
3094
 *      Hash(message_hash ||        // Handshake type
3095
 *           00 00 Hash.length ||   // Handshake message length
3096
 *           Hash(ClientHello1) ||  // Hash of ClientHello1
3097
 *           HelloRetryRequest ... MN)
3098
 *
3099
 *  For an ECH handshake, the process occurs for the outer
3100
 *  transcript in |ss->ssl3.hs.messages| and the inner
3101
 *  transcript in |ss->ssl3.hs.echInnerMessages|.
3102
 */
3103
static SECStatus
3104
tls13_ReinjectHandshakeTranscript(sslSocket *ss)
3105
2.89k
{
3106
2.89k
    SSL3Hashes hashes = { 0 };
3107
2.89k
    SSL3Hashes echInnerHashes = { 0 };
3108
2.89k
    SECStatus rv;
3109
3110
    /* First compute the hash. */
3111
2.89k
    rv = tls13_ComputeHash(ss, &hashes,
3112
2.89k
                           ss->ssl3.hs.messages.buf,
3113
2.89k
                           ss->ssl3.hs.messages.len,
3114
2.89k
                           tls13_GetHash(ss));
3115
2.89k
    if (rv != SECSuccess) {
3116
0
        return SECFailure;
3117
0
    }
3118
3119
2.89k
    if (ss->ssl3.hs.echHpkeCtx) {
3120
674
        rv = tls13_ComputeHash(ss, &echInnerHashes,
3121
674
                               ss->ssl3.hs.echInnerMessages.buf,
3122
674
                               ss->ssl3.hs.echInnerMessages.len,
3123
674
                               tls13_GetHash(ss));
3124
674
        if (rv != SECSuccess) {
3125
0
            return SECFailure;
3126
0
        }
3127
674
    }
3128
3129
2.89k
    ssl3_RestartHandshakeHashes(ss);
3130
3131
    /* Reinject the message. The Default context variant updates
3132
     * the default hash state. Use it for both non-ECH and ECH Outer. */
3133
2.89k
    rv = ssl_HashHandshakeMessageDefault(ss, ssl_hs_message_hash,
3134
2.89k
                                         hashes.u.raw, hashes.len);
3135
2.89k
    if (rv != SECSuccess) {
3136
0
        return SECFailure;
3137
0
    }
3138
3139
2.89k
    if (ss->ssl3.hs.echHpkeCtx) {
3140
674
        rv = ssl_HashHandshakeMessageEchInner(ss, ssl_hs_message_hash,
3141
674
                                              echInnerHashes.u.raw,
3142
674
                                              echInnerHashes.len);
3143
674
        if (rv != SECSuccess) {
3144
0
            return SECFailure;
3145
0
        }
3146
674
    }
3147
3148
2.89k
    return SECSuccess;
3149
2.89k
}
3150
static unsigned int
3151
ssl_ListCount(PRCList *list)
3152
2.93k
{
3153
2.93k
    unsigned int c = 0;
3154
2.93k
    PRCList *cur;
3155
8.98k
    for (cur = PR_NEXT_LINK(list); cur != list; cur = PR_NEXT_LINK(cur)) {
3156
6.04k
        ++c;
3157
6.04k
    }
3158
2.93k
    return c;
3159
2.93k
}
3160
3161
/*
3162
 * savedMsg contains the HelloRetryRequest message. When its extensions are parsed
3163
 * in ssl3_HandleParsedExtensions, the handler for ECH HRR extensions (tls13_ClientHandleHrrEchXtn)
3164
 * will take a reference into the message buffer.
3165
 *
3166
 * This reference is then used in tls13_MaybeHandleEchSignal in order to compute
3167
 * the transcript for the ECH signal calculation. This was felt to be preferable
3168
 * to re-parsing the HelloRetryRequest message in order to create the transcript.
3169
 *
3170
 * Consequently, savedMsg should not be moved or mutated between these
3171
 * function calls.
3172
 */
3173
SECStatus
3174
tls13_HandleHelloRetryRequest(sslSocket *ss, const PRUint8 *savedMsg,
3175
                              PRUint32 savedLength)
3176
2.93k
{
3177
2.93k
    SECStatus rv;
3178
3179
2.93k
    SSL_TRC(3, ("%d: TLS13[%d]: handle hello retry request",
3180
2.93k
                SSL_GETPID(), ss->fd));
3181
3182
2.93k
    PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss));
3183
2.93k
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
3184
3185
2.93k
    if (ss->vrange.max < SSL_LIBRARY_VERSION_TLS_1_3) {
3186
0
        FATAL_ERROR(ss, SSL_ERROR_RX_UNEXPECTED_HELLO_RETRY_REQUEST,
3187
0
                    unexpected_message);
3188
0
        return SECFailure;
3189
0
    }
3190
2.93k
    PORT_Assert(ss->ssl3.hs.ws == wait_server_hello);
3191
3192
2.93k
    if (ss->ssl3.hs.zeroRttState == ssl_0rtt_sent) {
3193
0
        ss->ssl3.hs.zeroRttState = ssl_0rtt_ignored;
3194
        /* Restore the null cipher spec for writing. */
3195
0
        ssl_GetSpecWriteLock(ss);
3196
0
        ssl_CipherSpecRelease(ss->ssl3.cwSpec);
3197
0
        ss->ssl3.cwSpec = ssl_FindCipherSpecByEpoch(ss, ssl_secret_write,
3198
0
                                                    TrafficKeyClearText);
3199
0
        PORT_Assert(ss->ssl3.cwSpec);
3200
0
        ssl_ReleaseSpecWriteLock(ss);
3201
2.93k
    } else {
3202
2.93k
        PORT_Assert(ss->ssl3.hs.zeroRttState == ssl_0rtt_none);
3203
2.93k
    }
3204
    /* Set the spec version, because we want to send CH now with 0303 */
3205
2.93k
    tls13_SetSpecRecordVersion(ss, ss->ssl3.cwSpec);
3206
3207
    /* Extensions must contain more than just supported_versions.  This will
3208
     * ensure that a HelloRetryRequest isn't a no-op: we must have at least two
3209
     * extensions, supported_versions plus one other.  That other must be one
3210
     * that we understand and recognize as being valid for HelloRetryRequest,
3211
     * and should alter our next Client Hello. */
3212
2.93k
    unsigned int requiredExtensions = 1;
3213
    /* The ECH HRR extension is a no-op from the client's perspective. */
3214
2.93k
    if (ss->xtnData.ech) {
3215
0
        requiredExtensions++;
3216
0
    }
3217
2.93k
    if (ssl_ListCount(&ss->ssl3.hs.remoteExtensions) <= requiredExtensions) {
3218
4
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_HELLO_RETRY_REQUEST,
3219
4
                    decode_error);
3220
4
        return SECFailure;
3221
4
    }
3222
3223
2.93k
    rv = ssl3_HandleParsedExtensions(ss, ssl_hs_hello_retry_request);
3224
2.93k
    ssl3_DestroyRemoteExtensions(&ss->ssl3.hs.remoteExtensions);
3225
2.93k
    if (rv != SECSuccess) {
3226
38
        SECITEM_FreeItem(&ss->ssl3.hs.cookie, PR_FALSE);
3227
38
        return SECFailure; /* Error code set below */
3228
38
    }
3229
2.89k
    rv = tls13_MaybeHandleEchSignal(ss, savedMsg, savedLength, PR_TRUE);
3230
2.89k
    if (rv != SECSuccess) {
3231
0
        return SECFailure;
3232
0
    }
3233
2.89k
    ss->ssl3.hs.helloRetry = PR_TRUE;
3234
2.89k
    rv = tls13_ReinjectHandshakeTranscript(ss);
3235
2.89k
    if (rv != SECSuccess) {
3236
0
        return rv;
3237
0
    }
3238
3239
2.89k
    rv = ssl_HashHandshakeMessage(ss, ssl_hs_server_hello,
3240
2.89k
                                  savedMsg, savedLength);
3241
2.89k
    if (rv != SECSuccess) {
3242
0
        return SECFailure;
3243
0
    }
3244
3245
2.89k
    ssl_GetXmitBufLock(ss);
3246
2.89k
    if (ss->opt.enableTls13CompatMode && !IS_DTLS(ss) &&
3247
10
        ss->ssl3.hs.zeroRttState == ssl_0rtt_none) {
3248
10
        rv = ssl3_SendChangeCipherSpecsInt(ss);
3249
10
        if (rv != SECSuccess) {
3250
0
            goto loser;
3251
0
        }
3252
10
    }
3253
3254
2.89k
    rv = ssl3_SendClientHello(ss, client_hello_retry);
3255
2.89k
    if (rv != SECSuccess) {
3256
0
        goto loser;
3257
0
    }
3258
3259
2.89k
    ssl_ReleaseXmitBufLock(ss);
3260
2.89k
    SECITEM_FreeItem(&ss->ssl3.hs.cookie, PR_FALSE);
3261
2.89k
    return SECSuccess;
3262
3263
0
loser:
3264
0
    ssl_ReleaseXmitBufLock(ss);
3265
0
    SECITEM_FreeItem(&ss->ssl3.hs.cookie, PR_FALSE);
3266
0
    return SECFailure;
3267
2.89k
}
3268
3269
static SECStatus
3270
tls13_SendPostHandshakeCertificate(sslSocket *ss)
3271
0
{
3272
0
    SECStatus rv;
3273
0
    if (ss->ssl3.hs.restartTarget) {
3274
0
        PR_NOT_REACHED("unexpected ss->ssl3.hs.restartTarget");
3275
0
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
3276
0
        return SECFailure;
3277
0
    }
3278
3279
0
    if (ss->ssl3.hs.clientCertificatePending) {
3280
0
        SSL_TRC(3, ("%d: TLS13[%d]: deferring tls13_SendClientSecondFlight because"
3281
0
                    " certificate authentication is still pending.",
3282
0
                    SSL_GETPID(), ss->fd));
3283
0
        ss->ssl3.hs.restartTarget = tls13_SendPostHandshakeCertificate;
3284
0
        PORT_SetError(PR_WOULD_BLOCK_ERROR);
3285
0
        return SECFailure;
3286
0
    }
3287
3288
0
    ssl_GetXmitBufLock(ss);
3289
0
    rv = tls13_SendClientSecondFlight(ss);
3290
0
    ssl_ReleaseXmitBufLock(ss);
3291
0
    PORT_Assert(ss->ssl3.hs.ws == idle_handshake);
3292
0
    PORT_Assert(ss->ssl3.hs.shaPostHandshake != NULL);
3293
0
    PK11_DestroyContext(ss->ssl3.hs.shaPostHandshake, PR_TRUE);
3294
0
    ss->ssl3.hs.shaPostHandshake = NULL;
3295
0
    if (rv != SECSuccess) {
3296
0
        return SECFailure;
3297
0
    }
3298
0
    return rv;
3299
0
}
3300
3301
static SECStatus
3302
tls13_HandleCertificateRequest(sslSocket *ss, PRUint8 *b, PRUint32 length)
3303
14
{
3304
14
    SECStatus rv;
3305
14
    SECItem context = { siBuffer, NULL, 0 };
3306
14
    SECItem extensionsData = { siBuffer, NULL, 0 };
3307
3308
14
    SSL_TRC(3, ("%d: TLS13[%d]: handle certificate_request sequence",
3309
14
                SSL_GETPID(), ss->fd));
3310
3311
14
    PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss));
3312
14
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
3313
3314
    /* CertificateRequest is sent by servers; a server must never receive one. */
3315
14
    if (ss->sec.isServer) {
3316
9
        FATAL_ERROR(ss, SSL_ERROR_RX_UNEXPECTED_CERT_REQUEST, unexpected_message);
3317
9
        return SECFailure;
3318
9
    }
3319
3320
    /* Client */
3321
    /* Post-handshake authentication is never negotiated for DTLS: the client
3322
     * does not send the post_handshake_auth extension (see
3323
     * tls13_ClientSendPostHandshakeAuthXtn), so a CertificateRequest is only
3324
     * acceptable in idle_handshake for stream TLS. */
3325
5
    if (ss->opt.enablePostHandshakeAuth && !IS_DTLS(ss)) {
3326
1
        rv = TLS13_CHECK_HS_STATE(ss, SSL_ERROR_RX_UNEXPECTED_CERT_REQUEST,
3327
1
                                  wait_cert_request, idle_handshake);
3328
4
    } else {
3329
4
        rv = TLS13_CHECK_HS_STATE(ss, SSL_ERROR_RX_UNEXPECTED_CERT_REQUEST,
3330
4
                                  wait_cert_request);
3331
4
    }
3332
5
    if (rv != SECSuccess) {
3333
5
        return SECFailure;
3334
5
    }
3335
3336
    /*  MUST NOT combine external PSKs with certificate authentication. */
3337
0
    if (ss->sec.authType == ssl_auth_psk) {
3338
0
        FATAL_ERROR(ss, SSL_ERROR_RX_UNEXPECTED_CERT_REQUEST, unexpected_message);
3339
0
        return SECFailure;
3340
0
    }
3341
3342
0
    if (tls13_IsPostHandshake(ss)) {
3343
0
        PORT_Assert(ss->ssl3.hs.shaPostHandshake == NULL);
3344
0
        ss->ssl3.hs.shaPostHandshake = PK11_CloneContext(ss->ssl3.hs.sha);
3345
0
        if (ss->ssl3.hs.shaPostHandshake == NULL) {
3346
0
            ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
3347
0
            return SECFailure;
3348
0
        }
3349
0
        rv = ssl_HashPostHandshakeMessage(ss, ssl_hs_certificate_request, b, length);
3350
0
        if (rv != SECSuccess) {
3351
0
            FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
3352
0
            return SECFailure;
3353
0
        }
3354
3355
        /* clean up anything left from previous handshake. */
3356
0
        if (ss->ssl3.clientCertChain != NULL) {
3357
0
            CERT_DestroyCertificateList(ss->ssl3.clientCertChain);
3358
0
            ss->ssl3.clientCertChain = NULL;
3359
0
        }
3360
0
        if (ss->ssl3.clientCertificate != NULL) {
3361
0
            CERT_DestroyCertificate(ss->ssl3.clientCertificate);
3362
0
            ss->ssl3.clientCertificate = NULL;
3363
0
        }
3364
0
        if (ss->ssl3.clientPrivateKey != NULL) {
3365
0
            SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey);
3366
0
            ss->ssl3.clientPrivateKey = NULL;
3367
0
        }
3368
0
        if (ss->ssl3.hs.clientAuthSignatureSchemes != NULL) {
3369
0
            PORT_Free(ss->ssl3.hs.clientAuthSignatureSchemes);
3370
0
            ss->ssl3.hs.clientAuthSignatureSchemes = NULL;
3371
0
            ss->ssl3.hs.clientAuthSignatureSchemesLen = 0;
3372
0
        }
3373
0
        SECITEM_FreeItem(&ss->xtnData.certReqContext, PR_FALSE);
3374
0
        ss->xtnData.certReqContext.data = NULL;
3375
0
    } else {
3376
0
        PORT_Assert(ss->ssl3.clientCertChain == NULL);
3377
0
        PORT_Assert(ss->ssl3.clientCertificate == NULL);
3378
0
        PORT_Assert(ss->ssl3.clientPrivateKey == NULL);
3379
0
        PORT_Assert(ss->ssl3.hs.clientAuthSignatureSchemes == NULL);
3380
0
        PORT_Assert(ss->ssl3.hs.clientAuthSignatureSchemesLen == 0);
3381
0
        PORT_Assert(!ss->ssl3.hs.clientCertRequested);
3382
0
        PORT_Assert(ss->xtnData.certReqContext.data == NULL);
3383
0
    }
3384
3385
0
    rv = ssl3_ConsumeHandshakeVariable(ss, &context, 1, &b, &length);
3386
0
    if (rv != SECSuccess) {
3387
0
        return SECFailure;
3388
0
    }
3389
3390
    /* Unless it is a post-handshake client auth, the certificate
3391
     * request context must be empty. */
3392
0
    if (!tls13_IsPostHandshake(ss) && context.len > 0) {
3393
0
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_CERT_REQUEST, illegal_parameter);
3394
0
        return SECFailure;
3395
0
    }
3396
3397
0
    rv = ssl3_ConsumeHandshakeVariable(ss, &extensionsData, 2, &b, &length);
3398
0
    if (rv != SECSuccess) {
3399
0
        return SECFailure;
3400
0
    }
3401
3402
0
    if (length) {
3403
0
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_CERT_REQUEST, decode_error);
3404
0
        return SECFailure;
3405
0
    }
3406
3407
    /* Process all the extensions. */
3408
0
    rv = ssl3_HandleExtensions(ss, &extensionsData.data, &extensionsData.len,
3409
0
                               ssl_hs_certificate_request);
3410
0
    if (rv != SECSuccess) {
3411
0
        return SECFailure;
3412
0
    }
3413
3414
0
    if (!ss->xtnData.numSigSchemes) {
3415
0
        FATAL_ERROR(ss, SSL_ERROR_MISSING_SIGNATURE_ALGORITHMS_EXTENSION,
3416
0
                    missing_extension);
3417
0
        return SECFailure;
3418
0
    }
3419
3420
0
    rv = SECITEM_CopyItem(NULL, &ss->xtnData.certReqContext, &context);
3421
0
    if (rv != SECSuccess) {
3422
0
        return SECFailure;
3423
0
    }
3424
3425
0
    ss->ssl3.hs.clientCertRequested = PR_TRUE;
3426
3427
0
    if (ss->firstHsDone) {
3428
3429
        /* Request a client certificate. */
3430
0
        rv = ssl3_BeginHandleCertificateRequest(
3431
0
            ss, ss->xtnData.sigSchemes, ss->xtnData.numSigSchemes,
3432
0
            &ss->xtnData.certReqAuthorities);
3433
0
        if (rv != SECSuccess) {
3434
0
            FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
3435
0
            return rv;
3436
0
        }
3437
0
        rv = tls13_SendPostHandshakeCertificate(ss);
3438
0
        if (rv != SECSuccess) {
3439
0
            return rv; /* error code is set. */
3440
0
        }
3441
0
    } else {
3442
0
        TLS13_SET_HS_STATE(ss, wait_server_cert);
3443
0
    }
3444
0
    return SECSuccess;
3445
0
}
3446
3447
PRBool
3448
tls13_ShouldRequestClientAuth(sslSocket *ss)
3449
6.54k
{
3450
    /* Even if we are configured to request a certificate, we can't
3451
     * if this handshake used a PSK, even when we are resuming. */
3452
6.54k
    return ss->opt.requestCertificate &&
3453
2.54k
           ss->ssl3.hs.kea_def->authKeyType != ssl_auth_psk;
3454
6.54k
}
3455
3456
static SECStatus
3457
tls13_SendEncryptedServerSequence(sslSocket *ss)
3458
2.71k
{
3459
2.71k
    SECStatus rv;
3460
3461
2.71k
    rv = tls13_ComputeHandshakeSecrets(ss);
3462
2.71k
    if (rv != SECSuccess) {
3463
0
        return SECFailure; /* error code is set. */
3464
0
    }
3465
3466
2.71k
    rv = tls13_SetCipherSpec(ss, TrafficKeyHandshake,
3467
2.71k
                             ssl_secret_write, PR_FALSE);
3468
2.71k
    if (rv != SECSuccess) {
3469
0
        LOG_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE);
3470
0
        return SECFailure;
3471
0
    }
3472
3473
2.71k
    if (ss->ssl3.hs.zeroRttState == ssl_0rtt_accepted) {
3474
0
        rv = ssl3_RegisterExtensionSender(ss, &ss->xtnData,
3475
0
                                          ssl_tls13_early_data_xtn,
3476
0
                                          ssl_SendEmptyExtension);
3477
0
        if (rv != SECSuccess) {
3478
0
            return SECFailure; /* Error code set already. */
3479
0
        }
3480
0
    }
3481
3482
2.71k
    rv = tls13_SendEncryptedExtensions(ss);
3483
2.71k
    if (rv != SECSuccess) {
3484
0
        return SECFailure; /* error code is set. */
3485
0
    }
3486
3487
2.71k
    if (tls13_ShouldRequestClientAuth(ss)) {
3488
1.26k
        rv = tls13_SendCertificateRequest(ss);
3489
1.26k
        if (rv != SECSuccess) {
3490
0
            return SECFailure; /* error code is set. */
3491
0
        }
3492
1.26k
    }
3493
2.71k
    if (ss->ssl3.hs.signatureScheme != ssl_sig_none) {
3494
2.71k
        SECKEYPrivateKey *svrPrivKey;
3495
3496
2.71k
        rv = tls13_SendCertificate(ss);
3497
2.71k
        if (rv != SECSuccess) {
3498
0
            return SECFailure; /* error code is set. */
3499
0
        }
3500
3501
2.71k
        if (tls13_IsSigningWithDelegatedCredential(ss)) {
3502
0
            SSL_TRC(3, ("%d: TLS13[%d]: Signing with delegated credential",
3503
0
                        SSL_GETPID(), ss->fd));
3504
0
            svrPrivKey = ss->sec.serverCert->delegCredKeyPair->privKey;
3505
2.71k
        } else {
3506
2.71k
            svrPrivKey = ss->sec.serverCert->serverKeyPair->privKey;
3507
2.71k
        }
3508
3509
2.71k
        rv = tls13_SendCertificateVerify(ss, svrPrivKey);
3510
2.71k
        if (rv != SECSuccess) {
3511
0
            return SECFailure; /* err code is set. */
3512
0
        }
3513
2.71k
    }
3514
3515
2.71k
    rv = tls13_SendFinished(ss, ss->ssl3.hs.serverHsTrafficSecret);
3516
2.71k
    if (rv != SECSuccess) {
3517
0
        return SECFailure; /* error code is set. */
3518
0
    }
3519
3520
2.71k
    return SECSuccess;
3521
2.71k
}
3522
3523
/* Called from:  ssl3_HandleClientHello */
3524
static SECStatus
3525
tls13_SendServerHelloSequence(sslSocket *ss)
3526
2.71k
{
3527
2.71k
    SECStatus rv;
3528
2.71k
    PRErrorCode err = 0;
3529
3530
2.71k
    SSL_TRC(3, ("%d: TLS13[%d]: begin send server_hello sequence",
3531
2.71k
                SSL_GETPID(), ss->fd));
3532
3533
2.71k
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
3534
2.71k
    PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss));
3535
3536
2.71k
    rv = ssl3_RegisterExtensionSender(ss, &ss->xtnData,
3537
2.71k
                                      ssl_tls13_supported_versions_xtn,
3538
2.71k
                                      tls13_ServerSendSupportedVersionsXtn);
3539
2.71k
    if (rv != SECSuccess) {
3540
0
        return SECFailure;
3541
0
    }
3542
3543
2.71k
    rv = tls13_ComputeHandshakeSecret(ss);
3544
2.71k
    if (rv != SECSuccess) {
3545
0
        return SECFailure; /* error code is set. */
3546
0
    }
3547
3548
2.71k
    rv = ssl3_SendServerHello(ss);
3549
2.71k
    if (rv != SECSuccess) {
3550
0
        return rv; /* err code is set. */
3551
0
    }
3552
3553
2.71k
    if (ss->ssl3.hs.fakeSid.len) {
3554
62
        PORT_Assert(!IS_DTLS(ss));
3555
62
        SECITEM_FreeItem(&ss->ssl3.hs.fakeSid, PR_FALSE);
3556
62
        if (!ss->ssl3.hs.helloRetry) {
3557
62
            rv = ssl3_SendChangeCipherSpecsInt(ss);
3558
62
            if (rv != SECSuccess) {
3559
0
                return rv;
3560
0
            }
3561
62
        }
3562
62
    }
3563
3564
2.71k
    rv = tls13_SendEncryptedServerSequence(ss);
3565
2.71k
    if (rv != SECSuccess) {
3566
0
        err = PORT_GetError();
3567
0
    }
3568
    /* Even if we get an error, since the ServerHello was successfully
3569
     * serialized, we should give it a chance to reach the network.  This gives
3570
     * the client a chance to perform the key exchange and decrypt the alert
3571
     * we're about to send. */
3572
2.71k
    rv |= ssl3_FlushHandshake(ss, 0);
3573
2.71k
    if (rv != SECSuccess) {
3574
0
        if (err) {
3575
0
            PORT_SetError(err);
3576
0
        }
3577
0
        return SECFailure;
3578
0
    }
3579
3580
    /* Compute the rest of the secrets except for the resumption
3581
     * and exporter secret. */
3582
2.71k
    rv = tls13_ComputeApplicationSecrets(ss);
3583
2.71k
    if (rv != SECSuccess) {
3584
0
        LOG_ERROR(ss, PORT_GetError());
3585
0
        return SECFailure;
3586
0
    }
3587
3588
2.71k
    rv = tls13_SetCipherSpec(ss, TrafficKeyApplicationData,
3589
2.71k
                             ssl_secret_write, PR_FALSE);
3590
2.71k
    if (rv != SECSuccess) {
3591
0
        LOG_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE);
3592
0
        return SECFailure;
3593
0
    }
3594
3595
2.71k
    if (IS_DTLS(ss)) {
3596
        /* We need this for reading ACKs. */
3597
1.23k
        ssl_CipherSpecAddRef(ss->ssl3.crSpec);
3598
1.23k
    }
3599
2.71k
    if (ss->ssl3.hs.zeroRttState == ssl_0rtt_accepted) {
3600
0
        rv = tls13_SetCipherSpec(ss, TrafficKeyEarlyApplicationData,
3601
0
                                 ssl_secret_read, PR_TRUE);
3602
0
        if (rv != SECSuccess) {
3603
0
            LOG_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE);
3604
0
            return SECFailure;
3605
0
        }
3606
0
        TLS13_SET_HS_STATE(ss, wait_end_of_early_data);
3607
2.71k
    } else {
3608
2.71k
        PORT_Assert(ss->ssl3.hs.zeroRttState == ssl_0rtt_none ||
3609
2.71k
                    ss->ssl3.hs.zeroRttState == ssl_0rtt_ignored);
3610
3611
2.71k
        rv = tls13_SetCipherSpec(ss,
3612
2.71k
                                 TrafficKeyHandshake,
3613
2.71k
                                 ssl_secret_read, PR_FALSE);
3614
2.71k
        if (rv != SECSuccess) {
3615
0
            LOG_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE);
3616
0
            return SECFailure;
3617
0
        }
3618
2.71k
        if (tls13_ShouldRequestClientAuth(ss)) {
3619
1.26k
            TLS13_SET_HS_STATE(ss, wait_client_cert);
3620
1.44k
        } else {
3621
1.44k
            TLS13_SET_HS_STATE(ss, wait_finished);
3622
1.44k
        }
3623
2.71k
    }
3624
3625
    /* Here we set a baseline value for our RTT estimation.
3626
     * This value is updated when we get a response from the client. */
3627
2.71k
    ss->ssl3.hs.rttEstimate = ssl_Time(ss);
3628
2.71k
    return SECSuccess;
3629
2.71k
}
3630
3631
SECStatus
3632
tls13_HandleServerHelloPart2(sslSocket *ss, const PRUint8 *savedMsg, PRUint32 savedLength)
3633
2.52k
{
3634
2.52k
    SECStatus rv;
3635
2.52k
    sslSessionID *sid = ss->sec.ci.sid;
3636
2.52k
    SSL3Statistics *ssl3stats = SSL_GetStatistics();
3637
3638
2.52k
    if (ssl3_ExtensionNegotiated(ss, ssl_tls13_pre_shared_key_xtn)) {
3639
14
        PORT_Assert(!PR_CLIST_IS_EMPTY(&ss->ssl3.hs.psks));
3640
14
        PORT_Assert(ss->xtnData.selectedPsk);
3641
3642
14
        if (ss->xtnData.selectedPsk->type != ssl_psk_resume) {
3643
14
            ss->statelessResume = PR_FALSE;
3644
14
        }
3645
2.50k
    } else {
3646
        /* We may have offered a PSK. If the server didn't negotiate
3647
         * it, clear this state to re-extract the Early Secret. */
3648
2.50k
        if (ss->ssl3.hs.currentSecret) {
3649
            /* We might have dropped incompatible PSKs on HRR
3650
             * (see RFC8466, Section 4.1.4). */
3651
1.34k
            PORT_Assert(ss->ssl3.hs.helloRetry ||
3652
1.34k
                        ssl3_ExtensionAdvertised(ss, ssl_tls13_pre_shared_key_xtn));
3653
1.34k
            PK11_FreeSymKey(ss->ssl3.hs.currentSecret);
3654
1.34k
            ss->ssl3.hs.currentSecret = NULL;
3655
1.34k
        }
3656
2.50k
        ss->statelessResume = PR_FALSE;
3657
2.50k
        ss->xtnData.selectedPsk = NULL;
3658
2.50k
    }
3659
3660
2.52k
    if (ss->statelessResume) {
3661
0
        PORT_Assert(sid->version >= SSL_LIBRARY_VERSION_TLS_1_3);
3662
0
        if (tls13_GetHash(ss) !=
3663
0
            tls13_GetHashForCipherSuite(sid->u.ssl3.cipherSuite)) {
3664
0
            FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_SERVER_HELLO,
3665
0
                        illegal_parameter);
3666
0
            return SECFailure;
3667
0
        }
3668
0
    }
3669
3670
    /* Now create a synthetic kea_def that we can tweak. */
3671
2.52k
    ss->ssl3.hs.kea_def_mutable = *ss->ssl3.hs.kea_def;
3672
2.52k
    ss->ssl3.hs.kea_def = &ss->ssl3.hs.kea_def_mutable;
3673
3674
2.52k
    if (ss->xtnData.selectedPsk) {
3675
14
        ss->ssl3.hs.kea_def_mutable.authKeyType = ssl_auth_psk;
3676
14
        if (ss->statelessResume) {
3677
0
            tls13_RestoreCipherInfo(ss, sid);
3678
0
            if (sid->peerCertDER.data) {
3679
0
                rv = ssl_SetPeerCertificate(&ss->sec, &sid->peerCertDER);
3680
0
                if (rv != SECSuccess) {
3681
0
                    FATAL_ERROR(ss, PORT_GetError(), internal_error);
3682
0
                    return SECFailure;
3683
0
                }
3684
0
            }
3685
3686
0
            SSL_AtomicIncrementLong(&ssl3stats->hsh_sid_cache_hits);
3687
0
            SSL_AtomicIncrementLong(&ssl3stats->hsh_sid_stateless_resumes);
3688
14
        } else {
3689
14
            ss->sec.authType = ssl_auth_psk;
3690
14
        }
3691
2.50k
    } else {
3692
2.50k
        if (ss->statelessResume &&
3693
0
            ssl3_ExtensionAdvertised(ss, ssl_tls13_pre_shared_key_xtn)) {
3694
0
            SSL_AtomicIncrementLong(&ssl3stats->hsh_sid_cache_misses);
3695
0
        }
3696
2.50k
        if (sid->cached == in_client_cache) {
3697
            /* If we tried to resume and failed, let's not try again. */
3698
0
            ssl_UncacheSessionID(ss);
3699
0
        }
3700
2.50k
    }
3701
3702
    /* Discard current SID and make a new one, though it may eventually
3703
     * end up looking a lot like the old one.
3704
     */
3705
2.52k
    sid = ssl3_NewSessionID(ss, PR_FALSE);
3706
2.52k
    ssl_SetSocketSID(ss, sid); /* releases the old sid */
3707
2.52k
    if (sid == NULL) {
3708
0
        FATAL_ERROR(ss, PORT_GetError(), internal_error);
3709
0
        return SECFailure;
3710
0
    }
3711
2.52k
    if (ss->statelessResume) {
3712
0
        PORT_Assert(ss->sec.peerCertDER.data);
3713
0
        rv = SECITEM_CopyItem(NULL, &sid->peerCertDER, &ss->sec.peerCertDER);
3714
0
        if (rv != SECSuccess) {
3715
0
            FATAL_ERROR(ss, SEC_ERROR_NO_MEMORY, internal_error);
3716
0
            return SECFailure;
3717
0
        }
3718
0
    }
3719
2.52k
    sid->version = ss->version;
3720
3721
2.52k
    rv = tls13_HandleServerKeyShare(ss);
3722
2.52k
    if (rv != SECSuccess) {
3723
224
        return SECFailure;
3724
224
    }
3725
3726
2.29k
    rv = tls13_ComputeHandshakeSecret(ss);
3727
2.29k
    if (rv != SECSuccess) {
3728
0
        return SECFailure; /* error code is set. */
3729
0
    }
3730
3731
2.29k
    rv = tls13_MaybeHandleEchSignal(ss, savedMsg, savedLength, PR_FALSE);
3732
2.29k
    if (rv != SECSuccess) {
3733
0
        return SECFailure; /* error code is set. */
3734
0
    }
3735
3736
2.29k
    rv = tls13_ComputeHandshakeSecrets(ss);
3737
2.29k
    if (rv != SECSuccess) {
3738
0
        return SECFailure; /* error code is set. */
3739
0
    }
3740
3741
2.29k
    if (ss->ssl3.hs.zeroRttState == ssl_0rtt_sent) {
3742
        /* When we send 0-RTT, we saved the null spec in case we needed it to
3743
         * send another ClientHello in response to a HelloRetryRequest.  Now
3744
         * that we won't be receiving a HelloRetryRequest, release the spec. */
3745
0
        ssl_CipherSpecReleaseByEpoch(ss, ssl_secret_write, TrafficKeyClearText);
3746
0
    }
3747
3748
2.29k
    rv = tls13_SetCipherSpec(ss, TrafficKeyHandshake,
3749
2.29k
                             ssl_secret_read, PR_FALSE);
3750
2.29k
    if (rv != SECSuccess) {
3751
0
        FATAL_ERROR(ss, SSL_ERROR_INIT_CIPHER_SUITE_FAILURE, internal_error);
3752
0
        return SECFailure;
3753
0
    }
3754
2.29k
    TLS13_SET_HS_STATE(ss, wait_encrypted_extensions);
3755
3756
2.29k
    return SECSuccess;
3757
2.29k
}
3758
3759
static void
3760
tls13_SetKeyExchangeType(sslSocket *ss, const sslNamedGroupDef *group)
3761
5.19k
{
3762
5.19k
    ss->sec.keaGroup = group;
3763
5.19k
    switch (group->keaType) {
3764
        /* Note: These overwrite on resumption.... so if you start with ECDH
3765
         * and resume with DH, we report DH. That's fine, since no answer
3766
         * is really right. */
3767
2.16k
        case ssl_kea_ecdh:
3768
2.16k
            ss->ssl3.hs.kea_def_mutable.exchKeyType =
3769
2.16k
                ss->statelessResume ? ssl_kea_ecdh_psk : ssl_kea_ecdh;
3770
2.16k
            ss->sec.keaType = ssl_kea_ecdh;
3771
2.16k
            break;
3772
784
        case ssl_kea_ecdh_hybrid:
3773
784
            ss->ssl3.hs.kea_def_mutable.exchKeyType =
3774
784
                ss->statelessResume ? ssl_kea_ecdh_hybrid_psk : ssl_kea_ecdh_hybrid;
3775
784
            ss->sec.keaType = ssl_kea_ecdh_hybrid;
3776
784
            break;
3777
0
        case ssl_kea_kem:
3778
0
            ss->ssl3.hs.kea_def_mutable.exchKeyType =
3779
0
                ss->statelessResume ? ssl_kea_kem_psk : ssl_kea_kem;
3780
0
            ss->sec.keaType = ssl_kea_kem;
3781
0
            break;
3782
2.24k
        case ssl_kea_dh:
3783
2.24k
            ss->ssl3.hs.kea_def_mutable.exchKeyType =
3784
2.24k
                ss->statelessResume ? ssl_kea_dh_psk : ssl_kea_dh;
3785
2.24k
            ss->sec.keaType = ssl_kea_dh;
3786
2.24k
            break;
3787
0
        default:
3788
0
            PORT_Assert(0);
3789
5.19k
    }
3790
5.19k
}
3791
3792
/*
3793
 * Called from ssl3_HandleServerHello.
3794
 *
3795
 * Caller must hold Handshake and RecvBuf locks.
3796
 */
3797
static SECStatus
3798
tls13_HandleServerKeyShare(sslSocket *ss)
3799
2.52k
{
3800
2.52k
    SECStatus rv;
3801
2.52k
    TLS13KeyShareEntry *entry;
3802
2.52k
    sslEphemeralKeyPair *keyPair;
3803
2.52k
    PK11SymKey *dheSecret = NULL;
3804
2.52k
    PK11SymKey *kemSecret = NULL;
3805
3806
2.52k
    SSL_TRC(3, ("%d: TLS13[%d]: handle server_key_share handshake",
3807
2.52k
                SSL_GETPID(), ss->fd));
3808
2.52k
    PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss));
3809
2.52k
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
3810
3811
    /* This list should have one entry. */
3812
2.52k
    if (PR_CLIST_IS_EMPTY(&ss->xtnData.remoteKeyShares)) {
3813
41
        FATAL_ERROR(ss, SSL_ERROR_MISSING_KEY_SHARE, missing_extension);
3814
41
        return SECFailure;
3815
41
    }
3816
3817
2.48k
    entry = (TLS13KeyShareEntry *)PR_NEXT_LINK(&ss->xtnData.remoteKeyShares);
3818
2.48k
    PORT_Assert(PR_NEXT_LINK(&entry->link) == &ss->xtnData.remoteKeyShares);
3819
3820
    /* Now get our matching key. */
3821
2.48k
    keyPair = ssl_LookupEphemeralKeyPair(ss, entry->group);
3822
2.48k
    if (!keyPair) {
3823
15
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_KEY_SHARE, illegal_parameter);
3824
15
        return SECFailure;
3825
15
    }
3826
3827
2.46k
    PORT_Assert(ssl_NamedGroupEnabled(ss, entry->group));
3828
3829
2.46k
    SSLKEAType keaType = entry->group->keaType;
3830
3831
    /* ECDH/DH component: present for everything except a standalone KEM. */
3832
2.46k
    if (keaType != ssl_kea_kem) {
3833
2.46k
        rv = tls13_HandleKeyShare(ss, entry, keyPair->keys,
3834
2.46k
                                  tls13_GetHash(ss), &dheSecret);
3835
2.46k
        if (rv != SECSuccess) {
3836
146
            goto loser; /* Error code already set. */
3837
146
        }
3838
2.46k
    }
3839
3840
    /* KEM component: present for a standalone KEM and the ECDH + KEM hybrids.
3841
     * As the client we decapsulate the server's ciphertext. */
3842
2.32k
    if (keaType == ssl_kea_kem || keaType == ssl_kea_ecdh_hybrid) {
3843
131
        rv = tls13_HandleKEMCiphertext(ss, entry, keyPair->kemKeys, &kemSecret);
3844
131
        if (rv != SECSuccess) {
3845
22
            goto loser; /* Error set by tls13_HandleKEMCiphertext */
3846
22
        }
3847
131
    }
3848
3849
2.29k
    ss->ssl3.hs.dheSecret =
3850
2.29k
        tls13_CombineKeyShareSecrets(entry->group, dheSecret, kemSecret);
3851
2.29k
    if (!ss->ssl3.hs.dheSecret) {
3852
0
        goto loser; /* Error set by tls13_CombineKeyShareSecrets */
3853
0
    }
3854
2.29k
    PK11_FreeSymKey(dheSecret);
3855
2.29k
    PK11_FreeSymKey(kemSecret);
3856
3857
2.29k
    tls13_SetKeyExchangeType(ss, entry->group);
3858
    /* A standalone KEM share has no ECDH `keys`; report the group's strength. */
3859
2.29k
    ss->sec.keaKeyBits =
3860
2.29k
        keyPair->keys ? SECKEY_PublicKeyStrengthInBits(keyPair->keys->pubKey)
3861
2.29k
                      : entry->group->bits;
3862
3863
2.29k
    return SECSuccess;
3864
3865
168
loser:
3866
168
    PK11_FreeSymKey(dheSecret);
3867
168
    PK11_FreeSymKey(kemSecret);
3868
168
    FATAL_ERROR(ss, PORT_GetError(), illegal_parameter);
3869
168
    return SECFailure;
3870
2.29k
}
3871
3872
static PRBool
3873
tls13_FindCompressionAlgAndCheckIfSupportsEncoding(sslSocket *ss)
3874
6
{
3875
6
    PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss));
3876
6
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
3877
3878
6
    for (int j = 0; j < ss->ssl3.supportedCertCompressionAlgorithmsCount; j++) {
3879
6
        if (ss->ssl3.supportedCertCompressionAlgorithms[j].id == ss->xtnData.compressionAlg) {
3880
6
            if (ss->ssl3.supportedCertCompressionAlgorithms[j].encode != NULL) {
3881
6
                return PR_TRUE;
3882
6
            }
3883
0
            return PR_FALSE;
3884
6
        }
3885
6
    }
3886
3887
0
    return PR_FALSE;
3888
6
}
3889
3890
static SECStatus
3891
tls13_FindCompressionAlgAndEncodeCertificate(
3892
    sslSocket *ss, SECItem *certificateToEncode, SECItem *encodedCertificate)
3893
6
{
3894
6
    PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss));
3895
6
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
3896
3897
6
    SECStatus rv = SECFailure;
3898
6
    for (int j = 0; j < ss->ssl3.supportedCertCompressionAlgorithmsCount; j++) {
3899
6
        if (ss->ssl3.supportedCertCompressionAlgorithms[j].id == ss->xtnData.compressionAlg &&
3900
6
            ss->ssl3.supportedCertCompressionAlgorithms[j].encode != NULL) {
3901
6
            rv = ss->ssl3.supportedCertCompressionAlgorithms[j].encode(
3902
6
                certificateToEncode, encodedCertificate);
3903
6
            return rv;
3904
6
        }
3905
6
    }
3906
3907
0
    PORT_SetError(SEC_ERROR_CERTIFICATE_COMPRESSION_ALGORITHM_NOT_SUPPORTED);
3908
0
    return SECFailure;
3909
6
}
3910
3911
static SECStatus
3912
tls13_SendCompressedCertificate(sslSocket *ss, sslBuffer *bufferCertificate)
3913
6
{
3914
    /* TLS Certificate Compression. RFC 8879 */
3915
    /* As the encoding function takes as input a SECItem,
3916
     * we convert bufferCertificate to certificateToEncode.
3917
     *
3918
     * encodedCertificate is used to store the certificate
3919
     * after encoding.
3920
     */
3921
6
    SECItem encodedCertificate = { siBuffer, NULL, 0 };
3922
6
    SECItem certificateToEncode = { siBuffer, NULL, 0 };
3923
6
    SECStatus rv = SECFailure;
3924
3925
6
    PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss));
3926
6
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
3927
3928
6
    SSL_TRC(30, ("%d: TLS13[%d]: %s is encoding the certificate using the %s compression algorithm",
3929
6
                 SSL_GETPID(), ss->fd, SSL_ROLE(ss),
3930
6
                 ssl3_mapCertificateCompressionAlgorithmToName(ss, ss->xtnData.compressionAlg)));
3931
3932
6
    PRINT_BUF(50, (NULL, "The certificate before encoding:",
3933
6
                   bufferCertificate->buf, bufferCertificate->len));
3934
3935
6
    PRUint32 lengthUnencodedMessage = bufferCertificate->len;
3936
6
    rv = ssl3_CopyToSECItem(bufferCertificate, &certificateToEncode);
3937
6
    if (rv != SECSuccess) {
3938
0
        SSL_TRC(50, ("%d: TLS13[%d]: %s has failed encoding the certificate.",
3939
0
                     SSL_GETPID(), ss->fd, SSL_ROLE(ss)));
3940
0
        goto loser; /* Code already set. */
3941
0
    }
3942
3943
6
    rv = tls13_FindCompressionAlgAndEncodeCertificate(ss, &certificateToEncode,
3944
6
                                                      &encodedCertificate);
3945
6
    if (rv != SECSuccess) {
3946
0
        SSL_TRC(50, ("%d: TLS13[%d]: %s has failed encoding the certificate.",
3947
0
                     SSL_GETPID(), ss->fd, SSL_ROLE(ss)));
3948
0
        PORT_SetError(SEC_ERROR_NO_MEMORY);
3949
0
        goto loser; /* Code already set. */
3950
0
    }
3951
3952
    /* The CompressedCertificate message is formed as follows:
3953
     * struct {
3954
     *   CertificateCompressionAlgorithm algorithm;
3955
     *         uint24 uncompressed_length;
3956
     *         opaque compressed_certificate_message<1..2^24-1>;
3957
     *    } CompressedCertificate;
3958
     */
3959
3960
6
    if (encodedCertificate.len < 1) {
3961
0
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
3962
0
        goto loser;
3963
0
    }
3964
3965
6
    rv = ssl3_AppendHandshakeHeader(ss, ssl_hs_compressed_certificate,
3966
6
                                    encodedCertificate.len + 2 + 3 + 3);
3967
6
    if (rv != SECSuccess) {
3968
0
        goto loser; /* err set by AppendHandshake. */
3969
0
    }
3970
3971
6
    rv = ssl3_AppendHandshakeNumber(ss, ss->xtnData.compressionAlg, 2);
3972
6
    if (rv != SECSuccess) {
3973
0
        goto loser; /* err set by AppendHandshake. */
3974
0
    }
3975
3976
6
    rv = ssl3_AppendHandshakeNumber(ss, lengthUnencodedMessage, 3);
3977
6
    if (rv != SECSuccess) {
3978
0
        goto loser; /* err set by AppendHandshake. */
3979
0
    }
3980
3981
6
    PRINT_BUF(30, (NULL, "The encoded certificate: ",
3982
6
                   encodedCertificate.data, encodedCertificate.len));
3983
3984
6
    rv = ssl3_AppendHandshakeVariable(ss, encodedCertificate.data, encodedCertificate.len, 3);
3985
6
    if (rv != SECSuccess) {
3986
0
        goto loser; /* err set by AppendHandshake. */
3987
0
    }
3988
3989
6
    SECITEM_FreeItem(&certificateToEncode, PR_FALSE);
3990
6
    SECITEM_FreeItem(&encodedCertificate, PR_FALSE);
3991
6
    return SECSuccess;
3992
3993
0
loser:
3994
0
    SECITEM_FreeItem(&certificateToEncode, PR_FALSE);
3995
0
    SECITEM_FreeItem(&encodedCertificate, PR_FALSE);
3996
0
    return SECFailure;
3997
6
}
3998
3999
/*
4000
 *    opaque ASN1Cert<1..2^24-1>;
4001
 *
4002
 *    struct {
4003
 *        ASN1Cert cert_data;
4004
 *        Extension extensions<0..2^16-1>;
4005
 *    } CertificateEntry;
4006
 *
4007
 *    struct {
4008
 *        opaque certificate_request_context<0..2^8-1>;
4009
 *        CertificateEntry certificate_list<0..2^24-1>;
4010
 *    } Certificate;
4011
 */
4012
static SECStatus
4013
tls13_SendCertificate(sslSocket *ss)
4014
2.71k
{
4015
2.71k
    SECStatus rv;
4016
2.71k
    CERTCertificateList *certChain;
4017
2.71k
    int certChainLen = 0;
4018
2.71k
    int i;
4019
2.71k
    SECItem context = { siBuffer, NULL, 0 };
4020
2.71k
    sslBuffer extensionBuf = SSL_BUFFER_EMPTY;
4021
2.71k
    sslBuffer bufferCertificate = SSL_BUFFER_EMPTY;
4022
4023
2.71k
    SSL_TRC(3, ("%d: TLS1.3[%d]: send certificate handshake",
4024
2.71k
                SSL_GETPID(), ss->fd));
4025
4026
2.71k
    PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss));
4027
2.71k
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
4028
4029
2.71k
    if (ss->sec.isServer) {
4030
2.71k
        PORT_Assert(!ss->sec.localCert);
4031
        /* A server certificate is selected in tls13_SelectServerCert(). */
4032
2.71k
        PORT_Assert(ss->sec.serverCert);
4033
4034
2.71k
        certChain = ss->sec.serverCert->serverCertChain;
4035
2.71k
        ss->sec.localCert = CERT_DupCertificate(ss->sec.serverCert->serverCert);
4036
2.71k
    } else {
4037
0
        if (ss->sec.localCert)
4038
0
            CERT_DestroyCertificate(ss->sec.localCert);
4039
4040
0
        certChain = ss->ssl3.clientCertChain;
4041
0
        ss->sec.localCert = CERT_DupCertificate(ss->ssl3.clientCertificate);
4042
0
    }
4043
4044
2.71k
    if (!ss->sec.isServer) {
4045
0
        PORT_Assert(ss->ssl3.hs.clientCertRequested);
4046
0
        context = ss->xtnData.certReqContext;
4047
0
    }
4048
4049
2.71k
    if (certChain) {
4050
5.42k
        for (i = 0; i < certChain->len; i++) {
4051
            /* Each cert is 3 octet length, cert, and extensions */
4052
2.71k
            certChainLen += 3 + certChain->certs[i].len + 2;
4053
2.71k
        }
4054
4055
        /* Build the extensions. This only applies to the leaf cert, because we
4056
         * don't yet send extensions for non-leaf certs. */
4057
2.71k
        rv = ssl_ConstructExtensions(ss, &extensionBuf, ssl_hs_certificate);
4058
2.71k
        if (rv != SECSuccess) {
4059
0
            return SECFailure; /* code already set */
4060
0
        }
4061
        /* extensionBuf.len is only added once, for the leaf cert. */
4062
2.71k
        certChainLen += SSL_BUFFER_LEN(&extensionBuf);
4063
2.71k
    }
4064
4065
2.71k
    rv = sslBuffer_AppendVariable(&bufferCertificate, context.data, context.len, 1);
4066
2.71k
    if (rv != SECSuccess) {
4067
0
        goto loser; /* Code already set. */
4068
0
    }
4069
4070
2.71k
    rv = sslBuffer_AppendNumber(&bufferCertificate, certChainLen, 3);
4071
2.71k
    if (rv != SECSuccess) {
4072
0
        goto loser; /* Code already set. */
4073
0
    }
4074
4075
2.71k
    if (certChain) {
4076
5.42k
        for (i = 0; i < certChain->len; i++) {
4077
2.71k
            rv = sslBuffer_AppendVariable(&bufferCertificate, certChain->certs[i].data,
4078
2.71k
                                          certChain->certs[i].len, 3);
4079
2.71k
            if (rv != SECSuccess) {
4080
0
                goto loser; /* Code already set. */
4081
0
            }
4082
4083
2.71k
            if (i) {
4084
                /* Not end-entity. */
4085
0
                rv = sslBuffer_AppendNumber(&bufferCertificate, 0, 2);
4086
0
                if (rv != SECSuccess) {
4087
0
                    goto loser; /* Code already set. */
4088
0
                }
4089
0
                continue;
4090
0
            }
4091
4092
2.71k
            rv = sslBuffer_AppendBufferVariable(&bufferCertificate, &extensionBuf, 2);
4093
2.71k
            if (rv != SECSuccess) {
4094
0
                goto loser; /* Code already set. */
4095
0
            }
4096
2.71k
        }
4097
2.71k
    }
4098
4099
    /* If no compression mechanism was established or
4100
     * the compression mechanism supports only decoding,
4101
     * we continue as before. */
4102
2.71k
    if (ss->xtnData.compressionAlg == 0 || !tls13_FindCompressionAlgAndCheckIfSupportsEncoding(ss)) {
4103
2.70k
        rv = ssl3_AppendHandshakeHeader(ss, ssl_hs_certificate,
4104
2.70k
                                        1 + context.len + 3 + certChainLen);
4105
2.70k
        if (rv != SECSuccess) {
4106
0
            goto loser; /* err set by AppendHandshake. */
4107
0
        }
4108
2.70k
        rv = ssl3_AppendBufferToHandshake(ss, &bufferCertificate);
4109
2.70k
        if (rv != SECSuccess) {
4110
0
            goto loser; /* err set by AppendHandshake. */
4111
0
        }
4112
2.70k
    } else {
4113
6
        rv = tls13_SendCompressedCertificate(ss, &bufferCertificate);
4114
6
        if (rv != SECSuccess) {
4115
0
            goto loser; /* err set by tls13_SendCompressedCertificate. */
4116
0
        }
4117
6
    }
4118
4119
2.71k
    sslBuffer_Clear(&bufferCertificate);
4120
2.71k
    sslBuffer_Clear(&extensionBuf);
4121
2.71k
    return SECSuccess;
4122
4123
0
loser:
4124
0
    sslBuffer_Clear(&bufferCertificate);
4125
0
    sslBuffer_Clear(&extensionBuf);
4126
0
    return SECFailure;
4127
2.71k
}
4128
4129
static SECStatus
4130
tls13_HandleCertificateEntry(sslSocket *ss, SECItem *data, PRBool first,
4131
                             SECItem *certData)
4132
10
{
4133
10
    SECStatus rv;
4134
10
    SECItem extensionsData;
4135
4136
10
    rv = ssl3_ConsumeHandshakeVariable(ss, certData,
4137
10
                                       3, &data->data, &data->len);
4138
10
    if (rv != SECSuccess) {
4139
5
        return SECFailure;
4140
5
    }
4141
4142
5
    rv = ssl3_ConsumeHandshakeVariable(ss, &extensionsData,
4143
5
                                       2, &data->data, &data->len);
4144
5
    if (rv != SECSuccess) {
4145
2
        return SECFailure;
4146
2
    }
4147
4148
    /* Parse all the extensions. */
4149
3
    if (first && !ss->sec.isServer) {
4150
0
        rv = ssl3_HandleExtensions(ss, &extensionsData.data,
4151
0
                                   &extensionsData.len,
4152
0
                                   ssl_hs_certificate);
4153
0
        if (rv != SECSuccess) {
4154
0
            return SECFailure;
4155
0
        }
4156
        /* TODO(ekr@rtfm.com): Copy out SCTs. Bug 1315727. */
4157
0
    }
4158
4159
3
    return SECSuccess;
4160
3
}
4161
4162
static SECStatus
4163
tls13_EnsureCerticateExpected(sslSocket *ss)
4164
175
{
4165
175
    SECStatus rv = SECFailure;
4166
175
    PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss));
4167
175
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
4168
4169
175
    if (ss->sec.isServer) {
4170
        /* Receiving this message might be the first sign we have that
4171
         * early data is over, so pretend we received EOED. */
4172
167
        rv = tls13_MaybeHandleSuppressedEndOfEarlyData(ss);
4173
167
        if (rv != SECSuccess) {
4174
0
            return SECFailure; /* Code already set. */
4175
0
        }
4176
4177
167
        if (ss->ssl3.clientCertRequested) {
4178
0
            rv = TLS13_CHECK_HS_STATE(ss, SSL_ERROR_RX_UNEXPECTED_CERTIFICATE,
4179
0
                                      idle_handshake);
4180
167
        } else {
4181
167
            rv = TLS13_CHECK_HS_STATE(ss, SSL_ERROR_RX_UNEXPECTED_CERTIFICATE,
4182
167
                                      wait_client_cert);
4183
167
        }
4184
167
    } else {
4185
8
        rv = TLS13_CHECK_HS_STATE(ss, SSL_ERROR_RX_UNEXPECTED_CERTIFICATE,
4186
8
                                  wait_cert_request, wait_server_cert);
4187
8
    }
4188
175
    return rv;
4189
175
}
4190
4191
/* RFC 8879 TLS Certificate Compression
4192
 * struct {
4193
 *  CertificateCompressionAlgorithm algorithm;
4194
 *  uint24 uncompressed_length;
4195
 *  opaque compressed_certificate_message<1..2^24-1>;
4196
 * } CompressedCertificate;
4197
 */
4198
static SECStatus
4199
tls13_HandleCertificateDecode(sslSocket *ss, PRUint8 *b, PRUint32 length)
4200
112
{
4201
112
    PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss));
4202
112
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
4203
4204
112
    SECStatus rv = SECFailure;
4205
4206
112
    if (!ss->xtnData.certificateCompressionAdvertised) {
4207
18
        FATAL_ERROR(ss, SEC_ERROR_UNEXPECTED_COMPRESSED_CERTIFICATE, decode_error);
4208
18
        return SECFailure;
4209
18
    }
4210
4211
94
    rv = tls13_EnsureCerticateExpected(ss);
4212
94
    if (rv != SECSuccess) {
4213
5
        return SECFailure; /* Code already set. */
4214
5
    }
4215
4216
89
    if (ss->firstHsDone) {
4217
0
        rv = ssl_HashPostHandshakeMessage(ss, ssl_hs_compressed_certificate, b, length);
4218
0
        if (rv != SECSuccess) {
4219
0
            return rv;
4220
0
        }
4221
0
    }
4222
4223
89
    SSL_TRC(30, ("%d: TLS1.3[%d]: %s handles certificate compression handshake",
4224
89
                 SSL_GETPID(), ss->fd, SSL_ROLE(ss)));
4225
4226
89
    PRINT_BUF(50, (NULL, "The certificate before decoding:", b, length));
4227
    /* Reading CertificateCompressionAlgorithm. */
4228
89
    PRUint32 compressionAlg = 0;
4229
89
    rv = ssl3_ConsumeHandshakeNumber(ss, &compressionAlg, 2, &b, &length);
4230
89
    if (rv != SECSuccess) {
4231
2
        return SECFailure; /* Alert already sent. */
4232
2
    }
4233
4234
87
    PRBool compressionAlgorithmIsSupported = PR_FALSE;
4235
87
    SECStatus (*certificateDecodingFunc)(const SECItem *,
4236
87
                                         unsigned char *output, size_t outputLen, size_t *usedLen) = NULL;
4237
174
    for (int i = 0; i < ss->ssl3.supportedCertCompressionAlgorithmsCount; i++) {
4238
87
        if (ss->ssl3.supportedCertCompressionAlgorithms[i].id == compressionAlg) {
4239
64
            compressionAlgorithmIsSupported = PR_TRUE;
4240
64
            certificateDecodingFunc = ss->ssl3.supportedCertCompressionAlgorithms[i].decode;
4241
64
        }
4242
87
    }
4243
4244
    /* Peer selected a compression algorithm we do not support (and did not advertise). */
4245
87
    if (!compressionAlgorithmIsSupported) {
4246
23
        PORT_SetError(SEC_ERROR_CERTIFICATE_COMPRESSION_ALGORITHM_NOT_SUPPORTED);
4247
23
        FATAL_ERROR(ss, PORT_GetError(), illegal_parameter);
4248
23
        return SECFailure;
4249
23
    }
4250
4251
    /* The algorithm does not support decoding. */
4252
64
    if (certificateDecodingFunc == NULL) {
4253
0
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
4254
0
        FATAL_ERROR(ss, PORT_GetError(), illegal_parameter);
4255
0
        return SECFailure;
4256
0
    }
4257
4258
64
    SSL_TRC(30, ("%d: TLS13[%d]: %s is decoding the certificate using the %s compression algorithm",
4259
64
                 SSL_GETPID(), ss->fd, SSL_ROLE(ss),
4260
64
                 ssl3_mapCertificateCompressionAlgorithmToName(ss, compressionAlg)));
4261
64
    PRUint32 decodedCertLen = 0;
4262
64
    rv = ssl3_ConsumeHandshakeNumber(ss, &decodedCertLen, 3, &b, &length);
4263
64
    if (rv != SECSuccess) {
4264
1
        return SECFailure; /* alert has been sent */
4265
1
    }
4266
4267
    /*  If the received CompressedCertificate message cannot be decompressed,
4268
     *  he connection MUST be terminated with the "bad_certificate" alert.
4269
     */
4270
63
    if (decodedCertLen == 0) {
4271
1
        SSL_TRC(50, ("%d: TLS13[%d]: %s decoded certificate length is incorrect",
4272
1
                     SSL_GETPID(), ss->fd, SSL_ROLE(ss),
4273
1
                     ssl3_mapCertificateCompressionAlgorithmToName(ss, compressionAlg)));
4274
1
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_CERTIFICATE, bad_certificate);
4275
1
        return SECFailure;
4276
1
    }
4277
4278
    /* Cap the decompressed size to prevent memory exhaustion. The wire field
4279
     * is a uint24 (max 16MB) but the CompressedCertificate path bypasses the
4280
     * 128KB cap applied to regular handshake messages. 100KB matches the limit
4281
     * enforced by OpenSSL and BoringSSL. */
4282
62
#define MAX_CERT_UNCOMPRESSED_LEN (100 * 1024)
4283
62
    if (decodedCertLen > MAX_CERT_UNCOMPRESSED_LEN) {
4284
15
        SSL_TRC(50, ("%d: TLS13[%d]: %s uncompressed_length %u exceeds limit %u",
4285
15
                     SSL_GETPID(), ss->fd, SSL_ROLE(ss),
4286
15
                     decodedCertLen, MAX_CERT_UNCOMPRESSED_LEN));
4287
15
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_CERTIFICATE, bad_certificate);
4288
15
        return SECFailure;
4289
15
    }
4290
47
#undef MAX_CERT_UNCOMPRESSED_LEN
4291
4292
    /* opaque compressed_certificate_message<1..2^24-1>; */
4293
47
    PRUint32 compressedCertLen = 0;
4294
47
    rv = ssl3_ConsumeHandshakeNumber(ss, &compressedCertLen, 3, &b, &length);
4295
47
    if (rv != SECSuccess) {
4296
4
        return SECFailure; /* alert has been sent */
4297
4
    }
4298
4299
43
    if (compressedCertLen == 0 || compressedCertLen != length) {
4300
27
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_CERTIFICATE, bad_certificate);
4301
27
        return SECFailure;
4302
27
    }
4303
4304
    /* Decoding received certificate. */
4305
16
    PRUint8 *decodedCert = PORT_ZAlloc(decodedCertLen);
4306
16
    if (!decodedCert) {
4307
0
        return SECFailure;
4308
0
    }
4309
4310
16
    size_t actualCertLen = 0;
4311
4312
16
    SECItem encodedCertAsSecItem = { siBuffer, b, compressedCertLen };
4313
16
    rv = certificateDecodingFunc(&encodedCertAsSecItem,
4314
16
                                 decodedCert, decodedCertLen, &actualCertLen);
4315
4316
16
    if (rv != SECSuccess) {
4317
1
        SSL_TRC(50, ("%d: TLS13[%d]: %s decoding of the certificate has failed",
4318
1
                     SSL_GETPID(), ss->fd, SSL_ROLE(ss),
4319
1
                     ssl3_mapCertificateCompressionAlgorithmToName(ss, compressionAlg)));
4320
1
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_CERTIFICATE, bad_certificate);
4321
1
        goto loser;
4322
1
    }
4323
15
    PRINT_BUF(60, (ss, "consume bytes:", b, compressedCertLen));
4324
15
    *b += compressedCertLen;
4325
15
    length -= compressedCertLen;
4326
4327
    /*  If, after decompression, the specified length does not match the actual length,
4328
     *  the party receiving the invalid message MUST abort the connection
4329
     *  with the "bad_certificate" alert.
4330
     */
4331
15
    if (actualCertLen != decodedCertLen) {
4332
9
        SSL_TRC(50, ("%d: TLS13[%d]: %s certificate length does not correspond to extension length",
4333
9
                     SSL_GETPID(), ss->fd, SSL_ROLE(ss),
4334
9
                     ssl3_mapCertificateCompressionAlgorithmToName(ss, compressionAlg)));
4335
9
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_CERTIFICATE, bad_certificate);
4336
9
        goto loser;
4337
9
    }
4338
4339
6
    PRINT_BUF(50, (NULL, "Decoded certificate",
4340
6
                   decodedCert, decodedCertLen));
4341
4342
    /* compressed_certificate_message:  The result of applying the indicated
4343
     * compression algorithm to the encoded Certificate message that
4344
     *  would have been sent if certificate compression was not in use.
4345
     *
4346
     * After decompression, the Certificate message MUST be processed as if
4347
     * it were encoded without being compressed.  This way, the parsing and
4348
     * the verification have the same security properties as they would have
4349
     * in TLS normally.
4350
     */
4351
6
    rv = tls13_HandleCertificate(ss, decodedCert, decodedCertLen, PR_TRUE);
4352
6
    if (rv != SECSuccess) {
4353
1
        goto loser;
4354
1
    }
4355
    /* We allow only one compressed certificate to be handled after each
4356
       certificate compression advertisement.
4357
       See test CertificateCompression_TwoEncodedCertificateRequests. */
4358
5
    ss->xtnData.certificateCompressionAdvertised = PR_FALSE;
4359
5
    PORT_Free(decodedCert);
4360
5
    return SECSuccess;
4361
4362
11
loser:
4363
11
    PORT_Free(decodedCert);
4364
11
    return SECFailure;
4365
6
}
4366
4367
/* Called from tls13_CompleteHandleHandshakeMessage() when it has deciphered a complete
4368
 * tls13 Certificate message.
4369
 * Caller must hold Handshake and RecvBuf locks.
4370
 */
4371
static SECStatus
4372
tls13_HandleCertificate(sslSocket *ss, PRUint8 *b, PRUint32 length, PRBool alreadyHashed)
4373
81
{
4374
81
    SECStatus rv;
4375
81
    SECItem context = { siBuffer, NULL, 0 };
4376
81
    SECItem certList;
4377
81
    PRBool first = PR_TRUE;
4378
81
    ssl3CertNode *lastCert = NULL;
4379
4380
81
    SSL_TRC(3, ("%d: TLS13[%d]: handle certificate handshake",
4381
81
                SSL_GETPID(), ss->fd));
4382
81
    PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss));
4383
81
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
4384
4385
81
    rv = tls13_EnsureCerticateExpected(ss);
4386
81
    if (rv != SECSuccess) {
4387
18
        return SECFailure; /* Code already set. */
4388
18
    }
4389
4390
    /* We can ignore any other cleartext from the client. */
4391
63
    if (ss->sec.isServer && IS_DTLS(ss)) {
4392
25
        ssl_CipherSpecReleaseByEpoch(ss, ssl_secret_read, TrafficKeyClearText);
4393
25
        dtls_ReceivedFirstMessageInFlight(ss);
4394
25
    }
4395
4396
    /* AlreadyHashed is true only when Certificate Compression is used. */
4397
63
    if (ss->firstHsDone && !alreadyHashed) {
4398
0
        rv = ssl_HashPostHandshakeMessage(ss, ssl_hs_certificate, b, length);
4399
0
        if (rv != SECSuccess) {
4400
0
            PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
4401
0
            return SECFailure;
4402
0
        }
4403
0
    }
4404
4405
63
    if (!ss->firstHsDone && ss->sec.isServer) {
4406
        /* Our first shot an getting an RTT estimate.  If the client took extra
4407
         * time to fetch a certificate, this will be bad, but we can't do much
4408
         * about that. */
4409
63
        ss->ssl3.hs.rttEstimate = ssl_Time(ss) - ss->ssl3.hs.rttEstimate;
4410
63
    }
4411
4412
    /* Process the context string */
4413
63
    rv = ssl3_ConsumeHandshakeVariable(ss, &context, 1, &b, &length);
4414
63
    if (rv != SECSuccess)
4415
2
        return SECFailure;
4416
4417
61
    if (ss->ssl3.clientCertRequested) {
4418
0
        PORT_Assert(ss->sec.isServer);
4419
0
        if (SECITEM_CompareItem(&context, &ss->xtnData.certReqContext) != 0) {
4420
0
            FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_CERTIFICATE, illegal_parameter);
4421
0
            return SECFailure;
4422
0
        }
4423
0
    }
4424
61
    rv = ssl3_ConsumeHandshakeVariable(ss, &certList, 3, &b, &length);
4425
61
    if (rv != SECSuccess) {
4426
34
        return SECFailure;
4427
34
    }
4428
27
    if (length) {
4429
3
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_CERTIFICATE, illegal_parameter);
4430
3
        return SECFailure;
4431
3
    }
4432
4433
24
    if (!certList.len) {
4434
14
        if (!ss->sec.isServer) {
4435
            /* Servers always need to send some cert. */
4436
0
            FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_CERTIFICATE, bad_certificate);
4437
0
            return SECFailure;
4438
14
        } else {
4439
            /* This is TLS's version of a no_certificate alert. */
4440
            /* I'm a server. I've requested a client cert. He hasn't got one. */
4441
14
            rv = ssl3_HandleNoCertificate(ss);
4442
14
            if (rv != SECSuccess) {
4443
2
                return SECFailure;
4444
2
            }
4445
4446
12
            TLS13_SET_HS_STATE(ss, wait_finished);
4447
12
            return SECSuccess;
4448
14
        }
4449
14
    }
4450
4451
    /* Now clean up. */
4452
10
    ssl3_CleanupPeerCerts(ss);
4453
10
    ss->ssl3.peerCertArena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
4454
10
    if (ss->ssl3.peerCertArena == NULL) {
4455
0
        FATAL_ERROR(ss, SEC_ERROR_NO_MEMORY, internal_error);
4456
0
        return SECFailure;
4457
0
    }
4458
4459
10
    while (certList.len) {
4460
10
        SECItem derCert; // will hold a weak reference into certList
4461
10
        rv = tls13_HandleCertificateEntry(ss, &certList, first,
4462
10
                                          &derCert);
4463
10
        if (rv != SECSuccess) {
4464
7
            ss->xtnData.signedCertTimestamps.len = 0;
4465
7
            return SECFailure;
4466
7
        }
4467
4468
3
        if (first) {
4469
            /* This keeps the DER and the subjectPublicKeyInfo parsed out of
4470
             * it; nothing is added to any certificate database here. */
4471
3
            if (ssl_SetPeerCertificate(&ss->sec, &derCert) != SECSuccess) {
4472
3
                PRErrorCode errCode = PORT_GetError();
4473
3
                switch (errCode) {
4474
0
                    case PR_OUT_OF_MEMORY_ERROR:
4475
0
                    case SEC_ERROR_BAD_DATABASE:
4476
0
                    case SEC_ERROR_NO_MEMORY:
4477
0
                        FATAL_ERROR(ss, errCode, internal_error);
4478
0
                        return SECFailure;
4479
3
                    default:
4480
3
                        ssl3_SendAlertForCertError(ss, errCode);
4481
3
                        return SECFailure;
4482
3
                }
4483
3
            }
4484
4485
0
            if (ss->xtnData.signedCertTimestamps.len) {
4486
0
                sslSessionID *sid = ss->sec.ci.sid;
4487
0
                rv = SECITEM_CopyItem(NULL, &sid->u.ssl3.signedCertTimestamps,
4488
0
                                      &ss->xtnData.signedCertTimestamps);
4489
0
                ss->xtnData.signedCertTimestamps.len = 0;
4490
0
                if (rv != SECSuccess) {
4491
0
                    FATAL_ERROR(ss, SEC_ERROR_NO_MEMORY, internal_error);
4492
0
                    return SECFailure;
4493
0
                }
4494
0
            }
4495
0
        } else {
4496
0
            ssl3CertNode *c = PORT_ArenaNew(ss->ssl3.peerCertArena,
4497
0
                                            ssl3CertNode);
4498
0
            if (!c) {
4499
0
                FATAL_ERROR(ss, SEC_ERROR_NO_MEMORY, internal_error);
4500
0
                return SECFailure;
4501
0
            }
4502
0
            c->derCert = SECITEM_ArenaDupItem(ss->ssl3.peerCertArena,
4503
0
                                              &derCert);
4504
0
            c->next = NULL;
4505
4506
0
            if (lastCert) {
4507
0
                lastCert->next = c;
4508
0
            } else {
4509
0
                ss->ssl3.peerCertChain = c;
4510
0
            }
4511
0
            lastCert = c;
4512
0
        }
4513
4514
0
        first = PR_FALSE;
4515
0
    }
4516
4517
0
    return ssl3_AuthCertificate(ss); /* sets ss->ssl3.hs.ws */
4518
10
}
4519
4520
/* Add context when signing hashes as described in
4521
   [draft-ietf-tls-tls13; Section 4.9.1] */
4522
SECStatus
4523
tls13_SignOrVerifyHashWithContext(sslSocket *ss, const SSL3Hashes *hashes,
4524
                                  SECKEYPrivateKey *privKey, SECKEYPublicKey *pubKey,
4525
                                  SSLSignatureScheme scheme, sslSignOrVerify direction,
4526
                                  SECItem *signature)
4527
2.71k
{
4528
2.71k
    SECStatus rv = SECSuccess;
4529
2.71k
    tlsSignOrVerifyContext ctx = { sig_verify, { NULL } };
4530
2.71k
    void *pwArg = ss->pkcs11PinArg;
4531
2.71k
    const unsigned char context_padding[] = {
4532
2.71k
        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
4533
2.71k
        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
4534
2.71k
        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
4535
2.71k
        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
4536
2.71k
        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
4537
2.71k
        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
4538
2.71k
        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
4539
2.71k
        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20
4540
2.71k
    };
4541
4542
2.71k
    const char *client_cert_verify_string = "TLS 1.3, client CertificateVerify";
4543
2.71k
    const char *server_cert_verify_string = "TLS 1.3, server CertificateVerify";
4544
2.71k
    const char *context_string = ((direction == sig_sign && ss->sec.isServer) ||
4545
0
                                  (direction == sig_verify && !ss->sec.isServer))
4546
2.71k
                                     ? server_cert_verify_string
4547
2.71k
                                     : client_cert_verify_string;
4548
4549
    /* Double check that we are doing the same hash.*/
4550
2.71k
    PORT_Assert(hashes->len == tls13_GetHashSize(ss));
4551
4552
2.71k
    PRINT_BUF(50, (ss, "TLS 1.3 hash without context", hashes->u.raw, hashes->len));
4553
2.71k
    PRINT_BUF(50, (ss, "Context string", context_string, strlen(context_string)));
4554
4555
2.71k
    ctx = tls_CreateSignOrVerifyContext(privKey, pubKey, scheme,
4556
2.71k
                                        direction, signature, pwArg);
4557
2.71k
    if (ctx.u.ptr == NULL) {
4558
0
        goto loser;
4559
0
    }
4560
2.71k
    rv = tls_SignOrVerifyUpdate(ctx, context_padding, sizeof(context_padding));
4561
2.71k
    if (rv != SECSuccess) {
4562
0
        goto loser;
4563
0
    }
4564
2.71k
    rv = tls_SignOrVerifyUpdate(ctx, (const unsigned char *)context_string,
4565
                                /* +1 includes the terminating 0 */
4566
2.71k
                                strlen(context_string) + 1);
4567
2.71k
    if (rv != SECSuccess) {
4568
0
        goto loser;
4569
0
    }
4570
2.71k
    rv = tls_SignOrVerifyUpdate(ctx, hashes->u.raw, hashes->len);
4571
2.71k
    if (rv != SECSuccess) {
4572
0
        goto loser;
4573
0
    }
4574
2.71k
    rv = tls_SignOrVerifyEnd(ctx, signature);
4575
2.71k
    if (rv) {
4576
0
        goto loser;
4577
0
    }
4578
4579
    /* if we are server & sending or !server & !sending, update the scheme */
4580
    /* only update on server cert verify */
4581
2.71k
    if ((direction == sig_sign && ss->sec.isServer) ||
4582
2.71k
        (direction == sig_verify && !ss->sec.isServer)) {
4583
2.71k
        ss->sec.signatureScheme = scheme;
4584
2.71k
        ss->sec.authType = ssl_SignatureSchemeToAuthType(scheme);
4585
2.71k
    }
4586
2.71k
    return SECSuccess;
4587
4588
0
loser:
4589
0
    tls_DestroySignOrVerifyContext(&ctx);
4590
0
    ssl_MapLowLevelError(SSL_ERROR_SIGN_HASHES_FAILURE);
4591
0
    return SECFailure;
4592
2.71k
}
4593
4594
/*
4595
 *    Derive-Secret(Secret, Label, Messages) =
4596
 *       HKDF-Expand-Label(Secret, Label,
4597
 *                         Hash(Messages) + Hash(resumption_context), L))
4598
 */
4599
SECStatus
4600
tls13_DeriveSecret(sslSocket *ss, PK11SymKey *key,
4601
                   const char *label,
4602
                   unsigned int labelLen,
4603
                   const SSL3Hashes *hashes,
4604
                   PK11SymKey **dest,
4605
                   SSLHashType hash)
4606
35.4k
{
4607
35.4k
    SECStatus rv;
4608
4609
35.4k
    rv = tls13_HkdfExpandLabel(key, hash, hashes->u.raw, hashes->len,
4610
35.4k
                               label, labelLen, CKM_HKDF_DERIVE,
4611
35.4k
                               tls13_GetHashSizeForHash(hash),
4612
35.4k
                               ss->protocolVariant, dest);
4613
35.4k
    if (rv != SECSuccess) {
4614
0
        LOG_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE);
4615
0
        return SECFailure;
4616
0
    }
4617
35.4k
    return SECSuccess;
4618
35.4k
}
4619
4620
/* Convenience wrapper for the empty hash. */
4621
SECStatus
4622
tls13_DeriveSecretNullHash(sslSocket *ss, PK11SymKey *key,
4623
                           const char *label,
4624
                           unsigned int labelLen,
4625
                           PK11SymKey **dest,
4626
                           SSLHashType hash)
4627
16.7k
{
4628
16.7k
    SSL3Hashes hashes;
4629
16.7k
    SECStatus rv;
4630
16.7k
    PRUint8 buf[] = { 0 };
4631
4632
16.7k
    rv = tls13_ComputeHash(ss, &hashes, buf, 0, hash);
4633
16.7k
    if (rv != SECSuccess) {
4634
0
        return SECFailure;
4635
0
    }
4636
4637
16.7k
    return tls13_DeriveSecret(ss, key, label, labelLen, &hashes, dest, hash);
4638
16.7k
}
4639
4640
/* Convenience wrapper that lets us supply a separate prefix and suffix. */
4641
static SECStatus
4642
tls13_DeriveSecretWrap(sslSocket *ss, PK11SymKey *key,
4643
                       const char *prefix,
4644
                       const char *suffix,
4645
                       const char *keylogLabel,
4646
                       PK11SymKey **dest)
4647
18.7k
{
4648
18.7k
    SECStatus rv;
4649
18.7k
    SSL3Hashes hashes;
4650
18.7k
    char buf[100];
4651
18.7k
    const char *label;
4652
4653
18.7k
    if (prefix) {
4654
15.4k
        if ((strlen(prefix) + strlen(suffix) + 2) > sizeof(buf)) {
4655
0
            PORT_Assert(0);
4656
0
            PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
4657
0
            return SECFailure;
4658
0
        }
4659
15.4k
        (void)PR_snprintf(buf, sizeof(buf), "%s %s",
4660
15.4k
                          prefix, suffix);
4661
15.4k
        label = buf;
4662
15.4k
    } else {
4663
3.26k
        label = suffix;
4664
3.26k
    }
4665
4666
18.7k
    SSL_TRC(3, ("%d: TLS13[%d]: deriving secret '%s'",
4667
18.7k
                SSL_GETPID(), ss->fd, label));
4668
18.7k
    rv = tls13_ComputeHandshakeHashes(ss, &hashes);
4669
18.7k
    if (rv != SECSuccess) {
4670
0
        PORT_Assert(0); /* Should never fail */
4671
0
        ssl_MapLowLevelError(SEC_ERROR_LIBRARY_FAILURE);
4672
0
        return SECFailure;
4673
0
    }
4674
4675
18.7k
    rv = tls13_DeriveSecret(ss, key, label, strlen(label),
4676
18.7k
                            &hashes, dest, tls13_GetHash(ss));
4677
18.7k
    if (rv != SECSuccess) {
4678
0
        return SECFailure;
4679
0
    }
4680
4681
18.7k
    if (keylogLabel) {
4682
18.1k
        ssl3_RecordKeyLog(ss, keylogLabel, *dest);
4683
18.1k
    }
4684
18.7k
    return SECSuccess;
4685
18.7k
}
4686
4687
SECStatus
4688
SSLExp_SecretCallback(PRFileDesc *fd, SSLSecretCallback cb, void *arg)
4689
0
{
4690
0
    sslSocket *ss = ssl_FindSocket(fd);
4691
0
    if (!ss) {
4692
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SecretCallback",
4693
0
                 SSL_GETPID(), fd));
4694
0
        return SECFailure;
4695
0
    }
4696
4697
0
    ssl_Get1stHandshakeLock(ss);
4698
0
    ssl_GetSSL3HandshakeLock(ss);
4699
0
    ss->secretCallback = cb;
4700
0
    ss->secretCallbackArg = arg;
4701
0
    ssl_ReleaseSSL3HandshakeLock(ss);
4702
0
    ssl_Release1stHandshakeLock(ss);
4703
0
    return SECSuccess;
4704
0
}
4705
4706
/* Derive traffic keys for the next cipher spec in the queue. */
4707
static SECStatus
4708
tls13_DeriveTrafficKeys(sslSocket *ss, ssl3CipherSpec *spec,
4709
                        TrafficKeyType type,
4710
                        PRBool deleteSecret)
4711
147k
{
4712
147k
    size_t keySize = spec->cipherDef->key_size;
4713
147k
    size_t ivSize = spec->cipherDef->iv_size +
4714
147k
                    spec->cipherDef->explicit_nonce_size; /* This isn't always going to
4715
                                                           * work, but it does for
4716
                                                           * AES-GCM */
4717
147k
    CK_MECHANISM_TYPE bulkAlgorithm = ssl3_Alg2Mech(spec->cipherDef->calg);
4718
147k
    PK11SymKey **prkp = NULL;
4719
147k
    PK11SymKey *prk = NULL;
4720
147k
    PRBool clientSecret;
4721
147k
    SECStatus rv;
4722
    /* These labels are just used for debugging. */
4723
147k
    static const char kHkdfPhaseEarlyApplicationDataKeys[] = "early application data";
4724
147k
    static const char kHkdfPhaseHandshakeKeys[] = "handshake data";
4725
147k
    static const char kHkdfPhaseApplicationDataKeys[] = "application data";
4726
4727
147k
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
4728
4729
147k
    clientSecret = !tls13_UseServerSecret(ss, spec->direction);
4730
147k
    switch (type) {
4731
0
        case TrafficKeyEarlyApplicationData:
4732
0
            PORT_Assert(clientSecret);
4733
0
            prkp = &ss->ssl3.hs.clientEarlyTrafficSecret;
4734
0
            spec->phase = kHkdfPhaseEarlyApplicationDataKeys;
4735
0
            break;
4736
7.95k
        case TrafficKeyHandshake:
4737
7.95k
            prkp = clientSecret ? &ss->ssl3.hs.clientHsTrafficSecret
4738
7.95k
                                : &ss->ssl3.hs.serverHsTrafficSecret;
4739
7.95k
            spec->phase = kHkdfPhaseHandshakeKeys;
4740
7.95k
            break;
4741
140k
        case TrafficKeyApplicationData:
4742
140k
            prkp = clientSecret ? &ss->ssl3.hs.clientTrafficSecret
4743
140k
                                : &ss->ssl3.hs.serverTrafficSecret;
4744
140k
            spec->phase = kHkdfPhaseApplicationDataKeys;
4745
140k
            break;
4746
0
        default:
4747
0
            LOG_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE);
4748
0
            PORT_Assert(0);
4749
0
            return SECFailure;
4750
147k
    }
4751
147k
    PORT_Assert(prkp != NULL);
4752
147k
    prk = *prkp;
4753
4754
147k
    SSL_TRC(3, ("%d: TLS13[%d]: deriving %s traffic keys epoch=%d (%s)",
4755
147k
                SSL_GETPID(), ss->fd, SPEC_DIR(spec),
4756
147k
                spec->epoch, spec->phase));
4757
4758
147k
    rv = tls13_HkdfExpandLabel(prk, tls13_GetHash(ss),
4759
147k
                               NULL, 0,
4760
147k
                               kHkdfPurposeKey, strlen(kHkdfPurposeKey),
4761
147k
                               bulkAlgorithm, keySize,
4762
147k
                               ss->protocolVariant,
4763
147k
                               &spec->keyMaterial.key);
4764
147k
    if (rv != SECSuccess) {
4765
0
        LOG_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE);
4766
0
        PORT_Assert(0);
4767
0
        goto loser;
4768
0
    }
4769
4770
147k
    if (IS_DTLS(ss) && spec->epoch > 0) {
4771
5.20k
        rv = ssl_CreateMaskingContextInner(spec->version, ss->ssl3.hs.cipher_suite,
4772
5.20k
                                           ss->protocolVariant, prk, kHkdfPurposeSn,
4773
5.20k
                                           strlen(kHkdfPurposeSn), &spec->maskContext);
4774
5.20k
        if (rv != SECSuccess) {
4775
0
            LOG_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE);
4776
0
            PORT_Assert(0);
4777
0
            goto loser;
4778
0
        }
4779
5.20k
    }
4780
4781
147k
    rv = tls13_HkdfExpandLabelRaw(prk, tls13_GetHash(ss),
4782
147k
                                  NULL, 0,
4783
147k
                                  kHkdfPurposeIv, strlen(kHkdfPurposeIv),
4784
147k
                                  ss->protocolVariant,
4785
147k
                                  spec->keyMaterial.iv, ivSize);
4786
147k
    if (rv != SECSuccess) {
4787
0
        LOG_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE);
4788
0
        PORT_Assert(0);
4789
0
        goto loser;
4790
0
    }
4791
4792
147k
    if (deleteSecret) {
4793
0
        PK11_FreeSymKey(prk);
4794
0
        *prkp = NULL;
4795
0
    }
4796
147k
    return SECSuccess;
4797
4798
0
loser:
4799
0
    return SECFailure;
4800
147k
}
4801
4802
void
4803
tls13_SetSpecRecordVersion(sslSocket *ss, ssl3CipherSpec *spec)
4804
158k
{
4805
    /* Set the record version to pretend to be (D)TLS 1.2. */
4806
158k
    if (IS_DTLS(ss)) {
4807
10.7k
        spec->recordVersion = SSL_LIBRARY_VERSION_DTLS_1_2_WIRE;
4808
148k
    } else {
4809
148k
        spec->recordVersion = SSL_LIBRARY_VERSION_TLS_1_2;
4810
148k
    }
4811
158k
    SSL_TRC(10, ("%d: TLS13[%d]: set spec=%d record version to 0x%04x",
4812
158k
                 SSL_GETPID(), ss->fd, spec, spec->recordVersion));
4813
158k
}
4814
4815
static SECStatus
4816
tls13_SetupPendingCipherSpec(sslSocket *ss, ssl3CipherSpec *spec)
4817
147k
{
4818
147k
    ssl3CipherSuite suite = ss->ssl3.hs.cipher_suite;
4819
4820
147k
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
4821
147k
    PORT_Assert(spec->epoch);
4822
4823
    /* Version isn't set when we send 0-RTT data. */
4824
147k
    spec->version = PR_MAX(SSL_LIBRARY_VERSION_TLS_1_3, ss->version);
4825
4826
147k
    ssl_SaveCipherSpec(ss, spec);
4827
    /* We want to keep read cipher specs around longer because
4828
     * there are cases where we might get either epoch N or
4829
     * epoch N+1. */
4830
147k
    if (IS_DTLS(ss) && spec->direction == ssl_secret_read) {
4831
2.63k
        ssl_CipherSpecAddRef(spec);
4832
2.63k
    }
4833
4834
147k
    SSL_TRC(3, ("%d: TLS13[%d]: Set Pending Cipher Suite to 0x%04x",
4835
147k
                SSL_GETPID(), ss->fd, suite));
4836
4837
147k
    spec->cipherDef = ssl_GetBulkCipherDef(ssl_LookupCipherSuiteDef(suite));
4838
4839
147k
    if (spec->epoch == TrafficKeyEarlyApplicationData) {
4840
0
        if (ss->xtnData.selectedPsk &&
4841
0
            ss->xtnData.selectedPsk->zeroRttSuite != TLS_NULL_WITH_NULL_NULL) {
4842
0
            spec->earlyDataRemaining = ss->xtnData.selectedPsk->maxEarlyData;
4843
0
        }
4844
0
    }
4845
4846
147k
    tls13_SetSpecRecordVersion(ss, spec);
4847
4848
    /* The record size limit is reduced by one so that the remainder of the
4849
     * record handling code can use the same checks for all versions. */
4850
147k
    if (ssl3_ExtensionNegotiated(ss, ssl_record_size_limit_xtn)) {
4851
138k
        spec->recordSizeLimit = ((spec->direction == ssl_secret_read)
4852
138k
                                     ? ss->opt.recordSizeLimit
4853
138k
                                     : ss->xtnData.recordSizeLimit) -
4854
138k
                                1;
4855
138k
    } else {
4856
9.57k
        spec->recordSizeLimit = MAX_FRAGMENT_LENGTH;
4857
9.57k
    }
4858
147k
    return SECSuccess;
4859
147k
}
4860
4861
/*
4862
 * Initialize the cipher context. All TLS 1.3 operations are AEAD,
4863
 * so they are all message contexts.
4864
 */
4865
static SECStatus
4866
tls13_InitPendingContext(sslSocket *ss, ssl3CipherSpec *spec)
4867
147k
{
4868
147k
    CK_MECHANISM_TYPE encMechanism;
4869
147k
    CK_ATTRIBUTE_TYPE encMode;
4870
147k
    SECItem iv;
4871
147k
    SSLCipherAlgorithm calg;
4872
4873
147k
    calg = spec->cipherDef->calg;
4874
4875
147k
    encMechanism = ssl3_Alg2Mech(calg);
4876
147k
    encMode = CKA_NSS_MESSAGE | ((spec->direction == ssl_secret_write) ? CKA_ENCRYPT : CKA_DECRYPT);
4877
147k
    iv.data = NULL;
4878
147k
    iv.len = 0;
4879
4880
    /*
4881
     * build the context
4882
     */
4883
147k
    spec->cipherContext = PK11_CreateContextBySymKey(encMechanism, encMode,
4884
147k
                                                     spec->keyMaterial.key,
4885
147k
                                                     &iv);
4886
147k
    if (!spec->cipherContext) {
4887
0
        ssl_MapLowLevelError(SSL_ERROR_SYM_KEY_CONTEXT_FAILURE);
4888
0
        return SECFailure;
4889
0
    }
4890
147k
    return SECSuccess;
4891
147k
}
4892
4893
/*
4894
 * Called before sending alerts to set up the right key on the client.
4895
 * We might encounter errors during the handshake where the current
4896
 * key is ClearText or EarlyApplicationData. This
4897
 * function switches to the Handshake key if possible.
4898
 */
4899
SECStatus
4900
tls13_SetAlertCipherSpec(sslSocket *ss)
4901
31.4k
{
4902
31.4k
    SECStatus rv;
4903
4904
31.4k
    if (ss->sec.isServer) {
4905
16.0k
        return SECSuccess;
4906
16.0k
    }
4907
15.3k
    if (ss->version < SSL_LIBRARY_VERSION_TLS_1_3) {
4908
14.5k
        return SECSuccess;
4909
14.5k
    }
4910
873
    if (TLS13_IN_HS_STATE(ss, wait_server_hello)) {
4911
643
        return SECSuccess;
4912
643
    }
4913
230
    if ((ss->ssl3.cwSpec->epoch != TrafficKeyClearText) &&
4914
0
        (ss->ssl3.cwSpec->epoch != TrafficKeyEarlyApplicationData)) {
4915
0
        return SECSuccess;
4916
0
    }
4917
4918
230
    rv = tls13_SetCipherSpec(ss, TrafficKeyHandshake,
4919
230
                             ssl_secret_write, PR_FALSE);
4920
230
    if (rv != SECSuccess) {
4921
0
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
4922
0
        return SECFailure;
4923
0
    }
4924
230
    return SECSuccess;
4925
230
}
4926
4927
/* Install a new cipher spec for this direction.
4928
 *
4929
 * During the handshake, the values for |epoch| take values from the
4930
 * TrafficKeyType enum.  Afterwards, key update increments them.
4931
 */
4932
static SECStatus
4933
tls13_SetCipherSpec(sslSocket *ss, PRUint16 epoch,
4934
                    SSLSecretDirection direction, PRBool deleteSecret)
4935
147k
{
4936
147k
    TrafficKeyType type;
4937
147k
    SECStatus rv;
4938
147k
    ssl3CipherSpec *spec = NULL;
4939
147k
    ssl3CipherSpec **specp;
4940
4941
    /* Flush out old handshake data. */
4942
147k
    ssl_GetXmitBufLock(ss);
4943
147k
    rv = ssl3_FlushHandshake(ss, ssl_SEND_FLAG_FORCE_INTO_BUFFER);
4944
147k
    ssl_ReleaseXmitBufLock(ss);
4945
147k
    if (rv != SECSuccess) {
4946
0
        return SECFailure;
4947
0
    }
4948
4949
    /* Create the new spec. */
4950
147k
    spec = ssl_CreateCipherSpec(ss, direction);
4951
147k
    if (!spec) {
4952
0
        return SECFailure;
4953
0
    }
4954
147k
    spec->epoch = epoch;
4955
147k
    spec->nextSeqNum = 0;
4956
147k
    if (IS_DTLS(ss)) {
4957
5.20k
        dtls_InitRecvdRecords(&spec->recvdRecords);
4958
5.20k
    }
4959
4960
    /* This depends on spec having a valid direction and epoch. */
4961
147k
    rv = tls13_SetupPendingCipherSpec(ss, spec);
4962
147k
    if (rv != SECSuccess) {
4963
0
        goto loser;
4964
0
    }
4965
4966
147k
    type = (TrafficKeyType)PR_MIN(TrafficKeyApplicationData, epoch);
4967
147k
    rv = tls13_DeriveTrafficKeys(ss, spec, type, deleteSecret);
4968
147k
    if (rv != SECSuccess) {
4969
0
        goto loser;
4970
0
    }
4971
4972
147k
    rv = tls13_InitPendingContext(ss, spec);
4973
147k
    if (rv != SECSuccess) {
4974
0
        goto loser;
4975
0
    }
4976
4977
    /* Now that we've set almost everything up, finally cut over. */
4978
147k
    specp = (direction == ssl_secret_read) ? &ss->ssl3.crSpec : &ss->ssl3.cwSpec;
4979
147k
    ssl_GetSpecWriteLock(ss);
4980
147k
    ssl_CipherSpecRelease(*specp); /* May delete old cipher. */
4981
147k
    *specp = spec;                 /* Overwrite. */
4982
147k
    ssl_ReleaseSpecWriteLock(ss);
4983
4984
147k
    SSL_TRC(3, ("%d: TLS13[%d]: %s installed key for epoch=%d (%s) dir=%s",
4985
147k
                SSL_GETPID(), ss->fd, SSL_ROLE(ss), spec->epoch,
4986
147k
                spec->phase, SPEC_DIR(spec)));
4987
147k
    return SECSuccess;
4988
4989
0
loser:
4990
0
    ssl_CipherSpecRelease(spec);
4991
0
    return SECFailure;
4992
147k
}
4993
4994
SECStatus
4995
tls13_ComputeHandshakeHashes(sslSocket *ss, SSL3Hashes *hashes)
4996
25.6k
{
4997
25.6k
    SECStatus rv;
4998
25.6k
    PK11Context *ctx = NULL;
4999
25.6k
    PRBool useEchInner;
5000
25.6k
    sslBuffer *transcript;
5001
5002
25.6k
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
5003
25.6k
    if (ss->ssl3.hs.hashType == handshake_hash_unknown) {
5004
        /* Backup: if we haven't done any hashing, then hash now.
5005
         * This happens when we are doing 0-RTT on the client. */
5006
931
        ctx = PK11_CreateDigestContext(ssl3_HashTypeToOID(tls13_GetHash(ss)));
5007
931
        if (!ctx) {
5008
0
            ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
5009
0
            return SECFailure;
5010
0
        }
5011
5012
931
        if (PK11_DigestBegin(ctx) != SECSuccess) {
5013
0
            ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
5014
0
            goto loser;
5015
0
        }
5016
5017
        /* One might expect this to use ss->ssl3.hs.echAccepted,
5018
         * but with 0-RTT we don't know that yet. */
5019
931
        useEchInner = ss->sec.isServer ? PR_FALSE : !!ss->ssl3.hs.echHpkeCtx;
5020
931
        transcript = useEchInner ? &ss->ssl3.hs.echInnerMessages : &ss->ssl3.hs.messages;
5021
5022
931
        PRINT_BUF(10, (ss, "Handshake hash computed over saved messages",
5023
931
                       transcript->buf,
5024
931
                       transcript->len));
5025
5026
931
        if (PK11_DigestOp(ctx,
5027
931
                          transcript->buf,
5028
931
                          transcript->len) != SECSuccess) {
5029
0
            ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
5030
0
            goto loser;
5031
0
        }
5032
24.6k
    } else {
5033
24.6k
        if (ss->firstHsDone) {
5034
0
            ctx = PK11_CloneContext(ss->ssl3.hs.shaPostHandshake);
5035
24.6k
        } else {
5036
24.6k
            ctx = PK11_CloneContext(ss->ssl3.hs.sha);
5037
24.6k
        }
5038
24.6k
        if (!ctx) {
5039
0
            ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
5040
0
            return SECFailure;
5041
0
        }
5042
24.6k
    }
5043
5044
25.6k
    rv = PK11_DigestFinal(ctx, hashes->u.raw,
5045
25.6k
                          &hashes->len,
5046
25.6k
                          sizeof(hashes->u.raw));
5047
25.6k
    if (rv != SECSuccess) {
5048
0
        ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE);
5049
0
        goto loser;
5050
0
    }
5051
5052
25.6k
    PRINT_BUF(10, (ss, "Handshake hash", hashes->u.raw, hashes->len));
5053
25.6k
    PORT_Assert(hashes->len == tls13_GetHashSize(ss));
5054
25.6k
    PK11_DestroyContext(ctx, PR_TRUE);
5055
5056
25.6k
    return SECSuccess;
5057
5058
0
loser:
5059
0
    PK11_DestroyContext(ctx, PR_TRUE);
5060
0
    return SECFailure;
5061
25.6k
}
5062
5063
TLS13KeyShareEntry *
5064
tls13_CopyKeyShareEntry(TLS13KeyShareEntry *o)
5065
0
{
5066
0
    TLS13KeyShareEntry *n;
5067
5068
0
    PORT_Assert(o);
5069
0
    n = PORT_ZNew(TLS13KeyShareEntry);
5070
0
    if (!n) {
5071
0
        return NULL;
5072
0
    }
5073
5074
0
    if (SECSuccess != SECITEM_CopyItem(NULL, &n->key_exchange, &o->key_exchange)) {
5075
0
        PORT_Free(n);
5076
0
        return NULL;
5077
0
    }
5078
0
    n->group = o->group;
5079
0
    return n;
5080
0
}
5081
5082
void
5083
tls13_DestroyKeyShareEntry(TLS13KeyShareEntry *offer)
5084
6.92k
{
5085
6.92k
    if (!offer) {
5086
182
        return;
5087
182
    }
5088
6.74k
    SECITEM_ZfreeItem(&offer->key_exchange, PR_FALSE);
5089
6.74k
    PORT_ZFree(offer, sizeof(*offer));
5090
6.74k
}
5091
5092
void
5093
tls13_DestroyKeyShares(PRCList *list)
5094
343k
{
5095
343k
    PRCList *cur_p;
5096
5097
    /* The list must be initialized. */
5098
343k
    PORT_Assert(PR_LIST_HEAD(list));
5099
5100
350k
    while (!PR_CLIST_IS_EMPTY(list)) {
5101
6.71k
        cur_p = PR_LIST_TAIL(list);
5102
6.71k
        PR_REMOVE_LINK(cur_p);
5103
6.71k
        tls13_DestroyKeyShareEntry((TLS13KeyShareEntry *)cur_p);
5104
6.71k
    }
5105
343k
}
5106
5107
void
5108
tls13_DestroyEarlyData(PRCList *list)
5109
62.0k
{
5110
62.0k
    PRCList *cur_p;
5111
5112
62.0k
    while (!PR_CLIST_IS_EMPTY(list)) {
5113
0
        TLS13EarlyData *msg;
5114
5115
0
        cur_p = PR_LIST_TAIL(list);
5116
0
        msg = (TLS13EarlyData *)cur_p;
5117
5118
0
        PR_REMOVE_LINK(cur_p);
5119
0
        SECITEM_ZfreeItem(&msg->data, PR_FALSE);
5120
0
        PORT_ZFree(msg, sizeof(*msg));
5121
0
    }
5122
62.0k
}
5123
5124
/* draft-ietf-tls-tls13 Section 5.2.2 specifies the following
5125
 * nonce algorithm:
5126
 *
5127
 * The length of the per-record nonce (iv_length) is set to max(8 bytes,
5128
 * N_MIN) for the AEAD algorithm (see [RFC5116] Section 4).  An AEAD
5129
 * algorithm where N_MAX is less than 8 bytes MUST NOT be used with TLS.
5130
 * The per-record nonce for the AEAD construction is formed as follows:
5131
 *
5132
 * 1.  The 64-bit record sequence number is padded to the left with
5133
 *     zeroes to iv_length.
5134
 *
5135
 * 2.  The padded sequence number is XORed with the static
5136
 *     client_write_iv or server_write_iv, depending on the role.
5137
 *
5138
 * The resulting quantity (of length iv_length) is used as the per-
5139
 * record nonce.
5140
 *
5141
 * Existing suites have the same nonce size: N_MIN = N_MAX = 12 bytes
5142
 *
5143
 * See RFC 5288 and https://tools.ietf.org/html/draft-ietf-tls-chacha20-poly1305-04#section-2
5144
 */
5145
static void
5146
tls13_WriteNonce(const unsigned char *ivIn, unsigned int ivInLen,
5147
                 const unsigned char *nonce, unsigned int nonceLen,
5148
                 unsigned char *ivOut, unsigned int ivOutLen)
5149
15.3k
{
5150
15.3k
    size_t i;
5151
15.3k
    unsigned int offset = ivOutLen - nonceLen;
5152
5153
15.3k
    PORT_Assert(ivInLen <= ivOutLen);
5154
15.3k
    PORT_Assert(nonceLen <= ivOutLen);
5155
15.3k
    PORT_Memset(ivOut, 0, ivOutLen);
5156
15.3k
    PORT_Memcpy(ivOut, ivIn, ivInLen);
5157
5158
    /* XOR the last n bytes of the IV with the nonce (should be a counter). */
5159
138k
    for (i = 0; i < nonceLen; ++i) {
5160
123k
        ivOut[offset + i] ^= nonce[i];
5161
123k
    }
5162
15.3k
    PRINT_BUF(50, (NULL, "Nonce", ivOut, ivOutLen));
5163
15.3k
}
5164
5165
/* Setup the IV for AEAD encrypt. The PKCS #11 module will add the
5166
 * counter, but it doesn't know about the DTLS epic, so we add it here.
5167
 */
5168
unsigned int
5169
tls13_SetupAeadIv(PRBool isDTLS, SSL3ProtocolVersion v, unsigned char *ivOut, unsigned char *ivIn,
5170
                  unsigned int offset, unsigned int ivLen, DTLSEpoch epoch)
5171
25.9k
{
5172
25.9k
    PORT_Memcpy(ivOut, ivIn, ivLen);
5173
25.9k
    if (isDTLS && v < SSL_LIBRARY_VERSION_TLS_1_3) {
5174
        /* handle the tls 1.2 counter mode case, the epoc is copied
5175
         * instead of xored. We accomplish this by clearing ivOut
5176
         * before running xor. */
5177
54
        if (offset >= ivLen) {
5178
54
            ivOut[offset] = ivOut[offset + 1] = 0;
5179
54
        }
5180
54
        ivOut[offset] ^= (unsigned char)(epoch >> BPB) & 0xff;
5181
54
        ivOut[offset + 1] ^= (unsigned char)(epoch) & 0xff;
5182
54
        offset += 2;
5183
54
    }
5184
5185
25.9k
    return offset;
5186
25.9k
}
5187
5188
/*
5189
 * Do a single AEAD for TLS. This differs from PK11_AEADOp in the following
5190
 * ways.
5191
 *   1) If context is not supplied, it treats the operation as a single shot
5192
 *   and creates a context from symKey and mech.
5193
 *   2) It always assumes the tag will be at the end of the buffer
5194
 *   (in on decrypt, out on encrypt) just like the old single shot.
5195
 *   3) If we aren't generating an IV, it uses tls13_WriteNonce to create the
5196
 *   nonce.
5197
 * NOTE is context is supplied, symKey and mech are ignored
5198
 */
5199
SECStatus
5200
tls13_AEAD(PK11Context *context, PRBool decrypt,
5201
           CK_GENERATOR_FUNCTION ivGen, unsigned int fixedbits,
5202
           const unsigned char *ivIn, unsigned char *ivOut, unsigned int ivLen,
5203
           const unsigned char *nonceIn, unsigned int nonceLen,
5204
           const unsigned char *aad, unsigned int aadLen,
5205
           unsigned char *out, unsigned int *outLen, unsigned int maxout,
5206
           unsigned int tagLen, const unsigned char *in, unsigned int inLen)
5207
41.2k
{
5208
41.2k
    unsigned char *tag;
5209
41.2k
    unsigned char iv[MAX_IV_LENGTH];
5210
41.2k
    unsigned char tagbuf[HASH_LENGTH_MAX];
5211
41.2k
    SECStatus rv;
5212
5213
    /* must have either context or the symKey set */
5214
41.2k
    if (!context) {
5215
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
5216
0
        return SECFailure;
5217
0
    }
5218
5219
41.2k
    PORT_Assert(ivLen <= MAX_IV_LENGTH);
5220
41.2k
    PORT_Assert(tagLen <= HASH_LENGTH_MAX);
5221
41.2k
    if (!ivOut) {
5222
15.3k
        ivOut = iv; /* caller doesn't need a returned, iv */
5223
15.3k
    }
5224
5225
41.2k
    if (ivGen == CKG_NO_GENERATE) {
5226
15.3k
        tls13_WriteNonce(ivIn, ivLen, nonceIn, nonceLen, ivOut, ivLen);
5227
25.9k
    } else if (ivIn != ivOut) {
5228
0
        PORT_Memcpy(ivOut, ivIn, ivLen);
5229
0
    }
5230
41.2k
    if (decrypt) {
5231
15.3k
        if (inLen < tagLen) {
5232
0
            PORT_SetError(SEC_ERROR_INPUT_LEN);
5233
0
            return SECFailure;
5234
0
        }
5235
15.3k
        inLen = inLen - tagLen;
5236
15.3k
        tag = (unsigned char *)in + inLen;
5237
        /* tag is const on decrypt, but returned on encrypt */
5238
25.9k
    } else {
5239
        /* tag is written to a separate buffer, then added to the end
5240
         * of the actual output buffer. This allows output buffer to be larger
5241
         * than the input buffer and everything still work */
5242
25.9k
        tag = tagbuf;
5243
25.9k
    }
5244
41.2k
    rv = PK11_AEADOp(context, ivGen, fixedbits, ivOut, ivLen, aad, aadLen,
5245
41.2k
                     out, (int *)outLen, maxout, tag, tagLen, in, inLen);
5246
    /* on encrypt SSL always puts the tag at the end of the buffer */
5247
41.2k
    if ((rv == SECSuccess) && !(decrypt)) {
5248
25.9k
        unsigned int len = *outLen;
5249
        /* make sure there is still space */
5250
25.9k
        if (len + tagLen > maxout) {
5251
0
            PORT_SetError(SEC_ERROR_OUTPUT_LEN);
5252
0
            return SECFailure;
5253
0
        }
5254
25.9k
        PORT_Memcpy(out + len, tag, tagLen);
5255
25.9k
        *outLen += tagLen;
5256
25.9k
    }
5257
41.2k
    return rv;
5258
41.2k
}
5259
5260
static SECStatus
5261
tls13_HandleEncryptedExtensions(sslSocket *ss, PRUint8 *b, PRUint32 length)
5262
14
{
5263
14
    SECStatus rv;
5264
14
    PRUint32 innerLength;
5265
14
    SECItem oldAlpn = { siBuffer, NULL, 0 };
5266
5267
14
    PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss));
5268
14
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
5269
5270
14
    SSL_TRC(3, ("%d: TLS13[%d]: handle encrypted extensions",
5271
14
                SSL_GETPID(), ss->fd));
5272
5273
    /* EncryptedExtensions is sent by servers; a server must never receive one. */
5274
14
    if (ss->sec.isServer) {
5275
9
        FATAL_ERROR(ss, SSL_ERROR_RX_UNEXPECTED_ENCRYPTED_EXTENSIONS,
5276
9
                    unexpected_message);
5277
9
        return SECFailure;
5278
9
    }
5279
5280
5
    rv = TLS13_CHECK_HS_STATE(ss, SSL_ERROR_RX_UNEXPECTED_ENCRYPTED_EXTENSIONS,
5281
5
                              wait_encrypted_extensions);
5282
5
    if (rv != SECSuccess) {
5283
5
        return SECFailure;
5284
5
    }
5285
5286
0
    rv = ssl3_ConsumeHandshakeNumber(ss, &innerLength, 2, &b, &length);
5287
0
    if (rv != SECSuccess) {
5288
0
        return SECFailure; /* Alert already sent. */
5289
0
    }
5290
0
    if (innerLength != length) {
5291
0
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_ENCRYPTED_EXTENSIONS,
5292
0
                    illegal_parameter);
5293
0
        return SECFailure;
5294
0
    }
5295
5296
    /* If we are doing 0-RTT, then we already have an ALPN value. Stash
5297
     * it for comparison. */
5298
0
    if (ss->ssl3.hs.zeroRttState == ssl_0rtt_sent &&
5299
0
        ss->xtnData.nextProtoState == SSL_NEXT_PROTO_EARLY_VALUE) {
5300
0
        oldAlpn = ss->xtnData.nextProto;
5301
0
        ss->xtnData.nextProto.data = NULL;
5302
0
        ss->xtnData.nextProtoState = SSL_NEXT_PROTO_NO_SUPPORT;
5303
0
    }
5304
5305
0
    rv = ssl3_ParseExtensions(ss, &b, &length);
5306
0
    if (rv != SECSuccess) {
5307
0
        return SECFailure; /* Error code set below */
5308
0
    }
5309
5310
    /* Handle the rest of the extensions. */
5311
0
    rv = ssl3_HandleParsedExtensions(ss, ssl_hs_encrypted_extensions);
5312
0
    if (rv != SECSuccess) {
5313
0
        return SECFailure; /* Error code set below */
5314
0
    }
5315
5316
    /* We can only get here if we offered 0-RTT. */
5317
0
    if (ssl3_ExtensionNegotiated(ss, ssl_tls13_early_data_xtn)) {
5318
0
        PORT_Assert(ss->ssl3.hs.zeroRttState == ssl_0rtt_sent);
5319
0
        if (!ss->xtnData.selectedPsk) {
5320
            /* Illegal to accept 0-RTT without also accepting PSK. */
5321
0
            FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_ENCRYPTED_EXTENSIONS,
5322
0
                        illegal_parameter);
5323
0
            return SECFailure;
5324
0
        }
5325
0
        ss->ssl3.hs.zeroRttState = ssl_0rtt_accepted;
5326
5327
        /* Check that the server negotiated the same ALPN (if any). */
5328
0
        if (SECITEM_CompareItem(&oldAlpn, &ss->xtnData.nextProto)) {
5329
0
            SECITEM_FreeItem(&oldAlpn, PR_FALSE);
5330
0
            FATAL_ERROR(ss, SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID,
5331
0
                        illegal_parameter);
5332
0
            return SECFailure;
5333
0
        }
5334
        /* Check that the server negotiated the same cipher suite. */
5335
0
        if (ss->ssl3.hs.cipher_suite != ss->ssl3.hs.zeroRttSuite) {
5336
0
            FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_ENCRYPTED_EXTENSIONS,
5337
0
                        illegal_parameter);
5338
0
            return SECFailure;
5339
0
        }
5340
0
    } else if (ss->ssl3.hs.zeroRttState == ssl_0rtt_sent) {
5341
        /* Though we sent 0-RTT, the early_data extension wasn't present so the
5342
         * state is unmodified; the server must have rejected 0-RTT. */
5343
0
        ss->ssl3.hs.zeroRttState = ssl_0rtt_ignored;
5344
0
        ss->ssl3.hs.zeroRttIgnore = ssl_0rtt_ignore_trial;
5345
0
    } else {
5346
0
        PORT_Assert(ss->ssl3.hs.zeroRttState == ssl_0rtt_none ||
5347
0
                    (ss->ssl3.hs.helloRetry &&
5348
0
                     ss->ssl3.hs.zeroRttState == ssl_0rtt_ignored));
5349
0
    }
5350
5351
0
    SECITEM_FreeItem(&oldAlpn, PR_FALSE);
5352
0
    if (ss->ssl3.hs.kea_def->authKeyType == ssl_auth_psk) {
5353
0
        TLS13_SET_HS_STATE(ss, wait_finished);
5354
0
    } else {
5355
0
        TLS13_SET_HS_STATE(ss, wait_cert_request);
5356
0
    }
5357
5358
    /* Client is done with any PSKs */
5359
0
    tls13_DestroyPskList(&ss->ssl3.hs.psks);
5360
0
    ss->xtnData.selectedPsk = NULL;
5361
5362
0
    return SECSuccess;
5363
0
}
5364
5365
static SECStatus
5366
tls13_SendEncryptedExtensions(sslSocket *ss)
5367
2.71k
{
5368
2.71k
    sslBuffer extensions = SSL_BUFFER_EMPTY;
5369
2.71k
    SECStatus rv;
5370
5371
2.71k
    SSL_TRC(3, ("%d: TLS13[%d]: send encrypted extensions handshake",
5372
2.71k
                SSL_GETPID(), ss->fd));
5373
5374
2.71k
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
5375
2.71k
    PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss));
5376
5377
2.71k
    rv = ssl_ConstructExtensions(ss, &extensions, ssl_hs_encrypted_extensions);
5378
2.71k
    if (rv != SECSuccess) {
5379
0
        return SECFailure;
5380
0
    }
5381
5382
2.71k
    rv = ssl3_AppendHandshakeHeader(ss, ssl_hs_encrypted_extensions,
5383
2.71k
                                    SSL_BUFFER_LEN(&extensions) + 2);
5384
2.71k
    if (rv != SECSuccess) {
5385
0
        LOG_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE);
5386
0
        goto loser;
5387
0
    }
5388
2.71k
    rv = ssl3_AppendBufferToHandshakeVariable(ss, &extensions, 2);
5389
2.71k
    if (rv != SECSuccess) {
5390
0
        LOG_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE);
5391
0
        goto loser;
5392
0
    }
5393
2.71k
    sslBuffer_Clear(&extensions);
5394
2.71k
    return SECSuccess;
5395
5396
0
loser:
5397
0
    sslBuffer_Clear(&extensions);
5398
0
    return SECFailure;
5399
2.71k
}
5400
5401
SECStatus
5402
tls13_SendCertificateVerify(sslSocket *ss, SECKEYPrivateKey *privKey)
5403
2.71k
{
5404
2.71k
    SECStatus rv = SECFailure;
5405
2.71k
    SECItem buf = { siBuffer, NULL, 0 };
5406
2.71k
    unsigned int len;
5407
2.71k
    SSL3Hashes hash;
5408
5409
2.71k
    PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss));
5410
2.71k
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
5411
5412
2.71k
    SSL_TRC(3, ("%d: TLS13[%d]: send certificate_verify handshake",
5413
2.71k
                SSL_GETPID(), ss->fd));
5414
5415
2.71k
    PORT_Assert(ss->ssl3.hs.hashType == handshake_hash_single);
5416
2.71k
    rv = tls13_ComputeHandshakeHashes(ss, &hash);
5417
2.71k
    if (rv != SECSuccess) {
5418
0
        return SECFailure;
5419
0
    }
5420
5421
    /* We should have picked a signature scheme when we received a
5422
     * CertificateRequest, or when we picked a server certificate. */
5423
2.71k
    PORT_Assert(ss->ssl3.hs.signatureScheme != ssl_sig_none);
5424
2.71k
    if (ss->ssl3.hs.signatureScheme == ssl_sig_none) {
5425
0
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
5426
0
        return SECFailure;
5427
0
    }
5428
5429
2.71k
    rv = tls13_SignOrVerifyHashWithContext(ss, &hash, privKey, NULL,
5430
2.71k
                                           ss->ssl3.hs.signatureScheme,
5431
2.71k
                                           sig_sign, &buf);
5432
2.71k
    if (rv == SECSuccess && !ss->sec.isServer) {
5433
        /* Remember the info about the slot that did the signing.
5434
         * Later, when doing an SSL restart handshake, verify this.
5435
         * These calls are mere accessors, and can't fail.
5436
         */
5437
0
        PK11SlotInfo *slot;
5438
0
        sslSessionID *sid = ss->sec.ci.sid;
5439
5440
0
        slot = PK11_GetSlotFromPrivateKey(privKey);
5441
0
        sid->u.ssl3.clAuthSeries = PK11_GetSlotSeries(slot);
5442
0
        sid->u.ssl3.clAuthSlotID = PK11_GetSlotID(slot);
5443
0
        sid->u.ssl3.clAuthModuleID = PK11_GetModuleID(slot);
5444
0
        sid->u.ssl3.clAuthValid = PR_TRUE;
5445
0
        PK11_FreeSlot(slot);
5446
0
    }
5447
2.71k
    if (rv != SECSuccess) {
5448
0
        goto done; /* err code was set by tls13_SignOrVerifyHashWithContext */
5449
0
    }
5450
5451
2.71k
    len = buf.len + 2 + 2;
5452
5453
2.71k
    rv = ssl3_AppendHandshakeHeader(ss, ssl_hs_certificate_verify, len);
5454
2.71k
    if (rv != SECSuccess) {
5455
0
        goto done; /* error code set by AppendHandshake */
5456
0
    }
5457
5458
2.71k
    rv = ssl3_AppendHandshakeNumber(ss, ss->ssl3.hs.signatureScheme, 2);
5459
2.71k
    if (rv != SECSuccess) {
5460
0
        goto done; /* err set by AppendHandshakeNumber */
5461
0
    }
5462
5463
2.71k
    rv = ssl3_AppendHandshakeVariable(ss, buf.data, buf.len, 2);
5464
2.71k
    if (rv != SECSuccess) {
5465
0
        goto done; /* error code set by AppendHandshake */
5466
0
    }
5467
5468
2.71k
done:
5469
    /* For parity with the allocation functions, which don't use
5470
     * SECITEM_AllocItem(). */
5471
2.71k
    if (buf.data)
5472
2.71k
        PORT_Free(buf.data);
5473
2.71k
    return rv;
5474
2.71k
}
5475
5476
/* Called from tls13_CompleteHandleHandshakeMessage() when it has deciphered a complete
5477
 * tls13 CertificateVerify message
5478
 * Caller must hold Handshake and RecvBuf locks.
5479
 */
5480
SECStatus
5481
tls13_HandleCertificateVerify(sslSocket *ss, PRUint8 *b, PRUint32 length)
5482
13
{
5483
13
    sslDelegatedCredential *dc = ss->xtnData.peerDelegCred;
5484
13
    CERTSubjectPublicKeyInfo *spki;
5485
13
    SECKEYPublicKey *pubKey = NULL;
5486
13
    SECItem signed_hash = { siBuffer, NULL, 0 };
5487
13
    SECStatus rv;
5488
13
    SSLSignatureScheme sigScheme;
5489
13
    SSL3Hashes hashes;
5490
5491
13
    SSL_TRC(3, ("%d: TLS13[%d]: handle certificate_verify handshake",
5492
13
                SSL_GETPID(), ss->fd));
5493
13
    PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss));
5494
13
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
5495
5496
13
    rv = TLS13_CHECK_HS_STATE(ss, SSL_ERROR_RX_UNEXPECTED_CERT_VERIFY,
5497
13
                              wait_cert_verify);
5498
13
    if (rv != SECSuccess) {
5499
13
        return SECFailure;
5500
13
    }
5501
5502
0
    rv = tls13_ComputeHandshakeHashes(ss, &hashes);
5503
0
    if (rv != SECSuccess) {
5504
0
        return SECFailure;
5505
0
    }
5506
5507
0
    if (ss->firstHsDone) {
5508
0
        rv = ssl_HashPostHandshakeMessage(ss, ssl_hs_certificate_verify, b, length);
5509
0
    } else {
5510
0
        rv = ssl_HashHandshakeMessage(ss, ssl_hs_certificate_verify, b, length);
5511
0
    }
5512
0
    if (rv != SECSuccess) {
5513
0
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
5514
0
        return SECFailure;
5515
0
    }
5516
5517
0
    rv = ssl_ConsumeSignatureScheme(ss, &b, &length, &sigScheme);
5518
0
    if (rv != SECSuccess) {
5519
0
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_CERT_VERIFY, illegal_parameter);
5520
0
        return SECFailure;
5521
0
    }
5522
5523
    /* Set the |spki| used to verify the handshake. When verifying with a
5524
     * delegated credential (DC), this corresponds to the DC public key;
5525
     * otherwise it correspond to the public key of the peer's end-entity
5526
     * certificate.
5527
     */
5528
0
    if (tls13_IsVerifyingWithDelegatedCredential(ss)) {
5529
        /* DelegatedCredential.cred.expected_cert_verify_algorithm is expected
5530
         * to match CertificateVerify.scheme.
5531
         * DelegatedCredential.cred.expected_cert_verify_algorithm must also be
5532
         * the same as was reported in ssl3_AuthCertificate.
5533
         */
5534
0
        if (sigScheme != dc->expectedCertVerifyAlg || sigScheme != ss->sec.signatureScheme) {
5535
0
            FATAL_ERROR(ss, SSL_ERROR_DC_CERT_VERIFY_ALG_MISMATCH, illegal_parameter);
5536
0
            return SECFailure;
5537
0
        }
5538
5539
        /* Verify the DC has three steps: (1) use the peer's end-entity
5540
         * certificate to verify DelegatedCredential.signature, (2) check that
5541
         * the certificate has the correct key usage, and (3) check that the DC
5542
         * hasn't expired.
5543
         */
5544
0
        rv = tls13_VerifyDelegatedCredential(ss, dc);
5545
0
        if (rv != SECSuccess) { /* Calls FATAL_ERROR() */
5546
0
            return SECFailure;
5547
0
        }
5548
5549
0
        SSL_TRC(3, ("%d: TLS13[%d]: Verifying with delegated credential",
5550
0
                    SSL_GETPID(), ss->fd));
5551
0
        spki = dc->spki;
5552
0
    } else {
5553
0
        spki = ss->sec.peerCertSPKI;
5554
0
    }
5555
5556
0
    rv = ssl_CheckSignatureSchemeConsistency(ss, sigScheme, spki);
5557
0
    if (rv != SECSuccess) {
5558
        /* Error set already */
5559
0
        FATAL_ERROR(ss, PORT_GetError(), illegal_parameter);
5560
0
        return SECFailure;
5561
0
    }
5562
5563
0
    rv = ssl3_ConsumeHandshakeVariable(ss, &signed_hash, 2, &b, &length);
5564
0
    if (rv != SECSuccess) {
5565
0
        PORT_SetError(SSL_ERROR_RX_MALFORMED_CERT_VERIFY);
5566
0
        return SECFailure;
5567
0
    }
5568
5569
0
    if (length != 0) {
5570
0
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_CERT_VERIFY, decode_error);
5571
0
        return SECFailure;
5572
0
    }
5573
5574
0
    pubKey = SECKEY_ExtractPublicKey(spki);
5575
0
    if (pubKey == NULL) {
5576
0
        ssl_MapLowLevelError(SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE);
5577
0
        return SECFailure;
5578
0
    }
5579
5580
0
    rv = tls13_SignOrVerifyHashWithContext(ss, &hashes, NULL, pubKey,
5581
0
                                           sigScheme, sig_verify, &signed_hash);
5582
0
    if (rv != SECSuccess) {
5583
0
        FATAL_ERROR(ss, PORT_GetError(), decrypt_error);
5584
0
        goto loser;
5585
0
    }
5586
5587
    /* Set the auth type and verify it is what we captured in ssl3_AuthCertificate */
5588
0
    if (!ss->sec.isServer) {
5589
0
        ss->sec.authType = ssl_SignatureSchemeToAuthType(sigScheme);
5590
5591
0
        uint32_t prelimAuthKeyBits = ss->sec.authKeyBits;
5592
0
        rv = ssl_SetAuthKeyBits(ss, pubKey);
5593
0
        if (rv != SECSuccess) {
5594
0
            goto loser; /* Alert sent and code set. */
5595
0
        }
5596
5597
0
        if (prelimAuthKeyBits != ss->sec.authKeyBits) {
5598
0
            FATAL_ERROR(ss, SSL_ERROR_DC_CERT_VERIFY_ALG_MISMATCH, illegal_parameter);
5599
0
            goto loser;
5600
0
        }
5601
0
    }
5602
5603
    /* Request a client certificate now if one was requested. */
5604
0
    if (ss->ssl3.hs.clientCertRequested) {
5605
0
        PORT_Assert(!ss->sec.isServer);
5606
0
        rv = ssl3_BeginHandleCertificateRequest(
5607
0
            ss, ss->xtnData.sigSchemes, ss->xtnData.numSigSchemes,
5608
0
            &ss->xtnData.certReqAuthorities);
5609
0
        if (rv != SECSuccess) {
5610
0
            FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
5611
0
            goto loser;
5612
0
        }
5613
0
    }
5614
5615
0
    SECKEY_DestroyPublicKey(pubKey);
5616
0
    TLS13_SET_HS_STATE(ss, wait_finished);
5617
0
    return SECSuccess;
5618
5619
0
loser:
5620
0
    SECKEY_DestroyPublicKey(pubKey);
5621
0
    return SECFailure;
5622
0
}
5623
5624
/* Compute the PSK binder hash over:
5625
 * Client HRR prefix, if present in ss->ssl3.hs.messages or ss->ssl3.hs.echInnerMessages,
5626
 * |len| bytes of |buf| */
5627
static SECStatus
5628
tls13_ComputePskBinderHash(sslSocket *ss, PRUint8 *b, size_t length,
5629
                           SSL3Hashes *hashes, SSLHashType hashType)
5630
8.17k
{
5631
8.17k
    SECStatus rv;
5632
8.17k
    PK11Context *ctx = NULL;
5633
8.17k
    sslBuffer *clientResidual = NULL;
5634
8.17k
    if (!ss->sec.isServer) {
5635
        /* On the server, HRR residual is already buffered. */
5636
8.17k
        clientResidual = ss->ssl3.hs.echHpkeCtx ? &ss->ssl3.hs.echInnerMessages : &ss->ssl3.hs.messages;
5637
8.17k
    }
5638
8.17k
    PORT_Assert(ss->ssl3.hs.hashType == handshake_hash_unknown);
5639
8.17k
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
5640
5641
8.17k
    PRINT_BUF(10, (NULL, "Binder computed over ClientHello",
5642
8.17k
                   b, length));
5643
5644
8.17k
    ctx = PK11_CreateDigestContext(ssl3_HashTypeToOID(hashType));
5645
8.17k
    if (!ctx) {
5646
0
        goto loser;
5647
0
    }
5648
8.17k
    rv = PK11_DigestBegin(ctx);
5649
8.17k
    if (rv != SECSuccess) {
5650
0
        ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
5651
0
        goto loser;
5652
0
    }
5653
5654
8.17k
    if (clientResidual && clientResidual->len) {
5655
812
        PRINT_BUF(10, (NULL, " with HRR prefix", clientResidual->buf,
5656
812
                       clientResidual->len));
5657
812
        rv = PK11_DigestOp(ctx, clientResidual->buf, clientResidual->len);
5658
812
        if (rv != SECSuccess) {
5659
0
            ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
5660
0
            goto loser;
5661
0
        }
5662
812
    }
5663
5664
8.17k
    if (IS_DTLS(ss) && !ss->sec.isServer) {
5665
        /* Removing the unnecessary header fields.
5666
         * See ssl3_AppendHandshakeHeader.*/
5667
4.44k
        PORT_Assert(length >= 12);
5668
4.44k
        rv = PK11_DigestOp(ctx, b, 4);
5669
4.44k
        if (rv != SECSuccess) {
5670
0
            ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
5671
0
            goto loser;
5672
0
        }
5673
4.44k
        rv = PK11_DigestOp(ctx, b + 12, length - 12);
5674
4.44k
    } else {
5675
3.72k
        rv = PK11_DigestOp(ctx, b, length);
5676
3.72k
    }
5677
8.17k
    if (rv != SECSuccess) {
5678
0
        ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
5679
0
        goto loser;
5680
0
    }
5681
8.17k
    rv = PK11_DigestFinal(ctx, hashes->u.raw, &hashes->len, sizeof(hashes->u.raw));
5682
8.17k
    if (rv != SECSuccess) {
5683
0
        ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
5684
0
        goto loser;
5685
0
    }
5686
5687
8.17k
    PK11_DestroyContext(ctx, PR_TRUE);
5688
8.17k
    PRINT_BUF(10, (NULL, "PSK Binder hash", hashes->u.raw, hashes->len));
5689
8.17k
    return SECSuccess;
5690
5691
0
loser:
5692
0
    if (ctx) {
5693
0
        PK11_DestroyContext(ctx, PR_TRUE);
5694
0
    }
5695
0
    return SECFailure;
5696
8.17k
}
5697
5698
/* Compute and inject the PSK Binder for sending.
5699
 *
5700
 * When sending a ClientHello, we construct all the extensions with a dummy
5701
 * value for the binder.  To construct the binder, we commit the entire message
5702
 * up to the point where the binders start.  Then we calculate the hash using
5703
 * the saved message (in ss->ssl3.hs.messages).  This is written over the dummy
5704
 * binder, after which we write the remainder of the binder extension. */
5705
SECStatus
5706
tls13_WriteExtensionsWithBinder(sslSocket *ss, sslBuffer *extensions, sslBuffer *chBuf)
5707
8.17k
{
5708
8.17k
    SSL3Hashes hashes;
5709
8.17k
    SECStatus rv;
5710
5711
8.17k
    PORT_Assert(!PR_CLIST_IS_EMPTY(&ss->ssl3.hs.psks));
5712
8.17k
    sslPsk *psk = (sslPsk *)PR_LIST_HEAD(&ss->ssl3.hs.psks);
5713
8.17k
    unsigned int size = tls13_GetHashSizeForHash(psk->hash);
5714
8.17k
    unsigned int prefixLen = extensions->len - size - 3;
5715
8.17k
    unsigned int finishedLen;
5716
5717
8.17k
    PORT_Assert(extensions->len >= size + 3);
5718
5719
8.17k
    rv = sslBuffer_AppendNumber(chBuf, extensions->len, 2);
5720
8.17k
    if (rv != SECSuccess) {
5721
0
        return SECFailure;
5722
0
    }
5723
5724
    /* Only write the extension up to the point before the binders.  Assume that
5725
     * the pre_shared_key extension is at the end of the buffer.  Don't write
5726
     * the binder, or the lengths that precede it (a 2 octet length for the list
5727
     * of all binders, plus a 1 octet length for the binder length). */
5728
8.17k
    rv = sslBuffer_Append(chBuf, extensions->buf, prefixLen);
5729
8.17k
    if (rv != SECSuccess) {
5730
0
        return SECFailure;
5731
0
    }
5732
5733
    /* Calculate the binder based on what has been written out. */
5734
8.17k
    rv = tls13_ComputePskBinderHash(ss, chBuf->buf, chBuf->len, &hashes, psk->hash);
5735
8.17k
    if (rv != SECSuccess) {
5736
0
        return SECFailure;
5737
0
    }
5738
5739
    /* Write the binder into the extensions buffer, over the zeros we reserved
5740
     * previously. This avoids an allocation and means that we don't need a
5741
     * separate write for the extra bits that precede the binder. */
5742
8.17k
    PORT_Assert(psk->binderKey);
5743
8.17k
    rv = tls13_ComputeFinished(ss, psk->binderKey,
5744
8.17k
                               psk->hash, &hashes, PR_TRUE,
5745
8.17k
                               extensions->buf + extensions->len - size,
5746
8.17k
                               &finishedLen, size);
5747
8.17k
    if (rv != SECSuccess) {
5748
0
        return SECFailure;
5749
0
    }
5750
8.17k
    PORT_Assert(finishedLen == size);
5751
5752
    /* Write out the remainder of the extension. */
5753
8.17k
    rv = sslBuffer_Append(chBuf, extensions->buf + prefixLen,
5754
8.17k
                          extensions->len - prefixLen);
5755
8.17k
    if (rv != SECSuccess) {
5756
0
        return SECFailure;
5757
0
    }
5758
5759
8.17k
    return SECSuccess;
5760
8.17k
}
5761
5762
static SECStatus
5763
tls13_ComputeFinished(sslSocket *ss, PK11SymKey *baseKey,
5764
                      SSLHashType hashType, const SSL3Hashes *hashes,
5765
                      PRBool sending, PRUint8 *output, unsigned int *outputLen,
5766
                      unsigned int maxOutputLen)
5767
11.4k
{
5768
11.4k
    SECStatus rv;
5769
11.4k
    PK11Context *hmacCtx = NULL;
5770
11.4k
    CK_MECHANISM_TYPE macAlg = tls13_GetHmacMechanismFromHash(hashType);
5771
11.4k
    SECItem param = { siBuffer, NULL, 0 };
5772
11.4k
    unsigned int outputLenUint;
5773
11.4k
    const char *label = kHkdfLabelFinishedSecret;
5774
11.4k
    PK11SymKey *secret = NULL;
5775
5776
11.4k
    PORT_Assert(baseKey);
5777
11.4k
    SSL_TRC(3, ("%d: TLS13[%d]: %s calculate finished",
5778
11.4k
                SSL_GETPID(), ss->fd, SSL_ROLE(ss)));
5779
11.4k
    PRINT_BUF(50, (ss, "Handshake hash", hashes->u.raw, hashes->len));
5780
5781
    /* Now derive the appropriate finished secret from the base secret. */
5782
11.4k
    rv = tls13_HkdfExpandLabel(baseKey, hashType,
5783
11.4k
                               NULL, 0, label, strlen(label),
5784
11.4k
                               tls13_GetHmacMechanismFromHash(hashType),
5785
11.4k
                               tls13_GetHashSizeForHash(hashType),
5786
11.4k
                               ss->protocolVariant, &secret);
5787
11.4k
    if (rv != SECSuccess) {
5788
0
        goto abort;
5789
0
    }
5790
5791
11.4k
    PORT_Assert(hashes->len == tls13_GetHashSizeForHash(hashType));
5792
11.4k
    hmacCtx = PK11_CreateContextBySymKey(macAlg, CKA_SIGN,
5793
11.4k
                                         secret, &param);
5794
11.4k
    if (!hmacCtx) {
5795
0
        goto abort;
5796
0
    }
5797
5798
11.4k
    rv = PK11_DigestBegin(hmacCtx);
5799
11.4k
    if (rv != SECSuccess)
5800
0
        goto abort;
5801
5802
11.4k
    rv = PK11_DigestOp(hmacCtx, hashes->u.raw, hashes->len);
5803
11.4k
    if (rv != SECSuccess)
5804
0
        goto abort;
5805
5806
11.4k
    PORT_Assert(maxOutputLen >= tls13_GetHashSizeForHash(hashType));
5807
11.4k
    rv = PK11_DigestFinal(hmacCtx, output, &outputLenUint, maxOutputLen);
5808
11.4k
    if (rv != SECSuccess)
5809
0
        goto abort;
5810
11.4k
    *outputLen = outputLenUint;
5811
5812
11.4k
    PK11_FreeSymKey(secret);
5813
11.4k
    PK11_DestroyContext(hmacCtx, PR_TRUE);
5814
11.4k
    PRINT_BUF(50, (ss, "finished value", output, outputLenUint));
5815
11.4k
    return SECSuccess;
5816
5817
0
abort:
5818
0
    if (secret) {
5819
0
        PK11_FreeSymKey(secret);
5820
0
    }
5821
5822
0
    if (hmacCtx) {
5823
0
        PK11_DestroyContext(hmacCtx, PR_TRUE);
5824
0
    }
5825
5826
0
    PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
5827
0
    return SECFailure;
5828
11.4k
}
5829
5830
static SECStatus
5831
tls13_SendFinished(sslSocket *ss, PK11SymKey *baseKey)
5832
2.71k
{
5833
2.71k
    SECStatus rv;
5834
2.71k
    PRUint8 finishedBuf[TLS13_MAX_FINISHED_SIZE];
5835
2.71k
    unsigned int finishedLen;
5836
2.71k
    SSL3Hashes hashes;
5837
5838
2.71k
    SSL_TRC(3, ("%d: TLS13[%d]: send finished handshake", SSL_GETPID(), ss->fd));
5839
5840
2.71k
    PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss));
5841
2.71k
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
5842
5843
2.71k
    rv = tls13_ComputeHandshakeHashes(ss, &hashes);
5844
2.71k
    if (rv != SECSuccess) {
5845
0
        LOG_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE);
5846
0
        return SECFailure;
5847
0
    }
5848
5849
2.71k
    ssl_GetSpecReadLock(ss);
5850
2.71k
    rv = tls13_ComputeFinished(ss, baseKey, tls13_GetHash(ss), &hashes, PR_TRUE,
5851
2.71k
                               finishedBuf, &finishedLen, sizeof(finishedBuf));
5852
2.71k
    ssl_ReleaseSpecReadLock(ss);
5853
2.71k
    if (rv != SECSuccess) {
5854
0
        LOG_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE);
5855
0
        return SECFailure;
5856
0
    }
5857
5858
2.71k
    rv = ssl3_AppendHandshakeHeader(ss, ssl_hs_finished, finishedLen);
5859
2.71k
    if (rv != SECSuccess) {
5860
0
        return SECFailure; /* Error code already set. */
5861
0
    }
5862
5863
2.71k
    rv = ssl3_AppendHandshake(ss, finishedBuf, finishedLen);
5864
2.71k
    if (rv != SECSuccess) {
5865
0
        return SECFailure; /* Error code already set. */
5866
0
    }
5867
5868
    /* TODO(ekr@rtfm.com): Record key log */
5869
2.71k
    return SECSuccess;
5870
2.71k
}
5871
5872
static SECStatus
5873
tls13_VerifyFinished(sslSocket *ss, SSLHandshakeType message,
5874
                     PK11SymKey *secret,
5875
                     PRUint8 *b, PRUint32 length,
5876
                     const SSL3Hashes *hashes)
5877
548
{
5878
548
    SECStatus rv;
5879
548
    PRUint8 finishedBuf[TLS13_MAX_FINISHED_SIZE];
5880
548
    unsigned int finishedLen;
5881
5882
548
    if (!hashes) {
5883
0
        FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
5884
0
        return SECFailure;
5885
0
    }
5886
5887
548
    rv = tls13_ComputeFinished(ss, secret, tls13_GetHash(ss), hashes, PR_FALSE,
5888
548
                               finishedBuf, &finishedLen, sizeof(finishedBuf));
5889
548
    if (rv != SECSuccess) {
5890
0
        FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
5891
0
        return SECFailure;
5892
0
    }
5893
5894
548
    if (length != finishedLen) {
5895
#ifndef UNSAFE_FUZZER_MODE
5896
        FATAL_ERROR(ss, message == ssl_hs_finished ? SSL_ERROR_RX_MALFORMED_FINISHED : SSL_ERROR_RX_MALFORMED_CLIENT_HELLO, decode_error);
5897
        return SECFailure;
5898
#endif
5899
548
    }
5900
5901
548
    if (NSS_SecureMemcmp(b, finishedBuf, finishedLen) != 0) {
5902
#ifndef UNSAFE_FUZZER_MODE
5903
        FATAL_ERROR(ss, SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE,
5904
                    decrypt_error);
5905
        return SECFailure;
5906
#endif
5907
548
    }
5908
5909
548
    return SECSuccess;
5910
548
}
5911
5912
static SECStatus
5913
tls13_CommonHandleFinished(sslSocket *ss, PK11SymKey *key,
5914
                           PRUint8 *b, PRUint32 length)
5915
575
{
5916
575
    SECStatus rv;
5917
575
    SSL3Hashes hashes;
5918
5919
575
    rv = TLS13_CHECK_HS_STATE(ss, SSL_ERROR_RX_UNEXPECTED_FINISHED,
5920
575
                              wait_finished);
5921
575
    if (rv != SECSuccess) {
5922
27
        return SECFailure;
5923
27
    }
5924
548
    ss->ssl3.hs.endOfFlight = PR_TRUE;
5925
5926
548
    rv = tls13_ComputeHandshakeHashes(ss, &hashes);
5927
548
    if (rv != SECSuccess) {
5928
0
        LOG_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE);
5929
0
        return SECFailure;
5930
0
    }
5931
5932
548
    if (ss->firstHsDone) {
5933
0
        rv = ssl_HashPostHandshakeMessage(ss, ssl_hs_finished, b, length);
5934
548
    } else {
5935
548
        rv = ssl_HashHandshakeMessage(ss, ssl_hs_finished, b, length);
5936
548
    }
5937
548
    if (rv != SECSuccess) {
5938
0
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
5939
0
        return SECFailure;
5940
0
    }
5941
5942
548
    return tls13_VerifyFinished(ss, ssl_hs_finished,
5943
548
                                key, b, length, &hashes);
5944
548
}
5945
5946
static SECStatus
5947
tls13_ClientHandleFinished(sslSocket *ss, PRUint8 *b, PRUint32 length)
5948
4
{
5949
4
    SECStatus rv;
5950
5951
4
    PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss));
5952
4
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
5953
5954
4
    SSL_TRC(3, ("%d: TLS13[%d]: client handle finished handshake",
5955
4
                SSL_GETPID(), ss->fd));
5956
5957
4
    rv = tls13_CommonHandleFinished(ss, ss->ssl3.hs.serverHsTrafficSecret,
5958
4
                                    b, length);
5959
4
    if (rv != SECSuccess) {
5960
4
        return SECFailure;
5961
4
    }
5962
5963
0
    return tls13_SendClientSecondRound(ss);
5964
4
}
5965
5966
static SECStatus
5967
tls13_ServerHandleFinished(sslSocket *ss, PRUint8 *b, PRUint32 length)
5968
571
{
5969
571
    SECStatus rv;
5970
5971
571
    PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss));
5972
571
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
5973
5974
571
    SSL_TRC(3, ("%d: TLS13[%d]: server handle finished handshake",
5975
571
                SSL_GETPID(), ss->fd));
5976
5977
571
    if (!tls13_ShouldRequestClientAuth(ss)) {
5978
        /* Receiving this message might be the first sign we have that
5979
         * early data is over, so pretend we received EOED. */
5980
558
        rv = tls13_MaybeHandleSuppressedEndOfEarlyData(ss);
5981
558
        if (rv != SECSuccess) {
5982
0
            return SECFailure; /* Code already set. */
5983
0
        }
5984
5985
558
        if (!tls13_IsPostHandshake(ss)) {
5986
            /* Finalize the RTT estimate. */
5987
550
            ss->ssl3.hs.rttEstimate = ssl_Time(ss) - ss->ssl3.hs.rttEstimate;
5988
550
        }
5989
558
    }
5990
5991
571
    rv = tls13_CommonHandleFinished(ss,
5992
571
                                    ss->firstHsDone ? ss->ssl3.hs.clientTrafficSecret : ss->ssl3.hs.clientHsTrafficSecret,
5993
571
                                    b, length);
5994
571
    if (rv != SECSuccess) {
5995
23
        return SECFailure;
5996
23
    }
5997
5998
548
    if (ss->firstHsDone) {
5999
0
        TLS13_SET_HS_STATE(ss, idle_handshake);
6000
6001
0
        PORT_Assert(ss->ssl3.hs.shaPostHandshake != NULL);
6002
0
        PK11_DestroyContext(ss->ssl3.hs.shaPostHandshake, PR_TRUE);
6003
0
        ss->ssl3.hs.shaPostHandshake = NULL;
6004
6005
0
        ss->ssl3.clientCertRequested = PR_FALSE;
6006
6007
0
        if (ss->ssl3.hs.keyUpdateDeferred) {
6008
0
            rv = tls13_SendKeyUpdate(ss, ss->ssl3.hs.deferredKeyUpdateRequest,
6009
0
                                     PR_FALSE);
6010
0
            if (rv != SECSuccess) {
6011
0
                return SECFailure; /* error is set. */
6012
0
            }
6013
0
            ss->ssl3.hs.keyUpdateDeferred = PR_FALSE;
6014
0
        }
6015
6016
0
        return SECSuccess;
6017
0
    }
6018
6019
548
    if (!tls13_ShouldRequestClientAuth(ss) &&
6020
545
        (ss->ssl3.hs.zeroRttState != ssl_0rtt_done)) {
6021
545
        dtls_ReceivedFirstMessageInFlight(ss);
6022
545
    }
6023
6024
548
    rv = tls13_SetCipherSpec(ss, TrafficKeyApplicationData,
6025
548
                             ssl_secret_read, PR_FALSE);
6026
548
    if (rv != SECSuccess) {
6027
0
        FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
6028
0
        return SECFailure;
6029
0
    }
6030
6031
548
    if (IS_DTLS(ss)) {
6032
104
        ssl_CipherSpecReleaseByEpoch(ss, ssl_secret_read, TrafficKeyClearText);
6033
        /* We need to keep the handshake cipher spec so we can
6034
         * read re-transmitted client Finished. */
6035
104
        rv = dtls_StartTimer(ss, ss->ssl3.hs.hdTimer,
6036
104
                             DTLS_RETRANSMIT_FINISHED_MS,
6037
104
                             dtls13_HolddownTimerCb);
6038
104
        if (rv != SECSuccess) {
6039
0
            return SECFailure;
6040
0
        }
6041
104
    }
6042
6043
548
    rv = tls13_ComputeFinalSecrets(ss);
6044
548
    if (rv != SECSuccess) {
6045
0
        return SECFailure;
6046
0
    }
6047
6048
548
    rv = tls13_FinishHandshake(ss);
6049
548
    if (rv != SECSuccess) {
6050
0
        return SECFailure;
6051
0
    }
6052
6053
548
    ssl_GetXmitBufLock(ss);
6054
    /* If resumption, authType is the original value and not ssl_auth_psk. */
6055
548
    if (ss->opt.enableSessionTickets && ss->sec.authType != ssl_auth_psk) {
6056
350
        rv = tls13_SendNewSessionTicket(ss, NULL, 0);
6057
350
        if (rv != SECSuccess) {
6058
0
            goto loser;
6059
0
        }
6060
350
        rv = ssl3_FlushHandshake(ss, 0);
6061
350
        if (rv != SECSuccess) {
6062
0
            goto loser;
6063
0
        }
6064
350
    }
6065
548
    ssl_ReleaseXmitBufLock(ss);
6066
548
    return SECSuccess;
6067
6068
0
loser:
6069
0
    ssl_ReleaseXmitBufLock(ss);
6070
0
    return SECFailure;
6071
548
}
6072
6073
static SECStatus
6074
tls13_FinishHandshake(sslSocket *ss)
6075
548
{
6076
548
    PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss));
6077
548
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
6078
548
    PORT_Assert(ss->ssl3.hs.restartTarget == NULL);
6079
6080
    /* The first handshake is now completed. */
6081
548
    ss->handshake = NULL;
6082
6083
    /* Don't need this. */
6084
548
    PK11_FreeSymKey(ss->ssl3.hs.clientHsTrafficSecret);
6085
548
    ss->ssl3.hs.clientHsTrafficSecret = NULL;
6086
548
    PK11_FreeSymKey(ss->ssl3.hs.serverHsTrafficSecret);
6087
548
    ss->ssl3.hs.serverHsTrafficSecret = NULL;
6088
6089
548
    TLS13_SET_HS_STATE(ss, idle_handshake);
6090
6091
548
    return ssl_FinishHandshake(ss);
6092
548
}
6093
6094
/* Hash the handshake messages appended to sendBuf since `offset`.  The caller
6095
 * captures `offset` before appending, so anything that drains sendBuf in
6096
 * between leaves it stale; rather than compute a bogus length, fail. */
6097
static SECStatus
6098
tls13_UpdatePostHandshakeHashesFrom(sslSocket *ss, unsigned int offset)
6099
0
{
6100
0
    unsigned int len = SSL_BUFFER_LEN(&ss->sec.ci.sendBuf);
6101
6102
0
    if (len < offset) {
6103
0
        PORT_Assert(0);
6104
0
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
6105
0
        return SECFailure;
6106
0
    }
6107
0
    return ssl3_UpdatePostHandshakeHashes(
6108
0
        ss, SSL_BUFFER_BASE(&ss->sec.ci.sendBuf) + offset, len - offset);
6109
0
}
6110
6111
/* Do the parts of sending the client's second round that require
6112
 * the XmitBuf lock. */
6113
static SECStatus
6114
tls13_SendClientSecondFlight(sslSocket *ss)
6115
0
{
6116
0
    SECStatus rv;
6117
0
    unsigned int offset = 0;
6118
6119
0
    PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss));
6120
0
    PORT_Assert(!ss->ssl3.hs.clientCertificatePending);
6121
6122
0
    PRBool sendClientCert = !ss->ssl3.sendEmptyCert &&
6123
0
                            ss->ssl3.clientCertChain != NULL &&
6124
0
                            ss->ssl3.clientPrivateKey != NULL;
6125
6126
0
    if (ss->firstHsDone) {
6127
0
        offset = SSL_BUFFER_LEN(&ss->sec.ci.sendBuf);
6128
0
    }
6129
6130
0
    if (ss->ssl3.sendEmptyCert) {
6131
0
        ss->ssl3.sendEmptyCert = PR_FALSE;
6132
0
        rv = ssl3_SendEmptyCertificate(ss);
6133
        /* Don't send verify */
6134
0
        if (rv != SECSuccess) {
6135
0
            goto alert_error; /* error code is set. */
6136
0
        }
6137
0
    } else if (sendClientCert) {
6138
0
        rv = tls13_SendCertificate(ss);
6139
0
        if (rv != SECSuccess) {
6140
0
            goto alert_error; /* err code was set. */
6141
0
        }
6142
0
    }
6143
6144
0
    if (ss->firstHsDone) {
6145
0
        rv = tls13_UpdatePostHandshakeHashesFrom(ss, offset);
6146
0
        if (rv != SECSuccess) {
6147
0
            goto alert_error; /* err code was set. */
6148
0
        }
6149
0
    }
6150
6151
0
    if (ss->ssl3.hs.clientCertRequested) {
6152
0
        SECITEM_FreeItem(&ss->xtnData.certReqContext, PR_FALSE);
6153
0
        if (ss->xtnData.certReqAuthorities.arena) {
6154
0
            PORT_FreeArena(ss->xtnData.certReqAuthorities.arena, PR_FALSE);
6155
0
            ss->xtnData.certReqAuthorities.arena = NULL;
6156
0
        }
6157
0
        PORT_Memset(&ss->xtnData.certReqAuthorities, 0,
6158
0
                    sizeof(ss->xtnData.certReqAuthorities));
6159
0
        ss->ssl3.hs.clientCertRequested = PR_FALSE;
6160
0
    }
6161
6162
0
    if (sendClientCert) {
6163
0
        if (ss->firstHsDone) {
6164
0
            offset = SSL_BUFFER_LEN(&ss->sec.ci.sendBuf);
6165
0
        }
6166
6167
0
        rv = tls13_SendCertificateVerify(ss, ss->ssl3.clientPrivateKey);
6168
0
        SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey);
6169
0
        ss->ssl3.clientPrivateKey = NULL;
6170
0
        if (rv != SECSuccess) {
6171
0
            goto alert_error; /* err code was set. */
6172
0
        }
6173
6174
0
        if (ss->firstHsDone) {
6175
0
            rv = tls13_UpdatePostHandshakeHashesFrom(ss, offset);
6176
0
            if (rv != SECSuccess) {
6177
0
                goto alert_error; /* err code was set. */
6178
0
            }
6179
0
        }
6180
0
    }
6181
6182
0
    rv = tls13_SendFinished(ss, ss->firstHsDone ? ss->ssl3.hs.clientTrafficSecret : ss->ssl3.hs.clientHsTrafficSecret);
6183
0
    if (rv != SECSuccess) {
6184
0
        goto alert_error; /* err code was set. */
6185
0
    }
6186
0
    rv = ssl3_FlushHandshake(ss, 0);
6187
0
    if (rv != SECSuccess) {
6188
        /* No point in sending an alert here because we're not going to
6189
         * be able to send it if we couldn't flush the handshake. */
6190
0
        goto error;
6191
0
    }
6192
6193
0
    return SECSuccess;
6194
6195
0
alert_error:
6196
0
    FATAL_ERROR(ss, PORT_GetError(), internal_error);
6197
0
    return SECFailure;
6198
0
error:
6199
0
    LOG_ERROR(ss, PORT_GetError());
6200
0
    return SECFailure;
6201
0
}
6202
6203
static SECStatus
6204
tls13_SendClientSecondRound(sslSocket *ss)
6205
0
{
6206
0
    SECStatus rv;
6207
6208
0
    PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss));
6209
0
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
6210
6211
    /* Defer client authentication sending if we are still waiting for server
6212
     * authentication.  This avoids unnecessary disclosure of client credentials
6213
     * to an unauthenticated server.
6214
     */
6215
0
    if (ss->ssl3.hs.restartTarget) {
6216
0
        PR_NOT_REACHED("unexpected ss->ssl3.hs.restartTarget");
6217
0
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
6218
0
        return SECFailure;
6219
0
    }
6220
0
    if (ss->ssl3.hs.authCertificatePending || ss->ssl3.hs.clientCertificatePending) {
6221
0
        SSL_TRC(3, ("%d: TLS13[%d]: deferring tls13_SendClientSecondRound because"
6222
0
                    " certificate authentication is still pending.",
6223
0
                    SSL_GETPID(), ss->fd));
6224
0
        ss->ssl3.hs.restartTarget = tls13_SendClientSecondRound;
6225
0
        PORT_SetError(PR_WOULD_BLOCK_ERROR);
6226
0
        return SECFailure;
6227
0
    }
6228
6229
0
    rv = tls13_ComputeApplicationSecrets(ss);
6230
0
    if (rv != SECSuccess) {
6231
0
        FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
6232
0
        return SECFailure;
6233
0
    }
6234
6235
0
    if (ss->ssl3.hs.zeroRttState == ssl_0rtt_accepted) {
6236
0
        ssl_GetXmitBufLock(ss); /*******************************/
6237
0
        rv = tls13_SendEndOfEarlyData(ss);
6238
0
        ssl_ReleaseXmitBufLock(ss); /*******************************/
6239
0
        if (rv != SECSuccess) {
6240
0
            return SECFailure; /* Error code already set. */
6241
0
        }
6242
0
    } else if (ss->opt.enableTls13CompatMode && !IS_DTLS(ss) &&
6243
0
               ss->ssl3.hs.zeroRttState == ssl_0rtt_none &&
6244
0
               !ss->ssl3.hs.helloRetry) {
6245
0
        ssl_GetXmitBufLock(ss); /*******************************/
6246
0
        rv = ssl3_SendChangeCipherSpecsInt(ss);
6247
0
        ssl_ReleaseXmitBufLock(ss); /*******************************/
6248
0
        if (rv != SECSuccess) {
6249
0
            return rv;
6250
0
        }
6251
0
    }
6252
6253
0
    rv = tls13_SetCipherSpec(ss, TrafficKeyHandshake,
6254
0
                             ssl_secret_write, PR_FALSE);
6255
0
    if (rv != SECSuccess) {
6256
0
        FATAL_ERROR(ss, SSL_ERROR_INIT_CIPHER_SUITE_FAILURE, internal_error);
6257
0
        return SECFailure;
6258
0
    }
6259
6260
0
    rv = tls13_SetCipherSpec(ss, TrafficKeyApplicationData,
6261
0
                             ssl_secret_read, PR_FALSE);
6262
0
    if (rv != SECSuccess) {
6263
0
        FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
6264
0
        return SECFailure;
6265
0
    }
6266
6267
0
    ssl_GetXmitBufLock(ss); /*******************************/
6268
    /* This call can't block, as clientAuthCertificatePending is checked above */
6269
0
    rv = tls13_SendClientSecondFlight(ss);
6270
0
    ssl_ReleaseXmitBufLock(ss); /*******************************/
6271
0
    if (rv != SECSuccess) {
6272
0
        return SECFailure;
6273
0
    }
6274
0
    rv = tls13_SetCipherSpec(ss, TrafficKeyApplicationData,
6275
0
                             ssl_secret_write, PR_FALSE);
6276
0
    if (rv != SECSuccess) {
6277
0
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
6278
0
        return SECFailure;
6279
0
    }
6280
6281
0
    rv = tls13_ComputeFinalSecrets(ss);
6282
0
    if (rv != SECSuccess) {
6283
0
        return SECFailure;
6284
0
    }
6285
6286
    /* The handshake is now finished */
6287
0
    return tls13_FinishHandshake(ss);
6288
0
}
6289
6290
/*
6291
 *  enum { (65535) } TicketExtensionType;
6292
 *
6293
 *  struct {
6294
 *      TicketExtensionType extension_type;
6295
 *      opaque extension_data<0..2^16-1>;
6296
 *  } TicketExtension;
6297
 *
6298
 *   struct {
6299
 *       uint32 ticket_lifetime;
6300
 *       uint32 ticket_age_add;
6301
 *       opaque ticket_nonce<1..255>;
6302
 *       opaque ticket<1..2^16-1>;
6303
 *       TicketExtension extensions<0..2^16-2>;
6304
 *   } NewSessionTicket;
6305
 */
6306
6307
static SECStatus
6308
tls13_SendNewSessionTicket(sslSocket *ss, const PRUint8 *appToken,
6309
                           unsigned int appTokenLen)
6310
350
{
6311
350
    PRUint16 message_length;
6312
350
    PK11SymKey *secret;
6313
350
    SECItem ticket_data = { 0, NULL, 0 };
6314
350
    SECStatus rv;
6315
350
    NewSessionTicket ticket = { 0 };
6316
350
    PRUint32 max_early_data_size_len = 0;
6317
350
    PRUint32 greaseLen = 0;
6318
350
    PRUint8 ticketNonce[sizeof(ss->ssl3.hs.ticketNonce)];
6319
350
    sslBuffer ticketNonceBuf = SSL_BUFFER(ticketNonce);
6320
6321
350
    SSL_TRC(3, ("%d: TLS13[%d]: send new session ticket message %d",
6322
350
                SSL_GETPID(), ss->fd, ss->ssl3.hs.ticketNonce));
6323
6324
350
    ticket.flags = 0;
6325
350
    if (ss->opt.enable0RttData) {
6326
148
        ticket.flags |= ticket_allow_early_data;
6327
148
        max_early_data_size_len = 8; /* type + len + value. */
6328
148
    }
6329
350
    ticket.ticket_lifetime_hint = ssl_ticket_lifetime;
6330
6331
350
    if (ss->opt.enableGrease) {
6332
182
        greaseLen = 4; /* type + len + 0 (empty) */
6333
182
    }
6334
6335
    /* The ticket age obfuscator. */
6336
350
    rv = PK11_GenerateRandom((PRUint8 *)&ticket.ticket_age_add,
6337
350
                             sizeof(ticket.ticket_age_add));
6338
350
    if (rv != SECSuccess)
6339
0
        goto loser;
6340
6341
350
    rv = sslBuffer_AppendNumber(&ticketNonceBuf, ss->ssl3.hs.ticketNonce,
6342
350
                                sizeof(ticketNonce));
6343
350
    if (rv != SECSuccess) {
6344
0
        goto loser;
6345
0
    }
6346
350
    ++ss->ssl3.hs.ticketNonce;
6347
350
    rv = tls13_HkdfExpandLabel(ss->ssl3.hs.resumptionMasterSecret,
6348
350
                               tls13_GetHash(ss),
6349
350
                               ticketNonce, sizeof(ticketNonce),
6350
350
                               kHkdfLabelResumption,
6351
350
                               strlen(kHkdfLabelResumption),
6352
350
                               CKM_HKDF_DERIVE,
6353
350
                               tls13_GetHashSize(ss),
6354
350
                               ss->protocolVariant, &secret);
6355
350
    if (rv != SECSuccess) {
6356
0
        goto loser;
6357
0
    }
6358
6359
350
    rv = ssl3_EncodeSessionTicket(ss, &ticket, appToken, appTokenLen,
6360
350
                                  secret, &ticket_data);
6361
350
    PK11_FreeSymKey(secret);
6362
350
    if (rv != SECSuccess)
6363
0
        goto loser;
6364
6365
350
    message_length =
6366
350
        4 +                       /* lifetime */
6367
350
        4 +                       /* ticket_age_add */
6368
350
        1 + sizeof(ticketNonce) + /* ticket_nonce */
6369
350
        2 +                       /* extensions lentgh */
6370
350
        max_early_data_size_len + /* max_early_data_size extension length */
6371
350
        greaseLen +               /* GREASE extension length */
6372
350
        2 +                       /* ticket length */
6373
350
        ticket_data.len;
6374
6375
350
    rv = ssl3_AppendHandshakeHeader(ss, ssl_hs_new_session_ticket,
6376
350
                                    message_length);
6377
350
    if (rv != SECSuccess)
6378
0
        goto loser;
6379
6380
    /* This is a fixed value. */
6381
350
    rv = ssl3_AppendHandshakeNumber(ss, ssl_ticket_lifetime, 4);
6382
350
    if (rv != SECSuccess)
6383
0
        goto loser;
6384
6385
350
    rv = ssl3_AppendHandshakeNumber(ss, ticket.ticket_age_add, 4);
6386
350
    if (rv != SECSuccess)
6387
0
        goto loser;
6388
6389
    /* The ticket nonce. */
6390
350
    rv = ssl3_AppendHandshakeVariable(ss, ticketNonce, sizeof(ticketNonce), 1);
6391
350
    if (rv != SECSuccess)
6392
0
        goto loser;
6393
6394
    /* Encode the ticket. */
6395
350
    rv = ssl3_AppendHandshakeVariable(
6396
350
        ss, ticket_data.data, ticket_data.len, 2);
6397
350
    if (rv != SECSuccess)
6398
0
        goto loser;
6399
6400
    /* Extensions */
6401
350
    rv = ssl3_AppendHandshakeNumber(ss, max_early_data_size_len + greaseLen, 2);
6402
350
    if (rv != SECSuccess)
6403
0
        goto loser;
6404
6405
    /* GREASE NewSessionTicket:
6406
     * When sending a NewSessionTicket message in TLS 1.3, a server MAY select
6407
     * one or more GREASE extension values and advertise them as extensions
6408
     * with varying length and contents [RFC8701, SEction 4.1]. */
6409
350
    if (ss->opt.enableGrease) {
6410
182
        PR_ASSERT(ss->version >= SSL_LIBRARY_VERSION_TLS_1_3);
6411
6412
182
        PRUint16 grease;
6413
182
        rv = tls13_RandomGreaseValue(&grease);
6414
182
        if (rv != SECSuccess)
6415
0
            goto loser;
6416
        /* Extension type */
6417
182
        rv = ssl3_AppendHandshakeNumber(ss, grease, 2);
6418
182
        if (rv != SECSuccess)
6419
0
            goto loser;
6420
        /* Extension length */
6421
182
        rv = ssl3_AppendHandshakeNumber(ss, 0, 2);
6422
182
        if (rv != SECSuccess)
6423
0
            goto loser;
6424
182
    }
6425
6426
    /* Max early data size extension. */
6427
350
    if (max_early_data_size_len) {
6428
148
        rv = ssl3_AppendHandshakeNumber(
6429
148
            ss, ssl_tls13_early_data_xtn, 2);
6430
148
        if (rv != SECSuccess)
6431
0
            goto loser;
6432
6433
        /* Length */
6434
148
        rv = ssl3_AppendHandshakeNumber(ss, 4, 2);
6435
148
        if (rv != SECSuccess)
6436
0
            goto loser;
6437
6438
148
        rv = ssl3_AppendHandshakeNumber(ss, ss->opt.maxEarlyDataSize, 4);
6439
148
        if (rv != SECSuccess)
6440
0
            goto loser;
6441
148
    }
6442
6443
350
    SECITEM_FreeItem(&ticket_data, PR_FALSE);
6444
350
    return SECSuccess;
6445
6446
0
loser:
6447
0
    if (ticket_data.data) {
6448
0
        SECITEM_FreeItem(&ticket_data, PR_FALSE);
6449
0
    }
6450
0
    return SECFailure;
6451
350
}
6452
6453
SECStatus
6454
SSLExp_SendSessionTicket(PRFileDesc *fd, const PRUint8 *token,
6455
                         unsigned int tokenLen)
6456
0
{
6457
0
    sslSocket *ss;
6458
0
    SECStatus rv;
6459
6460
0
    ss = ssl_FindSocket(fd);
6461
0
    if (!ss) {
6462
0
        return SECFailure;
6463
0
    }
6464
6465
0
    if (IS_DTLS(ss)) {
6466
0
        PORT_SetError(SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_VERSION);
6467
0
        return SECFailure;
6468
0
    }
6469
6470
0
    if (!ss->sec.isServer || !tls13_IsPostHandshake(ss) ||
6471
0
        tokenLen > 0xffff) {
6472
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
6473
0
        return SECFailure;
6474
0
    }
6475
6476
    /* Disable tickets if we can trace this connection back to a PSK.
6477
     * We aren't able to issue tickets (currently) without a certificate.
6478
     * As PSK =~ resumption, there is no reason to do this. */
6479
0
    if (ss->sec.authType == ssl_auth_psk) {
6480
0
        PORT_SetError(SSL_ERROR_FEATURE_DISABLED);
6481
0
        return SECFailure;
6482
0
    }
6483
6484
0
    ssl_GetSSL3HandshakeLock(ss);
6485
0
    ssl_GetXmitBufLock(ss);
6486
0
    rv = tls13_SendNewSessionTicket(ss, token, tokenLen);
6487
0
    if (rv == SECSuccess) {
6488
0
        rv = ssl3_FlushHandshake(ss, 0);
6489
0
    }
6490
0
    ssl_ReleaseXmitBufLock(ss);
6491
0
    ssl_ReleaseSSL3HandshakeLock(ss);
6492
6493
0
    return rv;
6494
0
}
6495
6496
static SECStatus
6497
tls13_HandleNewSessionTicket(sslSocket *ss, PRUint8 *b, PRUint32 length)
6498
10
{
6499
10
    SECStatus rv;
6500
10
    PRUint32 utmp;
6501
10
    NewSessionTicket ticket = { 0 };
6502
10
    SECItem data;
6503
10
    SECItem ticket_nonce;
6504
10
    SECItem ticket_data;
6505
6506
10
    SSL_TRC(3, ("%d: TLS13[%d]: handle new session ticket message",
6507
10
                SSL_GETPID(), ss->fd));
6508
6509
10
    rv = TLS13_CHECK_HS_STATE(ss, SSL_ERROR_RX_UNEXPECTED_NEW_SESSION_TICKET,
6510
10
                              idle_handshake);
6511
10
    if (rv != SECSuccess) {
6512
8
        return SECFailure;
6513
8
    }
6514
2
    if (!tls13_IsPostHandshake(ss) || ss->sec.isServer) {
6515
2
        FATAL_ERROR(ss, SSL_ERROR_RX_UNEXPECTED_NEW_SESSION_TICKET,
6516
2
                    unexpected_message);
6517
2
        return SECFailure;
6518
2
    }
6519
6520
0
    ticket.received_timestamp = ssl_Time(ss);
6521
0
    rv = ssl3_ConsumeHandshakeNumber(ss, &ticket.ticket_lifetime_hint, 4, &b,
6522
0
                                     &length);
6523
0
    if (rv != SECSuccess) {
6524
0
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_NEW_SESSION_TICKET,
6525
0
                    decode_error);
6526
0
        return SECFailure;
6527
0
    }
6528
0
    ticket.ticket.type = siBuffer;
6529
6530
0
    rv = ssl3_ConsumeHandshake(ss, &utmp, sizeof(utmp),
6531
0
                               &b, &length);
6532
0
    if (rv != SECSuccess) {
6533
0
        PORT_SetError(SSL_ERROR_RX_MALFORMED_NEW_SESSION_TICKET);
6534
0
        return SECFailure;
6535
0
    }
6536
0
    ticket.ticket_age_add = PR_ntohl(utmp);
6537
6538
    /* The nonce. */
6539
0
    rv = ssl3_ConsumeHandshakeVariable(ss, &ticket_nonce, 1, &b, &length);
6540
0
    if (rv != SECSuccess) {
6541
0
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_NEW_SESSION_TICKET,
6542
0
                    decode_error);
6543
0
        return SECFailure;
6544
0
    }
6545
6546
    /* Get the ticket value. */
6547
0
    rv = ssl3_ConsumeHandshakeVariable(ss, &ticket_data, 2, &b, &length);
6548
0
    if (rv != SECSuccess || !ticket_data.len) {
6549
0
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_NEW_SESSION_TICKET,
6550
0
                    decode_error);
6551
0
        return SECFailure;
6552
0
    }
6553
6554
    /* Parse extensions. */
6555
0
    rv = ssl3_ConsumeHandshakeVariable(ss, &data, 2, &b, &length);
6556
0
    if (rv != SECSuccess || length) {
6557
0
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_NEW_SESSION_TICKET,
6558
0
                    decode_error);
6559
0
        return SECFailure;
6560
0
    }
6561
6562
0
    rv = ssl3_HandleExtensions(ss, &data.data,
6563
0
                               &data.len, ssl_hs_new_session_ticket);
6564
0
    if (rv != SECSuccess) {
6565
0
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_NEW_SESSION_TICKET,
6566
0
                    decode_error);
6567
0
        return SECFailure;
6568
0
    }
6569
0
    if (ss->xtnData.max_early_data_size) {
6570
0
        ticket.flags |= ticket_allow_early_data;
6571
0
        ticket.max_early_data_size = ss->xtnData.max_early_data_size;
6572
0
    }
6573
6574
0
    if (!ss->opt.noCache) {
6575
0
        PK11SymKey *secret;
6576
6577
0
        PORT_Assert(ss->sec.ci.sid);
6578
0
        rv = SECITEM_CopyItem(NULL, &ticket.ticket, &ticket_data);
6579
0
        if (rv != SECSuccess) {
6580
0
            FATAL_ERROR(ss, SEC_ERROR_NO_MEMORY, internal_error);
6581
0
            return SECFailure;
6582
0
        }
6583
0
        PRINT_BUF(50, (ss, "Caching session ticket",
6584
0
                       ticket.ticket.data,
6585
0
                       ticket.ticket.len));
6586
6587
        /* Replace a previous session ticket when
6588
         * we receive a second NewSessionTicket message. */
6589
0
        if (ss->sec.ci.sid->cached == in_client_cache ||
6590
0
            ss->sec.ci.sid->cached == in_external_cache) {
6591
            /* Create a new session ID. */
6592
0
            sslSessionID *sid = ssl3_NewSessionID(ss, PR_FALSE);
6593
0
            if (!sid) {
6594
0
                return SECFailure;
6595
0
            }
6596
6597
            /* Copy over the peer certificate. */
6598
0
            PORT_Assert(ss->sec.ci.sid->peerCertDER.data);
6599
0
            if (SECITEM_CopyItem(NULL, &sid->peerCertDER,
6600
0
                                 &ss->sec.ci.sid->peerCertDER) != SECSuccess) {
6601
0
                ssl_FreeSID(sid);
6602
0
                return SECFailure;
6603
0
            }
6604
6605
            /* Destroy the old SID. */
6606
0
            ssl_UncacheSessionID(ss);
6607
0
            ssl_SetSocketSID(ss, sid);
6608
0
        }
6609
6610
0
        ssl3_SetSIDSessionTicket(ss->sec.ci.sid, &ticket);
6611
0
        PORT_Assert(!ticket.ticket.data);
6612
6613
0
        rv = tls13_HkdfExpandLabel(ss->ssl3.hs.resumptionMasterSecret,
6614
0
                                   tls13_GetHash(ss),
6615
0
                                   ticket_nonce.data, ticket_nonce.len,
6616
0
                                   kHkdfLabelResumption,
6617
0
                                   strlen(kHkdfLabelResumption),
6618
0
                                   CKM_HKDF_DERIVE,
6619
0
                                   tls13_GetHashSize(ss),
6620
0
                                   ss->protocolVariant, &secret);
6621
0
        if (rv != SECSuccess) {
6622
0
            return SECFailure;
6623
0
        }
6624
6625
0
        rv = ssl3_FillInCachedSID(ss, ss->sec.ci.sid, secret);
6626
0
        PK11_FreeSymKey(secret);
6627
0
        if (rv != SECSuccess) {
6628
0
            return SECFailure;
6629
0
        }
6630
6631
        /* Cache the session. */
6632
0
        ssl_CacheSessionID(ss);
6633
0
    }
6634
6635
0
    return SECSuccess;
6636
0
}
6637
6638
#define _M_NONE 0
6639
145k
#define _M(a) (1 << PR_MIN(a, 31))
6640
#define _M1(a) (_M(ssl_hs_##a))
6641
#define _M2(a, b) (_M1(a) | _M1(b))
6642
#define _M3(a, b, c) (_M1(a) | _M2(b, c))
6643
6644
static const struct {
6645
    PRUint16 ex_value;
6646
    PRUint32 messages;
6647
} KnownExtensions[] = {
6648
    { ssl_server_name_xtn, _M2(client_hello, encrypted_extensions) },
6649
    { ssl_supported_groups_xtn, _M2(client_hello, encrypted_extensions) },
6650
    { ssl_signature_algorithms_xtn, _M2(client_hello, certificate_request) },
6651
    { ssl_signature_algorithms_cert_xtn, _M2(client_hello,
6652
                                             certificate_request) },
6653
    { ssl_use_srtp_xtn, _M2(client_hello, encrypted_extensions) },
6654
    { ssl_app_layer_protocol_xtn, _M2(client_hello, encrypted_extensions) },
6655
    { ssl_padding_xtn, _M1(client_hello) },
6656
    { ssl_tls13_key_share_xtn, _M3(client_hello, server_hello,
6657
                                   hello_retry_request) },
6658
    { ssl_tls13_pre_shared_key_xtn, _M2(client_hello, server_hello) },
6659
    { ssl_tls13_psk_key_exchange_modes_xtn, _M1(client_hello) },
6660
    { ssl_tls13_early_data_xtn, _M3(client_hello, encrypted_extensions,
6661
                                    new_session_ticket) },
6662
    { ssl_signed_cert_timestamp_xtn, _M3(client_hello, certificate_request,
6663
                                         certificate) },
6664
    { ssl_cert_status_xtn, _M3(client_hello, certificate_request,
6665
                               certificate) },
6666
    { ssl_delegated_credentials_xtn, _M2(client_hello, certificate) },
6667
    { ssl_tls13_cookie_xtn, _M2(client_hello, hello_retry_request) },
6668
    { ssl_tls13_certificate_authorities_xtn, _M2(client_hello, certificate_request) },
6669
    { ssl_tls13_supported_versions_xtn, _M3(client_hello, server_hello,
6670
                                            hello_retry_request) },
6671
    { ssl_record_size_limit_xtn, _M2(client_hello, encrypted_extensions) },
6672
    { ssl_tls13_encrypted_client_hello_xtn, _M3(client_hello, encrypted_extensions, hello_retry_request) },
6673
    { ssl_tls13_outer_extensions_xtn, _M_NONE /* Encoding/decoding only */ },
6674
    { ssl_tls13_post_handshake_auth_xtn, _M1(client_hello) },
6675
    { ssl_certificate_compression_xtn, _M2(client_hello, certificate_request) }
6676
};
6677
6678
tls13ExtensionStatus
6679
tls13_ExtensionStatus(PRUint16 extension, SSLHandshakeType message)
6680
184k
{
6681
184k
    unsigned int i;
6682
6683
184k
    PORT_Assert((message == ssl_hs_client_hello) ||
6684
184k
                (message == ssl_hs_server_hello) ||
6685
184k
                (message == ssl_hs_hello_retry_request) ||
6686
184k
                (message == ssl_hs_encrypted_extensions) ||
6687
184k
                (message == ssl_hs_new_session_ticket) ||
6688
184k
                (message == ssl_hs_certificate) ||
6689
184k
                (message == ssl_hs_certificate_request));
6690
6691
2.24M
    for (i = 0; i < PR_ARRAY_SIZE(KnownExtensions); i++) {
6692
        /* Hacky check for message numbers > 30. */
6693
2.21M
        PORT_Assert(!(KnownExtensions[i].messages & (1U << 31)));
6694
2.21M
        if (KnownExtensions[i].ex_value == extension) {
6695
145k
            break;
6696
145k
        }
6697
2.21M
    }
6698
184k
    if (i >= PR_ARRAY_SIZE(KnownExtensions)) {
6699
39.0k
        return tls13_extension_unknown;
6700
39.0k
    }
6701
6702
    /* Return "disallowed" if the message mask bit isn't set. */
6703
145k
    if (!(_M(message) & KnownExtensions[i].messages)) {
6704
14.0k
        return tls13_extension_disallowed;
6705
14.0k
    }
6706
6707
131k
    return tls13_extension_allowed;
6708
145k
}
6709
6710
#undef _M
6711
#undef _M1
6712
#undef _M2
6713
#undef _M3
6714
6715
/* We cheat a bit on additional data because the AEAD interface
6716
 * which doesn't have room for the record number. The AAD we
6717
 * format is serialized record number followed by the true AD
6718
 * (i.e., the record header) plus the serialized record number. */
6719
static SECStatus
6720
tls13_FormatAdditionalData(
6721
    sslSocket *ss,
6722
    const PRUint8 *header, unsigned int headerLen,
6723
    DTLSEpoch epoch, sslSequenceNumber seqNum,
6724
    PRUint8 *aad, unsigned int *aadLength, unsigned int maxLength)
6725
40.0k
{
6726
40.0k
    SECStatus rv;
6727
40.0k
    sslBuffer buf = SSL_BUFFER_FIXED(aad, maxLength);
6728
6729
40.0k
    if (IS_DTLS_1_OR_12(ss)) {
6730
0
        rv = sslBuffer_AppendNumber(&buf, epoch, 2);
6731
0
        if (rv != SECSuccess) {
6732
0
            return SECFailure;
6733
0
        }
6734
0
    }
6735
40.0k
    rv = sslBuffer_AppendNumber(&buf, seqNum, IS_DTLS_1_OR_12(ss) ? 6 : 8);
6736
40.0k
    if (rv != SECSuccess) {
6737
0
        return SECFailure;
6738
0
    }
6739
6740
40.0k
    rv = sslBuffer_Append(&buf, header, headerLen);
6741
40.0k
    if (rv != SECSuccess) {
6742
0
        return SECFailure;
6743
0
    }
6744
6745
40.0k
    *aadLength = buf.len;
6746
6747
40.0k
    return SECSuccess;
6748
40.0k
}
6749
6750
PRInt32
6751
tls13_LimitEarlyData(sslSocket *ss, SSLContentType type, PRInt32 toSend)
6752
0
{
6753
0
    PRInt32 reduced;
6754
6755
0
    PORT_Assert(type == ssl_ct_application_data);
6756
0
    PORT_Assert(ss->vrange.max >= SSL_LIBRARY_VERSION_TLS_1_3);
6757
0
    PORT_Assert(!ss->firstHsDone);
6758
0
    if (ss->ssl3.cwSpec->epoch != TrafficKeyEarlyApplicationData) {
6759
0
        return toSend;
6760
0
    }
6761
6762
0
    if (IS_DTLS(ss) && toSend > ss->ssl3.cwSpec->earlyDataRemaining) {
6763
        /* Don't split application data records in DTLS. */
6764
0
        return 0;
6765
0
    }
6766
6767
0
    reduced = PR_MIN(toSend, ss->ssl3.cwSpec->earlyDataRemaining);
6768
0
    ss->ssl3.cwSpec->earlyDataRemaining -= reduced;
6769
0
    return reduced;
6770
0
}
6771
6772
SECStatus
6773
tls13_ProtectRecord(sslSocket *ss,
6774
                    ssl3CipherSpec *cwSpec,
6775
                    SSLContentType type,
6776
                    const PRUint8 *pIn,
6777
                    PRUint32 contentLen,
6778
                    sslBuffer *wrBuf)
6779
56.6k
{
6780
56.6k
    const ssl3BulkCipherDef *cipher_def = cwSpec->cipherDef;
6781
56.6k
    const int tagLen = cipher_def->tag_size;
6782
56.6k
    SECStatus rv;
6783
6784
56.6k
    PORT_Assert(cwSpec->direction == ssl_secret_write);
6785
56.6k
    SSL_TRC(3, ("%d: TLS13[%d]: spec=%d epoch=%d (%s) protect 0x%0llx len=%u",
6786
56.6k
                SSL_GETPID(), ss->fd, cwSpec, cwSpec->epoch, cwSpec->phase,
6787
56.6k
                cwSpec->nextSeqNum, contentLen));
6788
6789
56.6k
    if (contentLen + 1 + tagLen > SSL_BUFFER_SPACE(wrBuf)) {
6790
0
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
6791
0
        return SECFailure;
6792
0
    }
6793
6794
    /* Copy the data into the wrBuf. We're going to encrypt in-place
6795
     * in the AEAD branch anyway */
6796
56.6k
    PORT_Memcpy(SSL_BUFFER_NEXT(wrBuf), pIn, contentLen);
6797
6798
56.6k
    if (cipher_def->calg == ssl_calg_null) {
6799
        /* Shortcut for plaintext */
6800
30.8k
        rv = sslBuffer_Skip(wrBuf, contentLen, NULL);
6801
30.8k
        PORT_Assert(rv == SECSuccess);
6802
30.8k
    } else {
6803
25.7k
        PRUint8 hdr[13];
6804
25.7k
        sslBuffer buf = SSL_BUFFER_FIXED(hdr, sizeof(hdr));
6805
25.7k
        PRBool needsLength;
6806
25.7k
        PRUint8 aad[21];
6807
25.7k
        const int ivLen = cipher_def->iv_size + cipher_def->explicit_nonce_size;
6808
25.7k
        unsigned int ivOffset = ivLen - sizeof(sslSequenceNumber);
6809
25.7k
        unsigned char ivOut[MAX_IV_LENGTH];
6810
6811
25.7k
        unsigned int aadLen;
6812
25.7k
        unsigned int len;
6813
6814
25.7k
        PORT_Assert(cipher_def->type == type_aead);
6815
6816
        /* If the following condition holds, we can skip the padding logic for
6817
         * DTLS 1.3 (4.2.3). This will be the case until we support a cipher
6818
         * with tag length < 15B. */
6819
25.7k
        PORT_Assert(tagLen + 1 /* cType */ >= 16);
6820
6821
        /* Add the content type at the end. */
6822
25.7k
        *(SSL_BUFFER_NEXT(wrBuf) + contentLen) = type;
6823
6824
        /* Create the header (ugly that we have to do it twice). */
6825
25.7k
        rv = ssl_InsertRecordHeader(ss, cwSpec, ssl_ct_application_data,
6826
25.7k
                                    &buf, &needsLength);
6827
25.7k
        if (rv != SECSuccess) {
6828
0
            return SECFailure;
6829
0
        }
6830
25.7k
        if (needsLength) {
6831
25.7k
            rv = sslBuffer_AppendNumber(&buf, contentLen + 1 + tagLen, 2);
6832
25.7k
            if (rv != SECSuccess) {
6833
0
                return SECFailure;
6834
0
            }
6835
25.7k
        }
6836
25.7k
        rv = tls13_FormatAdditionalData(ss, SSL_BUFFER_BASE(&buf), SSL_BUFFER_LEN(&buf),
6837
25.7k
                                        cwSpec->epoch, cwSpec->nextSeqNum,
6838
25.7k
                                        aad, &aadLen, sizeof(aad));
6839
25.7k
        if (rv != SECSuccess) {
6840
0
            return SECFailure;
6841
0
        }
6842
        /* set up initial IV value */
6843
25.7k
        ivOffset = tls13_SetupAeadIv(IS_DTLS(ss), cwSpec->version, ivOut, cwSpec->keyMaterial.iv,
6844
25.7k
                                     ivOffset, ivLen, cwSpec->epoch);
6845
25.7k
        rv = tls13_AEAD(cwSpec->cipherContext, PR_FALSE,
6846
25.7k
                        CKG_GENERATE_COUNTER_XOR, ivOffset * BPB,
6847
25.7k
                        ivOut, ivOut, ivLen,             /* iv */
6848
25.7k
                        NULL, 0,                         /* nonce */
6849
25.7k
                        aad + sizeof(sslSequenceNumber), /* aad */
6850
25.7k
                        aadLen - sizeof(sslSequenceNumber),
6851
25.7k
                        SSL_BUFFER_NEXT(wrBuf),  /* output  */
6852
25.7k
                        &len,                    /* out len */
6853
25.7k
                        SSL_BUFFER_SPACE(wrBuf), /* max out */
6854
25.7k
                        tagLen,
6855
25.7k
                        SSL_BUFFER_NEXT(wrBuf), /* input */
6856
25.7k
                        contentLen + 1);        /* input len */
6857
25.7k
        if (rv != SECSuccess) {
6858
0
            PORT_SetError(SSL_ERROR_ENCRYPTION_FAILURE);
6859
0
            return SECFailure;
6860
0
        }
6861
25.7k
        rv = sslBuffer_Skip(wrBuf, len, NULL);
6862
25.7k
        PORT_Assert(rv == SECSuccess);
6863
25.7k
    }
6864
6865
56.6k
    return SECSuccess;
6866
56.6k
}
6867
6868
/* Unprotect a TLS 1.3 record and leave the result in plaintext.
6869
 *
6870
 * Called by ssl3_HandleRecord. Caller must hold the spec read lock.
6871
 * Therefore, we MUST not call SSL3_SendAlert().
6872
 *
6873
 * If SECFailure is returned, we:
6874
 * 1. Set |*alert| to the alert to be sent.
6875
 * 2. Call PORT_SetError() with an appropriate code.
6876
 */
6877
SECStatus
6878
tls13_UnprotectRecord(sslSocket *ss,
6879
                      ssl3CipherSpec *spec,
6880
                      SSL3Ciphertext *cText,
6881
                      sslBuffer *plaintext,
6882
                      SSLContentType *innerType,
6883
                      SSL3AlertDescription *alert)
6884
17.5k
{
6885
17.5k
    const ssl3BulkCipherDef *cipher_def = spec->cipherDef;
6886
17.5k
    const int ivLen = cipher_def->iv_size + cipher_def->explicit_nonce_size;
6887
17.5k
    const int tagLen = cipher_def->tag_size;
6888
17.5k
    const int innerTypeLen = 1;
6889
6890
17.5k
    PRUint8 aad[21];
6891
17.5k
    unsigned int aadLen;
6892
17.5k
    SECStatus rv;
6893
6894
17.5k
    *alert = bad_record_mac; /* Default alert for most issues. */
6895
6896
17.5k
    PORT_Assert(spec->direction == ssl_secret_read);
6897
17.5k
    SSL_TRC(3, ("%d: TLS13[%d]: spec=%d epoch=%d (%s) unprotect 0x%0llx len=%u",
6898
17.5k
                SSL_GETPID(), ss->fd, spec, spec->epoch, spec->phase,
6899
17.5k
                cText->seqNum, cText->buf->len));
6900
6901
    /* Verify that the outer content type is right.
6902
     *
6903
     * For the inner content type as well as lower TLS versions this is checked
6904
     * in ssl3con.c/ssl3_HandleNonApllicationData().
6905
     *
6906
     * For DTLS 1.3 this is checked in ssl3gthr.c/dtls_GatherData(). DTLS drops
6907
     * invalid records silently [RFC6347, Section 4.1.2.7].
6908
     *
6909
     * Also allow the DTLS short header in TLS 1.3. */
6910
17.5k
    if (!(cText->hdr[0] == ssl_ct_application_data ||
6911
12.7k
          (IS_DTLS(ss) &&
6912
11.3k
           ss->version >= SSL_LIBRARY_VERSION_TLS_1_3 &&
6913
11.3k
           (cText->hdr[0] & 0xe0) == 0x20))) {
6914
2.58k
        SSL_TRC(3,
6915
2.58k
                ("%d: TLS13[%d]: record has invalid exterior type=%2.2x",
6916
2.58k
                 SSL_GETPID(), ss->fd, cText->hdr[0]));
6917
2.58k
        PORT_SetError(SSL_ERROR_RX_UNEXPECTED_RECORD_TYPE);
6918
2.58k
        *alert = unexpected_message;
6919
2.58k
        return SECFailure;
6920
2.58k
    }
6921
6922
    /* We can perform this test in variable time because the record's total
6923
     * length and the ciphersuite are both public knowledge. */
6924
14.9k
    if (cText->buf->len < tagLen) {
6925
324
        SSL_TRC(3,
6926
324
                ("%d: TLS13[%d]: record too short to contain valid AEAD data",
6927
324
                 SSL_GETPID(), ss->fd));
6928
324
        PORT_SetError(SSL_ERROR_BAD_MAC_READ);
6929
324
        return SECFailure;
6930
324
    }
6931
6932
    /* Check if the ciphertext can be valid if we assume maximum plaintext and
6933
     * add the specific ciphersuite expansion.
6934
     * This way we detect overlong plaintexts/padding before decryption.
6935
     * This check enforces size limitations more strict than the RFC.
6936
     * (see RFC8446, Section 5.2) */
6937
14.6k
    if (cText->buf->len > (spec->recordSizeLimit + innerTypeLen + tagLen)) {
6938
213
        *alert = record_overflow;
6939
213
        PORT_SetError(SSL_ERROR_RX_RECORD_TOO_LONG);
6940
213
        return SECFailure;
6941
213
    }
6942
6943
    /* Check the version number in the record. Stream only. */
6944
14.4k
    if (!IS_DTLS(ss)) {
6945
4.34k
        SSL3ProtocolVersion version =
6946
4.34k
            ((SSL3ProtocolVersion)cText->hdr[1] << 8) |
6947
4.34k
            (SSL3ProtocolVersion)cText->hdr[2];
6948
4.34k
        if (version != spec->recordVersion) {
6949
            /* Do we need a better error here? */
6950
214
            SSL_TRC(3, ("%d: TLS13[%d]: record has bogus version",
6951
214
                        SSL_GETPID(), ss->fd));
6952
214
            return SECFailure;
6953
214
        }
6954
4.34k
    }
6955
6956
    /* Decrypt */
6957
14.2k
    PORT_Assert(cipher_def->type == type_aead);
6958
14.2k
    rv = tls13_FormatAdditionalData(ss, cText->hdr, cText->hdrLen,
6959
14.2k
                                    spec->epoch, cText->seqNum,
6960
14.2k
                                    aad, &aadLen, sizeof(aad));
6961
14.2k
    if (rv != SECSuccess) {
6962
6963
0
        return SECFailure;
6964
0
    }
6965
14.2k
    rv = tls13_AEAD(spec->cipherContext, PR_TRUE,
6966
14.2k
                    CKG_NO_GENERATE, 0,                /* ignored for decrypt */
6967
14.2k
                    spec->keyMaterial.iv, NULL, ivLen, /* iv */
6968
14.2k
                    aad, sizeof(sslSequenceNumber),    /* nonce */
6969
14.2k
                    aad + sizeof(sslSequenceNumber),   /* aad */
6970
14.2k
                    aadLen - sizeof(sslSequenceNumber),
6971
14.2k
                    plaintext->buf,   /* output  */
6972
14.2k
                    &plaintext->len,  /* outlen */
6973
14.2k
                    plaintext->space, /* maxout */
6974
14.2k
                    tagLen,
6975
14.2k
                    cText->buf->buf,  /* in */
6976
14.2k
                    cText->buf->len); /* inlen */
6977
14.2k
    if (rv != SECSuccess) {
6978
14.2k
        if (IS_DTLS(ss)) {
6979
10.1k
            spec->deprotectionFailures++;
6980
10.1k
        }
6981
6982
14.2k
        SSL_TRC(3,
6983
14.2k
                ("%d: TLS13[%d]: record has bogus MAC",
6984
14.2k
                 SSL_GETPID(), ss->fd));
6985
14.2k
        PORT_SetError(SSL_ERROR_BAD_MAC_READ);
6986
14.2k
        return SECFailure;
6987
14.2k
    }
6988
6989
    /* There is a similar test in ssl3_HandleRecord, but this test is needed to
6990
     * account for padding. */
6991
0
    if (plaintext->len > spec->recordSizeLimit + innerTypeLen) {
6992
0
        *alert = record_overflow;
6993
0
        PORT_SetError(SSL_ERROR_RX_RECORD_TOO_LONG);
6994
0
        return SECFailure;
6995
0
    }
6996
6997
    /* The record is right-padded with 0s, followed by the true
6998
     * content type, so read from the right until we receive a
6999
     * nonzero byte. */
7000
0
    while (plaintext->len > 0 && !(plaintext->buf[plaintext->len - 1])) {
7001
0
        --plaintext->len;
7002
0
    }
7003
7004
    /* Bogus padding. */
7005
0
    if (plaintext->len < 1) {
7006
0
        SSL_TRC(3, ("%d: TLS13[%d]: empty record", SSL_GETPID(), ss->fd));
7007
        /* It's safe to report this specifically because it happened
7008
         * after the MAC has been verified. */
7009
0
        *alert = unexpected_message;
7010
0
        PORT_SetError(SSL_ERROR_BAD_BLOCK_PADDING);
7011
0
        return SECFailure;
7012
0
    }
7013
7014
    /* Record the type. */
7015
0
    *innerType = (SSLContentType)plaintext->buf[plaintext->len - 1];
7016
0
    --plaintext->len;
7017
7018
    /* Check for zero-length encrypted Alert and Handshake fragments
7019
     * (zero-length + inner content type byte).
7020
     *
7021
     * Implementations MUST NOT send Handshake and Alert records that have a
7022
     * zero-length TLSInnerPlaintext.content; if such a message is received,
7023
     * the receiving implementation MUST terminate the connection with an
7024
     * "unexpected_message" alert [RFC8446, Section 5.4]. */
7025
0
    if (!plaintext->len && ((!IS_DTLS(ss) && cText->hdr[0] == ssl_ct_application_data) ||
7026
0
                            (IS_DTLS(ss) && dtls_IsDtls13Ciphertext(spec->version, cText->hdr[0])))) {
7027
0
        switch (*innerType) {
7028
0
            case ssl_ct_alert:
7029
0
                *alert = unexpected_message;
7030
0
                PORT_SetError(SSL_ERROR_RX_MALFORMED_ALERT);
7031
0
                return SECFailure;
7032
0
            case ssl_ct_handshake:
7033
0
                *alert = unexpected_message;
7034
0
                PORT_SetError(SSL_ERROR_RX_MALFORMED_HANDSHAKE);
7035
0
                return SECFailure;
7036
0
            default:
7037
0
                break;
7038
0
        }
7039
0
    }
7040
7041
    /* Check that we haven't received too much 0-RTT data. */
7042
0
    if (spec->epoch == TrafficKeyEarlyApplicationData &&
7043
0
        *innerType == ssl_ct_application_data) {
7044
0
        if (plaintext->len > spec->earlyDataRemaining) {
7045
0
            *alert = unexpected_message;
7046
0
            PORT_SetError(SSL_ERROR_TOO_MUCH_EARLY_DATA);
7047
0
            return SECFailure;
7048
0
        }
7049
0
        spec->earlyDataRemaining -= plaintext->len;
7050
0
    }
7051
7052
0
    SSL_TRC(10,
7053
0
            ("%d: TLS13[%d]: %s received record of length=%d, type=%d",
7054
0
             SSL_GETPID(), ss->fd, SSL_ROLE(ss), plaintext->len, *innerType));
7055
7056
0
    return SECSuccess;
7057
0
}
7058
7059
/* 0-RTT is only permitted if:
7060
 *
7061
 * 1. We are doing TLS 1.3
7062
 * 2. This isn't a second ClientHello (in response to HelloRetryRequest)
7063
 * 3. The 0-RTT option is set.
7064
 * 4. We have a valid ticket or an External PSK.
7065
 * 5. If resuming:
7066
 *    5a. The server is willing to accept 0-RTT.
7067
 *    5b. We have not changed our ALPN settings to disallow the ALPN tag
7068
 *    in the ticket.
7069
 *
7070
 * Called from tls13_ClientSendEarlyDataXtn().
7071
 */
7072
PRBool
7073
tls13_ClientAllow0Rtt(const sslSocket *ss, const sslSessionID *sid)
7074
73.8k
{
7075
    /* We checked that the cipher suite was still allowed back in
7076
     * ssl3_SendClientHello. */
7077
73.8k
    if (sid->version < SSL_LIBRARY_VERSION_TLS_1_3) {
7078
56.7k
        return PR_FALSE;
7079
56.7k
    }
7080
17.1k
    if (ss->ssl3.hs.helloRetry) {
7081
2.89k
        return PR_FALSE;
7082
2.89k
    }
7083
14.2k
    if (!ss->opt.enable0RttData) {
7084
7.43k
        return PR_FALSE;
7085
7.43k
    }
7086
6.80k
    if (PR_CLIST_IS_EMPTY(&ss->ssl3.hs.psks)) {
7087
3.06k
        return PR_FALSE;
7088
3.06k
    }
7089
3.73k
    sslPsk *psk = (sslPsk *)PR_LIST_HEAD(&ss->ssl3.hs.psks);
7090
7091
3.73k
    if (psk->zeroRttSuite == TLS_NULL_WITH_NULL_NULL) {
7092
3.73k
        return PR_FALSE;
7093
3.73k
    }
7094
0
    if (!psk->maxEarlyData) {
7095
0
        return PR_FALSE;
7096
0
    }
7097
7098
0
    if (psk->type == ssl_psk_external) {
7099
0
        return psk->hash == tls13_GetHashForCipherSuite(psk->zeroRttSuite);
7100
0
    }
7101
0
    if (psk->type == ssl_psk_resume) {
7102
0
        if (!ss->statelessResume)
7103
0
            return PR_FALSE;
7104
0
        if ((sid->u.ssl3.locked.sessionTicket.flags & ticket_allow_early_data) == 0)
7105
0
            return PR_FALSE;
7106
0
        return ssl_AlpnTagAllowed(ss, &sid->u.ssl3.alpnSelection);
7107
0
    }
7108
0
    PORT_Assert(0);
7109
0
    return PR_FALSE;
7110
0
}
7111
7112
SECStatus
7113
tls13_MaybeDo0RTTHandshake(sslSocket *ss)
7114
17.1k
{
7115
17.1k
    SECStatus rv;
7116
7117
    /* Don't do anything if there is no early_data xtn, which means we're
7118
     * not doing early data. */
7119
17.1k
    if (!ssl3_ExtensionAdvertised(ss, ssl_tls13_early_data_xtn)) {
7120
17.1k
        return SECSuccess;
7121
17.1k
    }
7122
7123
0
    ss->ssl3.hs.zeroRttState = ssl_0rtt_sent;
7124
0
    ss->ssl3.hs.zeroRttSuite = ss->ssl3.hs.cipher_suite;
7125
    /* Note: Reset the preliminary info here rather than just add 0-RTT.  We are
7126
     * only guessing what might happen at this point.*/
7127
0
    ss->ssl3.hs.preliminaryInfo = ssl_preinfo_0rtt_cipher_suite;
7128
7129
0
    SSL_TRC(3, ("%d: TLS13[%d]: in 0-RTT mode", SSL_GETPID(), ss->fd));
7130
7131
    /* Set the ALPN data as if it was negotiated. We check in the ServerHello
7132
     * handler that the server negotiates the same value. */
7133
0
    if (ss->sec.ci.sid->u.ssl3.alpnSelection.len) {
7134
0
        ss->xtnData.nextProtoState = SSL_NEXT_PROTO_EARLY_VALUE;
7135
0
        rv = SECITEM_CopyItem(NULL, &ss->xtnData.nextProto,
7136
0
                              &ss->sec.ci.sid->u.ssl3.alpnSelection);
7137
0
        if (rv != SECSuccess) {
7138
0
            return SECFailure;
7139
0
        }
7140
0
    }
7141
7142
0
    if (ss->opt.enableTls13CompatMode && !IS_DTLS(ss)) {
7143
        /* Pretend that this is a proper ChangeCipherSpec even though it is sent
7144
         * before receiving the ServerHello. */
7145
0
        ssl_GetSpecWriteLock(ss);
7146
0
        tls13_SetSpecRecordVersion(ss, ss->ssl3.cwSpec);
7147
0
        ssl_ReleaseSpecWriteLock(ss);
7148
0
        ssl_GetXmitBufLock(ss);
7149
0
        rv = ssl3_SendChangeCipherSpecsInt(ss);
7150
0
        ssl_ReleaseXmitBufLock(ss);
7151
0
        if (rv != SECSuccess) {
7152
0
            return SECFailure;
7153
0
        }
7154
0
    }
7155
7156
    /* If we have any message that was saved for later hashing.
7157
     * The updated hash is then used in tls13_DeriveEarlySecrets. */
7158
0
    rv = ssl3_MaybeUpdateHashWithSavedRecord(ss);
7159
0
    if (rv != SECSuccess) {
7160
0
        return SECFailure;
7161
0
    }
7162
7163
    /* If we're trying 0-RTT, derive from the first PSK */
7164
0
    PORT_Assert(!PR_CLIST_IS_EMPTY(&ss->ssl3.hs.psks) && !ss->xtnData.selectedPsk);
7165
0
    ss->xtnData.selectedPsk = (sslPsk *)PR_LIST_HEAD(&ss->ssl3.hs.psks);
7166
0
    rv = tls13_DeriveEarlySecrets(ss);
7167
0
    if (rv != SECSuccess) {
7168
0
        return SECFailure;
7169
0
    }
7170
7171
    /* Save cwSpec in case we get a HelloRetryRequest and have to send another
7172
     * ClientHello. */
7173
0
    ssl_CipherSpecAddRef(ss->ssl3.cwSpec);
7174
7175
0
    rv = tls13_SetCipherSpec(ss, TrafficKeyEarlyApplicationData,
7176
0
                             ssl_secret_write, PR_TRUE);
7177
0
    ss->xtnData.selectedPsk = NULL;
7178
0
    if (rv != SECSuccess) {
7179
0
        return SECFailure;
7180
0
    }
7181
7182
0
    return SECSuccess;
7183
0
}
7184
7185
PRInt32
7186
tls13_Read0RttData(sslSocket *ss, PRUint8 *buf, PRInt32 len)
7187
0
{
7188
0
    PORT_Assert(!PR_CLIST_IS_EMPTY(&ss->ssl3.hs.bufferedEarlyData));
7189
0
    PRInt32 offset = 0;
7190
0
    while (!PR_CLIST_IS_EMPTY(&ss->ssl3.hs.bufferedEarlyData)) {
7191
0
        TLS13EarlyData *msg =
7192
0
            (TLS13EarlyData *)PR_NEXT_LINK(&ss->ssl3.hs.bufferedEarlyData);
7193
0
        unsigned int tocpy = msg->data.len - msg->consumed;
7194
7195
0
        if (tocpy > (len - offset)) {
7196
0
            if (IS_DTLS(ss)) {
7197
                /* In DTLS, we only return entire records.
7198
                 * So offset and consumed are always zero. */
7199
0
                PORT_Assert(offset == 0);
7200
0
                PORT_Assert(msg->consumed == 0);
7201
0
                PORT_SetError(SSL_ERROR_RX_SHORT_DTLS_READ);
7202
0
                return -1;
7203
0
            }
7204
7205
0
            tocpy = len - offset;
7206
0
        }
7207
7208
0
        PORT_Memcpy(buf + offset, msg->data.data + msg->consumed, tocpy);
7209
0
        offset += tocpy;
7210
0
        msg->consumed += tocpy;
7211
7212
0
        if (msg->consumed == msg->data.len) {
7213
0
            PR_REMOVE_LINK(&msg->link);
7214
0
            SECITEM_ZfreeItem(&msg->data, PR_FALSE);
7215
0
            PORT_ZFree(msg, sizeof(*msg));
7216
0
        }
7217
7218
        /* We are done after one record for DTLS; otherwise, when the buffer fills up. */
7219
0
        if (IS_DTLS(ss) || offset == len) {
7220
0
            break;
7221
0
        }
7222
0
    }
7223
7224
0
    return offset;
7225
0
}
7226
7227
static SECStatus
7228
tls13_SendEndOfEarlyData(sslSocket *ss)
7229
0
{
7230
0
    SECStatus rv;
7231
7232
0
    PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss));
7233
7234
0
    if (!ss->opt.suppressEndOfEarlyData) {
7235
0
        SSL_TRC(3, ("%d: TLS13[%d]: send EndOfEarlyData", SSL_GETPID(), ss->fd));
7236
0
        rv = ssl3_AppendHandshakeHeader(ss, ssl_hs_end_of_early_data, 0);
7237
0
        if (rv != SECSuccess) {
7238
0
            return rv; /* err set by AppendHandshake. */
7239
0
        }
7240
0
    }
7241
7242
0
    ss->ssl3.hs.zeroRttState = ssl_0rtt_done;
7243
0
    return SECSuccess;
7244
0
}
7245
7246
static SECStatus
7247
tls13_HandleEndOfEarlyData(sslSocket *ss, const PRUint8 *b, PRUint32 length)
7248
12
{
7249
12
    SECStatus rv;
7250
7251
12
    PORT_Assert(ss->version >= SSL_LIBRARY_VERSION_TLS_1_3);
7252
7253
    /* EndOfEarlyData is sent by clients; a client must never receive one. */
7254
12
    if (!ss->sec.isServer) {
7255
2
        FATAL_ERROR(ss, SSL_ERROR_RX_UNEXPECTED_END_OF_EARLY_DATA,
7256
2
                    unexpected_message);
7257
2
        return SECFailure;
7258
2
    }
7259
7260
10
    rv = TLS13_CHECK_HS_STATE(ss, SSL_ERROR_RX_UNEXPECTED_END_OF_EARLY_DATA,
7261
10
                              wait_end_of_early_data);
7262
10
    if (rv != SECSuccess) {
7263
10
        return SECFailure;
7264
10
    }
7265
7266
    /* We shouldn't be getting any more early data, and if we do,
7267
     * it is because of reordering and we drop it. */
7268
0
    if (IS_DTLS(ss)) {
7269
0
        ssl_CipherSpecReleaseByEpoch(ss, ssl_secret_read,
7270
0
                                     TrafficKeyEarlyApplicationData);
7271
0
        dtls_ReceivedFirstMessageInFlight(ss);
7272
0
    }
7273
7274
0
    PORT_Assert(ss->ssl3.hs.zeroRttState == ssl_0rtt_accepted);
7275
7276
0
    if (length) {
7277
0
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_END_OF_EARLY_DATA, decode_error);
7278
0
        return SECFailure;
7279
0
    }
7280
7281
0
    rv = tls13_SetCipherSpec(ss, TrafficKeyHandshake,
7282
0
                             ssl_secret_read, PR_FALSE);
7283
0
    if (rv != SECSuccess) {
7284
0
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
7285
0
        return SECFailure;
7286
0
    }
7287
7288
0
    ss->ssl3.hs.zeroRttState = ssl_0rtt_done;
7289
0
    if (tls13_ShouldRequestClientAuth(ss)) {
7290
0
        TLS13_SET_HS_STATE(ss, wait_client_cert);
7291
0
    } else {
7292
0
        TLS13_SET_HS_STATE(ss, wait_finished);
7293
0
    }
7294
0
    return SECSuccess;
7295
0
}
7296
7297
static SECStatus
7298
tls13_MaybeHandleSuppressedEndOfEarlyData(sslSocket *ss)
7299
725
{
7300
725
    PORT_Assert(ss->sec.isServer);
7301
725
    if (!ss->opt.suppressEndOfEarlyData ||
7302
725
        ss->ssl3.hs.zeroRttState != ssl_0rtt_accepted) {
7303
725
        return SECSuccess;
7304
725
    }
7305
7306
0
    return tls13_HandleEndOfEarlyData(ss, NULL, 0);
7307
725
}
7308
7309
SECStatus
7310
tls13_HandleEarlyApplicationData(sslSocket *ss, sslBuffer *origBuf)
7311
0
{
7312
0
    TLS13EarlyData *ed;
7313
0
    SECItem it = { siBuffer, NULL, 0 };
7314
7315
0
    PORT_Assert(ss->sec.isServer);
7316
0
    PORT_Assert(ss->ssl3.hs.zeroRttState == ssl_0rtt_accepted);
7317
0
    if (ss->ssl3.hs.zeroRttState != ssl_0rtt_accepted) {
7318
        /* Belt and suspenders. */
7319
0
        FATAL_ERROR(ss, SEC_ERROR_LIBRARY_FAILURE, internal_error);
7320
0
        return SECFailure;
7321
0
    }
7322
7323
0
    PRINT_BUF(3, (NULL, "Received early application data",
7324
0
                  origBuf->buf, origBuf->len));
7325
0
    ed = PORT_ZNew(TLS13EarlyData);
7326
0
    if (!ed) {
7327
0
        FATAL_ERROR(ss, SEC_ERROR_NO_MEMORY, internal_error);
7328
0
        return SECFailure;
7329
0
    }
7330
0
    it.data = origBuf->buf;
7331
0
    it.len = origBuf->len;
7332
0
    if (SECITEM_CopyItem(NULL, &ed->data, &it) != SECSuccess) {
7333
0
        FATAL_ERROR(ss, SEC_ERROR_NO_MEMORY, internal_error);
7334
0
        return SECFailure;
7335
0
    }
7336
0
    PR_APPEND_LINK(&ed->link, &ss->ssl3.hs.bufferedEarlyData);
7337
7338
0
    origBuf->len = 0; /* So ssl3_GatherAppDataRecord will keep looping. */
7339
7340
0
    return SECSuccess;
7341
0
}
7342
7343
PRUint16
7344
tls13_EncodeVersion(SSL3ProtocolVersion version, SSLProtocolVariant variant)
7345
68.1k
{
7346
68.1k
    if (variant == ssl_variant_datagram) {
7347
31.0k
        return dtls_TLSVersionToDTLSVersion(version);
7348
31.0k
    }
7349
    /* Stream-variant encodings do not change. */
7350
37.1k
    return (PRUint16)version;
7351
68.1k
}
7352
7353
SECStatus
7354
tls13_ClientReadSupportedVersion(sslSocket *ss)
7355
66.3k
{
7356
66.3k
    PRUint32 temp;
7357
66.3k
    TLSExtension *versionExtension;
7358
66.3k
    SECItem it;
7359
66.3k
    SECStatus rv;
7360
7361
    /* Update the version based on the extension, as necessary. */
7362
66.3k
    versionExtension = ssl3_FindExtension(ss, ssl_tls13_supported_versions_xtn);
7363
66.3k
    if (!versionExtension) {
7364
60.6k
        return SECSuccess;
7365
60.6k
    }
7366
7367
    /* Struct copy so we don't damage the extension. */
7368
5.69k
    it = versionExtension->data;
7369
7370
5.69k
    rv = ssl3_ConsumeHandshakeNumber(ss, &temp, 2, &it.data, &it.len);
7371
5.69k
    if (rv != SECSuccess) {
7372
9
        return SECFailure;
7373
9
    }
7374
5.68k
    if (it.len) {
7375
6
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_SERVER_HELLO, illegal_parameter);
7376
6
        return SECFailure;
7377
6
    }
7378
7379
5.68k
    if (temp != tls13_EncodeVersion(SSL_LIBRARY_VERSION_TLS_1_3,
7380
5.68k
                                    ss->protocolVariant)) {
7381
        /* You cannot negotiate < TLS 1.3 with supported_versions. */
7382
47
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_SERVER_HELLO, illegal_parameter);
7383
47
        return SECFailure;
7384
47
    }
7385
7386
    /* Any endpoint receiving a Hello message with...ServerHello.legacy_version
7387
     * set to 0x0300 (SSL3) MUST abort the handshake with a "protocol_version"
7388
     * alert. [RFC8446, Section D.5]
7389
     *
7390
     * The ServerHello.legacy_version is read into the ss->version field by
7391
     * ssl_ClientReadVersion(). */
7392
5.63k
    if (ss->version == SSL_LIBRARY_VERSION_3_0) {
7393
2
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_SERVER_HELLO, protocol_version);
7394
2
        return SECFailure;
7395
2
    }
7396
7397
5.63k
    ss->version = SSL_LIBRARY_VERSION_TLS_1_3;
7398
5.63k
    return SECSuccess;
7399
5.63k
}
7400
7401
/* Pick the highest version we support that is also advertised. */
7402
SECStatus
7403
tls13_NegotiateVersion(sslSocket *ss, const TLSExtension *supportedVersions)
7404
6.18k
{
7405
6.18k
    PRUint16 version;
7406
    /* Make a copy so we're nondestructive. */
7407
6.18k
    SECItem data = supportedVersions->data;
7408
6.18k
    SECItem versions;
7409
6.18k
    SECStatus rv;
7410
7411
6.18k
    rv = ssl3_ConsumeHandshakeVariable(ss, &versions, 1,
7412
6.18k
                                       &data.data, &data.len);
7413
6.18k
    if (rv != SECSuccess) {
7414
7
        return SECFailure;
7415
7
    }
7416
6.18k
    if (data.len || !versions.len || (versions.len & 1)) {
7417
17
        FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_CLIENT_HELLO, illegal_parameter);
7418
17
        return SECFailure;
7419
17
    }
7420
6.85k
    for (version = ss->vrange.max; version >= ss->vrange.min; --version) {
7421
6.80k
        if (version < SSL_LIBRARY_VERSION_TLS_1_3 &&
7422
973
            (ss->ssl3.hs.helloRetry || ss->ssl3.hs.echAccepted)) {
7423
            /* Prevent negotiating to a lower version after 1.3 HRR or ECH
7424
             * When accepting ECH, a different alert is generated.
7425
             */
7426
4
            SSL3AlertDescription alert = ss->ssl3.hs.echAccepted ? illegal_parameter : protocol_version;
7427
4
            PORT_SetError(SSL_ERROR_UNSUPPORTED_VERSION);
7428
4
            FATAL_ERROR(ss, SSL_ERROR_UNSUPPORTED_VERSION, alert);
7429
4
            return SECFailure;
7430
4
        }
7431
7432
6.79k
        PRUint16 wire = tls13_EncodeVersion(version, ss->protocolVariant);
7433
6.79k
        unsigned long offset;
7434
7435
17.0k
        for (offset = 0; offset < versions.len; offset += 2) {
7436
16.3k
            PRUint16 supported =
7437
16.3k
                (versions.data[offset] << 8) | versions.data[offset + 1];
7438
16.3k
            if (supported == wire) {
7439
6.10k
                ss->version = version;
7440
6.10k
                return SECSuccess;
7441
6.10k
            }
7442
16.3k
        }
7443
6.79k
    }
7444
7445
55
    FATAL_ERROR(ss, SSL_ERROR_UNSUPPORTED_VERSION, protocol_version);
7446
55
    return SECFailure;
7447
6.16k
}
7448
7449
/* This is TLS 1.3 or might negotiate to it. */
7450
PRBool
7451
tls13_MaybeTls13(sslSocket *ss)
7452
286k
{
7453
286k
    if (ss->version >= SSL_LIBRARY_VERSION_TLS_1_3) {
7454
99.7k
        return PR_TRUE;
7455
99.7k
    }
7456
7457
186k
    if (ss->vrange.max < SSL_LIBRARY_VERSION_TLS_1_3) {
7458
116k
        return PR_FALSE;
7459
116k
    }
7460
7461
70.3k
    if (!(ss->ssl3.hs.preliminaryInfo & ssl_preinfo_version)) {
7462
46.4k
        return PR_TRUE;
7463
46.4k
    }
7464
7465
23.8k
    return PR_FALSE;
7466
70.3k
}
7467
7468
/* Setup random client GREASE values according to RFC8701. State must be kept
7469
 * so an equal ClientHello might be send on HelloRetryRequest.
7470
 * Caller must hold the SSL3 handshake lock, which protects
7471
 * |ss->ssl3.hs.grease|. */
7472
SECStatus
7473
tls13_ClientGreaseSetup(sslSocket *ss)
7474
13.4k
{
7475
13.4k
    PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
7476
7477
13.4k
    if (!ss->opt.enableGrease) {
7478
6.83k
        return SECSuccess;
7479
6.83k
    }
7480
7481
6.65k
    PORT_Assert(ss->vrange.max >= SSL_LIBRARY_VERSION_TLS_1_3);
7482
7483
6.65k
    if (ss->ssl3.hs.grease) {
7484
0
        return SECFailure;
7485
0
    }
7486
6.65k
    ss->ssl3.hs.grease = PORT_Alloc(sizeof(tls13ClientGrease));
7487
6.65k
    if (!ss->ssl3.hs.grease) {
7488
0
        return SECFailure;
7489
0
    }
7490
7491
6.65k
    tls13ClientGrease *grease = ss->ssl3.hs.grease;
7492
    /* We require eight GREASE values and randoms. */
7493
6.65k
    PRUint8 random[8];
7494
7495
    /* Generate random GREASE values. */
7496
6.65k
    if (PK11_GenerateRandom(random, sizeof(random)) != SECSuccess) {
7497
0
        return SECFailure;
7498
0
    }
7499
53.2k
    for (size_t i = 0; i < PR_ARRAY_SIZE(grease->idx); i++) {
7500
46.6k
        random[i] = ((random[i] & 0xf0) | 0x0a);
7501
46.6k
        grease->idx[i] = ((random[i] << 8) | random[i]);
7502
46.6k
    }
7503
    /* Specific PskKeyExchangeMode GREASE value. */
7504
6.65k
    grease->pskKem = 0x0b + ((random[8 - 1] >> 5) * 0x1f);
7505
7506
    /* Duplicate extensions are not allowed. */
7507
6.65k
    if (grease->idx[grease_extension1] == grease->idx[grease_extension2]) {
7508
0
        grease->idx[grease_extension2] ^= 0x1010;
7509
0
    }
7510
7511
6.65k
    return SECSuccess;
7512
6.65k
}
7513
7514
/* Destroy client GREASE state. */
7515
void
7516
tls13_ClientGreaseDestroy(sslSocket *ss)
7517
124k
{
7518
124k
    if (ss->ssl3.hs.grease) {
7519
6.65k
        PORT_Free(ss->ssl3.hs.grease);
7520
6.65k
        ss->ssl3.hs.grease = NULL;
7521
6.65k
    }
7522
124k
}
7523
7524
/* Generate a random GREASE value according to RFC8701.
7525
 * This function does not provide valid PskKeyExchangeMode GREASE values! */
7526
SECStatus
7527
tls13_RandomGreaseValue(PRUint16 *out)
7528
1.48k
{
7529
1.48k
    PRUint8 random;
7530
7531
1.48k
    if (PK11_GenerateRandom(&random, sizeof(random)) != SECSuccess) {
7532
0
        return SECFailure;
7533
0
    }
7534
7535
1.48k
    random = ((random & 0xf0) | 0x0a);
7536
1.48k
    *out = ((random << 8) | random);
7537
7538
1.48k
    return SECSuccess;
7539
1.48k
}
7540
7541
/* Set TLS 1.3 GREASE Extension random GREASE type. */
7542
SECStatus
7543
tls13_MaybeGreaseExtensionType(const sslSocket *ss,
7544
                               const SSLHandshakeType message,
7545
                               PRUint16 *exType)
7546
737k
{
7547
737k
    if (*exType != ssl_tls13_grease_xtn) {
7548
719k
        return SECSuccess;
7549
719k
    }
7550
7551
17.5k
    PR_ASSERT(ss->opt.enableGrease);
7552
17.5k
    PR_ASSERT(message == ssl_hs_client_hello ||
7553
17.5k
              message == ssl_hs_certificate_request);
7554
7555
    /* GREASE ClientHello:
7556
     * A client MAY select one or more GREASE extension values and
7557
     * advertise them as extensions with varying length and contents
7558
     * [RFC8701, Section 3.1]. */
7559
17.5k
    if (message == ssl_hs_client_hello) {
7560
16.8k
        PR_ASSERT(ss->vrange.max >= SSL_LIBRARY_VERSION_TLS_1_3);
7561
        /* Check if the first GREASE extension was already added. */
7562
16.8k
        if (!ssl3_ExtensionAdvertised(ss, ss->ssl3.hs.grease->idx[grease_extension1])) {
7563
8.44k
            *exType = ss->ssl3.hs.grease->idx[grease_extension1];
7564
8.44k
        } else {
7565
8.44k
            *exType = ss->ssl3.hs.grease->idx[grease_extension2];
7566
8.44k
        }
7567
16.8k
    }
7568
    /* GREASE CertificateRequest:
7569
     * When sending a CertificateRequest in TLS 1.3, a server MAY behave as
7570
     * follows: A server MAY select one or more GREASE extension values and
7571
     * advertise them as extensions with varying length and contents
7572
     * [RFC8701, Section 4.1]. */
7573
651
    else if (message == ssl_hs_certificate_request) {
7574
651
        PR_ASSERT(ss->version >= SSL_LIBRARY_VERSION_TLS_1_3);
7575
        /* Get random grease extension type. */
7576
651
        SECStatus rv = tls13_RandomGreaseValue(exType);
7577
651
        if (rv != SECSuccess) {
7578
0
            return SECFailure;
7579
0
        }
7580
651
    }
7581
7582
17.5k
    return SECSuccess;
7583
17.5k
}