quic draft-24

This commit is contained in:
Tatsuhiro Tsujikawa 2019-11-06 22:49:22 +09:00
parent f8528c5080
commit 2d80acfdbb
5 changed files with 44 additions and 8 deletions

View File

@ -24,12 +24,12 @@ ngtcp2, nghttp3 and my patched OpenSSL.
https://github.com/ngtcp2/ngtcp2/tree/draft-22#build-from-git https://github.com/ngtcp2/ngtcp2/tree/draft-22#build-from-git
describes how to build these three software. describes how to build these three software.
To run h2load against HTTP/3 server, specify h3-23 ALPN with To run h2load against HTTP/3 server, specify h3-24 ALPN with
``--npn-list`` option like so: ``--npn-list`` option like so:
.. code-block:: text .. code-block:: text
$ h2load --npn-list h3-23 https://127.0.0.1:4433 $ h2load --npn-list h3-24 https://127.0.0.1:4433
You can use Dockerfile to skip the tedious build steps to manually You can use Dockerfile to skip the tedious build steps to manually
pull and build dependencies. In order to build Docker image, do this: pull and build dependencies. In order to build Docker image, do this:
@ -43,7 +43,7 @@ Run h2load:
.. code-block:: text .. code-block:: text
$ docker run --rm -it --network=host nghttp2-quic /usr/local/bin/h2load --npn-list h3-23 https://127.0.0.1:4433 $ docker run --rm -it --network=host nghttp2-quic /usr/local/bin/h2load --npn-list h3-24 https://127.0.0.1:4433
Development Status Development Status
------------------ ------------------

View File

@ -5,13 +5,13 @@ RUN /usr/local/bin/clean-install git g++ make binutils autoconf automake autotoo
zlib1g libev4 libjemalloc1 libc-ares2 \ zlib1g libev4 libjemalloc1 libc-ares2 \
ca-certificates psmisc \ ca-certificates psmisc \
python && \ python && \
git clone --depth 1 -b openssl-quic-draft-23 https://github.com/tatsuhiro-t/openssl && \ git clone --depth 1 -b openssl-quic-draft-24 https://github.com/tatsuhiro-t/openssl && \
cd openssl && ./config enable-tls1_3 --openssldir=/etc/ssl && make -j$(nproc) && make install_sw && cd .. && rm -rf openssl && \ cd openssl && ./config enable-tls1_3 --openssldir=/etc/ssl && make -j$(nproc) && make install_sw && cd .. && rm -rf openssl && \
git clone --depth 1 https://github.com/ngtcp2/nghttp3 && \ git clone --depth 1 https://github.com/ngtcp2/nghttp3 && \
cd nghttp3 && autoreconf -i && \ cd nghttp3 && autoreconf -i && \
./configure --enable-lib-only && \ ./configure --enable-lib-only && \
make -j$(nproc) && make install-strip && cd .. && rm -rf nghttp3 && \ make -j$(nproc) && make install-strip && cd .. && rm -rf nghttp3 && \
git clone --depth 1 -b master https://github.com/ngtcp2/ngtcp2 && \ git clone --depth 1 https://github.com/ngtcp2/ngtcp2 && \
cd ngtcp2 && autoreconf -i && \ cd ngtcp2 && autoreconf -i && \
./configure && \ ./configure && \
make -j$(nproc) && make install-strip && cd .. && rm -rf ngtcp2 && \ make -j$(nproc) && make install-strip && cd .. && rm -rf ngtcp2 && \

View File

@ -332,6 +332,8 @@ struct Client {
std::array<Crypto, 2> crypto; std::array<Crypto, 2> crypto;
size_t max_pktlen; size_t max_pktlen;
bool close_requested; bool close_requested;
std::vector<uint8_t> rx_secret;
std::vector<uint8_t> tx_secret;
} quic; } quic;
ev_timer request_timeout_watcher; ev_timer request_timeout_watcher;
addrinfo *next_addr; addrinfo *next_addr;
@ -465,6 +467,7 @@ struct Client {
int quic_stream_close(int64_t stream_id, uint64_t app_error_code); int quic_stream_close(int64_t stream_id, uint64_t app_error_code);
int quic_stream_reset(int64_t stream_id, uint64_t app_error_code); int quic_stream_reset(int64_t stream_id, uint64_t app_error_code);
int quic_extend_max_local_streams(); int quic_extend_max_local_streams();
int quic_update_key();
int quic_on_key(ngtcp2_crypto_level level, const uint8_t *rx_secret, int quic_on_key(ngtcp2_crypto_level level, const uint8_t *rx_secret,
const uint8_t *tx_secret, size_t secretlen); const uint8_t *tx_secret, size_t secretlen);

View File

@ -113,7 +113,7 @@ int stream_close(nghttp3_conn *conn, int64_t stream_id, uint64_t app_error_code,
} // namespace } // namespace
int Http3Session::stream_close(int64_t stream_id, uint64_t app_error_code) { int Http3Session::stream_close(int64_t stream_id, uint64_t app_error_code) {
client_->on_stream_close(stream_id, app_error_code == NGHTTP3_HTTP_NO_ERROR); client_->on_stream_close(stream_id, app_error_code == NGHTTP3_H3_NO_ERROR);
return 0; return 0;
} }

View File

@ -159,7 +159,7 @@ int stream_close(ngtcp2_conn *conn, int64_t stream_id, uint64_t app_error_code,
int Client::quic_stream_close(int64_t stream_id, uint64_t app_error_code) { int Client::quic_stream_close(int64_t stream_id, uint64_t app_error_code) {
auto s = static_cast<Http3Session *>(session.get()); auto s = static_cast<Http3Session *>(session.get());
if (s->close_stream(stream_id, app_error_code == 0 ? NGHTTP3_HTTP_NO_ERROR if (s->close_stream(stream_id, app_error_code == 0 ? NGHTTP3_H3_NO_ERROR
: app_error_code) != 0) { : app_error_code) != 0) {
return -1; return -1;
} }
@ -222,6 +222,36 @@ int get_new_connection_id(ngtcp2_conn *conn, ngtcp2_cid *cid, uint8_t *token,
} }
} // namespace } // namespace
namespace {
int update_key(ngtcp2_conn *conn, void *user_data) {
auto c = static_cast<Client *>(user_data);
if (c->quic_update_key() != 0) {
return NGTCP2_ERR_CALLBACK_FAILURE;
}
return 0;
}
} // namespace
int Client::quic_update_key() {
std::array<uint8_t, 64> rx_secret, tx_secret;
if (ngtcp2_crypto_update_and_install_key(
quic.conn, rx_secret.data(), tx_secret.data(), nullptr, nullptr,
nullptr, nullptr, quic.rx_secret.data(), quic.tx_secret.data(),
quic.rx_secret.size()) != 0) {
return -1;
}
quic.rx_secret.assign(std::begin(rx_secret),
std::begin(rx_secret) + quic.rx_secret.size());
quic.tx_secret.assign(std::begin(tx_secret),
std::begin(tx_secret) + quic.tx_secret.size());
return 0;
}
namespace { namespace {
void debug_log_printf(void *user_data, const char *fmt, ...) { void debug_log_printf(void *user_data, const char *fmt, ...) {
va_list ap; va_list ap;
@ -362,7 +392,7 @@ int Client::quic_init(const sockaddr *local_addr, socklen_t local_addrlen,
nullptr, // rand nullptr, // rand
get_new_connection_id, get_new_connection_id,
nullptr, // remove_connection_id nullptr, // remove_connection_id
nullptr, // update_key update_key,
nullptr, // path_validation nullptr, // path_validation
select_preferred_addr, select_preferred_addr,
h2load::stream_reset, h2load::stream_reset,
@ -497,6 +527,9 @@ int Client::quic_on_key(ngtcp2_crypto_level level, const uint8_t *rx_secret,
return -1; return -1;
} }
session = std::move(s); session = std::move(s);
quic.rx_secret.assign(rx_secret, rx_secret + secretlen);
quic.tx_secret.assign(tx_secret, tx_secret + secretlen);
} }
return 0; return 0;