Coverage Report

Created: 2025-07-11 07:06

/src/nss/lib/ssl/sslsecur.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
 * Various SSL functions.
4
 *
5
 * This Source Code Form is subject to the terms of the Mozilla Public
6
 * License, v. 2.0. If a copy of the MPL was not distributed with this
7
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
8
#include "cert.h"
9
#include "secitem.h"
10
#include "keyhi.h"
11
#include "ssl.h"
12
#include "sslimpl.h"
13
#include "sslproto.h"
14
#include "secoid.h"   /* for SECOID_GetALgorithmTag */
15
#include "pk11func.h" /* for PK11_GenerateRandom */
16
#include "nss.h"      /* for NSS_RegisterShutdown */
17
#include "prinit.h"   /* for PR_CallOnceWithArg */
18
#include "tls13ech.h"
19
#include "tls13psk.h"
20
21
/* Step through the handshake functions.
22
 *
23
 * Called from: SSL_ForceHandshake  (below),
24
 *              ssl_SecureRecv      (below) and
25
 *              ssl_SecureSend      (below)
26
 *    from: WaitForResponse     in sslsocks.c
27
 *          ssl_SocksRecv       in sslsocks.c
28
 *              ssl_SocksSend       in sslsocks.c
29
 *
30
 * Caller must hold the (write) handshakeLock.
31
 */
32
SECStatus
33
ssl_Do1stHandshake(sslSocket *ss)
34
68.1k
{
35
68.1k
    SECStatus rv = SECSuccess;
36
37
201k
    while (ss->handshake && rv == SECSuccess) {
38
133k
        PORT_Assert(ss->opt.noLocks || ssl_Have1stHandshakeLock(ss));
39
133k
        PORT_Assert(ss->opt.noLocks || !ssl_HaveRecvBufLock(ss));
40
133k
        PORT_Assert(ss->opt.noLocks || !ssl_HaveXmitBufLock(ss));
41
133k
        PORT_Assert(ss->opt.noLocks || !ssl_HaveSSL3HandshakeLock(ss));
42
43
133k
        rv = (*ss->handshake)(ss);
44
133k
    };
45
46
68.1k
    PORT_Assert(ss->opt.noLocks || !ssl_HaveRecvBufLock(ss));
47
68.1k
    PORT_Assert(ss->opt.noLocks || !ssl_HaveXmitBufLock(ss));
48
68.1k
    PORT_Assert(ss->opt.noLocks || !ssl_HaveSSL3HandshakeLock(ss));
49
50
68.1k
    return rv;
51
68.1k
}
52
53
SECStatus
54
ssl_FinishHandshake(sslSocket *ss)
55
80.1k
{
56
80.1k
    PORT_Assert(ss->opt.noLocks || ssl_Have1stHandshakeLock(ss));
57
80.1k
    PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss));
58
80.1k
    PORT_Assert(ss->ssl3.hs.echAccepted ||
59
80.1k
                (ss->opt.enableTls13BackendEch &&
60
80.1k
                 ss->xtnData.ech &&
61
80.1k
                 ss->xtnData.ech->receivedInnerXtn) ==
62
80.1k
                    ssl3_ExtensionNegotiated(ss, ssl_tls13_encrypted_client_hello_xtn));
63
64
    /* If ECH was OFFERED to (echHpkeCtx is set on the client) DISABLED by the
65
     * server through negotiation of a TLS version < 1.3, an 'ech_required'
66
     * alert MUST be sent to inform the server about the intention / possible
67
     * misconfiguration. */
68
80.1k
    if (!ss->sec.isServer && ss->ssl3.hs.echHpkeCtx && !ss->ssl3.hs.echAccepted) {
69
0
        SSL3_SendAlert(ss, alert_fatal, ech_required);
70
        /* "If [one, none] of the retry_configs contains a supported version,
71
         * the client can regard ECH as securely [replaced, disabled] by the
72
         * server." */
73
0
        if (ss->xtnData.ech && ss->xtnData.ech->retryConfigs.len) {
74
0
            PORT_SetError(SSL_ERROR_ECH_RETRY_WITH_ECH);
75
0
            ss->xtnData.ech->retryConfigsValid = PR_TRUE;
76
0
        } else {
77
0
            PORT_SetError(SSL_ERROR_ECH_RETRY_WITHOUT_ECH);
78
0
        }
79
0
        return SECFailure;
80
0
    }
81
82
80.1k
    SSL_TRC(3, ("%d: SSL[%d]: handshake is completed", SSL_GETPID(), ss->fd));
83
84
80.1k
    ss->firstHsDone = PR_TRUE;
85
80.1k
    ss->enoughFirstHsDone = PR_TRUE;
86
80.1k
    ss->gs.writeOffset = 0;
87
80.1k
    ss->gs.readOffset = 0;
88
89
80.1k
    if (ss->handshakeCallback) {
90
0
        PORT_Assert((ss->ssl3.hs.preliminaryInfo & ssl_preinfo_all) ==
91
0
                    ssl_preinfo_all);
92
0
        (ss->handshakeCallback)(ss->fd, ss->handshakeCallbackData);
93
0
    }
94
95
80.1k
    ssl_FreeEphemeralKeyPairs(ss);
96
97
80.1k
    return SECSuccess;
98
80.1k
}
99
100
/*
101
 * Handshake function that blocks.  Used to force a
102
 * retry on a connection on the next read/write.
103
 */
104
static SECStatus
105
ssl3_AlwaysBlock(sslSocket *ss)
106
0
{
107
0
    PORT_SetError(PR_WOULD_BLOCK_ERROR);
108
0
    return SECFailure;
109
0
}
110
111
/*
112
 * set the initial handshake state machine to block
113
 */
114
void
115
ssl3_SetAlwaysBlock(sslSocket *ss)
116
0
{
117
0
    if (!ss->firstHsDone) {
118
0
        ss->handshake = ssl3_AlwaysBlock;
119
0
    }
120
0
}
121
122
static SECStatus
123
ssl_SetTimeout(PRFileDesc *fd, PRIntervalTime timeout)
124
0
{
125
0
    sslSocket *ss;
126
127
0
    ss = ssl_FindSocket(fd);
128
0
    if (!ss) {
129
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SetTimeout", SSL_GETPID(), fd));
130
0
        return SECFailure;
131
0
    }
132
0
    SSL_LOCK_READER(ss);
133
0
    ss->rTimeout = timeout;
134
0
    if (ss->opt.fdx) {
135
0
        SSL_LOCK_WRITER(ss);
136
0
    }
137
0
    ss->wTimeout = timeout;
138
0
    if (ss->opt.fdx) {
139
0
        SSL_UNLOCK_WRITER(ss);
140
0
    }
141
0
    SSL_UNLOCK_READER(ss);
142
0
    return SECSuccess;
143
0
}
144
145
/* Acquires and releases HandshakeLock.
146
 */
147
SECStatus
148
SSL_ResetHandshake(PRFileDesc *s, PRBool asServer)
149
65.0k
{
150
65.0k
    sslSocket *ss;
151
65.0k
    SECStatus status;
152
65.0k
    PRNetAddr addr;
153
154
65.0k
    ss = ssl_FindSocket(s);
155
65.0k
    if (!ss) {
156
0
        SSL_DBG(("%d: SSL[%d]: bad socket in ResetHandshake", SSL_GETPID(), s));
157
0
        return SECFailure;
158
0
    }
159
160
    /* Don't waste my time */
161
65.0k
    if (!ss->opt.useSecurity)
162
0
        return SECSuccess;
163
164
65.0k
    SSL_LOCK_READER(ss);
165
65.0k
    SSL_LOCK_WRITER(ss);
166
167
    /* Reset handshake state */
168
65.0k
    ssl_Get1stHandshakeLock(ss);
169
170
65.0k
    ss->firstHsDone = PR_FALSE;
171
65.0k
    ss->enoughFirstHsDone = PR_FALSE;
172
65.0k
    if (asServer) {
173
31.0k
        ss->handshake = ssl_BeginServerHandshake;
174
31.0k
        ss->handshaking = sslHandshakingAsServer;
175
33.9k
    } else {
176
33.9k
        ss->handshake = ssl_BeginClientHandshake;
177
33.9k
        ss->handshaking = sslHandshakingAsClient;
178
33.9k
    }
179
180
65.0k
    ssl_GetRecvBufLock(ss);
181
65.0k
    status = ssl3_InitGather(&ss->gs);
182
65.0k
    ssl_ReleaseRecvBufLock(ss);
183
65.0k
    if (status != SECSuccess)
184
0
        goto loser;
185
186
65.0k
    ssl_GetSSL3HandshakeLock(ss);
187
65.0k
    ss->ssl3.hs.canFalseStart = PR_FALSE;
188
65.0k
    ss->ssl3.hs.restartTarget = NULL;
189
190
    /*
191
    ** Blow away old security state and get a fresh setup.
192
    */
193
65.0k
    ssl_GetXmitBufLock(ss);
194
65.0k
    ssl_ResetSecurityInfo(&ss->sec, PR_TRUE);
195
65.0k
    status = ssl_CreateSecurityInfo(ss);
196
65.0k
    ssl_ReleaseXmitBufLock(ss);
197
198
65.0k
    ssl_ReleaseSSL3HandshakeLock(ss);
199
65.0k
    ssl_Release1stHandshakeLock(ss);
200
201
65.0k
    ssl3_DestroyRemoteExtensions(&ss->ssl3.hs.remoteExtensions);
202
65.0k
    ssl3_DestroyRemoteExtensions(&ss->ssl3.hs.echOuterExtensions);
203
65.0k
    ssl3_ResetExtensionData(&ss->xtnData, ss);
204
65.0k
    tls13_ResetHandshakePsks(ss, &ss->ssl3.hs.psks);
205
206
65.0k
    if (ss->ssl3.hs.echHpkeCtx) {
207
0
        PK11_HPKE_DestroyContext(ss->ssl3.hs.echHpkeCtx, PR_TRUE);
208
0
        ss->ssl3.hs.echHpkeCtx = NULL;
209
0
        PORT_Assert(ss->ssl3.hs.echPublicName);
210
0
        PORT_Free((void *)ss->ssl3.hs.echPublicName); /* CONST */
211
0
        ss->ssl3.hs.echPublicName = NULL;
212
0
    }
213
    /* Make sure greaseEchBuf is freed in ECH setups without echHpkeCtx. */
214
65.0k
    if (ss->ssl3.hs.echHpkeCtx ||
215
65.0k
        ss->opt.enableTls13BackendEch ||
216
65.0k
        ss->opt.enableTls13GreaseEch) {
217
31.5k
        sslBuffer_Clear(&ss->ssl3.hs.greaseEchBuf);
218
31.5k
    }
219
220
65.0k
    tls13_ClientGreaseDestroy(ss);
221
222
65.0k
    tls_ClientHelloExtensionPermutationDestroy(ss);
223
224
65.0k
    if (!ss->TCPconnected)
225
0
        ss->TCPconnected = (PR_SUCCESS == ssl_DefGetpeername(ss, &addr));
226
227
65.0k
loser:
228
65.0k
    SSL_UNLOCK_WRITER(ss);
229
65.0k
    SSL_UNLOCK_READER(ss);
230
231
65.0k
    return status;
232
65.0k
}
233
234
/* For SSLv2, does nothing but return an error.
235
** For SSLv3, flushes SID cache entry (if requested),
236
** and then starts new client hello or hello request.
237
** Acquires and releases HandshakeLock.
238
*/
239
SECStatus
240
SSL_ReHandshake(PRFileDesc *fd, PRBool flushCache)
241
0
{
242
0
    sslSocket *ss;
243
0
    SECStatus rv;
244
245
0
    ss = ssl_FindSocket(fd);
246
0
    if (!ss) {
247
0
        SSL_DBG(("%d: SSL[%d]: bad socket in RedoHandshake", SSL_GETPID(), fd));
248
0
        return SECFailure;
249
0
    }
250
251
0
    if (!ss->opt.useSecurity)
252
0
        return SECSuccess;
253
254
0
    ssl_Get1stHandshakeLock(ss);
255
256
0
    ssl_GetSSL3HandshakeLock(ss);
257
0
    rv = ssl3_RedoHandshake(ss, flushCache); /* force full handshake. */
258
0
    ssl_ReleaseSSL3HandshakeLock(ss);
259
260
0
    ssl_Release1stHandshakeLock(ss);
261
262
0
    return rv;
263
0
}
264
265
/*
266
** Same as above, but with an I/O timeout.
267
*/
268
SSL_IMPORT SECStatus
269
SSL_ReHandshakeWithTimeout(PRFileDesc *fd,
270
                           PRBool flushCache,
271
                           PRIntervalTime timeout)
272
0
{
273
0
    if (SECSuccess != ssl_SetTimeout(fd, timeout)) {
274
0
        return SECFailure;
275
0
    }
276
0
    return SSL_ReHandshake(fd, flushCache);
277
0
}
278
279
SECStatus
280
SSL_RedoHandshake(PRFileDesc *fd)
281
0
{
282
0
    return SSL_ReHandshake(fd, PR_TRUE);
283
0
}
284
285
/* Register an application callback to be called when SSL handshake completes.
286
** Acquires and releases HandshakeLock.
287
*/
288
SECStatus
289
SSL_HandshakeCallback(PRFileDesc *fd, SSLHandshakeCallback cb,
290
                      void *client_data)
291
0
{
292
0
    sslSocket *ss;
293
294
0
    ss = ssl_FindSocket(fd);
295
0
    if (!ss) {
296
0
        SSL_DBG(("%d: SSL[%d]: bad socket in HandshakeCallback",
297
0
                 SSL_GETPID(), fd));
298
0
        return SECFailure;
299
0
    }
300
301
0
    if (!ss->opt.useSecurity) {
302
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
303
0
        return SECFailure;
304
0
    }
305
306
0
    ssl_Get1stHandshakeLock(ss);
307
0
    ssl_GetSSL3HandshakeLock(ss);
308
309
0
    ss->handshakeCallback = cb;
310
0
    ss->handshakeCallbackData = client_data;
311
312
0
    ssl_ReleaseSSL3HandshakeLock(ss);
313
0
    ssl_Release1stHandshakeLock(ss);
314
315
0
    return SECSuccess;
316
0
}
317
318
/* Register an application callback to be called when false start may happen.
319
** Acquires and releases HandshakeLock.
320
*/
321
SECStatus
322
SSL_SetCanFalseStartCallback(PRFileDesc *fd, SSLCanFalseStartCallback cb,
323
                             void *arg)
324
65.0k
{
325
65.0k
    sslSocket *ss;
326
327
65.0k
    ss = ssl_FindSocket(fd);
328
65.0k
    if (!ss) {
329
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetCanFalseStartCallback",
330
0
                 SSL_GETPID(), fd));
331
0
        return SECFailure;
332
0
    }
333
334
65.0k
    if (!ss->opt.useSecurity) {
335
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
336
0
        return SECFailure;
337
0
    }
338
339
65.0k
    ssl_Get1stHandshakeLock(ss);
340
65.0k
    ssl_GetSSL3HandshakeLock(ss);
341
342
65.0k
    ss->canFalseStartCallback = cb;
343
65.0k
    ss->canFalseStartCallbackData = arg;
344
345
65.0k
    ssl_ReleaseSSL3HandshakeLock(ss);
346
65.0k
    ssl_Release1stHandshakeLock(ss);
347
348
65.0k
    return SECSuccess;
349
65.0k
}
350
351
SECStatus
352
SSL_RecommendedCanFalseStart(PRFileDesc *fd, PRBool *canFalseStart)
353
0
{
354
0
    sslSocket *ss;
355
356
0
    *canFalseStart = PR_FALSE;
357
0
    ss = ssl_FindSocket(fd);
358
0
    if (!ss) {
359
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_RecommendedCanFalseStart",
360
0
                 SSL_GETPID(), fd));
361
0
        return SECFailure;
362
0
    }
363
364
    /* Require a forward-secret key exchange. */
365
0
    *canFalseStart = ss->ssl3.hs.kea_def->kea == kea_dhe_dss ||
366
0
                     ss->ssl3.hs.kea_def->kea == kea_dhe_rsa ||
367
0
                     ss->ssl3.hs.kea_def->kea == kea_ecdhe_ecdsa ||
368
0
                     ss->ssl3.hs.kea_def->kea == kea_ecdhe_rsa;
369
370
0
    return SECSuccess;
371
0
}
372
373
/* Try to make progress on an SSL handshake by attempting to read the
374
** next handshake from the peer, and sending any responses.
375
** For non-blocking sockets, returns PR_ERROR_WOULD_BLOCK  if it cannot
376
** read the next handshake from the underlying socket.
377
** Returns when handshake is complete, or application data has
378
** arrived that must be taken by application before handshake can continue,
379
** or a fatal error occurs.
380
** Application should use handshake completion callback to tell which.
381
*/
382
SECStatus
383
SSL_ForceHandshake(PRFileDesc *fd)
384
79.0k
{
385
79.0k
    sslSocket *ss;
386
79.0k
    SECStatus rv = SECFailure;
387
388
79.0k
    ss = ssl_FindSocket(fd);
389
79.0k
    if (!ss) {
390
0
        SSL_DBG(("%d: SSL[%d]: bad socket in ForceHandshake",
391
0
                 SSL_GETPID(), fd));
392
0
        return rv;
393
0
    }
394
395
    /* Don't waste my time */
396
79.0k
    if (!ss->opt.useSecurity)
397
0
        return SECSuccess;
398
399
79.0k
    if (!ssl_SocketIsBlocking(ss)) {
400
79.0k
        ssl_GetXmitBufLock(ss);
401
79.0k
        if (ss->pendingBuf.len != 0) {
402
0
            int sent = ssl_SendSavedWriteData(ss);
403
0
            if ((sent < 0) && (PORT_GetError() != PR_WOULD_BLOCK_ERROR)) {
404
0
                ssl_ReleaseXmitBufLock(ss);
405
0
                return SECFailure;
406
0
            }
407
0
        }
408
79.0k
        ssl_ReleaseXmitBufLock(ss);
409
79.0k
    }
410
411
79.0k
    ssl_Get1stHandshakeLock(ss);
412
413
79.0k
    if (ss->version >= SSL_LIBRARY_VERSION_3_0) {
414
10.9k
        int gatherResult;
415
416
10.9k
        ssl_GetRecvBufLock(ss);
417
10.9k
        gatherResult = ssl3_GatherCompleteHandshake(ss, 0);
418
10.9k
        ssl_ReleaseRecvBufLock(ss);
419
10.9k
        if (gatherResult > 0) {
420
19
            rv = SECSuccess;
421
10.8k
        } else {
422
10.8k
            if (gatherResult == 0) {
423
2.51k
                PORT_SetError(PR_END_OF_FILE_ERROR);
424
2.51k
            }
425
            /* We can rely on ssl3_GatherCompleteHandshake to set
426
             * PR_WOULD_BLOCK_ERROR as needed here. */
427
10.8k
            rv = SECFailure;
428
10.8k
        }
429
68.1k
    } else {
430
68.1k
        PORT_Assert(!ss->firstHsDone);
431
68.1k
        rv = ssl_Do1stHandshake(ss);
432
68.1k
    }
433
434
79.0k
    ssl_Release1stHandshakeLock(ss);
435
436
79.0k
    return rv;
437
79.0k
}
438
439
/*
440
 ** Same as above, but with an I/O timeout.
441
 */
442
SSL_IMPORT SECStatus
443
SSL_ForceHandshakeWithTimeout(PRFileDesc *fd,
444
                              PRIntervalTime timeout)
445
0
{
446
0
    if (SECSuccess != ssl_SetTimeout(fd, timeout)) {
447
0
        return SECFailure;
448
0
    }
449
0
    return SSL_ForceHandshake(fd);
450
0
}
451
452
/************************************************************************/
453
454
/*
455
** Save away write data that is trying to be written before the security
456
** handshake has been completed. When the handshake is completed, we will
457
** flush this data out.
458
** Caller must hold xmitBufLock
459
*/
460
SECStatus
461
ssl_SaveWriteData(sslSocket *ss, const void *data, unsigned int len)
462
308k
{
463
308k
    SECStatus rv;
464
465
308k
    PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss));
466
308k
    rv = sslBuffer_Append(&ss->pendingBuf, data, len);
467
308k
    SSL_TRC(5, ("%d: SSL[%d]: saving %u bytes of data (%u total saved so far)",
468
308k
                SSL_GETPID(), ss->fd, len, ss->pendingBuf.len));
469
308k
    return rv;
470
308k
}
471
472
/*
473
** Send saved write data. This will flush out data sent prior to a
474
** complete security handshake. Hopefully there won't be too much of it.
475
** Returns count of the bytes sent, NOT a SECStatus.
476
** Caller must hold xmitBufLock
477
*/
478
int
479
ssl_SendSavedWriteData(sslSocket *ss)
480
123k
{
481
123k
    int rv = 0;
482
483
123k
    PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss));
484
123k
    if (ss->pendingBuf.len != 0) {
485
123k
        SSL_TRC(5, ("%d: SSL[%d]: sending %d bytes of saved data",
486
123k
                    SSL_GETPID(), ss->fd, ss->pendingBuf.len));
487
123k
        rv = ssl_DefSend(ss, ss->pendingBuf.buf, ss->pendingBuf.len, 0);
488
123k
        if (rv < 0) {
489
0
            return rv;
490
0
        }
491
123k
        if (rv > ss->pendingBuf.len) {
492
0
            PORT_Assert(0); /* This shouldn't happen */
493
0
            ss->pendingBuf.len = 0;
494
123k
        } else {
495
123k
            ss->pendingBuf.len -= rv;
496
123k
        }
497
123k
        if (ss->pendingBuf.len > 0 && rv > 0) {
498
            /* UGH !! This shifts the whole buffer down by copying it */
499
0
            PORT_Memmove(ss->pendingBuf.buf, ss->pendingBuf.buf + rv,
500
0
                         ss->pendingBuf.len);
501
0
        }
502
123k
    }
503
123k
    return rv;
504
123k
}
505
506
/************************************************************************/
507
508
/*
509
** Receive some application data on a socket.  Reads SSL records from the input
510
** stream, decrypts them and then copies them to the output buffer.
511
** Called from ssl_SecureRecv() below.
512
**
513
** Caller does NOT hold 1stHandshakeLock because that handshake is over.
514
** Caller doesn't call this until initial handshake is complete.
515
** The call to ssl3_GatherAppDataRecord may encounter handshake
516
** messages from a subsequent handshake.
517
**
518
** This code is similar to, and easily confused with,
519
**   ssl_GatherRecord1stHandshake() in sslcon.c
520
*/
521
static int
522
DoRecv(sslSocket *ss, unsigned char *out, int len, int flags)
523
38.1k
{
524
38.1k
    int rv;
525
38.1k
    int amount;
526
38.1k
    int available;
527
528
    /* ssl3_GatherAppDataRecord may call ssl_FinishHandshake, which needs the
529
     * 1stHandshakeLock. */
530
38.1k
    ssl_Get1stHandshakeLock(ss);
531
38.1k
    ssl_GetRecvBufLock(ss);
532
533
38.1k
    available = ss->gs.writeOffset - ss->gs.readOffset;
534
38.1k
    if (available == 0) {
535
        /* Wait for application data to arrive.  */
536
35.6k
        rv = ssl3_GatherAppDataRecord(ss, 0);
537
35.6k
        if (rv <= 0) {
538
5.21k
            if (rv == 0) {
539
                /* EOF */
540
3.34k
                SSL_TRC(10, ("%d: SSL[%d]: ssl_recv EOF",
541
3.34k
                             SSL_GETPID(), ss->fd));
542
3.34k
                goto done;
543
3.34k
            }
544
1.87k
            if (PR_GetError() != PR_WOULD_BLOCK_ERROR) {
545
                /* Some random error */
546
1.60k
                goto done;
547
1.60k
            }
548
549
            /*
550
            ** Gather record is blocked waiting for more record data to
551
            ** arrive. Try to process what we have already received
552
            */
553
30.4k
        } else {
554
            /* Gather record has finished getting a complete record */
555
30.4k
        }
556
557
        /* See if any clear data is now available */
558
30.6k
        available = ss->gs.writeOffset - ss->gs.readOffset;
559
30.6k
        if (available == 0) {
560
            /*
561
            ** No partial data is available. Force error code to
562
            ** EWOULDBLOCK so that caller will try again later. Note
563
            ** that the error code is probably EWOULDBLOCK already,
564
            ** but if it isn't (for example, if we received a zero
565
            ** length record) then this will force it to be correct.
566
            */
567
268
            PORT_SetError(PR_WOULD_BLOCK_ERROR);
568
268
            rv = SECFailure;
569
268
            goto done;
570
268
        }
571
30.4k
        SSL_TRC(30, ("%d: SSL[%d]: partial data ready, available=%d",
572
30.4k
                     SSL_GETPID(), ss->fd, available));
573
30.4k
    }
574
575
32.9k
    if (IS_DTLS(ss) && (len < available)) {
576
        /* DTLS does not allow you to do partial reads */
577
12
        SSL_TRC(30, ("%d: SSL[%d]: DTLS short read. len=%d available=%d",
578
12
                     SSL_GETPID(), ss->fd, len, available));
579
12
        ss->gs.readOffset += available;
580
12
        PORT_SetError(SSL_ERROR_RX_SHORT_DTLS_READ);
581
12
        rv = SECFailure;
582
12
        goto done;
583
12
    }
584
585
    /* Dole out clear data to reader */
586
32.9k
    amount = PR_MIN(len, available);
587
32.9k
    PORT_Memcpy(out, ss->gs.buf.buf + ss->gs.readOffset, amount);
588
32.9k
    if (!(flags & PR_MSG_PEEK)) {
589
32.9k
        ss->gs.readOffset += amount;
590
32.9k
    }
591
32.9k
    PORT_Assert(ss->gs.readOffset <= ss->gs.writeOffset);
592
32.9k
    rv = amount;
593
594
32.9k
#ifdef DEBUG
595
    /* In Debug builds free and zero gather plaintext buffer after its content
596
     * has been used/copied for advanced ASAN coverage/utilization.
597
     * This frees the buffer after reception of application data,
598
     * non-application data is freed at the end of
599
     * ssl3con.c/ssl3_HandleRecord(). */
600
32.9k
    if (ss->gs.writeOffset == ss->gs.readOffset) {
601
30.4k
        sslBuffer_Clear(&ss->gs.buf);
602
30.4k
    }
603
32.9k
#endif
604
605
32.9k
    SSL_TRC(30, ("%d: SSL[%d]: amount=%d available=%d",
606
32.9k
                 SSL_GETPID(), ss->fd, amount, available));
607
32.9k
    PRINT_BUF(4, (ss, "DoRecv receiving plaintext:", out, amount));
608
609
38.1k
done:
610
38.1k
    ssl_ReleaseRecvBufLock(ss);
611
38.1k
    ssl_Release1stHandshakeLock(ss);
612
38.1k
    return rv;
613
32.9k
}
614
615
/************************************************************************/
616
617
SECStatus
618
ssl_CreateSecurityInfo(sslSocket *ss)
619
130k
{
620
130k
    SECStatus status;
621
622
130k
    ssl_GetXmitBufLock(ss);
623
130k
    status = sslBuffer_Grow(&ss->sec.writeBuf, 4096);
624
130k
    ssl_ReleaseXmitBufLock(ss);
625
626
130k
    return status;
627
130k
}
628
629
SECStatus
630
ssl_CopySecurityInfo(sslSocket *ss, sslSocket *os)
631
31.0k
{
632
31.0k
    ss->sec.isServer = os->sec.isServer;
633
634
31.0k
    ss->sec.peerCert = CERT_DupCertificate(os->sec.peerCert);
635
31.0k
    if (os->sec.peerCert && !ss->sec.peerCert)
636
0
        goto loser;
637
638
31.0k
    return SECSuccess;
639
640
0
loser:
641
0
    return SECFailure;
642
31.0k
}
643
644
/* Reset sec back to its initial state.
645
** Caller holds any relevant locks.
646
*/
647
void
648
ssl_ResetSecurityInfo(sslSecurityInfo *sec, PRBool doMemset)
649
130k
{
650
130k
    if (sec->localCert) {
651
23.2k
        CERT_DestroyCertificate(sec->localCert);
652
23.2k
        sec->localCert = NULL;
653
23.2k
    }
654
130k
    if (sec->peerCert) {
655
33.6k
        CERT_DestroyCertificate(sec->peerCert);
656
33.6k
        sec->peerCert = NULL;
657
33.6k
    }
658
130k
    if (sec->peerKey) {
659
5.49k
        SECKEY_DestroyPublicKey(sec->peerKey);
660
5.49k
        sec->peerKey = NULL;
661
5.49k
    }
662
663
    /* cleanup the ci */
664
130k
    if (sec->ci.sid != NULL) {
665
57.2k
        ssl_FreeSID(sec->ci.sid);
666
57.2k
    }
667
130k
    PORT_ZFree(sec->ci.sendBuf.buf, sec->ci.sendBuf.space);
668
130k
    if (doMemset) {
669
65.0k
        memset(&sec->ci, 0, sizeof sec->ci);
670
65.0k
    }
671
130k
}
672
673
/*
674
** Called from SSL_ResetHandshake (above), and
675
**        from ssl_FreeSocket     in sslsock.c
676
** Caller should hold relevant locks (e.g. XmitBufLock)
677
*/
678
void
679
ssl_DestroySecurityInfo(sslSecurityInfo *sec)
680
65.0k
{
681
65.0k
    ssl_ResetSecurityInfo(sec, PR_FALSE);
682
683
65.0k
    PORT_ZFree(sec->writeBuf.buf, sec->writeBuf.space);
684
65.0k
    sec->writeBuf.buf = 0;
685
686
65.0k
    memset(sec, 0, sizeof *sec);
687
65.0k
}
688
689
/************************************************************************/
690
691
int
692
ssl_SecureConnect(sslSocket *ss, const PRNetAddr *sa)
693
0
{
694
0
    PRFileDesc *osfd = ss->fd->lower;
695
0
    int rv;
696
697
0
    if (ss->opt.handshakeAsServer) {
698
0
        ss->handshake = ssl_BeginServerHandshake;
699
0
        ss->handshaking = sslHandshakingAsServer;
700
0
    } else {
701
0
        ss->handshake = ssl_BeginClientHandshake;
702
0
        ss->handshaking = sslHandshakingAsClient;
703
0
    }
704
705
    /* connect to server */
706
0
    rv = osfd->methods->connect(osfd, sa, ss->cTimeout);
707
0
    if (rv == PR_SUCCESS) {
708
0
        ss->TCPconnected = 1;
709
0
    } else {
710
0
        int err = PR_GetError();
711
0
        SSL_DBG(("%d: SSL[%d]: connect failed, errno=%d",
712
0
                 SSL_GETPID(), ss->fd, err));
713
0
        if (err == PR_IS_CONNECTED_ERROR) {
714
0
            ss->TCPconnected = 1;
715
0
        }
716
0
    }
717
718
0
    SSL_TRC(5, ("%d: SSL[%d]: secure connect completed, rv == %d",
719
0
                SSL_GETPID(), ss->fd, rv));
720
0
    return rv;
721
0
}
722
723
/*
724
 * Also, in the unlikely event that the TCP pipe is full and the peer stops
725
 * reading, the SSL3_SendAlert call in ssl_SecureClose and ssl_SecureShutdown
726
 * may block indefinitely in blocking mode, and may fail (without retrying)
727
 * in non-blocking mode.
728
 */
729
730
int
731
ssl_SecureClose(sslSocket *ss)
732
65.0k
{
733
65.0k
    int rv;
734
735
65.0k
    if (!(ss->shutdownHow & ssl_SHUTDOWN_SEND) &&
736
65.0k
        ss->firstHsDone) {
737
738
        /* We don't want the final alert to be Nagle delayed. */
739
4.03k
        if (!ss->delayDisabled) {
740
4.03k
            ssl_EnableNagleDelay(ss, PR_FALSE);
741
4.03k
            ss->delayDisabled = 1;
742
4.03k
        }
743
744
4.03k
        (void)SSL3_SendAlert(ss, alert_warning, close_notify);
745
4.03k
    }
746
65.0k
    rv = ssl_DefClose(ss);
747
65.0k
    return rv;
748
65.0k
}
749
750
/* Caller handles all locking */
751
int
752
ssl_SecureShutdown(sslSocket *ss, int nsprHow)
753
0
{
754
0
    PRFileDesc *osfd = ss->fd->lower;
755
0
    int rv;
756
0
    PRIntn sslHow = nsprHow + 1;
757
758
0
    if ((unsigned)nsprHow > PR_SHUTDOWN_BOTH) {
759
0
        PORT_SetError(PR_INVALID_ARGUMENT_ERROR);
760
0
        return PR_FAILURE;
761
0
    }
762
763
0
    if ((sslHow & ssl_SHUTDOWN_SEND) != 0 &&
764
0
        !(ss->shutdownHow & ssl_SHUTDOWN_SEND) &&
765
0
        ss->firstHsDone) {
766
767
0
        (void)SSL3_SendAlert(ss, alert_warning, close_notify);
768
0
    }
769
770
0
    rv = osfd->methods->shutdown(osfd, nsprHow);
771
772
0
    ss->shutdownHow |= sslHow;
773
774
0
    return rv;
775
0
}
776
777
/************************************************************************/
778
779
static SECStatus
780
tls13_CheckKeyUpdate(sslSocket *ss, SSLSecretDirection dir)
781
68.8k
{
782
68.8k
    PRBool keyUpdate;
783
68.8k
    ssl3CipherSpec *spec;
784
68.8k
    sslSequenceNumber seqNum;
785
68.8k
    sslSequenceNumber margin;
786
68.8k
    tls13KeyUpdateRequest keyUpdateRequest;
787
68.8k
    SECStatus rv = SECSuccess;
788
789
68.8k
    if (ss->version < SSL_LIBRARY_VERSION_TLS_1_3) {
790
39.1k
        return SECSuccess;
791
39.1k
    }
792
793
    /* If both sides update at the same number, then this will cause two updates
794
     * to happen at once. The problem is that the KeyUpdate itself consumes a
795
     * sequence number, and that will trigger the reading side to request an
796
     * update.
797
     *
798
     * If we have the writing side update first, the writer will be the one that
799
     * drives the update.  An update by the writer doesn't need a response, so
800
     * it is more efficient overall.  The margins here are pretty arbitrary, but
801
     * having the write margin larger reduces the number of times that a
802
     * KeyUpdate is sent by a reader. */
803
29.6k
    ssl_GetSpecReadLock(ss);
804
29.6k
    if (dir == ssl_secret_read) {
805
15.0k
        spec = ss->ssl3.crSpec;
806
15.0k
        margin = spec->cipherDef->max_records / 8;
807
15.0k
    } else {
808
14.6k
        spec = ss->ssl3.cwSpec;
809
14.6k
        margin = spec->cipherDef->max_records / 4;
810
14.6k
    }
811
29.6k
    seqNum = spec->nextSeqNum;
812
29.6k
    keyUpdate = seqNum > spec->cipherDef->max_records - margin;
813
29.6k
    ssl_ReleaseSpecReadLock(ss);
814
29.6k
    if (!keyUpdate) {
815
29.6k
        return SECSuccess;
816
29.6k
    }
817
818
6
    SSL_TRC(5, ("%d: SSL[%d]: automatic key update at %llx for %s cipher spec",
819
6
                SSL_GETPID(), ss->fd, seqNum,
820
6
                (dir == ssl_secret_read) ? "read" : "write"));
821
6
    keyUpdateRequest = (dir == ssl_secret_read) ? update_requested : update_not_requested;
822
6
    ssl_GetSSL3HandshakeLock(ss);
823
6
    if (ss->ssl3.clientCertRequested) {
824
0
        ss->ssl3.hs.keyUpdateDeferred = PR_TRUE;
825
0
        ss->ssl3.hs.deferredKeyUpdateRequest = keyUpdateRequest;
826
6
    } else {
827
6
        rv = tls13_SendKeyUpdate(ss, keyUpdateRequest,
828
6
                                 dir == ssl_secret_write /* buffer */);
829
6
    }
830
6
    ssl_ReleaseSSL3HandshakeLock(ss);
831
6
    return rv;
832
29.6k
}
833
834
int
835
ssl_SecureRecv(sslSocket *ss, unsigned char *buf, int len, int flags)
836
38.1k
{
837
38.1k
    int rv = 0;
838
839
38.1k
    if (ss->shutdownHow & ssl_SHUTDOWN_RCV) {
840
0
        PORT_SetError(PR_SOCKET_SHUTDOWN_ERROR);
841
0
        return PR_FAILURE;
842
0
    }
843
38.1k
    if (flags & ~PR_MSG_PEEK) {
844
0
        PORT_SetError(PR_INVALID_ARGUMENT_ERROR);
845
0
        return PR_FAILURE;
846
0
    }
847
848
38.1k
    if (!ssl_SocketIsBlocking(ss) && !ss->opt.fdx) {
849
38.1k
        ssl_GetXmitBufLock(ss);
850
38.1k
        if (ss->pendingBuf.len != 0) {
851
0
            rv = ssl_SendSavedWriteData(ss);
852
0
            if ((rv < 0) && (PORT_GetError() != PR_WOULD_BLOCK_ERROR)) {
853
0
                ssl_ReleaseXmitBufLock(ss);
854
0
                return SECFailure;
855
0
            }
856
0
        }
857
38.1k
        ssl_ReleaseXmitBufLock(ss);
858
38.1k
    }
859
860
38.1k
    rv = 0;
861
38.1k
    if (!PR_CLIST_IS_EMPTY(&ss->ssl3.hs.bufferedEarlyData)) {
862
0
        PORT_Assert(ss->version >= SSL_LIBRARY_VERSION_TLS_1_3);
863
0
        return tls13_Read0RttData(ss, buf, len);
864
0
    }
865
866
    /* If any of these is non-zero, the initial handshake is not done. */
867
38.1k
    if (!ss->firstHsDone) {
868
2.29k
        ssl_Get1stHandshakeLock(ss);
869
2.29k
        if (ss->handshake) {
870
15
            rv = ssl_Do1stHandshake(ss);
871
15
        }
872
2.29k
        ssl_Release1stHandshakeLock(ss);
873
35.8k
    } else {
874
35.8k
        if (tls13_CheckKeyUpdate(ss, ssl_secret_read) != SECSuccess) {
875
0
            rv = PR_FAILURE;
876
0
        }
877
35.8k
    }
878
38.1k
    if (rv < 0) {
879
12
        if (PORT_GetError() == PR_WOULD_BLOCK_ERROR &&
880
12
            !PR_CLIST_IS_EMPTY(&ss->ssl3.hs.bufferedEarlyData)) {
881
0
            PORT_Assert(ss->version >= SSL_LIBRARY_VERSION_TLS_1_3);
882
0
            return tls13_Read0RttData(ss, buf, len);
883
0
        }
884
12
        return rv;
885
12
    }
886
887
38.1k
    if (len == 0)
888
0
        return 0;
889
890
38.1k
    rv = DoRecv(ss, (unsigned char *)buf, len, flags);
891
38.1k
    SSL_TRC(2, ("%d: SSL[%d]: recving %d bytes securely (errno=%d)",
892
38.1k
                SSL_GETPID(), ss->fd, rv, PORT_GetError()));
893
38.1k
    return rv;
894
38.1k
}
895
896
int
897
ssl_SecureRead(sslSocket *ss, unsigned char *buf, int len)
898
38.1k
{
899
38.1k
    return ssl_SecureRecv(ss, buf, len, 0);
900
38.1k
}
901
902
/* Caller holds the SSL Socket's write lock. SSL_LOCK_WRITER(ss) */
903
int
904
ssl_SecureSend(sslSocket *ss, const unsigned char *buf, int len, int flags)
905
32.9k
{
906
32.9k
    int rv = 0;
907
32.9k
    PRBool zeroRtt = PR_FALSE;
908
909
32.9k
    SSL_TRC(2, ("%d: SSL[%d]: SecureSend: sending %d bytes",
910
32.9k
                SSL_GETPID(), ss->fd, len));
911
912
32.9k
    if (ss->shutdownHow & ssl_SHUTDOWN_SEND) {
913
0
        PORT_SetError(PR_SOCKET_SHUTDOWN_ERROR);
914
0
        rv = PR_FAILURE;
915
0
        goto done;
916
0
    }
917
32.9k
    if (flags) {
918
0
        PORT_SetError(PR_INVALID_ARGUMENT_ERROR);
919
0
        rv = PR_FAILURE;
920
0
        goto done;
921
0
    }
922
923
32.9k
    ssl_GetXmitBufLock(ss);
924
32.9k
    if (ss->pendingBuf.len != 0) {
925
0
        PORT_Assert(ss->pendingBuf.len > 0);
926
0
        rv = ssl_SendSavedWriteData(ss);
927
0
        if (rv >= 0 && ss->pendingBuf.len != 0) {
928
0
            PORT_Assert(ss->pendingBuf.len > 0);
929
0
            PORT_SetError(PR_WOULD_BLOCK_ERROR);
930
0
            rv = SECFailure;
931
0
        }
932
0
    }
933
32.9k
    ssl_ReleaseXmitBufLock(ss);
934
32.9k
    if (rv < 0) {
935
0
        goto done;
936
0
    }
937
938
32.9k
    if (len > 0)
939
32.9k
        ss->writerThread = PR_GetCurrentThread();
940
941
    /* Check to see if we can write even though we're not finished.
942
     *
943
     * Case 1: False start
944
     * Case 2: TLS 1.3 0-RTT
945
     */
946
32.9k
    if (!ss->firstHsDone) {
947
0
        PRBool allowEarlySend = PR_FALSE;
948
0
        PRBool firstClientWrite = PR_FALSE;
949
950
0
        ssl_Get1stHandshakeLock(ss);
951
        /* The client can sometimes send before the handshake is fully
952
         * complete. In TLS 1.2: false start; in TLS 1.3: 0-RTT. */
953
0
        if (!ss->sec.isServer &&
954
0
            (ss->opt.enableFalseStart || ss->opt.enable0RttData)) {
955
0
            ssl_GetSSL3HandshakeLock(ss);
956
0
            zeroRtt = ss->ssl3.hs.zeroRttState == ssl_0rtt_sent ||
957
0
                      ss->ssl3.hs.zeroRttState == ssl_0rtt_accepted;
958
0
            allowEarlySend = ss->ssl3.hs.canFalseStart || zeroRtt;
959
0
            firstClientWrite = ss->ssl3.hs.ws == idle_handshake;
960
0
            ssl_ReleaseSSL3HandshakeLock(ss);
961
0
        }
962
        /* Allow the server to send 0.5 RTT data in TLS 1.3. Requesting a
963
         * certificate implies that the server might condition its sending on
964
         * client authentication, so force servers that do that to wait.
965
         *
966
         * What might not be obvious here is that this allows 0.5 RTT when doing
967
         * PSK-based resumption.  As a result, 0.5 RTT is always enabled when
968
         * early data is accepted.
969
         *
970
         * This check might be more conservative than absolutely necessary.
971
         * It's possible that allowing 0.5 RTT data when the server requests,
972
         * but does not require client authentication is safe because we can
973
         * expect the server to check for a client certificate properly. */
974
0
        if (ss->sec.isServer &&
975
0
            ss->version >= SSL_LIBRARY_VERSION_TLS_1_3 &&
976
0
            !tls13_ShouldRequestClientAuth(ss)) {
977
0
            ssl_GetSSL3HandshakeLock(ss);
978
0
            allowEarlySend = TLS13_IN_HS_STATE(ss, wait_finished);
979
0
            ssl_ReleaseSSL3HandshakeLock(ss);
980
0
        }
981
0
        if (!allowEarlySend && ss->handshake) {
982
0
            rv = ssl_Do1stHandshake(ss);
983
0
        }
984
0
        if (firstClientWrite) {
985
            /* Wait until after sending ClientHello and double-check 0-RTT. */
986
0
            ssl_GetSSL3HandshakeLock(ss);
987
0
            zeroRtt = ss->ssl3.hs.zeroRttState == ssl_0rtt_sent ||
988
0
                      ss->ssl3.hs.zeroRttState == ssl_0rtt_accepted;
989
0
            ssl_ReleaseSSL3HandshakeLock(ss);
990
0
        }
991
0
        ssl_Release1stHandshakeLock(ss);
992
0
    }
993
994
32.9k
    if (rv < 0) {
995
0
        ss->writerThread = NULL;
996
0
        goto done;
997
0
    }
998
999
32.9k
    if (ss->firstHsDone) {
1000
32.9k
        if (tls13_CheckKeyUpdate(ss, ssl_secret_write) != SECSuccess) {
1001
0
            rv = PR_FAILURE;
1002
0
            goto done;
1003
0
        }
1004
32.9k
    }
1005
1006
32.9k
    if (zeroRtt) {
1007
        /* There's a limit to the number of early data octets we can send.
1008
         *
1009
         * Note that taking this lock doesn't prevent the cipher specs from
1010
         * being changed out between here and when records are ultimately
1011
         * encrypted.  The only effect of that is to occasionally do an
1012
         * unnecessary short write when data is identified as 0-RTT here but
1013
         * 1-RTT later.
1014
         */
1015
0
        ssl_GetSpecReadLock(ss);
1016
0
        len = tls13_LimitEarlyData(ss, ssl_ct_application_data, len);
1017
0
        ssl_ReleaseSpecReadLock(ss);
1018
0
    }
1019
1020
    /* Check for zero length writes after we do housekeeping so we make forward
1021
     * progress.
1022
     */
1023
32.9k
    if (len == 0) {
1024
0
        rv = 0;
1025
0
        goto done;
1026
0
    }
1027
32.9k
    PORT_Assert(buf != NULL);
1028
32.9k
    if (!buf) {
1029
0
        PORT_SetError(PR_INVALID_ARGUMENT_ERROR);
1030
0
        rv = PR_FAILURE;
1031
0
        goto done;
1032
0
    }
1033
1034
32.9k
    ssl_GetXmitBufLock(ss);
1035
32.9k
    rv = ssl3_SendApplicationData(ss, buf, len, flags);
1036
32.9k
    ssl_ReleaseXmitBufLock(ss);
1037
32.9k
    ss->writerThread = NULL;
1038
32.9k
done:
1039
32.9k
    if (rv < 0) {
1040
0
        SSL_TRC(2, ("%d: SSL[%d]: SecureSend: returning %d count, error %d",
1041
0
                    SSL_GETPID(), ss->fd, rv, PORT_GetError()));
1042
32.9k
    } else {
1043
32.9k
        SSL_TRC(2, ("%d: SSL[%d]: SecureSend: returning %d count",
1044
32.9k
                    SSL_GETPID(), ss->fd, rv));
1045
32.9k
    }
1046
32.9k
    return rv;
1047
32.9k
}
1048
1049
int
1050
ssl_SecureWrite(sslSocket *ss, const unsigned char *buf, int len)
1051
32.9k
{
1052
32.9k
    return ssl_SecureSend(ss, buf, len, 0);
1053
32.9k
}
1054
1055
SECStatus
1056
SSLExp_RecordLayerWriteCallback(PRFileDesc *fd, SSLRecordWriteCallback cb,
1057
                                void *arg)
1058
0
{
1059
0
    sslSocket *ss = ssl_FindSocket(fd);
1060
0
    if (!ss) {
1061
0
        SSL_DBG(("%d: SSL[%d]: invalid socket for SSL_RecordLayerWriteCallback",
1062
0
                 SSL_GETPID(), fd));
1063
0
        return SECFailure;
1064
0
    }
1065
0
    if (IS_DTLS(ss)) {
1066
0
        SSL_DBG(("%d: SSL[%d]: DTLS socket for SSL_RecordLayerWriteCallback",
1067
0
                 SSL_GETPID(), fd));
1068
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
1069
0
        return SECFailure;
1070
0
    }
1071
1072
    /* This needs both HS and Xmit locks because this value is checked under
1073
     * both locks. HS to disable reading from the underlying IO layer; Xmit to
1074
     * prevent writing. */
1075
0
    ssl_GetSSL3HandshakeLock(ss);
1076
0
    ssl_GetXmitBufLock(ss);
1077
0
    ss->recordWriteCallback = cb;
1078
0
    ss->recordWriteCallbackArg = arg;
1079
0
    ssl_ReleaseXmitBufLock(ss);
1080
0
    ssl_ReleaseSSL3HandshakeLock(ss);
1081
0
    return SECSuccess;
1082
0
}
1083
1084
SECStatus
1085
SSL_AlertReceivedCallback(PRFileDesc *fd, SSLAlertCallback cb, void *arg)
1086
0
{
1087
0
    sslSocket *ss;
1088
1089
0
    ss = ssl_FindSocket(fd);
1090
0
    if (!ss) {
1091
0
        SSL_DBG(("%d: SSL[%d]: unable to find socket in SSL_AlertReceivedCallback",
1092
0
                 SSL_GETPID(), fd));
1093
0
        return SECFailure;
1094
0
    }
1095
1096
0
    ss->alertReceivedCallback = cb;
1097
0
    ss->alertReceivedCallbackArg = arg;
1098
1099
0
    return SECSuccess;
1100
0
}
1101
1102
SECStatus
1103
SSL_AlertSentCallback(PRFileDesc *fd, SSLAlertCallback cb, void *arg)
1104
0
{
1105
0
    sslSocket *ss;
1106
1107
0
    ss = ssl_FindSocket(fd);
1108
0
    if (!ss) {
1109
0
        SSL_DBG(("%d: SSL[%d]: unable to find socket in SSL_AlertSentCallback",
1110
0
                 SSL_GETPID(), fd));
1111
0
        return SECFailure;
1112
0
    }
1113
1114
0
    ss->alertSentCallback = cb;
1115
0
    ss->alertSentCallbackArg = arg;
1116
1117
0
    return SECSuccess;
1118
0
}
1119
1120
SECStatus
1121
SSL_BadCertHook(PRFileDesc *fd, SSLBadCertHandler f, void *arg)
1122
0
{
1123
0
    sslSocket *ss;
1124
1125
0
    ss = ssl_FindSocket(fd);
1126
0
    if (!ss) {
1127
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSLBadCertHook",
1128
0
                 SSL_GETPID(), fd));
1129
0
        return SECFailure;
1130
0
    }
1131
1132
0
    ss->handleBadCert = f;
1133
0
    ss->badCertArg = arg;
1134
1135
0
    return SECSuccess;
1136
0
}
1137
1138
/*
1139
 * Allow the application to pass the url or hostname into the SSL library
1140
 * so that we can do some checking on it. It will be used for the value in
1141
 * SNI extension of client hello message.
1142
 */
1143
SECStatus
1144
SSL_SetURL(PRFileDesc *fd, const char *url)
1145
65.0k
{
1146
65.0k
    sslSocket *ss = ssl_FindSocket(fd);
1147
65.0k
    SECStatus rv = SECSuccess;
1148
1149
65.0k
    if (!ss) {
1150
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSLSetURL",
1151
0
                 SSL_GETPID(), fd));
1152
0
        return SECFailure;
1153
0
    }
1154
65.0k
    ssl_Get1stHandshakeLock(ss);
1155
65.0k
    ssl_GetSSL3HandshakeLock(ss);
1156
1157
65.0k
    if (ss->url) {
1158
0
        PORT_Free((void *)ss->url); /* CONST */
1159
0
    }
1160
1161
65.0k
    ss->url = (const char *)PORT_Strdup(url);
1162
65.0k
    if (ss->url == NULL) {
1163
0
        rv = SECFailure;
1164
0
    }
1165
1166
65.0k
    ssl_ReleaseSSL3HandshakeLock(ss);
1167
65.0k
    ssl_Release1stHandshakeLock(ss);
1168
1169
65.0k
    return rv;
1170
65.0k
}
1171
1172
/*
1173
 * Allow the application to pass the set of trust anchors
1174
 */
1175
SECStatus
1176
SSL_SetTrustAnchors(PRFileDesc *fd, CERTCertList *certList)
1177
0
{
1178
0
    sslSocket *ss = ssl_FindSocket(fd);
1179
0
    CERTDistNames *names = NULL;
1180
1181
0
    if (!certList) {
1182
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
1183
0
        return SECFailure;
1184
0
    }
1185
0
    if (!ss) {
1186
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetTrustAnchors",
1187
0
                 SSL_GETPID(), fd));
1188
0
        return SECFailure;
1189
0
    }
1190
1191
0
    names = CERT_DistNamesFromCertList(certList);
1192
0
    if (names == NULL) {
1193
0
        return SECFailure;
1194
0
    }
1195
0
    ssl_Get1stHandshakeLock(ss);
1196
0
    ssl_GetSSL3HandshakeLock(ss);
1197
0
    if (ss->ssl3.ca_list) {
1198
0
        CERT_FreeDistNames(ss->ssl3.ca_list);
1199
0
    }
1200
0
    ss->ssl3.ca_list = names;
1201
0
    ssl_ReleaseSSL3HandshakeLock(ss);
1202
0
    ssl_Release1stHandshakeLock(ss);
1203
1204
0
    return SECSuccess;
1205
0
}
1206
1207
/*
1208
** Returns Negative number on error, zero or greater on success.
1209
** Returns the amount of data immediately available to be read.
1210
*/
1211
int
1212
SSL_DataPending(PRFileDesc *fd)
1213
0
{
1214
0
    sslSocket *ss;
1215
0
    int rv = 0;
1216
1217
0
    ss = ssl_FindSocket(fd);
1218
1219
0
    if (ss && ss->opt.useSecurity) {
1220
0
        ssl_GetRecvBufLock(ss);
1221
0
        rv = ss->gs.writeOffset - ss->gs.readOffset;
1222
0
        ssl_ReleaseRecvBufLock(ss);
1223
0
    }
1224
1225
0
    return rv;
1226
0
}
1227
1228
SECStatus
1229
SSL_InvalidateSession(PRFileDesc *fd)
1230
0
{
1231
0
    sslSocket *ss = ssl_FindSocket(fd);
1232
0
    SECStatus rv = SECFailure;
1233
1234
0
    if (ss) {
1235
0
        ssl_Get1stHandshakeLock(ss);
1236
0
        ssl_GetSSL3HandshakeLock(ss);
1237
1238
0
        if (ss->sec.ci.sid) {
1239
0
            ssl_UncacheSessionID(ss);
1240
0
            rv = SECSuccess;
1241
0
        }
1242
1243
0
        ssl_ReleaseSSL3HandshakeLock(ss);
1244
0
        ssl_Release1stHandshakeLock(ss);
1245
0
    }
1246
0
    return rv;
1247
0
}
1248
1249
SECItem *
1250
SSL_GetSessionID(PRFileDesc *fd)
1251
0
{
1252
0
    sslSocket *ss;
1253
0
    SECItem *item = NULL;
1254
1255
0
    ss = ssl_FindSocket(fd);
1256
0
    if (ss) {
1257
0
        ssl_Get1stHandshakeLock(ss);
1258
0
        ssl_GetSSL3HandshakeLock(ss);
1259
1260
0
        if (ss->opt.useSecurity && ss->firstHsDone && ss->sec.ci.sid) {
1261
0
            item = (SECItem *)PORT_Alloc(sizeof(SECItem));
1262
0
            if (item) {
1263
0
                sslSessionID *sid = ss->sec.ci.sid;
1264
0
                item->len = sid->u.ssl3.sessionIDLength;
1265
0
                item->data = (unsigned char *)PORT_Alloc(item->len);
1266
0
                PORT_Memcpy(item->data, sid->u.ssl3.sessionID, item->len);
1267
0
            }
1268
0
        }
1269
1270
0
        ssl_ReleaseSSL3HandshakeLock(ss);
1271
0
        ssl_Release1stHandshakeLock(ss);
1272
0
    }
1273
0
    return item;
1274
0
}
1275
1276
SECStatus
1277
SSL_CertDBHandleSet(PRFileDesc *fd, CERTCertDBHandle *dbHandle)
1278
0
{
1279
0
    sslSocket *ss;
1280
1281
0
    ss = ssl_FindSocket(fd);
1282
0
    if (!ss)
1283
0
        return SECFailure;
1284
0
    if (!dbHandle) {
1285
0
        PORT_SetError(SEC_ERROR_INVALID_ARGS);
1286
0
        return SECFailure;
1287
0
    }
1288
0
    ss->dbHandle = dbHandle;
1289
0
    return SECSuccess;
1290
0
}
1291
1292
/* DO NOT USE. This function was exported in ssl.def with the wrong signature;
1293
 * this implementation exists to maintain link-time compatibility.
1294
 */
1295
int
1296
SSL_RestartHandshakeAfterCertReq(sslSocket *ss,
1297
                                 CERTCertificate *cert,
1298
                                 SECKEYPrivateKey *key,
1299
                                 CERTCertificateList *certChain)
1300
0
{
1301
0
    PORT_SetError(PR_NOT_IMPLEMENTED_ERROR);
1302
0
    return -1;
1303
0
}
1304
1305
/* DO NOT USE. This function was exported in ssl.def with the wrong signature;
1306
 * this implementation exists to maintain link-time compatibility.
1307
 */
1308
int
1309
SSL_RestartHandshakeAfterServerCert(sslSocket *ss)
1310
0
{
1311
0
    PORT_SetError(PR_NOT_IMPLEMENTED_ERROR);
1312
0
    return -1;
1313
0
}
1314
1315
/* See documentation in ssl.h */
1316
SECStatus
1317
SSL_AuthCertificateComplete(PRFileDesc *fd, PRErrorCode error)
1318
0
{
1319
0
    SECStatus rv;
1320
0
    sslSocket *ss = ssl_FindSocket(fd);
1321
1322
0
    if (!ss) {
1323
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_AuthCertificateComplete",
1324
0
                 SSL_GETPID(), fd));
1325
0
        return SECFailure;
1326
0
    }
1327
1328
0
    ssl_Get1stHandshakeLock(ss);
1329
0
    rv = ssl3_AuthCertificateComplete(ss, error);
1330
0
    ssl_Release1stHandshakeLock(ss);
1331
1332
0
    return rv;
1333
0
}
1334
1335
SECStatus
1336
SSL_ClientCertCallbackComplete(PRFileDesc *fd, SECStatus outcome, SECKEYPrivateKey *clientPrivateKey,
1337
                               CERTCertificate *clientCertificate)
1338
0
{
1339
0
    SECStatus rv;
1340
0
    sslSocket *ss = ssl_FindSocket(fd);
1341
1342
0
    if (!ss) {
1343
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SSL_ClientCertCallbackComplete",
1344
0
                 SSL_GETPID(), fd));
1345
0
        return SECFailure;
1346
0
    }
1347
1348
    /* There exists a codepath which exercises each lock.
1349
     * Socket is blocked whilst waiting on this callback anyway. */
1350
0
    ssl_Get1stHandshakeLock(ss);
1351
0
    ssl_GetRecvBufLock(ss);
1352
0
    ssl_GetSSL3HandshakeLock(ss);
1353
1354
0
    if (!ss->ssl3.hs.clientCertificatePending) {
1355
        /* Application invoked callback at wrong time */
1356
0
        SSL_DBG(("%d: SSL[%d]: socket not waiting for SSL_ClientCertCallbackComplete",
1357
0
                 SSL_GETPID(), fd));
1358
0
        PORT_SetError(PR_INVALID_STATE_ERROR);
1359
0
        rv = SECFailure;
1360
0
        goto cleanup;
1361
0
    }
1362
1363
0
    rv = ssl3_ClientCertCallbackComplete(ss, outcome, clientPrivateKey, clientCertificate);
1364
1365
0
cleanup:
1366
0
    ssl_ReleaseRecvBufLock(ss);
1367
0
    ssl_ReleaseSSL3HandshakeLock(ss);
1368
0
    ssl_Release1stHandshakeLock(ss);
1369
0
    return rv;
1370
0
}
1371
1372
/* For more info see ssl.h */
1373
SECStatus
1374
SSL_SNISocketConfigHook(PRFileDesc *fd, SSLSNISocketConfig func,
1375
                        void *arg)
1376
0
{
1377
0
    sslSocket *ss;
1378
1379
0
    ss = ssl_FindSocket(fd);
1380
0
    if (!ss) {
1381
0
        SSL_DBG(("%d: SSL[%d]: bad socket in SNISocketConfigHook",
1382
0
                 SSL_GETPID(), fd));
1383
0
        return SECFailure;
1384
0
    }
1385
1386
0
    ss->sniSocketConfig = func;
1387
0
    ss->sniSocketConfigArg = arg;
1388
0
    return SECSuccess;
1389
0
}