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 + -
显示快捷键?