Move the DTLS cookie to SSL_HANDSHAKE. The cookie is only needed in SSL_HANDSHAKE, so there's no need to retain it for the lifetime of the connection. (SSL_HANDSHAKE is released after the handshake completes.) Back when DTLS1_COOKIE_LENGTH was 32, storing it inline made some sense. Now that RFC 6347 increased the maximum to 255 bytes, just indirect it with an Array<uint8_t>. Along the way, remove the DTLS1_COOKIE_LENGTH checks. The new limit is the largest that fits in the length prefix, so it's always redundant. In fact, the constant was one higher was allowed anyway. Add some tests for the maximum length, as well as zero-length cookies. I considered just repurposing the plain cookie field, used in HelloRetryRequest (as opposed to HelloVerifyRequest), as they're mutually exclusive, even in DTLS 1.3. But, when we get to DTLS 1.3, that'll get a little hairy because ssl_write_client_hello will need extra checks to know whether hs->cookie is meant to go in the ClientHello directly or in extensions. Change-Id: I1afedc7ce31414879545701bf8fe4658657ba66f Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/54466 Reviewed-by: Bob Beck <bbe@google.com> Auto-Submit: David Benjamin <davidben@google.com> Commit-Queue: David Benjamin <davidben@google.com>
diff --git a/ssl/internal.h b/ssl/internal.h index 153c9ca..d8df2ab 100644 --- a/ssl/internal.h +++ b/ssl/internal.h
@@ -1837,9 +1837,15 @@ // ClientHelloInner. uint8_t inner_client_random[SSL3_RANDOM_SIZE] = {0}; - // cookie is the value of the cookie received from the server, if any. + // cookie is the value of the cookie in HelloRetryRequest, or empty if none + // was received. Array<uint8_t> cookie; + // dtls_cookie is the value of the cookie in DTLS HelloVerifyRequest. If + // empty, either none was received or HelloVerifyRequest contained an empty + // cookie. + Array<uint8_t> dtls_cookie; + // ech_client_outer contains the outer ECH extension to send in the // ClientHello, excluding the header and type byte. Array<uint8_t> ech_client_outer; @@ -2854,8 +2860,6 @@ }; // lengths of messages -#define DTLS1_COOKIE_LENGTH 256 - #define DTLS1_RT_HEADER_LENGTH 13 #define DTLS1_HM_HEADER_LENGTH 12 @@ -2921,9 +2925,6 @@ // peer sent the final flight. bool flight_has_reply : 1; - uint8_t cookie[DTLS1_COOKIE_LENGTH] = {0}; - size_t cookie_len = 0; - // The current data and handshake epoch. This is initially undefined, and // starts at zero once the initial handshake is completed. uint16_t r_epoch = 0;