summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDr. Stephen Henson <steve@openssl.org>2009-10-30 14:06:18 +0000
committerDr. Stephen Henson <steve@openssl.org>2009-10-30 14:06:18 +0000
commit036b3f331bc530d8749916dd673bc07d687f0d00 (patch)
tree63b22b7384fc9abaff6467d7abf65d70238fdf85
parent9ac5c355a24e47ab30421f88c034bec9b0188a56 (diff)
Generate stateless session ID just after the ticket is received instead
of when a session is loaded. This will mean that applications that just hold onto SSL_SESSION structures and never call d2i_SSL_SESSION() will still work.
-rw-r--r--ssl/s3_clnt.c23
-rw-r--r--ssl/ssl_asn1.c26
2 files changed, 22 insertions, 27 deletions
diff --git a/ssl/s3_clnt.c b/ssl/s3_clnt.c
index 9322f629ce..35583ef30e 100644
--- a/ssl/s3_clnt.c
+++ b/ssl/s3_clnt.c
@@ -1844,7 +1844,28 @@ int ssl3_get_new_session_ticket(SSL *s)
}
memcpy(s->session->tlsext_tick, p, ticklen);
s->session->tlsext_ticklen = ticklen;
-
+ /* There are two ways to detect a resumed ticket sesion.
+ * One is to set an appropriate session ID and then the server
+ * must return a match in ServerHello. This allows the normal
+ * client session ID matching to work and we know much
+ * earlier that the ticket has been accepted.
+ *
+ * The other way is to set zero length session ID when the
+ * ticket is presented and rely on the handshake to determine
+ * session resumption.
+ *
+ * We choose the former approach because this fits in with
+ * assumptions elsewhere in OpenSSL. The session ID is set
+ * to the SHA256 (or SHA1 is SHA256 is disabled) hash of the
+ * ticket.
+ */
+ EVP_Digest(p, ticklen,
+ s->session->session_id, &s->session->session_id_length,
+#ifndef OPENSSL_NO_SHA256
+ EVP_sha256(), NULL);
+#else
+ EVP_sha1(), NULL);
+#endif
ret=1;
return(ret);
f_err:
diff --git a/ssl/ssl_asn1.c b/ssl/ssl_asn1.c
index 9cee3a4086..e484a2992d 100644
--- a/ssl/ssl_asn1.c
+++ b/ssl/ssl_asn1.c
@@ -244,12 +244,6 @@ int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp)
a.tlsext_tick.length= in->tlsext_ticklen;
a.tlsext_tick.type=V_ASN1_OCTET_STRING;
a.tlsext_tick.data=(unsigned char *)in->tlsext_tick;
- /* If we have a ticket set session ID to empty because
- * it will be bogus. If liftime hint is -1 treat as a special
- * case because the session is being used as a container
- */
- if (in->tlsext_ticklen && (in->tlsext_tick_lifetime_hint != -1))
- a.session_id.length=0;
}
if (in->tlsext_tick_lifetime_hint > 0)
{
@@ -579,26 +573,6 @@ SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp,
ret->tlsext_ticklen = os.length;
os.data = NULL;
os.length = 0;
- /* There are two ways to detect a resumed ticket sesion.
- * One is to set a random session ID and then the server
- * must return a match in ServerHello. This allows the normal
- * client session ID matching to work and we know much
- * earlier that the ticket has been accepted.
- *
- * The other way is to set zero length session ID when the
- * ticket is presented and rely on the handshake to determine
- * session resumption.
- */
- if (ret->session_id_length == 0)
- {
- EVP_Digest(ret->tlsext_tick, ret->tlsext_ticklen,
- ret->session_id, &ret->session_id_length,
-#ifndef OPENSSL_NO_SHA256
- EVP_sha256(), NULL);
-#else
- EVP_sha1(), NULL);
-#endif
- }
}
else
ret->tlsext_tick=NULL;