diff options
author | Matt Caswell <matt@openssl.org> | 2018-05-18 12:31:31 +0200 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2018-05-21 11:36:03 +0200 |
commit | ee94ec2ef88e0ec25dedf2829d8e48dff0aa1c50 (patch) | |
tree | 9cd04bdad174f00d3a4c3456ea316ae094903950 /test | |
parent | Fix undefined behaviour in X509_NAME_cmp() (diff) | |
download | openssl-ee94ec2ef88e0ec25dedf2829d8e48dff0aa1c50.tar.xz openssl-ee94ec2ef88e0ec25dedf2829d8e48dff0aa1c50.zip |
Don't cache stateless tickets in TLSv1.3
In TLSv1.2 and below we always cache new sessions by default on the server
side in the internal cache (even when we're using session tickets). This is
in order to support resumption from a session id.
In TLSv1.3 there is no session id. It is only possible to resume using the
ticket. Therefore, in the default case, there is no point in caching the
session in the internal store.
There is still a reason to call the external cache new session callback
because applications may be using the callbacks just to know about when
sessions are created (and not necessarily implementing a full cache). If
the application also implements the remove session callback then we are
forced to also store it in the internal cache so that we can create
timeout events. Otherwise the external cache could just fill up
indefinitely.
This mostly addresses the issue described in #5628. That issue also proposes
having an option to not create full stateless tickets when using the
internal cache. That aspect hasn't been addressed yet.
Reviewed-by: Rich Salz <rsalz@openssl.org>
Reviewed-by: Ben Kaduk <kaduk@mit.edu>
(Merged from https://github.com/openssl/openssl/pull/6293)
Diffstat (limited to 'test')
-rw-r--r-- | test/sslapitest.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/test/sslapitest.c b/test/sslapitest.c index fe355f2f4c..fe1c1e6ff3 100644 --- a/test/sslapitest.c +++ b/test/sslapitest.c @@ -1072,9 +1072,22 @@ static int execute_test_session(int maxprot, int use_int_cache, || !TEST_ptr(sess2 = SSL_get1_session(serverssl1))) goto end; - /* Should fail because it should already be in the cache */ - if (use_int_cache && !TEST_false(SSL_CTX_add_session(sctx, sess2))) - goto end; + if (use_int_cache) { + if (maxprot == TLS1_3_VERSION && !use_ext_cache) { + /* + * In TLSv1.3 it should not have been added to the internal cache, + * except in the case where we also have an external cache (in that + * case it gets added to the cache in order to generate remove + * events after timeout). + */ + if (!TEST_false(SSL_CTX_remove_session(sctx, sess2))) + goto end; + } else { + /* Should fail because it should already be in the cache */ + if (!TEST_false(SSL_CTX_add_session(sctx, sess2))) + goto end; + } + } if (use_ext_cache) { SSL_SESSION *tmp = sess2; @@ -1088,7 +1101,7 @@ static int execute_test_session(int maxprot, int use_int_cache, * the external cache. We take a copy first because * SSL_CTX_remove_session() also marks the session as non-resumable. */ - if (use_int_cache) { + if (use_int_cache && maxprot != TLS1_3_VERSION) { if (!TEST_ptr(tmp = SSL_SESSION_dup(sess2)) || !TEST_true(SSL_CTX_remove_session(sctx, sess2))) goto end; |