Simplify states with hs_wait_t returns.

Change-Id: Ie0014bf73625144503b649e84b43ca4b03a4df1f
Reviewed-on: https://boringssl-review.googlesource.com/19704
Reviewed-by: Steven Valdez <svaldez@google.com>
Commit-Queue: Steven Valdez <svaldez@google.com>
CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/ssl/handshake_client.cc b/ssl/handshake_client.cc
index b1c48d8..37bf372 100644
--- a/ssl/handshake_client.cc
+++ b/ssl/handshake_client.cc
@@ -175,7 +175,6 @@
 
 enum ssl_client_hs_state_t {
   state_start_connect = 0,
-  state_send_client_hello,
   state_enter_early_data,
   state_read_hello_verify_request,
   state_read_server_hello,
@@ -430,20 +429,9 @@
 }
 
 static enum ssl_hs_wait_t do_start_connect(SSL_HANDSHAKE *hs) {
-  ssl_do_info_callback(hs->ssl, SSL_CB_HANDSHAKE_START, 1);
-  hs->state = state_send_client_hello;
-  return ssl_hs_ok;
-}
-
-static enum ssl_hs_wait_t do_send_client_hello(SSL_HANDSHAKE *hs) {
   SSL *const ssl = hs->ssl;
 
-  /* The handshake buffer is reset on every ClientHello. Notably, in DTLS, we
-   * may send multiple ClientHellos if we receive HelloVerifyRequest. */
-  if (!hs->transcript.Init()) {
-    OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
-    return ssl_hs_error;
-  }
+  ssl_do_info_callback(ssl, SSL_CB_HANDSHAKE_START, 1);
 
   /* Freeze the version range. */
   if (!ssl_get_version_range(ssl, &hs->min_version, &hs->max_version)) {
@@ -474,10 +462,7 @@
     }
   }
 
-  /* If resending the ClientHello in DTLS after a HelloVerifyRequest, don't
-   * renegerate the client_random. The random must be reused. */
-  if ((!SSL_is_dtls(ssl) || !ssl->d1->send_cookie) &&
-      !RAND_bytes(ssl->s3->client_random, sizeof(ssl->s3->client_random))) {
+  if (!RAND_bytes(ssl->s3->client_random, sizeof(ssl->s3->client_random))) {
     return ssl_hs_error;
   }
 
@@ -501,7 +486,7 @@
 static enum ssl_hs_wait_t do_enter_early_data(SSL_HANDSHAKE *hs) {
   SSL *const ssl = hs->ssl;
 
-  if (SSL_is_dtls(ssl) && !ssl->d1->send_cookie) {
+  if (SSL_is_dtls(ssl)) {
     hs->state = state_read_hello_verify_request;
     return ssl_hs_ok;
   }
@@ -542,7 +527,6 @@
   }
 
   if (msg.type != DTLS1_MT_HELLO_VERIFY_REQUEST) {
-    ssl->d1->send_cookie = false;
     hs->state = state_read_server_hello;
     return ssl_hs_ok;
   }
@@ -561,10 +545,19 @@
   OPENSSL_memcpy(ssl->d1->cookie, CBS_data(&cookie), CBS_len(&cookie));
   ssl->d1->cookie_len = CBS_len(&cookie);
 
-  ssl->d1->send_cookie = true;
   ssl->method->next_message(ssl);
-  hs->state = state_send_client_hello;
-  return ssl_hs_ok;
+
+  /* DTLS resets the handshake buffer after HelloVerifyRequest. */
+  if (!hs->transcript.Init()) {
+    return ssl_hs_error;
+  }
+
+  if (!ssl_write_client_hello(hs)) {
+    return ssl_hs_error;
+  }
+
+  hs->state = state_read_server_hello;
+  return ssl_hs_flush;
 }
 
 static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) {
@@ -1733,9 +1726,6 @@
       case state_start_connect:
         ret = do_start_connect(hs);
         break;
-      case state_send_client_hello:
-        ret = do_send_client_hello(hs);
-        break;
       case state_enter_early_data:
         ret = do_enter_early_data(hs);
         break;
@@ -1823,8 +1813,6 @@
   switch (state) {
     case state_start_connect:
       return "TLS client start_connect";
-    case state_send_client_hello:
-      return "TLS client send_client_hello";
     case state_enter_early_data:
       return "TLS client enter_early_data";
     case state_read_hello_verify_request: