Coverage Report

Created: 2018-09-25 14:53

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