Coverage Report

Created: 2026-06-07 07:11

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