• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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