Commit f3b656b2 authored by Dr. Stephen Henson's avatar Dr. Stephen Henson
Browse files

Initialize SSL_METHOD structures at compile time. This removes the need

for locking code. The CRYPTO_LOCK_SSL_METHOD lock is now no longer used.
parent 53b38d37
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -14,6 +14,10 @@

 Changes between 0.9.8 and 0.9.8a  [XX xxx XXXX]

  *) Initialize SSL_METHOD structures at compile time instead of during
     runtime, thus removing the need for a lock.
     [Steve Henson]

  *) Make PKCS7_decrypt() work even if no certificate is supplied by
     attempting to decrypt each encrypted key in turn. Add support to
     smime utility.
+4 −22
Original line number Diff line number Diff line
@@ -136,28 +136,10 @@ static SSL_METHOD *dtls1_get_client_method(int ver)
		return(NULL);
	}

SSL_METHOD *DTLSv1_client_method(void)
	{
	static int init=1;
	static SSL_METHOD DTLSv1_client_data;

	if (init)
		{
		CRYPTO_w_lock(CRYPTO_LOCK_SSL_METHOD);

		if (init)
			{
			memcpy((char *)&DTLSv1_client_data,(char *)dtlsv1_base_method(),
				sizeof(SSL_METHOD));
			DTLSv1_client_data.ssl_connect=dtls1_connect;
			DTLSv1_client_data.get_ssl_method=dtls1_get_client_method;
			init=0;
			}
		
		CRYPTO_w_unlock(CRYPTO_LOCK_SSL_METHOD);
		}
	return(&DTLSv1_client_data);
	}
IMPLEMENT_dtls1_meth_func(DTLSv1_client_method,
			ssl_undefined_function,
			dtls1_connect,
			dtls1_get_client_method)

int dtls1_connect(SSL *s)
	{
+6 −40
Original line number Diff line number Diff line
@@ -63,9 +63,7 @@

const char *dtls1_version_str="DTLSv1" OPENSSL_VERSION_PTEXT;

static long dtls1_default_timeout(void);

static SSL3_ENC_METHOD DTLSv1_enc_data={
SSL3_ENC_METHOD DTLSv1_enc_data={
    dtls1_enc,
	tls1_mac,
	tls1_setup_key_block,
@@ -79,49 +77,17 @@ static SSL3_ENC_METHOD DTLSv1_enc_data={
	tls1_alert_code,
	};

static SSL_METHOD DTLSv1_data= {
	DTLS1_VERSION,
	dtls1_new,
	dtls1_clear,
	dtls1_free,
	ssl_undefined_function,
	ssl_undefined_function,
	ssl3_read,
	ssl3_peek,
	ssl3_write,
	ssl3_shutdown,
	ssl3_renegotiate,
	ssl3_renegotiate_check,
	dtls1_get_message,
	dtls1_read_bytes,
	dtls1_write_app_data_bytes,
	dtls1_dispatch_alert,
	ssl3_ctrl,
	ssl3_ctx_ctrl,
	ssl3_get_cipher_by_char,
	ssl3_put_cipher_by_char,
	ssl3_pending,
	ssl3_num_ciphers,
	ssl3_get_cipher,
	ssl_bad_method,
	dtls1_default_timeout,
	&DTLSv1_enc_data,
	ssl_undefined_void_function,
	ssl3_callback_ctrl,
	ssl3_ctx_callback_ctrl,
	};

static long dtls1_default_timeout(void)
long dtls1_default_timeout(void)
	{
	/* 2 hours, the 24 hours mentioned in the DTLSv1 spec
	 * is way too long for http, the cache would over fill */
	return(60*60*2);
	}

SSL_METHOD *dtlsv1_base_method(void)
	{
	return(&DTLSv1_data);
	}
IMPLEMENT_dtls1_meth_func(dtls1_base_method,
			ssl_undefined_function,
			ssl_undefined_function,
			ssl_bad_method)

int dtls1_new(SSL *s)
	{
+4 −23
Original line number Diff line number Diff line
@@ -70,27 +70,8 @@ static SSL_METHOD *dtls1_get_method(int ver)
		return(NULL);
	}

SSL_METHOD *DTLSv1_method(void)
	{
	static int init=1;
	static SSL_METHOD DTLSv1_data;

	if (init)
		{
		CRYPTO_w_lock(CRYPTO_LOCK_SSL_METHOD);
IMPLEMENT_dtls1_meth_func(DTLSv1_method,
			dtls1_accept,
			dtls1_connect,
			dtls1_get_method)
		if (init)
			{
			memcpy((char *)&DTLSv1_data,(char *)dtlsv1_base_method(),
				sizeof(SSL_METHOD));
			DTLSv1_data.ssl_connect=dtls1_connect;
			DTLSv1_data.ssl_accept=dtls1_accept;
			DTLSv1_data.get_ssl_method=dtls1_get_method;
			init=0;
			}

		CRYPTO_w_unlock(CRYPTO_LOCK_SSL_METHOD);
		}
	
	return(&DTLSv1_data);
	}
+4 −22
Original line number Diff line number Diff line
@@ -137,28 +137,10 @@ static SSL_METHOD *dtls1_get_server_method(int ver)
		return(NULL);
	}

SSL_METHOD *DTLSv1_server_method(void)
	{
	static int init=1;
	static SSL_METHOD DTLSv1_server_data;

	if (init)
		{
		CRYPTO_w_lock(CRYPTO_LOCK_SSL_METHOD);

		if (init)
			{
			memcpy((char *)&DTLSv1_server_data,(char *)dtlsv1_base_method(),
				sizeof(SSL_METHOD));
			DTLSv1_server_data.ssl_accept=dtls1_accept;
			DTLSv1_server_data.get_ssl_method=dtls1_get_server_method;
			init=0;
			}
			
		CRYPTO_w_unlock(CRYPTO_LOCK_SSL_METHOD);
		}
	return(&DTLSv1_server_data);
	}
IMPLEMENT_dtls1_meth_func(DTLSv1_server_method,
			dtls1_accept,
			ssl_undefined_function,
			dtls1_get_server_method)

int dtls1_accept(SSL *s)
	{
Loading