Coverage Report

Created: 2025-04-22 06:15

/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
24.5k
    (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
static PRCallOnceType ssl_setDefaultsFromEnvironment = { 0 };
128
129
PRBool ssl_force_locks;   /* implicitly PR_FALSE */
130
int ssl_lock_readers = 1; /* default true. */
131
char ssl_debug;
132
char ssl_trace;
133
FILE *ssl_trace_iob;
134
135
#ifdef NSS_ALLOW_SSLKEYLOGFILE
136
FILE *ssl_keylog_iob;
137
PZLock *ssl_keylog_lock;
138
#endif
139
140
/* SRTP_NULL_HMAC_SHA1_80 and SRTP_NULL_HMAC_SHA1_32 are not implemented. */
141
static const PRUint16 srtpCiphers[] = {
142
    SRTP_AES128_CM_HMAC_SHA1_80,
143
    SRTP_AES128_CM_HMAC_SHA1_32,
144
    0
145
};
146
147
/* This list is in preference order.  Note that while some smaller groups appear
148
 * early in the list, smaller groups are generally ignored when iterating
149
 * through this list. ffdhe_custom must not appear in this list. */
150
#define ECGROUP(name, size, oid, assumeSupported)  \
151
    {                                              \
152
        ssl_grp_ec_##name, size, ssl_kea_ecdh,     \
153
            SEC_OID_SECG_EC_##oid, assumeSupported \
154
    }
155
#define FFGROUP(size)                           \
156
    {                                           \
157
        ssl_grp_ffdhe_##size, size, ssl_kea_dh, \
158
            SEC_OID_TLS_FFDHE_##size, PR_TRUE   \
159
    }
160
161
const sslNamedGroupDef ssl_named_groups[] = {
162
    /* Note that 256 for 25519 is a lie, but we only use it for checking bit
163
     * security and expect 256 bits there (not 255). */
164
    { ssl_grp_ec_curve25519, 256, ssl_kea_ecdh, SEC_OID_CURVE25519, PR_TRUE },
165
    ECGROUP(secp256r1, 256, SECP256R1, PR_TRUE),
166
    ECGROUP(secp384r1, 384, SECP384R1, PR_TRUE),
167
    ECGROUP(secp521r1, 521, SECP521R1, PR_TRUE),
168
    { ssl_grp_kem_xyber768d00, 256, ssl_kea_ecdh_hybrid, SEC_OID_XYBER768D00, PR_TRUE },
169
    { ssl_grp_kem_mlkem768x25519, 256, ssl_kea_ecdh_hybrid, SEC_OID_MLKEM768X25519, PR_TRUE },
170
    FFGROUP(2048),
171
    FFGROUP(3072),
172
    FFGROUP(4096),
173
    FFGROUP(6144),
174
    FFGROUP(8192),
175
    ECGROUP(secp192r1, 192, SECP192R1, PR_FALSE),
176
    ECGROUP(secp160r2, 160, SECP160R2, PR_FALSE),
177
    ECGROUP(secp160k1, 160, SECP160K1, PR_FALSE),
178
    ECGROUP(secp160r1, 160, SECP160R1, PR_FALSE),
179
    ECGROUP(sect163k1, 163, SECT163K1, PR_FALSE),
180
    ECGROUP(sect163r1, 163, SECT163R1, PR_FALSE),
181
    ECGROUP(sect163r2, 163, SECT163R2, PR_FALSE),
182
    ECGROUP(secp192k1, 192, SECP192K1, PR_FALSE),
183
    ECGROUP(sect193r1, 193, SECT193R1, PR_FALSE),
184
    ECGROUP(sect193r2, 193, SECT193R2, PR_FALSE),
185
    ECGROUP(secp224r1, 224, SECP224R1, PR_FALSE),
186
    ECGROUP(secp224k1, 224, SECP224K1, PR_FALSE),
187
    ECGROUP(sect233k1, 233, SECT233K1, PR_FALSE),
188
    ECGROUP(sect233r1, 233, SECT233R1, PR_FALSE),
189
    ECGROUP(sect239k1, 239, SECT239K1, PR_FALSE),
190
    ECGROUP(secp256k1, 256, SECP256K1, PR_FALSE),
191
    ECGROUP(sect283k1, 283, SECT283K1, PR_FALSE),
192
    ECGROUP(sect283r1, 283, SECT283R1, PR_FALSE),
193
    ECGROUP(sect409k1, 409, SECT409K1, PR_FALSE),
194
    ECGROUP(sect409r1, 409, SECT409R1, PR_FALSE),
195
    ECGROUP(sect571k1, 571, SECT571K1, PR_FALSE),
196
    ECGROUP(sect571r1, 571, SECT571R1, PR_FALSE),
197
};
198
PR_STATIC_ASSERT(SSL_NAMED_GROUP_COUNT == PR_ARRAY_SIZE(ssl_named_groups));
199
200
#undef ECGROUP
201
#undef FFGROUP
202
203
/* forward declarations. */
204
static sslSocket *ssl_NewSocket(PRBool makeLocks, SSLProtocolVariant variant);
205
static SECStatus ssl_MakeLocks(sslSocket *ss);
206
static PRStatus ssl_SetDefaultsFromEnvironmentCallOnce(void);
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
8.16k
{
221
8.16k
    sslSocket *ss;
222
223
8.16k
    PORT_Assert(fd != NULL);
224
8.16k
    PORT_Assert(fd->methods->file_type == PR_DESC_LAYERED);
225
8.16k
    PORT_Assert(fd->identity == ssl_layer_id);
226
227
8.16k
    if (fd->methods->file_type != PR_DESC_LAYERED ||
228
8.16k
        fd->identity != ssl_layer_id) {
229
0
        PORT_SetError(PR_BAD_DESCRIPTOR_ERROR);
230
0
        return NULL;
231
0
    }
232
233
8.16k
    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
8.16k
    ss->fd = fd;
240
8.16k
    return ss;
241
8.16k
}
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
795k
{
251
795k
    PRFileDesc *layer;
252
795k
    sslSocket *ss;
253
254
795k
    PORT_Assert(fd != NULL);
255
795k
    PORT_Assert(ssl_layer_id != 0);
256
257
795k
    layer = PR_GetIdentitiesLayer(fd, ssl_layer_id);
258
795k
    if (layer == NULL) {
259
0
        PORT_SetError(PR_BAD_DESCRIPTOR_ERROR);
260
0
        return NULL;
261
0
    }
262
263
795k
    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
795k
    ss->fd = layer;
270
795k
    return ss;
271
795k
}
272
273
static sslSocket *
274
ssl_DupSocket(sslSocket *os)
275
8.16k
{
276
8.16k
    sslSocket *ss;
277
8.16k
    SECStatus rv;
278
279
8.16k
    ss = ssl_NewSocket((PRBool)(!os->opt.noLocks), os->protocolVariant);
280
8.16k
    if (!ss) {
281
0
        return NULL;
282
0
    }
283
284
8.16k
    ss->opt = os->opt;
285
8.16k
    ss->opt.useSocks = PR_FALSE;
286
8.16k
    rv = SECITEM_CopyItem(NULL, &ss->opt.nextProtoNego, &os->opt.nextProtoNego);
287
8.16k
    if (rv != SECSuccess) {
288
0
        goto loser;
289
0
    }
290
8.16k
    ss->vrange = os->vrange;
291
8.16k
    ss->now = os->now;
292
8.16k
    ss->nowArg = os->nowArg;
293
294
8.16k
    ss->peerID = !os->peerID ? NULL : PORT_Strdup(os->peerID);
295
8.16k
    ss->url = !os->url ? NULL : PORT_Strdup(os->url);
296
297
8.16k
    ss->ops = os->ops;
298
8.16k
    ss->rTimeout = os->rTimeout;
299
8.16k
    ss->wTimeout = os->wTimeout;
300
8.16k
    ss->cTimeout = os->cTimeout;
301
8.16k
    ss->dbHandle = os->dbHandle;
302
303
    /* copy ssl2&3 policy & prefs, even if it's not selected (yet) */
304
8.16k
    PORT_Memcpy(ss->cipherSuites, os->cipherSuites, sizeof os->cipherSuites);
305
8.16k
    PORT_Memcpy(ss->ssl3.dtlsSRTPCiphers, os->ssl3.dtlsSRTPCiphers,
306
8.16k
                sizeof(PRUint16) * os->ssl3.dtlsSRTPCipherCount);
307
8.16k
    ss->ssl3.dtlsSRTPCipherCount = os->ssl3.dtlsSRTPCipherCount;
308
8.16k
    PORT_Memcpy(ss->ssl3.signatureSchemes, os->ssl3.signatureSchemes,
309
8.16k
                sizeof(ss->ssl3.signatureSchemes[0]) *
310
8.16k
                    os->ssl3.signatureSchemeCount);
311
8.16k
    ss->ssl3.signatureSchemeCount = os->ssl3.signatureSchemeCount;
312
8.16k
    ss->ssl3.downgradeCheckVersion = os->ssl3.downgradeCheckVersion;
313
314
8.16k
    ss->ssl3.dheWeakGroupEnabled = os->ssl3.dheWeakGroupEnabled;
315
316
8.16k
    PORT_Memcpy(ss->ssl3.supportedCertCompressionAlgorithms,
317
8.16k
                os->ssl3.supportedCertCompressionAlgorithms,
318
8.16k
                sizeof(ss->ssl3.supportedCertCompressionAlgorithms[0]) *
319
8.16k
                    os->ssl3.supportedCertCompressionAlgorithmsCount);
320
8.16k
    ss->ssl3.supportedCertCompressionAlgorithmsCount =
321
8.16k
        os->ssl3.supportedCertCompressionAlgorithmsCount;
322
323
8.16k
    if (ss->opt.useSecurity) {
324
8.16k
        PRCList *cursor;
325
326
8.16k
        for (cursor = PR_NEXT_LINK(&os->serverCerts);
327
24.5k
             cursor != &os->serverCerts;
328
16.3k
             cursor = PR_NEXT_LINK(cursor)) {
329
16.3k
            sslServerCert *sc = ssl_CopyServerCert((sslServerCert *)cursor);
330
16.3k
            if (!sc)
331
0
                goto loser;
332
16.3k
            PR_APPEND_LINK(&sc->link, &ss->serverCerts);
333
16.3k
        }
334
335
8.16k
        for (cursor = PR_NEXT_LINK(&os->ephemeralKeyPairs);
336
8.16k
             cursor != &os->ephemeralKeyPairs;
337
8.16k
             cursor = PR_NEXT_LINK(cursor)) {
338
0
            sslEphemeralKeyPair *okp = (sslEphemeralKeyPair *)cursor;
339
0
            sslEphemeralKeyPair *skp = ssl_CopyEphemeralKeyPair(okp);
340
0
            if (!skp)
341
0
                goto loser;
342
0
            PR_APPEND_LINK(&skp->link, &ss->ephemeralKeyPairs);
343
0
        }
344
345
8.16k
        for (cursor = PR_NEXT_LINK(&os->extensionHooks);
346
8.16k
             cursor != &os->extensionHooks;
347
8.16k
             cursor = PR_NEXT_LINK(cursor)) {
348
0
            sslCustomExtensionHooks *oh = (sslCustomExtensionHooks *)cursor;
349
0
            sslCustomExtensionHooks *sh = PORT_ZNew(sslCustomExtensionHooks);
350
0
            if (!sh) {
351
0
                goto loser;
352
0
            }
353
0
            *sh = *oh;
354
0
            PR_APPEND_LINK(&sh->link, &ss->extensionHooks);
355
0
        }
356
357
        /*
358
         * XXX the preceding CERT_ and SECKEY_ functions can fail and return NULL.
359
         * XXX We should detect this, and not just march on with NULL pointers.
360
         */
361
8.16k
        ss->authCertificate = os->authCertificate;
362
8.16k
        ss->authCertificateArg = os->authCertificateArg;
363
8.16k
        ss->getClientAuthData = os->getClientAuthData;
364
8.16k
        ss->getClientAuthDataArg = os->getClientAuthDataArg;
365
8.16k
        ss->sniSocketConfig = os->sniSocketConfig;
366
8.16k
        ss->sniSocketConfigArg = os->sniSocketConfigArg;
367
8.16k
        ss->alertReceivedCallback = os->alertReceivedCallback;
368
8.16k
        ss->alertReceivedCallbackArg = os->alertReceivedCallbackArg;
369
8.16k
        ss->alertSentCallback = os->alertSentCallback;
370
8.16k
        ss->alertSentCallbackArg = os->alertSentCallbackArg;
371
8.16k
        ss->handleBadCert = os->handleBadCert;
372
8.16k
        ss->badCertArg = os->badCertArg;
373
8.16k
        ss->handshakeCallback = os->handshakeCallback;
374
8.16k
        ss->handshakeCallbackData = os->handshakeCallbackData;
375
8.16k
        ss->canFalseStartCallback = os->canFalseStartCallback;
376
8.16k
        ss->canFalseStartCallbackData = os->canFalseStartCallbackData;
377
8.16k
        ss->pkcs11PinArg = os->pkcs11PinArg;
378
8.16k
        ss->nextProtoCallback = os->nextProtoCallback;
379
8.16k
        ss->nextProtoArg = os->nextProtoArg;
380
8.16k
        PORT_Memcpy((void *)ss->namedGroupPreferences,
381
8.16k
                    os->namedGroupPreferences,
382
8.16k
                    sizeof(ss->namedGroupPreferences));
383
8.16k
        ss->additionalShares = os->additionalShares;
384
8.16k
        ss->resumptionTokenCallback = os->resumptionTokenCallback;
385
8.16k
        ss->resumptionTokenContext = os->resumptionTokenContext;
386
387
8.16k
        rv = tls13_CopyEchConfigs(&os->echConfigs, &ss->echConfigs);
388
8.16k
        if (rv != SECSuccess) {
389
0
            goto loser;
390
0
        }
391
8.16k
        if (os->echPrivKey && os->echPubKey) {
392
0
            ss->echPrivKey = SECKEY_CopyPrivateKey(os->echPrivKey);
393
0
            ss->echPubKey = SECKEY_CopyPublicKey(os->echPubKey);
394
0
            if (!ss->echPrivKey || !ss->echPubKey) {
395
0
                goto loser;
396
0
            }
397
0
        }
398
399
8.16k
        if (os->antiReplay) {
400
0
            ss->antiReplay = tls13_RefAntiReplayContext(os->antiReplay);
401
0
            PORT_Assert(ss->antiReplay); /* Can't fail. */
402
0
            if (!ss->antiReplay) {
403
0
                goto loser;
404
0
            }
405
0
        }
406
8.16k
        if (os->psk) {
407
0
            ss->psk = tls13_CopyPsk(os->psk);
408
0
            if (!ss->psk) {
409
0
                goto loser;
410
0
            }
411
0
        }
412
413
        /* Create security data */
414
8.16k
        rv = ssl_CopySecurityInfo(ss, os);
415
8.16k
        if (rv != SECSuccess) {
416
0
            goto loser;
417
0
        }
418
8.16k
    }
419
420
8.16k
    return ss;
421
422
0
loser:
423
0
    ssl_FreeSocket(ss);
424
0
    return NULL;
425
8.16k
}
426
427
static void
428
ssl_DestroyLocks(sslSocket *ss)
429
8.16k
{
430
    /* Destroy locks. */
431
8.16k
    if (ss->firstHandshakeLock) {
432
8.16k
        PZ_DestroyMonitor(ss->firstHandshakeLock);
433
8.16k
        ss->firstHandshakeLock = NULL;
434
8.16k
    }
435
8.16k
    if (ss->ssl3HandshakeLock) {
436
8.16k
        PZ_DestroyMonitor(ss->ssl3HandshakeLock);
437
8.16k
        ss->ssl3HandshakeLock = NULL;
438
8.16k
    }
439
8.16k
    if (ss->specLock) {
440
8.16k
        NSSRWLock_Destroy(ss->specLock);
441
8.16k
        ss->specLock = NULL;
442
8.16k
    }
443
444
8.16k
    if (ss->recvLock) {
445
8.16k
        PZ_DestroyLock(ss->recvLock);
446
8.16k
        ss->recvLock = NULL;
447
8.16k
    }
448
8.16k
    if (ss->sendLock) {
449
8.16k
        PZ_DestroyLock(ss->sendLock);
450
8.16k
        ss->sendLock = NULL;
451
8.16k
    }
452
8.16k
    if (ss->xmitBufLock) {
453
8.16k
        PZ_DestroyMonitor(ss->xmitBufLock);
454
8.16k
        ss->xmitBufLock = NULL;
455
8.16k
    }
456
8.16k
    if (ss->recvBufLock) {
457
8.16k
        PZ_DestroyMonitor(ss->recvBufLock);
458
8.16k
        ss->recvBufLock = NULL;
459
8.16k
    }
460
8.16k
}
461
462
/* Caller holds any relevant locks */
463
static void
464
ssl_DestroySocketContents(sslSocket *ss)
465
8.16k
{
466
8.16k
    PRCList *cursor;
467
468
    /* Free up socket */
469
8.16k
    ssl_DestroySecurityInfo(&ss->sec);
470
471
8.16k
    ssl3_DestroySSL3Info(ss);
472
473
8.16k
    PORT_Free(ss->saveBuf.buf);
474
8.16k
    PORT_Free(ss->pendingBuf.buf);
475
8.16k
    ssl3_DestroyGather(&ss->gs);
476
477
8.16k
    if (ss->peerID != NULL)
478
0
        PORT_Free(ss->peerID);
479
8.16k
    if (ss->url != NULL)
480
8.16k
        PORT_Free((void *)ss->url); /* CONST */
481
482
    /* Clean up server certificates and sundries. */
483
24.5k
    while (!PR_CLIST_IS_EMPTY(&ss->serverCerts)) {
484
16.3k
        cursor = PR_LIST_TAIL(&ss->serverCerts);
485
16.3k
        PR_REMOVE_LINK(cursor);
486
16.3k
        ssl_FreeServerCert((sslServerCert *)cursor);
487
16.3k
    }
488
489
    /* Remove extension handlers. */
490
8.16k
    ssl_ClearPRCList(&ss->extensionHooks, NULL);
491
492
8.16k
    ssl_FreeEphemeralKeyPairs(ss);
493
8.16k
    SECITEM_FreeItem(&ss->opt.nextProtoNego, PR_FALSE);
494
8.16k
    ssl3_FreeSniNameArray(&ss->xtnData);
495
496
8.16k
    ssl_ClearPRCList(&ss->ssl3.hs.dtlsSentHandshake, NULL);
497
8.16k
    ssl_ClearPRCList(&ss->ssl3.hs.dtlsRcvdHandshake, NULL);
498
8.16k
    tls13_DestroyPskList(&ss->ssl3.hs.psks);
499
500
8.16k
    tls13_ReleaseAntiReplayContext(ss->antiReplay);
501
502
8.16k
    tls13_DestroyPsk(ss->psk);
503
504
8.16k
    tls13_DestroyEchConfigs(&ss->echConfigs);
505
8.16k
    SECKEY_DestroyPrivateKey(ss->echPrivKey);
506
8.16k
    SECKEY_DestroyPublicKey(ss->echPubKey);
507
8.16k
}
508
509
/*
510
 * free an sslSocket struct, and all the stuff that hangs off of it
511
 */
512
void
513
ssl_FreeSocket(sslSocket *ss)
514
8.16k
{
515
    /* Get every lock you can imagine!
516
    ** Caller already holds these:
517
    **  SSL_LOCK_READER(ss);
518
    **  SSL_LOCK_WRITER(ss);
519
    */
520
8.16k
    ssl_Get1stHandshakeLock(ss);
521
8.16k
    ssl_GetRecvBufLock(ss);
522
8.16k
    ssl_GetSSL3HandshakeLock(ss);
523
8.16k
    ssl_GetXmitBufLock(ss);
524
8.16k
    ssl_GetSpecWriteLock(ss);
525
526
8.16k
    ssl_DestroySocketContents(ss);
527
528
    /* Release all the locks acquired above.  */
529
8.16k
    SSL_UNLOCK_READER(ss);
530
8.16k
    SSL_UNLOCK_WRITER(ss);
531
8.16k
    ssl_Release1stHandshakeLock(ss);
532
8.16k
    ssl_ReleaseRecvBufLock(ss);
533
8.16k
    ssl_ReleaseSSL3HandshakeLock(ss);
534
8.16k
    ssl_ReleaseXmitBufLock(ss);
535
8.16k
    ssl_ReleaseSpecWriteLock(ss);
536
537
8.16k
    ssl_DestroyLocks(ss);
538
539
8.16k
#ifdef DEBUG
540
8.16k
    PORT_Memset(ss, 0x1f, sizeof *ss);
541
8.16k
#endif
542
8.16k
    PORT_Free(ss);
543
8.16k
    return;
544
8.16k
}
545
546
/************************************************************************/
547
SECStatus
548
ssl_EnableNagleDelay(sslSocket *ss, PRBool enabled)
549
0
{
550
0
    PRFileDesc *osfd = ss->fd->lower;
551
0
    SECStatus rv = SECFailure;
552
0
    PRSocketOptionData opt;
553
554
0
    opt.option = PR_SockOpt_NoDelay;
555
0
    opt.value.no_delay = (PRBool)!enabled;
556
557
0
    if (osfd->methods->setsocketoption) {
558
0
        rv = (SECStatus)osfd->methods->setsocketoption(osfd, &opt);
559
0
    } else {
560
0
        PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
561
0
    }
562
563
0
    return rv;
564
0
}
565
566
static void
567
ssl_ChooseOps(sslSocket *ss)
568
8.16k
{
569
8.16k
    ss->ops = ss->opt.useSecurity ? &ssl_secure_ops : &ssl_default_ops;
570
8.16k
}
571
572
/* Called from SSL_Enable (immediately below) */
573
static SECStatus
574
PrepareSocket(sslSocket *ss)
575
0
{
576
0
    SECStatus rv = SECSuccess;
577
578
0
    ssl_ChooseOps(ss);
579
0
    return rv;
580
0
}
581
582
SECStatus
583
SSL_Enable(PRFileDesc *fd, int which, PRIntn on)
584
0
{
585
0
    return SSL_OptionSet(fd, which, on);
586
0
}
587
588
static PRBool ssl_VersionIsSupportedByPolicy(
589
    SSLProtocolVariant protocolVariant, SSL3ProtocolVersion version);
590
591
/* Implements the semantics for SSL_OptionSet(SSL_ENABLE_TLS, on) described in
592
 * ssl.h in the section "SSL version range setting API".
593
 */
594
static void
595
ssl_EnableTLS(SSLVersionRange *vrange, PRIntn enable)
596
0
{
597
0
    if (enable) {
598
        /* don't turn it on if tls1.0 disallowed by by policy */
599
0
        if (!ssl_VersionIsSupportedByPolicy(ssl_variant_stream,
600
0
                                            SSL_LIBRARY_VERSION_TLS_1_0)) {
601
0
            return;
602
0
        }
603
0
    }
604
0
    if (SSL_ALL_VERSIONS_DISABLED(vrange)) {
605
0
        if (enable) {
606
0
            vrange->min = SSL_LIBRARY_VERSION_TLS_1_0;
607
0
            vrange->max = SSL_LIBRARY_VERSION_TLS_1_0;
608
0
        } /* else don't change anything */
609
0
        return;
610
0
    }
611
612
0
    if (enable) {
613
        /* Expand the range of enabled version to include TLS 1.0 */
614
0
        vrange->min = PR_MIN(vrange->min, SSL_LIBRARY_VERSION_TLS_1_0);
615
0
        vrange->max = PR_MAX(vrange->max, SSL_LIBRARY_VERSION_TLS_1_0);
616
0
    } else {
617
        /* Disable all TLS versions, leaving only SSL 3.0 if it was enabled */
618
0
        if (vrange->min == SSL_LIBRARY_VERSION_3_0) {
619
0
            vrange->max = SSL_LIBRARY_VERSION_3_0;
620
0
        } else {
621
            /* Only TLS was enabled, so now no versions are. */
622
0
            vrange->min = SSL_LIBRARY_VERSION_NONE;
623
0
            vrange->max = SSL_LIBRARY_VERSION_NONE;
624
0
        }
625
0
    }
626
0
}
627
628
/* Implements the semantics for SSL_OptionSet(SSL_ENABLE_SSL3, on) described in
629
 * ssl.h in the section "SSL version range setting API".
630
 */
631
static void
632
ssl_EnableSSL3(SSLVersionRange *vrange, PRIntn enable)
633
0
{
634
0
    if (enable) {
635
        /* don't turn it on if ssl3 disallowed by by policy */
636
0
        if (!ssl_VersionIsSupportedByPolicy(ssl_variant_stream,
637
0
                                            SSL_LIBRARY_VERSION_3_0)) {
638
0
            return;
639
0
        }
640
0
    }
641
0
    if (SSL_ALL_VERSIONS_DISABLED(vrange)) {
642
0
        if (enable) {
643
0
            vrange->min = SSL_LIBRARY_VERSION_3_0;
644
0
            vrange->max = SSL_LIBRARY_VERSION_3_0;
645
0
        } /* else don't change anything */
646
0
        return;
647
0
    }
648
649
0
    if (enable) {
650
        /* Expand the range of enabled versions to include SSL 3.0. We know
651
         * SSL 3.0 or some version of TLS is already enabled at this point, so
652
         * we don't need to change vrange->max.
653
         */
654
0
        vrange->min = SSL_LIBRARY_VERSION_3_0;
655
0
    } else {
656
        /* Disable SSL 3.0, leaving TLS unaffected. */
657
0
        if (vrange->max > SSL_LIBRARY_VERSION_3_0) {
658
0
            vrange->min = PR_MAX(vrange->min, SSL_LIBRARY_VERSION_TLS_1_0);
659
0
        } else {
660
            /* Only SSL 3.0 was enabled, so now no versions are. */
661
0
            vrange->min = SSL_LIBRARY_VERSION_NONE;
662
0
            vrange->max = SSL_LIBRARY_VERSION_NONE;
663
0
        }
664
0
    }
665
0
}
666
667
SECStatus
668
SSL_OptionSet(PRFileDesc *fd, PRInt32 which, PRIntn val)
669
130k
{
670
130k
    sslSocket *ss = ssl_FindSocket(fd);
671
130k
    SECStatus rv = SECSuccess;
672
130k
    PRBool holdingLocks;
673
674
130k
    if (!ss) {
675
0
        SSL_DBG(("%d: SSL[%d]: bad socket in Enable", SSL_GETPID(), fd));
676
0
        return SECFailure;
677
0
    }
678
679
130k
    holdingLocks = (!ss->opt.noLocks);
680
130k
    ssl_Get1stHandshakeLock(ss);
681
130k
    ssl_GetSSL3HandshakeLock(ss);
682
683
130k
    switch (which) {
684
0
        case SSL_SOCKS:
685
0
            ss->opt.useSocks = PR_FALSE;
686
0
            rv = PrepareSocket(ss);
687
0
            if (val) {
688
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
689
0
                rv = SECFailure;
690
0
            }
691
0
            break;
692
693
0
        case SSL_SECURITY:
694
0
            ss->opt.useSecurity = val;
695
0
            rv = PrepareSocket(ss);
696
0
            break;
697
698
8.16k
        case SSL_REQUEST_CERTIFICATE:
699
8.16k
            ss->opt.requestCertificate = val;
700
8.16k
            break;
701
702
8.16k
        case SSL_REQUIRE_CERTIFICATE:
703
8.16k
            ss->opt.requireCertificate = val;
704
8.16k
            break;
705
706
0
        case SSL_HANDSHAKE_AS_CLIENT:
707
0
            if (ss->opt.handshakeAsServer && val) {
708
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
709
0
                rv = SECFailure;
710
0
                break;
711
0
            }
712
0
            ss->opt.handshakeAsClient = val;
713
0
            break;
714
715
0
        case SSL_HANDSHAKE_AS_SERVER:
716
0
            if (ss->opt.handshakeAsClient && val) {
717
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
718
0
                rv = SECFailure;
719
0
                break;
720
0
            }
721
0
            ss->opt.handshakeAsServer = val;
722
0
            break;
723
724
0
        case SSL_ENABLE_TLS:
725
0
            if (IS_DTLS(ss)) {
726
0
                if (val) {
727
0
                    PORT_SetError(SEC_ERROR_INVALID_ARGS);
728
0
                    rv = SECFailure; /* not allowed */
729
0
                }
730
0
                break;
731
0
            }
732
0
            ssl_EnableTLS(&ss->vrange, val);
733
0
            break;
734
735
0
        case SSL_ENABLE_SSL3:
736
0
            if (IS_DTLS(ss)) {
737
0
                if (val) {
738
0
                    PORT_SetError(SEC_ERROR_INVALID_ARGS);
739
0
                    rv = SECFailure; /* not allowed */
740
0
                }
741
0
                break;
742
0
            }
743
0
            ssl_EnableSSL3(&ss->vrange, val);
744
0
            break;
745
746
0
        case SSL_ENABLE_SSL2:
747
0
        case SSL_V2_COMPATIBLE_HELLO:
748
            /* We no longer support SSL v2.
749
             * However, if an old application requests to disable SSL v2,
750
             * we shouldn't fail.
751
             */
752
0
            if (val) {
753
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
754
0
                rv = SECFailure;
755
0
            }
756
0
            break;
757
758
8.16k
        case SSL_NO_CACHE:
759
8.16k
            ss->opt.noCache = val;
760
8.16k
            break;
761
762
0
        case SSL_ENABLE_FDX:
763
0
            if (val && ss->opt.noLocks) {
764
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
765
0
                rv = SECFailure;
766
0
            }
767
0
            ss->opt.fdx = val;
768
0
            break;
769
770
0
        case SSL_ROLLBACK_DETECTION:
771
0
            ss->opt.detectRollBack = val;
772
0
            break;
773
774
0
        case SSL_NO_STEP_DOWN:
775
0
            break;
776
777
0
        case SSL_BYPASS_PKCS11:
778
0
            break;
779
780
8.16k
        case SSL_NO_LOCKS:
781
8.16k
            if (val && ss->opt.fdx) {
782
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
783
0
                rv = SECFailure;
784
0
            }
785
8.16k
            if (val && ssl_force_locks)
786
0
                val = PR_FALSE; /* silent override */
787
8.16k
            ss->opt.noLocks = val;
788
8.16k
            if (!val && !holdingLocks) {
789
0
                rv = ssl_MakeLocks(ss);
790
0
                if (rv != SECSuccess) {
791
0
                    ss->opt.noLocks = PR_TRUE;
792
0
                }
793
0
            }
794
8.16k
            break;
795
796
8.16k
        case SSL_ENABLE_SESSION_TICKETS:
797
8.16k
            ss->opt.enableSessionTickets = val;
798
8.16k
            break;
799
800
8.16k
        case SSL_ENABLE_DEFLATE:
801
8.16k
            ss->opt.enableDeflate = val;
802
8.16k
            break;
803
804
8.16k
        case SSL_ENABLE_RENEGOTIATION:
805
8.16k
            if (IS_DTLS(ss) && val != SSL_RENEGOTIATE_NEVER) {
806
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
807
0
                rv = SECFailure;
808
0
                break;
809
0
            }
810
8.16k
            ss->opt.enableRenegotiation = val;
811
8.16k
            break;
812
813
8.16k
        case SSL_REQUIRE_SAFE_NEGOTIATION:
814
8.16k
            ss->opt.requireSafeNegotiation = val;
815
8.16k
            break;
816
817
0
        case SSL_ENABLE_FALSE_START:
818
0
            ss->opt.enableFalseStart = val;
819
0
            break;
820
821
8.16k
        case SSL_CBC_RANDOM_IV:
822
8.16k
            ss->opt.cbcRandomIV = val;
823
8.16k
            break;
824
825
0
        case SSL_ENABLE_OCSP_STAPLING:
826
0
            ss->opt.enableOCSPStapling = val;
827
0
            break;
828
829
8.16k
        case SSL_ENABLE_DELEGATED_CREDENTIALS:
830
8.16k
            ss->opt.enableDelegatedCredentials = val;
831
8.16k
            break;
832
833
0
        case SSL_ENABLE_NPN:
834
0
            break;
835
836
8.16k
        case SSL_ENABLE_ALPN:
837
8.16k
            ss->opt.enableALPN = val;
838
8.16k
            break;
839
840
0
        case SSL_REUSE_SERVER_ECDHE_KEY:
841
0
            ss->opt.reuseServerECDHEKey = val;
842
0
            break;
843
844
8.16k
        case SSL_ENABLE_FALLBACK_SCSV:
845
8.16k
            ss->opt.enableFallbackSCSV = val;
846
8.16k
            break;
847
848
0
        case SSL_ENABLE_SERVER_DHE:
849
0
            ss->opt.enableServerDhe = val;
850
0
            break;
851
852
8.16k
        case SSL_ENABLE_EXTENDED_MASTER_SECRET:
853
8.16k
            ss->opt.enableExtendedMS = val;
854
8.16k
            break;
855
856
0
        case SSL_ENABLE_SIGNED_CERT_TIMESTAMPS:
857
0
            ss->opt.enableSignedCertTimestamps = val;
858
0
            break;
859
860
0
        case SSL_REQUIRE_DH_NAMED_GROUPS:
861
0
            ss->opt.requireDHENamedGroups = val;
862
0
            break;
863
864
8.16k
        case SSL_ENABLE_0RTT_DATA:
865
8.16k
            ss->opt.enable0RttData = val;
866
8.16k
            break;
867
868
0
        case SSL_RECORD_SIZE_LIMIT:
869
0
            if (val < 64 || val > (MAX_FRAGMENT_LENGTH + 1)) {
870
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
871
0
                rv = SECFailure;
872
0
            } else {
873
0
                ss->opt.recordSizeLimit = val;
874
0
            }
875
0
            break;
876
877
0
        case SSL_ENABLE_TLS13_COMPAT_MODE:
878
0
            ss->opt.enableTls13CompatMode = val;
879
0
            break;
880
881
8.16k
        case SSL_ENABLE_DTLS_SHORT_HEADER:
882
8.16k
            ss->opt.enableDtlsShortHeader = val;
883
8.16k
            break;
884
885
0
        case SSL_ENABLE_HELLO_DOWNGRADE_CHECK:
886
0
            ss->opt.enableHelloDowngradeCheck = val;
887
0
            break;
888
889
0
        case SSL_ENABLE_V2_COMPATIBLE_HELLO:
890
0
            ss->opt.enableV2CompatibleHello = val;
891
0
            break;
892
893
0
        case SSL_ENABLE_POST_HANDSHAKE_AUTH:
894
0
            ss->opt.enablePostHandshakeAuth = val;
895
0
            break;
896
897
0
        case SSL_SUPPRESS_END_OF_EARLY_DATA:
898
0
            ss->opt.suppressEndOfEarlyData = val;
899
0
            break;
900
901
8.16k
        case SSL_ENABLE_GREASE:
902
8.16k
            ss->opt.enableGrease = val;
903
8.16k
            break;
904
905
0
        case SSL_ENABLE_CH_EXTENSION_PERMUTATION:
906
0
            ss->opt.enableChXtnPermutation = val;
907
0
            break;
908
909
0
        default:
910
0
            PORT_SetError(SEC_ERROR_INVALID_ARGS);
911
0
            rv = SECFailure;
912
130k
    }
913
914
    /* We can't use the macros for releasing the locks here,
915
     * because ss->opt.noLocks might have changed just above.
916
     * We must release these locks (monitors) here, if we aquired them above,
917
     * regardless of the current value of ss->opt.noLocks.
918
     */
919
130k
    if (holdingLocks) {
920
118k
        PZ_ExitMonitor((ss)->ssl3HandshakeLock);
921
118k
        PZ_ExitMonitor((ss)->firstHandshakeLock);
922
118k
    }
923
924
130k
    return rv;
925
130k
}
926
927
SECStatus
928
SSL_OptionGet(PRFileDesc *fd, PRInt32 which, PRIntn *pVal)
929
0
{
930
0
    sslSocket *ss = ssl_FindSocket(fd);
931
0
    SECStatus rv = SECSuccess;
932
0
    PRIntn val = PR_FALSE;
933
934
0
    if (!pVal) {
935
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
936
0
        return SECFailure;
937
0
    }
938
0
    if (!ss) {
939
0
        SSL_DBG(("%d: SSL[%d]: bad socket in Enable", SSL_GETPID(), fd));
940
0
        *pVal = PR_FALSE;
941
0
        return SECFailure;
942
0
    }
943
944
0
    ssl_Get1stHandshakeLock(ss);
945
0
    ssl_GetSSL3HandshakeLock(ss);
946
947
0
    switch (which) {
948
0
        case SSL_SOCKS:
949
0
            val = PR_FALSE;
950
0
            break;
951
0
        case SSL_SECURITY:
952
0
            val = ss->opt.useSecurity;
953
0
            break;
954
0
        case SSL_REQUEST_CERTIFICATE:
955
0
            val = ss->opt.requestCertificate;
956
0
            break;
957
0
        case SSL_REQUIRE_CERTIFICATE:
958
0
            val = ss->opt.requireCertificate;
959
0
            break;
960
0
        case SSL_HANDSHAKE_AS_CLIENT:
961
0
            val = ss->opt.handshakeAsClient;
962
0
            break;
963
0
        case SSL_HANDSHAKE_AS_SERVER:
964
0
            val = ss->opt.handshakeAsServer;
965
0
            break;
966
0
        case SSL_ENABLE_TLS:
967
0
            val = ss->vrange.max >= SSL_LIBRARY_VERSION_TLS_1_0;
968
0
            break;
969
0
        case SSL_ENABLE_SSL3:
970
0
            val = ss->vrange.min == SSL_LIBRARY_VERSION_3_0;
971
0
            break;
972
0
        case SSL_ENABLE_SSL2:
973
0
        case SSL_V2_COMPATIBLE_HELLO:
974
0
            val = PR_FALSE;
975
0
            break;
976
0
        case SSL_NO_CACHE:
977
0
            val = ss->opt.noCache;
978
0
            break;
979
0
        case SSL_ENABLE_FDX:
980
0
            val = ss->opt.fdx;
981
0
            break;
982
0
        case SSL_ROLLBACK_DETECTION:
983
0
            val = ss->opt.detectRollBack;
984
0
            break;
985
0
        case SSL_NO_STEP_DOWN:
986
0
            val = PR_FALSE;
987
0
            break;
988
0
        case SSL_BYPASS_PKCS11:
989
0
            val = PR_FALSE;
990
0
            break;
991
0
        case SSL_NO_LOCKS:
992
0
            val = ss->opt.noLocks;
993
0
            break;
994
0
        case SSL_ENABLE_SESSION_TICKETS:
995
0
            val = ss->opt.enableSessionTickets;
996
0
            break;
997
0
        case SSL_ENABLE_DEFLATE:
998
0
            val = ss->opt.enableDeflate;
999
0
            break;
1000
0
        case SSL_ENABLE_RENEGOTIATION:
1001
0
            val = ss->opt.enableRenegotiation;
1002
0
            break;
1003
0
        case SSL_REQUIRE_SAFE_NEGOTIATION:
1004
0
            val = ss->opt.requireSafeNegotiation;
1005
0
            break;
1006
0
        case SSL_ENABLE_FALSE_START:
1007
0
            val = ss->opt.enableFalseStart;
1008
0
            break;
1009
0
        case SSL_CBC_RANDOM_IV:
1010
0
            val = ss->opt.cbcRandomIV;
1011
0
            break;
1012
0
        case SSL_ENABLE_OCSP_STAPLING:
1013
0
            val = ss->opt.enableOCSPStapling;
1014
0
            break;
1015
0
        case SSL_ENABLE_DELEGATED_CREDENTIALS:
1016
0
            val = ss->opt.enableDelegatedCredentials;
1017
0
            break;
1018
0
        case SSL_ENABLE_NPN:
1019
0
            val = PR_FALSE;
1020
0
            break;
1021
0
        case SSL_ENABLE_ALPN:
1022
0
            val = ss->opt.enableALPN;
1023
0
            break;
1024
0
        case SSL_REUSE_SERVER_ECDHE_KEY:
1025
0
            val = ss->opt.reuseServerECDHEKey;
1026
0
            break;
1027
0
        case SSL_ENABLE_FALLBACK_SCSV:
1028
0
            val = ss->opt.enableFallbackSCSV;
1029
0
            break;
1030
0
        case SSL_ENABLE_SERVER_DHE:
1031
0
            val = ss->opt.enableServerDhe;
1032
0
            break;
1033
0
        case SSL_ENABLE_EXTENDED_MASTER_SECRET:
1034
0
            val = ss->opt.enableExtendedMS;
1035
0
            break;
1036
0
        case SSL_ENABLE_SIGNED_CERT_TIMESTAMPS:
1037
0
            val = ss->opt.enableSignedCertTimestamps;
1038
0
            break;
1039
0
        case SSL_REQUIRE_DH_NAMED_GROUPS:
1040
0
            val = ss->opt.requireDHENamedGroups;
1041
0
            break;
1042
0
        case SSL_ENABLE_0RTT_DATA:
1043
0
            val = ss->opt.enable0RttData;
1044
0
            break;
1045
0
        case SSL_RECORD_SIZE_LIMIT:
1046
0
            val = ss->opt.recordSizeLimit;
1047
0
            break;
1048
0
        case SSL_ENABLE_TLS13_COMPAT_MODE:
1049
0
            val = ss->opt.enableTls13CompatMode;
1050
0
            break;
1051
0
        case SSL_ENABLE_DTLS_SHORT_HEADER:
1052
0
            val = ss->opt.enableDtlsShortHeader;
1053
0
            break;
1054
0
        case SSL_ENABLE_HELLO_DOWNGRADE_CHECK:
1055
0
            val = ss->opt.enableHelloDowngradeCheck;
1056
0
            break;
1057
0
        case SSL_ENABLE_V2_COMPATIBLE_HELLO:
1058
0
            val = ss->opt.enableV2CompatibleHello;
1059
0
            break;
1060
0
        case SSL_ENABLE_POST_HANDSHAKE_AUTH:
1061
0
            val = ss->opt.enablePostHandshakeAuth;
1062
0
            break;
1063
0
        case SSL_SUPPRESS_END_OF_EARLY_DATA:
1064
0
            val = ss->opt.suppressEndOfEarlyData;
1065
0
            break;
1066
0
        default:
1067
0
            PORT_SetError(SEC_ERROR_INVALID_ARGS);
1068
0
            rv = SECFailure;
1069
0
    }
1070
1071
0
    ssl_ReleaseSSL3HandshakeLock(ss);
1072
0
    ssl_Release1stHandshakeLock(ss);
1073
1074
0
    *pVal = val;
1075
0
    return rv;
1076
0
}
1077
1078
SECStatus
1079
SSL_OptionGetDefault(PRInt32 which, PRIntn *pVal)
1080
0
{
1081
0
    SECStatus rv = SECSuccess;
1082
0
    PRIntn val = PR_FALSE;
1083
1084
0
    if (!pVal) {
1085
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
1086
0
        return SECFailure;
1087
0
    }
1088
1089
0
    ssl_SetDefaultsFromEnvironment();
1090
1091
0
    switch (which) {
1092
0
        case SSL_SOCKS:
1093
0
            val = PR_FALSE;
1094
0
            break;
1095
0
        case SSL_SECURITY:
1096
0
            val = ssl_defaults.useSecurity;
1097
0
            break;
1098
0
        case SSL_REQUEST_CERTIFICATE:
1099
0
            val = ssl_defaults.requestCertificate;
1100
0
            break;
1101
0
        case SSL_REQUIRE_CERTIFICATE:
1102
0
            val = ssl_defaults.requireCertificate;
1103
0
            break;
1104
0
        case SSL_HANDSHAKE_AS_CLIENT:
1105
0
            val = ssl_defaults.handshakeAsClient;
1106
0
            break;
1107
0
        case SSL_HANDSHAKE_AS_SERVER:
1108
0
            val = ssl_defaults.handshakeAsServer;
1109
0
            break;
1110
0
        case SSL_ENABLE_TLS:
1111
0
            val = versions_defaults_stream.max >= SSL_LIBRARY_VERSION_TLS_1_0;
1112
0
            break;
1113
0
        case SSL_ENABLE_SSL3:
1114
0
            val = versions_defaults_stream.min == SSL_LIBRARY_VERSION_3_0;
1115
0
            break;
1116
0
        case SSL_ENABLE_SSL2:
1117
0
        case SSL_V2_COMPATIBLE_HELLO:
1118
0
            val = PR_FALSE;
1119
0
            break;
1120
0
        case SSL_NO_CACHE:
1121
0
            val = ssl_defaults.noCache;
1122
0
            break;
1123
0
        case SSL_ENABLE_FDX:
1124
0
            val = ssl_defaults.fdx;
1125
0
            break;
1126
0
        case SSL_ROLLBACK_DETECTION:
1127
0
            val = ssl_defaults.detectRollBack;
1128
0
            break;
1129
0
        case SSL_NO_STEP_DOWN:
1130
0
            val = PR_FALSE;
1131
0
            break;
1132
0
        case SSL_BYPASS_PKCS11:
1133
0
            val = PR_FALSE;
1134
0
            break;
1135
0
        case SSL_NO_LOCKS:
1136
0
            val = ssl_defaults.noLocks;
1137
0
            break;
1138
0
        case SSL_ENABLE_SESSION_TICKETS:
1139
0
            val = ssl_defaults.enableSessionTickets;
1140
0
            break;
1141
0
        case SSL_ENABLE_DEFLATE:
1142
0
            val = ssl_defaults.enableDeflate;
1143
0
            break;
1144
0
        case SSL_ENABLE_RENEGOTIATION:
1145
0
            val = ssl_defaults.enableRenegotiation;
1146
0
            break;
1147
0
        case SSL_REQUIRE_SAFE_NEGOTIATION:
1148
0
            val = ssl_defaults.requireSafeNegotiation;
1149
0
            break;
1150
0
        case SSL_ENABLE_FALSE_START:
1151
0
            val = ssl_defaults.enableFalseStart;
1152
0
            break;
1153
0
        case SSL_CBC_RANDOM_IV:
1154
0
            val = ssl_defaults.cbcRandomIV;
1155
0
            break;
1156
0
        case SSL_ENABLE_OCSP_STAPLING:
1157
0
            val = ssl_defaults.enableOCSPStapling;
1158
0
            break;
1159
0
        case SSL_ENABLE_DELEGATED_CREDENTIALS:
1160
0
            val = ssl_defaults.enableDelegatedCredentials;
1161
0
            break;
1162
0
        case SSL_ENABLE_NPN:
1163
0
            val = PR_FALSE;
1164
0
            break;
1165
0
        case SSL_ENABLE_ALPN:
1166
0
            val = ssl_defaults.enableALPN;
1167
0
            break;
1168
0
        case SSL_REUSE_SERVER_ECDHE_KEY:
1169
0
            val = ssl_defaults.reuseServerECDHEKey;
1170
0
            break;
1171
0
        case SSL_ENABLE_FALLBACK_SCSV:
1172
0
            val = ssl_defaults.enableFallbackSCSV;
1173
0
            break;
1174
0
        case SSL_ENABLE_SERVER_DHE:
1175
0
            val = ssl_defaults.enableServerDhe;
1176
0
            break;
1177
0
        case SSL_ENABLE_EXTENDED_MASTER_SECRET:
1178
0
            val = ssl_defaults.enableExtendedMS;
1179
0
            break;
1180
0
        case SSL_ENABLE_SIGNED_CERT_TIMESTAMPS:
1181
0
            val = ssl_defaults.enableSignedCertTimestamps;
1182
0
            break;
1183
0
        case SSL_ENABLE_0RTT_DATA:
1184
0
            val = ssl_defaults.enable0RttData;
1185
0
            break;
1186
0
        case SSL_RECORD_SIZE_LIMIT:
1187
0
            val = ssl_defaults.recordSizeLimit;
1188
0
            break;
1189
0
        case SSL_ENABLE_TLS13_COMPAT_MODE:
1190
0
            val = ssl_defaults.enableTls13CompatMode;
1191
0
            break;
1192
0
        case SSL_ENABLE_DTLS_SHORT_HEADER:
1193
0
            val = ssl_defaults.enableDtlsShortHeader;
1194
0
            break;
1195
0
        case SSL_ENABLE_HELLO_DOWNGRADE_CHECK:
1196
0
            val = ssl_defaults.enableHelloDowngradeCheck;
1197
0
            break;
1198
0
        case SSL_ENABLE_V2_COMPATIBLE_HELLO:
1199
0
            val = ssl_defaults.enableV2CompatibleHello;
1200
0
            break;
1201
0
        case SSL_ENABLE_POST_HANDSHAKE_AUTH:
1202
0
            val = ssl_defaults.enablePostHandshakeAuth;
1203
0
            break;
1204
0
        case SSL_SUPPRESS_END_OF_EARLY_DATA:
1205
0
            val = ssl_defaults.suppressEndOfEarlyData;
1206
0
            break;
1207
0
        default:
1208
0
            PORT_SetError(SEC_ERROR_INVALID_ARGS);
1209
0
            rv = SECFailure;
1210
0
    }
1211
1212
0
    *pVal = val;
1213
0
    return rv;
1214
0
}
1215
1216
/* XXX Use Global Lock to protect this stuff. */
1217
SECStatus
1218
SSL_EnableDefault(int which, PRIntn val)
1219
0
{
1220
0
    return SSL_OptionSetDefault(which, val);
1221
0
}
1222
1223
SECStatus
1224
SSL_OptionSetDefault(PRInt32 which, PRIntn val)
1225
0
{
1226
0
    SECStatus status = ssl_Init();
1227
1228
0
    if (status != SECSuccess) {
1229
0
        return status;
1230
0
    }
1231
1232
0
    ssl_SetDefaultsFromEnvironment();
1233
1234
0
    switch (which) {
1235
0
        case SSL_SOCKS:
1236
0
            ssl_defaults.useSocks = PR_FALSE;
1237
0
            if (val) {
1238
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
1239
0
                return SECFailure;
1240
0
            }
1241
0
            break;
1242
1243
0
        case SSL_SECURITY:
1244
0
            ssl_defaults.useSecurity = val;
1245
0
            break;
1246
1247
0
        case SSL_REQUEST_CERTIFICATE:
1248
0
            ssl_defaults.requestCertificate = val;
1249
0
            break;
1250
1251
0
        case SSL_REQUIRE_CERTIFICATE:
1252
0
            ssl_defaults.requireCertificate = val;
1253
0
            break;
1254
1255
0
        case SSL_HANDSHAKE_AS_CLIENT:
1256
0
            if (ssl_defaults.handshakeAsServer && val) {
1257
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
1258
0
                return SECFailure;
1259
0
            }
1260
0
            ssl_defaults.handshakeAsClient = val;
1261
0
            break;
1262
1263
0
        case SSL_HANDSHAKE_AS_SERVER:
1264
0
            if (ssl_defaults.handshakeAsClient && val) {
1265
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
1266
0
                return SECFailure;
1267
0
            }
1268
0
            ssl_defaults.handshakeAsServer = val;
1269
0
            break;
1270
1271
0
        case SSL_ENABLE_TLS:
1272
0
            ssl_EnableTLS(&versions_defaults_stream, val);
1273
0
            break;
1274
1275
0
        case SSL_ENABLE_SSL3:
1276
0
            ssl_EnableSSL3(&versions_defaults_stream, val);
1277
0
            break;
1278
1279
0
        case SSL_ENABLE_SSL2:
1280
0
        case SSL_V2_COMPATIBLE_HELLO:
1281
            /* We no longer support SSL v2.
1282
             * However, if an old application requests to disable SSL v2,
1283
             * we shouldn't fail.
1284
             */
1285
0
            if (val) {
1286
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
1287
0
                return SECFailure;
1288
0
            }
1289
0
            break;
1290
1291
0
        case SSL_NO_CACHE:
1292
0
            ssl_defaults.noCache = val;
1293
0
            break;
1294
1295
0
        case SSL_ENABLE_FDX:
1296
0
            if (val && ssl_defaults.noLocks) {
1297
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
1298
0
                return SECFailure;
1299
0
            }
1300
0
            ssl_defaults.fdx = val;
1301
0
            break;
1302
1303
0
        case SSL_ROLLBACK_DETECTION:
1304
0
            ssl_defaults.detectRollBack = val;
1305
0
            break;
1306
1307
0
        case SSL_NO_STEP_DOWN:
1308
0
            break;
1309
1310
0
        case SSL_BYPASS_PKCS11:
1311
0
            break;
1312
1313
0
        case SSL_NO_LOCKS:
1314
0
            if (val && ssl_defaults.fdx) {
1315
0
                PORT_SetError(SEC_ERROR_INVALID_ARGS);
1316
0
                return SECFailure;
1317
0
            }
1318
0
            if (val && ssl_force_locks)
1319
0
                val = PR_FALSE; /* silent override */
1320
0
            ssl_defaults.noLocks = val;
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
579k
{
1441
579k
    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
579k
        default:
1447
579k
            return PR_FALSE;
1448
579k
    }
1449
579k
}
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
579k
{
1566
579k
    sslSocket *ss = ssl_FindSocket(fd);
1567
579k
    PRInt32 locks;
1568
579k
    SECStatus rv;
1569
1570
579k
    if (!ss) {
1571
0
        SSL_DBG(("%d: SSL[%d]: bad socket in CipherPrefSet", SSL_GETPID(), fd));
1572
0
        return SECFailure;
1573
0
    }
1574
579k
    rv = NSS_OptionGet(NSS_DEFAULT_LOCKS, &locks);
1575
579k
    if ((rv == SECSuccess) && (locks & NSS_DEFAULT_SSL_LOCK)) {
1576
0
        return SECSuccess;
1577
0
    }
1578
579k
    if (ssl_IsRemovedCipherSuite(which))
1579
0
        return SECSuccess;
1580
579k
    return ssl3_CipherPrefSet(ss, (ssl3CipherSuite)which, enabled);
1581
579k
}
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
                           PRUint16 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
2.20k
#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
2.56k
{
1992
2.56k
    switch (groupDef->name) {
1993
2.10k
        case ssl_grp_ffdhe_2048:
1994
2.10k
            return &ff_dhe_2048_params;
1995
235
        case ssl_grp_ffdhe_3072:
1996
235
            return &ff_dhe_3072_params;
1997
17
        case ssl_grp_ffdhe_4096:
1998
17
            return &ff_dhe_4096_params;
1999
84
        case ssl_grp_ffdhe_6144:
2000
84
            return &ff_dhe_6144_params;
2001
127
        case ssl_grp_ffdhe_8192:
2002
127
            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
2.56k
    }
2009
0
    return NULL;
2010
2.56k
}
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.80k
{
2016
1.80k
    unsigned int size_p = SECKEY_BigIntegerBitLength(dh_p);
2017
1.80k
    unsigned int size_y = SECKEY_BigIntegerBitLength(dh_Ys);
2018
1.80k
    unsigned int commonPart;
2019
1.80k
    int cmp;
2020
2021
1.80k
    if (dh_p->len == 0 || dh_Ys->len == 0) {
2022
5
        return PR_FALSE;
2023
5
    }
2024
    /* Check that the prime is at least odd. */
2025
1.79k
    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.79k
    if (size_y <= 1 || size_y > size_p) {
2030
40
        return PR_FALSE;
2031
40
    }
2032
    /* If dh_Ys is shorter, then it's definitely smaller than p-1. */
2033
1.75k
    if (size_y < size_p) {
2034
1.60k
        return PR_TRUE;
2035
1.60k
    }
2036
2037
    /* Compare the common part of each, minus the final octet. */
2038
156
    commonPart = (size_p + 7) / 8;
2039
156
    PORT_Assert(commonPart <= dh_Ys->len);
2040
156
    PORT_Assert(commonPart <= dh_p->len);
2041
156
    cmp = PORT_Memcmp(dh_Ys->data + dh_Ys->len - commonPart,
2042
156
                      dh_p->data + dh_p->len - commonPart, commonPart - 1);
2043
156
    if (cmp < 0) {
2044
146
        return PR_TRUE;
2045
146
    }
2046
10
    if (cmp > 0) {
2047
10
        return PR_FALSE;
2048
10
    }
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
0
    if (dh_Ys->data[dh_Ys->len - 1] >= (dh_p->data[dh_p->len - 1] - 1)) {
2054
0
        return PR_FALSE;
2055
0
    }
2056
2057
0
    return PR_TRUE;
2058
0
}
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
0
{
2073
0
    unsigned int i;
2074
2075
0
    for (i = 0; i < SSL_NAMED_GROUP_COUNT; ++i) {
2076
0
        const ssl3DHParams *params;
2077
0
        if (!ss->namedGroupPreferences[i]) {
2078
0
            continue;
2079
0
        }
2080
0
        if (ss->namedGroupPreferences[i]->keaType != ssl_kea_dh) {
2081
0
            continue;
2082
0
        }
2083
2084
0
        params = ssl_GetDHEParams(ss->namedGroupPreferences[i]);
2085
0
        PORT_Assert(params);
2086
0
        if (SECITEM_ItemsAreEqual(&params->prime, dh_p)) {
2087
0
            if (!SECITEM_ItemsAreEqual(&params->base, dh_g)) {
2088
0
                return SECFailure;
2089
0
            }
2090
0
            if (groupDef)
2091
0
                *groupDef = ss->namedGroupPreferences[i];
2092
0
            if (dhParams)
2093
0
                *dhParams = params;
2094
0
            return SECSuccess;
2095
0
        }
2096
0
    }
2097
2098
0
    return SECFailure;
2099
0
}
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
2.20k
{
2106
2.20k
    unsigned int i;
2107
2.20k
    static const sslNamedGroupDef weak_group_def = {
2108
2.20k
        ssl_grp_ffdhe_custom, WEAK_DHE_SIZE, ssl_kea_dh,
2109
2.20k
        SEC_OID_TLS_DHE_CUSTOM, PR_TRUE
2110
2.20k
    };
2111
2.20k
    PRInt32 minDH;
2112
2.20k
    SECStatus rv;
2113
2114
    // make sure we select a group consistent with our
2115
    // current policy policy
2116
2.20k
    rv = NSS_OptionGet(NSS_DH_MIN_KEY_SIZE, &minDH);
2117
2.20k
    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
2.20k
    if (ss->ssl3.dheWeakGroupEnabled &&
2124
2.20k
        ss->version < SSL_LIBRARY_VERSION_TLS_1_3 &&
2125
2.20k
        !ss->xtnData.peerSupportsFfdheGroups &&
2126
2.20k
        weak_group_def.bits >= minDH) {
2127
0
        *groupDef = &weak_group_def;
2128
0
        return SECSuccess;
2129
0
    }
2130
2.20k
    if (ss->ssl3.dhePreferredGroup &&
2131
2.20k
        ssl_NamedGroupEnabled(ss, ss->ssl3.dhePreferredGroup) &&
2132
2.20k
        ss->ssl3.dhePreferredGroup->bits >= minDH) {
2133
0
        *groupDef = ss->ssl3.dhePreferredGroup;
2134
0
        return SECSuccess;
2135
0
    }
2136
16.1k
    for (i = 0; i < SSL_NAMED_GROUP_COUNT; ++i) {
2137
16.1k
        if (ss->namedGroupPreferences[i] &&
2138
16.1k
            ss->namedGroupPreferences[i]->keaType == ssl_kea_dh &&
2139
16.1k
            ss->namedGroupPreferences[i]->bits >= minDH) {
2140
2.20k
            *groupDef = ss->namedGroupPreferences[i];
2141
2.20k
            return SECSuccess;
2142
2.20k
        }
2143
16.1k
    }
2144
2145
0
    *groupDef = NULL;
2146
0
    PORT_SetError(SSL_ERROR_NO_CYPHER_OVERLAP);
2147
0
    return SECFailure;
2148
2.20k
}
2149
2150
/* LOCKS ??? XXX */
2151
static PRFileDesc *
2152
ssl_ImportFD(PRFileDesc *model, PRFileDesc *fd, SSLProtocolVariant variant)
2153
8.16k
{
2154
8.16k
    sslSocket *ns = NULL;
2155
8.16k
    PRStatus rv;
2156
8.16k
    PRNetAddr addr;
2157
8.16k
    SECStatus status = ssl_Init();
2158
2159
8.16k
    if (status != SECSuccess) {
2160
0
        return NULL;
2161
0
    }
2162
2163
8.16k
    if (model == NULL) {
2164
        /* Just create a default socket if we're given NULL for the model */
2165
1
        ns = ssl_NewSocket((PRBool)(!ssl_defaults.noLocks), variant);
2166
8.16k
    } else {
2167
8.16k
        sslSocket *ss = ssl_FindSocket(model);
2168
8.16k
        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
8.16k
        ns = ssl_DupSocket(ss);
2174
8.16k
    }
2175
8.16k
    if (ns == NULL)
2176
0
        return NULL;
2177
2178
8.16k
    rv = ssl_PushIOLayer(ns, fd, PR_TOP_IO_LAYER);
2179
8.16k
    if (rv != PR_SUCCESS) {
2180
0
        ssl_FreeSocket(ns);
2181
0
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
2182
0
        return NULL;
2183
0
    }
2184
8.16k
#if defined(DEBUG) || defined(FORCE_PR_ASSERT)
2185
8.16k
    {
2186
8.16k
        sslSocket *ss = ssl_FindSocket(fd);
2187
8.16k
        PORT_Assert(ss == ns);
2188
8.16k
    }
2189
8.16k
#endif
2190
8.16k
    ns->TCPconnected = (PR_SUCCESS == ssl_DefGetpeername(ns, &addr));
2191
8.16k
    return fd;
2192
8.16k
}
2193
2194
PRFileDesc *
2195
SSL_ImportFD(PRFileDesc *model, PRFileDesc *fd)
2196
8.16k
{
2197
8.16k
    return ssl_ImportFD(model, fd, ssl_variant_stream);
2198
8.16k
}
2199
2200
PRFileDesc *
2201
DTLS_ImportFD(PRFileDesc *model, PRFileDesc *fd)
2202
0
{
2203
0
    return ssl_ImportFD(model, fd, ssl_variant_datagram);
2204
0
}
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
49.9k
{
2586
49.9k
    SECStatus rv;
2587
49.9k
    PRUint32 policyFlag;
2588
49.9k
    PRInt32 minPolicy, maxPolicy;
2589
2590
49.9k
    if (variant == ssl_variant_stream) {
2591
33.6k
        effectivePolicy->min = SSL_LIBRARY_VERSION_MIN_SUPPORTED_STREAM;
2592
33.6k
        effectivePolicy->max = SSL_LIBRARY_VERSION_MAX_SUPPORTED;
2593
33.6k
    } else {
2594
16.3k
        effectivePolicy->min = SSL_LIBRARY_VERSION_MIN_SUPPORTED_DATAGRAM;
2595
16.3k
        effectivePolicy->max = SSL_LIBRARY_VERSION_MAX_SUPPORTED;
2596
16.3k
    }
2597
2598
49.9k
    rv = NSS_GetAlgorithmPolicy(SEC_OID_APPLY_SSL_POLICY, &policyFlag);
2599
49.9k
    if ((rv != SECSuccess) || !(policyFlag & NSS_USE_POLICY_IN_SSL)) {
2600
        /* Policy is not active, report library extents. */
2601
49.9k
        return SECSuccess;
2602
49.9k
    }
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
44.1k
{
2634
44.1k
    SECStatus rv;
2635
44.1k
    SSLVersionRange effectivePolicyBoundary;
2636
44.1k
    SSLVersionRange vrange;
2637
2638
44.1k
    PORT_Assert(input != NULL);
2639
2640
44.1k
    rv = ssl3_GetEffectiveVersionPolicy(protocolVariant,
2641
44.1k
                                        &effectivePolicyBoundary);
2642
44.1k
    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
44.1k
    vrange.min = PR_MAX(input->min, effectivePolicyBoundary.min);
2649
44.1k
    vrange.max = PR_MIN(input->max, effectivePolicyBoundary.max);
2650
2651
44.1k
    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
44.1k
    *overlap = vrange;
2658
44.1k
    return SECSuccess;
2659
44.1k
}
2660
2661
static PRBool
2662
ssl_VersionIsSupportedByPolicy(SSLProtocolVariant protocolVariant,
2663
                               SSL3ProtocolVersion version)
2664
5.86k
{
2665
5.86k
    SECStatus rv;
2666
5.86k
    SSLVersionRange effectivePolicyBoundary;
2667
2668
5.86k
    rv = ssl3_GetEffectiveVersionPolicy(protocolVariant,
2669
5.86k
                                        &effectivePolicyBoundary);
2670
5.86k
    if (rv == SECFailure) {
2671
        /* SECFailure means internal failure or invalid configuration. */
2672
0
        return PR_FALSE;
2673
0
    }
2674
5.86k
    return version >= effectivePolicyBoundary.min &&
2675
5.86k
           version <= effectivePolicyBoundary.max;
2676
5.86k
}
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
45.1k
{
2701
45.1k
    switch (protocolVariant) {
2702
28.7k
        case ssl_variant_stream:
2703
28.7k
            return (version >= SSL_LIBRARY_VERSION_MIN_SUPPORTED_STREAM &&
2704
28.7k
                    version <= SSL_LIBRARY_VERSION_MAX_SUPPORTED);
2705
16.3k
        case ssl_variant_datagram:
2706
16.3k
            return (version >= SSL_LIBRARY_VERSION_MIN_SUPPORTED_DATAGRAM &&
2707
16.3k
                    version <= SSL_LIBRARY_VERSION_MAX_SUPPORTED);
2708
45.1k
    }
2709
2710
    /* Can't get here */
2711
0
    PORT_Assert(PR_FALSE);
2712
0
    return PR_FALSE;
2713
45.1k
}
2714
2715
PRBool
2716
ssl3_VersionIsSupported(SSLProtocolVariant protocolVariant,
2717
                        SSL3ProtocolVersion version)
2718
5.86k
{
2719
5.86k
    if (!ssl_VersionIsSupportedByPolicy(protocolVariant, version)) {
2720
0
        return PR_FALSE;
2721
0
    }
2722
5.86k
    return ssl3_VersionIsSupportedByCode(protocolVariant, version);
2723
5.86k
}
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
16.3k
{
2748
16.3k
    SECStatus rv;
2749
2750
16.3k
    if (!vrange) {
2751
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
2752
0
        return SECFailure;
2753
0
    }
2754
2755
16.3k
    switch (protocolVariant) {
2756
8.16k
        case ssl_variant_stream:
2757
8.16k
            vrange->min = SSL_LIBRARY_VERSION_MIN_SUPPORTED_STREAM;
2758
8.16k
            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
8.16k
            break;
2764
8.16k
        case ssl_variant_datagram:
2765
8.16k
            vrange->min = SSL_LIBRARY_VERSION_MIN_SUPPORTED_DATAGRAM;
2766
8.16k
            vrange->max = SSL_LIBRARY_VERSION_MAX_SUPPORTED;
2767
8.16k
            break;
2768
0
        default:
2769
0
            PORT_SetError(SEC_ERROR_INVALID_ARGS);
2770
0
            return SECFailure;
2771
16.3k
    }
2772
2773
16.3k
    rv = ssl3_CreateOverlapWithPolicy(protocolVariant, vrange, vrange);
2774
16.3k
    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
16.3k
    if (vrange->max >= SSL_LIBRARY_VERSION_TLS_1_3) {
2781
16.3k
        vrange->min = PR_MAX(vrange->min, SSL_LIBRARY_VERSION_TLS_1_0);
2782
16.3k
    }
2783
2784
16.3k
    return SECSuccess;
2785
16.3k
}
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
19.6k
{
2805
19.6k
    return (vrange->min <= SSL_LIBRARY_VERSION_3_0 &&
2806
19.6k
            vrange->max >= SSL_LIBRARY_VERSION_TLS_1_3);
2807
19.6k
}
2808
2809
static SECStatus
2810
ssl3_CheckRangeValidAndConstrainByPolicy(SSLProtocolVariant protocolVariant,
2811
                                         SSLVersionRange *vrange)
2812
19.6k
{
2813
19.6k
    SECStatus rv;
2814
2815
19.6k
    if (vrange->min > vrange->max ||
2816
19.6k
        !ssl3_VersionIsSupportedByCode(protocolVariant, vrange->min) ||
2817
19.6k
        !ssl3_VersionIsSupportedByCode(protocolVariant, vrange->max) ||
2818
19.6k
        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
19.6k
    rv = ssl3_CreateOverlapWithPolicy(protocolVariant, vrange, vrange);
2828
19.6k
    if (rv != SECSuccess) {
2829
0
        return rv;
2830
0
    }
2831
2832
    /* We don't allow SSLv3 and TLSv1.3 together */
2833
19.6k
    if (vrange->max >= SSL_LIBRARY_VERSION_TLS_1_3) {
2834
17.8k
        vrange->min = PR_MAX(vrange->min, SSL_LIBRARY_VERSION_TLS_1_0);
2835
17.8k
    }
2836
2837
19.6k
    return SECSuccess;
2838
19.6k
}
2839
2840
SECStatus
2841
SSL_VersionRangeSetDefault(SSLProtocolVariant protocolVariant,
2842
                           const SSLVersionRange *vrange)
2843
16.3k
{
2844
16.3k
    SSLVersionRange constrainedRange;
2845
16.3k
    SECStatus rv;
2846
2847
16.3k
    if (!vrange) {
2848
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
2849
0
        return SECFailure;
2850
0
    }
2851
2852
16.3k
    constrainedRange = *vrange;
2853
16.3k
    rv = ssl3_CheckRangeValidAndConstrainByPolicy(protocolVariant,
2854
16.3k
                                                  &constrainedRange);
2855
16.3k
    if (rv != SECSuccess)
2856
0
        return rv;
2857
2858
16.3k
    *VERSIONS_DEFAULTS(protocolVariant) = constrainedRange;
2859
16.3k
    return SECSuccess;
2860
16.3k
}
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
3.28k
{
2892
3.28k
    SSLVersionRange constrainedRange;
2893
3.28k
    sslSocket *ss;
2894
3.28k
    SECStatus rv;
2895
2896
3.28k
    if (!vrange) {
2897
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
2898
0
        return SECFailure;
2899
0
    }
2900
2901
3.28k
    ss = ssl_FindSocket(fd);
2902
3.28k
    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
3.28k
    constrainedRange = *vrange;
2909
3.28k
    rv = ssl3_CheckRangeValidAndConstrainByPolicy(ss->protocolVariant,
2910
3.28k
                                                  &constrainedRange);
2911
3.28k
    if (rv != SECSuccess)
2912
0
        return rv;
2913
2914
3.28k
    ssl_Get1stHandshakeLock(ss);
2915
3.28k
    ssl_GetSSL3HandshakeLock(ss);
2916
2917
3.28k
    if (ss->ssl3.downgradeCheckVersion &&
2918
3.28k
        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
3.28k
    ss->vrange = constrainedRange;
2926
2927
3.28k
    ssl_ReleaseSSL3HandshakeLock(ss);
2928
3.28k
    ssl_Release1stHandshakeLock(ss);
2929
2930
3.28k
    return SECSuccess;
2931
3.28k
}
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
8.16k
{
3158
8.16k
    sslSocket *ss;
3159
8.16k
    PRStatus rv;
3160
3161
8.16k
    ss = ssl_GetPrivate(fd);
3162
8.16k
    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
8.16k
    SSL_LOCK_READER(ss);
3169
8.16k
    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
8.16k
    rv = (PRStatus)(*ss->ops->close)(ss);
3178
3179
8.16k
    return rv;
3180
8.16k
}
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
0
{
3227
0
    sslSocket *ss;
3228
0
    int rv;
3229
3230
0
    ss = ssl_GetPrivate(fd);
3231
0
    if (!ss) {
3232
0
        SSL_DBG(("%d: SSL[%d]: bad socket in read", SSL_GETPID(), fd));
3233
0
        return SECFailure;
3234
0
    }
3235
0
    SSL_LOCK_READER(ss);
3236
0
    ss->rTimeout = PR_INTERVAL_NO_TIMEOUT;
3237
0
    if (!ss->opt.fdx)
3238
0
        ss->wTimeout = PR_INTERVAL_NO_TIMEOUT;
3239
0
    rv = (*ss->ops->read)(ss, (unsigned char *)buf, len);
3240
0
    SSL_UNLOCK_READER(ss);
3241
0
    return rv;
3242
0
}
3243
3244
static int PR_CALLBACK
3245
ssl_Write(PRFileDesc *fd, const void *buf, PRInt32 len)
3246
0
{
3247
0
    sslSocket *ss;
3248
0
    int rv;
3249
3250
0
    ss = ssl_GetPrivate(fd);
3251
0
    if (!ss) {
3252
0
        SSL_DBG(("%d: SSL[%d]: bad socket in write", SSL_GETPID(), fd));
3253
0
        return SECFailure;
3254
0
    }
3255
0
    SSL_LOCK_WRITER(ss);
3256
0
    ss->wTimeout = PR_INTERVAL_NO_TIMEOUT;
3257
0
    if (!ss->opt.fdx)
3258
0
        ss->rTimeout = PR_INTERVAL_NO_TIMEOUT;
3259
0
    rv = (*ss->ops->write)(ss, (const unsigned char *)buf, len);
3260
0
    SSL_UNLOCK_WRITER(ss);
3261
0
    return rv;
3262
0
}
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
7.56k
{
3282
7.56k
    PRFileDesc *osfd;
3283
7.56k
    int rv;
3284
7.56k
    PRNetAddr sin;
3285
3286
7.56k
    osfd = ss->fd->lower;
3287
3288
7.56k
    PORT_Memset(&sin, 0, sizeof(sin));
3289
7.56k
    rv = osfd->methods->getpeername(osfd, &sin);
3290
7.56k
    if (rv < 0) {
3291
0
        return SECFailure;
3292
0
    }
3293
7.56k
    ss->TCPconnected = 1;
3294
7.56k
    if (sin.inet.family == PR_AF_INET) {
3295
7.56k
        PR_ConvertIPv4AddrToIPv6(sin.inet.ip, &ss->sec.ci.peer);
3296
7.56k
        ss->sec.ci.port = sin.inet.port;
3297
7.56k
    } 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
7.56k
    return SECSuccess;
3305
7.56k
}
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
8.16k
{
3486
8.16k
    PRSocketOptionData opt;
3487
8.16k
    PRStatus status;
3488
3489
8.16k
    opt.option = PR_SockOpt_Nonblocking;
3490
8.16k
    opt.value.non_blocking = PR_FALSE;
3491
8.16k
    status = PR_GetSocketOption(fd, &opt);
3492
8.16k
    if (status != PR_SUCCESS)
3493
0
        return PR_FALSE;
3494
8.16k
    return (PRBool)!opt.value.non_blocking;
3495
8.16k
}
3496
3497
PRBool
3498
ssl_SocketIsBlocking(sslSocket *ss)
3499
8.16k
{
3500
8.16k
    return ssl_FdIsBlocking(ss->fd);
3501
8.16k
}
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
1
{
3780
1
    PRIOMethods *new_methods = &combined_methods;
3781
1
    const PRIOMethods *nspr_methods = PR_GetDefaultIOMethods();
3782
1
    const PRIOMethods *my_methods = &ssl_methods;
3783
3784
1
    *new_methods = *nspr_methods;
3785
3786
1
    new_methods->file_type = my_methods->file_type;
3787
1
    new_methods->close = my_methods->close;
3788
1
    new_methods->read = my_methods->read;
3789
1
    new_methods->write = my_methods->write;
3790
1
    new_methods->available = my_methods->available;
3791
1
    new_methods->available64 = my_methods->available64;
3792
1
    new_methods->fsync = my_methods->fsync;
3793
1
    new_methods->seek = my_methods->seek;
3794
1
    new_methods->seek64 = my_methods->seek64;
3795
1
    new_methods->fileInfo = my_methods->fileInfo;
3796
1
    new_methods->fileInfo64 = my_methods->fileInfo64;
3797
1
    new_methods->writev = my_methods->writev;
3798
1
    new_methods->connect = my_methods->connect;
3799
1
    new_methods->accept = my_methods->accept;
3800
1
    new_methods->bind = my_methods->bind;
3801
1
    new_methods->listen = my_methods->listen;
3802
1
    new_methods->shutdown = my_methods->shutdown;
3803
1
    new_methods->recv = my_methods->recv;
3804
1
    new_methods->send = my_methods->send;
3805
1
    new_methods->recvfrom = my_methods->recvfrom;
3806
1
    new_methods->sendto = my_methods->sendto;
3807
1
    new_methods->poll = my_methods->poll;
3808
1
    new_methods->acceptread = my_methods->acceptread;
3809
1
    new_methods->transmitfile = my_methods->transmitfile;
3810
1
    new_methods->getsockname = my_methods->getsockname;
3811
1
    new_methods->getpeername = my_methods->getpeername;
3812
    /*  new_methods->getsocketoption   = my_methods->getsocketoption;       */
3813
    /*  new_methods->setsocketoption   = my_methods->setsocketoption;       */
3814
1
    new_methods->sendfile = my_methods->sendfile;
3815
1
}
3816
3817
static PRCallOnceType initIoLayerOnce;
3818
3819
static PRStatus
3820
ssl_InitIOLayer(void)
3821
1
{
3822
1
    ssl_layer_id = PR_GetUniqueIdentity("SSL");
3823
1
    ssl_SetupIOMethods();
3824
1
    return PR_SUCCESS;
3825
1
}
3826
3827
static PRStatus
3828
ssl_PushIOLayer(sslSocket *ns, PRFileDesc *stack, PRDescIdentity id)
3829
8.16k
{
3830
8.16k
    PRFileDesc *layer = NULL;
3831
8.16k
    PRStatus status;
3832
3833
8.16k
    status = PR_CallOnce(&initIoLayerOnce, &ssl_InitIOLayer);
3834
8.16k
    if (status != PR_SUCCESS) {
3835
0
        goto loser;
3836
0
    }
3837
8.16k
    if (ns == NULL) {
3838
0
        goto loser;
3839
0
    }
3840
8.16k
    layer = PR_CreateIOLayerStub(ssl_layer_id, &combined_methods);
3841
8.16k
    if (layer == NULL)
3842
0
        goto loser;
3843
8.16k
    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
8.16k
    status = PR_PushIOLayer(stack, id, layer);
3857
8.16k
    if (status != PR_SUCCESS)
3858
0
        goto loser;
3859
3860
8.16k
    ns->fd = (id == PR_TOP_IO_LAYER) ? stack : layer;
3861
8.16k
    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
8.16k
}
3869
3870
/* if this fails, caller must destroy socket. */
3871
static SECStatus
3872
ssl_MakeLocks(sslSocket *ss)
3873
8.16k
{
3874
8.16k
    ss->firstHandshakeLock = PZ_NewMonitor(nssILockSSL);
3875
8.16k
    if (!ss->firstHandshakeLock)
3876
0
        goto loser;
3877
8.16k
    ss->ssl3HandshakeLock = PZ_NewMonitor(nssILockSSL);
3878
8.16k
    if (!ss->ssl3HandshakeLock)
3879
0
        goto loser;
3880
8.16k
    ss->specLock = NSSRWLock_New(SSL_LOCK_RANK_SPEC, NULL);
3881
8.16k
    if (!ss->specLock)
3882
0
        goto loser;
3883
8.16k
    ss->recvBufLock = PZ_NewMonitor(nssILockSSL);
3884
8.16k
    if (!ss->recvBufLock)
3885
0
        goto loser;
3886
8.16k
    ss->xmitBufLock = PZ_NewMonitor(nssILockSSL);
3887
8.16k
    if (!ss->xmitBufLock)
3888
0
        goto loser;
3889
8.16k
    ss->writerThread = NULL;
3890
8.16k
    if (ssl_lock_readers) {
3891
8.16k
        ss->recvLock = PZ_NewLock(nssILockSSL);
3892
8.16k
        if (!ss->recvLock)
3893
0
            goto loser;
3894
8.16k
        ss->sendLock = PZ_NewLock(nssILockSSL);
3895
8.16k
        if (!ss->sendLock)
3896
0
            goto loser;
3897
8.16k
    }
3898
8.16k
    return SECSuccess;
3899
0
loser:
3900
0
    ssl_DestroyLocks(ss);
3901
0
    return SECFailure;
3902
8.16k
}
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 PRStatus
3911
ssl_SetDefaultsFromEnvironmentCallOnce(void)
3912
1
{
3913
1
#if defined(NSS_HAVE_GETENV)
3914
1
    char *ev;
3915
1
#ifdef DEBUG
3916
1
    ssl_trace_iob = NULL;
3917
1
    ev = PR_GetEnvSecure("SSLDEBUGFILE");
3918
1
    if (ev && ev[0]) {
3919
0
        ssl_trace_iob = fopen(ev, "w");
3920
0
    }
3921
1
    if (!ssl_trace_iob) {
3922
1
        ssl_trace_iob = stderr;
3923
1
    }
3924
1
#ifdef TRACE
3925
1
    ev = PR_GetEnvSecure("SSLTRACE");
3926
1
    if (ev && ev[0]) {
3927
0
        ssl_trace = atoi(ev);
3928
0
        SSL_TRACE(("SSL: tracing set to %d", ssl_trace));
3929
0
    }
3930
1
#endif /* TRACE */
3931
1
    ev = PR_GetEnvSecure("SSLDEBUG");
3932
1
    if (ev && ev[0]) {
3933
0
        ssl_debug = atoi(ev);
3934
0
        SSL_TRACE(("SSL: debugging set to %d", ssl_debug));
3935
0
    }
3936
1
#endif /* DEBUG */
3937
1
#ifdef NSS_ALLOW_SSLKEYLOGFILE
3938
1
    ssl_keylog_iob = NULL;
3939
1
    ev = PR_GetEnvSecure("SSLKEYLOGFILE");
3940
1
    if (ev && ev[0]) {
3941
0
        ssl_keylog_iob = fopen(ev, "a");
3942
0
        if (!ssl_keylog_iob) {
3943
0
            SSL_TRACE(("SSL: failed to open key log file"));
3944
0
        } else {
3945
0
            if (ftell(ssl_keylog_iob) == 0) {
3946
0
                fputs("# SSL/TLS secrets log file, generated by NSS\n",
3947
0
                      ssl_keylog_iob);
3948
0
            }
3949
0
            SSL_TRACE(("SSL: logging SSL/TLS secrets to %s", ev));
3950
0
            ssl_keylog_lock = PR_NewLock();
3951
0
            if (!ssl_keylog_lock) {
3952
0
                SSL_TRACE(("SSL: failed to create key log lock"));
3953
0
                fclose(ssl_keylog_iob);
3954
0
                ssl_keylog_iob = NULL;
3955
0
            }
3956
0
        }
3957
0
    }
3958
1
#endif
3959
1
    ev = PR_GetEnvSecure("SSLFORCELOCKS");
3960
1
    if (ev && ev[0] == '1') {
3961
0
        ssl_force_locks = PR_TRUE;
3962
0
        ssl_defaults.noLocks = 0;
3963
0
        SSL_TRACE(("SSL: force_locks set to %d", ssl_force_locks));
3964
0
    }
3965
1
    ev = PR_GetEnvSecure("NSS_SSL_ENABLE_RENEGOTIATION");
3966
1
    if (ev) {
3967
0
        if (ev[0] == '1' || LOWER(ev[0]) == 'u')
3968
0
            ssl_defaults.enableRenegotiation = SSL_RENEGOTIATE_UNRESTRICTED;
3969
0
        else if (ev[0] == '0' || LOWER(ev[0]) == 'n')
3970
0
            ssl_defaults.enableRenegotiation = SSL_RENEGOTIATE_NEVER;
3971
0
        else if (ev[0] == '2' || LOWER(ev[0]) == 'r')
3972
0
            ssl_defaults.enableRenegotiation = SSL_RENEGOTIATE_REQUIRES_XTN;
3973
0
        else if (ev[0] == '3' || LOWER(ev[0]) == 't')
3974
0
            ssl_defaults.enableRenegotiation = SSL_RENEGOTIATE_TRANSITIONAL;
3975
0
        SSL_TRACE(("SSL: enableRenegotiation set to %d",
3976
0
                   ssl_defaults.enableRenegotiation));
3977
0
    }
3978
1
    ev = PR_GetEnvSecure("NSS_SSL_REQUIRE_SAFE_NEGOTIATION");
3979
1
    if (ev && ev[0] == '1') {
3980
0
        ssl_defaults.requireSafeNegotiation = PR_TRUE;
3981
0
        SSL_TRACE(("SSL: requireSafeNegotiation set to %d",
3982
0
                   PR_TRUE));
3983
0
    }
3984
1
    ev = PR_GetEnvSecure("NSS_SSL_CBC_RANDOM_IV");
3985
1
    if (ev && ev[0] == '0') {
3986
0
        ssl_defaults.cbcRandomIV = PR_FALSE;
3987
0
        SSL_TRACE(("SSL: cbcRandomIV set to 0"));
3988
0
    }
3989
1
#endif /* NSS_HAVE_GETENV */
3990
1
    return PR_SUCCESS;
3991
1
}
3992
3993
static void
3994
ssl_SetDefaultsFromEnvironment(void)
3995
8.16k
{
3996
8.16k
    PR_CallOnce(&ssl_setDefaultsFromEnvironment, ssl_SetDefaultsFromEnvironmentCallOnce);
3997
8.16k
}
3998
3999
const sslNamedGroupDef *
4000
ssl_LookupNamedGroup(SSLNamedGroup group)
4001
11.2k
{
4002
11.2k
    unsigned int i;
4003
4004
204k
    for (i = 0; i < SSL_NAMED_GROUP_COUNT; ++i) {
4005
200k
        if (ssl_named_groups[i].name == group) {
4006
6.59k
            return &ssl_named_groups[i];
4007
6.59k
        }
4008
200k
    }
4009
4.68k
    return NULL;
4010
11.2k
}
4011
4012
PRBool
4013
ssl_NamedGroupEnabled(const sslSocket *ss, const sslNamedGroupDef *groupDef)
4014
82.5k
{
4015
82.5k
    unsigned int i;
4016
4017
82.5k
    if (!groupDef) {
4018
0
        return PR_FALSE;
4019
0
    }
4020
4021
288k
    for (i = 0; i < SSL_NAMED_GROUP_COUNT; ++i) {
4022
284k
        if (ss->namedGroupPreferences[i] &&
4023
284k
            ss->namedGroupPreferences[i] == groupDef) {
4024
78.7k
            return PR_TRUE;
4025
78.7k
        }
4026
284k
    }
4027
3.84k
    return PR_FALSE;
4028
82.5k
}
4029
4030
/* Returns a reference counted object that contains a key pair.
4031
 * Or NULL on failure.  Initial ref count is 1.
4032
 * Uses the keys in the pair as input.  Adopts the keys given.
4033
 */
4034
sslKeyPair *
4035
ssl_NewKeyPair(SECKEYPrivateKey *privKey, SECKEYPublicKey *pubKey)
4036
3.72k
{
4037
3.72k
    sslKeyPair *pair;
4038
4039
3.72k
    if (!privKey || !pubKey) {
4040
0
        PORT_SetError(PR_INVALID_ARGUMENT_ERROR);
4041
0
        return NULL;
4042
0
    }
4043
3.72k
    pair = PORT_ZNew(sslKeyPair);
4044
3.72k
    if (!pair)
4045
0
        return NULL; /* error code is set. */
4046
3.72k
    pair->privKey = privKey;
4047
3.72k
    pair->pubKey = pubKey;
4048
3.72k
    pair->refCount = 1;
4049
3.72k
    return pair; /* success */
4050
3.72k
}
4051
4052
sslKeyPair *
4053
ssl_GetKeyPairRef(sslKeyPair *keyPair)
4054
16.3k
{
4055
16.3k
    PR_ATOMIC_INCREMENT(&keyPair->refCount);
4056
16.3k
    return keyPair;
4057
16.3k
}
4058
4059
void
4060
ssl_FreeKeyPair(sslKeyPair *keyPair)
4061
23.7k
{
4062
23.7k
    if (!keyPair) {
4063
3.72k
        return;
4064
3.72k
    }
4065
4066
20.0k
    PRInt32 newCount = PR_ATOMIC_DECREMENT(&keyPair->refCount);
4067
20.0k
    if (!newCount) {
4068
3.72k
        SECKEY_DestroyPrivateKey(keyPair->privKey);
4069
3.72k
        SECKEY_DestroyPublicKey(keyPair->pubKey);
4070
3.72k
        PORT_Free(keyPair);
4071
3.72k
    }
4072
20.0k
}
4073
4074
/* Ephemeral key handling. */
4075
sslEphemeralKeyPair *
4076
ssl_NewEphemeralKeyPair(const sslNamedGroupDef *group,
4077
                        SECKEYPrivateKey *privKey, SECKEYPublicKey *pubKey)
4078
3.72k
{
4079
3.72k
    sslKeyPair *keys;
4080
3.72k
    sslEphemeralKeyPair *pair;
4081
4082
3.72k
    if (!group) {
4083
0
        PORT_SetError(PR_INVALID_ARGUMENT_ERROR);
4084
0
        return NULL;
4085
0
    }
4086
4087
3.72k
    keys = ssl_NewKeyPair(privKey, pubKey);
4088
3.72k
    if (!keys) {
4089
0
        return NULL;
4090
0
    }
4091
4092
3.72k
    pair = PORT_ZNew(sslEphemeralKeyPair);
4093
3.72k
    if (!pair) {
4094
0
        ssl_FreeKeyPair(keys);
4095
0
        return NULL; /* error already set */
4096
0
    }
4097
4098
3.72k
    PR_INIT_CLIST(&pair->link);
4099
3.72k
    pair->group = group;
4100
3.72k
    pair->keys = keys;
4101
3.72k
    pair->kemKeys = NULL;
4102
3.72k
    pair->kemCt = NULL;
4103
4104
3.72k
    return pair;
4105
3.72k
}
4106
4107
sslEphemeralKeyPair *
4108
ssl_CopyEphemeralKeyPair(sslEphemeralKeyPair *keyPair)
4109
0
{
4110
0
    sslEphemeralKeyPair *pair;
4111
4112
0
    pair = PORT_ZNew(sslEphemeralKeyPair);
4113
0
    if (!pair) {
4114
0
        return NULL; /* error already set */
4115
0
    }
4116
4117
0
    pair->kemCt = NULL;
4118
0
    if (keyPair->kemCt) {
4119
0
        pair->kemCt = SECITEM_DupItem(keyPair->kemCt);
4120
0
        if (!pair->kemCt) {
4121
0
            PORT_Free(pair);
4122
0
            return NULL;
4123
0
        }
4124
0
    }
4125
4126
0
    PR_INIT_CLIST(&pair->link);
4127
0
    pair->group = keyPair->group;
4128
0
    pair->keys = ssl_GetKeyPairRef(keyPair->keys);
4129
0
    pair->kemKeys = keyPair->kemKeys ? ssl_GetKeyPairRef(keyPair->kemKeys) : NULL;
4130
4131
0
    return pair;
4132
0
}
4133
4134
void
4135
ssl_FreeEphemeralKeyPair(sslEphemeralKeyPair *keyPair)
4136
3.72k
{
4137
3.72k
    if (!keyPair) {
4138
0
        return;
4139
0
    }
4140
4141
3.72k
    ssl_FreeKeyPair(keyPair->keys);
4142
3.72k
    ssl_FreeKeyPair(keyPair->kemKeys);
4143
3.72k
    SECITEM_FreeItem(keyPair->kemCt, PR_TRUE);
4144
3.72k
    PR_REMOVE_LINK(&keyPair->link);
4145
3.72k
    PORT_Free(keyPair);
4146
3.72k
}
4147
4148
PRBool
4149
ssl_HaveEphemeralKeyPair(const sslSocket *ss, const sslNamedGroupDef *groupDef)
4150
0
{
4151
0
    return ssl_LookupEphemeralKeyPair((sslSocket *)ss, groupDef) != NULL;
4152
0
}
4153
4154
sslEphemeralKeyPair *
4155
ssl_LookupEphemeralKeyPair(sslSocket *ss, const sslNamedGroupDef *groupDef)
4156
891
{
4157
891
    PRCList *cursor;
4158
891
    for (cursor = PR_NEXT_LINK(&ss->ephemeralKeyPairs);
4159
891
         cursor != &ss->ephemeralKeyPairs;
4160
891
         cursor = PR_NEXT_LINK(cursor)) {
4161
0
        sslEphemeralKeyPair *keyPair = (sslEphemeralKeyPair *)cursor;
4162
0
        if (keyPair->group == groupDef) {
4163
0
            return keyPair;
4164
0
        }
4165
0
    }
4166
891
    return NULL;
4167
891
}
4168
4169
void
4170
ssl_FreeEphemeralKeyPairs(sslSocket *ss)
4171
13.4k
{
4172
17.2k
    while (!PR_CLIST_IS_EMPTY(&ss->ephemeralKeyPairs)) {
4173
3.72k
        PRCList *cursor = PR_LIST_TAIL(&ss->ephemeralKeyPairs);
4174
3.72k
        ssl_FreeEphemeralKeyPair((sslEphemeralKeyPair *)cursor);
4175
3.72k
    }
4176
13.4k
}
4177
4178
PRTime
4179
ssl_Time(const sslSocket *ss)
4180
1.01k
{
4181
1.01k
    if (!ss->now) {
4182
0
        return PR_Now();
4183
0
    }
4184
1.01k
    return ss->now(ss->nowArg);
4185
1.01k
}
4186
4187
/*
4188
** Create a newsocket structure for a file descriptor.
4189
*/
4190
static sslSocket *
4191
ssl_NewSocket(PRBool makeLocks, SSLProtocolVariant protocolVariant)
4192
8.16k
{
4193
8.16k
    SECStatus rv;
4194
8.16k
    sslSocket *ss;
4195
8.16k
    int i;
4196
8.16k
    ssl_SetDefaultsFromEnvironment();
4197
4198
8.16k
    if (ssl_force_locks)
4199
0
        makeLocks = PR_TRUE;
4200
4201
    /* Make a new socket and get it ready */
4202
8.16k
    ss = PORT_ZNew(sslSocket);
4203
8.16k
    if (!ss) {
4204
0
        return NULL;
4205
0
    }
4206
8.16k
    ss->opt = ssl_defaults;
4207
8.16k
    if (protocolVariant == ssl_variant_datagram) {
4208
0
        ss->opt.enableRenegotiation = SSL_RENEGOTIATE_NEVER;
4209
0
    }
4210
8.16k
    ss->opt.useSocks = PR_FALSE;
4211
8.16k
    ss->opt.noLocks = !makeLocks;
4212
8.16k
    ss->vrange = *VERSIONS_DEFAULTS(protocolVariant);
4213
8.16k
    ss->protocolVariant = protocolVariant;
4214
    /* Ignore overlap failures, because returning NULL would trigger assertion
4215
     * failures elsewhere. We don't want this scenario to be fatal, it's just
4216
     * a state where no SSL connectivity is possible. */
4217
8.16k
    ssl3_CreateOverlapWithPolicy(ss->protocolVariant, &ss->vrange, &ss->vrange);
4218
8.16k
    ss->peerID = NULL;
4219
8.16k
    ss->rTimeout = PR_INTERVAL_NO_TIMEOUT;
4220
8.16k
    ss->wTimeout = PR_INTERVAL_NO_TIMEOUT;
4221
8.16k
    ss->cTimeout = PR_INTERVAL_NO_TIMEOUT;
4222
8.16k
    ss->url = NULL;
4223
4224
8.16k
    PR_INIT_CLIST(&ss->serverCerts);
4225
8.16k
    PR_INIT_CLIST(&ss->ephemeralKeyPairs);
4226
8.16k
    PR_INIT_CLIST(&ss->extensionHooks);
4227
8.16k
    PR_INIT_CLIST(&ss->echConfigs);
4228
4229
8.16k
    ss->dbHandle = CERT_GetDefaultCertDB();
4230
4231
    /* Provide default implementation of hooks */
4232
8.16k
    ss->authCertificate = SSL_AuthCertificate;
4233
8.16k
    ss->authCertificateArg = (void *)ss->dbHandle;
4234
8.16k
    ss->sniSocketConfig = NULL;
4235
8.16k
    ss->sniSocketConfigArg = NULL;
4236
8.16k
    ss->getClientAuthData = NULL;
4237
8.16k
    ss->alertReceivedCallback = NULL;
4238
8.16k
    ss->alertReceivedCallbackArg = NULL;
4239
8.16k
    ss->alertSentCallback = NULL;
4240
8.16k
    ss->alertSentCallbackArg = NULL;
4241
8.16k
    ss->handleBadCert = NULL;
4242
8.16k
    ss->badCertArg = NULL;
4243
8.16k
    ss->pkcs11PinArg = NULL;
4244
4245
8.16k
    ssl_ChooseOps(ss);
4246
8.16k
    ssl3_InitSocketPolicy(ss);
4247
277k
    for (i = 0; i < SSL_NAMED_GROUP_COUNT; ++i) {
4248
269k
        ss->namedGroupPreferences[i] = &ssl_named_groups[i];
4249
269k
    }
4250
8.16k
    ss->additionalShares = 0;
4251
8.16k
    PR_INIT_CLIST(&ss->ssl3.hs.remoteExtensions);
4252
8.16k
    PR_INIT_CLIST(&ss->ssl3.hs.lastMessageFlight);
4253
8.16k
    PR_INIT_CLIST(&ss->ssl3.hs.cipherSpecs);
4254
8.16k
    PR_INIT_CLIST(&ss->ssl3.hs.bufferedEarlyData);
4255
8.16k
    ssl3_InitExtensionData(&ss->xtnData, ss);
4256
8.16k
    PR_INIT_CLIST(&ss->ssl3.hs.dtlsSentHandshake);
4257
8.16k
    PR_INIT_CLIST(&ss->ssl3.hs.dtlsRcvdHandshake);
4258
8.16k
    PR_INIT_CLIST(&ss->ssl3.hs.psks);
4259
8.16k
    dtls_InitTimers(ss);
4260
4261
8.16k
    ss->echPrivKey = NULL;
4262
8.16k
    ss->echPubKey = NULL;
4263
8.16k
    ss->antiReplay = NULL;
4264
8.16k
    ss->psk = NULL;
4265
4266
8.16k
    if (makeLocks) {
4267
8.16k
        rv = ssl_MakeLocks(ss);
4268
8.16k
        if (rv != SECSuccess)
4269
0
            goto loser;
4270
8.16k
    }
4271
8.16k
    rv = ssl_CreateSecurityInfo(ss);
4272
8.16k
    if (rv != SECSuccess)
4273
0
        goto loser;
4274
8.16k
    rv = ssl3_InitGather(&ss->gs);
4275
8.16k
    if (rv != SECSuccess)
4276
0
        goto loser;
4277
8.16k
    rv = ssl3_InitState(ss);
4278
8.16k
    if (rv != SECSuccess) {
4279
0
        goto loser;
4280
0
    }
4281
8.16k
    return ss;
4282
4283
0
loser:
4284
0
    ssl_DestroySocketContents(ss);
4285
0
    ssl_DestroyLocks(ss);
4286
0
    PORT_Free(ss);
4287
0
    return NULL;
4288
8.16k
}
4289
4290
/**
4291
 * DEPRECATED: Will always return false.
4292
 */
4293
SECStatus
4294
SSL_CanBypass(CERTCertificate *cert, SECKEYPrivateKey *srvPrivkey,
4295
              PRUint32 protocolmask, PRUint16 *ciphersuites, int nsuites,
4296
              PRBool *pcanbypass, void *pwArg)
4297
0
{
4298
0
    if (!pcanbypass) {
4299
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
4300
0
        return SECFailure;
4301
0
    }
4302
0
    *pcanbypass = PR_FALSE;
4303
0
    return SECSuccess;
4304
0
}
4305
4306
/* Functions that are truly experimental use EXP, functions that are no longer
4307
 * experimental use PUB.
4308
 *
4309
 * When initially defining a new API, add that API here using the EXP() macro
4310
 * and name the function with a SSLExp_ prefix.  Define the experimental API as
4311
 * a macro in sslexp.h using the SSL_EXPERIMENTAL_API() macro defined there.
4312
 *
4313
 * Once an API is stable and proven, move the macro definition in sslexp.h to a
4314
 * proper function declaration in ssl.h.  Keeping the function in this list
4315
 * ensures that code built against the release that contained the experimental
4316
 * API will continue to work; use PUB() to reference the public function.
4317
 */
4318
#define EXP(n)                \
4319
    {                         \
4320
        "SSL_" #n, SSLExp_##n \
4321
    }
4322
#define PUB(n)             \
4323
    {                      \
4324
        "SSL_" #n, SSL_##n \
4325
    }
4326
struct {
4327
    const char *const name;
4328
    void *function;
4329
} ssl_experimental_functions[] = {
4330
#ifndef SSL_DISABLE_EXPERIMENTAL_API
4331
    EXP(AddExternalPsk),
4332
    EXP(AddExternalPsk0Rtt),
4333
    EXP(AeadDecrypt),
4334
    EXP(AeadEncrypt),
4335
    EXP(CallExtensionWriterOnEchInner),
4336
    EXP(CipherSuiteOrderGet),
4337
    EXP(CipherSuiteOrderSet),
4338
    EXP(CreateAntiReplayContext),
4339
    EXP(CreateMask),
4340
    EXP(CreateMaskingContext),
4341
    EXP(CreateVariantMaskingContext),
4342
    EXP(DelegateCredential),
4343
    EXP(DestroyAead),
4344
    EXP(DestroyMaskingContext),
4345
    EXP(DestroyResumptionTokenInfo),
4346
    EXP(EnableTls13BackendEch),
4347
    EXP(EnableTls13GreaseEch),
4348
    EXP(SetTls13GreaseEchSize),
4349
    EXP(EncodeEchConfigId),
4350
    EXP(GetCurrentEpoch),
4351
    EXP(GetEchRetryConfigs),
4352
    EXP(GetExtensionSupport),
4353
    EXP(GetResumptionTokenInfo),
4354
    EXP(HelloRetryRequestCallback),
4355
    EXP(InstallExtensionHooks),
4356
    EXP(HkdfExtract),
4357
    EXP(HkdfExpandLabel),
4358
    EXP(HkdfExpandLabelWithMech),
4359
    EXP(HkdfVariantExpandLabel),
4360
    EXP(HkdfVariantExpandLabelWithMech),
4361
    EXP(KeyUpdate),
4362
    EXP(MakeAead),
4363
    EXP(MakeVariantAead),
4364
    EXP(RecordLayerData),
4365
    EXP(RecordLayerWriteCallback),
4366
    EXP(ReleaseAntiReplayContext),
4367
    EXP(RemoveEchConfigs),
4368
    EXP(RemoveExternalPsk),
4369
    EXP(SecretCallback),
4370
    EXP(SendCertificateRequest),
4371
    EXP(SendSessionTicket),
4372
    EXP(SetAntiReplayContext),
4373
    EXP(SetClientEchConfigs),
4374
    EXP(SetDtls13VersionWorkaround),
4375
    EXP(SetMaxEarlyDataSize),
4376
    EXP(SetResumptionTokenCallback),
4377
    EXP(SetResumptionToken),
4378
    EXP(SetServerEchConfigs),
4379
    EXP(SetTimeFunc),
4380
    EXP(SetCertificateCompressionAlgorithm),
4381
    EXP(PeerCertificateChainDER),
4382
#endif
4383
    { "", NULL }
4384
};
4385
#undef EXP
4386
#undef PUB
4387
4388
void *
4389
SSL_GetExperimentalAPI(const char *name)
4390
48.8k
{
4391
48.8k
    unsigned int i;
4392
1.48M
    for (i = 0; i < PR_ARRAY_SIZE(ssl_experimental_functions); ++i) {
4393
1.48M
        if (strcmp(name, ssl_experimental_functions[i].name) == 0) {
4394
48.8k
            return ssl_experimental_functions[i].function;
4395
48.8k
        }
4396
1.48M
    }
4397
0
    PORT_SetError(SSL_ERROR_UNSUPPORTED_EXPERIMENTAL_API);
4398
0
    return NULL;
4399
48.8k
}
4400
4401
void
4402
ssl_ClearPRCList(PRCList *list, void (*f)(void *))
4403
24.5k
{
4404
24.5k
    PRCList *cursor;
4405
4406
24.5k
    while (!PR_CLIST_IS_EMPTY(list)) {
4407
0
        cursor = PR_LIST_TAIL(list);
4408
4409
0
        PR_REMOVE_LINK(cursor);
4410
0
        if (f) {
4411
0
            f(cursor);
4412
0
        }
4413
0
        PORT_Free(cursor);
4414
0
    }
4415
24.5k
}
4416
4417
SECStatus
4418
SSLExp_EnableTls13GreaseEch(PRFileDesc *fd, PRBool enabled)
4419
0
{
4420
0
    sslSocket *ss = ssl_FindSocket(fd);
4421
0
    if (!ss) {
4422
0
        return SECFailure;
4423
0
    }
4424
0
    ss->opt.enableTls13GreaseEch = enabled;
4425
0
    return SECSuccess;
4426
0
}
4427
4428
SECStatus
4429
SSLExp_SetTls13GreaseEchSize(PRFileDesc *fd, PRUint8 size)
4430
0
{
4431
0
    sslSocket *ss = ssl_FindSocket(fd);
4432
0
    if (!ss || size == 0) {
4433
0
        return SECFailure;
4434
0
    }
4435
0
    ssl_Get1stHandshakeLock(ss);
4436
0
    ssl_GetSSL3HandshakeLock(ss);
4437
4438
0
    ss->ssl3.hs.greaseEchSize = size;
4439
4440
0
    ssl_ReleaseSSL3HandshakeLock(ss);
4441
0
    ssl_Release1stHandshakeLock(ss);
4442
4443
0
    return SECSuccess;
4444
0
}
4445
4446
SECStatus
4447
SSLExp_EnableTls13BackendEch(PRFileDesc *fd, PRBool enabled)
4448
8.16k
{
4449
8.16k
    sslSocket *ss = ssl_FindSocket(fd);
4450
8.16k
    if (!ss) {
4451
0
        return SECFailure;
4452
0
    }
4453
8.16k
    ss->opt.enableTls13BackendEch = enabled;
4454
8.16k
    return SECSuccess;
4455
8.16k
}
4456
4457
SECStatus
4458
SSLExp_CallExtensionWriterOnEchInner(PRFileDesc *fd, PRBool enabled)
4459
0
{
4460
0
    sslSocket *ss = ssl_FindSocket(fd);
4461
0
    if (!ss) {
4462
0
        return SECFailure;
4463
0
    }
4464
0
    ss->opt.callExtensionWriterOnEchInner = enabled;
4465
0
    return SECSuccess;
4466
0
}
4467
4468
SECStatus
4469
SSLExp_SetDtls13VersionWorkaround(PRFileDesc *fd, PRBool enabled)
4470
0
{
4471
0
    sslSocket *ss = ssl_FindSocket(fd);
4472
0
    if (!ss) {
4473
0
        return SECFailure;
4474
0
    }
4475
0
    ss->opt.enableDtls13VersionCompat = enabled;
4476
0
    return SECSuccess;
4477
0
}
4478
4479
SECStatus
4480
SSLExp_SetTimeFunc(PRFileDesc *fd, SSLTimeFunc f, void *arg)
4481
8.16k
{
4482
8.16k
    sslSocket *ss = ssl_FindSocket(fd);
4483
4484
8.16k
    if (!ss) {
4485
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetTimeFunc",
4486
0
                 SSL_GETPID(), fd));
4487
0
        return SECFailure;
4488
0
    }
4489
8.16k
    ss->now = f;
4490
8.16k
    ss->nowArg = arg;
4491
8.16k
    return SECSuccess;
4492
8.16k
}
4493
4494
/* Experimental APIs for session cache handling. */
4495
4496
SECStatus
4497
SSLExp_SetResumptionTokenCallback(PRFileDesc *fd,
4498
                                  SSLResumptionTokenCallback cb,
4499
                                  void *ctx)
4500
0
{
4501
0
    sslSocket *ss = ssl_FindSocket(fd);
4502
4503
0
    if (!ss) {
4504
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetResumptionTokenCallback",
4505
0
                 SSL_GETPID(), fd));
4506
0
        return SECFailure;
4507
0
    }
4508
4509
0
    ssl_Get1stHandshakeLock(ss);
4510
0
    ssl_GetSSL3HandshakeLock(ss);
4511
0
    ss->resumptionTokenCallback = cb;
4512
0
    ss->resumptionTokenContext = ctx;
4513
0
    ssl_ReleaseSSL3HandshakeLock(ss);
4514
0
    ssl_Release1stHandshakeLock(ss);
4515
4516
0
    return SECSuccess;
4517
0
}
4518
4519
SECStatus
4520
SSLExp_SetResumptionToken(PRFileDesc *fd, const PRUint8 *token,
4521
                          unsigned int len)
4522
0
{
4523
0
    sslSocket *ss = ssl_FindSocket(fd);
4524
0
    sslSessionID *sid = NULL;
4525
4526
0
    if (!ss) {
4527
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetResumptionToken",
4528
0
                 SSL_GETPID(), fd));
4529
0
        return SECFailure;
4530
0
    }
4531
4532
0
    ssl_Get1stHandshakeLock(ss);
4533
0
    ssl_GetSSL3HandshakeLock(ss);
4534
4535
0
    if (ss->firstHsDone || ss->ssl3.hs.ws != idle_handshake ||
4536
0
        ss->sec.isServer || len == 0 || !token) {
4537
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
4538
0
        goto loser;
4539
0
    }
4540
4541
    // We override any previously set session.
4542
0
    if (ss->sec.ci.sid) {
4543
0
        ssl_FreeSID(ss->sec.ci.sid);
4544
0
        ss->sec.ci.sid = NULL;
4545
0
    }
4546
4547
0
    PRINT_BUF(50, (ss, "incoming resumption token", token, len));
4548
4549
0
    sid = ssl3_NewSessionID(ss, PR_FALSE);
4550
0
    if (!sid) {
4551
0
        goto loser;
4552
0
    }
4553
4554
    /* Populate NewSessionTicket values */
4555
0
    SECStatus rv = ssl_DecodeResumptionToken(sid, token, len);
4556
0
    if (rv != SECSuccess) {
4557
        // If decoding fails, we assume the token is bad.
4558
0
        PORT_SetError(SSL_ERROR_BAD_RESUMPTION_TOKEN_ERROR);
4559
0
        goto loser;
4560
0
    }
4561
4562
    // Make sure that the token is currently usable.
4563
0
    if (!ssl_IsResumptionTokenUsable(ss, sid)) {
4564
0
        PORT_SetError(SSL_ERROR_BAD_RESUMPTION_TOKEN_ERROR);
4565
0
        goto loser;
4566
0
    }
4567
4568
    // Generate a new random session ID for this ticket.
4569
0
    rv = PK11_GenerateRandom(sid->u.ssl3.sessionID, SSL3_SESSIONID_BYTES);
4570
0
    if (rv != SECSuccess) {
4571
0
        goto loser; // Code set by PK11_GenerateRandom.
4572
0
    }
4573
0
    sid->u.ssl3.sessionIDLength = SSL3_SESSIONID_BYTES;
4574
    /* Use the sid->cached as marker that this is from an external cache and
4575
     * we don't have to look up anything in the NSS internal cache. */
4576
0
    sid->cached = in_external_cache;
4577
0
    sid->lastAccessTime = ssl_Time(ss);
4578
4579
0
    ss->sec.ci.sid = sid;
4580
4581
0
    ssl_ReleaseSSL3HandshakeLock(ss);
4582
0
    ssl_Release1stHandshakeLock(ss);
4583
0
    return SECSuccess;
4584
4585
0
loser:
4586
0
    ssl_FreeSID(sid);
4587
0
    ssl_ReleaseSSL3HandshakeLock(ss);
4588
0
    ssl_Release1stHandshakeLock(ss);
4589
4590
0
    return SECFailure;
4591
0
}
4592
4593
SECStatus
4594
SSLExp_DestroyResumptionTokenInfo(SSLResumptionTokenInfo *token)
4595
0
{
4596
0
    if (!token) {
4597
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
4598
0
        return SECFailure;
4599
0
    }
4600
0
    if (token->peerCert) {
4601
0
        CERT_DestroyCertificate(token->peerCert);
4602
0
    }
4603
0
    PORT_Free(token->alpnSelection);
4604
0
    PORT_Memset(token, 0, token->length);
4605
0
    return SECSuccess;
4606
0
}
4607
4608
SECStatus
4609
SSLExp_GetResumptionTokenInfo(const PRUint8 *tokenData, unsigned int tokenLen,
4610
                              SSLResumptionTokenInfo *tokenOut, PRUintn len)
4611
0
{
4612
0
    if (!tokenData || !tokenOut || !tokenLen ||
4613
0
        len > sizeof(SSLResumptionTokenInfo)) {
4614
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
4615
0
        return SECFailure;
4616
0
    }
4617
0
    sslSessionID sid = { 0 };
4618
0
    SSLResumptionTokenInfo token;
4619
4620
    /* Populate sid values */
4621
0
    if (ssl_DecodeResumptionToken(&sid, tokenData, tokenLen) != SECSuccess) {
4622
        // If decoding fails, we assume the token is bad.
4623
0
        PORT_SetError(SSL_ERROR_BAD_RESUMPTION_TOKEN_ERROR);
4624
0
        return SECFailure;
4625
0
    }
4626
4627
0
    token.peerCert = CERT_DupCertificate(sid.peerCert);
4628
4629
0
    token.alpnSelectionLen = sid.u.ssl3.alpnSelection.len;
4630
0
    token.alpnSelection = PORT_ZAlloc(token.alpnSelectionLen);
4631
0
    if (!token.alpnSelection) {
4632
0
        return SECFailure;
4633
0
    }
4634
0
    if (token.alpnSelectionLen > 0) {
4635
0
        PORT_Assert(sid.u.ssl3.alpnSelection.data);
4636
0
        PORT_Memcpy(token.alpnSelection, sid.u.ssl3.alpnSelection.data,
4637
0
                    token.alpnSelectionLen);
4638
0
    }
4639
4640
0
    if (sid.u.ssl3.locked.sessionTicket.flags & ticket_allow_early_data) {
4641
0
        token.maxEarlyDataSize =
4642
0
            sid.u.ssl3.locked.sessionTicket.max_early_data_size;
4643
0
    } else {
4644
0
        token.maxEarlyDataSize = 0;
4645
0
    }
4646
0
    token.expirationTime = sid.expirationTime;
4647
4648
0
    token.length = PR_MIN(sizeof(SSLResumptionTokenInfo), len);
4649
0
    PORT_Memcpy(tokenOut, &token, token.length);
4650
4651
0
    ssl_DestroySID(&sid, PR_FALSE);
4652
0
    return SECSuccess;
4653
0
}