Coverage Report

Created: 2024-05-20 06:23

/src/nss/lib/ssl/sslsock.c
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
/*
3
 * vtables (and methods that call through them) for the 4 types of
4
 * SSLSockets supported.  Only one type is still supported.
5
 * Various other functions.
6
 *
7
 * This Source Code Form is subject to the terms of the Mozilla Public
8
 * License, v. 2.0. If a copy of the MPL was not distributed with this
9
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
10
#include "seccomon.h"
11
#include "cert.h"
12
#include "keyhi.h"
13
#include "ssl.h"
14
#include "sslexp.h"
15
#include "sslimpl.h"
16
#include "sslproto.h"
17
#include "nspr.h"
18
#include "private/pprio.h"
19
#include "nss.h"
20
#include "pk11pqg.h"
21
#include "pk11pub.h"
22
#include "tls13ech.h"
23
#include "tls13psk.h"
24
#include "tls13subcerts.h"
25
26
static const sslSocketOps ssl_default_ops = { /* No SSL. */
27
                                              ssl_DefConnect,
28
                                              NULL,
29
                                              ssl_DefBind,
30
                                              ssl_DefListen,
31
                                              ssl_DefShutdown,
32
                                              ssl_DefClose,
33
                                              ssl_DefRecv,
34
                                              ssl_DefSend,
35
                                              ssl_DefRead,
36
                                              ssl_DefWrite,
37
                                              ssl_DefGetpeername,
38
                                              ssl_DefGetsockname
39
};
40
41
static const sslSocketOps ssl_secure_ops = { /* SSL. */
42
                                             ssl_SecureConnect,
43
                                             NULL,
44
                                             ssl_DefBind,
45
                                             ssl_DefListen,
46
                                             ssl_SecureShutdown,
47
                                             ssl_SecureClose,
48
                                             ssl_SecureRecv,
49
                                             ssl_SecureSend,
50
                                             ssl_SecureRead,
51
                                             ssl_SecureWrite,
52
                                             ssl_DefGetpeername,
53
                                             ssl_DefGetsockname
54
};
55
56
/*
57
** default settings for socket enables
58
*/
59
static sslOptions ssl_defaults = {
60
    .nextProtoNego = { siBuffer, NULL, 0 },
61
    .maxEarlyDataSize = 1 << 16,
62
    .recordSizeLimit = MAX_FRAGMENT_LENGTH + 1,
63
    .useSecurity = PR_TRUE,
64
    .useSocks = PR_FALSE,
65
    .requestCertificate = PR_FALSE,
66
    .requireCertificate = SSL_REQUIRE_FIRST_HANDSHAKE,
67
    .handshakeAsClient = PR_FALSE,
68
    .handshakeAsServer = PR_FALSE,
69
    .noCache = PR_FALSE,
70
    .fdx = PR_FALSE,
71
    .detectRollBack = PR_TRUE,
72
    .noLocks = PR_FALSE,
73
    .enableSessionTickets = PR_FALSE,
74
    .enableDeflate = PR_FALSE,
75
    .enableRenegotiation = SSL_RENEGOTIATE_REQUIRES_XTN,
76
    .requireSafeNegotiation = PR_FALSE,
77
    .enableFalseStart = PR_FALSE,
78
    .cbcRandomIV = PR_TRUE,
79
    .enableOCSPStapling = PR_FALSE,
80
    .enableDelegatedCredentials = PR_FALSE,
81
    .enableALPN = PR_TRUE,
82
    .reuseServerECDHEKey = PR_FALSE,
83
    .enableFallbackSCSV = PR_FALSE,
84
    .enableServerDhe = PR_TRUE,
85
    .enableExtendedMS = PR_TRUE,
86
    .enableSignedCertTimestamps = PR_FALSE,
87
    .requireDHENamedGroups = PR_FALSE,
88
    .enable0RttData = PR_FALSE,
89
    .enableTls13CompatMode = PR_FALSE,
90
    .enableDtls13VersionCompat = PR_FALSE,
91
    .enableDtlsShortHeader = PR_FALSE,
92
    .enableHelloDowngradeCheck = PR_TRUE,
93
    .enableV2CompatibleHello = PR_FALSE,
94
    .enablePostHandshakeAuth = PR_FALSE,
95
    .suppressEndOfEarlyData = PR_FALSE,
96
    .enableTls13GreaseEch = PR_FALSE,
97
    .enableTls13BackendEch = PR_FALSE,
98
    .callExtensionWriterOnEchInner = PR_FALSE,
99
    .enableGrease = PR_FALSE,
100
    .enableChXtnPermutation = PR_FALSE
101
};
102
103
/*
104
 * default range of enabled SSL/TLS protocols
105
 */
106
static SSLVersionRange versions_defaults_stream = {
107
    SSL_LIBRARY_VERSION_TLS_1_2,
108
    SSL_LIBRARY_VERSION_TLS_1_3
109
};
110
111
static SSLVersionRange versions_defaults_datagram = {
112
    SSL_LIBRARY_VERSION_TLS_1_2,
113
    SSL_LIBRARY_VERSION_TLS_1_2
114
};
115
116
#define VERSIONS_DEFAULTS(variant) \
117
105k
    (variant == ssl_variant_stream ? &versions_defaults_stream : &versions_defaults_datagram)
118
#define VERSIONS_POLICY_MIN(variant) \
119
0
    (variant == ssl_variant_stream ? NSS_TLS_VERSION_MIN_POLICY : NSS_DTLS_VERSION_MIN_POLICY)
120
#define VERSIONS_POLICY_MAX(variant) \
121
0
    (variant == ssl_variant_stream ? NSS_TLS_VERSION_MAX_POLICY : NSS_DTLS_VERSION_MAX_POLICY)
122
123
sslSessionIDLookupFunc ssl_sid_lookup;
124
125
static PRDescIdentity ssl_layer_id;
126
127
PRBool locksEverDisabled; /* implicitly PR_FALSE */
128
PRBool ssl_force_locks;   /* implicitly PR_FALSE */
129
int ssl_lock_readers = 1; /* default true. */
130
char ssl_debug;
131
char ssl_trace;
132
FILE *ssl_trace_iob;
133
134
#ifdef NSS_ALLOW_SSLKEYLOGFILE
135
FILE *ssl_keylog_iob;
136
PZLock *ssl_keylog_lock;
137
#endif
138
139
char lockStatus[] = "Locks are ENABLED.  ";
140
0
#define LOCKSTATUS_OFFSET 10 /* offset of ENABLED */
141
142
/* SRTP_NULL_HMAC_SHA1_80 and SRTP_NULL_HMAC_SHA1_32 are not implemented. */
143
static const PRUint16 srtpCiphers[] = {
144
    SRTP_AES128_CM_HMAC_SHA1_80,
145
    SRTP_AES128_CM_HMAC_SHA1_32,
146
    0
147
};
148
149
/* This list is in preference order.  Note that while some smaller groups appear
150
 * early in the list, smaller groups are generally ignored when iterating
151
 * through this list. ffdhe_custom must not appear in this list. */
152
#define ECGROUP(name, size, oid, assumeSupported)  \
153
    {                                              \
154
        ssl_grp_ec_##name, size, ssl_kea_ecdh,     \
155
            SEC_OID_SECG_EC_##oid, assumeSupported \
156
    }
157
#define FFGROUP(size)                           \
158
    {                                           \
159
        ssl_grp_ffdhe_##size, size, ssl_kea_dh, \
160
            SEC_OID_TLS_FFDHE_##size, PR_TRUE   \
161
    }
162
163
const sslNamedGroupDef ssl_named_groups[] = {
164
    /* Note that 256 for 25519 is a lie, but we only use it for checking bit
165
     * security and expect 256 bits there (not 255). */
166
    { ssl_grp_ec_curve25519, 256, ssl_kea_ecdh, SEC_OID_CURVE25519, PR_TRUE },
167
    ECGROUP(secp256r1, 256, SECP256R1, PR_TRUE),
168
    ECGROUP(secp384r1, 384, SECP384R1, PR_TRUE),
169
    ECGROUP(secp521r1, 521, SECP521R1, PR_TRUE),
170
    { ssl_grp_kem_xyber768d00, 256, ssl_kea_ecdh_hybrid, SEC_OID_XYBER768D00, PR_TRUE },
171
    FFGROUP(2048),
172
    FFGROUP(3072),
173
    FFGROUP(4096),
174
    FFGROUP(6144),
175
    FFGROUP(8192),
176
    ECGROUP(secp192r1, 192, SECP192R1, PR_FALSE),
177
    ECGROUP(secp160r2, 160, SECP160R2, PR_FALSE),
178
    ECGROUP(secp160k1, 160, SECP160K1, PR_FALSE),
179
    ECGROUP(secp160r1, 160, SECP160R1, PR_FALSE),
180
    ECGROUP(sect163k1, 163, SECT163K1, PR_FALSE),
181
    ECGROUP(sect163r1, 163, SECT163R1, PR_FALSE),
182
    ECGROUP(sect163r2, 163, SECT163R2, PR_FALSE),
183
    ECGROUP(secp192k1, 192, SECP192K1, PR_FALSE),
184
    ECGROUP(sect193r1, 193, SECT193R1, PR_FALSE),
185
    ECGROUP(sect193r2, 193, SECT193R2, PR_FALSE),
186
    ECGROUP(secp224r1, 224, SECP224R1, PR_FALSE),
187
    ECGROUP(secp224k1, 224, SECP224K1, PR_FALSE),
188
    ECGROUP(sect233k1, 233, SECT233K1, PR_FALSE),
189
    ECGROUP(sect233r1, 233, SECT233R1, PR_FALSE),
190
    ECGROUP(sect239k1, 239, SECT239K1, PR_FALSE),
191
    ECGROUP(secp256k1, 256, SECP256K1, PR_FALSE),
192
    ECGROUP(sect283k1, 283, SECT283K1, PR_FALSE),
193
    ECGROUP(sect283r1, 283, SECT283R1, PR_FALSE),
194
    ECGROUP(sect409k1, 409, SECT409K1, PR_FALSE),
195
    ECGROUP(sect409r1, 409, SECT409R1, PR_FALSE),
196
    ECGROUP(sect571k1, 571, SECT571K1, PR_FALSE),
197
    ECGROUP(sect571r1, 571, SECT571R1, PR_FALSE),
198
};
199
PR_STATIC_ASSERT(SSL_NAMED_GROUP_COUNT == PR_ARRAY_SIZE(ssl_named_groups));
200
201
#undef ECGROUP
202
#undef FFGROUP
203
204
/* forward declarations. */
205
static sslSocket *ssl_NewSocket(PRBool makeLocks, SSLProtocolVariant variant);
206
static SECStatus ssl_MakeLocks(sslSocket *ss);
207
static void ssl_SetDefaultsFromEnvironment(void);
208
static PRStatus ssl_PushIOLayer(sslSocket *ns, PRFileDesc *stack,
209
                                PRDescIdentity id);
210
211
/************************************************************************/
212
213
/*
214
** Lookup a socket structure from a file descriptor.
215
** Only functions called through the PRIOMethods table should use this.
216
** Other app-callable functions should use ssl_FindSocket.
217
*/
218
static sslSocket *
219
ssl_GetPrivate(PRFileDesc *fd)
220
76.1k
{
221
76.1k
    sslSocket *ss;
222
223
76.1k
    PORT_Assert(fd != NULL);
224
76.1k
    PORT_Assert(fd->methods->file_type == PR_DESC_LAYERED);
225
76.1k
    PORT_Assert(fd->identity == ssl_layer_id);
226
227
76.1k
    if (fd->methods->file_type != PR_DESC_LAYERED ||
228
76.1k
        fd->identity != ssl_layer_id) {
229
0
        PORT_SetError(PR_BAD_DESCRIPTOR_ERROR);
230
0
        return NULL;
231
0
    }
232
233
76.1k
    ss = (sslSocket *)fd->secret;
234
    /* Set ss->fd lazily. We can't rely on the value of ss->fd set by
235
     * ssl_PushIOLayer because another PR_PushIOLayer call will switch the
236
     * contents of the PRFileDesc pointed by ss->fd and the new layer.
237
     * See bug 807250.
238
     */
239
76.1k
    ss->fd = fd;
240
76.1k
    return ss;
241
76.1k
}
242
243
/* This function tries to find the SSL layer in the stack.
244
 * It searches for the first SSL layer at or below the argument fd,
245
 * and failing that, it searches for the nearest SSL layer above the
246
 * argument fd.  It returns the private sslSocket from the found layer.
247
 */
248
sslSocket *
249
ssl_FindSocket(PRFileDesc *fd)
250
3.52M
{
251
3.52M
    PRFileDesc *layer;
252
3.52M
    sslSocket *ss;
253
254
3.52M
    PORT_Assert(fd != NULL);
255
3.52M
    PORT_Assert(ssl_layer_id != 0);
256
257
3.52M
    layer = PR_GetIdentitiesLayer(fd, ssl_layer_id);
258
3.52M
    if (layer == NULL) {
259
0
        PORT_SetError(PR_BAD_DESCRIPTOR_ERROR);
260
0
        return NULL;
261
0
    }
262
263
3.52M
    ss = (sslSocket *)layer->secret;
264
    /* Set ss->fd lazily. We can't rely on the value of ss->fd set by
265
     * ssl_PushIOLayer because another PR_PushIOLayer call will switch the
266
     * contents of the PRFileDesc pointed by ss->fd and the new layer.
267
     * See bug 807250.
268
     */
269
3.52M
    ss->fd = layer;
270
3.52M
    return ss;
271
3.52M
}
272
273
static sslSocket *
274
ssl_DupSocket(sslSocket *os)
275
32.6k
{
276
32.6k
    sslSocket *ss;
277
32.6k
    SECStatus rv;
278
279
32.6k
    ss = ssl_NewSocket((PRBool)(!os->opt.noLocks), os->protocolVariant);
280
32.6k
    if (!ss) {
281
0
        return NULL;
282
0
    }
283
284
32.6k
    ss->opt = os->opt;
285
32.6k
    ss->opt.useSocks = PR_FALSE;
286
32.6k
    rv = SECITEM_CopyItem(NULL, &ss->opt.nextProtoNego, &os->opt.nextProtoNego);
287
32.6k
    if (rv != SECSuccess) {
288
0
        goto loser;
289
0
    }
290
32.6k
    ss->vrange = os->vrange;
291
32.6k
    ss->now = os->now;
292
32.6k
    ss->nowArg = os->nowArg;
293
294
32.6k
    ss->peerID = !os->peerID ? NULL : PORT_Strdup(os->peerID);
295
32.6k
    ss->url = !os->url ? NULL : PORT_Strdup(os->url);
296
297
32.6k
    ss->ops = os->ops;
298
32.6k
    ss->rTimeout = os->rTimeout;
299
32.6k
    ss->wTimeout = os->wTimeout;
300
32.6k
    ss->cTimeout = os->cTimeout;
301
32.6k
    ss->dbHandle = os->dbHandle;
302
303
    /* copy ssl2&3 policy & prefs, even if it's not selected (yet) */
304
32.6k
    PORT_Memcpy(ss->cipherSuites, os->cipherSuites, sizeof os->cipherSuites);
305
32.6k
    PORT_Memcpy(ss->ssl3.dtlsSRTPCiphers, os->ssl3.dtlsSRTPCiphers,
306
32.6k
                sizeof(PRUint16) * os->ssl3.dtlsSRTPCipherCount);
307
32.6k
    ss->ssl3.dtlsSRTPCipherCount = os->ssl3.dtlsSRTPCipherCount;
308
32.6k
    PORT_Memcpy(ss->ssl3.signatureSchemes, os->ssl3.signatureSchemes,
309
32.6k
                sizeof(ss->ssl3.signatureSchemes[0]) *
310
32.6k
                    os->ssl3.signatureSchemeCount);
311
32.6k
    ss->ssl3.signatureSchemeCount = os->ssl3.signatureSchemeCount;
312
32.6k
    ss->ssl3.downgradeCheckVersion = os->ssl3.downgradeCheckVersion;
313
314
32.6k
    ss->ssl3.dheWeakGroupEnabled = os->ssl3.dheWeakGroupEnabled;
315
316
32.6k
    if (ss->opt.useSecurity) {
317
32.6k
        PRCList *cursor;
318
319
32.6k
        for (cursor = PR_NEXT_LINK(&os->serverCerts);
320
97.8k
             cursor != &os->serverCerts;
321
65.2k
             cursor = PR_NEXT_LINK(cursor)) {
322
65.2k
            sslServerCert *sc = ssl_CopyServerCert((sslServerCert *)cursor);
323
65.2k
            if (!sc)
324
0
                goto loser;
325
65.2k
            PR_APPEND_LINK(&sc->link, &ss->serverCerts);
326
65.2k
        }
327
328
32.6k
        for (cursor = PR_NEXT_LINK(&os->ephemeralKeyPairs);
329
32.6k
             cursor != &os->ephemeralKeyPairs;
330
32.6k
             cursor = PR_NEXT_LINK(cursor)) {
331
0
            sslEphemeralKeyPair *okp = (sslEphemeralKeyPair *)cursor;
332
0
            sslEphemeralKeyPair *skp = ssl_CopyEphemeralKeyPair(okp);
333
0
            if (!skp)
334
0
                goto loser;
335
0
            PR_APPEND_LINK(&skp->link, &ss->ephemeralKeyPairs);
336
0
        }
337
338
32.6k
        for (cursor = PR_NEXT_LINK(&os->extensionHooks);
339
32.6k
             cursor != &os->extensionHooks;
340
32.6k
             cursor = PR_NEXT_LINK(cursor)) {
341
0
            sslCustomExtensionHooks *oh = (sslCustomExtensionHooks *)cursor;
342
0
            sslCustomExtensionHooks *sh = PORT_ZNew(sslCustomExtensionHooks);
343
0
            if (!sh) {
344
0
                goto loser;
345
0
            }
346
0
            *sh = *oh;
347
0
            PR_APPEND_LINK(&sh->link, &ss->extensionHooks);
348
0
        }
349
350
        /*
351
         * XXX the preceding CERT_ and SECKEY_ functions can fail and return NULL.
352
         * XXX We should detect this, and not just march on with NULL pointers.
353
         */
354
32.6k
        ss->authCertificate = os->authCertificate;
355
32.6k
        ss->authCertificateArg = os->authCertificateArg;
356
32.6k
        ss->getClientAuthData = os->getClientAuthData;
357
32.6k
        ss->getClientAuthDataArg = os->getClientAuthDataArg;
358
32.6k
        ss->sniSocketConfig = os->sniSocketConfig;
359
32.6k
        ss->sniSocketConfigArg = os->sniSocketConfigArg;
360
32.6k
        ss->alertReceivedCallback = os->alertReceivedCallback;
361
32.6k
        ss->alertReceivedCallbackArg = os->alertReceivedCallbackArg;
362
32.6k
        ss->alertSentCallback = os->alertSentCallback;
363
32.6k
        ss->alertSentCallbackArg = os->alertSentCallbackArg;
364
32.6k
        ss->handleBadCert = os->handleBadCert;
365
32.6k
        ss->badCertArg = os->badCertArg;
366
32.6k
        ss->handshakeCallback = os->handshakeCallback;
367
32.6k
        ss->handshakeCallbackData = os->handshakeCallbackData;
368
32.6k
        ss->canFalseStartCallback = os->canFalseStartCallback;
369
32.6k
        ss->canFalseStartCallbackData = os->canFalseStartCallbackData;
370
32.6k
        ss->pkcs11PinArg = os->pkcs11PinArg;
371
32.6k
        ss->nextProtoCallback = os->nextProtoCallback;
372
32.6k
        ss->nextProtoArg = os->nextProtoArg;
373
32.6k
        PORT_Memcpy((void *)ss->namedGroupPreferences,
374
32.6k
                    os->namedGroupPreferences,
375
32.6k
                    sizeof(ss->namedGroupPreferences));
376
32.6k
        ss->additionalShares = os->additionalShares;
377
32.6k
        ss->resumptionTokenCallback = os->resumptionTokenCallback;
378
32.6k
        ss->resumptionTokenContext = os->resumptionTokenContext;
379
380
32.6k
        rv = tls13_CopyEchConfigs(&os->echConfigs, &ss->echConfigs);
381
32.6k
        if (rv != SECSuccess) {
382
0
            goto loser;
383
0
        }
384
32.6k
        if (os->echPrivKey && os->echPubKey) {
385
0
            ss->echPrivKey = SECKEY_CopyPrivateKey(os->echPrivKey);
386
0
            ss->echPubKey = SECKEY_CopyPublicKey(os->echPubKey);
387
0
            if (!ss->echPrivKey || !ss->echPubKey) {
388
0
                goto loser;
389
0
            }
390
0
        }
391
392
32.6k
        if (os->antiReplay) {
393
0
            ss->antiReplay = tls13_RefAntiReplayContext(os->antiReplay);
394
0
            PORT_Assert(ss->antiReplay); /* Can't fail. */
395
0
            if (!ss->antiReplay) {
396
0
                goto loser;
397
0
            }
398
0
        }
399
32.6k
        if (os->psk) {
400
0
            ss->psk = tls13_CopyPsk(os->psk);
401
0
            if (!ss->psk) {
402
0
                goto loser;
403
0
            }
404
0
        }
405
406
        /* Create security data */
407
32.6k
        rv = ssl_CopySecurityInfo(ss, os);
408
32.6k
        if (rv != SECSuccess) {
409
0
            goto loser;
410
0
        }
411
32.6k
    }
412
413
32.6k
    return ss;
414
415
0
loser:
416
0
    ssl_FreeSocket(ss);
417
0
    return NULL;
418
32.6k
}
419
420
static void
421
ssl_DestroyLocks(sslSocket *ss)
422
69.0k
{
423
    /* Destroy locks. */
424
69.0k
    if (ss->firstHandshakeLock) {
425
69.0k
        PZ_DestroyMonitor(ss->firstHandshakeLock);
426
69.0k
        ss->firstHandshakeLock = NULL;
427
69.0k
    }
428
69.0k
    if (ss->ssl3HandshakeLock) {
429
69.0k
        PZ_DestroyMonitor(ss->ssl3HandshakeLock);
430
69.0k
        ss->ssl3HandshakeLock = NULL;
431
69.0k
    }
432
69.0k
    if (ss->specLock) {
433
69.0k
        NSSRWLock_Destroy(ss->specLock);
434
69.0k
        ss->specLock = NULL;
435
69.0k
    }
436
437
69.0k
    if (ss->recvLock) {
438
69.0k
        PZ_DestroyLock(ss->recvLock);
439
69.0k
        ss->recvLock = NULL;
440
69.0k
    }
441
69.0k
    if (ss->sendLock) {
442
69.0k
        PZ_DestroyLock(ss->sendLock);
443
69.0k
        ss->sendLock = NULL;
444
69.0k
    }
445
69.0k
    if (ss->xmitBufLock) {
446
69.0k
        PZ_DestroyMonitor(ss->xmitBufLock);
447
69.0k
        ss->xmitBufLock = NULL;
448
69.0k
    }
449
69.0k
    if (ss->recvBufLock) {
450
69.0k
        PZ_DestroyMonitor(ss->recvBufLock);
451
69.0k
        ss->recvBufLock = NULL;
452
69.0k
    }
453
69.0k
}
454
455
/* Caller holds any relevant locks */
456
static void
457
ssl_DestroySocketContents(sslSocket *ss)
458
69.0k
{
459
69.0k
    PRCList *cursor;
460
461
    /* Free up socket */
462
69.0k
    ssl_DestroySecurityInfo(&ss->sec);
463
464
69.0k
    ssl3_DestroySSL3Info(ss);
465
466
69.0k
    PORT_Free(ss->saveBuf.buf);
467
69.0k
    PORT_Free(ss->pendingBuf.buf);
468
69.0k
    ssl3_DestroyGather(&ss->gs);
469
470
69.0k
    if (ss->peerID != NULL)
471
0
        PORT_Free(ss->peerID);
472
69.0k
    if (ss->url != NULL)
473
36.4k
        PORT_Free((void *)ss->url); /* CONST */
474
475
    /* Clean up server certificates and sundries. */
476
134k
    while (!PR_CLIST_IS_EMPTY(&ss->serverCerts)) {
477
65.2k
        cursor = PR_LIST_TAIL(&ss->serverCerts);
478
65.2k
        PR_REMOVE_LINK(cursor);
479
65.2k
        ssl_FreeServerCert((sslServerCert *)cursor);
480
65.2k
    }
481
482
    /* Remove extension handlers. */
483
69.0k
    ssl_ClearPRCList(&ss->extensionHooks, NULL);
484
485
69.0k
    ssl_FreeEphemeralKeyPairs(ss);
486
69.0k
    SECITEM_FreeItem(&ss->opt.nextProtoNego, PR_FALSE);
487
69.0k
    ssl3_FreeSniNameArray(&ss->xtnData);
488
489
69.0k
    ssl_ClearPRCList(&ss->ssl3.hs.dtlsSentHandshake, NULL);
490
69.0k
    ssl_ClearPRCList(&ss->ssl3.hs.dtlsRcvdHandshake, NULL);
491
69.0k
    tls13_DestroyPskList(&ss->ssl3.hs.psks);
492
493
69.0k
    tls13_ReleaseAntiReplayContext(ss->antiReplay);
494
495
69.0k
    tls13_DestroyPsk(ss->psk);
496
497
69.0k
    tls13_DestroyEchConfigs(&ss->echConfigs);
498
69.0k
    SECKEY_DestroyPrivateKey(ss->echPrivKey);
499
69.0k
    SECKEY_DestroyPublicKey(ss->echPubKey);
500
69.0k
}
501
502
/*
503
 * free an sslSocket struct, and all the stuff that hangs off of it
504
 */
505
void
506
ssl_FreeSocket(sslSocket *ss)
507
69.0k
{
508
    /* Get every lock you can imagine!
509
    ** Caller already holds these:
510
    **  SSL_LOCK_READER(ss);
511
    **  SSL_LOCK_WRITER(ss);
512
    */
513
69.0k
    ssl_Get1stHandshakeLock(ss);
514
69.0k
    ssl_GetRecvBufLock(ss);
515
69.0k
    ssl_GetSSL3HandshakeLock(ss);
516
69.0k
    ssl_GetXmitBufLock(ss);
517
69.0k
    ssl_GetSpecWriteLock(ss);
518
519
69.0k
    ssl_DestroySocketContents(ss);
520
521
    /* Release all the locks acquired above.  */
522
69.0k
    SSL_UNLOCK_READER(ss);
523
69.0k
    SSL_UNLOCK_WRITER(ss);
524
69.0k
    ssl_Release1stHandshakeLock(ss);
525
69.0k
    ssl_ReleaseRecvBufLock(ss);
526
69.0k
    ssl_ReleaseSSL3HandshakeLock(ss);
527
69.0k
    ssl_ReleaseXmitBufLock(ss);
528
69.0k
    ssl_ReleaseSpecWriteLock(ss);
529
530
69.0k
    ssl_DestroyLocks(ss);
531
532
69.0k
#ifdef DEBUG
533
69.0k
    PORT_Memset(ss, 0x1f, sizeof *ss);
534
69.0k
#endif
535
69.0k
    PORT_Free(ss);
536
69.0k
    return;
537
69.0k
}
538
539
/************************************************************************/
540
SECStatus
541
ssl_EnableNagleDelay(sslSocket *ss, PRBool enabled)
542
613
{
543
613
    PRFileDesc *osfd = ss->fd->lower;
544
613
    SECStatus rv = SECFailure;
545
613
    PRSocketOptionData opt;
546
547
613
    opt.option = PR_SockOpt_NoDelay;
548
613
    opt.value.no_delay = (PRBool)!enabled;
549
550
613
    if (osfd->methods->setsocketoption) {
551
613
        rv = (SECStatus)osfd->methods->setsocketoption(osfd, &opt);
552
613
    } else {
553
0
        PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
554
0
    }
555
556
613
    return rv;
557
613
}
558
559
static void
560
ssl_ChooseOps(sslSocket *ss)
561
69.0k
{
562
69.0k
    ss->ops = ss->opt.useSecurity ? &ssl_secure_ops : &ssl_default_ops;
563
69.0k
}
564
565
/* Called from SSL_Enable (immediately below) */
566
static SECStatus
567
PrepareSocket(sslSocket *ss)
568
0
{
569
0
    SECStatus rv = SECSuccess;
570
571
0
    ssl_ChooseOps(ss);
572
0
    return rv;
573
0
}
574
575
SECStatus
576
SSL_Enable(PRFileDesc *fd, int which, PRIntn on)
577
0
{
578
0
    return SSL_OptionSet(fd, which, on);
579
0
}
580
581
static PRBool ssl_VersionIsSupportedByPolicy(
582
    SSLProtocolVariant protocolVariant, SSL3ProtocolVersion version);
583
584
/* Implements the semantics for SSL_OptionSet(SSL_ENABLE_TLS, on) described in
585
 * ssl.h in the section "SSL version range setting API".
586
 */
587
static void
588
ssl_EnableTLS(SSLVersionRange *vrange, PRIntn enable)
589
0
{
590
0
    if (enable) {
591
        /* don't turn it on if tls1.0 disallowed by by policy */
592
0
        if (!ssl_VersionIsSupportedByPolicy(ssl_variant_stream,
593
0
                                            SSL_LIBRARY_VERSION_TLS_1_0)) {
594
0
            return;
595
0
        }
596
0
    }
597
0
    if (SSL_ALL_VERSIONS_DISABLED(vrange)) {
598
0
        if (enable) {
599
0
            vrange->min = SSL_LIBRARY_VERSION_TLS_1_0;
600
0
            vrange->max = SSL_LIBRARY_VERSION_TLS_1_0;
601
0
        } /* else don't change anything */
602
0
        return;
603
0
    }
604
605
0
    if (enable) {
606
        /* Expand the range of enabled version to include TLS 1.0 */
607
0
        vrange->min = PR_MIN(vrange->min, SSL_LIBRARY_VERSION_TLS_1_0);
608
0
        vrange->max = PR_MAX(vrange->max, SSL_LIBRARY_VERSION_TLS_1_0);
609
0
    } else {
610
        /* Disable all TLS versions, leaving only SSL 3.0 if it was enabled */
611
0
        if (vrange->min == SSL_LIBRARY_VERSION_3_0) {
612
0
            vrange->max = SSL_LIBRARY_VERSION_3_0;
613
0
        } else {
614
            /* Only TLS was enabled, so now no versions are. */
615
0
            vrange->min = SSL_LIBRARY_VERSION_NONE;
616
0
            vrange->max = SSL_LIBRARY_VERSION_NONE;
617
0
        }
618
0
    }
619
0
}
620
621
/* Implements the semantics for SSL_OptionSet(SSL_ENABLE_SSL3, on) described in
622
 * ssl.h in the section "SSL version range setting API".
623
 */
624
static void
625
ssl_EnableSSL3(SSLVersionRange *vrange, PRIntn enable)
626
0
{
627
0
    if (enable) {
628
        /* don't turn it on if ssl3 disallowed by by policy */
629
0
        if (!ssl_VersionIsSupportedByPolicy(ssl_variant_stream,
630
0
                                            SSL_LIBRARY_VERSION_3_0)) {
631
0
            return;
632
0
        }
633
0
    }
634
0
    if (SSL_ALL_VERSIONS_DISABLED(vrange)) {
635
0
        if (enable) {
636
0
            vrange->min = SSL_LIBRARY_VERSION_3_0;
637
0
            vrange->max = SSL_LIBRARY_VERSION_3_0;
638
0
        } /* else don't change anything */
639
0
        return;
640
0
    }
641
642
0
    if (enable) {
643
        /* Expand the range of enabled versions to include SSL 3.0. We know
644
         * SSL 3.0 or some version of TLS is already enabled at this point, so
645
         * we don't need to change vrange->max.
646
         */
647
0
        vrange->min = SSL_LIBRARY_VERSION_3_0;
648
0
    } else {
649
        /* Disable SSL 3.0, leaving TLS unaffected. */
650
0
        if (vrange->max > SSL_LIBRARY_VERSION_3_0) {
651
0
            vrange->min = PR_MAX(vrange->min, SSL_LIBRARY_VERSION_TLS_1_0);
652
0
        } else {
653
            /* Only SSL 3.0 was enabled, so now no versions are. */
654
0
            vrange->min = SSL_LIBRARY_VERSION_NONE;
655
0
            vrange->max = SSL_LIBRARY_VERSION_NONE;
656
0
        }
657
0
    }
658
0
}
659
660
SECStatus
661
SSL_OptionSet(PRFileDesc *fd, PRInt32 which, PRIntn val)
662
519k
{
663
519k
    sslSocket *ss = ssl_FindSocket(fd);
664
519k
    SECStatus rv = SECSuccess;
665
519k
    PRBool holdingLocks;
666
667
519k
    if (!ss) {
668
0
        SSL_DBG(("%d: SSL[%d]: bad socket in Enable", SSL_GETPID(), fd));
669
0
        return SECFailure;
670
0
    }
671
672
519k
    holdingLocks = (!ss->opt.noLocks);
673
519k
    ssl_Get1stHandshakeLock(ss);
674
519k
    ssl_GetSSL3HandshakeLock(ss);
675
676
519k
    switch (which) {
677
0
        case SSL_SOCKS:
678
0
            ss->opt.useSocks = PR_FALSE;
679
0
            rv = PrepareSocket(ss);
680
0
            if (val) {
681
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
682
0
                rv = SECFailure;
683
0
            }
684
0
            break;
685
686
0
        case SSL_SECURITY:
687
0
            ss->opt.useSecurity = val;
688
0
            rv = PrepareSocket(ss);
689
0
            break;
690
691
32.6k
        case SSL_REQUEST_CERTIFICATE:
692
32.6k
            ss->opt.requestCertificate = val;
693
32.6k
            break;
694
695
32.6k
        case SSL_REQUIRE_CERTIFICATE:
696
32.6k
            ss->opt.requireCertificate = val;
697
32.6k
            break;
698
699
0
        case SSL_HANDSHAKE_AS_CLIENT:
700
0
            if (ss->opt.handshakeAsServer && val) {
701
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
702
0
                rv = SECFailure;
703
0
                break;
704
0
            }
705
0
            ss->opt.handshakeAsClient = val;
706
0
            break;
707
708
0
        case SSL_HANDSHAKE_AS_SERVER:
709
0
            if (ss->opt.handshakeAsClient && val) {
710
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
711
0
                rv = SECFailure;
712
0
                break;
713
0
            }
714
0
            ss->opt.handshakeAsServer = val;
715
0
            break;
716
717
0
        case SSL_ENABLE_TLS:
718
0
            if (IS_DTLS(ss)) {
719
0
                if (val) {
720
0
                    PORT_SetError(SEC_ERROR_INVALID_ARGS);
721
0
                    rv = SECFailure; /* not allowed */
722
0
                }
723
0
                break;
724
0
            }
725
0
            ssl_EnableTLS(&ss->vrange, val);
726
0
            break;
727
728
0
        case SSL_ENABLE_SSL3:
729
0
            if (IS_DTLS(ss)) {
730
0
                if (val) {
731
0
                    PORT_SetError(SEC_ERROR_INVALID_ARGS);
732
0
                    rv = SECFailure; /* not allowed */
733
0
                }
734
0
                break;
735
0
            }
736
0
            ssl_EnableSSL3(&ss->vrange, val);
737
0
            break;
738
739
0
        case SSL_ENABLE_SSL2:
740
0
        case SSL_V2_COMPATIBLE_HELLO:
741
            /* We no longer support SSL v2.
742
             * However, if an old application requests to disable SSL v2,
743
             * we shouldn't fail.
744
             */
745
0
            if (val) {
746
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
747
0
                rv = SECFailure;
748
0
            }
749
0
            break;
750
751
69.0k
        case SSL_NO_CACHE:
752
69.0k
            ss->opt.noCache = val;
753
69.0k
            break;
754
755
0
        case SSL_ENABLE_FDX:
756
0
            if (val && ss->opt.noLocks) {
757
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
758
0
                rv = SECFailure;
759
0
            }
760
0
            ss->opt.fdx = val;
761
0
            break;
762
763
0
        case SSL_ROLLBACK_DETECTION:
764
0
            ss->opt.detectRollBack = val;
765
0
            break;
766
767
0
        case SSL_NO_STEP_DOWN:
768
0
            break;
769
770
0
        case SSL_BYPASS_PKCS11:
771
0
            break;
772
773
0
        case SSL_NO_LOCKS:
774
0
            if (val && ss->opt.fdx) {
775
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
776
0
                rv = SECFailure;
777
0
            }
778
0
            if (val && ssl_force_locks)
779
0
                val = PR_FALSE; /* silent override */
780
0
            ss->opt.noLocks = val;
781
0
            if (val) {
782
0
                locksEverDisabled = PR_TRUE;
783
0
                strcpy(lockStatus + LOCKSTATUS_OFFSET, "DISABLED.");
784
0
            } else if (!holdingLocks) {
785
0
                rv = ssl_MakeLocks(ss);
786
0
                if (rv != SECSuccess) {
787
0
                    ss->opt.noLocks = PR_TRUE;
788
0
                }
789
0
            }
790
0
            break;
791
792
0
        case SSL_ENABLE_SESSION_TICKETS:
793
0
            ss->opt.enableSessionTickets = val;
794
0
            break;
795
796
69.0k
        case SSL_ENABLE_DEFLATE:
797
69.0k
            ss->opt.enableDeflate = val;
798
69.0k
            break;
799
800
36.0k
        case SSL_ENABLE_RENEGOTIATION:
801
36.0k
            if (IS_DTLS(ss) && val != SSL_RENEGOTIATE_NEVER) {
802
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
803
0
                rv = SECFailure;
804
0
                break;
805
0
            }
806
36.0k
            ss->opt.enableRenegotiation = val;
807
36.0k
            break;
808
809
69.0k
        case SSL_REQUIRE_SAFE_NEGOTIATION:
810
69.0k
            ss->opt.requireSafeNegotiation = val;
811
69.0k
            break;
812
813
36.4k
        case SSL_ENABLE_FALSE_START:
814
36.4k
            ss->opt.enableFalseStart = val;
815
36.4k
            break;
816
817
69.0k
        case SSL_CBC_RANDOM_IV:
818
69.0k
            ss->opt.cbcRandomIV = val;
819
69.0k
            break;
820
821
0
        case SSL_ENABLE_OCSP_STAPLING:
822
0
            ss->opt.enableOCSPStapling = val;
823
0
            break;
824
825
0
        case SSL_ENABLE_DELEGATED_CREDENTIALS:
826
0
            ss->opt.enableDelegatedCredentials = val;
827
0
            break;
828
829
0
        case SSL_ENABLE_NPN:
830
0
            break;
831
832
0
        case SSL_ENABLE_ALPN:
833
0
            ss->opt.enableALPN = val;
834
0
            break;
835
836
0
        case SSL_REUSE_SERVER_ECDHE_KEY:
837
0
            ss->opt.reuseServerECDHEKey = val;
838
0
            break;
839
840
0
        case SSL_ENABLE_FALLBACK_SCSV:
841
0
            ss->opt.enableFallbackSCSV = val;
842
0
            break;
843
844
0
        case SSL_ENABLE_SERVER_DHE:
845
0
            ss->opt.enableServerDhe = val;
846
0
            break;
847
848
69.0k
        case SSL_ENABLE_EXTENDED_MASTER_SECRET:
849
69.0k
            ss->opt.enableExtendedMS = val;
850
69.0k
            break;
851
852
0
        case SSL_ENABLE_SIGNED_CERT_TIMESTAMPS:
853
0
            ss->opt.enableSignedCertTimestamps = val;
854
0
            break;
855
856
36.4k
        case SSL_REQUIRE_DH_NAMED_GROUPS:
857
36.4k
            ss->opt.requireDHENamedGroups = val;
858
36.4k
            break;
859
860
0
        case SSL_ENABLE_0RTT_DATA:
861
0
            ss->opt.enable0RttData = val;
862
0
            break;
863
864
0
        case SSL_RECORD_SIZE_LIMIT:
865
0
            if (val < 64 || val > (MAX_FRAGMENT_LENGTH + 1)) {
866
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
867
0
                rv = SECFailure;
868
0
            } else {
869
0
                ss->opt.recordSizeLimit = val;
870
0
            }
871
0
            break;
872
873
0
        case SSL_ENABLE_TLS13_COMPAT_MODE:
874
0
            ss->opt.enableTls13CompatMode = val;
875
0
            break;
876
877
0
        case SSL_ENABLE_DTLS_SHORT_HEADER:
878
0
            ss->opt.enableDtlsShortHeader = val;
879
0
            break;
880
881
0
        case SSL_ENABLE_HELLO_DOWNGRADE_CHECK:
882
0
            ss->opt.enableHelloDowngradeCheck = val;
883
0
            break;
884
885
0
        case SSL_ENABLE_V2_COMPATIBLE_HELLO:
886
0
            ss->opt.enableV2CompatibleHello = val;
887
0
            break;
888
889
0
        case SSL_ENABLE_POST_HANDSHAKE_AUTH:
890
0
            ss->opt.enablePostHandshakeAuth = val;
891
0
            break;
892
893
0
        case SSL_SUPPRESS_END_OF_EARLY_DATA:
894
0
            ss->opt.suppressEndOfEarlyData = val;
895
0
            break;
896
897
0
        case SSL_ENABLE_GREASE:
898
0
            ss->opt.enableGrease = val;
899
0
            break;
900
901
0
        case SSL_ENABLE_CH_EXTENSION_PERMUTATION:
902
0
            ss->opt.enableChXtnPermutation = val;
903
0
            break;
904
905
0
        default:
906
0
            PORT_SetError(SEC_ERROR_INVALID_ARGS);
907
0
            rv = SECFailure;
908
519k
    }
909
910
    /* We can't use the macros for releasing the locks here,
911
     * because ss->opt.noLocks might have changed just above.
912
     * We must release these locks (monitors) here, if we aquired them above,
913
     * regardless of the current value of ss->opt.noLocks.
914
     */
915
519k
    if (holdingLocks) {
916
519k
        PZ_ExitMonitor((ss)->ssl3HandshakeLock);
917
519k
        PZ_ExitMonitor((ss)->firstHandshakeLock);
918
519k
    }
919
920
519k
    return rv;
921
519k
}
922
923
SECStatus
924
SSL_OptionGet(PRFileDesc *fd, PRInt32 which, PRIntn *pVal)
925
0
{
926
0
    sslSocket *ss = ssl_FindSocket(fd);
927
0
    SECStatus rv = SECSuccess;
928
0
    PRIntn val = PR_FALSE;
929
930
0
    if (!pVal) {
931
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
932
0
        return SECFailure;
933
0
    }
934
0
    if (!ss) {
935
0
        SSL_DBG(("%d: SSL[%d]: bad socket in Enable", SSL_GETPID(), fd));
936
0
        *pVal = PR_FALSE;
937
0
        return SECFailure;
938
0
    }
939
940
0
    ssl_Get1stHandshakeLock(ss);
941
0
    ssl_GetSSL3HandshakeLock(ss);
942
943
0
    switch (which) {
944
0
        case SSL_SOCKS:
945
0
            val = PR_FALSE;
946
0
            break;
947
0
        case SSL_SECURITY:
948
0
            val = ss->opt.useSecurity;
949
0
            break;
950
0
        case SSL_REQUEST_CERTIFICATE:
951
0
            val = ss->opt.requestCertificate;
952
0
            break;
953
0
        case SSL_REQUIRE_CERTIFICATE:
954
0
            val = ss->opt.requireCertificate;
955
0
            break;
956
0
        case SSL_HANDSHAKE_AS_CLIENT:
957
0
            val = ss->opt.handshakeAsClient;
958
0
            break;
959
0
        case SSL_HANDSHAKE_AS_SERVER:
960
0
            val = ss->opt.handshakeAsServer;
961
0
            break;
962
0
        case SSL_ENABLE_TLS:
963
0
            val = ss->vrange.max >= SSL_LIBRARY_VERSION_TLS_1_0;
964
0
            break;
965
0
        case SSL_ENABLE_SSL3:
966
0
            val = ss->vrange.min == SSL_LIBRARY_VERSION_3_0;
967
0
            break;
968
0
        case SSL_ENABLE_SSL2:
969
0
        case SSL_V2_COMPATIBLE_HELLO:
970
0
            val = PR_FALSE;
971
0
            break;
972
0
        case SSL_NO_CACHE:
973
0
            val = ss->opt.noCache;
974
0
            break;
975
0
        case SSL_ENABLE_FDX:
976
0
            val = ss->opt.fdx;
977
0
            break;
978
0
        case SSL_ROLLBACK_DETECTION:
979
0
            val = ss->opt.detectRollBack;
980
0
            break;
981
0
        case SSL_NO_STEP_DOWN:
982
0
            val = PR_FALSE;
983
0
            break;
984
0
        case SSL_BYPASS_PKCS11:
985
0
            val = PR_FALSE;
986
0
            break;
987
0
        case SSL_NO_LOCKS:
988
0
            val = ss->opt.noLocks;
989
0
            break;
990
0
        case SSL_ENABLE_SESSION_TICKETS:
991
0
            val = ss->opt.enableSessionTickets;
992
0
            break;
993
0
        case SSL_ENABLE_DEFLATE:
994
0
            val = ss->opt.enableDeflate;
995
0
            break;
996
0
        case SSL_ENABLE_RENEGOTIATION:
997
0
            val = ss->opt.enableRenegotiation;
998
0
            break;
999
0
        case SSL_REQUIRE_SAFE_NEGOTIATION:
1000
0
            val = ss->opt.requireSafeNegotiation;
1001
0
            break;
1002
0
        case SSL_ENABLE_FALSE_START:
1003
0
            val = ss->opt.enableFalseStart;
1004
0
            break;
1005
0
        case SSL_CBC_RANDOM_IV:
1006
0
            val = ss->opt.cbcRandomIV;
1007
0
            break;
1008
0
        case SSL_ENABLE_OCSP_STAPLING:
1009
0
            val = ss->opt.enableOCSPStapling;
1010
0
            break;
1011
0
        case SSL_ENABLE_DELEGATED_CREDENTIALS:
1012
0
            val = ss->opt.enableDelegatedCredentials;
1013
0
            break;
1014
0
        case SSL_ENABLE_NPN:
1015
0
            val = PR_FALSE;
1016
0
            break;
1017
0
        case SSL_ENABLE_ALPN:
1018
0
            val = ss->opt.enableALPN;
1019
0
            break;
1020
0
        case SSL_REUSE_SERVER_ECDHE_KEY:
1021
0
            val = ss->opt.reuseServerECDHEKey;
1022
0
            break;
1023
0
        case SSL_ENABLE_FALLBACK_SCSV:
1024
0
            val = ss->opt.enableFallbackSCSV;
1025
0
            break;
1026
0
        case SSL_ENABLE_SERVER_DHE:
1027
0
            val = ss->opt.enableServerDhe;
1028
0
            break;
1029
0
        case SSL_ENABLE_EXTENDED_MASTER_SECRET:
1030
0
            val = ss->opt.enableExtendedMS;
1031
0
            break;
1032
0
        case SSL_ENABLE_SIGNED_CERT_TIMESTAMPS:
1033
0
            val = ss->opt.enableSignedCertTimestamps;
1034
0
            break;
1035
0
        case SSL_REQUIRE_DH_NAMED_GROUPS:
1036
0
            val = ss->opt.requireDHENamedGroups;
1037
0
            break;
1038
0
        case SSL_ENABLE_0RTT_DATA:
1039
0
            val = ss->opt.enable0RttData;
1040
0
            break;
1041
0
        case SSL_RECORD_SIZE_LIMIT:
1042
0
            val = ss->opt.recordSizeLimit;
1043
0
            break;
1044
0
        case SSL_ENABLE_TLS13_COMPAT_MODE:
1045
0
            val = ss->opt.enableTls13CompatMode;
1046
0
            break;
1047
0
        case SSL_ENABLE_DTLS_SHORT_HEADER:
1048
0
            val = ss->opt.enableDtlsShortHeader;
1049
0
            break;
1050
0
        case SSL_ENABLE_HELLO_DOWNGRADE_CHECK:
1051
0
            val = ss->opt.enableHelloDowngradeCheck;
1052
0
            break;
1053
0
        case SSL_ENABLE_V2_COMPATIBLE_HELLO:
1054
0
            val = ss->opt.enableV2CompatibleHello;
1055
0
            break;
1056
0
        case SSL_ENABLE_POST_HANDSHAKE_AUTH:
1057
0
            val = ss->opt.enablePostHandshakeAuth;
1058
0
            break;
1059
0
        case SSL_SUPPRESS_END_OF_EARLY_DATA:
1060
0
            val = ss->opt.suppressEndOfEarlyData;
1061
0
            break;
1062
0
        default:
1063
0
            PORT_SetError(SEC_ERROR_INVALID_ARGS);
1064
0
            rv = SECFailure;
1065
0
    }
1066
1067
0
    ssl_ReleaseSSL3HandshakeLock(ss);
1068
0
    ssl_Release1stHandshakeLock(ss);
1069
1070
0
    *pVal = val;
1071
0
    return rv;
1072
0
}
1073
1074
SECStatus
1075
SSL_OptionGetDefault(PRInt32 which, PRIntn *pVal)
1076
0
{
1077
0
    SECStatus rv = SECSuccess;
1078
0
    PRIntn val = PR_FALSE;
1079
1080
0
    if (!pVal) {
1081
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
1082
0
        return SECFailure;
1083
0
    }
1084
1085
0
    ssl_SetDefaultsFromEnvironment();
1086
1087
0
    switch (which) {
1088
0
        case SSL_SOCKS:
1089
0
            val = PR_FALSE;
1090
0
            break;
1091
0
        case SSL_SECURITY:
1092
0
            val = ssl_defaults.useSecurity;
1093
0
            break;
1094
0
        case SSL_REQUEST_CERTIFICATE:
1095
0
            val = ssl_defaults.requestCertificate;
1096
0
            break;
1097
0
        case SSL_REQUIRE_CERTIFICATE:
1098
0
            val = ssl_defaults.requireCertificate;
1099
0
            break;
1100
0
        case SSL_HANDSHAKE_AS_CLIENT:
1101
0
            val = ssl_defaults.handshakeAsClient;
1102
0
            break;
1103
0
        case SSL_HANDSHAKE_AS_SERVER:
1104
0
            val = ssl_defaults.handshakeAsServer;
1105
0
            break;
1106
0
        case SSL_ENABLE_TLS:
1107
0
            val = versions_defaults_stream.max >= SSL_LIBRARY_VERSION_TLS_1_0;
1108
0
            break;
1109
0
        case SSL_ENABLE_SSL3:
1110
0
            val = versions_defaults_stream.min == SSL_LIBRARY_VERSION_3_0;
1111
0
            break;
1112
0
        case SSL_ENABLE_SSL2:
1113
0
        case SSL_V2_COMPATIBLE_HELLO:
1114
0
            val = PR_FALSE;
1115
0
            break;
1116
0
        case SSL_NO_CACHE:
1117
0
            val = ssl_defaults.noCache;
1118
0
            break;
1119
0
        case SSL_ENABLE_FDX:
1120
0
            val = ssl_defaults.fdx;
1121
0
            break;
1122
0
        case SSL_ROLLBACK_DETECTION:
1123
0
            val = ssl_defaults.detectRollBack;
1124
0
            break;
1125
0
        case SSL_NO_STEP_DOWN:
1126
0
            val = PR_FALSE;
1127
0
            break;
1128
0
        case SSL_BYPASS_PKCS11:
1129
0
            val = PR_FALSE;
1130
0
            break;
1131
0
        case SSL_NO_LOCKS:
1132
0
            val = ssl_defaults.noLocks;
1133
0
            break;
1134
0
        case SSL_ENABLE_SESSION_TICKETS:
1135
0
            val = ssl_defaults.enableSessionTickets;
1136
0
            break;
1137
0
        case SSL_ENABLE_DEFLATE:
1138
0
            val = ssl_defaults.enableDeflate;
1139
0
            break;
1140
0
        case SSL_ENABLE_RENEGOTIATION:
1141
0
            val = ssl_defaults.enableRenegotiation;
1142
0
            break;
1143
0
        case SSL_REQUIRE_SAFE_NEGOTIATION:
1144
0
            val = ssl_defaults.requireSafeNegotiation;
1145
0
            break;
1146
0
        case SSL_ENABLE_FALSE_START:
1147
0
            val = ssl_defaults.enableFalseStart;
1148
0
            break;
1149
0
        case SSL_CBC_RANDOM_IV:
1150
0
            val = ssl_defaults.cbcRandomIV;
1151
0
            break;
1152
0
        case SSL_ENABLE_OCSP_STAPLING:
1153
0
            val = ssl_defaults.enableOCSPStapling;
1154
0
            break;
1155
0
        case SSL_ENABLE_DELEGATED_CREDENTIALS:
1156
0
            val = ssl_defaults.enableDelegatedCredentials;
1157
0
            break;
1158
0
        case SSL_ENABLE_NPN:
1159
0
            val = PR_FALSE;
1160
0
            break;
1161
0
        case SSL_ENABLE_ALPN:
1162
0
            val = ssl_defaults.enableALPN;
1163
0
            break;
1164
0
        case SSL_REUSE_SERVER_ECDHE_KEY:
1165
0
            val = ssl_defaults.reuseServerECDHEKey;
1166
0
            break;
1167
0
        case SSL_ENABLE_FALLBACK_SCSV:
1168
0
            val = ssl_defaults.enableFallbackSCSV;
1169
0
            break;
1170
0
        case SSL_ENABLE_SERVER_DHE:
1171
0
            val = ssl_defaults.enableServerDhe;
1172
0
            break;
1173
0
        case SSL_ENABLE_EXTENDED_MASTER_SECRET:
1174
0
            val = ssl_defaults.enableExtendedMS;
1175
0
            break;
1176
0
        case SSL_ENABLE_SIGNED_CERT_TIMESTAMPS:
1177
0
            val = ssl_defaults.enableSignedCertTimestamps;
1178
0
            break;
1179
0
        case SSL_ENABLE_0RTT_DATA:
1180
0
            val = ssl_defaults.enable0RttData;
1181
0
            break;
1182
0
        case SSL_RECORD_SIZE_LIMIT:
1183
0
            val = ssl_defaults.recordSizeLimit;
1184
0
            break;
1185
0
        case SSL_ENABLE_TLS13_COMPAT_MODE:
1186
0
            val = ssl_defaults.enableTls13CompatMode;
1187
0
            break;
1188
0
        case SSL_ENABLE_DTLS_SHORT_HEADER:
1189
0
            val = ssl_defaults.enableDtlsShortHeader;
1190
0
            break;
1191
0
        case SSL_ENABLE_HELLO_DOWNGRADE_CHECK:
1192
0
            val = ssl_defaults.enableHelloDowngradeCheck;
1193
0
            break;
1194
0
        case SSL_ENABLE_V2_COMPATIBLE_HELLO:
1195
0
            val = ssl_defaults.enableV2CompatibleHello;
1196
0
            break;
1197
0
        case SSL_ENABLE_POST_HANDSHAKE_AUTH:
1198
0
            val = ssl_defaults.enablePostHandshakeAuth;
1199
0
            break;
1200
0
        case SSL_SUPPRESS_END_OF_EARLY_DATA:
1201
0
            val = ssl_defaults.suppressEndOfEarlyData;
1202
0
            break;
1203
0
        default:
1204
0
            PORT_SetError(SEC_ERROR_INVALID_ARGS);
1205
0
            rv = SECFailure;
1206
0
    }
1207
1208
0
    *pVal = val;
1209
0
    return rv;
1210
0
}
1211
1212
/* XXX Use Global Lock to protect this stuff. */
1213
SECStatus
1214
SSL_EnableDefault(int which, PRIntn val)
1215
0
{
1216
0
    return SSL_OptionSetDefault(which, val);
1217
0
}
1218
1219
SECStatus
1220
SSL_OptionSetDefault(PRInt32 which, PRIntn val)
1221
0
{
1222
0
    SECStatus status = ssl_Init();
1223
1224
0
    if (status != SECSuccess) {
1225
0
        return status;
1226
0
    }
1227
1228
0
    ssl_SetDefaultsFromEnvironment();
1229
1230
0
    switch (which) {
1231
0
        case SSL_SOCKS:
1232
0
            ssl_defaults.useSocks = PR_FALSE;
1233
0
            if (val) {
1234
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
1235
0
                return SECFailure;
1236
0
            }
1237
0
            break;
1238
1239
0
        case SSL_SECURITY:
1240
0
            ssl_defaults.useSecurity = val;
1241
0
            break;
1242
1243
0
        case SSL_REQUEST_CERTIFICATE:
1244
0
            ssl_defaults.requestCertificate = val;
1245
0
            break;
1246
1247
0
        case SSL_REQUIRE_CERTIFICATE:
1248
0
            ssl_defaults.requireCertificate = val;
1249
0
            break;
1250
1251
0
        case SSL_HANDSHAKE_AS_CLIENT:
1252
0
            if (ssl_defaults.handshakeAsServer && val) {
1253
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
1254
0
                return SECFailure;
1255
0
            }
1256
0
            ssl_defaults.handshakeAsClient = val;
1257
0
            break;
1258
1259
0
        case SSL_HANDSHAKE_AS_SERVER:
1260
0
            if (ssl_defaults.handshakeAsClient && val) {
1261
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
1262
0
                return SECFailure;
1263
0
            }
1264
0
            ssl_defaults.handshakeAsServer = val;
1265
0
            break;
1266
1267
0
        case SSL_ENABLE_TLS:
1268
0
            ssl_EnableTLS(&versions_defaults_stream, val);
1269
0
            break;
1270
1271
0
        case SSL_ENABLE_SSL3:
1272
0
            ssl_EnableSSL3(&versions_defaults_stream, val);
1273
0
            break;
1274
1275
0
        case SSL_ENABLE_SSL2:
1276
0
        case SSL_V2_COMPATIBLE_HELLO:
1277
            /* We no longer support SSL v2.
1278
             * However, if an old application requests to disable SSL v2,
1279
             * we shouldn't fail.
1280
             */
1281
0
            if (val) {
1282
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
1283
0
                return SECFailure;
1284
0
            }
1285
0
            break;
1286
1287
0
        case SSL_NO_CACHE:
1288
0
            ssl_defaults.noCache = val;
1289
0
            break;
1290
1291
0
        case SSL_ENABLE_FDX:
1292
0
            if (val && ssl_defaults.noLocks) {
1293
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
1294
0
                return SECFailure;
1295
0
            }
1296
0
            ssl_defaults.fdx = val;
1297
0
            break;
1298
1299
0
        case SSL_ROLLBACK_DETECTION:
1300
0
            ssl_defaults.detectRollBack = val;
1301
0
            break;
1302
1303
0
        case SSL_NO_STEP_DOWN:
1304
0
            break;
1305
1306
0
        case SSL_BYPASS_PKCS11:
1307
0
            break;
1308
1309
0
        case SSL_NO_LOCKS:
1310
0
            if (val && ssl_defaults.fdx) {
1311
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
1312
0
                return SECFailure;
1313
0
            }
1314
0
            if (val && ssl_force_locks)
1315
0
                val = PR_FALSE; /* silent override */
1316
0
            ssl_defaults.noLocks = val;
1317
0
            if (val) {
1318
0
                locksEverDisabled = PR_TRUE;
1319
0
                strcpy(lockStatus + LOCKSTATUS_OFFSET, "DISABLED.");
1320
0
            }
1321
0
            break;
1322
1323
0
        case SSL_ENABLE_SESSION_TICKETS:
1324
0
            ssl_defaults.enableSessionTickets = val;
1325
0
            break;
1326
1327
0
        case SSL_ENABLE_DEFLATE:
1328
0
            ssl_defaults.enableDeflate = val;
1329
0
            break;
1330
1331
0
        case SSL_ENABLE_RENEGOTIATION:
1332
0
            ssl_defaults.enableRenegotiation = val;
1333
0
            break;
1334
1335
0
        case SSL_REQUIRE_SAFE_NEGOTIATION:
1336
0
            ssl_defaults.requireSafeNegotiation = val;
1337
0
            break;
1338
1339
0
        case SSL_ENABLE_FALSE_START:
1340
0
            ssl_defaults.enableFalseStart = val;
1341
0
            break;
1342
1343
0
        case SSL_CBC_RANDOM_IV:
1344
0
            ssl_defaults.cbcRandomIV = val;
1345
0
            break;
1346
1347
0
        case SSL_ENABLE_OCSP_STAPLING:
1348
0
            ssl_defaults.enableOCSPStapling = val;
1349
0
            break;
1350
1351
0
        case SSL_ENABLE_DELEGATED_CREDENTIALS:
1352
0
            ssl_defaults.enableDelegatedCredentials = val;
1353
0
            break;
1354
1355
0
        case SSL_ENABLE_NPN:
1356
0
            break;
1357
1358
0
        case SSL_ENABLE_ALPN:
1359
0
            ssl_defaults.enableALPN = val;
1360
0
            break;
1361
1362
0
        case SSL_REUSE_SERVER_ECDHE_KEY:
1363
0
            ssl_defaults.reuseServerECDHEKey = val;
1364
0
            break;
1365
1366
0
        case SSL_ENABLE_FALLBACK_SCSV:
1367
0
            ssl_defaults.enableFallbackSCSV = val;
1368
0
            break;
1369
1370
0
        case SSL_ENABLE_SERVER_DHE:
1371
0
            ssl_defaults.enableServerDhe = val;
1372
0
            break;
1373
1374
0
        case SSL_ENABLE_EXTENDED_MASTER_SECRET:
1375
0
            ssl_defaults.enableExtendedMS = val;
1376
0
            break;
1377
1378
0
        case SSL_ENABLE_SIGNED_CERT_TIMESTAMPS:
1379
0
            ssl_defaults.enableSignedCertTimestamps = val;
1380
0
            break;
1381
1382
0
        case SSL_ENABLE_0RTT_DATA:
1383
0
            ssl_defaults.enable0RttData = val;
1384
0
            break;
1385
1386
0
        case SSL_RECORD_SIZE_LIMIT:
1387
0
            if (val < 64 || val > (MAX_FRAGMENT_LENGTH + 1)) {
1388
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
1389
0
                return SECFailure;
1390
0
            }
1391
0
            ssl_defaults.recordSizeLimit = val;
1392
0
            break;
1393
1394
0
        case SSL_ENABLE_TLS13_COMPAT_MODE:
1395
0
            ssl_defaults.enableTls13CompatMode = val;
1396
0
            break;
1397
1398
0
        case SSL_ENABLE_DTLS_SHORT_HEADER:
1399
0
            ssl_defaults.enableDtlsShortHeader = val;
1400
0
            break;
1401
1402
0
        case SSL_ENABLE_HELLO_DOWNGRADE_CHECK:
1403
0
            ssl_defaults.enableHelloDowngradeCheck = val;
1404
0
            break;
1405
1406
0
        case SSL_ENABLE_V2_COMPATIBLE_HELLO:
1407
0
            ssl_defaults.enableV2CompatibleHello = val;
1408
0
            break;
1409
1410
0
        case SSL_ENABLE_POST_HANDSHAKE_AUTH:
1411
0
            ssl_defaults.enablePostHandshakeAuth = val;
1412
0
            break;
1413
1414
0
        case SSL_SUPPRESS_END_OF_EARLY_DATA:
1415
0
            ssl_defaults.suppressEndOfEarlyData = val;
1416
0
            break;
1417
1418
0
        default:
1419
0
            PORT_SetError(SEC_ERROR_INVALID_ARGS);
1420
0
            return SECFailure;
1421
0
    }
1422
0
    return SECSuccess;
1423
0
}
1424
1425
SECStatus
1426
SSLExp_SetMaxEarlyDataSize(PRFileDesc *fd, PRUint32 size)
1427
0
{
1428
0
    sslSocket *ss = ssl_FindSocket(fd);
1429
0
    if (!ss) {
1430
0
        return SECFailure; /* Error code already set. */
1431
0
    }
1432
1433
0
    ss->opt.maxEarlyDataSize = size;
1434
0
    return SECSuccess;
1435
0
}
1436
1437
/* function tells us if the cipher suite is one that we no longer support. */
1438
static PRBool
1439
ssl_IsRemovedCipherSuite(PRInt32 suite)
1440
2.58M
{
1441
2.58M
    switch (suite) {
1442
0
        case SSL_FORTEZZA_DMS_WITH_NULL_SHA:
1443
0
        case SSL_FORTEZZA_DMS_WITH_FORTEZZA_CBC_SHA:
1444
0
        case SSL_FORTEZZA_DMS_WITH_RC4_128_SHA:
1445
0
            return PR_TRUE;
1446
2.58M
        default:
1447
2.58M
            return PR_FALSE;
1448
2.58M
    }
1449
2.58M
}
1450
1451
/* Part of the public NSS API.
1452
 * Since this is a global (not per-socket) setting, we cannot use the
1453
 * HandshakeLock to protect this.  Probably want a global lock.
1454
 */
1455
SECStatus
1456
SSL_SetPolicy(long which, int policy)
1457
0
{
1458
0
    if (ssl_IsRemovedCipherSuite(which))
1459
0
        return SECSuccess;
1460
0
    return SSL_CipherPolicySet(which, policy);
1461
0
}
1462
1463
SECStatus
1464
ssl_CipherPolicySet(PRInt32 which, PRInt32 policy)
1465
0
{
1466
0
    SECStatus rv = SECSuccess;
1467
1468
0
    if (ssl_IsRemovedCipherSuite(which)) {
1469
0
        rv = SECSuccess;
1470
0
    } else {
1471
0
        rv = ssl3_SetPolicy((ssl3CipherSuite)which, policy);
1472
0
    }
1473
0
    return rv;
1474
0
}
1475
SECStatus
1476
SSL_CipherPolicySet(PRInt32 which, PRInt32 policy)
1477
0
{
1478
0
    SECStatus rv = ssl_Init();
1479
1480
0
    if (rv != SECSuccess) {
1481
0
        return rv;
1482
0
    }
1483
0
    if (NSS_IsPolicyLocked()) {
1484
0
        PORT_SetError(SEC_ERROR_POLICY_LOCKED);
1485
0
        return SECFailure;
1486
0
    }
1487
0
    return ssl_CipherPolicySet(which, policy);
1488
0
}
1489
1490
SECStatus
1491
SSL_CipherPolicyGet(PRInt32 which, PRInt32 *oPolicy)
1492
0
{
1493
0
    SECStatus rv;
1494
1495
0
    if (!oPolicy) {
1496
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
1497
0
        return SECFailure;
1498
0
    }
1499
0
    if (ssl_IsRemovedCipherSuite(which)) {
1500
0
        *oPolicy = SSL_NOT_ALLOWED;
1501
0
        rv = SECSuccess;
1502
0
    } else {
1503
0
        rv = ssl3_GetPolicy((ssl3CipherSuite)which, oPolicy);
1504
0
    }
1505
0
    return rv;
1506
0
}
1507
1508
/* Part of the public NSS API.
1509
 * Since this is a global (not per-socket) setting, we cannot use the
1510
 * HandshakeLock to protect this.  Probably want a global lock.
1511
 * These changes have no effect on any sslSockets already created.
1512
 */
1513
SECStatus
1514
SSL_EnableCipher(long which, PRBool enabled)
1515
0
{
1516
0
    if (ssl_IsRemovedCipherSuite(which))
1517
0
        return SECSuccess;
1518
0
    return SSL_CipherPrefSetDefault(which, enabled);
1519
0
}
1520
1521
SECStatus
1522
ssl_CipherPrefSetDefault(PRInt32 which, PRBool enabled)
1523
0
{
1524
0
    if (ssl_IsRemovedCipherSuite(which))
1525
0
        return SECSuccess;
1526
0
    return ssl3_CipherPrefSetDefault((ssl3CipherSuite)which, enabled);
1527
0
}
1528
1529
SECStatus
1530
SSL_CipherPrefSetDefault(PRInt32 which, PRBool enabled)
1531
0
{
1532
0
    SECStatus rv = ssl_Init();
1533
0
    PRInt32 locks;
1534
1535
0
    if (rv != SECSuccess) {
1536
0
        return rv;
1537
0
    }
1538
0
    rv = NSS_OptionGet(NSS_DEFAULT_LOCKS, &locks);
1539
0
    if ((rv == SECSuccess) && (locks & NSS_DEFAULT_SSL_LOCK)) {
1540
0
        return SECSuccess;
1541
0
    }
1542
0
    return ssl_CipherPrefSetDefault(which, enabled);
1543
0
}
1544
1545
SECStatus
1546
SSL_CipherPrefGetDefault(PRInt32 which, PRBool *enabled)
1547
0
{
1548
0
    SECStatus rv;
1549
1550
0
    if (!enabled) {
1551
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
1552
0
        return SECFailure;
1553
0
    }
1554
0
    if (ssl_IsRemovedCipherSuite(which)) {
1555
0
        *enabled = PR_FALSE;
1556
0
        rv = SECSuccess;
1557
0
    } else {
1558
0
        rv = ssl3_CipherPrefGetDefault((ssl3CipherSuite)which, enabled);
1559
0
    }
1560
0
    return rv;
1561
0
}
1562
1563
SECStatus
1564
SSL_CipherPrefSet(PRFileDesc *fd, PRInt32 which, PRBool enabled)
1565
2.58M
{
1566
2.58M
    sslSocket *ss = ssl_FindSocket(fd);
1567
2.58M
    PRInt32 locks;
1568
2.58M
    SECStatus rv;
1569
1570
2.58M
    if (!ss) {
1571
0
        SSL_DBG(("%d: SSL[%d]: bad socket in CipherPrefSet", SSL_GETPID(), fd));
1572
0
        return SECFailure;
1573
0
    }
1574
2.58M
    rv = NSS_OptionGet(NSS_DEFAULT_LOCKS, &locks);
1575
2.58M
    if ((rv == SECSuccess) && (locks & NSS_DEFAULT_SSL_LOCK)) {
1576
0
        return SECSuccess;
1577
0
    }
1578
2.58M
    if (ssl_IsRemovedCipherSuite(which))
1579
0
        return SECSuccess;
1580
2.58M
    return ssl3_CipherPrefSet(ss, (ssl3CipherSuite)which, enabled);
1581
2.58M
}
1582
1583
SECStatus
1584
SSL_CipherPrefGet(PRFileDesc *fd, PRInt32 which, PRBool *enabled)
1585
0
{
1586
0
    SECStatus rv;
1587
0
    sslSocket *ss = ssl_FindSocket(fd);
1588
1589
0
    if (!enabled) {
1590
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
1591
0
        return SECFailure;
1592
0
    }
1593
0
    if (!ss) {
1594
0
        SSL_DBG(("%d: SSL[%d]: bad socket in CipherPrefGet", SSL_GETPID(), fd));
1595
0
        *enabled = PR_FALSE;
1596
0
        return SECFailure;
1597
0
    }
1598
0
    if (ssl_IsRemovedCipherSuite(which)) {
1599
0
        *enabled = PR_FALSE;
1600
0
        rv = SECSuccess;
1601
0
    } else {
1602
0
        rv = ssl3_CipherPrefGet(ss, (ssl3CipherSuite)which, enabled);
1603
0
    }
1604
0
    return rv;
1605
0
}
1606
1607
/* The client can call this function to be aware of the current
1608
 * CipherSuites order. */
1609
SECStatus
1610
SSLExp_CipherSuiteOrderGet(PRFileDesc *fd, PRUint16 *cipherOrder,
1611
                           unsigned int *numCiphers)
1612
0
{
1613
0
    if (!fd) {
1614
0
        SSL_DBG(("%d: SSL: file descriptor in CipherSuiteOrderGet is null",
1615
0
                 SSL_GETPID()));
1616
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
1617
0
        return SECFailure;
1618
0
    }
1619
0
    if (!cipherOrder || !numCiphers) {
1620
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
1621
0
        return SECFailure;
1622
0
    }
1623
0
    sslSocket *ss = ssl_FindSocket(fd);
1624
0
    if (!ss) {
1625
0
        SSL_DBG(("%d: SSL[%d]: bad socket in CipherSuiteOrderGet", SSL_GETPID(),
1626
0
                 fd));
1627
0
        return SECFailure; /* Error code already set. */
1628
0
    }
1629
1630
0
    unsigned int enabled = 0;
1631
0
    ssl_Get1stHandshakeLock(ss);
1632
0
    ssl_GetSSL3HandshakeLock(ss);
1633
0
    for (unsigned int i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) {
1634
0
        const ssl3CipherSuiteCfg *suiteCfg = &ss->cipherSuites[i];
1635
0
        if (suiteCfg && suiteCfg->enabled &&
1636
0
            suiteCfg->policy != SSL_NOT_ALLOWED) {
1637
0
            cipherOrder[enabled++] = suiteCfg->cipher_suite;
1638
0
        }
1639
0
    }
1640
0
    ssl_ReleaseSSL3HandshakeLock(ss);
1641
0
    ssl_Release1stHandshakeLock(ss);
1642
0
    *numCiphers = enabled;
1643
0
    return SECSuccess;
1644
0
}
1645
1646
/* This function permits reorder the CipherSuites List for the Handshake
1647
 * (Client Hello). */
1648
SECStatus
1649
SSLExp_CipherSuiteOrderSet(PRFileDesc *fd, const PRUint16 *cipherOrder,
1650
                           unsigned int numCiphers)
1651
0
{
1652
0
    if (!fd) {
1653
0
        SSL_DBG(("%d: SSL: file descriptor in CipherSuiteOrderGet is null",
1654
0
                 SSL_GETPID()));
1655
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
1656
0
        return SECFailure;
1657
0
    }
1658
0
    if (!cipherOrder || !numCiphers || numCiphers > ssl_V3_SUITES_IMPLEMENTED) {
1659
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
1660
0
        return SECFailure;
1661
0
    }
1662
0
    sslSocket *ss = ssl_FindSocket(fd);
1663
0
    if (!ss) {
1664
0
        SSL_DBG(("%d: SSL[%d]: bad socket in CipherSuiteOrderSet", SSL_GETPID(),
1665
0
                 fd));
1666
0
        return SECFailure; /* Error code already set. */
1667
0
    }
1668
0
    ssl3CipherSuiteCfg tmpSuiteCfg[ssl_V3_SUITES_IMPLEMENTED];
1669
0
    ssl_Get1stHandshakeLock(ss);
1670
0
    ssl_GetSSL3HandshakeLock(ss);
1671
    /* For each cipherSuite given as input, verify that it is
1672
     * known to NSS and only present in the list once. */
1673
0
    for (unsigned int i = 0; i < numCiphers; i++) {
1674
0
        const ssl3CipherSuiteCfg *suiteCfg =
1675
0
            ssl_LookupCipherSuiteCfg(cipherOrder[i], ss->cipherSuites);
1676
0
        if (!suiteCfg) {
1677
0
            PORT_SetError(SEC_ERROR_INVALID_ARGS);
1678
0
            ssl_ReleaseSSL3HandshakeLock(ss);
1679
0
            ssl_Release1stHandshakeLock(ss);
1680
0
            return SECFailure;
1681
0
        }
1682
0
        for (unsigned int j = i + 1; j < numCiphers; j++) {
1683
            /* This is a duplicate entry. */
1684
0
            if (cipherOrder[i] == cipherOrder[j]) {
1685
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
1686
0
                ssl_ReleaseSSL3HandshakeLock(ss);
1687
0
                ssl_Release1stHandshakeLock(ss);
1688
0
                return SECFailure;
1689
0
            }
1690
0
        }
1691
0
        tmpSuiteCfg[i] = *suiteCfg;
1692
0
        tmpSuiteCfg[i].enabled = PR_TRUE;
1693
0
    }
1694
    /* Find all defined ciphersuites not present in the input list and append
1695
     * them after the preferred. This guarantees that the socket will always
1696
     * have a complete list of size ssl_V3_SUITES_IMPLEMENTED */
1697
0
    unsigned int cfgIdx = numCiphers;
1698
0
    for (unsigned int i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) {
1699
0
        PRBool received = PR_FALSE;
1700
0
        for (unsigned int j = 0; j < numCiphers; j++) {
1701
0
            if (ss->cipherSuites[i].cipher_suite ==
1702
0
                tmpSuiteCfg[j].cipher_suite) {
1703
0
                received = PR_TRUE;
1704
0
                break;
1705
0
            }
1706
0
        }
1707
0
        if (!received) {
1708
0
            tmpSuiteCfg[cfgIdx] = ss->cipherSuites[i];
1709
0
            tmpSuiteCfg[cfgIdx++].enabled = PR_FALSE;
1710
0
        }
1711
0
    }
1712
0
    PORT_Assert(cfgIdx == ssl_V3_SUITES_IMPLEMENTED);
1713
    /* now we can rewrite the socket with the desired order */
1714
0
    PORT_Memcpy(ss->cipherSuites, tmpSuiteCfg, sizeof(tmpSuiteCfg));
1715
0
    ssl_ReleaseSSL3HandshakeLock(ss);
1716
0
    ssl_Release1stHandshakeLock(ss);
1717
0
    return SECSuccess;
1718
0
}
1719
1720
SECStatus
1721
NSS_SetDomesticPolicy(void)
1722
0
{
1723
0
    SECStatus status = SECSuccess;
1724
0
    const PRUint16 *cipher;
1725
0
    SECStatus rv;
1726
0
    PRUint32 policy;
1727
1728
    /* If we've already defined some policy oids, skip changing them */
1729
0
    rv = NSS_GetAlgorithmPolicy(SEC_OID_APPLY_SSL_POLICY, &policy);
1730
0
    if ((rv == SECSuccess) && (policy & NSS_USE_POLICY_IN_SSL)) {
1731
0
        return ssl_Init(); /* make sure the policies have been loaded */
1732
0
    }
1733
1734
0
    for (cipher = SSL_ImplementedCiphers; *cipher != 0; ++cipher) {
1735
0
        status = SSL_SetPolicy(*cipher, SSL_ALLOWED);
1736
0
        if (status != SECSuccess)
1737
0
            break;
1738
0
    }
1739
0
    return status;
1740
0
}
1741
1742
SECStatus
1743
NSS_SetExportPolicy(void)
1744
0
{
1745
0
    return NSS_SetDomesticPolicy();
1746
0
}
1747
1748
SECStatus
1749
NSS_SetFrancePolicy(void)
1750
0
{
1751
0
    return NSS_SetDomesticPolicy();
1752
0
}
1753
1754
SECStatus
1755
SSL_NamedGroupConfig(PRFileDesc *fd, const SSLNamedGroup *groups,
1756
                     unsigned int numGroups)
1757
0
{
1758
0
    unsigned int i;
1759
0
    unsigned int j = 0;
1760
0
    sslSocket *ss = ssl_FindSocket(fd);
1761
1762
0
    if (!ss) {
1763
0
        PORT_SetError(SEC_ERROR_NOT_INITIALIZED);
1764
0
        return SECFailure;
1765
0
    }
1766
1767
0
    if (!groups) {
1768
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
1769
0
        return SECFailure;
1770
0
    }
1771
0
    if (numGroups > SSL_NAMED_GROUP_COUNT) {
1772
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
1773
0
        return SECFailure;
1774
0
    }
1775
1776
0
    memset((void *)ss->namedGroupPreferences, 0,
1777
0
           sizeof(ss->namedGroupPreferences));
1778
0
    for (i = 0; i < numGroups; ++i) {
1779
0
        const sslNamedGroupDef *groupDef = ssl_LookupNamedGroup(groups[i]);
1780
0
        if (!ssl_NamedGroupEnabled(ss, groupDef)) {
1781
0
            ss->namedGroupPreferences[j++] = groupDef;
1782
0
        }
1783
0
    }
1784
1785
0
    return SECSuccess;
1786
0
}
1787
1788
SECStatus
1789
SSL_DHEGroupPrefSet(PRFileDesc *fd, const SSLDHEGroupType *groups,
1790
                    PRUint16 num_groups)
1791
0
{
1792
0
    sslSocket *ss;
1793
0
    const SSLDHEGroupType *list;
1794
0
    unsigned int count;
1795
0
    int i, k, j;
1796
0
    const sslNamedGroupDef *enabled[SSL_NAMED_GROUP_COUNT] = { 0 };
1797
0
    static const SSLDHEGroupType default_dhe_groups[] = {
1798
0
        ssl_ff_dhe_2048_group
1799
0
    };
1800
1801
0
    if ((num_groups && !groups) || (!num_groups && groups) ||
1802
0
        num_groups > SSL_NAMED_GROUP_COUNT) {
1803
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
1804
0
        return SECFailure;
1805
0
    }
1806
1807
0
    ss = ssl_FindSocket(fd);
1808
0
    if (!ss) {
1809
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_DHEGroupPrefSet", SSL_GETPID(), fd));
1810
0
        return SECFailure;
1811
0
    }
1812
1813
0
    if (groups) {
1814
0
        list = groups;
1815
0
        count = num_groups;
1816
0
    } else {
1817
0
        list = default_dhe_groups;
1818
0
        count = PR_ARRAY_SIZE(default_dhe_groups);
1819
0
    }
1820
1821
    /* save enabled ec groups and clear ss->namedGroupPreferences */
1822
0
    k = 0;
1823
0
    for (i = 0; i < SSL_NAMED_GROUP_COUNT; ++i) {
1824
0
        if (ss->namedGroupPreferences[i] &&
1825
0
            ss->namedGroupPreferences[i]->keaType != ssl_kea_dh) {
1826
0
            enabled[k++] = ss->namedGroupPreferences[i];
1827
0
        }
1828
0
        ss->namedGroupPreferences[i] = NULL;
1829
0
    }
1830
1831
0
    ss->ssl3.dhePreferredGroup = NULL;
1832
0
    for (i = 0; i < count; ++i) {
1833
0
        PRBool duplicate = PR_FALSE;
1834
0
        SSLNamedGroup name;
1835
0
        const sslNamedGroupDef *groupDef;
1836
0
        switch (list[i]) {
1837
0
            case ssl_ff_dhe_2048_group:
1838
0
                name = ssl_grp_ffdhe_2048;
1839
0
                break;
1840
0
            case ssl_ff_dhe_3072_group:
1841
0
                name = ssl_grp_ffdhe_3072;
1842
0
                break;
1843
0
            case ssl_ff_dhe_4096_group:
1844
0
                name = ssl_grp_ffdhe_4096;
1845
0
                break;
1846
0
            case ssl_ff_dhe_6144_group:
1847
0
                name = ssl_grp_ffdhe_6144;
1848
0
                break;
1849
0
            case ssl_ff_dhe_8192_group:
1850
0
                name = ssl_grp_ffdhe_8192;
1851
0
                break;
1852
0
            default:
1853
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
1854
0
                return SECFailure;
1855
0
        }
1856
0
        groupDef = ssl_LookupNamedGroup(name);
1857
0
        PORT_Assert(groupDef);
1858
0
        if (!ss->ssl3.dhePreferredGroup) {
1859
0
            ss->ssl3.dhePreferredGroup = groupDef;
1860
0
        }
1861
0
        PORT_Assert(k < SSL_NAMED_GROUP_COUNT);
1862
0
        for (j = 0; j < k; ++j) {
1863
            /* skip duplicates */
1864
0
            if (enabled[j] == groupDef) {
1865
0
                duplicate = PR_TRUE;
1866
0
                break;
1867
0
            }
1868
0
        }
1869
0
        if (!duplicate) {
1870
0
            enabled[k++] = groupDef;
1871
0
        }
1872
0
    }
1873
0
    for (i = 0; i < k; ++i) {
1874
0
        ss->namedGroupPreferences[i] = enabled[i];
1875
0
    }
1876
1877
0
    return SECSuccess;
1878
0
}
1879
1880
PRCallOnceType gWeakDHParamsRegisterOnce;
1881
int gWeakDHParamsRegisterError;
1882
1883
PRCallOnceType gWeakDHParamsOnce;
1884
int gWeakDHParamsError;
1885
/* As our code allocates type PQGParams, we'll keep it around,
1886
 * even though we only make use of it's parameters through gWeakDHParam. */
1887
static PQGParams *gWeakParamsPQG;
1888
static ssl3DHParams *gWeakDHParams;
1889
4.35k
#define WEAK_DHE_SIZE 1024
1890
1891
static PRStatus
1892
ssl3_CreateWeakDHParams(void)
1893
0
{
1894
0
    PQGVerify *vfy;
1895
0
    SECStatus rv, passed;
1896
1897
0
    PORT_Assert(!gWeakDHParams && !gWeakParamsPQG);
1898
1899
0
    rv = PK11_PQG_ParamGenV2(WEAK_DHE_SIZE, 160, 64 /*maximum seed that will work*/,
1900
0
                             &gWeakParamsPQG, &vfy);
1901
0
    if (rv != SECSuccess) {
1902
0
        gWeakDHParamsError = PORT_GetError();
1903
0
        return PR_FAILURE;
1904
0
    }
1905
1906
0
    rv = PK11_PQG_VerifyParams(gWeakParamsPQG, vfy, &passed);
1907
0
    if (rv != SECSuccess || passed != SECSuccess) {
1908
0
        SSL_DBG(("%d: PK11_PQG_VerifyParams failed in ssl3_CreateWeakDHParams",
1909
0
                 SSL_GETPID()));
1910
0
        gWeakDHParamsError = PORT_GetError();
1911
0
        return PR_FAILURE;
1912
0
    }
1913
1914
0
    gWeakDHParams = PORT_ArenaNew(gWeakParamsPQG->arena, ssl3DHParams);
1915
0
    if (!gWeakDHParams) {
1916
0
        gWeakDHParamsError = PORT_GetError();
1917
0
        return PR_FAILURE;
1918
0
    }
1919
1920
0
    gWeakDHParams->name = ssl_grp_ffdhe_custom;
1921
0
    gWeakDHParams->prime.data = gWeakParamsPQG->prime.data;
1922
0
    gWeakDHParams->prime.len = gWeakParamsPQG->prime.len;
1923
0
    gWeakDHParams->base.data = gWeakParamsPQG->base.data;
1924
0
    gWeakDHParams->base.len = gWeakParamsPQG->base.len;
1925
1926
0
    PK11_PQG_DestroyVerify(vfy);
1927
0
    return PR_SUCCESS;
1928
0
}
1929
1930
static SECStatus
1931
ssl3_WeakDHParamsShutdown(void *appData, void *nssData)
1932
0
{
1933
0
    if (gWeakParamsPQG) {
1934
0
        PK11_PQG_DestroyParams(gWeakParamsPQG);
1935
0
        gWeakParamsPQG = NULL;
1936
0
        gWeakDHParams = NULL;
1937
0
    }
1938
0
    return SECSuccess;
1939
0
}
1940
1941
static PRStatus
1942
ssl3_WeakDHParamsRegisterShutdown(void)
1943
0
{
1944
0
    SECStatus rv;
1945
0
    rv = NSS_RegisterShutdown(ssl3_WeakDHParamsShutdown, NULL);
1946
0
    if (rv != SECSuccess) {
1947
0
        gWeakDHParamsRegisterError = PORT_GetError();
1948
0
    }
1949
0
    return (PRStatus)rv;
1950
0
}
1951
1952
/* global init strategy inspired by ssl3_CreateECDHEphemeralKeys */
1953
SECStatus
1954
SSL_EnableWeakDHEPrimeGroup(PRFileDesc *fd, PRBool enabled)
1955
0
{
1956
0
    sslSocket *ss;
1957
0
    PRStatus status;
1958
1959
0
    if (enabled) {
1960
0
        status = PR_CallOnce(&gWeakDHParamsRegisterOnce,
1961
0
                             ssl3_WeakDHParamsRegisterShutdown);
1962
0
        if (status != PR_SUCCESS) {
1963
0
            PORT_SetError(gWeakDHParamsRegisterError);
1964
0
            return SECFailure;
1965
0
        }
1966
1967
0
        status = PR_CallOnce(&gWeakDHParamsOnce, ssl3_CreateWeakDHParams);
1968
0
        if (status != PR_SUCCESS) {
1969
0
            PORT_SetError(gWeakDHParamsError);
1970
0
            return SECFailure;
1971
0
        }
1972
0
    }
1973
1974
0
    if (!fd)
1975
0
        return SECSuccess;
1976
1977
0
    ss = ssl_FindSocket(fd);
1978
0
    if (!ss) {
1979
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_DHEGroupPrefSet", SSL_GETPID(), fd));
1980
0
        return SECFailure;
1981
0
    }
1982
1983
0
    ss->ssl3.dheWeakGroupEnabled = enabled;
1984
0
    return SECSuccess;
1985
0
}
1986
1987
#include "dhe-param.c"
1988
1989
const ssl3DHParams *
1990
ssl_GetDHEParams(const sslNamedGroupDef *groupDef)
1991
19.5k
{
1992
19.5k
    switch (groupDef->name) {
1993
6.90k
        case ssl_grp_ffdhe_2048:
1994
6.90k
            return &ff_dhe_2048_params;
1995
3.70k
        case ssl_grp_ffdhe_3072:
1996
3.70k
            return &ff_dhe_3072_params;
1997
2.93k
        case ssl_grp_ffdhe_4096:
1998
2.93k
            return &ff_dhe_4096_params;
1999
2.92k
        case ssl_grp_ffdhe_6144:
2000
2.92k
            return &ff_dhe_6144_params;
2001
3.06k
        case ssl_grp_ffdhe_8192:
2002
3.06k
            return &ff_dhe_8192_params;
2003
0
        case ssl_grp_ffdhe_custom:
2004
0
            PORT_Assert(gWeakDHParams);
2005
0
            return gWeakDHParams;
2006
0
        default:
2007
0
            PORT_Assert(0);
2008
19.5k
    }
2009
0
    return NULL;
2010
19.5k
}
2011
2012
/* This validates dh_Ys against the group prime. */
2013
PRBool
2014
ssl_IsValidDHEShare(const SECItem *dh_p, const SECItem *dh_Ys)
2015
1.14k
{
2016
1.14k
    unsigned int size_p = SECKEY_BigIntegerBitLength(dh_p);
2017
1.14k
    unsigned int size_y = SECKEY_BigIntegerBitLength(dh_Ys);
2018
1.14k
    unsigned int commonPart;
2019
1.14k
    int cmp;
2020
2021
1.14k
    if (dh_p->len == 0 || dh_Ys->len == 0) {
2022
8
        return PR_FALSE;
2023
8
    }
2024
    /* Check that the prime is at least odd. */
2025
1.13k
    if ((dh_p->data[dh_p->len - 1] & 0x01) == 0) {
2026
0
        return PR_FALSE;
2027
0
    }
2028
    /* dh_Ys can't be 1, or bigger than dh_p. */
2029
1.13k
    if (size_y <= 1 || size_y > size_p) {
2030
6
        return PR_FALSE;
2031
6
    }
2032
    /* If dh_Ys is shorter, then it's definitely smaller than p-1. */
2033
1.13k
    if (size_y < size_p) {
2034
1.08k
        return PR_TRUE;
2035
1.08k
    }
2036
2037
    /* Compare the common part of each, minus the final octet. */
2038
52
    commonPart = (size_p + 7) / 8;
2039
52
    PORT_Assert(commonPart <= dh_Ys->len);
2040
52
    PORT_Assert(commonPart <= dh_p->len);
2041
52
    cmp = PORT_Memcmp(dh_Ys->data + dh_Ys->len - commonPart,
2042
52
                      dh_p->data + dh_p->len - commonPart, commonPart - 1);
2043
52
    if (cmp < 0) {
2044
35
        return PR_TRUE;
2045
35
    }
2046
17
    if (cmp > 0) {
2047
1
        return PR_FALSE;
2048
1
    }
2049
2050
    /* The last octet of the prime is the only thing that is different and that
2051
     * has to be two greater than the share, otherwise we have Ys == p - 1,
2052
     * and that means small subgroups. */
2053
16
    if (dh_Ys->data[dh_Ys->len - 1] >= (dh_p->data[dh_p->len - 1] - 1)) {
2054
3
        return PR_FALSE;
2055
3
    }
2056
2057
13
    return PR_TRUE;
2058
16
}
2059
2060
/* Checks that the provided DH parameters match those in one of the named groups
2061
 * that we have enabled.  The groups are defined in dhe-param.c and are those
2062
 * defined in Appendix A of draft-ietf-tls-negotiated-ff-dhe.
2063
 *
2064
 * |groupDef| and |dhParams| are optional outparams that identify the group and
2065
 * its parameters respectively (if this is successful). */
2066
SECStatus
2067
ssl_ValidateDHENamedGroup(sslSocket *ss,
2068
                          const SECItem *dh_p,
2069
                          const SECItem *dh_g,
2070
                          const sslNamedGroupDef **groupDef,
2071
                          const ssl3DHParams **dhParams)
2072
2.82k
{
2073
2.82k
    unsigned int i;
2074
2075
92.3k
    for (i = 0; i < SSL_NAMED_GROUP_COUNT; ++i) {
2076
89.5k
        const ssl3DHParams *params;
2077
89.5k
        if (!ss->namedGroupPreferences[i]) {
2078
64.2k
            continue;
2079
64.2k
        }
2080
25.3k
        if (ss->namedGroupPreferences[i]->keaType != ssl_kea_dh) {
2081
11.3k
            continue;
2082
11.3k
        }
2083
2084
14.0k
        params = ssl_GetDHEParams(ss->namedGroupPreferences[i]);
2085
14.0k
        PORT_Assert(params);
2086
14.0k
        if (SECITEM_ItemsAreEqual(&params->prime, dh_p)) {
2087
35
            if (!SECITEM_ItemsAreEqual(&params->base, dh_g)) {
2088
1
                return SECFailure;
2089
1
            }
2090
34
            if (groupDef)
2091
5
                *groupDef = ss->namedGroupPreferences[i];
2092
34
            if (dhParams)
2093
5
                *dhParams = params;
2094
34
            return SECSuccess;
2095
35
        }
2096
14.0k
    }
2097
2098
2.79k
    return SECFailure;
2099
2.82k
}
2100
2101
/* Ensure DH parameters have been selected.  This just picks the first enabled
2102
 * FFDHE group in ssl_named_groups, or the weak one if it was enabled. */
2103
SECStatus
2104
ssl_SelectDHEGroup(sslSocket *ss, const sslNamedGroupDef **groupDef)
2105
4.35k
{
2106
4.35k
    unsigned int i;
2107
4.35k
    static const sslNamedGroupDef weak_group_def = {
2108
4.35k
        ssl_grp_ffdhe_custom, WEAK_DHE_SIZE, ssl_kea_dh,
2109
4.35k
        SEC_OID_TLS_DHE_CUSTOM, PR_TRUE
2110
4.35k
    };
2111
4.35k
    PRInt32 minDH;
2112
4.35k
    SECStatus rv;
2113
2114
    // make sure we select a group consistent with our
2115
    // current policy policy
2116
4.35k
    rv = NSS_OptionGet(NSS_DH_MIN_KEY_SIZE, &minDH);
2117
4.35k
    if (rv != SECSuccess || minDH <= 0) {
2118
0
        minDH = DH_MIN_P_BITS;
2119
0
    }
2120
2121
    /* Only select weak groups in TLS 1.2 and earlier, but not if the client has
2122
     * indicated that it supports an FFDHE named group. */
2123
4.35k
    if (ss->ssl3.dheWeakGroupEnabled &&
2124
4.35k
        ss->version < SSL_LIBRARY_VERSION_TLS_1_3 &&
2125
4.35k
        !ss->xtnData.peerSupportsFfdheGroups &&
2126
4.35k
        weak_group_def.bits >= minDH) {
2127
0
        *groupDef = &weak_group_def;
2128
0
        return SECSuccess;
2129
0
    }
2130
4.35k
    if (ss->ssl3.dhePreferredGroup &&
2131
4.35k
        ssl_NamedGroupEnabled(ss, ss->ssl3.dhePreferredGroup) &&
2132
4.35k
        ss->ssl3.dhePreferredGroup->bits >= minDH) {
2133
0
        *groupDef = ss->ssl3.dhePreferredGroup;
2134
0
        return SECSuccess;
2135
0
    }
2136
27.4k
    for (i = 0; i < SSL_NAMED_GROUP_COUNT; ++i) {
2137
27.4k
        if (ss->namedGroupPreferences[i] &&
2138
27.4k
            ss->namedGroupPreferences[i]->keaType == ssl_kea_dh &&
2139
27.4k
            ss->namedGroupPreferences[i]->bits >= minDH) {
2140
4.35k
            *groupDef = ss->namedGroupPreferences[i];
2141
4.35k
            return SECSuccess;
2142
4.35k
        }
2143
27.4k
    }
2144
2145
0
    *groupDef = NULL;
2146
0
    PORT_SetError(SSL_ERROR_NO_CYPHER_OVERLAP);
2147
0
    return SECFailure;
2148
4.35k
}
2149
2150
/* LOCKS ??? XXX */
2151
static PRFileDesc *
2152
ssl_ImportFD(PRFileDesc *model, PRFileDesc *fd, SSLProtocolVariant variant)
2153
69.0k
{
2154
69.0k
    sslSocket *ns = NULL;
2155
69.0k
    PRStatus rv;
2156
69.0k
    PRNetAddr addr;
2157
69.0k
    SECStatus status = ssl_Init();
2158
2159
69.0k
    if (status != SECSuccess) {
2160
0
        return NULL;
2161
0
    }
2162
2163
69.0k
    if (model == NULL) {
2164
        /* Just create a default socket if we're given NULL for the model */
2165
36.4k
        ns = ssl_NewSocket((PRBool)(!ssl_defaults.noLocks), variant);
2166
36.4k
    } else {
2167
32.6k
        sslSocket *ss = ssl_FindSocket(model);
2168
32.6k
        if (ss == NULL || ss->protocolVariant != variant) {
2169
0
            SSL_DBG(("%d: SSL[%d]: bad model socket in ssl_ImportFD",
2170
0
                     SSL_GETPID(), model));
2171
0
            return NULL;
2172
0
        }
2173
32.6k
        ns = ssl_DupSocket(ss);
2174
32.6k
    }
2175
69.0k
    if (ns == NULL)
2176
0
        return NULL;
2177
2178
69.0k
    rv = ssl_PushIOLayer(ns, fd, PR_TOP_IO_LAYER);
2179
69.0k
    if (rv != PR_SUCCESS) {
2180
0
        ssl_FreeSocket(ns);
2181
0
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
2182
0
        return NULL;
2183
0
    }
2184
69.0k
#if defined(DEBUG) || defined(FORCE_PR_ASSERT)
2185
69.0k
    {
2186
69.0k
        sslSocket *ss = ssl_FindSocket(fd);
2187
69.0k
        PORT_Assert(ss == ns);
2188
69.0k
    }
2189
69.0k
#endif
2190
69.0k
    ns->TCPconnected = (PR_SUCCESS == ssl_DefGetpeername(ns, &addr));
2191
69.0k
    return fd;
2192
69.0k
}
2193
2194
PRFileDesc *
2195
SSL_ImportFD(PRFileDesc *model, PRFileDesc *fd)
2196
36.0k
{
2197
36.0k
    return ssl_ImportFD(model, fd, ssl_variant_stream);
2198
36.0k
}
2199
2200
PRFileDesc *
2201
DTLS_ImportFD(PRFileDesc *model, PRFileDesc *fd)
2202
33.0k
{
2203
33.0k
    return ssl_ImportFD(model, fd, ssl_variant_datagram);
2204
33.0k
}
2205
2206
/* SSL_SetNextProtoCallback is used to select an application protocol
2207
 * for ALPN. */
2208
SECStatus
2209
SSL_SetNextProtoCallback(PRFileDesc *fd, SSLNextProtoCallback callback,
2210
                         void *arg)
2211
0
{
2212
0
    sslSocket *ss = ssl_FindSocket(fd);
2213
2214
0
    if (!ss) {
2215
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetNextProtoCallback", SSL_GETPID(),
2216
0
                 fd));
2217
0
        return SECFailure;
2218
0
    }
2219
2220
0
    ssl_GetSSL3HandshakeLock(ss);
2221
0
    ss->nextProtoCallback = callback;
2222
0
    ss->nextProtoArg = arg;
2223
0
    ssl_ReleaseSSL3HandshakeLock(ss);
2224
2225
0
    return SECSuccess;
2226
0
}
2227
2228
/* ssl_NextProtoNegoCallback is set as an ALPN callback when
2229
 * SSL_SetNextProtoNego is used.
2230
 */
2231
static SECStatus
2232
ssl_NextProtoNegoCallback(void *arg, PRFileDesc *fd,
2233
                          const unsigned char *protos, unsigned int protos_len,
2234
                          unsigned char *protoOut, unsigned int *protoOutLen,
2235
                          unsigned int protoMaxLen)
2236
0
{
2237
0
    unsigned int i, j;
2238
0
    sslSocket *ss = ssl_FindSocket(fd);
2239
0
    if (!ss) {
2240
0
        SSL_DBG(("%d: SSL[%d]: bad socket in ssl_NextProtoNegoCallback",
2241
0
                 SSL_GETPID(), fd));
2242
0
        return SECFailure;
2243
0
    }
2244
0
    if (ss->opt.nextProtoNego.len == 0) {
2245
0
        SSL_DBG(("%d: SSL[%d]: ssl_NextProtoNegoCallback ALPN disabled",
2246
0
                 SSL_GETPID(), fd));
2247
0
        SSL3_SendAlert(ss, alert_fatal, unsupported_extension);
2248
0
        return SECFailure;
2249
0
    }
2250
2251
0
    PORT_Assert(protoMaxLen <= 255);
2252
0
    if (protoMaxLen > 255) {
2253
0
        PORT_SetError(SEC_ERROR_OUTPUT_LEN);
2254
0
        return SECFailure;
2255
0
    }
2256
2257
    /* For each protocol in client preference, see if we support it. */
2258
0
    for (j = 0; j < ss->opt.nextProtoNego.len;) {
2259
0
        for (i = 0; i < protos_len;) {
2260
0
            if (protos[i] == ss->opt.nextProtoNego.data[j] &&
2261
0
                PORT_Memcmp(&protos[i + 1], &ss->opt.nextProtoNego.data[j + 1],
2262
0
                            protos[i]) == 0) {
2263
                /* We found a match. */
2264
0
                const unsigned char *result = &protos[i];
2265
0
                memcpy(protoOut, result + 1, result[0]);
2266
0
                *protoOutLen = result[0];
2267
0
                return SECSuccess;
2268
0
            }
2269
0
            i += 1 + (unsigned int)protos[i];
2270
0
        }
2271
0
        j += 1 + (unsigned int)ss->opt.nextProtoNego.data[j];
2272
0
    }
2273
2274
0
    return SECSuccess;
2275
0
}
2276
2277
SECStatus
2278
SSL_SetNextProtoNego(PRFileDesc *fd, const unsigned char *data,
2279
                     unsigned int length)
2280
0
{
2281
0
    sslSocket *ss;
2282
2283
0
    ss = ssl_FindSocket(fd);
2284
0
    if (!ss) {
2285
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetNextProtoNego",
2286
0
                 SSL_GETPID(), fd));
2287
0
        return SECFailure;
2288
0
    }
2289
2290
0
    if (length > 0 && ssl3_ValidateAppProtocol(data, length) != SECSuccess) {
2291
0
        return SECFailure;
2292
0
    }
2293
2294
    /* NPN required that the client's fallback protocol is first in the
2295
     * list. However, ALPN sends protocols in preference order. So move the
2296
     * first protocol to the end of the list. */
2297
0
    ssl_GetSSL3HandshakeLock(ss);
2298
0
    SECITEM_FreeItem(&ss->opt.nextProtoNego, PR_FALSE);
2299
0
    if (length > 0) {
2300
0
        SECITEM_AllocItem(NULL, &ss->opt.nextProtoNego, length);
2301
0
        size_t firstLen = data[0] + 1;
2302
        /* firstLen <= length is ensured by ssl3_ValidateAppProtocol. */
2303
0
        PORT_Memcpy(ss->opt.nextProtoNego.data + (length - firstLen), data, firstLen);
2304
0
        PORT_Memcpy(ss->opt.nextProtoNego.data, data + firstLen, length - firstLen);
2305
0
    }
2306
0
    ssl_ReleaseSSL3HandshakeLock(ss);
2307
2308
0
    return SSL_SetNextProtoCallback(fd, ssl_NextProtoNegoCallback, NULL);
2309
0
}
2310
2311
SECStatus
2312
SSL_GetNextProto(PRFileDesc *fd, SSLNextProtoState *state, unsigned char *buf,
2313
                 unsigned int *bufLen, unsigned int bufLenMax)
2314
0
{
2315
0
    sslSocket *ss = ssl_FindSocket(fd);
2316
2317
0
    if (!ss) {
2318
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_GetNextProto", SSL_GETPID(),
2319
0
                 fd));
2320
0
        return SECFailure;
2321
0
    }
2322
2323
0
    if (!state || !buf || !bufLen) {
2324
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
2325
0
        return SECFailure;
2326
0
    }
2327
2328
0
    *state = ss->xtnData.nextProtoState;
2329
2330
0
    if (ss->xtnData.nextProtoState != SSL_NEXT_PROTO_NO_SUPPORT &&
2331
0
        ss->xtnData.nextProto.data) {
2332
0
        if (ss->xtnData.nextProto.len > bufLenMax) {
2333
0
            PORT_SetError(SEC_ERROR_OUTPUT_LEN);
2334
0
            return SECFailure;
2335
0
        }
2336
0
        PORT_Memcpy(buf, ss->xtnData.nextProto.data, ss->xtnData.nextProto.len);
2337
0
        *bufLen = ss->xtnData.nextProto.len;
2338
0
    } else {
2339
0
        *bufLen = 0;
2340
0
    }
2341
2342
0
    return SECSuccess;
2343
0
}
2344
2345
SECStatus
2346
SSL_SetSRTPCiphers(PRFileDesc *fd,
2347
                   const PRUint16 *ciphers,
2348
                   unsigned int numCiphers)
2349
0
{
2350
0
    sslSocket *ss;
2351
0
    unsigned int i;
2352
2353
0
    ss = ssl_FindSocket(fd);
2354
0
    if (!ss || !IS_DTLS(ss)) {
2355
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetSRTPCiphers",
2356
0
                 SSL_GETPID(), fd));
2357
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
2358
0
        return SECFailure;
2359
0
    }
2360
2361
0
    if (numCiphers > MAX_DTLS_SRTP_CIPHER_SUITES) {
2362
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
2363
0
        return SECFailure;
2364
0
    }
2365
2366
0
    ss->ssl3.dtlsSRTPCipherCount = 0;
2367
0
    for (i = 0; i < numCiphers; i++) {
2368
0
        const PRUint16 *srtpCipher = srtpCiphers;
2369
2370
0
        while (*srtpCipher) {
2371
0
            if (ciphers[i] == *srtpCipher)
2372
0
                break;
2373
0
            srtpCipher++;
2374
0
        }
2375
0
        if (*srtpCipher) {
2376
0
            ss->ssl3.dtlsSRTPCiphers[ss->ssl3.dtlsSRTPCipherCount++] =
2377
0
                ciphers[i];
2378
0
        } else {
2379
0
            SSL_DBG(("%d: SSL[%d]: invalid or unimplemented SRTP cipher "
2380
0
                     "suite specified: 0x%04hx",
2381
0
                     SSL_GETPID(), fd,
2382
0
                     ciphers[i]));
2383
0
        }
2384
0
    }
2385
2386
0
    if (ss->ssl3.dtlsSRTPCipherCount == 0) {
2387
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
2388
0
        return SECFailure;
2389
0
    }
2390
2391
0
    return SECSuccess;
2392
0
}
2393
2394
SECStatus
2395
SSL_GetSRTPCipher(PRFileDesc *fd, PRUint16 *cipher)
2396
0
{
2397
0
    sslSocket *ss;
2398
2399
0
    ss = ssl_FindSocket(fd);
2400
0
    if (!ss) {
2401
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_GetSRTPCipher",
2402
0
                 SSL_GETPID(), fd));
2403
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
2404
0
        return SECFailure;
2405
0
    }
2406
2407
0
    if (!ss->xtnData.dtlsSRTPCipherSuite) {
2408
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
2409
0
        return SECFailure;
2410
0
    }
2411
2412
0
    *cipher = ss->xtnData.dtlsSRTPCipherSuite;
2413
0
    return SECSuccess;
2414
0
}
2415
2416
PRFileDesc *
2417
SSL_ReconfigFD(PRFileDesc *model, PRFileDesc *fd)
2418
0
{
2419
0
    sslSocket *sm = NULL, *ss = NULL;
2420
0
    PRCList *cursor;
2421
0
    SECStatus rv;
2422
2423
0
    if (model == NULL) {
2424
0
        PR_SetError(SEC_ERROR_INVALID_ARGS, 0);
2425
0
        return NULL;
2426
0
    }
2427
0
    sm = ssl_FindSocket(model);
2428
0
    if (sm == NULL) {
2429
0
        SSL_DBG(("%d: SSL[%d]: bad model socket in ssl_ReconfigFD",
2430
0
                 SSL_GETPID(), model));
2431
0
        return NULL;
2432
0
    }
2433
0
    ss = ssl_FindSocket(fd);
2434
0
    PORT_Assert(ss);
2435
0
    if (ss == NULL) {
2436
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
2437
0
        return NULL;
2438
0
    }
2439
2440
0
    ss->opt = sm->opt;
2441
0
    ss->vrange = sm->vrange;
2442
0
    ss->now = sm->now;
2443
0
    ss->nowArg = sm->nowArg;
2444
0
    PORT_Memcpy(ss->cipherSuites, sm->cipherSuites, sizeof sm->cipherSuites);
2445
0
    PORT_Memcpy(ss->ssl3.dtlsSRTPCiphers, sm->ssl3.dtlsSRTPCiphers,
2446
0
                sizeof(PRUint16) * sm->ssl3.dtlsSRTPCipherCount);
2447
0
    ss->ssl3.dtlsSRTPCipherCount = sm->ssl3.dtlsSRTPCipherCount;
2448
0
    PORT_Memcpy(ss->ssl3.signatureSchemes, sm->ssl3.signatureSchemes,
2449
0
                sizeof(ss->ssl3.signatureSchemes[0]) *
2450
0
                    sm->ssl3.signatureSchemeCount);
2451
0
    ss->ssl3.signatureSchemeCount = sm->ssl3.signatureSchemeCount;
2452
0
    ss->ssl3.downgradeCheckVersion = sm->ssl3.downgradeCheckVersion;
2453
2454
0
    if (!ss->opt.useSecurity) {
2455
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
2456
0
        return NULL;
2457
0
    }
2458
0
    while (!PR_CLIST_IS_EMPTY(&ss->serverCerts)) {
2459
0
        cursor = PR_LIST_TAIL(&ss->serverCerts);
2460
0
        PR_REMOVE_LINK(cursor);
2461
0
        ssl_FreeServerCert((sslServerCert *)cursor);
2462
0
    }
2463
0
    for (cursor = PR_NEXT_LINK(&sm->serverCerts);
2464
0
         cursor != &sm->serverCerts;
2465
0
         cursor = PR_NEXT_LINK(cursor)) {
2466
0
        sslServerCert *sc = ssl_CopyServerCert((sslServerCert *)cursor);
2467
0
        if (!sc)
2468
0
            return NULL;
2469
0
        PR_APPEND_LINK(&sc->link, &ss->serverCerts);
2470
0
    }
2471
2472
0
    ssl_FreeEphemeralKeyPairs(ss);
2473
0
    for (cursor = PR_NEXT_LINK(&sm->ephemeralKeyPairs);
2474
0
         cursor != &sm->ephemeralKeyPairs;
2475
0
         cursor = PR_NEXT_LINK(cursor)) {
2476
0
        sslEphemeralKeyPair *mkp = (sslEphemeralKeyPair *)cursor;
2477
0
        sslEphemeralKeyPair *skp = ssl_CopyEphemeralKeyPair(mkp);
2478
0
        if (!skp)
2479
0
            return NULL;
2480
0
        PR_APPEND_LINK(&skp->link, &ss->ephemeralKeyPairs);
2481
0
    }
2482
2483
0
    while (!PR_CLIST_IS_EMPTY(&ss->extensionHooks)) {
2484
0
        cursor = PR_LIST_TAIL(&ss->extensionHooks);
2485
0
        PR_REMOVE_LINK(cursor);
2486
0
        PORT_Free(cursor);
2487
0
    }
2488
0
    for (cursor = PR_NEXT_LINK(&sm->extensionHooks);
2489
0
         cursor != &sm->extensionHooks;
2490
0
         cursor = PR_NEXT_LINK(cursor)) {
2491
0
        sslCustomExtensionHooks *hook = (sslCustomExtensionHooks *)cursor;
2492
0
        rv = SSL_InstallExtensionHooks(ss->fd, hook->type,
2493
0
                                       hook->writer, hook->writerArg,
2494
0
                                       hook->handler, hook->handlerArg);
2495
0
        if (rv != SECSuccess) {
2496
0
            return NULL;
2497
0
        }
2498
0
    }
2499
2500
0
    PORT_Memcpy((void *)ss->namedGroupPreferences,
2501
0
                sm->namedGroupPreferences,
2502
0
                sizeof(ss->namedGroupPreferences));
2503
0
    ss->additionalShares = sm->additionalShares;
2504
2505
    /* copy trust anchor names */
2506
0
    if (sm->ssl3.ca_list) {
2507
0
        if (ss->ssl3.ca_list) {
2508
0
            CERT_FreeDistNames(ss->ssl3.ca_list);
2509
0
        }
2510
0
        ss->ssl3.ca_list = CERT_DupDistNames(sm->ssl3.ca_list);
2511
0
        if (!ss->ssl3.ca_list) {
2512
0
            return NULL;
2513
0
        }
2514
0
    }
2515
2516
    /* Copy ECH. */
2517
0
    tls13_DestroyEchConfigs(&ss->echConfigs);
2518
0
    SECKEY_DestroyPrivateKey(ss->echPrivKey);
2519
0
    SECKEY_DestroyPublicKey(ss->echPubKey);
2520
0
    rv = tls13_CopyEchConfigs(&sm->echConfigs, &ss->echConfigs);
2521
0
    if (rv != SECSuccess) {
2522
0
        return NULL;
2523
0
    }
2524
0
    if (sm->echPrivKey && sm->echPubKey) {
2525
        /* Might be client (no keys). */
2526
0
        ss->echPrivKey = SECKEY_CopyPrivateKey(sm->echPrivKey);
2527
0
        ss->echPubKey = SECKEY_CopyPublicKey(sm->echPubKey);
2528
0
        if (!ss->echPrivKey || !ss->echPubKey) {
2529
0
            return NULL;
2530
0
        }
2531
0
    }
2532
2533
    /* Copy anti-replay context. */
2534
0
    if (ss->antiReplay) {
2535
0
        tls13_ReleaseAntiReplayContext(ss->antiReplay);
2536
0
        ss->antiReplay = NULL;
2537
0
    }
2538
0
    if (sm->antiReplay) {
2539
0
        ss->antiReplay = tls13_RefAntiReplayContext(sm->antiReplay);
2540
0
        PORT_Assert(ss->antiReplay);
2541
0
        if (!ss->antiReplay) {
2542
0
            return NULL;
2543
0
        }
2544
0
    }
2545
2546
0
    tls13_ResetHandshakePsks(sm, &ss->ssl3.hs.psks);
2547
2548
0
    if (sm->authCertificate)
2549
0
        ss->authCertificate = sm->authCertificate;
2550
0
    if (sm->authCertificateArg)
2551
0
        ss->authCertificateArg = sm->authCertificateArg;
2552
0
    if (sm->getClientAuthData)
2553
0
        ss->getClientAuthData = sm->getClientAuthData;
2554
0
    if (sm->getClientAuthDataArg)
2555
0
        ss->getClientAuthDataArg = sm->getClientAuthDataArg;
2556
0
    if (sm->sniSocketConfig)
2557
0
        ss->sniSocketConfig = sm->sniSocketConfig;
2558
0
    if (sm->sniSocketConfigArg)
2559
0
        ss->sniSocketConfigArg = sm->sniSocketConfigArg;
2560
0
    if (sm->alertReceivedCallback) {
2561
0
        ss->alertReceivedCallback = sm->alertReceivedCallback;
2562
0
        ss->alertReceivedCallbackArg = sm->alertReceivedCallbackArg;
2563
0
    }
2564
0
    if (sm->alertSentCallback) {
2565
0
        ss->alertSentCallback = sm->alertSentCallback;
2566
0
        ss->alertSentCallbackArg = sm->alertSentCallbackArg;
2567
0
    }
2568
0
    if (sm->handleBadCert)
2569
0
        ss->handleBadCert = sm->handleBadCert;
2570
0
    if (sm->badCertArg)
2571
0
        ss->badCertArg = sm->badCertArg;
2572
0
    if (sm->handshakeCallback)
2573
0
        ss->handshakeCallback = sm->handshakeCallback;
2574
0
    if (sm->handshakeCallbackData)
2575
0
        ss->handshakeCallbackData = sm->handshakeCallbackData;
2576
0
    if (sm->pkcs11PinArg)
2577
0
        ss->pkcs11PinArg = sm->pkcs11PinArg;
2578
2579
0
    return fd;
2580
0
}
2581
2582
SECStatus
2583
ssl3_GetEffectiveVersionPolicy(SSLProtocolVariant variant,
2584
                               SSLVersionRange *effectivePolicy)
2585
169k
{
2586
169k
    SECStatus rv;
2587
169k
    PRUint32 policyFlag;
2588
169k
    PRInt32 minPolicy, maxPolicy;
2589
2590
169k
    if (variant == ssl_variant_stream) {
2591
122k
        effectivePolicy->min = SSL_LIBRARY_VERSION_MIN_SUPPORTED_STREAM;
2592
122k
        effectivePolicy->max = SSL_LIBRARY_VERSION_MAX_SUPPORTED;
2593
122k
    } else {
2594
46.7k
        effectivePolicy->min = SSL_LIBRARY_VERSION_MIN_SUPPORTED_DATAGRAM;
2595
46.7k
        effectivePolicy->max = SSL_LIBRARY_VERSION_MAX_SUPPORTED;
2596
46.7k
    }
2597
2598
169k
    rv = NSS_GetAlgorithmPolicy(SEC_OID_APPLY_SSL_POLICY, &policyFlag);
2599
169k
    if ((rv != SECSuccess) || !(policyFlag & NSS_USE_POLICY_IN_SSL)) {
2600
        /* Policy is not active, report library extents. */
2601
169k
        return SECSuccess;
2602
169k
    }
2603
2604
0
    rv = NSS_OptionGet(VERSIONS_POLICY_MIN(variant), &minPolicy);
2605
0
    if (rv != SECSuccess) {
2606
0
        return SECFailure;
2607
0
    }
2608
0
    rv = NSS_OptionGet(VERSIONS_POLICY_MAX(variant), &maxPolicy);
2609
0
    if (rv != SECSuccess) {
2610
0
        return SECFailure;
2611
0
    }
2612
2613
0
    if (minPolicy > effectivePolicy->max ||
2614
0
        maxPolicy < effectivePolicy->min ||
2615
0
        minPolicy > maxPolicy) {
2616
0
        return SECFailure;
2617
0
    }
2618
0
    effectivePolicy->min = PR_MAX(effectivePolicy->min, minPolicy);
2619
0
    effectivePolicy->max = PR_MIN(effectivePolicy->max, maxPolicy);
2620
0
    return SECSuccess;
2621
0
}
2622
2623
/*
2624
 * Assumes that rangeParam values are within the supported boundaries,
2625
 * but should contain all potentially allowed versions, even if they contain
2626
 * conflicting versions.
2627
 * Will return the overlap, or a NONE range if system policy is invalid.
2628
 */
2629
static SECStatus
2630
ssl3_CreateOverlapWithPolicy(SSLProtocolVariant protocolVariant,
2631
                             SSLVersionRange *input,
2632
                             SSLVersionRange *overlap)
2633
142k
{
2634
142k
    SECStatus rv;
2635
142k
    SSLVersionRange effectivePolicyBoundary;
2636
142k
    SSLVersionRange vrange;
2637
2638
142k
    PORT_Assert(input != NULL);
2639
2640
142k
    rv = ssl3_GetEffectiveVersionPolicy(protocolVariant,
2641
142k
                                        &effectivePolicyBoundary);
2642
142k
    if (rv == SECFailure) {
2643
        /* SECFailure means internal failure or invalid configuration. */
2644
0
        overlap->min = overlap->max = SSL_LIBRARY_VERSION_NONE;
2645
0
        return SECFailure;
2646
0
    }
2647
2648
142k
    vrange.min = PR_MAX(input->min, effectivePolicyBoundary.min);
2649
142k
    vrange.max = PR_MIN(input->max, effectivePolicyBoundary.max);
2650
2651
142k
    if (vrange.max < vrange.min) {
2652
        /* there was no overlap, turn off range altogether */
2653
0
        overlap->min = overlap->max = SSL_LIBRARY_VERSION_NONE;
2654
0
        return SECFailure;
2655
0
    }
2656
2657
142k
    *overlap = vrange;
2658
142k
    return SECSuccess;
2659
142k
}
2660
2661
static PRBool
2662
ssl_VersionIsSupportedByPolicy(SSLProtocolVariant protocolVariant,
2663
                               SSL3ProtocolVersion version)
2664
27.6k
{
2665
27.6k
    SECStatus rv;
2666
27.6k
    SSLVersionRange effectivePolicyBoundary;
2667
2668
27.6k
    rv = ssl3_GetEffectiveVersionPolicy(protocolVariant,
2669
27.6k
                                        &effectivePolicyBoundary);
2670
27.6k
    if (rv == SECFailure) {
2671
        /* SECFailure means internal failure or invalid configuration. */
2672
0
        return PR_FALSE;
2673
0
    }
2674
27.6k
    return version >= effectivePolicyBoundary.min &&
2675
27.6k
           version <= effectivePolicyBoundary.max;
2676
27.6k
}
2677
2678
/*
2679
 *  This is called at SSL init time to constrain the existing range based
2680
 *  on user supplied policy.
2681
 */
2682
SECStatus
2683
ssl3_ConstrainRangeByPolicy(void)
2684
0
{
2685
    /* We ignore failures in ssl3_CreateOverlapWithPolicy. Although an empty
2686
     * overlap disables all connectivity, it's an allowed state.
2687
     */
2688
0
    ssl3_CreateOverlapWithPolicy(ssl_variant_stream,
2689
0
                                 VERSIONS_DEFAULTS(ssl_variant_stream),
2690
0
                                 VERSIONS_DEFAULTS(ssl_variant_stream));
2691
0
    ssl3_CreateOverlapWithPolicy(ssl_variant_datagram,
2692
0
                                 VERSIONS_DEFAULTS(ssl_variant_datagram),
2693
0
                                 VERSIONS_DEFAULTS(ssl_variant_datagram));
2694
0
    return SECSuccess;
2695
0
}
2696
2697
PRBool
2698
ssl3_VersionIsSupportedByCode(SSLProtocolVariant protocolVariant,
2699
                              SSL3ProtocolVersion version)
2700
100k
{
2701
100k
    switch (protocolVariant) {
2702
86.8k
        case ssl_variant_stream:
2703
86.8k
            return (version >= SSL_LIBRARY_VERSION_MIN_SUPPORTED_STREAM &&
2704
86.8k
                    version <= SSL_LIBRARY_VERSION_MAX_SUPPORTED);
2705
13.7k
        case ssl_variant_datagram:
2706
13.7k
            return (version >= SSL_LIBRARY_VERSION_MIN_SUPPORTED_DATAGRAM &&
2707
13.7k
                    version <= SSL_LIBRARY_VERSION_MAX_SUPPORTED);
2708
100k
    }
2709
2710
    /* Can't get here */
2711
0
    PORT_Assert(PR_FALSE);
2712
0
    return PR_FALSE;
2713
100k
}
2714
2715
PRBool
2716
ssl3_VersionIsSupported(SSLProtocolVariant protocolVariant,
2717
                        SSL3ProtocolVersion version)
2718
27.6k
{
2719
27.6k
    if (!ssl_VersionIsSupportedByPolicy(protocolVariant, version)) {
2720
18
        return PR_FALSE;
2721
18
    }
2722
27.6k
    return ssl3_VersionIsSupportedByCode(protocolVariant, version);
2723
27.6k
}
2724
2725
const SECItem *
2726
SSL_PeerSignedCertTimestamps(PRFileDesc *fd)
2727
0
{
2728
0
    sslSocket *ss = ssl_FindSocket(fd);
2729
2730
0
    if (!ss) {
2731
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_PeerSignedCertTimestamps",
2732
0
                 SSL_GETPID(), fd));
2733
0
        return NULL;
2734
0
    }
2735
2736
0
    if (!ss->sec.ci.sid) {
2737
0
        PORT_SetError(SEC_ERROR_NOT_INITIALIZED);
2738
0
        return NULL;
2739
0
    }
2740
2741
0
    return &ss->sec.ci.sid->u.ssl3.signedCertTimestamps;
2742
0
}
2743
2744
SECStatus
2745
SSL_VersionRangeGetSupported(SSLProtocolVariant protocolVariant,
2746
                             SSLVersionRange *vrange)
2747
36.4k
{
2748
36.4k
    SECStatus rv;
2749
2750
36.4k
    if (!vrange) {
2751
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
2752
0
        return SECFailure;
2753
0
    }
2754
2755
36.4k
    switch (protocolVariant) {
2756
36.4k
        case ssl_variant_stream:
2757
36.4k
            vrange->min = SSL_LIBRARY_VERSION_MIN_SUPPORTED_STREAM;
2758
36.4k
            vrange->max = SSL_LIBRARY_VERSION_MAX_SUPPORTED;
2759
            /* We don't allow SSLv3 and TLSv1.3 together.
2760
             * However, don't check yet, apply the policy first.
2761
             * Because if the effective supported range doesn't use TLS 1.3,
2762
             * then we don't need to increase the minimum. */
2763
36.4k
            break;
2764
0
        case ssl_variant_datagram:
2765
0
            vrange->min = SSL_LIBRARY_VERSION_MIN_SUPPORTED_DATAGRAM;
2766
0
            vrange->max = SSL_LIBRARY_VERSION_MAX_SUPPORTED;
2767
0
            break;
2768
0
        default:
2769
0
            PORT_SetError(SEC_ERROR_INVALID_ARGS);
2770
0
            return SECFailure;
2771
36.4k
    }
2772
2773
36.4k
    rv = ssl3_CreateOverlapWithPolicy(protocolVariant, vrange, vrange);
2774
36.4k
    if (rv != SECSuccess) {
2775
        /* Library default and policy don't overlap. */
2776
0
        return rv;
2777
0
    }
2778
2779
    /* We don't allow SSLv3 and TLSv1.3 together */
2780
36.4k
    if (vrange->max >= SSL_LIBRARY_VERSION_TLS_1_3) {
2781
36.4k
        vrange->min = PR_MAX(vrange->min, SSL_LIBRARY_VERSION_TLS_1_0);
2782
36.4k
    }
2783
2784
36.4k
    return SECSuccess;
2785
36.4k
}
2786
2787
SECStatus
2788
SSL_VersionRangeGetDefault(SSLProtocolVariant protocolVariant,
2789
                           SSLVersionRange *vrange)
2790
0
{
2791
0
    if ((protocolVariant != ssl_variant_stream &&
2792
0
         protocolVariant != ssl_variant_datagram) ||
2793
0
        !vrange) {
2794
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
2795
0
        return SECFailure;
2796
0
    }
2797
2798
0
    *vrange = *VERSIONS_DEFAULTS(protocolVariant);
2799
0
    return ssl3_CreateOverlapWithPolicy(protocolVariant, vrange, vrange);
2800
0
}
2801
2802
static PRBool
2803
ssl3_HasConflictingSSLVersions(const SSLVersionRange *vrange)
2804
36.4k
{
2805
36.4k
    return (vrange->min <= SSL_LIBRARY_VERSION_3_0 &&
2806
36.4k
            vrange->max >= SSL_LIBRARY_VERSION_TLS_1_3);
2807
36.4k
}
2808
2809
static SECStatus
2810
ssl3_CheckRangeValidAndConstrainByPolicy(SSLProtocolVariant protocolVariant,
2811
                                         SSLVersionRange *vrange)
2812
36.4k
{
2813
36.4k
    SECStatus rv;
2814
2815
36.4k
    if (vrange->min > vrange->max ||
2816
36.4k
        !ssl3_VersionIsSupportedByCode(protocolVariant, vrange->min) ||
2817
36.4k
        !ssl3_VersionIsSupportedByCode(protocolVariant, vrange->max) ||
2818
36.4k
        ssl3_HasConflictingSSLVersions(vrange)) {
2819
0
        PORT_SetError(SSL_ERROR_INVALID_VERSION_RANGE);
2820
0
        return SECFailure;
2821
0
    }
2822
2823
    /* Try to adjust the received range using our policy.
2824
     * If there's overlap, we'll use the (possibly reduced) range.
2825
     * If there isn't overlap, it's failure. */
2826
2827
36.4k
    rv = ssl3_CreateOverlapWithPolicy(protocolVariant, vrange, vrange);
2828
36.4k
    if (rv != SECSuccess) {
2829
0
        return rv;
2830
0
    }
2831
2832
    /* We don't allow SSLv3 and TLSv1.3 together */
2833
36.4k
    if (vrange->max >= SSL_LIBRARY_VERSION_TLS_1_3) {
2834
36.4k
        vrange->min = PR_MAX(vrange->min, SSL_LIBRARY_VERSION_TLS_1_0);
2835
36.4k
    }
2836
2837
36.4k
    return SECSuccess;
2838
36.4k
}
2839
2840
SECStatus
2841
SSL_VersionRangeSetDefault(SSLProtocolVariant protocolVariant,
2842
                           const SSLVersionRange *vrange)
2843
36.4k
{
2844
36.4k
    SSLVersionRange constrainedRange;
2845
36.4k
    SECStatus rv;
2846
2847
36.4k
    if (!vrange) {
2848
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
2849
0
        return SECFailure;
2850
0
    }
2851
2852
36.4k
    constrainedRange = *vrange;
2853
36.4k
    rv = ssl3_CheckRangeValidAndConstrainByPolicy(protocolVariant,
2854
36.4k
                                                  &constrainedRange);
2855
36.4k
    if (rv != SECSuccess)
2856
0
        return rv;
2857
2858
36.4k
    *VERSIONS_DEFAULTS(protocolVariant) = constrainedRange;
2859
36.4k
    return SECSuccess;
2860
36.4k
}
2861
2862
SECStatus
2863
SSL_VersionRangeGet(PRFileDesc *fd, SSLVersionRange *vrange)
2864
0
{
2865
0
    sslSocket *ss = ssl_FindSocket(fd);
2866
2867
0
    if (!ss) {
2868
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_VersionRangeGet",
2869
0
                 SSL_GETPID(), fd));
2870
0
        return SECFailure;
2871
0
    }
2872
2873
0
    if (!vrange) {
2874
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
2875
0
        return SECFailure;
2876
0
    }
2877
2878
0
    ssl_Get1stHandshakeLock(ss);
2879
0
    ssl_GetSSL3HandshakeLock(ss);
2880
2881
0
    *vrange = ss->vrange;
2882
2883
0
    ssl_ReleaseSSL3HandshakeLock(ss);
2884
0
    ssl_Release1stHandshakeLock(ss);
2885
2886
0
    return ssl3_CreateOverlapWithPolicy(ss->protocolVariant, vrange, vrange);
2887
0
}
2888
2889
SECStatus
2890
SSL_VersionRangeSet(PRFileDesc *fd, const SSLVersionRange *vrange)
2891
0
{
2892
0
    SSLVersionRange constrainedRange;
2893
0
    sslSocket *ss;
2894
0
    SECStatus rv;
2895
2896
0
    if (!vrange) {
2897
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
2898
0
        return SECFailure;
2899
0
    }
2900
2901
0
    ss = ssl_FindSocket(fd);
2902
0
    if (!ss) {
2903
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_VersionRangeSet",
2904
0
                 SSL_GETPID(), fd));
2905
0
        return SECFailure;
2906
0
    }
2907
2908
0
    constrainedRange = *vrange;
2909
0
    rv = ssl3_CheckRangeValidAndConstrainByPolicy(ss->protocolVariant,
2910
0
                                                  &constrainedRange);
2911
0
    if (rv != SECSuccess)
2912
0
        return rv;
2913
2914
0
    ssl_Get1stHandshakeLock(ss);
2915
0
    ssl_GetSSL3HandshakeLock(ss);
2916
2917
0
    if (ss->ssl3.downgradeCheckVersion &&
2918
0
        ss->vrange.max > ss->ssl3.downgradeCheckVersion) {
2919
0
        PORT_SetError(SSL_ERROR_INVALID_VERSION_RANGE);
2920
0
        ssl_ReleaseSSL3HandshakeLock(ss);
2921
0
        ssl_Release1stHandshakeLock(ss);
2922
0
        return SECFailure;
2923
0
    }
2924
2925
0
    ss->vrange = constrainedRange;
2926
2927
0
    ssl_ReleaseSSL3HandshakeLock(ss);
2928
0
    ssl_Release1stHandshakeLock(ss);
2929
2930
0
    return SECSuccess;
2931
0
}
2932
2933
SECStatus
2934
SSL_SetDowngradeCheckVersion(PRFileDesc *fd, PRUint16 version)
2935
0
{
2936
0
    sslSocket *ss = ssl_FindSocket(fd);
2937
0
    SECStatus rv = SECFailure;
2938
2939
0
    if (!ss) {
2940
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetDowngradeCheckVersion",
2941
0
                 SSL_GETPID(), fd));
2942
0
        return SECFailure;
2943
0
    }
2944
2945
0
    if (version && !ssl3_VersionIsSupported(ss->protocolVariant, version)) {
2946
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
2947
0
        return SECFailure;
2948
0
    }
2949
2950
0
    ssl_Get1stHandshakeLock(ss);
2951
0
    ssl_GetSSL3HandshakeLock(ss);
2952
2953
0
    if (version && version < ss->vrange.max) {
2954
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
2955
0
        goto loser;
2956
0
    }
2957
0
    ss->ssl3.downgradeCheckVersion = version;
2958
0
    rv = SECSuccess;
2959
2960
0
loser:
2961
0
    ssl_ReleaseSSL3HandshakeLock(ss);
2962
0
    ssl_Release1stHandshakeLock(ss);
2963
2964
0
    return rv;
2965
0
}
2966
2967
const SECItemArray *
2968
SSL_PeerStapledOCSPResponses(PRFileDesc *fd)
2969
0
{
2970
0
    sslSocket *ss = ssl_FindSocket(fd);
2971
2972
0
    if (!ss) {
2973
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_PeerStapledOCSPResponses",
2974
0
                 SSL_GETPID(), fd));
2975
0
        return NULL;
2976
0
    }
2977
2978
0
    if (!ss->sec.ci.sid) {
2979
0
        PORT_SetError(SEC_ERROR_NOT_INITIALIZED);
2980
0
        return NULL;
2981
0
    }
2982
2983
0
    return &ss->sec.ci.sid->peerCertStatus;
2984
0
}
2985
2986
/************************************************************************/
2987
/* The following functions are the TOP LEVEL SSL functions.
2988
** They all get called through the NSPRIOMethods table below.
2989
*/
2990
2991
static PRFileDesc *PR_CALLBACK
2992
ssl_Accept(PRFileDesc *fd, PRNetAddr *sockaddr, PRIntervalTime timeout)
2993
0
{
2994
0
    sslSocket *ss;
2995
0
    sslSocket *ns = NULL;
2996
0
    PRFileDesc *newfd = NULL;
2997
0
    PRFileDesc *osfd;
2998
0
    PRStatus status;
2999
3000
0
    ss = ssl_GetPrivate(fd);
3001
0
    if (!ss) {
3002
0
        SSL_DBG(("%d: SSL[%d]: bad socket in accept", SSL_GETPID(), fd));
3003
0
        return NULL;
3004
0
    }
3005
3006
    /* IF this is a listen socket, there shouldn't be any I/O going on */
3007
0
    SSL_LOCK_READER(ss);
3008
0
    SSL_LOCK_WRITER(ss);
3009
0
    ssl_Get1stHandshakeLock(ss);
3010
0
    ssl_GetSSL3HandshakeLock(ss);
3011
3012
0
    ss->cTimeout = timeout;
3013
3014
0
    osfd = ss->fd->lower;
3015
3016
    /* First accept connection */
3017
0
    newfd = osfd->methods->accept(osfd, sockaddr, timeout);
3018
0
    if (newfd == NULL) {
3019
0
        SSL_DBG(("%d: SSL[%d]: accept failed, errno=%d",
3020
0
                 SSL_GETPID(), ss->fd, PORT_GetError()));
3021
0
    } else {
3022
        /* Create ssl module */
3023
0
        ns = ssl_DupSocket(ss);
3024
0
    }
3025
3026
0
    ssl_ReleaseSSL3HandshakeLock(ss);
3027
0
    ssl_Release1stHandshakeLock(ss);
3028
0
    SSL_UNLOCK_WRITER(ss);
3029
0
    SSL_UNLOCK_READER(ss); /* ss isn't used below here. */
3030
3031
0
    if (ns == NULL)
3032
0
        goto loser;
3033
3034
    /* push ssl module onto the new socket */
3035
0
    status = ssl_PushIOLayer(ns, newfd, PR_TOP_IO_LAYER);
3036
0
    if (status != PR_SUCCESS)
3037
0
        goto loser;
3038
3039
    /* Now start server connection handshake with client.
3040
    ** Don't need locks here because nobody else has a reference to ns yet.
3041
    */
3042
0
    if (ns->opt.useSecurity) {
3043
0
        if (ns->opt.handshakeAsClient) {
3044
0
            ns->handshake = ssl_BeginClientHandshake;
3045
0
            ss->handshaking = sslHandshakingAsClient;
3046
0
        } else {
3047
0
            ns->handshake = ssl_BeginServerHandshake;
3048
0
            ss->handshaking = sslHandshakingAsServer;
3049
0
        }
3050
0
    }
3051
0
    ns->TCPconnected = 1;
3052
0
    return newfd;
3053
3054
0
loser:
3055
0
    if (ns != NULL)
3056
0
        ssl_FreeSocket(ns);
3057
0
    if (newfd != NULL)
3058
0
        PR_Close(newfd);
3059
0
    return NULL;
3060
0
}
3061
3062
static PRStatus PR_CALLBACK
3063
ssl_Connect(PRFileDesc *fd, const PRNetAddr *sockaddr, PRIntervalTime timeout)
3064
0
{
3065
0
    sslSocket *ss;
3066
0
    PRStatus rv;
3067
3068
0
    ss = ssl_GetPrivate(fd);
3069
0
    if (!ss) {
3070
0
        SSL_DBG(("%d: SSL[%d]: bad socket in connect", SSL_GETPID(), fd));
3071
0
        return PR_FAILURE;
3072
0
    }
3073
3074
    /* IF this is a listen socket, there shouldn't be any I/O going on */
3075
0
    SSL_LOCK_READER(ss);
3076
0
    SSL_LOCK_WRITER(ss);
3077
3078
0
    ss->cTimeout = timeout;
3079
0
    rv = (PRStatus)(*ss->ops->connect)(ss, sockaddr);
3080
3081
0
    SSL_UNLOCK_WRITER(ss);
3082
0
    SSL_UNLOCK_READER(ss);
3083
3084
0
    return rv;
3085
0
}
3086
3087
static PRStatus PR_CALLBACK
3088
ssl_Bind(PRFileDesc *fd, const PRNetAddr *addr)
3089
0
{
3090
0
    sslSocket *ss = ssl_GetPrivate(fd);
3091
0
    PRStatus rv;
3092
3093
0
    if (!ss) {
3094
0
        SSL_DBG(("%d: SSL[%d]: bad socket in bind", SSL_GETPID(), fd));
3095
0
        return PR_FAILURE;
3096
0
    }
3097
0
    SSL_LOCK_READER(ss);
3098
0
    SSL_LOCK_WRITER(ss);
3099
3100
0
    rv = (PRStatus)(*ss->ops->bind)(ss, addr);
3101
3102
0
    SSL_UNLOCK_WRITER(ss);
3103
0
    SSL_UNLOCK_READER(ss);
3104
0
    return rv;
3105
0
}
3106
3107
static PRStatus PR_CALLBACK
3108
ssl_Listen(PRFileDesc *fd, PRIntn backlog)
3109
0
{
3110
0
    sslSocket *ss = ssl_GetPrivate(fd);
3111
0
    PRStatus rv;
3112
3113
0
    if (!ss) {
3114
0
        SSL_DBG(("%d: SSL[%d]: bad socket in listen", SSL_GETPID(), fd));
3115
0
        return PR_FAILURE;
3116
0
    }
3117
0
    SSL_LOCK_READER(ss);
3118
0
    SSL_LOCK_WRITER(ss);
3119
3120
0
    rv = (PRStatus)(*ss->ops->listen)(ss, backlog);
3121
3122
0
    SSL_UNLOCK_WRITER(ss);
3123
0
    SSL_UNLOCK_READER(ss);
3124
0
    return rv;
3125
0
}
3126
3127
static PRStatus PR_CALLBACK
3128
ssl_Shutdown(PRFileDesc *fd, PRIntn how)
3129
0
{
3130
0
    sslSocket *ss = ssl_GetPrivate(fd);
3131
0
    PRStatus rv;
3132
3133
0
    if (!ss) {
3134
0
        SSL_DBG(("%d: SSL[%d]: bad socket in shutdown", SSL_GETPID(), fd));
3135
0
        return PR_FAILURE;
3136
0
    }
3137
0
    if (how == PR_SHUTDOWN_RCV || how == PR_SHUTDOWN_BOTH) {
3138
0
        SSL_LOCK_READER(ss);
3139
0
    }
3140
0
    if (how == PR_SHUTDOWN_SEND || how == PR_SHUTDOWN_BOTH) {
3141
0
        SSL_LOCK_WRITER(ss);
3142
0
    }
3143
3144
0
    rv = (PRStatus)(*ss->ops->shutdown)(ss, how);
3145
3146
0
    if (how == PR_SHUTDOWN_SEND || how == PR_SHUTDOWN_BOTH) {
3147
0
        SSL_UNLOCK_WRITER(ss);
3148
0
    }
3149
0
    if (how == PR_SHUTDOWN_RCV || how == PR_SHUTDOWN_BOTH) {
3150
0
        SSL_UNLOCK_READER(ss);
3151
0
    }
3152
0
    return rv;
3153
0
}
3154
3155
static PRStatus PR_CALLBACK
3156
ssl_Close(PRFileDesc *fd)
3157
69.0k
{
3158
69.0k
    sslSocket *ss;
3159
69.0k
    PRStatus rv;
3160
3161
69.0k
    ss = ssl_GetPrivate(fd);
3162
69.0k
    if (!ss) {
3163
0
        SSL_DBG(("%d: SSL[%d]: bad socket in close", SSL_GETPID(), fd));
3164
0
        return PR_FAILURE;
3165
0
    }
3166
3167
    /* There must not be any I/O going on */
3168
69.0k
    SSL_LOCK_READER(ss);
3169
69.0k
    SSL_LOCK_WRITER(ss);
3170
3171
    /* By the time this function returns,
3172
    ** ss is an invalid pointer, and the locks to which it points have
3173
    ** been unlocked and freed.  So, this is the ONE PLACE in all of SSL
3174
    ** where the LOCK calls and the corresponding UNLOCK calls are not in
3175
    ** the same function scope.  The unlock calls are in ssl_FreeSocket().
3176
    */
3177
69.0k
    rv = (PRStatus)(*ss->ops->close)(ss);
3178
3179
69.0k
    return rv;
3180
69.0k
}
3181
3182
static int PR_CALLBACK
3183
ssl_Recv(PRFileDesc *fd, void *buf, PRInt32 len, PRIntn flags,
3184
         PRIntervalTime timeout)
3185
0
{
3186
0
    sslSocket *ss;
3187
0
    int rv;
3188
3189
0
    ss = ssl_GetPrivate(fd);
3190
0
    if (!ss) {
3191
0
        SSL_DBG(("%d: SSL[%d]: bad socket in recv", SSL_GETPID(), fd));
3192
0
        return SECFailure;
3193
0
    }
3194
0
    SSL_LOCK_READER(ss);
3195
0
    ss->rTimeout = timeout;
3196
0
    if (!ss->opt.fdx)
3197
0
        ss->wTimeout = timeout;
3198
0
    rv = (*ss->ops->recv)(ss, (unsigned char *)buf, len, flags);
3199
0
    SSL_UNLOCK_READER(ss);
3200
0
    return rv;
3201
0
}
3202
3203
static int PR_CALLBACK
3204
ssl_Send(PRFileDesc *fd, const void *buf, PRInt32 len, PRIntn flags,
3205
         PRIntervalTime timeout)
3206
0
{
3207
0
    sslSocket *ss;
3208
0
    int rv;
3209
3210
0
    ss = ssl_GetPrivate(fd);
3211
0
    if (!ss) {
3212
0
        SSL_DBG(("%d: SSL[%d]: bad socket in send", SSL_GETPID(), fd));
3213
0
        return SECFailure;
3214
0
    }
3215
0
    SSL_LOCK_WRITER(ss);
3216
0
    ss->wTimeout = timeout;
3217
0
    if (!ss->opt.fdx)
3218
0
        ss->rTimeout = timeout;
3219
0
    rv = (*ss->ops->send)(ss, (const unsigned char *)buf, len, flags);
3220
0
    SSL_UNLOCK_WRITER(ss);
3221
0
    return rv;
3222
0
}
3223
3224
static int PR_CALLBACK
3225
ssl_Read(PRFileDesc *fd, void *buf, PRInt32 len)
3226
4.14k
{
3227
4.14k
    sslSocket *ss;
3228
4.14k
    int rv;
3229
3230
4.14k
    ss = ssl_GetPrivate(fd);
3231
4.14k
    if (!ss) {
3232
0
        SSL_DBG(("%d: SSL[%d]: bad socket in read", SSL_GETPID(), fd));
3233
0
        return SECFailure;
3234
0
    }
3235
4.14k
    SSL_LOCK_READER(ss);
3236
4.14k
    ss->rTimeout = PR_INTERVAL_NO_TIMEOUT;
3237
4.14k
    if (!ss->opt.fdx)
3238
4.14k
        ss->wTimeout = PR_INTERVAL_NO_TIMEOUT;
3239
4.14k
    rv = (*ss->ops->read)(ss, (unsigned char *)buf, len);
3240
4.14k
    SSL_UNLOCK_READER(ss);
3241
4.14k
    return rv;
3242
4.14k
}
3243
3244
static int PR_CALLBACK
3245
ssl_Write(PRFileDesc *fd, const void *buf, PRInt32 len)
3246
2.92k
{
3247
2.92k
    sslSocket *ss;
3248
2.92k
    int rv;
3249
3250
2.92k
    ss = ssl_GetPrivate(fd);
3251
2.92k
    if (!ss) {
3252
0
        SSL_DBG(("%d: SSL[%d]: bad socket in write", SSL_GETPID(), fd));
3253
0
        return SECFailure;
3254
0
    }
3255
2.92k
    SSL_LOCK_WRITER(ss);
3256
2.92k
    ss->wTimeout = PR_INTERVAL_NO_TIMEOUT;
3257
2.92k
    if (!ss->opt.fdx)
3258
2.92k
        ss->rTimeout = PR_INTERVAL_NO_TIMEOUT;
3259
2.92k
    rv = (*ss->ops->write)(ss, (const unsigned char *)buf, len);
3260
2.92k
    SSL_UNLOCK_WRITER(ss);
3261
2.92k
    return rv;
3262
2.92k
}
3263
3264
static PRStatus PR_CALLBACK
3265
ssl_GetPeerName(PRFileDesc *fd, PRNetAddr *addr)
3266
0
{
3267
0
    sslSocket *ss;
3268
3269
0
    ss = ssl_GetPrivate(fd);
3270
0
    if (!ss) {
3271
0
        SSL_DBG(("%d: SSL[%d]: bad socket in getpeername", SSL_GETPID(), fd));
3272
0
        return PR_FAILURE;
3273
0
    }
3274
0
    return (PRStatus)(*ss->ops->getpeername)(ss, addr);
3275
0
}
3276
3277
/*
3278
*/
3279
SECStatus
3280
ssl_GetPeerInfo(sslSocket *ss)
3281
66.2k
{
3282
66.2k
    PRFileDesc *osfd;
3283
66.2k
    int rv;
3284
66.2k
    PRNetAddr sin;
3285
3286
66.2k
    osfd = ss->fd->lower;
3287
3288
66.2k
    PORT_Memset(&sin, 0, sizeof(sin));
3289
66.2k
    rv = osfd->methods->getpeername(osfd, &sin);
3290
66.2k
    if (rv < 0) {
3291
0
        return SECFailure;
3292
0
    }
3293
66.2k
    ss->TCPconnected = 1;
3294
66.2k
    if (sin.inet.family == PR_AF_INET) {
3295
66.2k
        PR_ConvertIPv4AddrToIPv6(sin.inet.ip, &ss->sec.ci.peer);
3296
66.2k
        ss->sec.ci.port = sin.inet.port;
3297
66.2k
    } else if (sin.ipv6.family == PR_AF_INET6) {
3298
0
        ss->sec.ci.peer = sin.ipv6.ip;
3299
0
        ss->sec.ci.port = sin.ipv6.port;
3300
0
    } else {
3301
0
        PORT_SetError(PR_ADDRESS_NOT_SUPPORTED_ERROR);
3302
0
        return SECFailure;
3303
0
    }
3304
66.2k
    return SECSuccess;
3305
66.2k
}
3306
3307
static PRStatus PR_CALLBACK
3308
ssl_GetSockName(PRFileDesc *fd, PRNetAddr *name)
3309
0
{
3310
0
    sslSocket *ss;
3311
3312
0
    ss = ssl_GetPrivate(fd);
3313
0
    if (!ss) {
3314
0
        SSL_DBG(("%d: SSL[%d]: bad socket in getsockname", SSL_GETPID(), fd));
3315
0
        return PR_FAILURE;
3316
0
    }
3317
0
    return (PRStatus)(*ss->ops->getsockname)(ss, name);
3318
0
}
3319
3320
SECStatus
3321
SSL_SetSockPeerID(PRFileDesc *fd, const char *peerID)
3322
0
{
3323
0
    sslSocket *ss;
3324
3325
0
    ss = ssl_FindSocket(fd);
3326
0
    if (!ss) {
3327
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetSockPeerID",
3328
0
                 SSL_GETPID(), fd));
3329
0
        return SECFailure;
3330
0
    }
3331
3332
0
    if (ss->peerID) {
3333
0
        PORT_Free(ss->peerID);
3334
0
        ss->peerID = NULL;
3335
0
    }
3336
0
    if (peerID)
3337
0
        ss->peerID = PORT_Strdup(peerID);
3338
0
    return (ss->peerID || !peerID) ? SECSuccess : SECFailure;
3339
0
}
3340
3341
0
#define PR_POLL_RW (PR_POLL_WRITE | PR_POLL_READ)
3342
3343
static PRInt16 PR_CALLBACK
3344
ssl_Poll(PRFileDesc *fd, PRInt16 how_flags, PRInt16 *p_out_flags)
3345
0
{
3346
0
    sslSocket *ss;
3347
0
    PRInt16 new_flags = how_flags; /* should select on these flags. */
3348
0
    PRNetAddr addr;
3349
3350
0
    *p_out_flags = 0;
3351
0
    ss = ssl_GetPrivate(fd);
3352
0
    if (!ss) {
3353
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_Poll",
3354
0
                 SSL_GETPID(), fd));
3355
0
        return 0; /* don't poll on this socket */
3356
0
    }
3357
3358
0
    if (ss->opt.useSecurity &&
3359
0
        ss->handshaking != sslHandshakingUndetermined &&
3360
0
        !ss->firstHsDone &&
3361
0
        (how_flags & PR_POLL_RW)) {
3362
0
        if (!ss->TCPconnected) {
3363
0
            ss->TCPconnected = (PR_SUCCESS == ssl_DefGetpeername(ss, &addr));
3364
0
        }
3365
        /* If it's not connected, then presumably the application is polling
3366
        ** on read or write appropriately, so don't change it.
3367
        */
3368
0
        if (ss->TCPconnected) {
3369
0
            if (!ss->handshakeBegun) {
3370
                /* If the handshake has not begun, poll on read or write
3371
                ** based on the local application's role in the handshake,
3372
                ** not based on what the application requested.
3373
                */
3374
0
                new_flags &= ~PR_POLL_RW;
3375
0
                if (ss->handshaking == sslHandshakingAsClient) {
3376
0
                    new_flags |= PR_POLL_WRITE;
3377
0
                } else { /* handshaking as server */
3378
0
                    new_flags |= PR_POLL_READ;
3379
0
                }
3380
0
            } else if (ss->lastWriteBlocked) {
3381
                /* First handshake is in progress */
3382
0
                if (new_flags & PR_POLL_READ) {
3383
                    /* The caller is waiting for data to be received,
3384
                    ** but the initial handshake is blocked on write, or the
3385
                    ** client's first handshake record has not been written.
3386
                    ** The code should select on write, not read.
3387
                    */
3388
0
                    new_flags &= ~PR_POLL_READ; /* don't select on read. */
3389
0
                    new_flags |= PR_POLL_WRITE; /* do    select on write. */
3390
0
                }
3391
0
            } else if (new_flags & PR_POLL_WRITE) {
3392
                /* The caller is trying to write, but the handshake is
3393
                ** blocked waiting for data to read, and the first
3394
                ** handshake has been sent.  So do NOT to poll on write
3395
                ** unless we did false start or we are doing 0-RTT.
3396
                */
3397
0
                if (!(ss->ssl3.hs.canFalseStart ||
3398
0
                      ss->ssl3.hs.zeroRttState == ssl_0rtt_sent ||
3399
0
                      ss->ssl3.hs.zeroRttState == ssl_0rtt_accepted)) {
3400
0
                    new_flags &= ~PR_POLL_WRITE; /* don't select on write. */
3401
0
                }
3402
0
                new_flags |= PR_POLL_READ; /* do    select on read. */
3403
0
            }
3404
0
        }
3405
0
    } else if ((new_flags & PR_POLL_READ) && (SSL_DataPending(fd) > 0)) {
3406
0
        *p_out_flags = PR_POLL_READ; /* it's ready already. */
3407
0
        return new_flags;
3408
0
    } else if ((ss->lastWriteBlocked) && (how_flags & PR_POLL_READ) &&
3409
0
               (ss->pendingBuf.len != 0)) { /* write data waiting to be sent */
3410
0
        new_flags |= PR_POLL_WRITE;         /* also select on write. */
3411
0
    }
3412
3413
0
    if (ss->ssl3.hs.restartTarget != NULL) {
3414
        /* Read and write will block until the asynchronous callback completes
3415
         * (e.g. until SSL_AuthCertificateComplete is called), so don't tell
3416
         * the caller to poll the socket unless there is pending write data.
3417
         */
3418
0
        if (ss->lastWriteBlocked && ss->pendingBuf.len != 0) {
3419
            /* Ignore any newly-received data on the socket, but do wait for
3420
             * the socket to become writable again. Here, it is OK for an error
3421
             * to be detected, because our logic for sending pending write data
3422
             * will allow us to report the error to the caller without the risk
3423
             * of the application spinning.
3424
             */
3425
0
            new_flags &= (PR_POLL_WRITE | PR_POLL_EXCEPT);
3426
0
        } else {
3427
            /* Unfortunately, clearing new_flags will make it impossible for
3428
             * the application to detect errors that it would otherwise be
3429
             * able to detect with PR_POLL_EXCEPT, until the asynchronous
3430
             * callback completes. However, we must clear all the flags to
3431
             * prevent the application from spinning (alternating between
3432
             * calling PR_Poll that would return PR_POLL_EXCEPT, and send/recv
3433
             * which won't actually report the I/O error while we are waiting
3434
             * for the asynchronous callback to complete).
3435
             */
3436
0
            new_flags = 0;
3437
0
        }
3438
0
    }
3439
3440
0
    SSL_TRC(20, ("%d: SSL[%d]: ssl_Poll flags %x -> %x",
3441
0
                 SSL_GETPID(), fd, how_flags, new_flags));
3442
3443
0
    if (new_flags && (fd->lower->methods->poll != NULL)) {
3444
0
        PRInt16 lower_out_flags = 0;
3445
0
        PRInt16 lower_new_flags;
3446
0
        lower_new_flags = fd->lower->methods->poll(fd->lower, new_flags,
3447
0
                                                   &lower_out_flags);
3448
0
        if ((lower_new_flags & lower_out_flags) && (how_flags != new_flags)) {
3449
0
            PRInt16 out_flags = lower_out_flags & ~PR_POLL_RW;
3450
0
            if (lower_out_flags & PR_POLL_READ)
3451
0
                out_flags |= PR_POLL_WRITE;
3452
0
            if (lower_out_flags & PR_POLL_WRITE)
3453
0
                out_flags |= PR_POLL_READ;
3454
0
            *p_out_flags = out_flags;
3455
0
            new_flags = how_flags;
3456
0
        } else {
3457
0
            *p_out_flags = lower_out_flags;
3458
0
            new_flags = lower_new_flags;
3459
0
        }
3460
0
    }
3461
3462
0
    return new_flags;
3463
0
}
3464
3465
static PRInt32 PR_CALLBACK
3466
ssl_TransmitFile(PRFileDesc *sd, PRFileDesc *fd,
3467
                 const void *headers, PRInt32 hlen,
3468
                 PRTransmitFileFlags flags, PRIntervalTime timeout)
3469
0
{
3470
0
    PRSendFileData sfd;
3471
3472
0
    sfd.fd = fd;
3473
0
    sfd.file_offset = 0;
3474
0
    sfd.file_nbytes = 0;
3475
0
    sfd.header = headers;
3476
0
    sfd.hlen = hlen;
3477
0
    sfd.trailer = NULL;
3478
0
    sfd.tlen = 0;
3479
3480
0
    return sd->methods->sendfile(sd, &sfd, flags, timeout);
3481
0
}
3482
3483
PRBool
3484
ssl_FdIsBlocking(PRFileDesc *fd)
3485
73.7k
{
3486
73.7k
    PRSocketOptionData opt;
3487
73.7k
    PRStatus status;
3488
3489
73.7k
    opt.option = PR_SockOpt_Nonblocking;
3490
73.7k
    opt.value.non_blocking = PR_FALSE;
3491
73.7k
    status = PR_GetSocketOption(fd, &opt);
3492
73.7k
    if (status != PR_SUCCESS)
3493
0
        return PR_FALSE;
3494
73.7k
    return (PRBool)!opt.value.non_blocking;
3495
73.7k
}
3496
3497
PRBool
3498
ssl_SocketIsBlocking(sslSocket *ss)
3499
73.7k
{
3500
73.7k
    return ssl_FdIsBlocking(ss->fd);
3501
73.7k
}
3502
3503
PRInt32 sslFirstBufSize = 8 * 1024;
3504
PRInt32 sslCopyLimit = 1024;
3505
3506
static PRInt32 PR_CALLBACK
3507
ssl_WriteV(PRFileDesc *fd, const PRIOVec *iov, PRInt32 vectors,
3508
           PRIntervalTime timeout)
3509
0
{
3510
0
    PRInt32 i;
3511
0
    PRInt32 bufLen;
3512
0
    PRInt32 left;
3513
0
    PRInt32 rv;
3514
0
    PRInt32 sent = 0;
3515
0
    const PRInt32 first_len = sslFirstBufSize;
3516
0
    const PRInt32 limit = sslCopyLimit;
3517
0
    PRBool blocking;
3518
0
    PRIOVec myIov;
3519
0
    char buf[MAX_FRAGMENT_LENGTH];
3520
3521
0
    if (vectors < 0) {
3522
0
        PORT_SetError(PR_INVALID_ARGUMENT_ERROR);
3523
0
        return -1;
3524
0
    }
3525
0
    if (vectors > PR_MAX_IOVECTOR_SIZE) {
3526
0
        PORT_SetError(PR_BUFFER_OVERFLOW_ERROR);
3527
0
        return -1;
3528
0
    }
3529
0
    for (i = 0; i < vectors; i++) {
3530
0
        if (iov[i].iov_len < 0) {
3531
0
            PORT_SetError(PR_INVALID_ARGUMENT_ERROR);
3532
0
            return -1;
3533
0
        }
3534
0
    }
3535
0
    blocking = ssl_FdIsBlocking(fd);
3536
3537
0
#define K16 ((int)sizeof(buf))
3538
0
#define KILL_VECTORS                   \
3539
0
    while (vectors && !iov->iov_len) { \
3540
0
        ++iov;                         \
3541
0
        --vectors;                     \
3542
0
    }
3543
0
#define GET_VECTOR      \
3544
0
    do {                \
3545
0
        myIov = *iov++; \
3546
0
        --vectors;      \
3547
0
        KILL_VECTORS    \
3548
0
    } while (0)
3549
0
#define HANDLE_ERR(rv, len)                                    \
3550
0
    if (rv != len) {                                           \
3551
0
        if (rv < 0) {                                          \
3552
0
            if (!blocking &&                                   \
3553
0
                (PR_GetError() == PR_WOULD_BLOCK_ERROR) &&     \
3554
0
                (sent > 0)) {                                  \
3555
0
                return sent;                                   \
3556
0
            } else {                                           \
3557
0
                return -1;                                     \
3558
0
            }                                                  \
3559
0
        }                                                      \
3560
        /* Only a nonblocking socket can have partial sends */ \
3561
0
        PR_ASSERT(!blocking);                                  \
3562
0
        return sent + rv;                                      \
3563
0
    }
3564
0
#define SEND(bfr, len)                           \
3565
0
    do {                                         \
3566
0
        rv = ssl_Send(fd, bfr, len, 0, timeout); \
3567
0
        HANDLE_ERR(rv, len)                      \
3568
0
        sent += len;                             \
3569
0
    } while (0)
3570
3571
    /* Make sure the first write is at least 8 KB, if possible. */
3572
0
    KILL_VECTORS
3573
0
    if (!vectors)
3574
0
        return ssl_Send(fd, 0, 0, 0, timeout);
3575
0
    GET_VECTOR;
3576
0
    if (!vectors) {
3577
0
        return ssl_Send(fd, myIov.iov_base, myIov.iov_len, 0, timeout);
3578
0
    }
3579
0
    if (myIov.iov_len < first_len) {
3580
0
        PORT_Memcpy(buf, myIov.iov_base, myIov.iov_len);
3581
0
        bufLen = myIov.iov_len;
3582
0
        left = first_len - bufLen;
3583
0
        while (vectors && left) {
3584
0
            int toCopy;
3585
0
            GET_VECTOR;
3586
0
            toCopy = PR_MIN(left, myIov.iov_len);
3587
0
            PORT_Memcpy(buf + bufLen, myIov.iov_base, toCopy);
3588
0
            bufLen += toCopy;
3589
0
            left -= toCopy;
3590
0
            myIov.iov_base += toCopy;
3591
0
            myIov.iov_len -= toCopy;
3592
0
        }
3593
0
        SEND(buf, bufLen);
3594
0
    }
3595
3596
0
    while (vectors || myIov.iov_len) {
3597
0
        PRInt32 addLen;
3598
0
        if (!myIov.iov_len) {
3599
0
            GET_VECTOR;
3600
0
        }
3601
0
        while (myIov.iov_len >= K16) {
3602
0
            SEND(myIov.iov_base, K16);
3603
0
            myIov.iov_base += K16;
3604
0
            myIov.iov_len -= K16;
3605
0
        }
3606
0
        if (!myIov.iov_len)
3607
0
            continue;
3608
3609
0
        if (!vectors || myIov.iov_len > limit) {
3610
0
            addLen = 0;
3611
0
        } else if ((addLen = iov->iov_len % K16) + myIov.iov_len <= limit) {
3612
0
            /* Addlen is already computed. */;
3613
0
        } else if (vectors > 1 &&
3614
0
                   iov[1].iov_len % K16 + addLen + myIov.iov_len <= 2 * limit) {
3615
0
            addLen = limit - myIov.iov_len;
3616
0
        } else
3617
0
            addLen = 0;
3618
3619
0
        if (!addLen) {
3620
0
            SEND(myIov.iov_base, myIov.iov_len);
3621
0
            myIov.iov_len = 0;
3622
0
            continue;
3623
0
        }
3624
0
        PORT_Memcpy(buf, myIov.iov_base, myIov.iov_len);
3625
0
        bufLen = myIov.iov_len;
3626
0
        do {
3627
0
            GET_VECTOR;
3628
0
            PORT_Memcpy(buf + bufLen, myIov.iov_base, addLen);
3629
0
            myIov.iov_base += addLen;
3630
0
            myIov.iov_len -= addLen;
3631
0
            bufLen += addLen;
3632
3633
0
            left = PR_MIN(limit, K16 - bufLen);
3634
0
            if (!vectors             /* no more left */
3635
0
                || myIov.iov_len > 0 /* we didn't use that one all up */
3636
0
                || bufLen >= K16 /* it's full. */) {
3637
0
                addLen = 0;
3638
0
            } else if ((addLen = iov->iov_len % K16) <= left) {
3639
0
                /* Addlen is already computed. */;
3640
0
            } else if (vectors > 1 &&
3641
0
                       iov[1].iov_len % K16 + addLen <= left + limit) {
3642
0
                addLen = left;
3643
0
            } else
3644
0
                addLen = 0;
3645
3646
0
        } while (addLen);
3647
0
        SEND(buf, bufLen);
3648
0
    }
3649
0
    return sent;
3650
0
}
3651
3652
/*
3653
 * These functions aren't implemented.
3654
 */
3655
3656
static PRInt32 PR_CALLBACK
3657
ssl_Available(PRFileDesc *fd)
3658
0
{
3659
0
    PORT_Assert(0);
3660
0
    PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
3661
0
    return SECFailure;
3662
0
}
3663
3664
static PRInt64 PR_CALLBACK
3665
ssl_Available64(PRFileDesc *fd)
3666
0
{
3667
0
    PRInt64 res;
3668
3669
0
    PORT_Assert(0);
3670
0
    PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
3671
0
    LL_I2L(res, -1L);
3672
0
    return res;
3673
0
}
3674
3675
static PRStatus PR_CALLBACK
3676
ssl_FSync(PRFileDesc *fd)
3677
0
{
3678
0
    PORT_Assert(0);
3679
0
    PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
3680
0
    return PR_FAILURE;
3681
0
}
3682
3683
static PRInt32 PR_CALLBACK
3684
ssl_Seek(PRFileDesc *fd, PRInt32 offset, PRSeekWhence how)
3685
0
{
3686
0
    PORT_Assert(0);
3687
0
    PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
3688
0
    return SECFailure;
3689
0
}
3690
3691
static PRInt64 PR_CALLBACK
3692
ssl_Seek64(PRFileDesc *fd, PRInt64 offset, PRSeekWhence how)
3693
0
{
3694
0
    PRInt64 res;
3695
3696
0
    PORT_Assert(0);
3697
0
    PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
3698
0
    LL_I2L(res, -1L);
3699
0
    return res;
3700
0
}
3701
3702
static PRStatus PR_CALLBACK
3703
ssl_FileInfo(PRFileDesc *fd, PRFileInfo *info)
3704
0
{
3705
0
    PORT_Assert(0);
3706
0
    PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
3707
0
    return PR_FAILURE;
3708
0
}
3709
3710
static PRStatus PR_CALLBACK
3711
ssl_FileInfo64(PRFileDesc *fd, PRFileInfo64 *info)
3712
0
{
3713
0
    PORT_Assert(0);
3714
0
    PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
3715
0
    return PR_FAILURE;
3716
0
}
3717
3718
static PRInt32 PR_CALLBACK
3719
ssl_RecvFrom(PRFileDesc *fd, void *buf, PRInt32 amount, PRIntn flags,
3720
             PRNetAddr *addr, PRIntervalTime timeout)
3721
0
{
3722
0
    PORT_Assert(0);
3723
0
    PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
3724
0
    return SECFailure;
3725
0
}
3726
3727
static PRInt32 PR_CALLBACK
3728
ssl_SendTo(PRFileDesc *fd, const void *buf, PRInt32 amount, PRIntn flags,
3729
           const PRNetAddr *addr, PRIntervalTime timeout)
3730
0
{
3731
0
    PORT_Assert(0);
3732
0
    PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
3733
0
    return SECFailure;
3734
0
}
3735
3736
static const PRIOMethods ssl_methods = {
3737
    PR_DESC_LAYERED,
3738
    ssl_Close,            /* close        */
3739
    ssl_Read,             /* read         */
3740
    ssl_Write,            /* write        */
3741
    ssl_Available,        /* available    */
3742
    ssl_Available64,      /* available64  */
3743
    ssl_FSync,            /* fsync        */
3744
    ssl_Seek,             /* seek         */
3745
    ssl_Seek64,           /* seek64       */
3746
    ssl_FileInfo,         /* fileInfo     */
3747
    ssl_FileInfo64,       /* fileInfo64   */
3748
    ssl_WriteV,           /* writev       */
3749
    ssl_Connect,          /* connect      */
3750
    ssl_Accept,           /* accept       */
3751
    ssl_Bind,             /* bind         */
3752
    ssl_Listen,           /* listen       */
3753
    ssl_Shutdown,         /* shutdown     */
3754
    ssl_Recv,             /* recv         */
3755
    ssl_Send,             /* send         */
3756
    ssl_RecvFrom,         /* recvfrom     */
3757
    ssl_SendTo,           /* sendto       */
3758
    ssl_Poll,             /* poll         */
3759
    PR_EmulateAcceptRead, /* acceptread   */
3760
    ssl_TransmitFile,     /* transmitfile */
3761
    ssl_GetSockName,      /* getsockname  */
3762
    ssl_GetPeerName,      /* getpeername  */
3763
    NULL,                 /* getsockopt   OBSOLETE */
3764
    NULL,                 /* setsockopt   OBSOLETE */
3765
    NULL,                 /* getsocketoption   */
3766
    NULL,                 /* setsocketoption   */
3767
    PR_EmulateSendFile,   /* Send a (partial) file with header/trailer*/
3768
    NULL,                 /* reserved for future use */
3769
    NULL,                 /* reserved for future use */
3770
    NULL,                 /* reserved for future use */
3771
    NULL,                 /* reserved for future use */
3772
    NULL                  /* reserved for future use */
3773
};
3774
3775
static PRIOMethods combined_methods;
3776
3777
static void
3778
ssl_SetupIOMethods(void)
3779
8
{
3780
8
    PRIOMethods *new_methods = &combined_methods;
3781
8
    const PRIOMethods *nspr_methods = PR_GetDefaultIOMethods();
3782
8
    const PRIOMethods *my_methods = &ssl_methods;
3783
3784
8
    *new_methods = *nspr_methods;
3785
3786
8
    new_methods->file_type = my_methods->file_type;
3787
8
    new_methods->close = my_methods->close;
3788
8
    new_methods->read = my_methods->read;
3789
8
    new_methods->write = my_methods->write;
3790
8
    new_methods->available = my_methods->available;
3791
8
    new_methods->available64 = my_methods->available64;
3792
8
    new_methods->fsync = my_methods->fsync;
3793
8
    new_methods->seek = my_methods->seek;
3794
8
    new_methods->seek64 = my_methods->seek64;
3795
8
    new_methods->fileInfo = my_methods->fileInfo;
3796
8
    new_methods->fileInfo64 = my_methods->fileInfo64;
3797
8
    new_methods->writev = my_methods->writev;
3798
8
    new_methods->connect = my_methods->connect;
3799
8
    new_methods->accept = my_methods->accept;
3800
8
    new_methods->bind = my_methods->bind;
3801
8
    new_methods->listen = my_methods->listen;
3802
8
    new_methods->shutdown = my_methods->shutdown;
3803
8
    new_methods->recv = my_methods->recv;
3804
8
    new_methods->send = my_methods->send;
3805
8
    new_methods->recvfrom = my_methods->recvfrom;
3806
8
    new_methods->sendto = my_methods->sendto;
3807
8
    new_methods->poll = my_methods->poll;
3808
8
    new_methods->acceptread = my_methods->acceptread;
3809
8
    new_methods->transmitfile = my_methods->transmitfile;
3810
8
    new_methods->getsockname = my_methods->getsockname;
3811
8
    new_methods->getpeername = my_methods->getpeername;
3812
    /*  new_methods->getsocketoption   = my_methods->getsocketoption;       */
3813
    /*  new_methods->setsocketoption   = my_methods->setsocketoption;       */
3814
8
    new_methods->sendfile = my_methods->sendfile;
3815
8
}
3816
3817
static PRCallOnceType initIoLayerOnce;
3818
3819
static PRStatus
3820
ssl_InitIOLayer(void)
3821
8
{
3822
8
    ssl_layer_id = PR_GetUniqueIdentity("SSL");
3823
8
    ssl_SetupIOMethods();
3824
8
    return PR_SUCCESS;
3825
8
}
3826
3827
static PRStatus
3828
ssl_PushIOLayer(sslSocket *ns, PRFileDesc *stack, PRDescIdentity id)
3829
69.0k
{
3830
69.0k
    PRFileDesc *layer = NULL;
3831
69.0k
    PRStatus status;
3832
3833
69.0k
    status = PR_CallOnce(&initIoLayerOnce, &ssl_InitIOLayer);
3834
69.0k
    if (status != PR_SUCCESS) {
3835
0
        goto loser;
3836
0
    }
3837
69.0k
    if (ns == NULL) {
3838
0
        goto loser;
3839
0
    }
3840
69.0k
    layer = PR_CreateIOLayerStub(ssl_layer_id, &combined_methods);
3841
69.0k
    if (layer == NULL)
3842
0
        goto loser;
3843
69.0k
    layer->secret = (PRFilePrivate *)ns;
3844
3845
    /* Here, "stack" points to the PRFileDesc on the top of the stack.
3846
    ** "layer" points to a new FD that is to be inserted into the stack.
3847
    ** If layer is being pushed onto the top of the stack, then
3848
    ** PR_PushIOLayer switches the contents of stack and layer, and then
3849
    ** puts stack on top of layer, so that after it is done, the top of
3850
    ** stack is the same "stack" as it was before, and layer is now the
3851
    ** FD for the former top of stack.
3852
    ** After this call, stack always points to the top PRFD on the stack.
3853
    ** If this function fails, the contents of stack and layer are as
3854
    ** they were before the call.
3855
    */
3856
69.0k
    status = PR_PushIOLayer(stack, id, layer);
3857
69.0k
    if (status != PR_SUCCESS)
3858
0
        goto loser;
3859
3860
69.0k
    ns->fd = (id == PR_TOP_IO_LAYER) ? stack : layer;
3861
69.0k
    return PR_SUCCESS;
3862
3863
0
loser:
3864
0
    if (layer) {
3865
0
        layer->dtor(layer); /* free layer */
3866
0
    }
3867
0
    return PR_FAILURE;
3868
69.0k
}
3869
3870
/* if this fails, caller must destroy socket. */
3871
static SECStatus
3872
ssl_MakeLocks(sslSocket *ss)
3873
69.0k
{
3874
69.0k
    ss->firstHandshakeLock = PZ_NewMonitor(nssILockSSL);
3875
69.0k
    if (!ss->firstHandshakeLock)
3876
0
        goto loser;
3877
69.0k
    ss->ssl3HandshakeLock = PZ_NewMonitor(nssILockSSL);
3878
69.0k
    if (!ss->ssl3HandshakeLock)
3879
0
        goto loser;
3880
69.0k
    ss->specLock = NSSRWLock_New(SSL_LOCK_RANK_SPEC, NULL);
3881
69.0k
    if (!ss->specLock)
3882
0
        goto loser;
3883
69.0k
    ss->recvBufLock = PZ_NewMonitor(nssILockSSL);
3884
69.0k
    if (!ss->recvBufLock)
3885
0
        goto loser;
3886
69.0k
    ss->xmitBufLock = PZ_NewMonitor(nssILockSSL);
3887
69.0k
    if (!ss->xmitBufLock)
3888
0
        goto loser;
3889
69.0k
    ss->writerThread = NULL;
3890
69.0k
    if (ssl_lock_readers) {
3891
69.0k
        ss->recvLock = PZ_NewLock(nssILockSSL);
3892
69.0k
        if (!ss->recvLock)
3893
0
            goto loser;
3894
69.0k
        ss->sendLock = PZ_NewLock(nssILockSSL);
3895
69.0k
        if (!ss->sendLock)
3896
0
            goto loser;
3897
69.0k
    }
3898
69.0k
    return SECSuccess;
3899
0
loser:
3900
0
    ssl_DestroyLocks(ss);
3901
0
    return SECFailure;
3902
69.0k
}
3903
3904
#if defined(XP_UNIX) || defined(XP_WIN32)
3905
#define NSS_HAVE_GETENV 1
3906
#endif
3907
3908
0
#define LOWER(x) (x | 0x20) /* cheap ToLower function ignores LOCALE */
3909
3910
static void
3911
ssl_SetDefaultsFromEnvironment(void)
3912
69.0k
{
3913
69.0k
#if defined(NSS_HAVE_GETENV)
3914
69.0k
    static int firsttime = 1;
3915
3916
69.0k
    if (firsttime) {
3917
8
        char *ev;
3918
8
        firsttime = 0;
3919
8
#ifdef DEBUG
3920
8
        ssl_trace_iob = NULL;
3921
8
        ev = PR_GetEnvSecure("SSLDEBUGFILE");
3922
8
        if (ev && ev[0]) {
3923
0
            ssl_trace_iob = fopen(ev, "w");
3924
0
        }
3925
8
        if (!ssl_trace_iob) {
3926
8
            ssl_trace_iob = stderr;
3927
8
        }
3928
8
#ifdef TRACE
3929
8
        ev = PR_GetEnvSecure("SSLTRACE");
3930
8
        if (ev && ev[0]) {
3931
0
            ssl_trace = atoi(ev);
3932
0
            SSL_TRACE(("SSL: tracing set to %d", ssl_trace));
3933
0
        }
3934
8
#endif /* TRACE */
3935
8
        ev = PR_GetEnvSecure("SSLDEBUG");
3936
8
        if (ev && ev[0]) {
3937
0
            ssl_debug = atoi(ev);
3938
0
            SSL_TRACE(("SSL: debugging set to %d", ssl_debug));
3939
0
        }
3940
8
#endif /* DEBUG */
3941
8
#ifdef NSS_ALLOW_SSLKEYLOGFILE
3942
8
        ssl_keylog_iob = NULL;
3943
8
        ev = PR_GetEnvSecure("SSLKEYLOGFILE");
3944
8
        if (ev && ev[0]) {
3945
0
            ssl_keylog_iob = fopen(ev, "a");
3946
0
            if (!ssl_keylog_iob) {
3947
0
                SSL_TRACE(("SSL: failed to open key log file"));
3948
0
            } else {
3949
0
                if (ftell(ssl_keylog_iob) == 0) {
3950
0
                    fputs("# SSL/TLS secrets log file, generated by NSS\n",
3951
0
                          ssl_keylog_iob);
3952
0
                }
3953
0
                SSL_TRACE(("SSL: logging SSL/TLS secrets to %s", ev));
3954
0
                ssl_keylog_lock = PR_NewLock();
3955
0
                if (!ssl_keylog_lock) {
3956
0
                    SSL_TRACE(("SSL: failed to create key log lock"));
3957
0
                    fclose(ssl_keylog_iob);
3958
0
                    ssl_keylog_iob = NULL;
3959
0
                }
3960
0
            }
3961
0
        }
3962
8
#endif
3963
8
        ev = PR_GetEnvSecure("SSLFORCELOCKS");
3964
8
        if (ev && ev[0] == '1') {
3965
0
            ssl_force_locks = PR_TRUE;
3966
0
            ssl_defaults.noLocks = 0;
3967
0
            strcpy(lockStatus + LOCKSTATUS_OFFSET, "FORCED.  ");
3968
0
            SSL_TRACE(("SSL: force_locks set to %d", ssl_force_locks));
3969
0
        }
3970
8
        ev = PR_GetEnvSecure("NSS_SSL_ENABLE_RENEGOTIATION");
3971
8
        if (ev) {
3972
0
            if (ev[0] == '1' || LOWER(ev[0]) == 'u')
3973
0
                ssl_defaults.enableRenegotiation = SSL_RENEGOTIATE_UNRESTRICTED;
3974
0
            else if (ev[0] == '0' || LOWER(ev[0]) == 'n')
3975
0
                ssl_defaults.enableRenegotiation = SSL_RENEGOTIATE_NEVER;
3976
0
            else if (ev[0] == '2' || LOWER(ev[0]) == 'r')
3977
0
                ssl_defaults.enableRenegotiation = SSL_RENEGOTIATE_REQUIRES_XTN;
3978
0
            else if (ev[0] == '3' || LOWER(ev[0]) == 't')
3979
0
                ssl_defaults.enableRenegotiation = SSL_RENEGOTIATE_TRANSITIONAL;
3980
0
            SSL_TRACE(("SSL: enableRenegotiation set to %d",
3981
0
                       ssl_defaults.enableRenegotiation));
3982
0
        }
3983
8
        ev = PR_GetEnvSecure("NSS_SSL_REQUIRE_SAFE_NEGOTIATION");
3984
8
        if (ev && ev[0] == '1') {
3985
0
            ssl_defaults.requireSafeNegotiation = PR_TRUE;
3986
0
            SSL_TRACE(("SSL: requireSafeNegotiation set to %d",
3987
0
                       PR_TRUE));
3988
0
        }
3989
8
        ev = PR_GetEnvSecure("NSS_SSL_CBC_RANDOM_IV");
3990
8
        if (ev && ev[0] == '0') {
3991
0
            ssl_defaults.cbcRandomIV = PR_FALSE;
3992
0
            SSL_TRACE(("SSL: cbcRandomIV set to 0"));
3993
0
        }
3994
8
    }
3995
69.0k
#endif /* NSS_HAVE_GETENV */
3996
69.0k
}
3997
3998
const sslNamedGroupDef *
3999
ssl_LookupNamedGroup(SSLNamedGroup group)
4000
47.4k
{
4001
47.4k
    unsigned int i;
4002
4003
776k
    for (i = 0; i < SSL_NAMED_GROUP_COUNT; ++i) {
4004
757k
        if (ssl_named_groups[i].name == group) {
4005
28.7k
            return &ssl_named_groups[i];
4006
28.7k
        }
4007
757k
    }
4008
18.7k
    return NULL;
4009
47.4k
}
4010
4011
PRBool
4012
ssl_NamedGroupEnabled(const sslSocket *ss, const sslNamedGroupDef *groupDef)
4013
250k
{
4014
250k
    unsigned int i;
4015
4016
250k
    if (!groupDef) {
4017
5
        return PR_FALSE;
4018
5
    }
4019
4020
2.32M
    for (i = 0; i < SSL_NAMED_GROUP_COUNT; ++i) {
4021
2.26M
        if (ss->namedGroupPreferences[i] &&
4022
2.26M
            ss->namedGroupPreferences[i] == groupDef) {
4023
192k
            return PR_TRUE;
4024
192k
        }
4025
2.26M
    }
4026
58.3k
    return PR_FALSE;
4027
250k
}
4028
4029
/* Returns a reference counted object that contains a key pair.
4030
 * Or NULL on failure.  Initial ref count is 1.
4031
 * Uses the keys in the pair as input.  Adopts the keys given.
4032
 */
4033
sslKeyPair *
4034
ssl_NewKeyPair(SECKEYPrivateKey *privKey, SECKEYPublicKey *pubKey)
4035
40.3k
{
4036
40.3k
    sslKeyPair *pair;
4037
4038
40.3k
    if (!privKey || !pubKey) {
4039
0
        PORT_SetError(PR_INVALID_ARGUMENT_ERROR);
4040
0
        return NULL;
4041
0
    }
4042
40.3k
    pair = PORT_ZNew(sslKeyPair);
4043
40.3k
    if (!pair)
4044
0
        return NULL; /* error code is set. */
4045
40.3k
    pair->privKey = privKey;
4046
40.3k
    pair->pubKey = pubKey;
4047
40.3k
    pair->refCount = 1;
4048
40.3k
    return pair; /* success */
4049
40.3k
}
4050
4051
sslKeyPair *
4052
ssl_GetKeyPairRef(sslKeyPair *keyPair)
4053
65.2k
{
4054
65.2k
    PR_ATOMIC_INCREMENT(&keyPair->refCount);
4055
65.2k
    return keyPair;
4056
65.2k
}
4057
4058
void
4059
ssl_FreeKeyPair(sslKeyPair *keyPair)
4060
145k
{
4061
145k
    if (!keyPair) {
4062
40.3k
        return;
4063
40.3k
    }
4064
4065
105k
    PRInt32 newCount = PR_ATOMIC_DECREMENT(&keyPair->refCount);
4066
105k
    if (!newCount) {
4067
40.3k
        SECKEY_DestroyPrivateKey(keyPair->privKey);
4068
40.3k
        SECKEY_DestroyPublicKey(keyPair->pubKey);
4069
40.3k
        PORT_Free(keyPair);
4070
40.3k
    }
4071
105k
}
4072
4073
/* Ephemeral key handling. */
4074
sslEphemeralKeyPair *
4075
ssl_NewEphemeralKeyPair(const sslNamedGroupDef *group,
4076
                        SECKEYPrivateKey *privKey, SECKEYPublicKey *pubKey)
4077
40.3k
{
4078
40.3k
    sslKeyPair *keys;
4079
40.3k
    sslEphemeralKeyPair *pair;
4080
4081
40.3k
    if (!group) {
4082
0
        PORT_SetError(PR_INVALID_ARGUMENT_ERROR);
4083
0
        return NULL;
4084
0
    }
4085
4086
40.3k
    keys = ssl_NewKeyPair(privKey, pubKey);
4087
40.3k
    if (!keys) {
4088
0
        return NULL;
4089
0
    }
4090
4091
40.3k
    pair = PORT_ZNew(sslEphemeralKeyPair);
4092
40.3k
    if (!pair) {
4093
0
        ssl_FreeKeyPair(keys);
4094
0
        return NULL; /* error already set */
4095
0
    }
4096
4097
40.3k
    PR_INIT_CLIST(&pair->link);
4098
40.3k
    pair->group = group;
4099
40.3k
    pair->keys = keys;
4100
40.3k
    pair->kemKeys = NULL;
4101
40.3k
    pair->kemCt = NULL;
4102
4103
40.3k
    return pair;
4104
40.3k
}
4105
4106
sslEphemeralKeyPair *
4107
ssl_CopyEphemeralKeyPair(sslEphemeralKeyPair *keyPair)
4108
0
{
4109
0
    sslEphemeralKeyPair *pair;
4110
4111
0
    pair = PORT_ZNew(sslEphemeralKeyPair);
4112
0
    if (!pair) {
4113
0
        return NULL; /* error already set */
4114
0
    }
4115
4116
0
    pair->kemCt = NULL;
4117
0
    if (keyPair->kemCt) {
4118
0
        pair->kemCt = SECITEM_DupItem(keyPair->kemCt);
4119
0
        if (!pair->kemCt) {
4120
0
            PORT_Free(pair);
4121
0
            return NULL;
4122
0
        }
4123
0
    }
4124
4125
0
    PR_INIT_CLIST(&pair->link);
4126
0
    pair->group = keyPair->group;
4127
0
    pair->keys = ssl_GetKeyPairRef(keyPair->keys);
4128
0
    pair->kemKeys = keyPair->kemKeys ? ssl_GetKeyPairRef(keyPair->kemKeys) : NULL;
4129
4130
0
    return pair;
4131
0
}
4132
4133
void
4134
ssl_FreeEphemeralKeyPair(sslEphemeralKeyPair *keyPair)
4135
40.3k
{
4136
40.3k
    if (!keyPair) {
4137
0
        return;
4138
0
    }
4139
4140
40.3k
    ssl_FreeKeyPair(keyPair->keys);
4141
40.3k
    ssl_FreeKeyPair(keyPair->kemKeys);
4142
40.3k
    SECITEM_FreeItem(keyPair->kemCt, PR_TRUE);
4143
40.3k
    PR_REMOVE_LINK(&keyPair->link);
4144
40.3k
    PORT_Free(keyPair);
4145
40.3k
}
4146
4147
PRBool
4148
ssl_HaveEphemeralKeyPair(const sslSocket *ss, const sslNamedGroupDef *groupDef)
4149
1.12k
{
4150
1.12k
    return ssl_LookupEphemeralKeyPair((sslSocket *)ss, groupDef) != NULL;
4151
1.12k
}
4152
4153
sslEphemeralKeyPair *
4154
ssl_LookupEphemeralKeyPair(sslSocket *ss, const sslNamedGroupDef *groupDef)
4155
2.22k
{
4156
2.22k
    PRCList *cursor;
4157
2.22k
    for (cursor = PR_NEXT_LINK(&ss->ephemeralKeyPairs);
4158
3.35k
         cursor != &ss->ephemeralKeyPairs;
4159
2.22k
         cursor = PR_NEXT_LINK(cursor)) {
4160
2.22k
        sslEphemeralKeyPair *keyPair = (sslEphemeralKeyPair *)cursor;
4161
2.22k
        if (keyPair->group == groupDef) {
4162
1.10k
            return keyPair;
4163
1.10k
        }
4164
2.22k
    }
4165
1.12k
    return NULL;
4166
2.22k
}
4167
4168
void
4169
ssl_FreeEphemeralKeyPairs(sslSocket *ss)
4170
74.7k
{
4171
109k
    while (!PR_CLIST_IS_EMPTY(&ss->ephemeralKeyPairs)) {
4172
34.6k
        PRCList *cursor = PR_LIST_TAIL(&ss->ephemeralKeyPairs);
4173
34.6k
        ssl_FreeEphemeralKeyPair((sslEphemeralKeyPair *)cursor);
4174
34.6k
    }
4175
74.7k
}
4176
4177
PRTime
4178
ssl_Time(const sslSocket *ss)
4179
47.2k
{
4180
47.2k
    if (!ss->now) {
4181
0
        return PR_Now();
4182
0
    }
4183
47.2k
    return ss->now(ss->nowArg);
4184
47.2k
}
4185
4186
/*
4187
** Create a newsocket structure for a file descriptor.
4188
*/
4189
static sslSocket *
4190
ssl_NewSocket(PRBool makeLocks, SSLProtocolVariant protocolVariant)
4191
69.0k
{
4192
69.0k
    SECStatus rv;
4193
69.0k
    sslSocket *ss;
4194
69.0k
    int i;
4195
69.0k
    ssl_SetDefaultsFromEnvironment();
4196
4197
69.0k
    if (ssl_force_locks)
4198
0
        makeLocks = PR_TRUE;
4199
4200
    /* Make a new socket and get it ready */
4201
69.0k
    ss = PORT_ZNew(sslSocket);
4202
69.0k
    if (!ss) {
4203
0
        return NULL;
4204
0
    }
4205
69.0k
    ss->opt = ssl_defaults;
4206
69.0k
    if (protocolVariant == ssl_variant_datagram) {
4207
33.0k
        ss->opt.enableRenegotiation = SSL_RENEGOTIATE_NEVER;
4208
33.0k
    }
4209
69.0k
    ss->opt.useSocks = PR_FALSE;
4210
69.0k
    ss->opt.noLocks = !makeLocks;
4211
69.0k
    ss->vrange = *VERSIONS_DEFAULTS(protocolVariant);
4212
69.0k
    ss->protocolVariant = protocolVariant;
4213
    /* Ignore overlap failures, because returning NULL would trigger assertion
4214
     * failures elsewhere. We don't want this scenario to be fatal, it's just
4215
     * a state where no SSL connectivity is possible. */
4216
69.0k
    ssl3_CreateOverlapWithPolicy(ss->protocolVariant, &ss->vrange, &ss->vrange);
4217
69.0k
    ss->peerID = NULL;
4218
69.0k
    ss->rTimeout = PR_INTERVAL_NO_TIMEOUT;
4219
69.0k
    ss->wTimeout = PR_INTERVAL_NO_TIMEOUT;
4220
69.0k
    ss->cTimeout = PR_INTERVAL_NO_TIMEOUT;
4221
69.0k
    ss->url = NULL;
4222
4223
69.0k
    PR_INIT_CLIST(&ss->serverCerts);
4224
69.0k
    PR_INIT_CLIST(&ss->ephemeralKeyPairs);
4225
69.0k
    PR_INIT_CLIST(&ss->extensionHooks);
4226
69.0k
    PR_INIT_CLIST(&ss->echConfigs);
4227
4228
69.0k
    ss->dbHandle = CERT_GetDefaultCertDB();
4229
4230
    /* Provide default implementation of hooks */
4231
69.0k
    ss->authCertificate = SSL_AuthCertificate;
4232
69.0k
    ss->authCertificateArg = (void *)ss->dbHandle;
4233
69.0k
    ss->sniSocketConfig = NULL;
4234
69.0k
    ss->sniSocketConfigArg = NULL;
4235
69.0k
    ss->getClientAuthData = NULL;
4236
69.0k
    ss->alertReceivedCallback = NULL;
4237
69.0k
    ss->alertReceivedCallbackArg = NULL;
4238
69.0k
    ss->alertSentCallback = NULL;
4239
69.0k
    ss->alertSentCallbackArg = NULL;
4240
69.0k
    ss->handleBadCert = NULL;
4241
69.0k
    ss->badCertArg = NULL;
4242
69.0k
    ss->pkcs11PinArg = NULL;
4243
4244
69.0k
    ssl_ChooseOps(ss);
4245
69.0k
    ssl3_InitSocketPolicy(ss);
4246
2.27M
    for (i = 0; i < SSL_NAMED_GROUP_COUNT; ++i) {
4247
2.21M
        ss->namedGroupPreferences[i] = &ssl_named_groups[i];
4248
2.21M
    }
4249
69.0k
    ss->additionalShares = 0;
4250
69.0k
    PR_INIT_CLIST(&ss->ssl3.hs.remoteExtensions);
4251
69.0k
    PR_INIT_CLIST(&ss->ssl3.hs.lastMessageFlight);
4252
69.0k
    PR_INIT_CLIST(&ss->ssl3.hs.cipherSpecs);
4253
69.0k
    PR_INIT_CLIST(&ss->ssl3.hs.bufferedEarlyData);
4254
69.0k
    ssl3_InitExtensionData(&ss->xtnData, ss);
4255
69.0k
    PR_INIT_CLIST(&ss->ssl3.hs.dtlsSentHandshake);
4256
69.0k
    PR_INIT_CLIST(&ss->ssl3.hs.dtlsRcvdHandshake);
4257
69.0k
    PR_INIT_CLIST(&ss->ssl3.hs.psks);
4258
69.0k
    dtls_InitTimers(ss);
4259
4260
69.0k
    ss->echPrivKey = NULL;
4261
69.0k
    ss->echPubKey = NULL;
4262
69.0k
    ss->antiReplay = NULL;
4263
69.0k
    ss->psk = NULL;
4264
4265
69.0k
    if (makeLocks) {
4266
69.0k
        rv = ssl_MakeLocks(ss);
4267
69.0k
        if (rv != SECSuccess)
4268
0
            goto loser;
4269
69.0k
    }
4270
69.0k
    rv = ssl_CreateSecurityInfo(ss);
4271
69.0k
    if (rv != SECSuccess)
4272
0
        goto loser;
4273
69.0k
    rv = ssl3_InitGather(&ss->gs);
4274
69.0k
    if (rv != SECSuccess)
4275
0
        goto loser;
4276
69.0k
    rv = ssl3_InitState(ss);
4277
69.0k
    if (rv != SECSuccess) {
4278
0
        goto loser;
4279
0
    }
4280
69.0k
    return ss;
4281
4282
0
loser:
4283
0
    ssl_DestroySocketContents(ss);
4284
0
    ssl_DestroyLocks(ss);
4285
0
    PORT_Free(ss);
4286
0
    return NULL;
4287
69.0k
}
4288
4289
/**
4290
 * DEPRECATED: Will always return false.
4291
 */
4292
SECStatus
4293
SSL_CanBypass(CERTCertificate *cert, SECKEYPrivateKey *srvPrivkey,
4294
              PRUint32 protocolmask, PRUint16 *ciphersuites, int nsuites,
4295
              PRBool *pcanbypass, void *pwArg)
4296
0
{
4297
0
    if (!pcanbypass) {
4298
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
4299
0
        return SECFailure;
4300
0
    }
4301
0
    *pcanbypass = PR_FALSE;
4302
0
    return SECSuccess;
4303
0
}
4304
4305
/* Functions that are truly experimental use EXP, functions that are no longer
4306
 * experimental use PUB.
4307
 *
4308
 * When initially defining a new API, add that API here using the EXP() macro
4309
 * and name the function with a SSLExp_ prefix.  Define the experimental API as
4310
 * a macro in sslexp.h using the SSL_EXPERIMENTAL_API() macro defined there.
4311
 *
4312
 * Once an API is stable and proven, move the macro definition in sslexp.h to a
4313
 * proper function declaration in ssl.h.  Keeping the function in this list
4314
 * ensures that code built against the release that contained the experimental
4315
 * API will continue to work; use PUB() to reference the public function.
4316
 */
4317
#define EXP(n)                \
4318
    {                         \
4319
        "SSL_" #n, SSLExp_##n \
4320
    }
4321
#define PUB(n)             \
4322
    {                      \
4323
        "SSL_" #n, SSL_##n \
4324
    }
4325
struct {
4326
    const char *const name;
4327
    void *function;
4328
} ssl_experimental_functions[] = {
4329
#ifndef SSL_DISABLE_EXPERIMENTAL_API
4330
    EXP(AddExternalPsk),
4331
    EXP(AddExternalPsk0Rtt),
4332
    EXP(AeadDecrypt),
4333
    EXP(AeadEncrypt),
4334
    EXP(CallExtensionWriterOnEchInner),
4335
    EXP(CipherSuiteOrderGet),
4336
    EXP(CipherSuiteOrderSet),
4337
    EXP(CreateAntiReplayContext),
4338
    EXP(CreateMask),
4339
    EXP(CreateMaskingContext),
4340
    EXP(CreateVariantMaskingContext),
4341
    EXP(DelegateCredential),
4342
    EXP(DestroyAead),
4343
    EXP(DestroyMaskingContext),
4344
    EXP(DestroyResumptionTokenInfo),
4345
    EXP(EnableTls13BackendEch),
4346
    EXP(EnableTls13GreaseEch),
4347
    EXP(SetTls13GreaseEchSize),
4348
    EXP(EncodeEchConfigId),
4349
    EXP(GetCurrentEpoch),
4350
    EXP(GetEchRetryConfigs),
4351
    EXP(GetExtensionSupport),
4352
    EXP(GetResumptionTokenInfo),
4353
    EXP(HelloRetryRequestCallback),
4354
    EXP(InstallExtensionHooks),
4355
    EXP(HkdfExtract),
4356
    EXP(HkdfExpandLabel),
4357
    EXP(HkdfExpandLabelWithMech),
4358
    EXP(HkdfVariantExpandLabel),
4359
    EXP(HkdfVariantExpandLabelWithMech),
4360
    EXP(KeyUpdate),
4361
    EXP(MakeAead),
4362
    EXP(MakeVariantAead),
4363
    EXP(RecordLayerData),
4364
    EXP(RecordLayerWriteCallback),
4365
    EXP(ReleaseAntiReplayContext),
4366
    EXP(RemoveEchConfigs),
4367
    EXP(RemoveExternalPsk),
4368
    EXP(SecretCallback),
4369
    EXP(SendCertificateRequest),
4370
    EXP(SendSessionTicket),
4371
    EXP(SetAntiReplayContext),
4372
    EXP(SetClientEchConfigs),
4373
    EXP(SetDtls13VersionWorkaround),
4374
    EXP(SetMaxEarlyDataSize),
4375
    EXP(SetResumptionTokenCallback),
4376
    EXP(SetResumptionToken),
4377
    EXP(SetServerEchConfigs),
4378
    EXP(SetTimeFunc),
4379
    EXP(SetCertificateCompressionAlgorithm),
4380
#endif
4381
    { "", NULL }
4382
};
4383
#undef EXP
4384
#undef PUB
4385
4386
void *
4387
SSL_GetExperimentalAPI(const char *name)
4388
138k
{
4389
138k
    unsigned int i;
4390
6.76M
    for (i = 0; i < PR_ARRAY_SIZE(ssl_experimental_functions); ++i) {
4391
6.76M
        if (strcmp(name, ssl_experimental_functions[i].name) == 0) {
4392
138k
            return ssl_experimental_functions[i].function;
4393
138k
        }
4394
6.76M
    }
4395
0
    PORT_SetError(SSL_ERROR_UNSUPPORTED_EXPERIMENTAL_API);
4396
0
    return NULL;
4397
138k
}
4398
4399
void
4400
ssl_ClearPRCList(PRCList *list, void (*f)(void *))
4401
234k
{
4402
234k
    PRCList *cursor;
4403
4404
234k
    while (!PR_CLIST_IS_EMPTY(list)) {
4405
0
        cursor = PR_LIST_TAIL(list);
4406
4407
0
        PR_REMOVE_LINK(cursor);
4408
0
        if (f) {
4409
0
            f(cursor);
4410
0
        }
4411
0
        PORT_Free(cursor);
4412
0
    }
4413
234k
}
4414
4415
SECStatus
4416
SSLExp_EnableTls13GreaseEch(PRFileDesc *fd, PRBool enabled)
4417
0
{
4418
0
    sslSocket *ss = ssl_FindSocket(fd);
4419
0
    if (!ss) {
4420
0
        return SECFailure;
4421
0
    }
4422
0
    ss->opt.enableTls13GreaseEch = enabled;
4423
0
    return SECSuccess;
4424
0
}
4425
4426
SECStatus
4427
SSLExp_SetTls13GreaseEchSize(PRFileDesc *fd, PRUint8 size)
4428
0
{
4429
0
    sslSocket *ss = ssl_FindSocket(fd);
4430
0
    if (!ss || size == 0) {
4431
0
        return SECFailure;
4432
0
    }
4433
0
    ssl_Get1stHandshakeLock(ss);
4434
0
    ssl_GetSSL3HandshakeLock(ss);
4435
4436
0
    ss->ssl3.hs.greaseEchSize = size;
4437
4438
0
    ssl_ReleaseSSL3HandshakeLock(ss);
4439
0
    ssl_Release1stHandshakeLock(ss);
4440
4441
0
    return SECSuccess;
4442
0
}
4443
4444
SECStatus
4445
SSLExp_EnableTls13BackendEch(PRFileDesc *fd, PRBool enabled)
4446
0
{
4447
0
    sslSocket *ss = ssl_FindSocket(fd);
4448
0
    if (!ss) {
4449
0
        return SECFailure;
4450
0
    }
4451
0
    ss->opt.enableTls13BackendEch = enabled;
4452
0
    return SECSuccess;
4453
0
}
4454
4455
SECStatus
4456
SSLExp_CallExtensionWriterOnEchInner(PRFileDesc *fd, PRBool enabled)
4457
0
{
4458
0
    sslSocket *ss = ssl_FindSocket(fd);
4459
0
    if (!ss) {
4460
0
        return SECFailure;
4461
0
    }
4462
0
    ss->opt.callExtensionWriterOnEchInner = enabled;
4463
0
    return SECSuccess;
4464
0
}
4465
4466
SECStatus
4467
SSLExp_SetDtls13VersionWorkaround(PRFileDesc *fd, PRBool enabled)
4468
0
{
4469
0
    sslSocket *ss = ssl_FindSocket(fd);
4470
0
    if (!ss) {
4471
0
        return SECFailure;
4472
0
    }
4473
0
    ss->opt.enableDtls13VersionCompat = enabled;
4474
0
    return SECSuccess;
4475
0
}
4476
4477
SECStatus
4478
SSLExp_SetTimeFunc(PRFileDesc *fd, SSLTimeFunc f, void *arg)
4479
69.0k
{
4480
69.0k
    sslSocket *ss = ssl_FindSocket(fd);
4481
4482
69.0k
    if (!ss) {
4483
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetTimeFunc",
4484
0
                 SSL_GETPID(), fd));
4485
0
        return SECFailure;
4486
0
    }
4487
69.0k
    ss->now = f;
4488
69.0k
    ss->nowArg = arg;
4489
69.0k
    return SECSuccess;
4490
69.0k
}
4491
4492
/* Experimental APIs for session cache handling. */
4493
4494
SECStatus
4495
SSLExp_SetResumptionTokenCallback(PRFileDesc *fd,
4496
                                  SSLResumptionTokenCallback cb,
4497
                                  void *ctx)
4498
0
{
4499
0
    sslSocket *ss = ssl_FindSocket(fd);
4500
4501
0
    if (!ss) {
4502
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetResumptionTokenCallback",
4503
0
                 SSL_GETPID(), fd));
4504
0
        return SECFailure;
4505
0
    }
4506
4507
0
    ssl_Get1stHandshakeLock(ss);
4508
0
    ssl_GetSSL3HandshakeLock(ss);
4509
0
    ss->resumptionTokenCallback = cb;
4510
0
    ss->resumptionTokenContext = ctx;
4511
0
    ssl_ReleaseSSL3HandshakeLock(ss);
4512
0
    ssl_Release1stHandshakeLock(ss);
4513
4514
0
    return SECSuccess;
4515
0
}
4516
4517
SECStatus
4518
SSLExp_SetResumptionToken(PRFileDesc *fd, const PRUint8 *token,
4519
                          unsigned int len)
4520
0
{
4521
0
    sslSocket *ss = ssl_FindSocket(fd);
4522
0
    sslSessionID *sid = NULL;
4523
4524
0
    if (!ss) {
4525
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetResumptionToken",
4526
0
                 SSL_GETPID(), fd));
4527
0
        return SECFailure;
4528
0
    }
4529
4530
0
    ssl_Get1stHandshakeLock(ss);
4531
0
    ssl_GetSSL3HandshakeLock(ss);
4532
4533
0
    if (ss->firstHsDone || ss->ssl3.hs.ws != idle_handshake ||
4534
0
        ss->sec.isServer || len == 0 || !token) {
4535
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
4536
0
        goto loser;
4537
0
    }
4538
4539
    // We override any previously set session.
4540
0
    if (ss->sec.ci.sid) {
4541
0
        ssl_FreeSID(ss->sec.ci.sid);
4542
0
        ss->sec.ci.sid = NULL;
4543
0
    }
4544
4545
0
    PRINT_BUF(50, (ss, "incoming resumption token", token, len));
4546
4547
0
    sid = ssl3_NewSessionID(ss, PR_FALSE);
4548
0
    if (!sid) {
4549
0
        goto loser;
4550
0
    }
4551
4552
    /* Populate NewSessionTicket values */
4553
0
    SECStatus rv = ssl_DecodeResumptionToken(sid, token, len);
4554
0
    if (rv != SECSuccess) {
4555
        // If decoding fails, we assume the token is bad.
4556
0
        PORT_SetError(SSL_ERROR_BAD_RESUMPTION_TOKEN_ERROR);
4557
0
        goto loser;
4558
0
    }
4559
4560
    // Make sure that the token is currently usable.
4561
0
    if (!ssl_IsResumptionTokenUsable(ss, sid)) {
4562
0
        PORT_SetError(SSL_ERROR_BAD_RESUMPTION_TOKEN_ERROR);
4563
0
        goto loser;
4564
0
    }
4565
4566
    // Generate a new random session ID for this ticket.
4567
0
    rv = PK11_GenerateRandom(sid->u.ssl3.sessionID, SSL3_SESSIONID_BYTES);
4568
0
    if (rv != SECSuccess) {
4569
0
        goto loser; // Code set by PK11_GenerateRandom.
4570
0
    }
4571
0
    sid->u.ssl3.sessionIDLength = SSL3_SESSIONID_BYTES;
4572
    /* Use the sid->cached as marker that this is from an external cache and
4573
     * we don't have to look up anything in the NSS internal cache. */
4574
0
    sid->cached = in_external_cache;
4575
0
    sid->lastAccessTime = ssl_Time(ss);
4576
4577
0
    ss->sec.ci.sid = sid;
4578
4579
0
    ssl_ReleaseSSL3HandshakeLock(ss);
4580
0
    ssl_Release1stHandshakeLock(ss);
4581
0
    return SECSuccess;
4582
4583
0
loser:
4584
0
    ssl_FreeSID(sid);
4585
0
    ssl_ReleaseSSL3HandshakeLock(ss);
4586
0
    ssl_Release1stHandshakeLock(ss);
4587
4588
0
    return SECFailure;
4589
0
}
4590
4591
SECStatus
4592
SSLExp_DestroyResumptionTokenInfo(SSLResumptionTokenInfo *token)
4593
0
{
4594
0
    if (!token) {
4595
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
4596
0
        return SECFailure;
4597
0
    }
4598
0
    if (token->peerCert) {
4599
0
        CERT_DestroyCertificate(token->peerCert);
4600
0
    }
4601
0
    PORT_Free(token->alpnSelection);
4602
0
    PORT_Memset(token, 0, token->length);
4603
0
    return SECSuccess;
4604
0
}
4605
4606
SECStatus
4607
SSLExp_GetResumptionTokenInfo(const PRUint8 *tokenData, unsigned int tokenLen,
4608
                              SSLResumptionTokenInfo *tokenOut, PRUintn len)
4609
0
{
4610
0
    if (!tokenData || !tokenOut || !tokenLen ||
4611
0
        len > sizeof(SSLResumptionTokenInfo)) {
4612
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
4613
0
        return SECFailure;
4614
0
    }
4615
0
    sslSessionID sid = { 0 };
4616
0
    SSLResumptionTokenInfo token;
4617
4618
    /* Populate sid values */
4619
0
    if (ssl_DecodeResumptionToken(&sid, tokenData, tokenLen) != SECSuccess) {
4620
        // If decoding fails, we assume the token is bad.
4621
0
        PORT_SetError(SSL_ERROR_BAD_RESUMPTION_TOKEN_ERROR);
4622
0
        return SECFailure;
4623
0
    }
4624
4625
0
    token.peerCert = CERT_DupCertificate(sid.peerCert);
4626
4627
0
    token.alpnSelectionLen = sid.u.ssl3.alpnSelection.len;
4628
0
    token.alpnSelection = PORT_ZAlloc(token.alpnSelectionLen);
4629
0
    if (!token.alpnSelection) {
4630
0
        return SECFailure;
4631
0
    }
4632
0
    if (token.alpnSelectionLen > 0) {
4633
0
        PORT_Assert(sid.u.ssl3.alpnSelection.data);
4634
0
        PORT_Memcpy(token.alpnSelection, sid.u.ssl3.alpnSelection.data,
4635
0
                    token.alpnSelectionLen);
4636
0
    }
4637
4638
0
    if (sid.u.ssl3.locked.sessionTicket.flags & ticket_allow_early_data) {
4639
0
        token.maxEarlyDataSize =
4640
0
            sid.u.ssl3.locked.sessionTicket.max_early_data_size;
4641
0
    } else {
4642
0
        token.maxEarlyDataSize = 0;
4643
0
    }
4644
0
    token.expirationTime = sid.expirationTime;
4645
4646
0
    token.length = PR_MIN(sizeof(SSLResumptionTokenInfo), len);
4647
0
    PORT_Memcpy(tokenOut, &token, token.length);
4648
4649
0
    ssl_DestroySID(&sid, PR_FALSE);
4650
0
    return SECSuccess;
4651
0
}