diff options
Diffstat (limited to 'src/tool/client.cc')
-rw-r--r-- | src/tool/client.cc | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/tool/client.cc b/src/tool/client.cc index 57e1b6e6..fa279ae5 100644 --- a/src/tool/client.cc +++ b/src/tool/client.cc @@ -122,7 +122,8 @@ static const struct argument kArguments[] = { }, { "-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 @@ static bool DoConnection(SSL_CTX *ctx, } 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); |