Coverage Report

Created: 2025-06-24 06:49

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