tls: configure early data context

This is required to fix accepting early data, that was broken by the
last BoringSSL update (but only for some implementations for some
reasons, so this wasn't caught at the time). BoringSSL also needs to be
updated as well, because the logic from the previous update was wrong.

The "early data context" is used by BoringSSL to decide whether early
data should be accepted or not. In theory this should include the
transport parameters and HTTP/3 SETTINGS in wire format, so that early
data can be accepted on a connection only if they match the ones from
the original connection.

However this is slightly annoying as it would require re-encoding
transport parameters _excluding_ the ones that shouldn't be remembered
when using 0-RTT, as well as exposing some kind of API to allow the
HTTP/3 layer to pass the SETTINGS blob, and in practice these parameters
don't really change that often, so leave that as a TODO item.
diff --git a/deps/boringssl b/deps/boringssl
index 78b3337..88024df 160000
--- a/deps/boringssl
+++ b/deps/boringssl
@@ -1 +1 @@
-Subproject commit 78b3337a10a7f7b3495b6cb8140a74e265290898
+Subproject commit 88024df12147e56b6abd66b743ff441a0aaa09a8
diff --git a/src/tls.rs b/src/tls.rs
index 78b8b7e..85bb1d7 100644
--- a/src/tls.rs
+++ b/src/tls.rs
@@ -35,7 +35,6 @@
 use libc::c_long;
 use libc::c_uint;
 use libc::c_void;
-use libc::size_t;
 
 use crate::Error;
 use crate::Result;
@@ -322,6 +321,10 @@
 
         self.set_quic_method()?;
 
+        // TODO: the early data context should include transport parameters and
+        // HTTP/3 SETTINGS in wire format.
+        self.set_quic_early_data_context(b"quiche")?;
+
         self.set_quiet_shutdown(true);
 
         Ok(())
@@ -350,6 +353,16 @@
         })
     }
 
+    pub fn set_quic_early_data_context(&self, context: &[u8]) -> Result<()> {
+        map_result(unsafe {
+            SSL_set_quic_early_data_context(
+                self.as_ptr(),
+                context.as_ptr(),
+                context.len(),
+            )
+        })
+    }
+
     pub fn set_min_proto_version(&self, version: u16) {
         unsafe { SSL_set_min_proto_version(self.as_ptr(), version) }
     }
@@ -973,6 +986,10 @@
         ssl: *mut SSL, quic_method: *const SSL_QUIC_METHOD,
     ) -> c_int;
 
+    fn SSL_set_quic_early_data_context(
+        ssl: *mut SSL, context: *const u8, context_len: usize,
+    ) -> c_int;
+
     fn SSL_get_peer_quic_transport_params(
         ssl: *mut SSL, out_params: *mut *const u8, out_params_len: *mut usize,
     );
@@ -1004,7 +1021,7 @@
 
     // X509_VERIFY_PARAM
     fn X509_VERIFY_PARAM_set1_host(
-        param: *mut X509_VERIFY_PARAM, name: *const c_char, namelen: size_t,
+        param: *mut X509_VERIFY_PARAM, name: *const c_char, namelen: usize,
     ) -> c_int;
 
     // X509_STORE