Home | History | Annotate | Download | only in patches
      1 --- openssl-1.0.0b.orig/ssl/ssl.h	2010-11-30 00:03:46.000000000 +0000
      2 +++ openssl-1.0.0b/ssl/ssl.h	2010-11-30 00:03:47.000000000 +0000
      3 @@ -1133,6 +1133,9 @@ struct ssl_st
      4  	/* This can also be in the session once a session is established */
      5  	SSL_SESSION *session;
      6  
      7 +        /* This can be disabled to prevent the use of uncached sessions */
      8 +	int session_creation_enabled;
      9 +
     10  	/* Default generate session ID callback. */
     11  	GEN_SESSION_CB generate_session_id;
     12  
     13 @@ -1554,6 +1558,7 @@ const char  * SSL_get_cipher_list(const 
     14  char *	SSL_get_shared_ciphers(const SSL *s, char *buf, int len);
     15  int	SSL_get_read_ahead(const SSL * s);
     16  int	SSL_pending(const SSL *s);
     17 +const char *	SSL_authentication_method(const SSL *c);
     18  #ifndef OPENSSL_NO_SOCK
     19  int	SSL_set_fd(SSL *s, int fd);
     20  int	SSL_set_rfd(SSL *s, int fd);
     21 @@ -1565,6 +1570,7 @@ BIO *	SSL_get_rbio(const SSL *s);
     22  BIO *	SSL_get_wbio(const SSL *s);
     23  #endif
     24  int	SSL_set_cipher_list(SSL *s, const char *str);
     25 +int	SSL_set_cipher_lists(SSL *s, STACK_OF(SSL_CIPHER) *sk);
     26  void	SSL_set_read_ahead(SSL *s, int yes);
     27  int	SSL_get_verify_mode(const SSL *s);
     28  int	SSL_get_verify_depth(const SSL *s);
     29 @@ -1580,6 +1586,8 @@ int	SSL_use_PrivateKey(SSL *ssl, EVP_PKE
     30  int	SSL_use_PrivateKey_ASN1(int pk,SSL *ssl, const unsigned char *d, long len);
     31  int	SSL_use_certificate(SSL *ssl, X509 *x);
     32  int	SSL_use_certificate_ASN1(SSL *ssl, const unsigned char *d, int len);
     33 +int	SSL_use_certificate_chain(SSL *ssl, STACK_OF(X509) *cert_chain);
     34 +STACK_OF(X509) * SSL_get_certificate_chain(SSL *ssl, X509 *x);
     35  
     36  #ifndef OPENSSL_NO_STDIO
     37  int	SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type);
     38 @@ -1615,6 +1623,7 @@ void	SSL_copy_session_id(SSL *to,const S
     39  SSL_SESSION *SSL_SESSION_new(void);
     40  const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s,
     41  					unsigned int *len);
     42 +const char *	SSL_SESSION_get_version(const SSL_SESSION *s);
     43  unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *s);
     44  #ifndef OPENSSL_NO_FP_API
     45  int	SSL_SESSION_print_fp(FILE *fp,const SSL_SESSION *ses);
     46 @@ -1624,6 +1633,7 @@ int	SSL_SESSION_print(BIO *fp,const SSL_
     47  void	SSL_SESSION_free(SSL_SESSION *ses);
     48  int	i2d_SSL_SESSION(SSL_SESSION *in,unsigned char **pp);
     49  int	SSL_set_session(SSL *to, SSL_SESSION *session);
     50 +void	SSL_set_session_creation_enabled(SSL *, int);
     51  int	SSL_CTX_add_session(SSL_CTX *s, SSL_SESSION *c);
     52  int	SSL_CTX_remove_session(SSL_CTX *,SSL_SESSION *c);
     53  int	SSL_CTX_set_generate_session_id(SSL_CTX *, GEN_SESSION_CB);
     54 @@ -2066,6 +2076,7 @@ void ERR_load_SSL_strings(void);
     55  #define SSL_F_SSL_UNDEFINED_VOID_FUNCTION		 244
     56  #define SSL_F_SSL_USE_CERTIFICATE			 198
     57  #define SSL_F_SSL_USE_CERTIFICATE_ASN1			 199
     58 +#define SSL_F_SSL_USE_CERTIFICATE_CHAIN			 2000
     59  #define SSL_F_SSL_USE_CERTIFICATE_FILE			 200
     60  #define SSL_F_SSL_USE_PRIVATEKEY			 201
     61  #define SSL_F_SSL_USE_PRIVATEKEY_ASN1			 202
     62 @@ -2272,6 +2283,7 @@ void ERR_load_SSL_strings(void);
     63  #define SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING		 345
     64  #define SSL_R_SERVERHELLO_TLSEXT			 275
     65  #define SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED		 277
     66 +#define SSL_R_SESSION_MAY_NOT_BE_CREATED		 2000
     67  #define SSL_R_SHORT_READ				 219
     68  #define SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE	 220
     69  #define SSL_R_SSL23_DOING_SESSION_ID_REUSE		 221
     70 --- openssl-1.0.0b.orig/ssl/d1_clnt.c	2010-01-26 19:46:29.000000000 +0000
     71 +++ openssl-1.0.0b/ssl/d1_clnt.c	2010-11-30 00:03:47.000000000 +0000
     72 @@ -613,6 +613,12 @@ int dtls1_client_hello(SSL *s)
     73  #endif
     74  			(s->session->not_resumable))
     75  			{
     76 +		        if (!s->session_creation_enabled)
     77 +				{
     78 +				ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
     79 +				SSLerr(SSL_F_DTLS1_CLIENT_HELLO,SSL_R_SESSION_MAY_NOT_BE_CREATED);
     80 +				goto err;
     81 +				}
     82  			if (!ssl_get_new_session(s,0))
     83  				goto err;
     84  			}
     85 --- openssl-1.0.0b.orig/ssl/s23_clnt.c	2010-02-16 14:20:40.000000000 +0000
     86 +++ openssl-1.0.0b/ssl/s23_clnt.c	2010-11-30 00:03:47.000000000 +0000
     87 @@ -687,6 +687,13 @@ static int ssl23_get_server_hello(SSL *s
     88  
     89  	/* Since, if we are sending a ssl23 client hello, we are not
     90  	 * reusing a session-id */
     91 +        if (!s->session_creation_enabled)
     92 +		{
     93 +		if (!(s->client_version == SSL2_VERSION))
     94 +			ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
     95 +		SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_SESSION_MAY_NOT_BE_CREATED);
     96 +		goto err;
     97 +		}
     98  	if (!ssl_get_new_session(s,0))
     99  		goto err;
    100  
    101 --- openssl-1.0.0b.orig/ssl/s3_both.c	2010-11-30 00:03:46.000000000 +0000
    102 +++ openssl-1.0.0b/ssl/s3_both.c	2010-11-30 00:03:47.000000000 +0000
    103 @@ -347,8 +347,11 @@ unsigned long ssl3_output_cert_chain(SSL
    104  	unsigned long l=7;
    105  	BUF_MEM *buf;
    106  	int no_chain;
    107 +	STACK_OF(X509) *cert_chain;
    108  
    109 -	if ((s->mode & SSL_MODE_NO_AUTO_CHAIN) || s->ctx->extra_certs)
    110 +	cert_chain = SSL_get_certificate_chain(s, x);
    111 +
    112 +	if ((s->mode & SSL_MODE_NO_AUTO_CHAIN) || s->ctx->extra_certs || cert_chain)
    113  		no_chain = 1;
    114  	else
    115  		no_chain = 0;
    116 @@ -400,6 +403,10 @@ unsigned long ssl3_output_cert_chain(SSL
    117  			return(0);
    118  		}
    119  
    120 +	for (i=0; i<sk_X509_num(cert_chain); i++)
    121 +		if (ssl3_add_cert_to_buf(buf, &l, sk_X509_value(cert_chain,i)))
    122 +			return(0);
    123 +
    124  	l-=7;
    125  	p=(unsigned char *)&(buf->data[4]);
    126  	l2n3(l,p);
    127 --- openssl-1.0.0b.orig/ssl/s3_clnt.c	2010-11-30 00:03:46.000000000 +0000
    128 +++ openssl-1.0.0b/ssl/s3_clnt.c	2010-11-30 00:03:47.000000000 +0000
    129 @@ -686,6 +686,12 @@ int ssl3_client_hello(SSL *s)
    130  #endif
    131  			(sess->not_resumable))
    132  			{
    133 +		        if (!s->session_creation_enabled)
    134 +				{
    135 +				ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
    136 +				SSLerr(SSL_F_SSL3_CLIENT_HELLO,SSL_R_SESSION_MAY_NOT_BE_CREATED);
    137 +				goto err;
    138 +				}
    139  			if (!ssl_get_new_session(s,0))
    140  				goto err;
    141  			}
    142 @@ -894,6 +900,12 @@ int ssl3_get_server_hello(SSL *s)
    143  		s->hit=0;
    144  		if (s->session->session_id_length > 0)
    145  			{
    146 +		        if (!s->session_creation_enabled)
    147 +				{
    148 +				ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
    149 +				SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_SESSION_MAY_NOT_BE_CREATED);
    150 +				goto err;
    151 +				}
    152  			if (!ssl_get_new_session(s,0))
    153  				{
    154  				al=SSL_AD_INTERNAL_ERROR;
    155 --- openssl-1.0.0b.orig/ssl/s3_srvr.c	2010-11-30 00:03:46.000000000 +0000
    156 +++ openssl-1.0.0b/ssl/s3_srvr.c	2010-11-30 00:03:47.000000000 +0000
    157 @@ -902,6 +902,12 @@ int ssl3_get_client_hello(SSL *s)
    158  	 */
    159  	if ((s->new_session && (s->options & SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION)))
    160  		{
    161 +	        if (!s->session_creation_enabled)
    162 +			{
    163 +			ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
    164 +			SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_SESSION_MAY_NOT_BE_CREATED);
    165 +			goto err;
    166 +		}
    167  		if (!ssl_get_new_session(s,1))
    168  			goto err;
    169  		}
    170 @@ -916,6 +922,12 @@ int ssl3_get_client_hello(SSL *s)
    171  			goto err;
    172  		else /* i == 0 */
    173  			{
    174 +		        if (!s->session_creation_enabled)
    175 +				{
    176 +				ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
    177 +				SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_SESSION_MAY_NOT_BE_CREATED);
    178 +				goto err;
    179 +				}
    180  			if (!ssl_get_new_session(s,1))
    181  				goto err;
    182  			}
    183 --- openssl-1.0.0b.orig/ssl/ssl_ciph.c	2010-06-15 17:25:14.000000000 +0000
    184 +++ openssl-1.0.0b/ssl/ssl_ciph.c	2010-11-30 00:03:47.000000000 +0000
    185 @@ -1652,6 +1652,52 @@ int SSL_CIPHER_get_bits(const SSL_CIPHER
    186  	return(ret);
    187  	}
    188  
    189 +/* return string version of key exchange algorithm */
    190 +const char* SSL_CIPHER_authentication_method(const SSL_CIPHER* cipher)
    191 +	{
    192 +	switch (cipher->algorithm_mkey)
    193 +		{
    194 +	case SSL_kRSA:
    195 +		return SSL_TXT_RSA;
    196 +	case SSL_kDHr:
    197 +		return SSL_TXT_DH "_" SSL_TXT_RSA;
    198 +	case SSL_kDHd:
    199 +		return SSL_TXT_DH "_" SSL_TXT_DSS;
    200 +	case SSL_kEDH:
    201 +		switch (cipher->algorithm_auth)
    202 +			{
    203 +		case SSL_aDSS:
    204 +			return "DHE_" SSL_TXT_DSS;
    205 +		case SSL_aRSA:
    206 +			return "DHE_" SSL_TXT_RSA;
    207 +		case SSL_aNULL:
    208 +			return SSL_TXT_DH "_anon";
    209 +		default:
    210 +			return "UNKNOWN";
    211 +                        }
    212 +	case SSL_kKRB5:
    213 +		return SSL_TXT_KRB5;
    214 +	case SSL_kECDHr:
    215 +		return SSL_TXT_ECDH "_" SSL_TXT_RSA;
    216 +	case SSL_kECDHe:
    217 +		return SSL_TXT_ECDH "_" SSL_TXT_ECDSA;
    218 +	case SSL_kEECDH:
    219 +		switch (cipher->algorithm_auth)
    220 +			{
    221 +		case SSL_aECDSA:
    222 +			return "ECDHE_" SSL_TXT_ECDSA;
    223 +		case SSL_aRSA:
    224 +			return "ECDHE_" SSL_TXT_RSA;
    225 +		case SSL_aNULL:
    226 +			return SSL_TXT_ECDH "_anon";
    227 +		default:
    228 +			return "UNKNOWN";
    229 +                        }
    230 +        default:
    231 +		return "UNKNOWN";
    232 +		}
    233 +	}
    234 +
    235  SSL_COMP *ssl3_comp_find(STACK_OF(SSL_COMP) *sk, int n)
    236  	{
    237  	SSL_COMP *ctmp;
    238 --- openssl-1.0.0b.orig/ssl/ssl_err.c	2010-11-30 00:03:46.000000000 +0000
    239 +++ openssl-1.0.0b/ssl/ssl_err.c	2010-11-30 00:03:47.000000000 +0000
    240 @@ -465,6 +465,7 @@ static ERR_STRING_DATA SSL_str_reasons[]
    241  {ERR_REASON(SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING),"scsv received when renegotiating"},
    242  {ERR_REASON(SSL_R_SERVERHELLO_TLSEXT)    ,"serverhello tlsext"},
    243  {ERR_REASON(SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED),"session id context uninitialized"},
    244 +{ERR_REASON(SSL_R_SESSION_MAY_NOT_BE_CREATED),"session may not be created"},
    245  {ERR_REASON(SSL_R_SHORT_READ)            ,"short read"},
    246  {ERR_REASON(SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE),"signature for non signing certificate"},
    247  {ERR_REASON(SSL_R_SSL23_DOING_SESSION_ID_REUSE),"ssl23 doing session id reuse"},
    248 --- openssl-1.0.0b.orig/ssl/ssl_lib.c	2010-11-30 00:03:46.000000000 +0000
    249 +++ openssl-1.0.0b/ssl/ssl_lib.c	2010-11-30 00:03:47.000000000 +0000
    250 @@ -326,6 +326,7 @@ SSL *SSL_new(SSL_CTX *ctx)
    251  	OPENSSL_assert(s->sid_ctx_length <= sizeof s->sid_ctx);
    252  	memcpy(&s->sid_ctx,&ctx->sid_ctx,sizeof(s->sid_ctx));
    253  	s->verify_callback=ctx->default_verify_callback;
    254 +	s->session_creation_enabled=1;
    255  	s->generate_session_id=ctx->generate_session_id;
    256  
    257  	s->param = X509_VERIFY_PARAM_new();
    258 @@ -1311,6 +1312,32 @@ int SSL_set_cipher_list(SSL *s,const cha
    259  	return 1;
    260  	}
    261  
    262 +/** specify the ciphers to be used by the SSL */
    263 +int SSL_set_cipher_lists(SSL *s,STACK_OF(SSL_CIPHER) *sk)
    264 +	{
    265 +	STACK_OF(SSL_CIPHER) *tmp_cipher_list;
    266 +
    267 +	if (sk == NULL)
    268 +		return 0;
    269 +
    270 +        /* Based on end of ssl_create_cipher_list */
    271 +	tmp_cipher_list = sk_SSL_CIPHER_dup(sk);
    272 +	if (tmp_cipher_list == NULL)
    273 +		{
    274 +		return 0;
    275 +		}
    276 +	if (s->cipher_list != NULL)
    277 +		sk_SSL_CIPHER_free(s->cipher_list);
    278 +	s->cipher_list = sk;
    279 +	if (s->cipher_list_by_id != NULL)
    280 +		sk_SSL_CIPHER_free(s->cipher_list_by_id);
    281 +	s->cipher_list_by_id = tmp_cipher_list;
    282 +	(void)sk_SSL_CIPHER_set_cmp_func(s->cipher_list_by_id,ssl_cipher_ptr_id_cmp);
    283 +
    284 +	sk_SSL_CIPHER_sort(s->cipher_list_by_id);
    285 +	return 1;
    286 +	}
    287 +
    288  /* works well for SSLv2, not so good for SSLv3 */
    289  char *SSL_get_shared_ciphers(const SSL *s,char *buf,int len)
    290  	{
    291 @@ -2551,22 +2578,45 @@ SSL_METHOD *ssl_bad_method(int ver)
    292  	return(NULL);
    293  	}
    294  
    295 -const char *SSL_get_version(const SSL *s)
    296 +static const char *ssl_get_version(int version)
    297  	{
    298 -	if (s->version == TLS1_2_VERSION)
    299 +	if (version == TLS1_2_VERSION)
    300  		return("TLSv1.2");
    301 -	else if (s->version == TLS1_1_VERSION)
    302 +	else if (version == TLS1_1_VERSION)
    303  		return("TLSv1.1");
    304 -	if (s->version == TLS1_VERSION)
    305 +	if (version == TLS1_VERSION)
    306  		return("TLSv1");
    307 -	else if (s->version == SSL3_VERSION)
    308 +	else if (version == SSL3_VERSION)
    309  		return("SSLv3");
    310 -	else if (s->version == SSL2_VERSION)
    311 +	else if (version == SSL2_VERSION)
    312  		return("SSLv2");
    313  	else
    314  		return("unknown");
    315  	}
    316  
    317 +const char *SSL_get_version(const SSL *s)
    318 +	{
    319 +		return ssl_get_version(s->version);
    320 +	}
    321 +
    322 +const char *SSL_SESSION_get_version(const SSL_SESSION *s)
    323 +	{
    324 +		return ssl_get_version(s->ssl_version);
    325 +	}
    326 +
    327 +const char* SSL_authentication_method(const SSL* ssl)
    328 +	{
    329 +	if (ssl->cert != NULL && ssl->cert->rsa_tmp != NULL)
    330 +		return SSL_TXT_RSA "_" SSL_TXT_EXPORT;
    331 +	switch (ssl->version)
    332 +		{
    333 +	case SSL2_VERSION:
    334 +		return SSL_TXT_RSA;
    335 +	default:
    336 +		return SSL_CIPHER_authentication_method(ssl->s3->tmp.new_cipher);
    337 +		}
    338 +	}
    339 +
    340  SSL *SSL_dup(SSL *s)
    341  	{
    342  	STACK_OF(X509_NAME) *sk;
    343 --- openssl-1.0.0b.orig/ssl/ssl_locl.h	2010-11-30 00:03:46.000000000 +0000
    344 +++ openssl-1.0.0b/ssl/ssl_locl.h	2010-11-30 00:03:47.000000000 +0000
    345 @@ -456,6 +456,7 @@
    346  typedef struct cert_pkey_st
    347  	{
    348  	X509 *x509;
    349 +	STACK_OF(X509) *cert_chain;
    350  	EVP_PKEY *privatekey;
    351  	} CERT_PKEY;
    352  
    353 --- openssl-1.0.0b.orig/ssl/ssl_rsa.c	2009-09-12 23:09:26.000000000 +0000
    354 +++ openssl-1.0.0b/ssl/ssl_rsa.c	2010-11-30 00:03:47.000000000 +0000
    355 @@ -697,6 +697,42 @@ int SSL_CTX_use_PrivateKey_ASN1(int type
    356  	}
    357  
    358  
    359 +int SSL_use_certificate_chain(SSL *ssl, STACK_OF(X509) *cert_chain)
    360 +	{
    361 +	if (ssl == NULL)
    362 +		{
    363 +		SSLerr(SSL_F_SSL_USE_CERTIFICATE_CHAIN,ERR_R_PASSED_NULL_PARAMETER);
    364 +		return(0);
    365 +		}
    366 +	if (ssl->cert == NULL)
    367 +		{
    368 +		SSLerr(SSL_F_SSL_USE_CERTIFICATE_CHAIN,SSL_R_NO_CERTIFICATE_ASSIGNED);
    369 +		return(0);
    370 +		}
    371 +	if (ssl->cert->key == NULL)
    372 +		{
    373 +		SSLerr(SSL_F_SSL_USE_CERTIFICATE_CHAIN,SSL_R_NO_CERTIFICATE_ASSIGNED);
    374 +		return(0);
    375 +		}
    376 +	ssl->cert->key->cert_chain = cert_chain;
    377 +	return(1);
    378 +	}
    379 +
    380 +STACK_OF(X509) *SSL_get_certificate_chain(SSL *ssl, X509 *x)
    381 +	{
    382 +	int i;
    383 +	if (x == NULL)
    384 +		return NULL;
    385 +	if (ssl == NULL)
    386 +		return NULL;
    387 +	if (ssl->cert == NULL)
    388 +		return NULL;
    389 +	for (i = 0; i < SSL_PKEY_NUM; i++)
    390 +		if (ssl->cert->pkeys[i].x509 == x)
    391 +			return ssl->cert->pkeys[i].cert_chain;
    392 +	return NULL;
    393 +	}
    394 +
    395  #ifndef OPENSSL_NO_STDIO
    396  /* Read a file that contains our certificate in "PEM" format,
    397   * possibly followed by a sequence of CA certificates that should be
    398 --- openssl-1.0.0b.orig/ssl/ssl_sess.c	2010-02-01 16:49:42.000000000 +0000
    399 +++ openssl-1.0.0b/ssl/ssl_sess.c	2010-11-30 00:03:47.000000000 +0000
    400 @@ -261,6 +261,11 @@ static int def_generate_session_id(const
    401  	return 0;
    402  }
    403  
    404 +void SSL_set_session_creation_enabled (SSL *s, int creation_enabled)
    405 +	{
    406 +	s->session_creation_enabled = creation_enabled;
    407 +	}
    408 +
    409  int ssl_get_new_session(SSL *s, int session)
    410  	{
    411  	/* This gets used by clients and servers. */
    412 @@ -269,6 +274,8 @@ int ssl_get_new_session(SSL *s, int sess
    413  	SSL_SESSION *ss=NULL;
    414  	GEN_SESSION_CB cb = def_generate_session_id;
    415  
    416 +	/* caller should check this if they can do better error handling */
    417 +        if (!s->session_creation_enabled) return(0);
    418  	if ((ss=SSL_SESSION_new()) == NULL) return(0);
    419  
    420  	/* If the context has a default timeout, use it */
    421