Chromium Code Reviews| Index: net/third_party/nss/ssl/sslsock.c |
| diff --git a/net/third_party/nss/ssl/sslsock.c b/net/third_party/nss/ssl/sslsock.c |
| index 0a8fbf0fdcd600761a6785024d602527ecd4a117..e82c91693412a9037c3920042bea4f201b0a33c3 100644 |
| --- a/net/third_party/nss/ssl/sslsock.c |
| +++ b/net/third_party/nss/ssl/sslsock.c |
| @@ -17,46 +17,39 @@ |
| #ifndef NO_PKCS11_BYPASS |
| #include "blapi.h" |
| #endif |
| -#include "pk11pub.h" |
| #include "nss.h" |
| #include "pk11pqg.h" |
| -/* This is a bodge to allow this code to be compiled against older NSS headers |
| - * that don't contain the TLS 1.2 changes. */ |
| -#ifndef CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256 |
| -#define CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256 (CKM_NSS + 24) |
| -#endif |
| - |
| -#define SET_ERROR_CODE /* reminder */ |
| - |
| -static const sslSocketOps ssl_default_ops = { /* No SSL. */ |
| - ssl_DefConnect, |
| - NULL, |
| - ssl_DefBind, |
| - ssl_DefListen, |
| - ssl_DefShutdown, |
| - ssl_DefClose, |
| - ssl_DefRecv, |
| - ssl_DefSend, |
| - ssl_DefRead, |
| - ssl_DefWrite, |
| - ssl_DefGetpeername, |
| - ssl_DefGetsockname |
| +#define SET_ERROR_CODE /* reminder */ |
| + |
| +static const sslSocketOps ssl_default_ops = { /* No SSL. */ |
| + ssl_DefConnect, |
| + NULL, |
| + ssl_DefBind, |
| + ssl_DefListen, |
| + ssl_DefShutdown, |
| + ssl_DefClose, |
| + ssl_DefRecv, |
| + ssl_DefSend, |
| + ssl_DefRead, |
| + ssl_DefWrite, |
| + ssl_DefGetpeername, |
| + ssl_DefGetsockname |
| }; |
| -static const sslSocketOps ssl_secure_ops = { /* SSL. */ |
| - ssl_SecureConnect, |
| - NULL, |
| - ssl_DefBind, |
| - ssl_DefListen, |
| - ssl_SecureShutdown, |
| - ssl_SecureClose, |
| - ssl_SecureRecv, |
| - ssl_SecureSend, |
| - ssl_SecureRead, |
| - ssl_SecureWrite, |
| - ssl_DefGetpeername, |
| - ssl_DefGetsockname |
| +static const sslSocketOps ssl_secure_ops = { /* SSL. */ |
| + ssl_SecureConnect, |
| + NULL, |
| + ssl_DefBind, |
| + ssl_DefListen, |
| + ssl_SecureShutdown, |
| + ssl_SecureClose, |
| + ssl_SecureRecv, |
| + ssl_SecureSend, |
| + ssl_SecureRead, |
| + ssl_SecureWrite, |
| + ssl_DefGetpeername, |
| + ssl_DefGetsockname |
| }; |
| /* |
| @@ -64,36 +57,38 @@ static const sslSocketOps ssl_secure_ops = { /* SSL. */ |
| */ |
| static sslOptions ssl_defaults = { |
| { siBuffer, NULL, 0 }, /* nextProtoNego */ |
| - PR_TRUE, /* useSecurity */ |
| - PR_FALSE, /* useSocks */ |
| - PR_FALSE, /* requestCertificate */ |
| - 2, /* requireCertificate */ |
| - PR_FALSE, /* handshakeAsClient */ |
| - PR_FALSE, /* handshakeAsServer */ |
| - PR_FALSE, /* enableSSL2 */ /* now defaults to off in NSS 3.13 */ |
| - PR_FALSE, /* unusedBit9 */ |
| - PR_FALSE, /* unusedBit10 */ |
| - PR_FALSE, /* noCache */ |
| - PR_FALSE, /* fdx */ |
| - PR_FALSE, /* v2CompatibleHello */ /* now defaults to off in NSS 3.13 */ |
| - PR_TRUE, /* detectRollBack */ |
| - PR_FALSE, /* noStepDown */ |
| - PR_FALSE, /* bypassPKCS11 */ |
| - PR_FALSE, /* noLocks */ |
| - PR_FALSE, /* enableSessionTickets */ |
| - PR_FALSE, /* enableDeflate */ |
| - 2, /* enableRenegotiation (default: requires extension) */ |
| - PR_FALSE, /* requireSafeNegotiation */ |
| - PR_FALSE, /* enableFalseStart */ |
| - PR_TRUE, /* cbcRandomIV */ |
| - PR_FALSE, /* enableOCSPStapling */ |
| - PR_TRUE, /* enableNPN */ |
| - PR_FALSE, /* enableALPN */ |
| - PR_TRUE, /* reuseServerECDHEKey */ |
| - PR_FALSE, /* enableFallbackSCSV */ |
| - PR_TRUE, /* enableServerDhe */ |
| - PR_FALSE, /* enableExtendedMS */ |
| - PR_FALSE, /* enableSignedCertTimestamps */ |
| + PR_TRUE, /* useSecurity */ |
| + PR_FALSE, /* useSocks */ |
| + PR_FALSE, /* requestCertificate */ |
| + 2, /* requireCertificate */ |
| + PR_FALSE, /* handshakeAsClient */ |
| + PR_FALSE, /* handshakeAsServer */ |
| + PR_FALSE, |
| + /* enableSSL2 */ /* now defaults to off in NSS 3.13 */ |
| + PR_FALSE, /* unusedBit9 */ |
| + PR_FALSE, /* unusedBit10 */ |
| + PR_FALSE, /* noCache */ |
| + PR_FALSE, /* fdx */ |
| + PR_FALSE, |
| + /* v2CompatibleHello */ /* now defaults to off in NSS 3.13 */ |
| + PR_TRUE, /* detectRollBack */ |
| + PR_FALSE, /* noStepDown */ |
| + PR_FALSE, /* bypassPKCS11 */ |
| + PR_FALSE, /* noLocks */ |
| + PR_FALSE, /* enableSessionTickets */ |
| + PR_FALSE, /* enableDeflate */ |
| + 2, /* enableRenegotiation (default: requires extension) */ |
| + PR_FALSE, /* requireSafeNegotiation */ |
| + PR_FALSE, /* enableFalseStart */ |
| + PR_TRUE, /* cbcRandomIV */ |
| + PR_FALSE, /* enableOCSPStapling */ |
| + PR_TRUE, /* enableNPN */ |
| + PR_FALSE, /* enableALPN */ |
| + PR_TRUE, /* reuseServerECDHEKey */ |
| + PR_FALSE, /* enableFallbackSCSV */ |
| + PR_TRUE, /* enableServerDhe */ |
| + PR_FALSE, /* enableExtendedMS */ |
| + PR_FALSE, /* enableSignedCertTimestamps */ |
| }; |
| /* |
| @@ -109,24 +104,30 @@ static SSLVersionRange versions_defaults_datagram = { |
| SSL_LIBRARY_VERSION_TLS_1_2 |
| }; |
| -#define VERSIONS_DEFAULTS(variant) \ |
| +#define VERSIONS_DEFAULTS(variant) \ |
| (variant == ssl_variant_stream ? &versions_defaults_stream : \ |
| - &versions_defaults_datagram) |
| - |
| -sslSessionIDLookupFunc ssl_sid_lookup; |
| -sslSessionIDCacheFunc ssl_sid_cache; |
| + &versions_defaults_datagram) |
| +#define VERSIONS_POLICY_MIN(variant) \ |
| + (variant == ssl_variant_stream ? NSS_TLS_VERSION_MIN_POLICY : \ |
| + NSS_DTLS_VERSION_MIN_POLICY) |
| +#define VERSIONS_POLICY_MAX(variant) \ |
| + (variant == ssl_variant_stream ? NSS_TLS_VERSION_MAX_POLICY : \ |
| + NSS_DTLS_VERSION_MAX_POLICY) |
| + |
| +sslSessionIDLookupFunc ssl_sid_lookup; |
| +sslSessionIDCacheFunc ssl_sid_cache; |
| sslSessionIDUncacheFunc ssl_sid_uncache; |
| static PRBool ssl_inited = PR_FALSE; |
| static PRDescIdentity ssl_layer_id; |
| -PRBool locksEverDisabled; /* implicitly PR_FALSE */ |
| -PRBool ssl_force_locks; /* implicitly PR_FALSE */ |
| -int ssl_lock_readers = 1; /* default true. */ |
| -char ssl_debug; |
| -char ssl_trace; |
| -FILE * ssl_trace_iob; |
| -FILE * ssl_keylog_iob; |
| +PRBool locksEverDisabled; /* implicitly PR_FALSE */ |
| +PRBool ssl_force_locks; /* implicitly PR_FALSE */ |
| +int ssl_lock_readers = 1; /* default true. */ |
| +char ssl_debug; |
| +char ssl_trace; |
| +FILE *ssl_trace_iob; |
| +FILE *ssl_keylog_iob; |
| char lockStatus[] = "Locks are ENABLED. "; |
| #define LOCKSTATUS_OFFSET 10 /* offset of ENABLED */ |
| @@ -139,10 +140,10 @@ static const PRUint16 srtpCiphers[] = { |
| /* forward declarations. */ |
| static sslSocket *ssl_NewSocket(PRBool makeLocks, SSLProtocolVariant variant); |
| -static SECStatus ssl_MakeLocks(sslSocket *ss); |
| -static void ssl_SetDefaultsFromEnvironment(void); |
| -static PRStatus ssl_PushIOLayer(sslSocket *ns, PRFileDesc *stack, |
| - PRDescIdentity id); |
| +static SECStatus ssl_MakeLocks(sslSocket *ss); |
| +static void ssl_SetDefaultsFromEnvironment(void); |
| +static PRStatus ssl_PushIOLayer(sslSocket *ns, PRFileDesc *stack, |
| + PRDescIdentity id); |
| /************************************************************************/ |
| @@ -214,31 +215,32 @@ ssl_DupSocket(sslSocket *os) |
| ss = ssl_NewSocket((PRBool)(!os->opt.noLocks), os->protocolVariant); |
| if (ss) { |
| - ss->opt = os->opt; |
| - ss->opt.useSocks = PR_FALSE; |
| - ss->vrange = os->vrange; |
| + ss->opt = os->opt; |
| + ss->opt.useSocks = PR_FALSE; |
| + ss->vrange = os->vrange; |
| - ss->peerID = !os->peerID ? NULL : PORT_Strdup(os->peerID); |
| - ss->url = !os->url ? NULL : PORT_Strdup(os->url); |
| + ss->peerID = !os->peerID ? NULL : PORT_Strdup(os->peerID); |
| + ss->url = !os->url ? NULL : PORT_Strdup(os->url); |
| - ss->ops = os->ops; |
| + ss->ops = os->ops; |
| ss->rTimeout = os->rTimeout; |
| ss->wTimeout = os->wTimeout; |
| ss->cTimeout = os->cTimeout; |
| ss->dbHandle = os->dbHandle; |
| /* copy ssl2&3 policy & prefs, even if it's not selected (yet) */ |
| - ss->allowedByPolicy = os->allowedByPolicy; |
| - ss->maybeAllowedByPolicy= os->maybeAllowedByPolicy; |
| - ss->chosenPreference = os->chosenPreference; |
| + ss->allowedByPolicy = os->allowedByPolicy; |
| + ss->maybeAllowedByPolicy = os->maybeAllowedByPolicy; |
| + ss->chosenPreference = os->chosenPreference; |
| PORT_Memcpy(ss->cipherSuites, os->cipherSuites, sizeof os->cipherSuites); |
| PORT_Memcpy(ss->ssl3.dtlsSRTPCiphers, os->ssl3.dtlsSRTPCiphers, |
| sizeof(PRUint16) * os->ssl3.dtlsSRTPCipherCount); |
| ss->ssl3.dtlsSRTPCipherCount = os->ssl3.dtlsSRTPCipherCount; |
| PORT_Memcpy(ss->ssl3.signatureAlgorithms, os->ssl3.signatureAlgorithms, |
| sizeof(ss->ssl3.signatureAlgorithms[0]) * |
| - os->ssl3.signatureAlgorithmCount); |
| + os->ssl3.signatureAlgorithmCount); |
| ss->ssl3.signatureAlgorithmCount = os->ssl3.signatureAlgorithmCount; |
| + ss->ssl3.downgradeCheckVersion = os->ssl3.downgradeCheckVersion; |
| ss->ssl3.dheWeakGroupEnabled = os->ssl3.dheWeakGroupEnabled; |
| ss->ssl3.numDHEGroups = os->ssl3.numDHEGroups; |
| @@ -255,74 +257,66 @@ ssl_DupSocket(sslSocket *os) |
| } |
| if (os->cipherSpecs) { |
| - ss->cipherSpecs = (unsigned char*)PORT_Alloc(os->sizeCipherSpecs); |
| + ss->cipherSpecs = (unsigned char *)PORT_Alloc(os->sizeCipherSpecs); |
| if (ss->cipherSpecs) |
| PORT_Memcpy(ss->cipherSpecs, os->cipherSpecs, |
| os->sizeCipherSpecs); |
| - ss->sizeCipherSpecs = os->sizeCipherSpecs; |
| - ss->preferredCipher = os->preferredCipher; |
| + ss->sizeCipherSpecs = os->sizeCipherSpecs; |
| + ss->preferredCipher = os->preferredCipher; |
| } else { |
| - ss->cipherSpecs = NULL; /* produced lazily */ |
| - ss->sizeCipherSpecs = 0; |
| - ss->preferredCipher = NULL; |
| + ss->cipherSpecs = NULL; /* produced lazily */ |
| + ss->sizeCipherSpecs = 0; |
| + ss->preferredCipher = NULL; |
| } |
| if (ss->opt.useSecurity) { |
| /* This int should be SSLKEAType, but CC on Irix complains, |
| * during the for loop. |
| */ |
| int i; |
| - sslServerCerts * oc = os->serverCerts; |
| - sslServerCerts * sc = ss->serverCerts; |
| + sslServerCerts *oc = os->serverCerts; |
| + sslServerCerts *sc = ss->serverCerts; |
| - for (i=kt_null; i < kt_kea_size; i++, oc++, sc++) { |
| + for (i = kt_null; i < kt_kea_size; i++, oc++, sc++) { |
| if (oc->serverCert && oc->serverCertChain) { |
| - sc->serverCert = CERT_DupCertificate(oc->serverCert); |
| + sc->serverCert = CERT_DupCertificate(oc->serverCert); |
| sc->serverCertChain = CERT_DupCertList(oc->serverCertChain); |
| if (!sc->serverCertChain) |
| goto loser; |
| } else { |
| - sc->serverCert = NULL; |
| + sc->serverCert = NULL; |
| sc->serverCertChain = NULL; |
| } |
| - sc->serverKeyPair = oc->serverKeyPair ? |
| - ssl3_GetKeyPairRef(oc->serverKeyPair) : NULL; |
| + sc->serverKeyPair = oc->serverKeyPair ? ssl3_GetKeyPairRef(oc->serverKeyPair) |
| + : NULL; |
| if (oc->serverKeyPair && !sc->serverKeyPair) |
| goto loser; |
| sc->serverKeyBits = oc->serverKeyBits; |
| - ss->certStatusArray[i] = !os->certStatusArray[i] ? NULL : |
| - SECITEM_DupArray(NULL, os->certStatusArray[i]); |
| + ss->certStatusArray[i] = !os->certStatusArray[i] ? NULL : SECITEM_DupArray(NULL, os->certStatusArray[i]); |
| } |
| - ss->stepDownKeyPair = !os->stepDownKeyPair ? NULL : |
| - ssl3_GetKeyPairRef(os->stepDownKeyPair); |
| - ss->ephemeralECDHKeyPair = !os->ephemeralECDHKeyPair ? NULL : |
| - ssl3_GetKeyPairRef(os->ephemeralECDHKeyPair); |
| - ss->dheKeyPair = !os->dheKeyPair ? NULL : |
| - ssl3_GetKeyPairRef(os->dheKeyPair); |
| + ss->stepDownKeyPair = !os->stepDownKeyPair ? NULL : ssl3_GetKeyPairRef(os->stepDownKeyPair); |
| + ss->ephemeralECDHKeyPair = !os->ephemeralECDHKeyPair ? NULL : ssl3_GetKeyPairRef(os->ephemeralECDHKeyPair); |
| + ss->dheKeyPair = !os->dheKeyPair ? NULL : ssl3_GetKeyPairRef(os->dheKeyPair); |
| ss->dheParams = os->dheParams; |
| -/* |
| - * XXX the preceding CERT_ and SECKEY_ functions can fail and return NULL. |
| - * XXX We should detect this, and not just march on with NULL pointers. |
| - */ |
| - ss->authCertificate = os->authCertificate; |
| - ss->authCertificateArg = os->authCertificateArg; |
| - ss->getClientAuthData = os->getClientAuthData; |
| - ss->getClientAuthDataArg = os->getClientAuthDataArg; |
| -#ifdef NSS_PLATFORM_CLIENT_AUTH |
| - ss->getPlatformClientAuthData = os->getPlatformClientAuthData; |
| - ss->getPlatformClientAuthDataArg = os->getPlatformClientAuthDataArg; |
| -#endif |
| - ss->sniSocketConfig = os->sniSocketConfig; |
| - ss->sniSocketConfigArg = os->sniSocketConfigArg; |
| - ss->handleBadCert = os->handleBadCert; |
| - ss->badCertArg = os->badCertArg; |
| - ss->handshakeCallback = os->handshakeCallback; |
| + /* |
| + * XXX the preceding CERT_ and SECKEY_ functions can fail and return NULL. |
| + * XXX We should detect this, and not just march on with NULL pointers. |
| + */ |
| + ss->authCertificate = os->authCertificate; |
| + ss->authCertificateArg = os->authCertificateArg; |
| + ss->getClientAuthData = os->getClientAuthData; |
| + ss->getClientAuthDataArg = os->getClientAuthDataArg; |
| + ss->sniSocketConfig = os->sniSocketConfig; |
| + ss->sniSocketConfigArg = os->sniSocketConfigArg; |
| + ss->handleBadCert = os->handleBadCert; |
| + ss->badCertArg = os->badCertArg; |
| + ss->handshakeCallback = os->handshakeCallback; |
| ss->handshakeCallbackData = os->handshakeCallbackData; |
| ss->canFalseStartCallback = os->canFalseStartCallback; |
| ss->canFalseStartCallbackData = os->canFalseStartCallbackData; |
| - ss->pkcs11PinArg = os->pkcs11PinArg; |
| - ss->getChannelID = os->getChannelID; |
| - ss->getChannelIDArg = os->getChannelIDArg; |
| + ss->pkcs11PinArg = os->pkcs11PinArg; |
| + ss->getChannelID = os->getChannelID; |
| + ss->getChannelIDArg = os->getChannelIDArg; |
| /* Create security data */ |
| rv = ssl_CopySecurityInfo(ss, os); |
| @@ -380,7 +374,7 @@ ssl_DestroySocketContents(sslSocket *ss) |
| /* "i" should be of type SSLKEAType, but CC on IRIX complains during |
| * the for loop. |
| */ |
| - int i; |
| + int i; |
| /* Free up socket */ |
| ssl_DestroySecurityInfo(&ss->sec); |
| @@ -394,16 +388,16 @@ ssl_DestroySocketContents(sslSocket *ss) |
| if (ss->peerID != NULL) |
| PORT_Free(ss->peerID); |
| if (ss->url != NULL) |
| - PORT_Free((void *)ss->url); /* CONST */ |
| + PORT_Free((void *)ss->url); /* CONST */ |
| if (ss->cipherSpecs) { |
| PORT_Free(ss->cipherSpecs); |
| - ss->cipherSpecs = NULL; |
| + ss->cipherSpecs = NULL; |
| ss->sizeCipherSpecs = 0; |
| } |
| /* Clean up server configuration */ |
| - for (i=kt_null; i < kt_kea_size; i++) { |
| - sslServerCerts * sc = ss->serverCerts + i; |
| + for (i = kt_null; i < kt_kea_size; i++) { |
| + sslServerCerts *sc = ss->serverCerts + i; |
| if (sc->serverCert != NULL) |
| CERT_DestroyCertificate(sc->serverCert); |
| if (sc->serverCertChain != NULL) |
| @@ -414,6 +408,9 @@ ssl_DestroySocketContents(sslSocket *ss) |
| SECITEM_FreeArray(ss->certStatusArray[i], PR_TRUE); |
| ss->certStatusArray[i] = NULL; |
| } |
| + if (ss->signedCertTimestamps[i].data) { |
| + SECITEM_FreeItem(&ss->signedCertTimestamps[i], PR_FALSE); |
| + } |
| } |
| if (ss->stepDownKeyPair) { |
| ssl3_FreeKeyPair(ss->stepDownKeyPair); |
| @@ -440,11 +437,11 @@ ssl_DestroySocketContents(sslSocket *ss) |
| void |
| ssl_FreeSocket(sslSocket *ss) |
| { |
| -/* Get every lock you can imagine! |
| -** Caller already holds these: |
| -** SSL_LOCK_READER(ss); |
| -** SSL_LOCK_WRITER(ss); |
| -*/ |
| + /* Get every lock you can imagine! |
| + ** Caller already holds these: |
| + ** SSL_LOCK_READER(ss); |
| + ** SSL_LOCK_WRITER(ss); |
| + */ |
| ssl_Get1stHandshakeLock(ss); |
| ssl_GetRecvBufLock(ss); |
| ssl_GetSSL3HandshakeLock(ss); |
| @@ -475,15 +472,15 @@ ssl_FreeSocket(sslSocket *ss) |
| SECStatus |
| ssl_EnableNagleDelay(sslSocket *ss, PRBool enabled) |
| { |
| - PRFileDesc * osfd = ss->fd->lower; |
| - SECStatus rv = SECFailure; |
| + PRFileDesc *osfd = ss->fd->lower; |
| + SECStatus rv = SECFailure; |
| PRSocketOptionData opt; |
| - opt.option = PR_SockOpt_NoDelay; |
| + opt.option = PR_SockOpt_NoDelay; |
| opt.value.no_delay = (PRBool)!enabled; |
| if (osfd->methods->setsocketoption) { |
| - rv = (SECStatus) osfd->methods->setsocketoption(osfd, &opt); |
| + rv = (SECStatus)osfd->methods->setsocketoption(osfd, &opt); |
| } else { |
| PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0); |
| } |
| @@ -501,7 +498,7 @@ ssl_ChooseOps(sslSocket *ss) |
| static SECStatus |
| PrepareSocket(sslSocket *ss) |
| { |
| - SECStatus rv = SECSuccess; |
| + SECStatus rv = SECSuccess; |
| ssl_ChooseOps(ss); |
| return rv; |
| @@ -517,7 +514,8 @@ SSL_Enable(PRFileDesc *fd, int which, PRBool on) |
| static const PRCallOnceType pristineCallOnce; |
| static PRCallOnceType setupBypassOnce; |
| -static SECStatus SSL_BypassShutdown(void* appData, void* nssData) |
| +static SECStatus |
| +SSL_BypassShutdown(void *appData, void *nssData) |
| { |
| /* unload freeBL shared library from memory */ |
| BL_Unload(); |
| @@ -525,7 +523,8 @@ static SECStatus SSL_BypassShutdown(void* appData, void* nssData) |
| return SECSuccess; |
| } |
| -static PRStatus SSL_BypassRegisterShutdown(void) |
| +static PRStatus |
| +SSL_BypassRegisterShutdown(void) |
| { |
| SECStatus rv = NSS_RegisterShutdown(SSL_BypassShutdown, NULL); |
| PORT_Assert(SECSuccess == rv); |
| @@ -533,7 +532,8 @@ static PRStatus SSL_BypassRegisterShutdown(void) |
| } |
| #endif |
| -static PRStatus SSL_BypassSetup(void) |
| +static PRStatus |
| +SSL_BypassSetup(void) |
| { |
| #ifdef NO_PKCS11_BYPASS |
| /* Guarantee binary compatibility */ |
| @@ -543,12 +543,22 @@ static PRStatus SSL_BypassSetup(void) |
| #endif |
| } |
| +static PRBool ssl_VersionIsSupportedByPolicy( |
| + SSLProtocolVariant protocolVariant, SSL3ProtocolVersion version); |
| + |
| /* Implements the semantics for SSL_OptionSet(SSL_ENABLE_TLS, on) described in |
| * ssl.h in the section "SSL version range setting API". |
| */ |
| static void |
| ssl_EnableTLS(SSLVersionRange *vrange, PRBool on) |
| { |
| + if (on) { |
| + /* don't turn it on if tls1.0 disallowed by by policy */ |
| + if (!ssl_VersionIsSupportedByPolicy(ssl_variant_stream, |
| + SSL_LIBRARY_VERSION_TLS_1_0)) { |
| + return; |
| + } |
| + } |
| if (SSL3_ALL_VERSIONS_DISABLED(vrange)) { |
| if (on) { |
| vrange->min = SSL_LIBRARY_VERSION_TLS_1_0; |
| @@ -579,7 +589,14 @@ ssl_EnableTLS(SSLVersionRange *vrange, PRBool on) |
| static void |
| ssl_EnableSSL3(SSLVersionRange *vrange, PRBool on) |
| { |
| - if (SSL3_ALL_VERSIONS_DISABLED(vrange)) { |
| + if (on) { |
| + /* don't turn it on if ssl3 disallowed by by policy */ |
| + if (!ssl_VersionIsSupportedByPolicy(ssl_variant_stream, |
| + SSL_LIBRARY_VERSION_3_0)) { |
| + return; |
| + } |
| + } |
| + if (SSL3_ALL_VERSIONS_DISABLED(vrange)) { |
| if (on) { |
| vrange->min = SSL_LIBRARY_VERSION_3_0; |
| vrange->max = SSL_LIBRARY_VERSION_3_0; |
| @@ -587,13 +604,13 @@ ssl_EnableSSL3(SSLVersionRange *vrange, PRBool on) |
| return; |
| } |
| - if (on) { |
| + if (on) { |
| /* Expand the range of enabled versions to include SSL 3.0. We know |
| * SSL 3.0 or some version of TLS is already enabled at this point, so |
| * we don't need to change vrange->max. |
| */ |
| vrange->min = SSL_LIBRARY_VERSION_3_0; |
| - } else { |
| + } else { |
| /* Disable SSL 3.0, leaving TLS unaffected. */ |
| if (vrange->max > SSL_LIBRARY_VERSION_3_0) { |
| vrange->min = PR_MAX(vrange->min, SSL_LIBRARY_VERSION_TLS_1_0); |
| @@ -609,8 +626,8 @@ SECStatus |
| SSL_OptionSet(PRFileDesc *fd, PRInt32 which, PRBool on) |
| { |
| sslSocket *ss = ssl_FindSocket(fd); |
| - SECStatus rv = SECSuccess; |
| - PRBool holdingLocks; |
| + SECStatus rv = SECSuccess; |
| + PRBool holdingLocks; |
| if (!ss) { |
| SSL_DBG(("%d: SSL[%d]: bad socket in Enable", SSL_GETPID(), fd)); |
| @@ -622,235 +639,242 @@ SSL_OptionSet(PRFileDesc *fd, PRInt32 which, PRBool on) |
| ssl_GetSSL3HandshakeLock(ss); |
| switch (which) { |
| - case SSL_SOCKS: |
| - ss->opt.useSocks = PR_FALSE; |
| - rv = PrepareSocket(ss); |
| - if (on) { |
| - PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| - rv = SECFailure; |
| - } |
| - break; |
| - |
| - case SSL_SECURITY: |
| - ss->opt.useSecurity = on; |
| - rv = PrepareSocket(ss); |
| - break; |
| - |
| - case SSL_REQUEST_CERTIFICATE: |
| - ss->opt.requestCertificate = on; |
| - break; |
| + case SSL_SOCKS: |
| + ss->opt.useSocks = PR_FALSE; |
| + rv = PrepareSocket(ss); |
| + if (on) { |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + rv = SECFailure; |
| + } |
| + break; |
| - case SSL_REQUIRE_CERTIFICATE: |
| - ss->opt.requireCertificate = on; |
| - break; |
| + case SSL_SECURITY: |
| + ss->opt.useSecurity = on; |
| + rv = PrepareSocket(ss); |
| + break; |
| - case SSL_HANDSHAKE_AS_CLIENT: |
| - if ( ss->opt.handshakeAsServer && on ) { |
| - PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| - rv = SECFailure; |
| + case SSL_REQUEST_CERTIFICATE: |
| + ss->opt.requestCertificate = on; |
| break; |
| - } |
| - ss->opt.handshakeAsClient = on; |
| - break; |
| - case SSL_HANDSHAKE_AS_SERVER: |
| - if ( ss->opt.handshakeAsClient && on ) { |
| - PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| - rv = SECFailure; |
| + case SSL_REQUIRE_CERTIFICATE: |
| + ss->opt.requireCertificate = on; |
| break; |
| - } |
| - ss->opt.handshakeAsServer = on; |
| - break; |
| - case SSL_ENABLE_TLS: |
| - if (IS_DTLS(ss)) { |
| - if (on) { |
| + case SSL_HANDSHAKE_AS_CLIENT: |
| + if (ss->opt.handshakeAsServer && on) { |
| PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| - rv = SECFailure; /* not allowed */ |
| + rv = SECFailure; |
| + break; |
| } |
| + ss->opt.handshakeAsClient = on; |
| break; |
| - } |
| - ssl_EnableTLS(&ss->vrange, on); |
| - ss->preferredCipher = NULL; |
| - if (ss->cipherSpecs) { |
| - PORT_Free(ss->cipherSpecs); |
| - ss->cipherSpecs = NULL; |
| - ss->sizeCipherSpecs = 0; |
| - } |
| - break; |
| - case SSL_ENABLE_SSL3: |
| - if (IS_DTLS(ss)) { |
| - if (on) { |
| + case SSL_HANDSHAKE_AS_SERVER: |
| + if (ss->opt.handshakeAsClient && on) { |
| PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| - rv = SECFailure; /* not allowed */ |
| + rv = SECFailure; |
| + break; |
| } |
| + ss->opt.handshakeAsServer = on; |
| break; |
| - } |
| - ssl_EnableSSL3(&ss->vrange, on); |
| - ss->preferredCipher = NULL; |
| - if (ss->cipherSpecs) { |
| - PORT_Free(ss->cipherSpecs); |
| - ss->cipherSpecs = NULL; |
| - ss->sizeCipherSpecs = 0; |
| - } |
| - break; |
| - case SSL_ENABLE_SSL2: |
| - if (IS_DTLS(ss)) { |
| - if (on) { |
| - PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| - rv = SECFailure; /* not allowed */ |
| + case SSL_ENABLE_TLS: |
| + if (IS_DTLS(ss)) { |
| + if (on) { |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + rv = SECFailure; /* not allowed */ |
| + } |
| + break; |
| + } |
| + ssl_EnableTLS(&ss->vrange, on); |
| + ss->preferredCipher = NULL; |
| + if (ss->cipherSpecs) { |
| + PORT_Free(ss->cipherSpecs); |
| + ss->cipherSpecs = NULL; |
| + ss->sizeCipherSpecs = 0; |
| } |
| break; |
| - } |
| - ss->opt.enableSSL2 = on; |
| - if (on) { |
| - ss->opt.v2CompatibleHello = on; |
| - } |
| - ss->preferredCipher = NULL; |
| - if (ss->cipherSpecs) { |
| - PORT_Free(ss->cipherSpecs); |
| - ss->cipherSpecs = NULL; |
| - ss->sizeCipherSpecs = 0; |
| - } |
| - break; |
| - |
| - case SSL_NO_CACHE: |
| - ss->opt.noCache = on; |
| - break; |
| - case SSL_ENABLE_FDX: |
| - if (on && ss->opt.noLocks) { |
| - PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| - rv = SECFailure; |
| - } |
| - ss->opt.fdx = on; |
| - break; |
| + case SSL_ENABLE_SSL3: |
| + if (IS_DTLS(ss)) { |
| + if (on) { |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + rv = SECFailure; /* not allowed */ |
| + } |
| + break; |
| + } |
| + ssl_EnableSSL3(&ss->vrange, on); |
| + ss->preferredCipher = NULL; |
| + if (ss->cipherSpecs) { |
| + PORT_Free(ss->cipherSpecs); |
| + ss->cipherSpecs = NULL; |
| + ss->sizeCipherSpecs = 0; |
| + } |
| + break; |
| - case SSL_V2_COMPATIBLE_HELLO: |
| - if (IS_DTLS(ss)) { |
| + case SSL_ENABLE_SSL2: |
| + if (IS_DTLS(ss)) { |
| + if (on) { |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + rv = SECFailure; /* not allowed */ |
| + } |
| + break; |
| + } |
| if (on) { |
| + /* don't turn it on if ssl2 disallowed by by policy */ |
| + if (!ssl_VersionIsSupportedByPolicy(ssl_variant_stream, |
| + SSL_LIBRARY_VERSION_2)) { |
| + break; |
| + } |
| + } |
| + ss->opt.enableSSL2 = on; |
| + if (on) { |
| + ss->opt.v2CompatibleHello = on; |
| + } |
| + ss->preferredCipher = NULL; |
| + if (ss->cipherSpecs) { |
| + PORT_Free(ss->cipherSpecs); |
| + ss->cipherSpecs = NULL; |
| + ss->sizeCipherSpecs = 0; |
| + } |
| + break; |
| + |
| + case SSL_NO_CACHE: |
| + ss->opt.noCache = on; |
| + break; |
| + |
| + case SSL_ENABLE_FDX: |
| + if (on && ss->opt.noLocks) { |
| PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| - rv = SECFailure; /* not allowed */ |
| + rv = SECFailure; |
| } |
| + ss->opt.fdx = on; |
| break; |
| - } |
| - ss->opt.v2CompatibleHello = on; |
| - if (!on) { |
| - ss->opt.enableSSL2 = on; |
| - } |
| - break; |
| - case SSL_ROLLBACK_DETECTION: |
| - ss->opt.detectRollBack = on; |
| - break; |
| + case SSL_V2_COMPATIBLE_HELLO: |
| + if (IS_DTLS(ss)) { |
| + if (on) { |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + rv = SECFailure; /* not allowed */ |
| + } |
| + break; |
| + } |
| + ss->opt.v2CompatibleHello = on; |
| + if (!on) { |
| + ss->opt.enableSSL2 = on; |
| + } |
| + break; |
| - case SSL_NO_STEP_DOWN: |
| - ss->opt.noStepDown = on; |
| - if (on) |
| - SSL_DisableExportCipherSuites(fd); |
| - break; |
| + case SSL_ROLLBACK_DETECTION: |
| + ss->opt.detectRollBack = on; |
| + break; |
| - case SSL_BYPASS_PKCS11: |
| - if (ss->handshakeBegun) { |
| - PORT_SetError(PR_INVALID_STATE_ERROR); |
| - rv = SECFailure; |
| - } else { |
| - if (PR_FALSE != on) { |
| - if (PR_SUCCESS == SSL_BypassSetup() ) { |
| + case SSL_NO_STEP_DOWN: |
| + ss->opt.noStepDown = on; |
| + if (on) |
| + SSL_DisableExportCipherSuites(fd); |
| + break; |
| + |
| + case SSL_BYPASS_PKCS11: |
| + if (ss->handshakeBegun) { |
| + PORT_SetError(PR_INVALID_STATE_ERROR); |
| + rv = SECFailure; |
| + } else { |
| + if (PR_FALSE != on) { |
| + if (PR_SUCCESS == SSL_BypassSetup()) { |
| #ifdef NO_PKCS11_BYPASS |
| - ss->opt.bypassPKCS11 = PR_FALSE; |
| + ss->opt.bypassPKCS11 = PR_FALSE; |
| #else |
| - ss->opt.bypassPKCS11 = on; |
| + ss->opt.bypassPKCS11 = on; |
| #endif |
| + } else { |
| + rv = SECFailure; |
| + } |
| } else { |
| - rv = SECFailure; |
| + ss->opt.bypassPKCS11 = PR_FALSE; |
| } |
| - } else { |
| - ss->opt.bypassPKCS11 = PR_FALSE; |
| } |
| - } |
| - break; |
| + break; |
| - case SSL_NO_LOCKS: |
| - if (on && ss->opt.fdx) { |
| - PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| - rv = SECFailure; |
| - } |
| - if (on && ssl_force_locks) |
| - on = PR_FALSE; /* silent override */ |
| - ss->opt.noLocks = on; |
| - if (on) { |
| - locksEverDisabled = PR_TRUE; |
| - strcpy(lockStatus + LOCKSTATUS_OFFSET, "DISABLED."); |
| - } else if (!holdingLocks) { |
| - rv = ssl_MakeLocks(ss); |
| - if (rv != SECSuccess) { |
| - ss->opt.noLocks = PR_TRUE; |
| + case SSL_NO_LOCKS: |
| + if (on && ss->opt.fdx) { |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + rv = SECFailure; |
| } |
| - } |
| - break; |
| + if (on && ssl_force_locks) |
| + on = PR_FALSE; /* silent override */ |
| + ss->opt.noLocks = on; |
| + if (on) { |
| + locksEverDisabled = PR_TRUE; |
| + strcpy(lockStatus + LOCKSTATUS_OFFSET, "DISABLED."); |
| + } else if (!holdingLocks) { |
| + rv = ssl_MakeLocks(ss); |
| + if (rv != SECSuccess) { |
| + ss->opt.noLocks = PR_TRUE; |
| + } |
| + } |
| + break; |
| - case SSL_ENABLE_SESSION_TICKETS: |
| - ss->opt.enableSessionTickets = on; |
| - break; |
| + case SSL_ENABLE_SESSION_TICKETS: |
| + ss->opt.enableSessionTickets = on; |
| + break; |
| - case SSL_ENABLE_DEFLATE: |
| - ss->opt.enableDeflate = on; |
| - break; |
| + case SSL_ENABLE_DEFLATE: |
| + ss->opt.enableDeflate = on; |
| + break; |
| - case SSL_ENABLE_RENEGOTIATION: |
| - ss->opt.enableRenegotiation = on; |
| - break; |
| + case SSL_ENABLE_RENEGOTIATION: |
| + ss->opt.enableRenegotiation = on; |
| + break; |
| - case SSL_REQUIRE_SAFE_NEGOTIATION: |
| - ss->opt.requireSafeNegotiation = on; |
| - break; |
| + case SSL_REQUIRE_SAFE_NEGOTIATION: |
| + ss->opt.requireSafeNegotiation = on; |
| + break; |
| - case SSL_ENABLE_FALSE_START: |
| - ss->opt.enableFalseStart = on; |
| - break; |
| + case SSL_ENABLE_FALSE_START: |
| + ss->opt.enableFalseStart = on; |
| + break; |
| - case SSL_CBC_RANDOM_IV: |
| - ss->opt.cbcRandomIV = on; |
| - break; |
| + case SSL_CBC_RANDOM_IV: |
| + ss->opt.cbcRandomIV = on; |
| + break; |
| - case SSL_ENABLE_OCSP_STAPLING: |
| - ss->opt.enableOCSPStapling = on; |
| - break; |
| + case SSL_ENABLE_OCSP_STAPLING: |
| + ss->opt.enableOCSPStapling = on; |
| + break; |
| - case SSL_ENABLE_NPN: |
| - ss->opt.enableNPN = on; |
| - break; |
| + case SSL_ENABLE_NPN: |
| + ss->opt.enableNPN = on; |
| + break; |
| - case SSL_ENABLE_ALPN: |
| - ss->opt.enableALPN = on; |
| - break; |
| + case SSL_ENABLE_ALPN: |
| + ss->opt.enableALPN = on; |
| + break; |
| - case SSL_REUSE_SERVER_ECDHE_KEY: |
| - ss->opt.reuseServerECDHEKey = on; |
| - break; |
| + case SSL_REUSE_SERVER_ECDHE_KEY: |
| + ss->opt.reuseServerECDHEKey = on; |
| + break; |
| - case SSL_ENABLE_FALLBACK_SCSV: |
| - ss->opt.enableFallbackSCSV = on; |
| - break; |
| + case SSL_ENABLE_FALLBACK_SCSV: |
| + ss->opt.enableFallbackSCSV = on; |
| + break; |
| - case SSL_ENABLE_SERVER_DHE: |
| - ss->opt.enableServerDhe = on; |
| - break; |
| + case SSL_ENABLE_SERVER_DHE: |
| + ss->opt.enableServerDhe = on; |
| + break; |
| - case SSL_ENABLE_EXTENDED_MASTER_SECRET: |
| - ss->opt.enableExtendedMS = on; |
| - break; |
| + case SSL_ENABLE_EXTENDED_MASTER_SECRET: |
| + ss->opt.enableExtendedMS = on; |
| + break; |
| - case SSL_ENABLE_SIGNED_CERT_TIMESTAMPS: |
| - ss->opt.enableSignedCertTimestamps = on; |
| - break; |
| + case SSL_ENABLE_SIGNED_CERT_TIMESTAMPS: |
| + ss->opt.enableSignedCertTimestamps = on; |
| + break; |
| - default: |
| - PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| - rv = SECFailure; |
| + default: |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + rv = SECFailure; |
| } |
| /* We can't use the macros for releasing the locks here, |
| @@ -870,8 +894,8 @@ SECStatus |
| SSL_OptionGet(PRFileDesc *fd, PRInt32 which, PRBool *pOn) |
| { |
| sslSocket *ss = ssl_FindSocket(fd); |
| - SECStatus rv = SECSuccess; |
| - PRBool on = PR_FALSE; |
| + SECStatus rv = SECSuccess; |
| + PRBool on = PR_FALSE; |
| if (!pOn) { |
| PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| @@ -887,52 +911,100 @@ SSL_OptionGet(PRFileDesc *fd, PRInt32 which, PRBool *pOn) |
| ssl_GetSSL3HandshakeLock(ss); |
| switch (which) { |
| - case SSL_SOCKS: on = PR_FALSE; break; |
| - case SSL_SECURITY: on = ss->opt.useSecurity; break; |
| - case SSL_REQUEST_CERTIFICATE: on = ss->opt.requestCertificate; break; |
| - case SSL_REQUIRE_CERTIFICATE: on = ss->opt.requireCertificate; break; |
| - case SSL_HANDSHAKE_AS_CLIENT: on = ss->opt.handshakeAsClient; break; |
| - case SSL_HANDSHAKE_AS_SERVER: on = ss->opt.handshakeAsServer; break; |
| - case SSL_ENABLE_TLS: |
| - on = ss->vrange.max >= SSL_LIBRARY_VERSION_TLS_1_0; |
| - break; |
| - case SSL_ENABLE_SSL3: |
| - on = ss->vrange.min == SSL_LIBRARY_VERSION_3_0; |
| - break; |
| - case SSL_ENABLE_SSL2: on = ss->opt.enableSSL2; break; |
| - case SSL_NO_CACHE: on = ss->opt.noCache; break; |
| - case SSL_ENABLE_FDX: on = ss->opt.fdx; break; |
| - case SSL_V2_COMPATIBLE_HELLO: on = ss->opt.v2CompatibleHello; break; |
| - case SSL_ROLLBACK_DETECTION: on = ss->opt.detectRollBack; break; |
| - case SSL_NO_STEP_DOWN: on = ss->opt.noStepDown; break; |
| - case SSL_BYPASS_PKCS11: on = ss->opt.bypassPKCS11; break; |
| - case SSL_NO_LOCKS: on = ss->opt.noLocks; break; |
| - case SSL_ENABLE_SESSION_TICKETS: |
| - on = ss->opt.enableSessionTickets; |
| - break; |
| - case SSL_ENABLE_DEFLATE: on = ss->opt.enableDeflate; break; |
| - case SSL_ENABLE_RENEGOTIATION: |
| - on = ss->opt.enableRenegotiation; break; |
| - case SSL_REQUIRE_SAFE_NEGOTIATION: |
| - on = ss->opt.requireSafeNegotiation; break; |
| - case SSL_ENABLE_FALSE_START: on = ss->opt.enableFalseStart; break; |
| - case SSL_CBC_RANDOM_IV: on = ss->opt.cbcRandomIV; break; |
| - case SSL_ENABLE_OCSP_STAPLING: on = ss->opt.enableOCSPStapling; break; |
| - case SSL_ENABLE_NPN: on = ss->opt.enableNPN; break; |
| - case SSL_ENABLE_ALPN: on = ss->opt.enableALPN; break; |
| - case SSL_REUSE_SERVER_ECDHE_KEY: |
| - on = ss->opt.reuseServerECDHEKey; break; |
| - case SSL_ENABLE_FALLBACK_SCSV: on = ss->opt.enableFallbackSCSV; break; |
| - case SSL_ENABLE_SERVER_DHE: on = ss->opt.enableServerDhe; break; |
| - case SSL_ENABLE_EXTENDED_MASTER_SECRET: |
| - on = ss->opt.enableExtendedMS; break; |
| - case SSL_ENABLE_SIGNED_CERT_TIMESTAMPS: |
| - on = ss->opt.enableSignedCertTimestamps; |
| - break; |
| - |
| - default: |
| - PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| - rv = SECFailure; |
| + case SSL_SOCKS: |
| + on = PR_FALSE; |
| + break; |
| + case SSL_SECURITY: |
| + on = ss->opt.useSecurity; |
| + break; |
| + case SSL_REQUEST_CERTIFICATE: |
| + on = ss->opt.requestCertificate; |
| + break; |
| + case SSL_REQUIRE_CERTIFICATE: |
| + on = ss->opt.requireCertificate; |
| + break; |
| + case SSL_HANDSHAKE_AS_CLIENT: |
| + on = ss->opt.handshakeAsClient; |
| + break; |
| + case SSL_HANDSHAKE_AS_SERVER: |
| + on = ss->opt.handshakeAsServer; |
| + break; |
| + case SSL_ENABLE_TLS: |
| + on = ss->vrange.max >= SSL_LIBRARY_VERSION_TLS_1_0; |
| + break; |
| + case SSL_ENABLE_SSL3: |
| + on = ss->vrange.min == SSL_LIBRARY_VERSION_3_0; |
| + break; |
| + case SSL_ENABLE_SSL2: |
| + on = ss->opt.enableSSL2; |
| + break; |
| + case SSL_NO_CACHE: |
| + on = ss->opt.noCache; |
| + break; |
| + case SSL_ENABLE_FDX: |
| + on = ss->opt.fdx; |
| + break; |
| + case SSL_V2_COMPATIBLE_HELLO: |
| + on = ss->opt.v2CompatibleHello; |
| + break; |
| + case SSL_ROLLBACK_DETECTION: |
| + on = ss->opt.detectRollBack; |
| + break; |
| + case SSL_NO_STEP_DOWN: |
| + on = ss->opt.noStepDown; |
| + break; |
| + case SSL_BYPASS_PKCS11: |
| + on = ss->opt.bypassPKCS11; |
| + break; |
| + case SSL_NO_LOCKS: |
| + on = ss->opt.noLocks; |
| + break; |
| + case SSL_ENABLE_SESSION_TICKETS: |
| + on = ss->opt.enableSessionTickets; |
| + break; |
| + case SSL_ENABLE_DEFLATE: |
| + on = ss->opt.enableDeflate; |
| + break; |
| + case SSL_ENABLE_RENEGOTIATION: |
| + on = ss->opt.enableRenegotiation; |
| + break; |
| + case SSL_REQUIRE_SAFE_NEGOTIATION: |
| + on = ss->opt.requireSafeNegotiation; |
| + break; |
| + case SSL_ENABLE_FALSE_START: |
| + on = ss->opt.enableFalseStart; |
| + break; |
| + case SSL_CBC_RANDOM_IV: |
| + on = ss->opt.cbcRandomIV; |
| + break; |
| + case SSL_ENABLE_OCSP_STAPLING: |
| + on = ss->opt.enableOCSPStapling; |
| + break; |
| + case SSL_ENABLE_NPN: |
| + on = ss->opt.enableNPN; |
| + break; |
| + case SSL_ENABLE_ALPN: |
| + on = ss->opt.enableALPN; |
| + break; |
| + case SSL_REUSE_SERVER_ECDHE_KEY: |
| + on = ss->opt.reuseServerECDHEKey; |
| + break; |
| + case SSL_ENABLE_FALLBACK_SCSV: |
| + on = ss->opt.enableFallbackSCSV; |
| + break; |
| + case SSL_ENABLE_SERVER_DHE: |
| + on = ss->opt.enableServerDhe; |
| + break; |
| + case SSL_ENABLE_EXTENDED_MASTER_SECRET: |
| + on = ss->opt.enableExtendedMS; |
| + break; |
| + case SSL_ENABLE_SIGNED_CERT_TIMESTAMPS: |
| + on = ss->opt.enableSignedCertTimestamps; |
| + break; |
| + |
| + default: |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + rv = SECFailure; |
| } |
| ssl_ReleaseSSL3HandshakeLock(ss); |
| @@ -945,8 +1017,8 @@ SSL_OptionGet(PRFileDesc *fd, PRInt32 which, PRBool *pOn) |
| SECStatus |
| SSL_OptionGetDefault(PRInt32 which, PRBool *pOn) |
| { |
| - SECStatus rv = SECSuccess; |
| - PRBool on = PR_FALSE; |
| + SECStatus rv = SECSuccess; |
| + PRBool on = PR_FALSE; |
| if (!pOn) { |
| PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| @@ -956,61 +1028,100 @@ SSL_OptionGetDefault(PRInt32 which, PRBool *pOn) |
| ssl_SetDefaultsFromEnvironment(); |
| switch (which) { |
| - case SSL_SOCKS: on = PR_FALSE; break; |
| - case SSL_SECURITY: on = ssl_defaults.useSecurity; break; |
| - case SSL_REQUEST_CERTIFICATE: on = ssl_defaults.requestCertificate; break; |
| - case SSL_REQUIRE_CERTIFICATE: on = ssl_defaults.requireCertificate; break; |
| - case SSL_HANDSHAKE_AS_CLIENT: on = ssl_defaults.handshakeAsClient; break; |
| - case SSL_HANDSHAKE_AS_SERVER: on = ssl_defaults.handshakeAsServer; break; |
| - case SSL_ENABLE_TLS: |
| - on = versions_defaults_stream.max >= SSL_LIBRARY_VERSION_TLS_1_0; |
| - break; |
| - case SSL_ENABLE_SSL3: |
| - on = versions_defaults_stream.min == SSL_LIBRARY_VERSION_3_0; |
| - break; |
| - case SSL_ENABLE_SSL2: on = ssl_defaults.enableSSL2; break; |
| - case SSL_NO_CACHE: on = ssl_defaults.noCache; break; |
| - case SSL_ENABLE_FDX: on = ssl_defaults.fdx; break; |
| - case SSL_V2_COMPATIBLE_HELLO: on = ssl_defaults.v2CompatibleHello; break; |
| - case SSL_ROLLBACK_DETECTION: on = ssl_defaults.detectRollBack; break; |
| - case SSL_NO_STEP_DOWN: on = ssl_defaults.noStepDown; break; |
| - case SSL_BYPASS_PKCS11: on = ssl_defaults.bypassPKCS11; break; |
| - case SSL_NO_LOCKS: on = ssl_defaults.noLocks; break; |
| - case SSL_ENABLE_SESSION_TICKETS: |
| - on = ssl_defaults.enableSessionTickets; |
| - break; |
| - case SSL_ENABLE_DEFLATE: on = ssl_defaults.enableDeflate; break; |
| - case SSL_ENABLE_RENEGOTIATION: |
| - on = ssl_defaults.enableRenegotiation; break; |
| - case SSL_REQUIRE_SAFE_NEGOTIATION: |
| - on = ssl_defaults.requireSafeNegotiation; |
| - break; |
| - case SSL_ENABLE_FALSE_START: on = ssl_defaults.enableFalseStart; break; |
| - case SSL_CBC_RANDOM_IV: on = ssl_defaults.cbcRandomIV; break; |
| - case SSL_ENABLE_OCSP_STAPLING: |
| - on = ssl_defaults.enableOCSPStapling; |
| - break; |
| - case SSL_ENABLE_NPN: on = ssl_defaults.enableNPN; break; |
| - case SSL_ENABLE_ALPN: on = ssl_defaults.enableALPN; break; |
| - case SSL_REUSE_SERVER_ECDHE_KEY: |
| - on = ssl_defaults.reuseServerECDHEKey; |
| - break; |
| - case SSL_ENABLE_FALLBACK_SCSV: |
| - on = ssl_defaults.enableFallbackSCSV; |
| - break; |
| - case SSL_ENABLE_SERVER_DHE: |
| - on = ssl_defaults.enableServerDhe; |
| - break; |
| - case SSL_ENABLE_EXTENDED_MASTER_SECRET: |
| - on = ssl_defaults.enableExtendedMS; |
| - break; |
| - case SSL_ENABLE_SIGNED_CERT_TIMESTAMPS: |
| - on = ssl_defaults.enableSignedCertTimestamps; |
| - break; |
| - |
| - default: |
| - PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| - rv = SECFailure; |
| + case SSL_SOCKS: |
| + on = PR_FALSE; |
| + break; |
| + case SSL_SECURITY: |
| + on = ssl_defaults.useSecurity; |
| + break; |
| + case SSL_REQUEST_CERTIFICATE: |
| + on = ssl_defaults.requestCertificate; |
| + break; |
| + case SSL_REQUIRE_CERTIFICATE: |
| + on = ssl_defaults.requireCertificate; |
| + break; |
| + case SSL_HANDSHAKE_AS_CLIENT: |
| + on = ssl_defaults.handshakeAsClient; |
| + break; |
| + case SSL_HANDSHAKE_AS_SERVER: |
| + on = ssl_defaults.handshakeAsServer; |
| + break; |
| + case SSL_ENABLE_TLS: |
| + on = versions_defaults_stream.max >= SSL_LIBRARY_VERSION_TLS_1_0; |
| + break; |
| + case SSL_ENABLE_SSL3: |
| + on = versions_defaults_stream.min == SSL_LIBRARY_VERSION_3_0; |
| + break; |
| + case SSL_ENABLE_SSL2: |
| + on = ssl_defaults.enableSSL2; |
| + break; |
| + case SSL_NO_CACHE: |
| + on = ssl_defaults.noCache; |
| + break; |
| + case SSL_ENABLE_FDX: |
| + on = ssl_defaults.fdx; |
| + break; |
| + case SSL_V2_COMPATIBLE_HELLO: |
| + on = ssl_defaults.v2CompatibleHello; |
| + break; |
| + case SSL_ROLLBACK_DETECTION: |
| + on = ssl_defaults.detectRollBack; |
| + break; |
| + case SSL_NO_STEP_DOWN: |
| + on = ssl_defaults.noStepDown; |
| + break; |
| + case SSL_BYPASS_PKCS11: |
| + on = ssl_defaults.bypassPKCS11; |
| + break; |
| + case SSL_NO_LOCKS: |
| + on = ssl_defaults.noLocks; |
| + break; |
| + case SSL_ENABLE_SESSION_TICKETS: |
| + on = ssl_defaults.enableSessionTickets; |
| + break; |
| + case SSL_ENABLE_DEFLATE: |
| + on = ssl_defaults.enableDeflate; |
| + break; |
| + case SSL_ENABLE_RENEGOTIATION: |
| + on = ssl_defaults.enableRenegotiation; |
| + break; |
| + case SSL_REQUIRE_SAFE_NEGOTIATION: |
| + on = ssl_defaults.requireSafeNegotiation; |
| + break; |
| + case SSL_ENABLE_FALSE_START: |
| + on = ssl_defaults.enableFalseStart; |
| + break; |
| + case SSL_CBC_RANDOM_IV: |
| + on = ssl_defaults.cbcRandomIV; |
| + break; |
| + case SSL_ENABLE_OCSP_STAPLING: |
| + on = ssl_defaults.enableOCSPStapling; |
| + break; |
| + case SSL_ENABLE_NPN: |
| + on = ssl_defaults.enableNPN; |
| + break; |
| + case SSL_ENABLE_ALPN: |
| + on = ssl_defaults.enableALPN; |
| + break; |
| + case SSL_REUSE_SERVER_ECDHE_KEY: |
| + on = ssl_defaults.reuseServerECDHEKey; |
| + break; |
| + case SSL_ENABLE_FALLBACK_SCSV: |
| + on = ssl_defaults.enableFallbackSCSV; |
| + break; |
| + case SSL_ENABLE_SERVER_DHE: |
| + on = ssl_defaults.enableServerDhe; |
| + break; |
| + case SSL_ENABLE_EXTENDED_MASTER_SECRET: |
| + on = ssl_defaults.enableExtendedMS; |
| + break; |
| + case SSL_ENABLE_SIGNED_CERT_TIMESTAMPS: |
| + on = ssl_defaults.enableSignedCertTimestamps; |
| + break; |
| + |
| + default: |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + rv = SECFailure; |
| } |
| *pOn = on; |
| @@ -1036,175 +1147,182 @@ SSL_OptionSetDefault(PRInt32 which, PRBool on) |
| ssl_SetDefaultsFromEnvironment(); |
| switch (which) { |
| - case SSL_SOCKS: |
| - ssl_defaults.useSocks = PR_FALSE; |
| - if (on) { |
| - PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| - return SECFailure; |
| - } |
| - break; |
| + case SSL_SOCKS: |
| + ssl_defaults.useSocks = PR_FALSE; |
| + if (on) { |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + return SECFailure; |
| + } |
| + break; |
| - case SSL_SECURITY: |
| - ssl_defaults.useSecurity = on; |
| - break; |
| + case SSL_SECURITY: |
| + ssl_defaults.useSecurity = on; |
| + break; |
| - case SSL_REQUEST_CERTIFICATE: |
| - ssl_defaults.requestCertificate = on; |
| - break; |
| + case SSL_REQUEST_CERTIFICATE: |
| + ssl_defaults.requestCertificate = on; |
| + break; |
| - case SSL_REQUIRE_CERTIFICATE: |
| - ssl_defaults.requireCertificate = on; |
| - break; |
| + case SSL_REQUIRE_CERTIFICATE: |
| + ssl_defaults.requireCertificate = on; |
| + break; |
| - case SSL_HANDSHAKE_AS_CLIENT: |
| - if ( ssl_defaults.handshakeAsServer && on ) { |
| - PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| - return SECFailure; |
| - } |
| - ssl_defaults.handshakeAsClient = on; |
| - break; |
| + case SSL_HANDSHAKE_AS_CLIENT: |
| + if (ssl_defaults.handshakeAsServer && on) { |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + return SECFailure; |
| + } |
| + ssl_defaults.handshakeAsClient = on; |
| + break; |
| - case SSL_HANDSHAKE_AS_SERVER: |
| - if ( ssl_defaults.handshakeAsClient && on ) { |
| - PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| - return SECFailure; |
| - } |
| - ssl_defaults.handshakeAsServer = on; |
| - break; |
| + case SSL_HANDSHAKE_AS_SERVER: |
| + if (ssl_defaults.handshakeAsClient && on) { |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + return SECFailure; |
| + } |
| + ssl_defaults.handshakeAsServer = on; |
| + break; |
| - case SSL_ENABLE_TLS: |
| - ssl_EnableTLS(&versions_defaults_stream, on); |
| - break; |
| + case SSL_ENABLE_TLS: |
| + ssl_EnableTLS(&versions_defaults_stream, on); |
| + break; |
| - case SSL_ENABLE_SSL3: |
| - ssl_EnableSSL3(&versions_defaults_stream, on); |
| - break; |
| + case SSL_ENABLE_SSL3: |
| + ssl_EnableSSL3(&versions_defaults_stream, on); |
| + break; |
| - case SSL_ENABLE_SSL2: |
| - ssl_defaults.enableSSL2 = on; |
| - if (on) { |
| - ssl_defaults.v2CompatibleHello = on; |
| - } |
| - break; |
| + case SSL_ENABLE_SSL2: |
| + if (on) { |
| + /* don't turn it on if ssl2 disallowed by by policy */ |
| + if (!ssl_VersionIsSupportedByPolicy(ssl_variant_stream, |
| + SSL_LIBRARY_VERSION_2)) { |
| + break; |
| + } |
| + } |
| + ssl_defaults.enableSSL2 = on; |
| + if (on) { |
| + ssl_defaults.v2CompatibleHello = on; |
| + } |
| + break; |
| - case SSL_NO_CACHE: |
| - ssl_defaults.noCache = on; |
| - break; |
| + case SSL_NO_CACHE: |
| + ssl_defaults.noCache = on; |
| + break; |
| - case SSL_ENABLE_FDX: |
| - if (on && ssl_defaults.noLocks) { |
| - PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| - return SECFailure; |
| - } |
| - ssl_defaults.fdx = on; |
| - break; |
| + case SSL_ENABLE_FDX: |
| + if (on && ssl_defaults.noLocks) { |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + return SECFailure; |
| + } |
| + ssl_defaults.fdx = on; |
| + break; |
| - case SSL_V2_COMPATIBLE_HELLO: |
| - ssl_defaults.v2CompatibleHello = on; |
| - if (!on) { |
| - ssl_defaults.enableSSL2 = on; |
| - } |
| - break; |
| + case SSL_V2_COMPATIBLE_HELLO: |
| + ssl_defaults.v2CompatibleHello = on; |
| + if (!on) { |
| + ssl_defaults.enableSSL2 = on; |
| + } |
| + break; |
| - case SSL_ROLLBACK_DETECTION: |
| - ssl_defaults.detectRollBack = on; |
| - break; |
| + case SSL_ROLLBACK_DETECTION: |
| + ssl_defaults.detectRollBack = on; |
| + break; |
| - case SSL_NO_STEP_DOWN: |
| - ssl_defaults.noStepDown = on; |
| - if (on) |
| - SSL_DisableDefaultExportCipherSuites(); |
| - break; |
| + case SSL_NO_STEP_DOWN: |
| + ssl_defaults.noStepDown = on; |
| + if (on) |
| + SSL_DisableDefaultExportCipherSuites(); |
| + break; |
| - case SSL_BYPASS_PKCS11: |
| - if (PR_FALSE != on) { |
| - if (PR_SUCCESS == SSL_BypassSetup()) { |
| + case SSL_BYPASS_PKCS11: |
| + if (PR_FALSE != on) { |
| + if (PR_SUCCESS == SSL_BypassSetup()) { |
| #ifdef NO_PKCS11_BYPASS |
| - ssl_defaults.bypassPKCS11 = PR_FALSE; |
| + ssl_defaults.bypassPKCS11 = PR_FALSE; |
| #else |
| - ssl_defaults.bypassPKCS11 = on; |
| + ssl_defaults.bypassPKCS11 = on; |
| #endif |
| + } else { |
| + return SECFailure; |
| + } |
| } else { |
| - return SECFailure; |
| + ssl_defaults.bypassPKCS11 = PR_FALSE; |
| } |
| - } else { |
| - ssl_defaults.bypassPKCS11 = PR_FALSE; |
| - } |
| - break; |
| + break; |
| - case SSL_NO_LOCKS: |
| - if (on && ssl_defaults.fdx) { |
| - PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| - return SECFailure; |
| - } |
| - if (on && ssl_force_locks) |
| - on = PR_FALSE; /* silent override */ |
| - ssl_defaults.noLocks = on; |
| - if (on) { |
| - locksEverDisabled = PR_TRUE; |
| - strcpy(lockStatus + LOCKSTATUS_OFFSET, "DISABLED."); |
| - } |
| - break; |
| + case SSL_NO_LOCKS: |
| + if (on && ssl_defaults.fdx) { |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + return SECFailure; |
| + } |
| + if (on && ssl_force_locks) |
| + on = PR_FALSE; /* silent override */ |
| + ssl_defaults.noLocks = on; |
| + if (on) { |
| + locksEverDisabled = PR_TRUE; |
| + strcpy(lockStatus + LOCKSTATUS_OFFSET, "DISABLED."); |
| + } |
| + break; |
| - case SSL_ENABLE_SESSION_TICKETS: |
| - ssl_defaults.enableSessionTickets = on; |
| - break; |
| + case SSL_ENABLE_SESSION_TICKETS: |
| + ssl_defaults.enableSessionTickets = on; |
| + break; |
| - case SSL_ENABLE_DEFLATE: |
| - ssl_defaults.enableDeflate = on; |
| - break; |
| + case SSL_ENABLE_DEFLATE: |
| + ssl_defaults.enableDeflate = on; |
| + break; |
| - case SSL_ENABLE_RENEGOTIATION: |
| - ssl_defaults.enableRenegotiation = on; |
| - break; |
| + case SSL_ENABLE_RENEGOTIATION: |
| + ssl_defaults.enableRenegotiation = on; |
| + break; |
| - case SSL_REQUIRE_SAFE_NEGOTIATION: |
| - ssl_defaults.requireSafeNegotiation = on; |
| - break; |
| + case SSL_REQUIRE_SAFE_NEGOTIATION: |
| + ssl_defaults.requireSafeNegotiation = on; |
| + break; |
| - case SSL_ENABLE_FALSE_START: |
| - ssl_defaults.enableFalseStart = on; |
| - break; |
| + case SSL_ENABLE_FALSE_START: |
| + ssl_defaults.enableFalseStart = on; |
| + break; |
| - case SSL_CBC_RANDOM_IV: |
| - ssl_defaults.cbcRandomIV = on; |
| - break; |
| + case SSL_CBC_RANDOM_IV: |
| + ssl_defaults.cbcRandomIV = on; |
| + break; |
| - case SSL_ENABLE_OCSP_STAPLING: |
| - ssl_defaults.enableOCSPStapling = on; |
| - break; |
| + case SSL_ENABLE_OCSP_STAPLING: |
| + ssl_defaults.enableOCSPStapling = on; |
| + break; |
| - case SSL_ENABLE_NPN: |
| - ssl_defaults.enableNPN = on; |
| - break; |
| + case SSL_ENABLE_NPN: |
| + ssl_defaults.enableNPN = on; |
| + break; |
| - case SSL_ENABLE_ALPN: |
| - ssl_defaults.enableALPN = on; |
| - break; |
| + case SSL_ENABLE_ALPN: |
| + ssl_defaults.enableALPN = on; |
| + break; |
| - case SSL_REUSE_SERVER_ECDHE_KEY: |
| - ssl_defaults.reuseServerECDHEKey = on; |
| - break; |
| + case SSL_REUSE_SERVER_ECDHE_KEY: |
| + ssl_defaults.reuseServerECDHEKey = on; |
| + break; |
| - case SSL_ENABLE_FALLBACK_SCSV: |
| - ssl_defaults.enableFallbackSCSV = on; |
| - break; |
| + case SSL_ENABLE_FALLBACK_SCSV: |
| + ssl_defaults.enableFallbackSCSV = on; |
| + break; |
| - case SSL_ENABLE_SERVER_DHE: |
| - ssl_defaults.enableServerDhe = on; |
| - break; |
| + case SSL_ENABLE_SERVER_DHE: |
| + ssl_defaults.enableServerDhe = on; |
| + break; |
| - case SSL_ENABLE_EXTENDED_MASTER_SECRET: |
| - ssl_defaults.enableExtendedMS = on; |
| - break; |
| + case SSL_ENABLE_EXTENDED_MASTER_SECRET: |
| + ssl_defaults.enableExtendedMS = on; |
| + break; |
| - case SSL_ENABLE_SIGNED_CERT_TIMESTAMPS: |
| - ssl_defaults.enableSignedCertTimestamps = on; |
| - break; |
| + case SSL_ENABLE_SIGNED_CERT_TIMESTAMPS: |
| + ssl_defaults.enableSignedCertTimestamps = on; |
| + break; |
| - default: |
| - PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| - return SECFailure; |
| + default: |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + return SECFailure; |
| } |
| return SECSuccess; |
| } |
| @@ -1214,12 +1332,12 @@ static PRBool |
| ssl_IsRemovedCipherSuite(PRInt32 suite) |
| { |
| switch (suite) { |
| - case SSL_FORTEZZA_DMS_WITH_NULL_SHA: |
| - case SSL_FORTEZZA_DMS_WITH_FORTEZZA_CBC_SHA: |
| - case SSL_FORTEZZA_DMS_WITH_RC4_128_SHA: |
| - return PR_TRUE; |
| - default: |
| - return PR_FALSE; |
| + case SSL_FORTEZZA_DMS_WITH_NULL_SHA: |
| + case SSL_FORTEZZA_DMS_WITH_FORTEZZA_CBC_SHA: |
| + case SSL_FORTEZZA_DMS_WITH_RC4_128_SHA: |
| + return PR_TRUE; |
| + default: |
| + return PR_FALSE; |
| } |
| } |
| @@ -1243,13 +1361,9 @@ SSL_SetPolicy(long which, int policy) |
| } |
| SECStatus |
| -SSL_CipherPolicySet(PRInt32 which, PRInt32 policy) |
| +ssl_CipherPolicySet(PRInt32 which, PRInt32 policy) |
| { |
| - SECStatus rv = ssl_Init(); |
| - |
| - if (rv != SECSuccess) { |
| - return rv; |
| - } |
| + SECStatus rv = SECSuccess; |
| if (ssl_IsRemovedCipherSuite(which)) { |
| rv = SECSuccess; |
| @@ -1260,6 +1374,16 @@ SSL_CipherPolicySet(PRInt32 which, PRInt32 policy) |
| } |
| return rv; |
| } |
| +SECStatus |
| +SSL_CipherPolicySet(PRInt32 which, PRInt32 policy) |
| +{ |
| + SECStatus rv = ssl_Init(); |
| + |
| + if (rv != SECSuccess) { |
| + return rv; |
| + } |
| + return ssl_CipherPolicySet(which, policy); |
| +} |
| SECStatus |
| SSL_CipherPolicyGet(PRInt32 which, PRInt32 *oPolicy) |
| @@ -1302,13 +1426,9 @@ SSL_EnableCipher(long which, PRBool enabled) |
| } |
| SECStatus |
| -SSL_CipherPrefSetDefault(PRInt32 which, PRBool enabled) |
| +ssl_CipherPrefSetDefault(PRInt32 which, PRBool enabled) |
| { |
| - SECStatus rv = ssl_Init(); |
| - |
| - if (rv != SECSuccess) { |
| - return rv; |
| - } |
| + SECStatus rv = SECSuccess; |
| if (ssl_IsRemovedCipherSuite(which)) |
| return SECSuccess; |
| @@ -1325,9 +1445,20 @@ SSL_CipherPrefSetDefault(PRInt32 which, PRBool enabled) |
| } |
| SECStatus |
| +SSL_CipherPrefSetDefault(PRInt32 which, PRBool enabled) |
| +{ |
| + SECStatus rv = ssl_Init(); |
| + |
| + if (rv != SECSuccess) { |
| + return rv; |
| + } |
| + return ssl_CipherPrefSetDefault(which, enabled); |
| +} |
| + |
| +SECStatus |
| SSL_CipherPrefGetDefault(PRInt32 which, PRBool *enabled) |
| { |
| - SECStatus rv; |
| + SECStatus rv; |
| if (!enabled) { |
| PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| @@ -1374,9 +1505,9 @@ SSL_CipherOrderSet(PRFileDesc *fd, const PRUint16 *ciphers, unsigned int len) |
| sslSocket *ss = ssl_FindSocket(fd); |
| if (!ss) { |
| - SSL_DBG(("%d: SSL[%d]: bad socket in CipherOrderSet", SSL_GETPID(), |
| - fd)); |
| - return SECFailure; |
| + SSL_DBG(("%d: SSL[%d]: bad socket in CipherOrderSet", SSL_GETPID(), |
| + fd)); |
| + return SECFailure; |
| } |
| return ssl3_CipherOrderSet(ss, ciphers, len); |
| } |
| @@ -1384,7 +1515,7 @@ SSL_CipherOrderSet(PRFileDesc *fd, const PRUint16 *ciphers, unsigned int len) |
| SECStatus |
| SSL_CipherPrefGet(PRFileDesc *fd, PRInt32 which, PRBool *enabled) |
| { |
| - SECStatus rv; |
| + SECStatus rv; |
| sslSocket *ss = ssl_FindSocket(fd); |
| if (!enabled) { |
| @@ -1410,8 +1541,16 @@ SSL_CipherPrefGet(PRFileDesc *fd, PRInt32 which, PRBool *enabled) |
| SECStatus |
| NSS_SetDomesticPolicy(void) |
| { |
| - SECStatus status = SECSuccess; |
| + SECStatus status = SECSuccess; |
| const PRUint16 *cipher; |
| + SECStatus rv; |
| + PRUint32 policy; |
| + |
| + /* If we've already defined some policy oids, skip changing them */ |
| + rv = NSS_GetAlgorithmPolicy(SEC_OID_APPLY_SSL_POLICY, &policy); |
| + if ((rv == SECSuccess) && (policy & NSS_USE_POLICY_IN_SSL)) { |
| + return ssl_Init(); /* make sure the policies have bee loaded */ |
|
svaldez
2016/04/01 19:50:01
*been
|
| + } |
| for (cipher = SSL_ImplementedCiphers; *cipher != 0; ++cipher) { |
| status = SSL_SetPolicy(*cipher, SSL_ALLOWED); |
| @@ -1469,7 +1608,6 @@ SSL_DHEGroupPrefSet(PRFileDesc *fd, |
| return SECSuccess; |
| } |
| - |
| PRCallOnceType gWeakDHParamsRegisterOnce; |
| int gWeakDHParamsRegisterError; |
| @@ -1498,7 +1636,7 @@ ssl3_CreateWeakDHParams(void) |
| rv = PK11_PQG_VerifyParams(gWeakParamsPQG, vfy, &passed); |
| if (rv != SECSuccess || passed != SECSuccess) { |
| SSL_DBG(("%d: PK11_PQG_VerifyParams failed in ssl3_CreateWeakDHParams", |
| - SSL_GETPID())); |
| + SSL_GETPID())); |
| gWeakDHParamsError = PORT_GetError(); |
| return PR_FAILURE; |
| } |
| @@ -1577,21 +1715,22 @@ SSL_EnableWeakDHEPrimeGroup(PRFileDesc *fd, PRBool enabled) |
| SECStatus |
| SSL_GetChannelBinding(PRFileDesc *fd, |
| - SSLChannelBindingType binding_type, |
| - unsigned char *out, |
| - unsigned int *outLen, |
| - unsigned int outLenMax) { |
| + SSLChannelBindingType binding_type, |
| + unsigned char *out, |
| + unsigned int *outLen, |
| + unsigned int outLenMax) |
| +{ |
| sslSocket *ss = ssl_FindSocket(fd); |
| if (!ss) { |
| - SSL_DBG(("%d: SSL[%d]: bad socket in SSL_GetChannelBinding", |
| - SSL_GETPID(), fd)); |
| - return SECFailure; |
| + SSL_DBG(("%d: SSL[%d]: bad socket in SSL_GetChannelBinding", |
| + SSL_GETPID(), fd)); |
| + return SECFailure; |
| } |
| if (binding_type != SSL_CHANNEL_BINDING_TLS_UNIQUE) { |
| - PORT_SetError(PR_INVALID_ARGUMENT_ERROR); |
| - return SECFailure; |
| + PORT_SetError(PR_INVALID_ARGUMENT_ERROR); |
| + return SECFailure; |
| } |
| return ssl3_GetTLSUniqueChannelBinding(ss, out, outLen, outLenMax); |
| @@ -1636,11 +1775,11 @@ ssl3_SelectDHParams(sslSocket *ss) |
| } else { |
| if (ss->ssl3.dheGroups) { |
| selectedGroup = selectDHEGroup(ss, ss->ssl3.dheGroups, |
| - ss->ssl3.numDHEGroups); |
| + ss->ssl3.numDHEGroups); |
| } else { |
| size_t number_of_default_groups = PR_ARRAY_SIZE(ssl_default_dhe_groups); |
| selectedGroup = selectDHEGroup(ss, ssl_default_dhe_groups, |
| - number_of_default_groups); |
| + number_of_default_groups); |
| } |
| if (selectedGroup == ssl_dhe_group_none || |
| @@ -1658,10 +1797,10 @@ ssl3_SelectDHParams(sslSocket *ss) |
| static PRFileDesc * |
| ssl_ImportFD(PRFileDesc *model, PRFileDesc *fd, SSLProtocolVariant variant) |
| { |
| - sslSocket * ns = NULL; |
| - PRStatus rv; |
| - PRNetAddr addr; |
| - SECStatus status = ssl_Init(); |
| + sslSocket *ns = NULL; |
| + PRStatus rv; |
| + PRNetAddr addr; |
| + SECStatus status = ssl_Init(); |
| if (status != SECSuccess) { |
| return NULL; |
| @@ -1671,10 +1810,10 @@ ssl_ImportFD(PRFileDesc *model, PRFileDesc *fd, SSLProtocolVariant variant) |
| /* Just create a default socket if we're given NULL for the model */ |
| ns = ssl_NewSocket((PRBool)(!ssl_defaults.noLocks), variant); |
| } else { |
| - sslSocket * ss = ssl_FindSocket(model); |
| + sslSocket *ss = ssl_FindSocket(model); |
| if (ss == NULL || ss->protocolVariant != variant) { |
| SSL_DBG(("%d: SSL[%d]: bad model socket in ssl_ImportFD", |
| - SSL_GETPID(), model)); |
| + SSL_GETPID(), model)); |
| return NULL; |
| } |
| ns = ssl_DupSocket(ss); |
| @@ -1690,7 +1829,7 @@ ssl_ImportFD(PRFileDesc *model, PRFileDesc *fd, SSLProtocolVariant variant) |
| } |
| #if defined(DEBUG) || defined(FORCE_PR_ASSERT) |
| { |
| - sslSocket * ss = ssl_FindSocket(fd); |
| + sslSocket *ss = ssl_FindSocket(fd); |
| PORT_Assert(ss == ns); |
| } |
| #endif |
| @@ -1755,11 +1894,11 @@ ssl_NextProtoNegoCallback(void *arg, PRFileDesc *fd, |
| } |
| /* For each protocol in server preference, see if we support it. */ |
| - for (i = 0; i < protos_len; ) { |
| - for (j = 0; j < ss->opt.nextProtoNego.len; ) { |
| + for (i = 0; i < protos_len;) { |
| + for (j = 0; j < ss->opt.nextProtoNego.len;) { |
| if (protos[i] == ss->opt.nextProtoNego.data[j] && |
| - PORT_Memcmp(&protos[i+1], &ss->opt.nextProtoNego.data[j+1], |
| - protos[i]) == 0) { |
| + PORT_Memcmp(&protos[i + 1], &ss->opt.nextProtoNego.data[j + 1], |
| + protos[i]) == 0) { |
| /* We found a match. */ |
| ss->ssl3.nextProtoState = SSL_NEXT_PROTO_NEGOTIATED; |
| result = &protos[i]; |
| @@ -1793,7 +1932,7 @@ SSL_SetNextProtoNego(PRFileDesc *fd, const unsigned char *data, |
| { |
| sslSocket *ss; |
| SECStatus rv; |
| - SECItem dataItem = { siBuffer, (unsigned char *) data, length }; |
| + SECItem dataItem = { siBuffer, (unsigned char *)data, length }; |
| ss = ssl_FindSocket(fd); |
| if (!ss) { |
| @@ -1850,9 +1989,10 @@ SSL_GetNextProto(PRFileDesc *fd, SSLNextProtoState *state, unsigned char *buf, |
| return SECSuccess; |
| } |
| -SECStatus SSL_SetSRTPCiphers(PRFileDesc *fd, |
| - const PRUint16 *ciphers, |
| - unsigned int numCiphers) |
| +SECStatus |
| +SSL_SetSRTPCiphers(PRFileDesc *fd, |
| + const PRUint16 *ciphers, |
| + unsigned int numCiphers) |
| { |
| sslSocket *ss; |
| unsigned int i; |
| @@ -1884,8 +2024,9 @@ SECStatus SSL_SetSRTPCiphers(PRFileDesc *fd, |
| ciphers[i]; |
| } else { |
| SSL_DBG(("%d: SSL[%d]: invalid or unimplemented SRTP cipher " |
| - "suite specified: 0x%04hx", SSL_GETPID(), fd, |
| - ciphers[i])); |
| + "suite specified: 0x%04hx", |
| + SSL_GETPID(), fd, |
| + ciphers[i])); |
| } |
| } |
| @@ -1900,7 +2041,7 @@ SECStatus SSL_SetSRTPCiphers(PRFileDesc *fd, |
| SECStatus |
| SSL_GetSRTPCipher(PRFileDesc *fd, PRUint16 *cipher) |
| { |
| - sslSocket * ss; |
| + sslSocket *ss; |
| ss = ssl_FindSocket(fd); |
| if (!ss) { |
| @@ -1922,10 +2063,10 @@ SSL_GetSRTPCipher(PRFileDesc *fd, PRUint16 *cipher) |
| PRFileDesc * |
| SSL_ReconfigFD(PRFileDesc *model, PRFileDesc *fd) |
| { |
| - sslSocket * sm = NULL, *ss = NULL; |
| + sslSocket *sm = NULL, *ss = NULL; |
| int i; |
| - sslServerCerts * mc = NULL; |
| - sslServerCerts * sc = NULL; |
| + sslServerCerts *mc = NULL; |
| + sslServerCerts *sc = NULL; |
| if (model == NULL) { |
| PR_SetError(SEC_ERROR_INVALID_ARGS, 0); |
| @@ -1944,7 +2085,7 @@ SSL_ReconfigFD(PRFileDesc *model, PRFileDesc *fd) |
| return NULL; |
| } |
| - ss->opt = sm->opt; |
| + ss->opt = sm->opt; |
| ss->vrange = sm->vrange; |
| PORT_Memcpy(ss->cipherSuites, sm->cipherSuites, sizeof sm->cipherSuites); |
| PORT_Memcpy(ss->ssl3.dtlsSRTPCiphers, sm->ssl3.dtlsSRTPCiphers, |
| @@ -1952,8 +2093,9 @@ SSL_ReconfigFD(PRFileDesc *model, PRFileDesc *fd) |
| ss->ssl3.dtlsSRTPCipherCount = sm->ssl3.dtlsSRTPCipherCount; |
| PORT_Memcpy(ss->ssl3.signatureAlgorithms, sm->ssl3.signatureAlgorithms, |
| sizeof(ss->ssl3.signatureAlgorithms[0]) * |
| - sm->ssl3.signatureAlgorithmCount); |
| + sm->ssl3.signatureAlgorithmCount); |
| ss->ssl3.signatureAlgorithmCount = sm->ssl3.signatureAlgorithmCount; |
| + ss->ssl3.downgradeCheckVersion = sm->ssl3.downgradeCheckVersion; |
| if (!ss->opt.useSecurity) { |
| PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| @@ -1962,14 +2104,14 @@ SSL_ReconfigFD(PRFileDesc *model, PRFileDesc *fd) |
| /* This int should be SSLKEAType, but CC on Irix complains, |
| * during the for loop. |
| */ |
| - for (i=kt_null; i < kt_kea_size; i++) { |
| + for (i = kt_null; i < kt_kea_size; i++) { |
| mc = &(sm->serverCerts[i]); |
| sc = &(ss->serverCerts[i]); |
| if (mc->serverCert && mc->serverCertChain) { |
| if (sc->serverCert) { |
| CERT_DestroyCertificate(sc->serverCert); |
| } |
| - sc->serverCert = CERT_DupCertificate(mc->serverCert); |
| + sc->serverCert = CERT_DupCertificate(mc->serverCert); |
| if (sc->serverCertChain) { |
| CERT_DestroyCertificateList(sc->serverCertChain); |
| } |
| @@ -1985,6 +2127,17 @@ SSL_ReconfigFD(PRFileDesc *model, PRFileDesc *fd) |
| if (!ss->certStatusArray[i]) |
| goto loser; |
| } |
| + if (sm->signedCertTimestamps[i].data) { |
| + if (ss->signedCertTimestamps[i].data) { |
| + SECITEM_FreeItem(&ss->signedCertTimestamps[i], PR_FALSE); |
| + } |
| + if (SECITEM_CopyItem(NULL, |
| + &ss->signedCertTimestamps[i], |
| + &sm->signedCertTimestamps[i]) != |
| + SECSuccess) { |
| + goto loser; |
| + } |
| + } |
| } |
| if (mc->serverKeyPair) { |
| if (sc->serverKeyPair) { |
| @@ -2019,58 +2172,148 @@ SSL_ReconfigFD(PRFileDesc *model, PRFileDesc *fd) |
| } |
| if (sm->authCertificate) |
| - ss->authCertificate = sm->authCertificate; |
| + ss->authCertificate = sm->authCertificate; |
| if (sm->authCertificateArg) |
| - ss->authCertificateArg = sm->authCertificateArg; |
| + ss->authCertificateArg = sm->authCertificateArg; |
| if (sm->getClientAuthData) |
| - ss->getClientAuthData = sm->getClientAuthData; |
| + ss->getClientAuthData = sm->getClientAuthData; |
| if (sm->getClientAuthDataArg) |
| - ss->getClientAuthDataArg = sm->getClientAuthDataArg; |
| -#ifdef NSS_PLATFORM_CLIENT_AUTH |
| - if (sm->getPlatformClientAuthData) |
| - ss->getPlatformClientAuthData = sm->getPlatformClientAuthData; |
| - if (sm->getPlatformClientAuthDataArg) |
| - ss->getPlatformClientAuthDataArg = sm->getPlatformClientAuthDataArg; |
| -#endif |
| + ss->getClientAuthDataArg = sm->getClientAuthDataArg; |
| if (sm->sniSocketConfig) |
| - ss->sniSocketConfig = sm->sniSocketConfig; |
| + ss->sniSocketConfig = sm->sniSocketConfig; |
| if (sm->sniSocketConfigArg) |
| - ss->sniSocketConfigArg = sm->sniSocketConfigArg; |
| + ss->sniSocketConfigArg = sm->sniSocketConfigArg; |
| if (sm->handleBadCert) |
| - ss->handleBadCert = sm->handleBadCert; |
| + ss->handleBadCert = sm->handleBadCert; |
| if (sm->badCertArg) |
| - ss->badCertArg = sm->badCertArg; |
| + ss->badCertArg = sm->badCertArg; |
| if (sm->handshakeCallback) |
| - ss->handshakeCallback = sm->handshakeCallback; |
| + ss->handshakeCallback = sm->handshakeCallback; |
| if (sm->handshakeCallbackData) |
| ss->handshakeCallbackData = sm->handshakeCallbackData; |
| if (sm->pkcs11PinArg) |
| - ss->pkcs11PinArg = sm->pkcs11PinArg; |
| + ss->pkcs11PinArg = sm->pkcs11PinArg; |
| if (sm->getChannelID) |
| - ss->getChannelID = sm->getChannelID; |
| + ss->getChannelID = sm->getChannelID; |
| if (sm->getChannelIDArg) |
| - ss->getChannelIDArg = sm->getChannelIDArg; |
| + ss->getChannelIDArg = sm->getChannelIDArg; |
| return fd; |
| loser: |
| return NULL; |
| } |
| +/* |
| + * Get the user supplied range |
| + */ |
| +static SECStatus |
| +ssl3_GetRangePolicy(SSLProtocolVariant protocolVariant, SSLVersionRange *prange) |
| +{ |
| + SECStatus rv; |
| + PRUint32 policy; |
| + PRInt32 option; |
| + |
| + /* only use policy constraints if we've set the apply ssl policy bit */ |
| + rv = NSS_GetAlgorithmPolicy(SEC_OID_APPLY_SSL_POLICY, &policy); |
| + if ((rv != SECSuccess) || !(policy & NSS_USE_POLICY_IN_SSL)) { |
| + return SECFailure; |
| + } |
| + rv = NSS_OptionGet(VERSIONS_POLICY_MIN(protocolVariant), &option); |
| + if (rv != SECSuccess) { |
| + return rv; |
| + } |
| + prange->min = (PRUint16)option; |
| + rv = NSS_OptionGet(VERSIONS_POLICY_MAX(protocolVariant), &option); |
| + if (rv != SECSuccess) { |
| + return rv; |
| + } |
| + prange->max = (PRUint16)option; |
| + if (prange->max < prange->min) { |
| + return SECFailure; /* don't accept an invalid policy */ |
| + } |
| + return SECSuccess; |
| +} |
| + |
| +/* |
| + * Constrain a single protocol variant's range based on the user policy |
| + */ |
| +static SECStatus |
| +ssl3_ConstrainVariantRangeByPolicy(SSLProtocolVariant protocolVariant) |
| +{ |
| + SSLVersionRange vrange; |
| + SSLVersionRange pvrange; |
| + SECStatus rv; |
| + |
| + vrange = *VERSIONS_DEFAULTS(protocolVariant); |
| + rv = ssl3_GetRangePolicy(protocolVariant, &pvrange); |
| + if (rv != SECSuccess) { |
| + return SECSuccess; /* we don't have any policy */ |
| + } |
| + vrange.min = PR_MAX(vrange.min, pvrange.min); |
| + vrange.max = PR_MIN(vrange.max, pvrange.max); |
| + if (vrange.max >= vrange.min) { |
| + *VERSIONS_DEFAULTS(protocolVariant) = vrange; |
| + } else { |
| + /* there was no overlap, turn off range altogether */ |
| + pvrange.min = pvrange.max = SSL_LIBRARY_VERSION_NONE; |
| + *VERSIONS_DEFAULTS(protocolVariant) = pvrange; |
| + } |
| + return SECSuccess; |
| +} |
| + |
| +static PRBool |
| +ssl_VersionIsSupportedByPolicy(SSLProtocolVariant protocolVariant, |
| + SSL3ProtocolVersion version) |
| +{ |
| + SSLVersionRange pvrange; |
| + SECStatus rv; |
| + |
| + rv = ssl3_GetRangePolicy(protocolVariant, &pvrange); |
| + if (rv == SECSuccess) { |
| + if ((version > pvrange.max) || (version < pvrange.min)) { |
| + return PR_FALSE; /* disallowed by policy */ |
| + } |
| + } |
| + return PR_TRUE; |
| +} |
| + |
| +/* |
| + * This is called at SSL init time to constrain the existing range based |
| + * on user supplied policy. |
| + */ |
| +SECStatus |
| +ssl3_ConstrainRangeByPolicy(void) |
| +{ |
| + SECStatus rv; |
| + rv = ssl3_ConstrainVariantRangeByPolicy(ssl_variant_stream); |
| + if (rv != SECSuccess) { |
| + return rv; |
| + } |
| + rv = ssl3_ConstrainVariantRangeByPolicy(ssl_variant_datagram); |
| + if (rv != SECSuccess) { |
| + return rv; |
| + } |
| + return SECSuccess; |
| +} |
| + |
| PRBool |
| ssl3_VersionIsSupported(SSLProtocolVariant protocolVariant, |
| SSL3ProtocolVersion version) |
| { |
| - switch (protocolVariant) { |
| - case ssl_variant_stream: |
| - return (version >= SSL_LIBRARY_VERSION_3_0 && |
| - version <= SSL_LIBRARY_VERSION_MAX_SUPPORTED); |
| - case ssl_variant_datagram: |
| - return (version >= SSL_LIBRARY_VERSION_TLS_1_1 && |
| - version <= SSL_LIBRARY_VERSION_MAX_SUPPORTED); |
| - default: |
| - /* Can't get here */ |
| - PORT_Assert(PR_FALSE); |
| + if (!ssl_VersionIsSupportedByPolicy(protocolVariant, version)) { |
| return PR_FALSE; |
| } |
| + switch (protocolVariant) { |
| + case ssl_variant_stream: |
| + return (version >= SSL_LIBRARY_VERSION_3_0 && |
| + version <= SSL_LIBRARY_VERSION_MAX_SUPPORTED); |
| + case ssl_variant_datagram: |
| + return (version >= SSL_LIBRARY_VERSION_TLS_1_1 && |
| + version <= SSL_LIBRARY_VERSION_MAX_SUPPORTED); |
| + default: |
| + /* Can't get here */ |
| + PORT_Assert(PR_FALSE); |
| + return PR_FALSE; |
| + } |
| } |
| /* Returns PR_TRUE if the given version range is valid and |
| @@ -2086,6 +2329,29 @@ ssl3_VersionRangeIsValid(SSLProtocolVariant protocolVariant, |
| ssl3_VersionIsSupported(protocolVariant, vrange->max); |
| } |
| +const SECItem * |
| +SSL_PeerSignedCertTimestamps(PRFileDesc *fd) |
| +{ |
| + sslSocket *ss = ssl_FindSocket(fd); |
| + |
| + if (!ss) { |
| + SSL_DBG(("%d: SSL[%d]: bad socket in SSL_PeerSignedCertTimestamps", |
| + SSL_GETPID(), fd)); |
| + return NULL; |
| + } |
| + |
| + if (!ss->sec.ci.sid) { |
| + PORT_SetError(SEC_ERROR_NOT_INITIALIZED); |
| + return NULL; |
| + } |
| + |
| + if (ss->sec.ci.sid->version < SSL_LIBRARY_VERSION_3_0) { |
| + PORT_SetError(SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_SSL2); |
| + return NULL; |
| + } |
| + return &ss->sec.ci.sid->u.ssl3.signedCertTimestamps; |
| +} |
| + |
| SECStatus |
| SSL_VersionRangeGetSupported(SSLProtocolVariant protocolVariant, |
| SSLVersionRange *vrange) |
| @@ -2096,17 +2362,17 @@ SSL_VersionRangeGetSupported(SSLProtocolVariant protocolVariant, |
| } |
| switch (protocolVariant) { |
| - case ssl_variant_stream: |
| - vrange->min = SSL_LIBRARY_VERSION_3_0; |
| - vrange->max = SSL_LIBRARY_VERSION_MAX_SUPPORTED; |
| - break; |
| - case ssl_variant_datagram: |
| - vrange->min = SSL_LIBRARY_VERSION_TLS_1_1; |
| - vrange->max = SSL_LIBRARY_VERSION_MAX_SUPPORTED; |
| - break; |
| - default: |
| - PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| - return SECFailure; |
| + case ssl_variant_stream: |
| + vrange->min = SSL_LIBRARY_VERSION_3_0; |
| + vrange->max = SSL_LIBRARY_VERSION_MAX_SUPPORTED; |
| + break; |
| + case ssl_variant_datagram: |
| + vrange->min = SSL_LIBRARY_VERSION_TLS_1_1; |
| + vrange->max = SSL_LIBRARY_VERSION_MAX_SUPPORTED; |
| + break; |
| + default: |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + return SECFailure; |
| } |
| return SECSuccess; |
| @@ -2117,7 +2383,8 @@ SSL_VersionRangeGetDefault(SSLProtocolVariant protocolVariant, |
| SSLVersionRange *vrange) |
| { |
| if ((protocolVariant != ssl_variant_stream && |
| - protocolVariant != ssl_variant_datagram) || !vrange) { |
| + protocolVariant != ssl_variant_datagram) || |
| + !vrange) { |
| PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| return SECFailure; |
| } |
| @@ -2147,8 +2414,8 @@ SSL_VersionRangeGet(PRFileDesc *fd, SSLVersionRange *vrange) |
| sslSocket *ss = ssl_FindSocket(fd); |
| if (!ss) { |
| - SSL_DBG(("%d: SSL[%d]: bad socket in SSL3_VersionRangeGet", |
| - SSL_GETPID(), fd)); |
| + SSL_DBG(("%d: SSL[%d]: bad socket in SSL_VersionRangeGet", |
| + SSL_GETPID(), fd)); |
| return SECFailure; |
| } |
| @@ -2168,32 +2435,14 @@ SSL_VersionRangeGet(PRFileDesc *fd, SSLVersionRange *vrange) |
| return SECSuccess; |
| } |
| -static PRCallOnceType checkTLS12TokenOnce; |
| -static PRBool tls12TokenExists; |
| - |
| -static PRStatus |
| -ssl_CheckTLS12Token(void) |
| -{ |
| - tls12TokenExists = |
| - PK11_TokenExists(CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256); |
| - return PR_SUCCESS; |
| -} |
| - |
| -static PRBool |
| -ssl_TLS12TokenExists(void) |
| -{ |
| - (void) PR_CallOnce(&checkTLS12TokenOnce, ssl_CheckTLS12Token); |
| - return tls12TokenExists; |
| -} |
| - |
| SECStatus |
| SSL_VersionRangeSet(PRFileDesc *fd, const SSLVersionRange *vrange) |
| { |
| sslSocket *ss = ssl_FindSocket(fd); |
| if (!ss) { |
| - SSL_DBG(("%d: SSL[%d]: bad socket in SSL3_VersionRangeSet", |
| - SSL_GETPID(), fd)); |
| + SSL_DBG(("%d: SSL[%d]: bad socket in SSL_VersionRangeSet", |
| + SSL_GETPID(), fd)); |
| return SECFailure; |
| } |
| @@ -2205,78 +2454,84 @@ SSL_VersionRangeSet(PRFileDesc *fd, const SSLVersionRange *vrange) |
| ssl_Get1stHandshakeLock(ss); |
| ssl_GetSSL3HandshakeLock(ss); |
| - ss->vrange = *vrange; |
| - /* If we don't have a sufficiently up-to-date softoken then we cannot do |
| - * TLS 1.2. */ |
| - if (ss->vrange.max >= SSL_LIBRARY_VERSION_TLS_1_2 && |
| - !ssl_TLS12TokenExists()) { |
| - /* If the user requested a minimum version of 1.2, then we don't |
| - * silently downgrade. */ |
| - if (ss->vrange.min >= SSL_LIBRARY_VERSION_TLS_1_2) { |
| - ssl_ReleaseSSL3HandshakeLock(ss); |
| - ssl_Release1stHandshakeLock(ss); |
| - PORT_SetError(SSL_ERROR_INVALID_VERSION_RANGE); |
| - return SECFailure; |
| - } |
| - ss->vrange.max = SSL_LIBRARY_VERSION_TLS_1_1; |
| + if (ss->ssl3.downgradeCheckVersion && |
| + ss->vrange.max > ss->ssl3.downgradeCheckVersion) { |
| + PORT_SetError(SSL_ERROR_INVALID_VERSION_RANGE); |
| + ssl_ReleaseSSL3HandshakeLock(ss); |
| + ssl_Release1stHandshakeLock(ss); |
| + return SECFailure; |
| } |
| + ss->vrange = *vrange; |
| + |
| ssl_ReleaseSSL3HandshakeLock(ss); |
| ssl_Release1stHandshakeLock(ss); |
| return SECSuccess; |
| } |
| -const SECItemArray * |
| -SSL_PeerStapledOCSPResponses(PRFileDesc *fd) |
| +SECStatus |
| +SSL_SetDowngradeCheckVersion(PRFileDesc *fd, PRUint16 version) |
| { |
| sslSocket *ss = ssl_FindSocket(fd); |
| + SECStatus rv = SECFailure; |
| if (!ss) { |
| - SSL_DBG(("%d: SSL[%d]: bad socket in SSL_PeerStapledOCSPResponses", |
| - SSL_GETPID(), fd)); |
| - return NULL; |
| + SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetDowngradeCheckVersion", |
| + SSL_GETPID(), fd)); |
| + return SECFailure; |
| } |
| - if (!ss->sec.ci.sid) { |
| - PORT_SetError(SEC_ERROR_NOT_INITIALIZED); |
| - return NULL; |
| + if (version && !ssl3_VersionIsSupported(ss->protocolVariant, version)) { |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + return SECFailure; |
| } |
| - return &ss->sec.ci.sid->peerCertStatus; |
| + ssl_Get1stHandshakeLock(ss); |
| + ssl_GetSSL3HandshakeLock(ss); |
| + |
| + if (version && version < ss->vrange.max) { |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + goto loser; |
| + } |
| + ss->ssl3.downgradeCheckVersion = version; |
| + rv = SECSuccess; |
| + |
| +loser: |
| + ssl_ReleaseSSL3HandshakeLock(ss); |
| + ssl_Release1stHandshakeLock(ss); |
| + |
| + return rv; |
| } |
| -const SECItem * |
| -SSL_PeerSignedCertTimestamps(PRFileDesc *fd) |
| +const SECItemArray * |
| +SSL_PeerStapledOCSPResponses(PRFileDesc *fd) |
| { |
| sslSocket *ss = ssl_FindSocket(fd); |
| if (!ss) { |
| - SSL_DBG(("%d: SSL[%d]: bad socket in SSL_PeerSignedCertTimestamps", |
| - SSL_GETPID(), fd)); |
| - return NULL; |
| + SSL_DBG(("%d: SSL[%d]: bad socket in SSL_PeerStapledOCSPResponses", |
| + SSL_GETPID(), fd)); |
| + return NULL; |
| } |
| if (!ss->sec.ci.sid) { |
| - PORT_SetError(SEC_ERROR_NOT_INITIALIZED); |
| - return NULL; |
| + PORT_SetError(SEC_ERROR_NOT_INITIALIZED); |
| + return NULL; |
| } |
| - if (ss->sec.ci.sid->version < SSL_LIBRARY_VERSION_3_0) { |
| - PORT_SetError(SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_SSL2); |
| - return NULL; |
| - } |
| - return &ss->sec.ci.sid->u.ssl3.signedCertTimestamps; |
| + return &ss->sec.ci.sid->peerCertStatus; |
| } |
| SECStatus |
| -SSL_HandshakeResumedSession(PRFileDesc *fd, PRBool *handshake_resumed) { |
| +SSL_HandshakeResumedSession(PRFileDesc *fd, PRBool *handshake_resumed) |
| +{ |
| sslSocket *ss = ssl_FindSocket(fd); |
| if (!ss) { |
| - SSL_DBG(("%d: SSL[%d]: bad socket in SSL_HandshakeResumedSession", |
| - SSL_GETPID(), fd)); |
| - return SECFailure; |
| + SSL_DBG(("%d: SSL[%d]: bad socket in SSL_HandshakeResumedSession", |
| + SSL_GETPID(), fd)); |
| + return SECFailure; |
| } |
| *handshake_resumed = ss->ssl3.hs.isResuming; |
| @@ -2286,15 +2541,16 @@ SSL_HandshakeResumedSession(PRFileDesc *fd, PRBool *handshake_resumed) { |
| const SECItem * |
| SSL_GetRequestedClientCertificateTypes(PRFileDesc *fd) |
| { |
| - sslSocket *ss = ssl_FindSocket(fd); |
| + sslSocket *ss = ssl_FindSocket(fd); |
| - if (!ss) { |
| - SSL_DBG(("%d: SSL[%d]: bad socket in " |
| - "SSL_GetRequestedClientCertificateTypes", SSL_GETPID(), fd)); |
| - return NULL; |
| - } |
| + if (!ss) { |
| + SSL_DBG(("%d: SSL[%d]: bad socket in " |
| + "SSL_GetRequestedClientCertificateTypes", |
| + SSL_GETPID(), fd)); |
| + return NULL; |
| + } |
| - return ss->requestedCertTypes; |
| + return ss->requestedCertTypes; |
| } |
| /************************************************************************/ |
| @@ -2302,14 +2558,14 @@ SSL_GetRequestedClientCertificateTypes(PRFileDesc *fd) |
| ** They all get called through the NSPRIOMethods table below. |
| */ |
| -static PRFileDesc * PR_CALLBACK |
| +static PRFileDesc *PR_CALLBACK |
| ssl_Accept(PRFileDesc *fd, PRNetAddr *sockaddr, PRIntervalTime timeout) |
| { |
| - sslSocket *ss; |
| - sslSocket *ns = NULL; |
| - PRFileDesc *newfd = NULL; |
| + sslSocket *ss; |
| + sslSocket *ns = NULL; |
| + PRFileDesc *newfd = NULL; |
| PRFileDesc *osfd; |
| - PRStatus status; |
| + PRStatus status; |
| ss = ssl_GetPrivate(fd); |
| if (!ss) { |
| @@ -2340,7 +2596,7 @@ ssl_Accept(PRFileDesc *fd, PRNetAddr *sockaddr, PRIntervalTime timeout) |
| ssl_ReleaseSSL3HandshakeLock(ss); |
| ssl_Release1stHandshakeLock(ss); |
| SSL_UNLOCK_WRITER(ss); |
| - SSL_UNLOCK_READER(ss); /* ss isn't used below here. */ |
| + SSL_UNLOCK_READER(ss); /* ss isn't used below here. */ |
| if (ns == NULL) |
| goto loser; |
| @@ -2353,8 +2609,8 @@ ssl_Accept(PRFileDesc *fd, PRNetAddr *sockaddr, PRIntervalTime timeout) |
| /* Now start server connection handshake with client. |
| ** Don't need locks here because nobody else has a reference to ns yet. |
| */ |
| - if ( ns->opt.useSecurity ) { |
| - if ( ns->opt.handshakeAsClient ) { |
| + if (ns->opt.useSecurity) { |
| + if (ns->opt.handshakeAsClient) { |
| ns->handshake = ssl2_BeginClientHandshake; |
| ss->handshaking = sslHandshakingAsClient; |
| } else { |
| @@ -2377,7 +2633,7 @@ static PRStatus PR_CALLBACK |
| ssl_Connect(PRFileDesc *fd, const PRNetAddr *sockaddr, PRIntervalTime timeout) |
| { |
| sslSocket *ss; |
| - PRStatus rv; |
| + PRStatus rv; |
| ss = ssl_GetPrivate(fd); |
| if (!ss) { |
| @@ -2401,8 +2657,8 @@ ssl_Connect(PRFileDesc *fd, const PRNetAddr *sockaddr, PRIntervalTime timeout) |
| static PRStatus PR_CALLBACK |
| ssl_Bind(PRFileDesc *fd, const PRNetAddr *addr) |
| { |
| - sslSocket * ss = ssl_GetPrivate(fd); |
| - PRStatus rv; |
| + sslSocket *ss = ssl_GetPrivate(fd); |
| + PRStatus rv; |
| if (!ss) { |
| SSL_DBG(("%d: SSL[%d]: bad socket in bind", SSL_GETPID(), fd)); |
| @@ -2421,8 +2677,8 @@ ssl_Bind(PRFileDesc *fd, const PRNetAddr *addr) |
| static PRStatus PR_CALLBACK |
| ssl_Listen(PRFileDesc *fd, PRIntn backlog) |
| { |
| - sslSocket * ss = ssl_GetPrivate(fd); |
| - PRStatus rv; |
| + sslSocket *ss = ssl_GetPrivate(fd); |
| + PRStatus rv; |
| if (!ss) { |
| SSL_DBG(("%d: SSL[%d]: bad socket in listen", SSL_GETPID(), fd)); |
| @@ -2441,8 +2697,8 @@ ssl_Listen(PRFileDesc *fd, PRIntn backlog) |
| static PRStatus PR_CALLBACK |
| ssl_Shutdown(PRFileDesc *fd, PRIntn how) |
| { |
| - sslSocket * ss = ssl_GetPrivate(fd); |
| - PRStatus rv; |
| + sslSocket *ss = ssl_GetPrivate(fd); |
| + PRStatus rv; |
| if (!ss) { |
| SSL_DBG(("%d: SSL[%d]: bad socket in shutdown", SSL_GETPID(), fd)); |
| @@ -2470,7 +2726,7 @@ static PRStatus PR_CALLBACK |
| ssl_Close(PRFileDesc *fd) |
| { |
| sslSocket *ss; |
| - PRStatus rv; |
| + PRStatus rv; |
| ss = ssl_GetPrivate(fd); |
| if (!ss) { |
| @@ -2498,7 +2754,7 @@ ssl_Recv(PRFileDesc *fd, void *buf, PRInt32 len, PRIntn flags, |
| PRIntervalTime timeout) |
| { |
| sslSocket *ss; |
| - int rv; |
| + int rv; |
| ss = ssl_GetPrivate(fd); |
| if (!ss) { |
| @@ -2509,7 +2765,7 @@ ssl_Recv(PRFileDesc *fd, void *buf, PRInt32 len, PRIntn flags, |
| ss->rTimeout = timeout; |
| if (!ss->opt.fdx) |
| ss->wTimeout = timeout; |
| - rv = (*ss->ops->recv)(ss, (unsigned char*)buf, len, flags); |
| + rv = (*ss->ops->recv)(ss, (unsigned char *)buf, len, flags); |
| SSL_UNLOCK_READER(ss); |
| return rv; |
| } |
| @@ -2519,7 +2775,7 @@ ssl_Send(PRFileDesc *fd, const void *buf, PRInt32 len, PRIntn flags, |
| PRIntervalTime timeout) |
| { |
| sslSocket *ss; |
| - int rv; |
| + int rv; |
| ss = ssl_GetPrivate(fd); |
| if (!ss) { |
| @@ -2530,7 +2786,7 @@ ssl_Send(PRFileDesc *fd, const void *buf, PRInt32 len, PRIntn flags, |
| ss->wTimeout = timeout; |
| if (!ss->opt.fdx) |
| ss->rTimeout = timeout; |
| - rv = (*ss->ops->send)(ss, (const unsigned char*)buf, len, flags); |
| + rv = (*ss->ops->send)(ss, (const unsigned char *)buf, len, flags); |
| SSL_UNLOCK_WRITER(ss); |
| return rv; |
| } |
| @@ -2539,7 +2795,7 @@ static int PR_CALLBACK |
| ssl_Read(PRFileDesc *fd, void *buf, PRInt32 len) |
| { |
| sslSocket *ss; |
| - int rv; |
| + int rv; |
| ss = ssl_GetPrivate(fd); |
| if (!ss) { |
| @@ -2550,7 +2806,7 @@ ssl_Read(PRFileDesc *fd, void *buf, PRInt32 len) |
| ss->rTimeout = PR_INTERVAL_NO_TIMEOUT; |
| if (!ss->opt.fdx) |
| ss->wTimeout = PR_INTERVAL_NO_TIMEOUT; |
| - rv = (*ss->ops->read)(ss, (unsigned char*)buf, len); |
| + rv = (*ss->ops->read)(ss, (unsigned char *)buf, len); |
| SSL_UNLOCK_READER(ss); |
| return rv; |
| } |
| @@ -2559,7 +2815,7 @@ static int PR_CALLBACK |
| ssl_Write(PRFileDesc *fd, const void *buf, PRInt32 len) |
| { |
| sslSocket *ss; |
| - int rv; |
| + int rv; |
| ss = ssl_GetPrivate(fd); |
| if (!ss) { |
| @@ -2570,7 +2826,7 @@ ssl_Write(PRFileDesc *fd, const void *buf, PRInt32 len) |
| ss->wTimeout = PR_INTERVAL_NO_TIMEOUT; |
| if (!ss->opt.fdx) |
| ss->rTimeout = PR_INTERVAL_NO_TIMEOUT; |
| - rv = (*ss->ops->write)(ss, (const unsigned char*)buf, len); |
| + rv = (*ss->ops->write)(ss, (const unsigned char *)buf, len); |
| SSL_UNLOCK_WRITER(ss); |
| return rv; |
| } |
| @@ -2593,9 +2849,9 @@ ssl_GetPeerName(PRFileDesc *fd, PRNetAddr *addr) |
| SECStatus |
| ssl_GetPeerInfo(sslSocket *ss) |
| { |
| - PRFileDesc * osfd; |
| - int rv; |
| - PRNetAddr sin; |
| + PRFileDesc *osfd; |
| + int rv; |
| + PRNetAddr sin; |
| osfd = ss->fd->lower; |
| @@ -2644,8 +2900,8 @@ SSL_SetStapledOCSPResponses(PRFileDesc *fd, const SECItemArray *responses, |
| return SECFailure; |
| } |
| - if ( kea <= 0 || kea >= kt_kea_size) { |
| - SSL_DBG(("%d: SSL[%d]: invalid key in SSL_SetStapledOCSPResponses", |
| + if (kea <= 0 || kea >= kt_kea_size) { |
| + SSL_DBG(("%d: SSL[%d]: invalid key type in SSL_SetStapledOCSPResponses", |
| SSL_GETPID(), fd)); |
| return SECFailure; |
| } |
| @@ -2661,6 +2917,35 @@ SSL_SetStapledOCSPResponses(PRFileDesc *fd, const SECItemArray *responses, |
| } |
| SECStatus |
| +SSL_SetSignedCertTimestamps(PRFileDesc *fd, const SECItem *scts, SSLKEAType kea) |
| +{ |
| + sslSocket *ss; |
| + |
| + ss = ssl_FindSocket(fd); |
| + if (!ss) { |
| + SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetSignedCertTimestamps", |
| + SSL_GETPID(), fd)); |
| + return SECFailure; |
| + } |
| + |
| + if (kea <= 0 || kea >= kt_kea_size) { |
| + SSL_DBG(("%d: SSL[%d]: invalid key type in SSL_SetSignedCertTimestamps", |
| + SSL_GETPID(), fd)); |
| + return SECFailure; |
| + } |
| + |
| + if (ss->signedCertTimestamps[kea].data) { |
| + SECITEM_FreeItem(&ss->signedCertTimestamps[kea], PR_FALSE); |
| + } |
| + |
| + if (!scts) { |
| + return SECSuccess; |
| + } |
| + |
| + return SECITEM_CopyItem(NULL, &ss->signedCertTimestamps[kea], scts); |
| +} |
| + |
| +SECStatus |
| SSL_SetSockPeerID(PRFileDesc *fd, const char *peerID) |
| { |
| sslSocket *ss; |
| @@ -2687,15 +2972,15 @@ static PRInt16 PR_CALLBACK |
| ssl_Poll(PRFileDesc *fd, PRInt16 how_flags, PRInt16 *p_out_flags) |
| { |
| sslSocket *ss; |
| - PRInt16 new_flags = how_flags; /* should select on these flags. */ |
| - PRNetAddr addr; |
| + PRInt16 new_flags = how_flags; /* should select on these flags. */ |
| + PRNetAddr addr; |
| *p_out_flags = 0; |
| ss = ssl_GetPrivate(fd); |
| if (!ss) { |
| SSL_DBG(("%d: SSL[%d]: bad socket in SSL_Poll", |
| SSL_GETPID(), fd)); |
| - return 0; /* don't poll on this socket */ |
| + return 0; /* don't poll on this socket */ |
| } |
| if (ss->opt.useSecurity && |
| @@ -2721,36 +3006,36 @@ ssl_Poll(PRFileDesc *fd, PRInt16 how_flags, PRInt16 *p_out_flags) |
| new_flags |= PR_POLL_READ; |
| } |
| } else |
| - /* First handshake is in progress */ |
| - if (ss->lastWriteBlocked) { |
| + /* First handshake is in progress */ |
| + if (ss->lastWriteBlocked) { |
| if (new_flags & PR_POLL_READ) { |
| /* The caller is waiting for data to be received, |
| ** but the initial handshake is blocked on write, or the |
| ** client's first handshake record has not been written. |
| ** The code should select on write, not read. |
| */ |
| - new_flags ^= PR_POLL_READ; /* don't select on read. */ |
| - new_flags |= PR_POLL_WRITE; /* do select on write. */ |
| + new_flags ^= PR_POLL_READ; /* don't select on read. */ |
| + new_flags |= PR_POLL_WRITE; /* do select on write. */ |
| } |
| } else if (new_flags & PR_POLL_WRITE) { |
| - /* The caller is trying to write, but the handshake is |
| - ** blocked waiting for data to read, and the first |
| - ** handshake has been sent. So do NOT to poll on write |
| - ** unless we did false start. |
| - */ |
| - if (!(ss->version >= SSL_LIBRARY_VERSION_3_0 && |
| - ss->ssl3.hs.canFalseStart)) { |
| - new_flags ^= PR_POLL_WRITE; /* don't select on write. */ |
| - } |
| - new_flags |= PR_POLL_READ; /* do select on read. */ |
| + /* The caller is trying to write, but the handshake is |
| + ** blocked waiting for data to read, and the first |
| + ** handshake has been sent. So do NOT to poll on write |
| + ** unless we did false start. |
| + */ |
| + if (!(ss->version >= SSL_LIBRARY_VERSION_3_0 && |
| + ss->ssl3.hs.canFalseStart)) { |
| + new_flags ^= PR_POLL_WRITE; /* don't select on write. */ |
| + } |
| + new_flags |= PR_POLL_READ; /* do select on read. */ |
| } |
| } |
| } else if ((new_flags & PR_POLL_READ) && (SSL_DataPending(fd) > 0)) { |
| - *p_out_flags = PR_POLL_READ; /* it's ready already. */ |
| + *p_out_flags = PR_POLL_READ; /* it's ready already. */ |
| return new_flags; |
| } else if ((ss->lastWriteBlocked) && (how_flags & PR_POLL_READ) && |
| (ss->pendingBuf.len != 0)) { /* write data waiting to be sent */ |
| - new_flags |= PR_POLL_WRITE; /* also select on write. */ |
| + new_flags |= PR_POLL_WRITE; /* also select on write. */ |
| } |
| if (ss->version >= SSL_LIBRARY_VERSION_3_0 && |
| @@ -2782,8 +3067,8 @@ ssl_Poll(PRFileDesc *fd, PRInt16 how_flags, PRInt16 *p_out_flags) |
| } |
| if (new_flags && (fd->lower->methods->poll != NULL)) { |
| - PRInt16 lower_out_flags = 0; |
| - PRInt16 lower_new_flags; |
| + PRInt16 lower_out_flags = 0; |
| + PRInt16 lower_new_flags; |
| lower_new_flags = fd->lower->methods->poll(fd->lower, new_flags, |
| &lower_out_flags); |
| if ((lower_new_flags & lower_out_flags) && (how_flags != new_flags)) { |
| @@ -2796,7 +3081,7 @@ ssl_Poll(PRFileDesc *fd, PRInt16 how_flags, PRInt16 *p_out_flags) |
| new_flags = how_flags; |
| } else { |
| *p_out_flags = lower_out_flags; |
| - new_flags = lower_new_flags; |
| + new_flags = lower_new_flags; |
| } |
| } |
| @@ -2821,14 +3106,13 @@ ssl_TransmitFile(PRFileDesc *sd, PRFileDesc *fd, |
| return sd->methods->sendfile(sd, &sfd, flags, timeout); |
| } |
| - |
| PRBool |
| ssl_FdIsBlocking(PRFileDesc *fd) |
| { |
| PRSocketOptionData opt; |
| - PRStatus status; |
| + PRStatus status; |
| - opt.option = PR_SockOpt_Nonblocking; |
| + opt.option = PR_SockOpt_Nonblocking; |
| opt.value.non_blocking = PR_FALSE; |
| status = PR_GetSocketOption(fd, &opt); |
| if (status != PR_SUCCESS) |
| @@ -2842,23 +3126,23 @@ ssl_SocketIsBlocking(sslSocket *ss) |
| return ssl_FdIsBlocking(ss->fd); |
| } |
| -PRInt32 sslFirstBufSize = 8 * 1024; |
| -PRInt32 sslCopyLimit = 1024; |
| +PRInt32 sslFirstBufSize = 8 * 1024; |
| +PRInt32 sslCopyLimit = 1024; |
| static PRInt32 PR_CALLBACK |
| ssl_WriteV(PRFileDesc *fd, const PRIOVec *iov, PRInt32 vectors, |
| PRIntervalTime timeout) |
| { |
| - PRInt32 i; |
| - PRInt32 bufLen; |
| - PRInt32 left; |
| - PRInt32 rv; |
| - PRInt32 sent = 0; |
| - const PRInt32 first_len = sslFirstBufSize; |
| - const PRInt32 limit = sslCopyLimit; |
| - PRBool blocking; |
| - PRIOVec myIov = { 0, 0 }; |
| - char buf[MAX_FRAGMENT_LENGTH]; |
| + PRInt32 i; |
| + PRInt32 bufLen; |
| + PRInt32 left; |
| + PRInt32 rv; |
| + PRInt32 sent = 0; |
| + const PRInt32 first_len = sslFirstBufSize; |
| + const PRInt32 limit = sslCopyLimit; |
| + PRBool blocking; |
| + PRIOVec myIov = { 0, 0 }; |
| + char buf[MAX_FRAGMENT_LENGTH]; |
| if (vectors < 0) { |
| PORT_SetError(PR_INVALID_ARGUMENT_ERROR); |
| @@ -2877,28 +3161,37 @@ ssl_WriteV(PRFileDesc *fd, const PRIOVec *iov, PRInt32 vectors, |
| blocking = ssl_FdIsBlocking(fd); |
| #define K16 sizeof(buf) |
| -#define KILL_VECTORS while (vectors && !iov->iov_len) { ++iov; --vectors; } |
| -#define GET_VECTOR do { myIov = *iov++; --vectors; KILL_VECTORS } while (0) |
| -#define HANDLE_ERR(rv, len) \ |
| - if (rv != len) { \ |
| - if (rv < 0) { \ |
| - if (!blocking \ |
| - && (PR_GetError() == PR_WOULD_BLOCK_ERROR) \ |
| - && (sent > 0)) { \ |
| - return sent; \ |
| - } else { \ |
| - return -1; \ |
| - } \ |
| - } \ |
| +#define KILL_VECTORS \ |
| + while (vectors && !iov->iov_len) { \ |
| + ++iov; \ |
| + --vectors; \ |
| + } |
| +#define GET_VECTOR \ |
| + do { \ |
| + myIov = *iov++; \ |
| + --vectors; \ |
| + KILL_VECTORS \ |
| + } while (0) |
| +#define HANDLE_ERR(rv, len) \ |
| + if (rv != len) { \ |
| + if (rv < 0) { \ |
| + if (!blocking && \ |
| + (PR_GetError() == PR_WOULD_BLOCK_ERROR) && \ |
| + (sent > 0)) { \ |
| + return sent; \ |
| + } else { \ |
| + return -1; \ |
| + } \ |
| + } \ |
| /* Only a nonblocking socket can have partial sends */ \ |
| - PR_ASSERT(!blocking); \ |
| - return sent + rv; \ |
| + PR_ASSERT(!blocking); \ |
| + return sent + rv; \ |
| } |
| -#define SEND(bfr, len) \ |
| - do { \ |
| +#define SEND(bfr, len) \ |
| + do { \ |
| rv = ssl_Send(fd, bfr, len, 0, timeout); \ |
| - HANDLE_ERR(rv, len) \ |
| - sent += len; \ |
| + HANDLE_ERR(rv, len) \ |
| + sent += len; \ |
| } while (0) |
| /* Make sure the first write is at least 8 KB, if possible. */ |
| @@ -2918,23 +3211,23 @@ ssl_WriteV(PRFileDesc *fd, const PRIOVec *iov, PRInt32 vectors, |
| GET_VECTOR; |
| toCopy = PR_MIN(left, myIov.iov_len); |
| PORT_Memcpy(buf + bufLen, myIov.iov_base, toCopy); |
| - bufLen += toCopy; |
| - left -= toCopy; |
| + bufLen += toCopy; |
| + left -= toCopy; |
| myIov.iov_base += toCopy; |
| - myIov.iov_len -= toCopy; |
| + myIov.iov_len -= toCopy; |
| } |
| - SEND( buf, bufLen ); |
| + SEND(buf, bufLen); |
| } |
| while (vectors || myIov.iov_len) { |
| - PRInt32 addLen; |
| + PRInt32 addLen; |
| if (!myIov.iov_len) { |
| GET_VECTOR; |
| } |
| while (myIov.iov_len >= K16) { |
| SEND(myIov.iov_base, K16); |
| myIov.iov_base += K16; |
| - myIov.iov_len -= K16; |
| + myIov.iov_len -= K16; |
| } |
| if (!myIov.iov_len) |
| continue; |
| @@ -2944,13 +3237,13 @@ ssl_WriteV(PRFileDesc *fd, const PRIOVec *iov, PRInt32 vectors, |
| } else if ((addLen = iov->iov_len % K16) + myIov.iov_len <= limit) { |
| /* Addlen is already computed. */; |
| } else if (vectors > 1 && |
| - iov[1].iov_len % K16 + addLen + myIov.iov_len <= 2 * limit) { |
| - addLen = limit - myIov.iov_len; |
| + iov[1].iov_len % K16 + addLen + myIov.iov_len <= 2 * limit) { |
| + addLen = limit - myIov.iov_len; |
| } else |
| addLen = 0; |
| if (!addLen) { |
| - SEND( myIov.iov_base, myIov.iov_len ); |
| + SEND(myIov.iov_base, myIov.iov_len); |
| myIov.iov_len = 0; |
| continue; |
| } |
| @@ -2960,25 +3253,24 @@ ssl_WriteV(PRFileDesc *fd, const PRIOVec *iov, PRInt32 vectors, |
| GET_VECTOR; |
| PORT_Memcpy(buf + bufLen, myIov.iov_base, addLen); |
| myIov.iov_base += addLen; |
| - myIov.iov_len -= addLen; |
| - bufLen += addLen; |
| - |
| - left = PR_MIN( limit, K16 - bufLen); |
| - if (!vectors /* no more left */ |
| - || myIov.iov_len > 0 /* we didn't use that one all up */ |
| - || bufLen >= K16 /* it's full. */ |
| - ) { |
| + myIov.iov_len -= addLen; |
| + bufLen += addLen; |
| + |
| + left = PR_MIN(limit, K16 - bufLen); |
| + if (!vectors /* no more left */ |
| + || myIov.iov_len > 0 /* we didn't use that one all up */ |
| + || bufLen >= K16 /* it's full. */) { |
| addLen = 0; |
| } else if ((addLen = iov->iov_len % K16) <= left) { |
| /* Addlen is already computed. */; |
| } else if (vectors > 1 && |
| - iov[1].iov_len % K16 + addLen <= left + limit) { |
| - addLen = left; |
| + iov[1].iov_len % K16 + addLen <= left + limit) { |
| + addLen = left; |
| } else |
| addLen = 0; |
| } while (addLen); |
| - SEND( buf, bufLen ); |
| + SEND(buf, bufLen); |
| } |
| return sent; |
| } |
| @@ -3015,14 +3307,16 @@ ssl_FSync(PRFileDesc *fd) |
| } |
| static PRInt32 PR_CALLBACK |
| -ssl_Seek(PRFileDesc *fd, PRInt32 offset, PRSeekWhence how) { |
| +ssl_Seek(PRFileDesc *fd, PRInt32 offset, PRSeekWhence how) |
| +{ |
| PORT_Assert(0); |
| PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0); |
| return SECFailure; |
| } |
| static PRInt64 PR_CALLBACK |
| -ssl_Seek64(PRFileDesc *fd, PRInt64 offset, PRSeekWhence how) { |
| +ssl_Seek64(PRFileDesc *fd, PRInt64 offset, PRSeekWhence how) |
| +{ |
| PRInt64 res; |
| PORT_Assert(0); |
| @@ -3067,85 +3361,83 @@ ssl_SendTo(PRFileDesc *fd, const void *buf, PRInt32 amount, PRIntn flags, |
| static const PRIOMethods ssl_methods = { |
| PR_DESC_LAYERED, |
| - ssl_Close, /* close */ |
| - ssl_Read, /* read */ |
| - ssl_Write, /* write */ |
| - ssl_Available, /* available */ |
| - ssl_Available64, /* available64 */ |
| - ssl_FSync, /* fsync */ |
| - ssl_Seek, /* seek */ |
| - ssl_Seek64, /* seek64 */ |
| - ssl_FileInfo, /* fileInfo */ |
| - ssl_FileInfo64, /* fileInfo64 */ |
| - ssl_WriteV, /* writev */ |
| - ssl_Connect, /* connect */ |
| - ssl_Accept, /* accept */ |
| - ssl_Bind, /* bind */ |
| - ssl_Listen, /* listen */ |
| - ssl_Shutdown, /* shutdown */ |
| - ssl_Recv, /* recv */ |
| - ssl_Send, /* send */ |
| - ssl_RecvFrom, /* recvfrom */ |
| - ssl_SendTo, /* sendto */ |
| - ssl_Poll, /* poll */ |
| - PR_EmulateAcceptRead, /* acceptread */ |
| - ssl_TransmitFile, /* transmitfile */ |
| - ssl_GetSockName, /* getsockname */ |
| - ssl_GetPeerName, /* getpeername */ |
| - NULL, /* getsockopt OBSOLETE */ |
| - NULL, /* setsockopt OBSOLETE */ |
| - NULL, /* getsocketoption */ |
| - NULL, /* setsocketoption */ |
| - PR_EmulateSendFile, /* Send a (partial) file with header/trailer*/ |
| - NULL, /* reserved for future use */ |
| - NULL, /* reserved for future use */ |
| - NULL, /* reserved for future use */ |
| - NULL, /* reserved for future use */ |
| - NULL /* reserved for future use */ |
| + ssl_Close, /* close */ |
| + ssl_Read, /* read */ |
| + ssl_Write, /* write */ |
| + ssl_Available, /* available */ |
| + ssl_Available64, /* available64 */ |
| + ssl_FSync, /* fsync */ |
| + ssl_Seek, /* seek */ |
| + ssl_Seek64, /* seek64 */ |
| + ssl_FileInfo, /* fileInfo */ |
| + ssl_FileInfo64, /* fileInfo64 */ |
| + ssl_WriteV, /* writev */ |
| + ssl_Connect, /* connect */ |
| + ssl_Accept, /* accept */ |
| + ssl_Bind, /* bind */ |
| + ssl_Listen, /* listen */ |
| + ssl_Shutdown, /* shutdown */ |
| + ssl_Recv, /* recv */ |
| + ssl_Send, /* send */ |
| + ssl_RecvFrom, /* recvfrom */ |
| + ssl_SendTo, /* sendto */ |
| + ssl_Poll, /* poll */ |
| + PR_EmulateAcceptRead, /* acceptread */ |
| + ssl_TransmitFile, /* transmitfile */ |
| + ssl_GetSockName, /* getsockname */ |
| + ssl_GetPeerName, /* getpeername */ |
| + NULL, /* getsockopt OBSOLETE */ |
| + NULL, /* setsockopt OBSOLETE */ |
| + NULL, /* getsocketoption */ |
| + NULL, /* setsocketoption */ |
| + PR_EmulateSendFile, /* Send a (partial) file with header/trailer*/ |
| + NULL, /* reserved for future use */ |
| + NULL, /* reserved for future use */ |
| + NULL, /* reserved for future use */ |
| + NULL, /* reserved for future use */ |
| + NULL /* reserved for future use */ |
| }; |
| - |
| static PRIOMethods combined_methods; |
| static void |
| ssl_SetupIOMethods(void) |
| { |
| - PRIOMethods *new_methods = &combined_methods; |
| + PRIOMethods *new_methods = &combined_methods; |
| const PRIOMethods *nspr_methods = PR_GetDefaultIOMethods(); |
| - const PRIOMethods *my_methods = &ssl_methods; |
| + const PRIOMethods *my_methods = &ssl_methods; |
| *new_methods = *nspr_methods; |
| - new_methods->file_type = my_methods->file_type; |
| - new_methods->close = my_methods->close; |
| - new_methods->read = my_methods->read; |
| - new_methods->write = my_methods->write; |
| - new_methods->available = my_methods->available; |
| - new_methods->available64 = my_methods->available64; |
| - new_methods->fsync = my_methods->fsync; |
| - new_methods->seek = my_methods->seek; |
| - new_methods->seek64 = my_methods->seek64; |
| - new_methods->fileInfo = my_methods->fileInfo; |
| - new_methods->fileInfo64 = my_methods->fileInfo64; |
| - new_methods->writev = my_methods->writev; |
| - new_methods->connect = my_methods->connect; |
| - new_methods->accept = my_methods->accept; |
| - new_methods->bind = my_methods->bind; |
| - new_methods->listen = my_methods->listen; |
| - new_methods->shutdown = my_methods->shutdown; |
| - new_methods->recv = my_methods->recv; |
| - new_methods->send = my_methods->send; |
| - new_methods->recvfrom = my_methods->recvfrom; |
| - new_methods->sendto = my_methods->sendto; |
| - new_methods->poll = my_methods->poll; |
| - new_methods->acceptread = my_methods->acceptread; |
| - new_methods->transmitfile = my_methods->transmitfile; |
| - new_methods->getsockname = my_methods->getsockname; |
| - new_methods->getpeername = my_methods->getpeername; |
| -/* new_methods->getsocketoption = my_methods->getsocketoption; */ |
| -/* new_methods->setsocketoption = my_methods->setsocketoption; */ |
| - new_methods->sendfile = my_methods->sendfile; |
| - |
| + new_methods->file_type = my_methods->file_type; |
| + new_methods->close = my_methods->close; |
| + new_methods->read = my_methods->read; |
| + new_methods->write = my_methods->write; |
| + new_methods->available = my_methods->available; |
| + new_methods->available64 = my_methods->available64; |
| + new_methods->fsync = my_methods->fsync; |
| + new_methods->seek = my_methods->seek; |
| + new_methods->seek64 = my_methods->seek64; |
| + new_methods->fileInfo = my_methods->fileInfo; |
| + new_methods->fileInfo64 = my_methods->fileInfo64; |
| + new_methods->writev = my_methods->writev; |
| + new_methods->connect = my_methods->connect; |
| + new_methods->accept = my_methods->accept; |
| + new_methods->bind = my_methods->bind; |
| + new_methods->listen = my_methods->listen; |
| + new_methods->shutdown = my_methods->shutdown; |
| + new_methods->recv = my_methods->recv; |
| + new_methods->send = my_methods->send; |
| + new_methods->recvfrom = my_methods->recvfrom; |
| + new_methods->sendto = my_methods->sendto; |
| + new_methods->poll = my_methods->poll; |
| + new_methods->acceptread = my_methods->acceptread; |
| + new_methods->transmitfile = my_methods->transmitfile; |
| + new_methods->getsockname = my_methods->getsockname; |
| + new_methods->getpeername = my_methods->getpeername; |
| + /* new_methods->getsocketoption = my_methods->getsocketoption; */ |
| + /* new_methods->setsocketoption = my_methods->setsocketoption; */ |
| + new_methods->sendfile = my_methods->sendfile; |
| } |
| static PRCallOnceType initIoLayerOnce; |
| @@ -3162,8 +3454,8 @@ ssl_InitIOLayer(void) |
| static PRStatus |
| ssl_PushIOLayer(sslSocket *ns, PRFileDesc *stack, PRDescIdentity id) |
| { |
| - PRFileDesc *layer = NULL; |
| - PRStatus status; |
| + PRFileDesc *layer = NULL; |
| + PRStatus status; |
| if (!ssl_inited) { |
| status = PR_CallOnce(&initIoLayerOnce, &ssl_InitIOLayer); |
| @@ -3211,24 +3503,24 @@ ssl_MakeLocks(sslSocket *ss) |
| ss->firstHandshakeLock = PZ_NewMonitor(nssILockSSL); |
| if (!ss->firstHandshakeLock) |
| goto loser; |
| - ss->ssl3HandshakeLock = PZ_NewMonitor(nssILockSSL); |
| + ss->ssl3HandshakeLock = PZ_NewMonitor(nssILockSSL); |
| if (!ss->ssl3HandshakeLock) |
| goto loser; |
| - ss->specLock = NSSRWLock_New(SSL_LOCK_RANK_SPEC, NULL); |
| + ss->specLock = NSSRWLock_New(SSL_LOCK_RANK_SPEC, NULL); |
| if (!ss->specLock) |
| goto loser; |
| - ss->recvBufLock = PZ_NewMonitor(nssILockSSL); |
| + ss->recvBufLock = PZ_NewMonitor(nssILockSSL); |
| if (!ss->recvBufLock) |
| goto loser; |
| - ss->xmitBufLock = PZ_NewMonitor(nssILockSSL); |
| + ss->xmitBufLock = PZ_NewMonitor(nssILockSSL); |
| if (!ss->xmitBufLock) |
| goto loser; |
| - ss->writerThread = NULL; |
| + ss->writerThread = NULL; |
| if (ssl_lock_readers) { |
| - ss->recvLock = PZ_NewLock(nssILockSSL); |
| + ss->recvLock = PZ_NewLock(nssILockSSL); |
| if (!ss->recvLock) |
| goto loser; |
| - ss->sendLock = PZ_NewLock(nssILockSSL); |
| + ss->sendLock = PZ_NewLock(nssILockSSL); |
| if (!ss->sendLock) |
| goto loser; |
| } |
| @@ -3242,19 +3534,19 @@ loser: |
| #define NSS_HAVE_GETENV 1 |
| #endif |
| -#define LOWER(x) (x | 0x20) /* cheap ToLower function ignores LOCALE */ |
| +#define LOWER(x) (x | 0x20) /* cheap ToLower function ignores LOCALE */ |
| static void |
| ssl_SetDefaultsFromEnvironment(void) |
| { |
| -#if defined( NSS_HAVE_GETENV ) |
| +#if defined(NSS_HAVE_GETENV) |
| static int firsttime = 1; |
| if (firsttime) { |
| - char * ev; |
| + char *ev; |
| firsttime = 0; |
| #ifdef DEBUG |
| - ev = getenv("SSLDEBUGFILE"); |
| + ev = PR_GetEnvSecure("SSLDEBUGFILE"); |
| if (ev && ev[0]) { |
| ssl_trace_iob = fopen(ev, "w"); |
| } |
| @@ -3262,19 +3554,19 @@ ssl_SetDefaultsFromEnvironment(void) |
| ssl_trace_iob = stderr; |
| } |
| #ifdef TRACE |
| - ev = getenv("SSLTRACE"); |
| + ev = PR_GetEnvSecure("SSLTRACE"); |
| if (ev && ev[0]) { |
| ssl_trace = atoi(ev); |
| SSL_TRACE(("SSL: tracing set to %d", ssl_trace)); |
| } |
| #endif /* TRACE */ |
| - ev = getenv("SSLDEBUG"); |
| + ev = PR_GetEnvSecure("SSLDEBUG"); |
| if (ev && ev[0]) { |
| ssl_debug = atoi(ev); |
| SSL_TRACE(("SSL: debugging set to %d", ssl_debug)); |
| } |
| #endif /* DEBUG */ |
| - ev = getenv("SSLKEYLOGFILE"); |
| + ev = PR_GetEnvSecure("SSLKEYLOGFILE"); |
| if (ev && ev[0]) { |
| ssl_keylog_iob = fopen(ev, "a"); |
| if (!ssl_keylog_iob) { |
| @@ -3288,21 +3580,21 @@ ssl_SetDefaultsFromEnvironment(void) |
| } |
| } |
| #ifndef NO_PKCS11_BYPASS |
| - ev = getenv("SSLBYPASS"); |
| + ev = PR_GetEnvSecure("SSLBYPASS"); |
| if (ev && ev[0]) { |
| ssl_defaults.bypassPKCS11 = (ev[0] == '1'); |
| - SSL_TRACE(("SSL: bypass default set to %d", \ |
| - ssl_defaults.bypassPKCS11)); |
| + SSL_TRACE(("SSL: bypass default set to %d", |
| + ssl_defaults.bypassPKCS11)); |
| } |
| #endif /* NO_PKCS11_BYPASS */ |
| - ev = getenv("SSLFORCELOCKS"); |
| + ev = PR_GetEnvSecure("SSLFORCELOCKS"); |
| if (ev && ev[0] == '1') { |
| ssl_force_locks = PR_TRUE; |
| ssl_defaults.noLocks = 0; |
| strcpy(lockStatus + LOCKSTATUS_OFFSET, "FORCED. "); |
| SSL_TRACE(("SSL: force_locks set to %d", ssl_force_locks)); |
| } |
| - ev = getenv("NSS_SSL_ENABLE_RENEGOTIATION"); |
| + ev = PR_GetEnvSecure("NSS_SSL_ENABLE_RENEGOTIATION"); |
| if (ev) { |
| if (ev[0] == '1' || LOWER(ev[0]) == 'u') |
| ssl_defaults.enableRenegotiation = SSL_RENEGOTIATE_UNRESTRICTED; |
| @@ -3315,13 +3607,13 @@ ssl_SetDefaultsFromEnvironment(void) |
| SSL_TRACE(("SSL: enableRenegotiation set to %d", |
| ssl_defaults.enableRenegotiation)); |
| } |
| - ev = getenv("NSS_SSL_REQUIRE_SAFE_NEGOTIATION"); |
| + ev = PR_GetEnvSecure("NSS_SSL_REQUIRE_SAFE_NEGOTIATION"); |
| if (ev && ev[0] == '1') { |
| ssl_defaults.requireSafeNegotiation = PR_TRUE; |
| SSL_TRACE(("SSL: requireSafeNegotiation set to %d", |
| - PR_TRUE)); |
| + PR_TRUE)); |
| } |
| - ev = getenv("NSS_SSL_CBC_RANDOM_IV"); |
| + ev = PR_GetEnvSecure("NSS_SSL_CBC_RANDOM_IV"); |
| if (ev && ev[0] == '0') { |
| ssl_defaults.cbcRandomIV = PR_FALSE; |
| SSL_TRACE(("SSL: cbcRandomIV set to 0")); |
| @@ -3344,7 +3636,7 @@ ssl_NewSocket(PRBool makeLocks, SSLProtocolVariant protocolVariant) |
| makeLocks = PR_TRUE; |
| /* Make a new socket and get it ready */ |
| - ss = (sslSocket*) PORT_ZAlloc(sizeof(sslSocket)); |
| + ss = (sslSocket *)PORT_ZAlloc(sizeof(sslSocket)); |
| if (ss) { |
| /* This should be of type SSLKEAType, but CC on IRIX |
| * complains during the for loop. |
| @@ -3352,58 +3644,55 @@ ssl_NewSocket(PRBool makeLocks, SSLProtocolVariant protocolVariant) |
| int i; |
| SECStatus status; |
| - ss->opt = ssl_defaults; |
| - ss->opt.useSocks = PR_FALSE; |
| - ss->opt.noLocks = !makeLocks; |
| - ss->vrange = *VERSIONS_DEFAULTS(protocolVariant); |
| - ss->protocolVariant = protocolVariant; |
| - |
| - ss->peerID = NULL; |
| - ss->rTimeout = PR_INTERVAL_NO_TIMEOUT; |
| - ss->wTimeout = PR_INTERVAL_NO_TIMEOUT; |
| - ss->cTimeout = PR_INTERVAL_NO_TIMEOUT; |
| - ss->cipherSpecs = NULL; |
| - ss->sizeCipherSpecs = 0; /* produced lazily */ |
| - ss->preferredCipher = NULL; |
| - ss->url = NULL; |
| - |
| - for (i=kt_null; i < kt_kea_size; i++) { |
| - sslServerCerts * sc = ss->serverCerts + i; |
| - sc->serverCert = NULL; |
| + ss->opt = ssl_defaults; |
| + ss->opt.useSocks = PR_FALSE; |
| + ss->opt.noLocks = !makeLocks; |
| + ss->vrange = *VERSIONS_DEFAULTS(protocolVariant); |
| + ss->protocolVariant = protocolVariant; |
| + |
| + ss->peerID = NULL; |
| + ss->rTimeout = PR_INTERVAL_NO_TIMEOUT; |
| + ss->wTimeout = PR_INTERVAL_NO_TIMEOUT; |
| + ss->cTimeout = PR_INTERVAL_NO_TIMEOUT; |
| + ss->cipherSpecs = NULL; |
| + ss->sizeCipherSpecs = 0; /* produced lazily */ |
| + ss->preferredCipher = NULL; |
| + ss->url = NULL; |
| + |
| + for (i = kt_null; i < kt_kea_size; i++) { |
| + sslServerCerts *sc = ss->serverCerts + i; |
| + sc->serverCert = NULL; |
| sc->serverCertChain = NULL; |
| - sc->serverKeyPair = NULL; |
| - sc->serverKeyBits = 0; |
| + sc->serverKeyPair = NULL; |
| + sc->serverKeyBits = 0; |
| ss->certStatusArray[i] = NULL; |
| } |
| ss->requestedCertTypes = NULL; |
| - ss->stepDownKeyPair = NULL; |
| + ss->stepDownKeyPair = NULL; |
| ss->dheParams = NULL; |
| ss->dheKeyPair = NULL; |
| - ss->dbHandle = CERT_GetDefaultCertDB(); |
| + ss->dbHandle = CERT_GetDefaultCertDB(); |
| /* Provide default implementation of hooks */ |
| - ss->authCertificate = SSL_AuthCertificate; |
| + ss->authCertificate = SSL_AuthCertificate; |
| ss->authCertificateArg = (void *)ss->dbHandle; |
| - ss->sniSocketConfig = NULL; |
| + ss->sniSocketConfig = NULL; |
| ss->sniSocketConfigArg = NULL; |
| - ss->getClientAuthData = NULL; |
| -#ifdef NSS_PLATFORM_CLIENT_AUTH |
| - ss->getPlatformClientAuthData = NULL; |
| - ss->getPlatformClientAuthDataArg = NULL; |
| -#endif /* NSS_PLATFORM_CLIENT_AUTH */ |
| - ss->handleBadCert = NULL; |
| - ss->badCertArg = NULL; |
| - ss->pkcs11PinArg = NULL; |
| + ss->getClientAuthData = NULL; |
| + ss->handleBadCert = NULL; |
| + ss->badCertArg = NULL; |
| + ss->pkcs11PinArg = NULL; |
| ss->ephemeralECDHKeyPair = NULL; |
| - ss->getChannelID = NULL; |
| - ss->getChannelIDArg = NULL; |
| + ss->getChannelID = NULL; |
| + ss->getChannelIDArg = NULL; |
| ssl_ChooseOps(ss); |
| ssl2_InitSocketPolicy(ss); |
| ssl3_InitSocketPolicy(ss); |
| PR_INIT_CLIST(&ss->ssl3.hs.lastMessageFlight); |
| + PR_INIT_CLIST(&ss->ssl3.hs.remoteKeyShares); |
| if (makeLocks) { |
| status = ssl_MakeLocks(ss); |
| @@ -3415,7 +3704,7 @@ ssl_NewSocket(PRBool makeLocks, SSLProtocolVariant protocolVariant) |
| goto loser; |
| status = ssl_InitGather(&ss->gs); |
| if (status != SECSuccess) { |
| -loser: |
| + loser: |
| ssl_DestroySocketContents(ss); |
| ssl_DestroyLocks(ss); |
| PORT_Free(ss); |