summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2018-05-18 12:31:31 +0200
committerMatt Caswell <matt@openssl.org>2018-05-21 11:36:03 +0200
commitee94ec2ef88e0ec25dedf2829d8e48dff0aa1c50 (patch)
tree9cd04bdad174f00d3a4c3456ea316ae094903950 /test
parentFix undefined behaviour in X509_NAME_cmp() (diff)
downloadopenssl-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.c21
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;