sslsock.c
来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 1,856 行 · 第 1/4 页
C
1,856 行
rv = ssl_CreateSocksInfo(ss); if (rv != SECSuccess) { return rv; } } if (ss->useSecurity) { rv = ssl_CreateSecurityInfo(ss); if (rv != SECSuccess) { return rv; } } ssl_ChooseOps(ss); return rv;}SECStatusSSL_Enable(PRFileDesc *fd, int which, PRBool on){ return SSL_OptionSet(fd, which, on);}SECStatusSSL_OptionSet(PRFileDesc *fd, PRInt32 which, PRBool on){ sslSocket *ss = ssl_FindSocket(fd); SECStatus rv = SECSuccess; if (!ss) { SSL_DBG(("%d: SSL[%d]: bad socket in Enable", SSL_GETPID(), fd)); PORT_SetError(PR_BAD_DESCRIPTOR_ERROR); return SECFailure; } ssl_Get1stHandshakeLock(ss); ssl_GetSSL3HandshakeLock(ss); switch (which) { case SSL_SOCKS: ss->useSocks = on; rv = PrepareSocket(ss); break; case SSL_SECURITY: ss->useSecurity = on; rv = PrepareSocket(ss); break; case SSL_REQUEST_CERTIFICATE: ss->requestCertificate = on; break; case SSL_REQUIRE_CERTIFICATE: ss->requireCertificate = on; break; case SSL_HANDSHAKE_AS_CLIENT: if ( ss->handshakeAsServer && on ) { PORT_SetError(SEC_ERROR_INVALID_ARGS); rv = SECFailure; break; } ss->handshakeAsClient = on; break; case SSL_HANDSHAKE_AS_SERVER: if ( ss->handshakeAsClient && on ) { PORT_SetError(SEC_ERROR_INVALID_ARGS); rv = SECFailure; break; } ss->handshakeAsServer = on; break; case SSL_ENABLE_TLS: ss->enableTLS = on; ss->preferredCipher = NULL; if (ss->cipherSpecs) { PORT_Free(ss->cipherSpecs); ss->cipherSpecs = NULL; ss->sizeCipherSpecs = 0; } break; case SSL_ENABLE_SSL3: ss->enableSSL3 = on; ss->preferredCipher = NULL; if (ss->cipherSpecs) { PORT_Free(ss->cipherSpecs); ss->cipherSpecs = NULL; ss->sizeCipherSpecs = 0; } break; case SSL_ENABLE_SSL2: ss->enableSSL2 = on; if (on) { ss->v2CompatibleHello = on; } ss->preferredCipher = NULL; if (ss->cipherSpecs) { PORT_Free(ss->cipherSpecs); ss->cipherSpecs = NULL; ss->sizeCipherSpecs = 0; } break; case SSL_NO_CACHE: ss->noCache = on; break; case SSL_ENABLE_FDX: ss->fdx = on; break; case SSL_V2_COMPATIBLE_HELLO: ss->v2CompatibleHello = on; if (!on) { ss->enableSSL2 = on; } break; case SSL_ROLLBACK_DETECTION: ss->detectRollBack = on; break; default: PORT_SetError(SEC_ERROR_INVALID_ARGS); rv = SECFailure; } ssl_ReleaseSSL3HandshakeLock(ss); ssl_Release1stHandshakeLock(ss); return rv;}SECStatusSSL_OptionGet(PRFileDesc *fd, PRInt32 which, PRBool *pOn){ sslSocket *ss = ssl_FindSocket(fd); SECStatus rv = SECSuccess; PRBool on = PR_FALSE; if (!pOn) { PORT_SetError(SEC_ERROR_INVALID_ARGS); return SECFailure; } if (!ss) { SSL_DBG(("%d: SSL[%d]: bad socket in Enable", SSL_GETPID(), fd)); PORT_SetError(PR_BAD_DESCRIPTOR_ERROR); *pOn = PR_FALSE; return SECFailure; } ssl_Get1stHandshakeLock(ss); ssl_GetSSL3HandshakeLock(ss); switch (which) { case SSL_SOCKS: on = ss->useSocks; break; case SSL_SECURITY: on = ss->useSecurity; break; case SSL_REQUEST_CERTIFICATE: on = ss->requestCertificate; break; case SSL_REQUIRE_CERTIFICATE: on = ss->requireCertificate; break; case SSL_HANDSHAKE_AS_CLIENT: on = ss->handshakeAsClient; break; case SSL_HANDSHAKE_AS_SERVER: on = ss->handshakeAsServer; break; case SSL_ENABLE_TLS: on = ss->enableTLS; break; case SSL_ENABLE_SSL3: on = ss->enableSSL3; break; case SSL_ENABLE_SSL2: on = ss->enableSSL2; break; case SSL_NO_CACHE: on = ss->noCache; break; case SSL_ENABLE_FDX: on = ss->fdx; break; case SSL_V2_COMPATIBLE_HELLO: on = ss->v2CompatibleHello; break; case SSL_ROLLBACK_DETECTION: on = ss->detectRollBack; break; default: PORT_SetError(SEC_ERROR_INVALID_ARGS); rv = SECFailure; } ssl_ReleaseSSL3HandshakeLock(ss); ssl_Release1stHandshakeLock(ss); *pOn = on; return rv;}SECStatusSSL_OptionGetDefault(PRInt32 which, PRBool *pOn){ SECStatus rv = SECSuccess; PRBool on = PR_FALSE; if (!pOn) { PORT_SetError(SEC_ERROR_INVALID_ARGS); return SECFailure; } switch (which) { case SSL_SOCKS: on = ssl_defaults.useSocks; 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 = ssl_defaults.enableTLS; break; case SSL_ENABLE_SSL3: on = ssl_defaults.enableSSL3; 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; default: PORT_SetError(SEC_ERROR_INVALID_ARGS); rv = SECFailure; } *pOn = on; return rv;}/* XXX Use Global Lock to protect this stuff. */SECStatusSSL_EnableDefault(int which, PRBool on){ return SSL_OptionSetDefault(which, on);}SECStatusSSL_OptionSetDefault(PRInt32 which, PRBool on){ switch (which) { case SSL_SOCKS: ssl_defaults.useSocks = on; break; case SSL_SECURITY: ssl_defaults.useSecurity = on; break; case SSL_REQUEST_CERTIFICATE: ssl_defaults.requestCertificate = 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_SERVER: if ( ssl_defaults.handshakeAsClient && on ) { PORT_SetError(SEC_ERROR_INVALID_ARGS); return SECFailure; } ssl_defaults.handshakeAsServer = on; break; case SSL_ENABLE_TLS: ssl_defaults.enableTLS = on; break; case SSL_ENABLE_SSL3: ssl_defaults.enableSSL3 = on; break; case SSL_ENABLE_SSL2: ssl_defaults.enableSSL2 = on; if (on) { ssl_defaults.v2CompatibleHello = on; } break; case SSL_NO_CACHE: ssl_defaults.noCache = on; break; case SSL_ENABLE_FDX: ssl_defaults.fdx = on; 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; default: PORT_SetError(SEC_ERROR_INVALID_ARGS); return SECFailure; } return SECSuccess;}/* Part of the public NSS API. * Since this is a global (not per-socket) setting, we cannot use the * HandshakeLock to protect this. Probably want a global lock. */SECStatusSSL_SetPolicy(long which, int policy){ if ((which & 0xfffe) == SSL_RSA_OLDFIPS_WITH_3DES_EDE_CBC_SHA) { /* one of the two old FIPS ciphers */ if (which == SSL_RSA_OLDFIPS_WITH_3DES_EDE_CBC_SHA) which = SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA; else if (which == SSL_RSA_OLDFIPS_WITH_DES_CBC_SHA) which = SSL_RSA_FIPS_WITH_DES_CBC_SHA; } return SSL_CipherPolicySet(which, policy);}SECStatusSSL_CipherPolicySet(PRInt32 which, PRInt32 policy){ SECStatus rv; if (SSL_IS_SSL2_CIPHER(which)) { rv = ssl2_SetPolicy(which, policy); } else { rv = ssl3_SetPolicy((ssl3CipherSuite)which, policy); } return rv;}SECStatusSSL_CipherPolicyGet(PRInt32 which, PRInt32 *oPolicy){ SECStatus rv; if (!oPolicy) { PORT_SetError(SEC_ERROR_INVALID_ARGS); return SECFailure; } if (SSL_IS_SSL2_CIPHER(which)) { rv = ssl2_GetPolicy(which, oPolicy); } else { rv = ssl3_GetPolicy((ssl3CipherSuite)which, oPolicy); } return rv;}/* Part of the public NSS API. * Since this is a global (not per-socket) setting, we cannot use the * HandshakeLock to protect this. Probably want a global lock. * These changes have no effect on any sslSockets already created. */SECStatusSSL_EnableCipher(long which, PRBool enabled){ if ((which & 0xfffe) == SSL_RSA_OLDFIPS_WITH_3DES_EDE_CBC_SHA) { /* one of the two old FIPS ciphers */ if (which == SSL_RSA_OLDFIPS_WITH_3DES_EDE_CBC_SHA) which = SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA; else if (which == SSL_RSA_OLDFIPS_WITH_DES_CBC_SHA) which = SSL_RSA_FIPS_WITH_DES_CBC_SHA; } return SSL_CipherPrefSetDefault(which, enabled);}SECStatusSSL_CipherPrefSetDefault(PRInt32 which, PRBool enabled){ SECStatus rv; if (SSL_IS_SSL2_CIPHER(which)) { rv = ssl2_CipherPrefSetDefault(which, enabled); } else { rv = ssl3_CipherPrefSetDefault((ssl3CipherSuite)which, enabled); } return rv;}SECStatus SSL_CipherPrefGetDefault(PRInt32 which, PRBool *enabled){ SECStatus rv; if (!enabled) { PORT_SetError(SEC_ERROR_INVALID_ARGS); return SECFailure; } if (SSL_IS_SSL2_CIPHER(which)) { rv = ssl2_CipherPrefGetDefault(which, enabled); } else { rv = ssl3_CipherPrefGetDefault((ssl3CipherSuite)which, enabled); } return rv;}SECStatusSSL_CipherPrefSet(PRFileDesc *fd, PRInt32 which, PRBool enabled){ SECStatus rv; sslSocket *ss = ssl_FindSocket(fd); if (!ss) { SSL_DBG(("%d: SSL[%d]: bad socket in CipherPrefSet", SSL_GETPID(), fd)); PORT_SetError(PR_BAD_DESCRIPTOR_ERROR); return SECFailure; } if (SSL_IS_SSL2_CIPHER(which)) { rv = ssl2_CipherPrefSet(ss, which, enabled); } else { rv = ssl3_CipherPrefSet(ss, (ssl3CipherSuite)which, enabled); } return rv;}SECStatus SSL_CipherPrefGet(PRFileDesc *fd, PRInt32 which, PRBool *enabled){ SECStatus rv; sslSocket *ss = ssl_FindSocket(fd); if (!enabled) { PORT_SetError(SEC_ERROR_INVALID_ARGS); return SECFailure; } if (!ss) { SSL_DBG(("%d: SSL[%d]: bad socket in CipherPrefGet", SSL_GETPID(), fd)); PORT_SetError(PR_BAD_DESCRIPTOR_ERROR); *enabled = PR_FALSE; return SECFailure; } if (SSL_IS_SSL2_CIPHER(which)) { rv = ssl2_CipherPrefGet(ss, which, enabled); } else { rv = ssl3_CipherPrefGet(ss, (ssl3CipherSuite)which, enabled); } return rv;}SECStatusNSS_SetDomesticPolicy(void){#ifndef EXPORT_VERSION SECStatus status = SECSuccess; cipherPolicy * policy; for (policy = ssl_ciphers; policy->cipher != 0; ++policy) { status = SSL_SetPolicy(policy->cipher, SSL_ALLOWED); if (status != SECSuccess) break; } return status;#else return NSS_SetExportPolicy();#endif}SECStatusNSS_SetExportPolicy(void){ SECStatus status = SECSuccess; cipherPolicy * policy;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?