Adding TLS 1.3 variant to SSL*.

Change-Id: I3de3c48a1de59c2b8de348253ce62a648aa6d6eb
Reviewed-on: https://boringssl-review.googlesource.com/17724
Reviewed-by: David Benjamin <davidben@google.com>
Commit-Queue: David Benjamin <davidben@google.com>
CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/include/openssl/ssl.h b/include/openssl/ssl.h
index ca1e9e8..256485c 100644
--- a/include/openssl/ssl.h
+++ b/include/openssl/ssl.h
@@ -3148,6 +3148,12 @@
 OPENSSL_EXPORT void SSL_CTX_set_tls13_variant(SSL_CTX *ctx,
                                               enum tls13_variant_t variant);
 
+/* SSL_set_tls13_variant sets which variant of TLS 1.3 we negotiate. On the
+ * server, if |variant| is not |tls13_default|, all variants are enabled. On the
+ * client, only the configured variant is enabled. */
+OPENSSL_EXPORT void SSL_set_tls13_variant(SSL *ssl,
+                                          enum tls13_variant_t variant);
+
 /* SSL_MAX_CERT_LIST_DEFAULT is the default maximum length, in bytes, of a peer
  * certificate chain. */
 #define SSL_MAX_CERT_LIST_DEFAULT (1024 * 100)
diff --git a/ssl/handshake_client.c b/ssl/handshake_client.c
index 0738e42..78bd1de 100644
--- a/ssl/handshake_client.c
+++ b/ssl/handshake_client.c
@@ -673,7 +673,7 @@
     /* In TLS 1.3 experimental encodings, send a fake placeholder session ID
      * when we do not otherwise have one to send. */
     if (hs->max_version >= TLS1_3_VERSION &&
-        ssl->ctx->tls13_variant != tls13_default &&
+        ssl->tls13_variant != tls13_default &&
         !CBB_add_bytes(&child, hs->session_id, hs->session_id_len)) {
       goto err;
     }
@@ -762,7 +762,7 @@
   }
 
   /* Initialize a random session ID for the experimental TLS 1.3 variant. */
-  if (ssl->ctx->tls13_variant != tls13_default) {
+  if (ssl->tls13_variant != tls13_default) {
     hs->session_id_len = sizeof(hs->session_id);
     if (!RAND_bytes(hs->session_id, hs->session_id_len)) {
       return -1;
diff --git a/ssl/internal.h b/ssl/internal.h
index 45f918e..3c9815e 100644
--- a/ssl/internal.h
+++ b/ssl/internal.h
@@ -1902,6 +1902,10 @@
    * further constrainted by |SSL_OP_NO_*|. */
   uint16_t conf_min_version;
 
+  /* tls13_variant is the variant of TLS 1.3 we are using for this
+   * configuration. */
+  enum tls13_variant_t tls13_variant;
+
   uint16_t max_send_fragment;
 
   /* There are 2 BIO's even though they are normally both the same. This is so
diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c
index d8d3f4d..d88427a 100644
--- a/ssl/ssl_lib.c
+++ b/ssl/ssl_lib.c
@@ -373,6 +373,7 @@
 
   ssl->conf_min_version = ctx->conf_min_version;
   ssl->conf_max_version = ctx->conf_max_version;
+  ssl->tls13_variant = ctx->tls13_variant;
 
   /* RFC 6347 states that implementations SHOULD use an initial timer value of
    * 1 second. */
@@ -849,6 +850,10 @@
   ctx->tls13_variant = variant;
 }
 
+void SSL_set_tls13_variant(SSL *ssl, enum tls13_variant_t variant) {
+  ssl->tls13_variant = variant;
+}
+
 void SSL_set_early_data_enabled(SSL *ssl, int enabled) {
   ssl->cert->enable_early_data = !!enabled;
 }
diff --git a/ssl/ssl_versions.c b/ssl/ssl_versions.c
index 3945f7f..387eee7 100644
--- a/ssl/ssl_versions.c
+++ b/ssl/ssl_versions.c
@@ -300,14 +300,14 @@
    * support all TLS 1.3 variants as long as tls13_variant is set to a
    * non-default value. */
   if (ssl->server) {
-    if (ssl->ctx->tls13_variant == tls13_default &&
+    if (ssl->tls13_variant == tls13_default &&
         version == TLS1_3_EXPERIMENT_VERSION) {
       return 0;
     }
   } else {
-    if ((ssl->ctx->tls13_variant != tls13_experiment &&
+    if ((ssl->tls13_variant != tls13_experiment &&
          version == TLS1_3_EXPERIMENT_VERSION) ||
-        (ssl->ctx->tls13_variant != tls13_default &&
+        (ssl->tls13_variant != tls13_default &&
          version == TLS1_3_DRAFT_VERSION)) {
       return 0;
     }