Add early data input from file.

Change-Id: I93a54e7a67acddb196ed53ce7fe49c718553948d
Reviewed-on: https://boringssl-review.googlesource.com/23604
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/tool/client.cc b/tool/client.cc
index 57e1b6e..fa279ae 100644
--- a/tool/client.cc
+++ b/tool/client.cc
@@ -122,7 +122,8 @@
     },
     {
         "-early-data", kOptionalArgument, "Enable early data. The argument to "
-        "this flag is the early data to send.",
+        "this flag is the early data to send or if it starts with '@', the "
+        "file to read from for early data.",
     },
     {
         "-tls13-variant", kOptionalArgument,
@@ -299,8 +300,19 @@
   }
 
   if (args_map.count("-early-data") != 0 && SSL_in_early_data(ssl.get())) {
-    int ed_size = args_map["-early-data"].size();
-    int ssl_ret = SSL_write(ssl.get(), args_map["-early-data"].data(), ed_size);
+    std::string early_data = args_map["-early-data"];
+    if (early_data.size() > 0 && early_data[0] == '@') {
+      const char *filename = early_data.c_str() + 1;
+      std::vector<uint8_t> data;
+      ScopedFILE f(fopen(filename, "rb"));
+      if (f == nullptr || !ReadAll(&data, f.get())) {
+        fprintf(stderr, "Error reading %s.\n", filename);
+        return false;
+      }
+      early_data = std::string(data.begin(), data.end());
+    }
+    int ed_size = early_data.size();
+    int ssl_ret = SSL_write(ssl.get(), early_data.data(), ed_size);
     if (ssl_ret <= 0) {
       int ssl_err = SSL_get_error(ssl.get(), ssl_ret);
       fprintf(stderr, "Error while writing: %d\n", ssl_err);