From 04d9345242012dc6763e9770154542152c39a9bf Mon Sep 17 00:00:00 2001 From: Aaron <70529471+aaronbojarski@users.noreply.github.com> Date: Wed, 7 Feb 2024 18:15:20 +0100 Subject: [PATCH] protocol: update scion version and DRKey configuration (#25) This PR updates the scion repository to the newest scionproto version. As a consequence this includes updating a lot of configs and the DRKey derivation scheme. Since AS-AS keys can no longer be fetched directly from the CS an option to configure shared keys in the LF config has been added. The fetching of HOST-AS and HOST-HOST keys will be added at a later point. The DRKey timestamps and especially the SPAO header will be updated in a separate PR. From the per peer preshared secret we derive a short term (3 day validity) AS-AS key. The derivation is done using AES-CBC MAC keyed with the shared secret and the input: **(type | ISD_AS1 | ISD_AS2 | start timestamp)** where - **type** is the 1 byte fixed constant **0**. - **ISD_AS1** is the ISD_AS number (8 byte) in network byte order of the fast side AS. - **ISD_AS2** is the ISD_AS number (8 byte) in network byte order of the slow side AS. - **start timestamp** is the timestamp in ns (8 byte) of the start time of the validity period for the resulting key. This can be synchronized between peers since the initial start time is configured by both and consequent start times can be calculated by **configured time** + **k** * **VALIDITY_PERIOD** for some **k** such that the key is currently valid. It is also possible to configure multiple shared secrets with different start time such that a shared secret can be replaced at some point. --- Dockerfile | 24 +- docs/SCION.md | 30 +- src/CMakeLists.txt | 2 +- src/config.c | 134 ++ src/config.h | 16 + src/drkey.h | 161 +++ src/drkey_fetcher.h | 35 +- src/drkey_fetcher_scion.c | 38 +- src/keyfetcher.c | 489 +++++++ src/keyfetcher.h | 87 ++ src/keymanager.c | 108 +- src/keymanager.h | 84 +- src/lib/json-parser/lf_json_util.h | 137 +- src/lib/scion_drkey/drkey.go | 65 +- src/lib/scion_drkey/go.mod | 40 +- src/lib/scion_drkey/go.sum | 1232 ++--------------- src/mock/drkey_fetcher_mock.c | 83 +- src/test/CMakeLists.txt | 3 +- src/test/keymanager_test.c | 228 ++- src/test/keymanager_test1.json | 17 +- src/test/keymanager_test2.json | 17 +- src/test/keymanager_test3.json | 20 + test/testnet_ip/config/lf1.json | 16 +- test/testnet_ip/config/lf2.json | 16 +- test/testnet_scion/README.md | 15 +- .../testnet_scion/config/lf_1_ff00_0_111.json | 6 + .../testnet_scion/config/lf_1_ff00_0_112.json | 7 + test/testnet_scion/scion/gen-topo.sh | 5 +- .../scion/scion-topo-add-drkey.py | 29 + .../ASff00_0_110/cs1-ff00_0_110-1.toml | 11 +- .../scion/template/ASff00_0_110/sd.toml | 5 +- .../ASff00_0_111/cs1-ff00_0_111-1.toml | 11 +- .../scion/template/ASff00_0_111/sd.toml | 5 +- .../ASff00_0_112/cs1-ff00_0_112-1.toml | 11 +- .../scion/template/ASff00_0_112/sd.toml | 5 +- .../scion/template/supervisord.conf | 18 +- .../scion/template6/supervisord.conf | 12 +- .../scion/template_eh/ASff00_0_111/sd.toml | 5 +- .../scion/template_eh/ASff00_0_112/sd.toml | 5 +- usertools/install_deps.sh | 6 +- 40 files changed, 1764 insertions(+), 1474 deletions(-) create mode 100644 src/drkey.h create mode 100644 src/keyfetcher.c create mode 100644 src/keyfetcher.h create mode 100644 src/test/keymanager_test3.json create mode 100755 test/testnet_scion/scion/scion-topo-add-drkey.py diff --git a/Dockerfile b/Dockerfile index 4241cdf..65ef30a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,9 +15,9 @@ RUN apt-get update && \ && rm -rf /var/lib/apt/lists/* # Install Golang -RUN curl -LO https://go.dev/dl/go1.17.9.linux-amd64.tar.gz && \ - echo "9dacf782028fdfc79120576c872dee488b81257b1c48e9032d122cfdb379cca6 go1.17.9.linux-amd64.tar.gz" | sha256sum -c && \ - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.17.9.linux-amd64.tar.gz +RUN curl -LO https://golang.org/dl/go1.21.2.linux-amd64.tar.gz && \ + echo "f5414a770e5e11c6e9674d4cd4dd1f4f630e176d1828d3427ea8ca4211eee90d go1.21.2.linux-amd64.tar.gz" | sha256sum -c && \ + rm -rf /usr/local/go && tar -C /usr/local -xzf go1.21.2.linux-amd64.tar.gz ENV PATH /usr/local/go/bin:$PATH # Install DPDK @@ -52,14 +52,16 @@ RUN sudo apt-get update && \ sudo rm -rf /var/lib/apt/lists/* && \ sudo pip3 install plumbum toml supervisor-wildcards -# Require SCION NetSec binaries (contain DRKey) for SCION tests. -RUN git clone https://github.com/netsec-ethz/scion.git && cd scion && \ - go build -o ./bin/ ./go/cs/ && \ - go build -o ./bin/ ./go/posix-router/ && \ - go build -o ./bin/ ./go/dispatcher/ && \ - go build -o ./bin/ ./go/daemon/ && \ - go build -o ./bin/ ./go/scion-pki/ && \ - go build -o ./bin/ ./go/scion/ +# Require SCION binaries for SCION tests. +RUN git clone https://github.com/scionproto/scion.git && \ + cd scion && \ + git checkout v0.9.1 && \ + go build -o ./bin/ ./control/cmd/control && \ + go build -o ./bin/ ./daemon/cmd/daemon && \ + go build -o ./bin/ ./dispatcher/cmd/dispatcher && \ + go build -o ./bin/ ./router/cmd/router && \ + go build -o ./bin/ ./scion/cmd/scion && \ + go build -o ./bin/ ./scion-pki/cmd/scion-pki ENV SCION_DIR=/home/$USER/scion ENV SCION_BIN=/home/$USER/scion/bin diff --git a/docs/SCION.md b/docs/SCION.md index e003849..dbba732 100644 --- a/docs/SCION.md +++ b/docs/SCION.md @@ -13,9 +13,9 @@ https://go.dev/doc/install On x86: ``` -curl -LO https://go.dev/dl/go1.17.9.linux-amd64.tar.gz -echo "9dacf782028fdfc79120576c872dee488b81257b1c48e9032d122cfdb379cca6 go1.17.9.linux-amd64.tar.gz" | sha256sum -c -sudo tar -C /usr/local -xzf go1.17.9.linux-amd64.tar.gz +curl -LO https://golang.org/dl/go1.21.2.linux-amd64.tar.gz +echo "f5414a770e5e11c6e9674d4cd4dd1f4f630e176d1828d3427ea8ca4211eee90d go1.21.2.linux-amd64.tar.gz" | sha256sum -c +sudo tar -C /usr/local -xzf go1.21.2.linux-amd64.tar.gz ``` ``` @@ -38,25 +38,21 @@ Don't forget to remove the PATH entry in `~/.profile`. ### Install SCION (Modules) -Besides the official SCION repository, there also exists the experimental fork from the Network Security Group at ETH Zurich: -https://github.com/netsec-ethz/scion - -Currently, only the experimental fork supports DRKey. -Therefore, LightningFilter requires that version. - To obtain the source, clone the repository: ``` -git clone https://github.com/netsec-ethz/scion.git +git clone https://github.com/scionproto/scion.git +cd scion +git checkout v0.9.1 ``` Modules can be installed with `go build`. -E.g., the `testnet_scion` setup requires the control service (cs), border router (posix-router), dispatcher (dispatcher), daemon (daemon), the PKI (scion-pki), and SCION tools like ping (scion): +E.g., the `testnet_scion` setup requires the control service (control), border router (router), dispatcher (dispatcher), daemon (daemon), the PKI (scion-pki), and SCION tools like ping (scion): ``` -go build -o ./bin/ ./go/cs/ -go build -o ./bin/ ./go/posix-router/ -go build -o ./bin/ ./go/dispatcher/ -go build -o ./bin/ ./go/daemon/ -go build -o ./bin/ ./go/scion-pki/ -go build -o ./bin/ ./go/scion/ +go build -o ./bin/ ./control/cmd/control +go build -o ./bin/ ./daemon/cmd/daemon +go build -o ./bin/ ./dispatcher/cmd/dispatcher +go build -o ./bin/ ./router/cmd/router +go build -o ./bin/ ./scion/cmd/scion +go build -o ./bin/ ./scion-pki/cmd/scion-pki ``` diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ec112ea..7c4cd7e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -48,7 +48,7 @@ include(plugins/CMakePlugins.cmake) # Add all source files target_sources(${EXEC} PRIVATE params.c setup.c duplicate_filter.c config.c configmanager.c) -target_sources(${EXEC} PRIVATE keymanager.c ratelimiter.c statistics.c version.c) +target_sources(${EXEC} PRIVATE keyfetcher.c keymanager.c ratelimiter.c statistics.c version.c) target_sources(${EXEC} PRIVATE worker.c worker_check.c) target_sources(${EXEC} PRIVATE lib/crypto/crypto.c lib/hash/murmurhash.c lib/ipc/ipc.c) target_sources(${EXEC} PRIVATE lib/mirror/mirror.c) diff --git a/src/config.c b/src/config.c index af573e4..0696df7 100644 --- a/src/config.c +++ b/src/config.c @@ -45,6 +45,10 @@ #define FIELD_DRKEY_PROTOCOL "drkey_protocol" #define FIELD_DRKEY_SERVICE_ADDR "drkey_service_addr" +#define FIELD_SHARED_SECRETS "shared_secrets" +#define FIELD_NOT_BEFORE "not_before" +#define FIELD_SECRET_VALUE "sv" + #define FIELD_DST_RATELIMITER "dst_ratelimiter" #define FIELD_WG_RATELIMITER "wg_ratelimiter" @@ -54,6 +58,9 @@ /* potential value for the ether field of a packet modifier */ #define VALUE_ETHER_SRC_ADDR "src_addr" +/* 16 byte buffer with zero value. */ +static const uint8_t zero_secret_value[16] = { 0 }; + /** * Ratelimit struct with the rate set to 0. * @@ -87,6 +94,9 @@ peer_init(struct lf_config_peer *config_peer) .isd_as = 1, .next = NULL, + .shared_secrets_configured_option = false, + .shared_secrets = { 0 }, + /* per default no rate limit is defined for a peer */ .ratelimit_option = false, .ratelimit = zero_ratelimit, @@ -176,6 +186,120 @@ parse_ratelimit(json_value *json_val, struct lf_config_ratelimit *ratelimit) return 0; } +/** + * The shared_secret struct consists of a key and a timestamp. + * This should be used for preconfigured keys. + * + * @return Returns 0 on success. + */ +static int +parse_shared_secret(json_value *json_val, + struct lf_config_shared_secret *shared_secret) +{ + int res, error_count = 0; + unsigned int length; + unsigned int i; + char *field_name; + json_value *field_value; + bool sv_flag = false, ts_flag = false; + + /* Initialize drkey struct. Set all to 0. */ + (void)memset(shared_secret, 0, sizeof *shared_secret); + + if (json_val == NULL) { + return -1; + } + + if (json_val->type != json_object) { + return -1; + } + + length = json_val->u.object.length; + + for (i = 0; i < length; ++i) { + field_name = json_val->u.object.values[i].name; + field_value = json_val->u.object.values[i].value; + + if (strcmp(field_name, FIELD_SECRET_VALUE) == 0) { + res = lf_json_parse_byte_buffer(field_value, LF_CRYPTO_DRKEY_SIZE, + shared_secret->sv); + if (res != 0) { + LF_LOG(ERR, "Invalid shared secret (%d:%d)\n", + field_value->line, field_value->col); + error_count++; + } + if (memcmp(shared_secret->sv, zero_secret_value, + sizeof shared_secret->sv) == 0) { + LF_LOG(ERR, + "Invalid shared secret. " + "Secret value can not be the all zero secret value.\n"); + return -1; + } + sv_flag = true; + } else if (strcmp(field_name, FIELD_NOT_BEFORE) == 0) { + res = lf_json_parse_timestamp(field_value, + &shared_secret->not_before); + if (res != 0) { + LF_LOG(ERR, "Invalid timestamp (%d:%d)\n", field_value->line, + field_value->col); + error_count++; + } + ts_flag = true; + } else { + LF_LOG(ERR, "Unknown field %s (%d:%d)\n", field_name, + field_value->line, field_value->col); + error_count++; + } + } + + if (error_count > 0) { + return -1; + } + + if (!sv_flag || !ts_flag) { + LF_LOG(ERR, "Invalid shared secret configuration. Need to define both " + "secret value " + "and not before timestamp.\n"); + return -1; + } + + return 0; +} + +static int +parse_shared_secret_list(json_value *json_val, + struct lf_config_shared_secret shared_secret[LF_CONFIG_SV_MAX]) +{ + unsigned int length; + unsigned int i; + unsigned int res; + + if (json_val == NULL) { + return -1; + } + + if (json_val->type != json_array) { + return -1; + } + + length = json_val->u.array.length; + if (length > LF_CONFIG_SV_MAX) { + LF_LOG(ERR, "Exceed shared secret limit (%d:%d)\n", json_val->line, + json_val->col); + return -1; + } + + for (i = 0; i < length; ++i) { + res = parse_shared_secret(json_val->u.array.values[i], + &shared_secret[i]); + if (res != 0) { + return -1; + } + } + + return length; +} + static int parse_peer(json_value *json_val, struct lf_config_peer *peer) { @@ -231,6 +355,16 @@ parse_peer(json_value *json_val, struct lf_config_peer *peer) error_count++; } peer->ratelimit_option = true; + } else if (strcmp(field_name, FIELD_SHARED_SECRETS) == 0) { + res = parse_shared_secret_list(field_value, peer->shared_secrets); + if (res >= 0) { + peer->shared_secrets_configured_option = true; + } + if (res < 0) { + LF_LOG(ERR, "Invalid shared secret (%d:%d)\n", + field_value->line, field_value->col); + error_count++; + } } else { LF_LOG(ERR, "Unknown field %s (%d:%d)\n", field_name, field_value->line, field_value->col); diff --git a/src/config.h b/src/config.h index f841d62..8af9ada 100644 --- a/src/config.h +++ b/src/config.h @@ -9,6 +9,8 @@ #include #include +#include "lib/crypto/crypto.h" + /** * This module defines the config structure and offers functionality to parse a * JSON configuration file, check its format, and return a C struct representing @@ -18,6 +20,11 @@ #define LF_CONFIG_PEERS_MAX 1000000 /* 1'000'000 */ +/* + * Maximum number of SV that can be configured per peer + */ +#define LF_CONFIG_SV_MAX 5 + /* * Rate limits are always defined for bytes and packets. */ @@ -28,6 +35,11 @@ struct lf_config_ratelimit { uint64_t packet_burst; }; +struct lf_config_shared_secret { + uint8_t sv[LF_CRYPTO_DRKEY_SIZE]; + uint64_t not_before; +}; + struct lf_config_peer { /* peer identifier */ uint64_t isd_as; /* in network byte order */ @@ -37,6 +49,10 @@ struct lf_config_peer { bool ratelimit_option; /* if a rate limit is defined */ struct lf_config_ratelimit ratelimit; + /* preconfigured shared keys */ + bool shared_secrets_configured_option; /* if shared secrets are defined*/ + struct lf_config_shared_secret shared_secrets[LF_CONFIG_SV_MAX]; + /* LF-IP: ip -> isd_as map (TODO: move this to a separate map) */ uint32_t ip; /* in network byte order */ diff --git a/src/drkey.h b/src/drkey.h new file mode 100644 index 0000000..ce943fd --- /dev/null +++ b/src/drkey.h @@ -0,0 +1,161 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2021 ETH Zurich + */ + +#ifndef LF_DRKEY_H +#define LF_DRKEY_H + +#include +#include + +#include "lf.h" +#include "lib/crypto/crypto.h" +#include "lib/time/time.h" + +/* + * A DRKey is valid during a certain epoch defined by a starting and ending + * point in time. During the transition between an old key and a new key, both + * keys are valid. This transition period is defined by the + * LF_DRKEY_GRACE_PERIOD, which extends the ending point of the old key by a + * certain amount of time. + */ +#define LF_DRKEY_GRACE_PERIOD (2 * LF_TIME_NS_IN_S) /* in nanoseconds */ +#define LF_DRKEY_PREFETCHING_PERIOD (1 * LF_TIME_NS_IN_S) /* in nanoseconds */ + +/* + * DRKey derivation types. + */ +#define LF_DRKEY_DERIVATION_TYPE_AS_AS 0 +#define LF_DRKEY_DERIVATION_TYPE_AS_HOST 1 +#define LF_DRKEY_DERIVATION_TYPE_HOST_AS 2 +#define LF_DRKEY_DERIVATION_TYPE_HOST_HOST 3 + +/* + * DRKey validity period used for shared, configured keys. + */ +#define LF_DRKEY_VALIDITY_PERIOD_NS \ + (3 * 24 * 3600 * LF_TIME_NS_IN_S) /* in nanoseconds */ + +/* + * IPv6 prefix for embedded IPv4 address + */ +static const uint8_t IPV4_MAPPED_IPV6_PREFIX[12] = { 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF }; + +/** + * The key container wraps all information required to use a key. + * A DRKeys validity is usually defined in seconds. Because the workers operate + * with nanosecond timestamps, the validity timestamps are also stored in + * nanoseconds to avoid any conversion. + */ +struct lf_keymanager_key_container { + uint64_t validity_not_before; /* Unix timestamp (nanoseconds) */ + uint64_t validity_not_after; /* Unix timestamp (nanoseconds) */ + struct lf_crypto_drkey key; +}; + +/** + * Derive HOST-AS DRKey from AS-AS DRKey. + * + * @param drkey_ctx DRKey cipher context. + * @param drkey_as_as AS-AS DRKey. + * @param fast_side_host Fast side host address. + * @param drkey_protocol (network byte order). + * @param drkey_ha Returning HOST-AS DRKey. + */ +static inline void +lf_drkey_derive_host_as_from_as_as(struct lf_crypto_drkey_ctx *drkey_ctx, + const struct lf_crypto_drkey *drkey_as_as, + const struct lf_host_addr *fast_side_host, + const uint16_t drkey_protocol, struct lf_crypto_drkey *drkey_ha) +{ + assert(LF_HOST_ADDR_LENGTH(fast_side_host) <= LF_CRYPTO_CBC_BLOCK_SIZE); + + uint8_t addr_type_len = (uint8_t)(fast_side_host->type_length); + uint8_t *addr = (uint8_t *)(fast_side_host->addr); + uint8_t addr_len = LF_HOST_ADDR_LENGTH(fast_side_host); + + // IPv4 mapped to IPv6 + if (addr_type_len == 3 && memcmp(addr, IPV4_MAPPED_IPV6_PREFIX, + sizeof IPV4_MAPPED_IPV6_PREFIX) == 0) { + addr += 12; + addr_len = 4; + addr_type_len = 0; + } + + int buf_len = (addr_len == 4) ? LF_CRYPTO_CBC_BLOCK_SIZE + : 2 * LF_CRYPTO_CBC_BLOCK_SIZE; + uint8_t buf[2 * LF_CRYPTO_CBC_BLOCK_SIZE] = { 0 }; + buf[0] = LF_DRKEY_DERIVATION_TYPE_HOST_AS; + memcpy(buf + 1, &drkey_protocol, 2); + buf[3] = addr_type_len; + memcpy(buf + 4, addr, addr_len); + + lf_crypto_drkey_derivation_step(drkey_ctx, drkey_as_as, buf, buf_len, + drkey_ha); +} + +/** + * Derive HOST-HOST DRKey from HOST-AS DRKey. + * + * @param drkey_ctx DRKey cipher context. + * @param drkey_host_as HOST-AS DRKey. + * @param slow_side_host Slow side host address. + * @param drkey_hh Returning HOST-HOST DRKey. + */ +static inline void +lf_drkey_derive_host_host_from_host_as(struct lf_crypto_drkey_ctx *drkey_ctx, + const struct lf_crypto_drkey *drkey_host_as, + const struct lf_host_addr *slow_side_host, + struct lf_crypto_drkey *drkey_hh) +{ + assert(LF_HOST_ADDR_LENGTH(slow_side_host) <= LF_CRYPTO_CBC_BLOCK_SIZE); + + uint8_t addr_type_len = (uint8_t)(slow_side_host->type_length); + uint8_t *addr = (uint8_t *)(slow_side_host->addr); + uint8_t addr_len = LF_HOST_ADDR_LENGTH(slow_side_host); + + // IPv4 mapped to IPv6 + if (addr_type_len == 3 && memcmp(addr, IPV4_MAPPED_IPV6_PREFIX, + sizeof IPV4_MAPPED_IPV6_PREFIX) == 0) { + addr += 12; + addr_len = 4; + addr_type_len = 0; + } + + int buf_len = (addr_len == 4) ? LF_CRYPTO_CBC_BLOCK_SIZE + : 2 * LF_CRYPTO_CBC_BLOCK_SIZE; + uint8_t buf[2 * LF_CRYPTO_CBC_BLOCK_SIZE] = { 0 }; + buf[0] = LF_DRKEY_DERIVATION_TYPE_HOST_HOST; + buf[1] = addr_type_len; + memcpy(buf + 2, addr, addr_len); + + lf_crypto_drkey_derivation_step(drkey_ctx, drkey_host_as, buf, buf_len, + drkey_hh); +} + +/** + * Derive HOST-HOST DRKey from AS-AS DRKey. + * + * @param drkey_ctx DRKey cipher context. + * @param drkey_as_as AS-AS DRKey. + * @param fast_side_host Fast side host address. + * @param slow_side_host Slow side host address. + * @param drkey_protocol (network byte order). + * @param drkey_hh Returning HOST-HOST DRKey. + */ +static inline void +lf_drkey_derive_host_host_from_as_as(struct lf_crypto_drkey_ctx *drkey_ctx, + const struct lf_crypto_drkey *drkey_as_as, + const struct lf_host_addr *fast_side_host, + const struct lf_host_addr *slow_side_host, + const uint16_t drkey_protocol, struct lf_crypto_drkey *drkey_hh) +{ + struct lf_crypto_drkey drkey_ha; + lf_drkey_derive_host_as_from_as_as(drkey_ctx, drkey_as_as, fast_side_host, + drkey_protocol, &drkey_ha); + lf_drkey_derive_host_host_from_host_as(drkey_ctx, &drkey_ha, slow_side_host, + drkey_hh); +} + +#endif // LF_DRKEY_H \ No newline at end of file diff --git a/src/drkey_fetcher.h b/src/drkey_fetcher.h index 2660913..307c40c 100644 --- a/src/drkey_fetcher.h +++ b/src/drkey_fetcher.h @@ -14,12 +14,16 @@ * long as it implements this interface. */ +// TODO (abojarski) use correct types for src_addr and dst_addr to accommodate +// enough space for IPV6 addresses. + /** - * Fetch a AS to AS (level 1) DRKey from a DRKey service. + * Fetch a host-AS (level 2) DRKey from a DRKey service. * * @param drkey_service_addr Service address ("IP:Port") * @param src_ia DRKey slow side (CPU endian) * @param dst_ia DRKey fast side (CPU endian) + * @param src_addr DRKey slow side (CPU endian) * @param drkey_protocol DRKey protocol (CPU endian) * @param val_time_ms Time at which the requested key should be valid * (millisecond UNIX timestamp) @@ -30,8 +34,33 @@ * @return 0 on success. */ int -lf_drkey_fetcher_as_as_key(const char drkey_service_addr[48], uint64_t src_ia, - uint64_t dst_ia, uint16_t drkey_protocol, int64_t val_time_ms, +lf_drkey_fetcher_host_as_key(const char drkey_service_addr[48], uint64_t src_ia, + uint64_t dst_ia, uint64_t src_addr, uint16_t drkey_protocol, + int64_t val_time_ms, int64_t *validity_not_before, + int64_t *validity_not_after, void *key); + +/** + * Fetch a host-host (level 3) DRKey from a DRKey service. + * + * @param drkey_service_addr Service address ("IP:Port") + * @param src_ia DRKey slow side (CPU endian) + * @param dst_ia DRKey fast side (CPU endian) + * @param src_addr DRKey slow side (CPU endian) + * @param dst_addr DRKey fast side (CPU endian) + * @param drkey_protocol DRKey protocol (CPU endian) + * @param val_time_ms Time at which the requested key should be valid + * (millisecond UNIX timestamp) + * @param validity_not_before Return DRKey epoch start (millisecond UNIX + * timestamp) + * @param validity_not_after Return DRKey epoch end (millisecond UNIX + * timestamp) + * @param key Return requested DRKey as byte array of size 16. + * @return 0 on success. + */ +int +lf_drkey_fetcher_host_host_key(const char drkey_service_addr[48], + uint64_t src_ia, uint64_t dst_ia, uint64_t src_addr, uint64_t dst_addr, + uint16_t drkey_protocol, int64_t val_time_ms, int64_t *validity_not_before, int64_t *validity_not_after, void *key); diff --git a/src/drkey_fetcher_scion.c b/src/drkey_fetcher_scion.c index 1a284a8..10bf947 100644 --- a/src/drkey_fetcher_scion.c +++ b/src/drkey_fetcher_scion.c @@ -8,9 +8,10 @@ #include "lib/scion_drkey/drkey.h" int -lf_drkey_fetcher_as_as_key(const char drkey_service_addr[48], uint64_t src_ia, - uint64_t dst_ia, uint16_t drkey_protocol, int64_t val_time_ms, - int64_t *validity_not_before, int64_t *validity_not_after, void *key) +lf_drkey_fetcher_host_as_key(const char drkey_service_addr[48], uint64_t src_ia, + uint64_t dst_ia, uint64_t src_addr, uint16_t drkey_protocol, + int64_t val_time_ms, int64_t *validity_not_before, + int64_t *validity_not_after, void *key) { /* * Cast the const char* drkey_service_addr to a non-constant char*! @@ -28,7 +29,34 @@ lf_drkey_fetcher_as_as_key(const char drkey_service_addr[48], uint64_t src_ia, #pragma GCC diagnostic pop #endif - return (int)GetASASKey(non_const_addr, src_ia, dst_ia, drkey_protocol, - val_time_ms, (GoInt64 *)validity_not_before, + return (int)GetHostASKey(non_const_addr, src_ia, dst_ia, src_addr, + drkey_protocol, val_time_ms, (GoInt64 *)validity_not_before, (GoInt64 *)validity_not_after, key); +} + +int +lf_drkey_fetcher_host_host_key(const char drkey_service_addr[48], + uint64_t src_ia, uint64_t dst_ia, uint64_t src_addr, uint64_t dst_addr, + uint16_t drkey_protocol, int64_t val_time_ms, + int64_t *validity_not_before, int64_t *validity_not_after, void *key) +{ +/* + * Cast the const char* drkey_service_addr to a non-constant char*! + * This is done because Cgo does not know the principle of const variable. + * However, the GetASASKey function does not change the address string, + * therefore, this cast is legal (and disabling the compiler warnings is + * acceptable)! + */ +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif + char *non_const_addr = (char *)drkey_service_addr; +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + + return (int)GetHostHostKey(non_const_addr, src_ia, dst_ia, src_addr, + dst_addr, drkey_protocol, val_time_ms, + (GoInt64 *)validity_not_before, (GoInt64 *)validity_not_after, key); } \ No newline at end of file diff --git a/src/keyfetcher.c b/src/keyfetcher.c new file mode 100644 index 0000000..485edf8 --- /dev/null +++ b/src/keyfetcher.c @@ -0,0 +1,489 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2021 ETH Zurich + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "config.h" +#include "drkey_fetcher.h" +#include "keyfetcher.h" +#include "keymanager.h" +#include "lib/crypto/crypto.h" +#include "lib/log/log.h" +#include "lib/time/time.h" + +/** + * Log function for key fetcher service (not on data path). + * Format: "Keyfetcher: log message here" + */ +#define LF_KEYFETCHER_LOG(level, ...) LF_LOG(level, "Keyfetcher: " __VA_ARGS__) + +/* 16 byte buffer with zero value. */ +static const uint8_t zero_secret_value[16] = { 0 }; + +/** + * Derives a short term AS-AS key from the shared secret. + * The derivation is done using AES-CBC MAC keyed with the shared secret and the + * input: + * + * (type | ISD_AS1 | ISD_AS2 | start timestamp) + * + * "type" is the 1 byte fixed constant 0. + * "ISD_AS1" is the ISD_AS number (8 byte) in network byte order of the fast + * side AS. + * "ISD_AS2" is the ISD_AS number (8 byte) in network byte order of the slow + * side AS. + * "start timestamp" is the timestamp in ns (8 byte) of the start time of the + * validity period for the resulting key. This can be synchronized between peers + * since the initial start time is configured by both and consequent start times + * can be calculated by configured time + k * VALIDITY_PERIOD for some k such + * that the key is currently valid. + * + * @param drkey_ctx DRKey cipher context. + * @param secret_node configured shared secret values. + * @param src_ia DRKey slow side (CPU endian). + * @param dst_ia DRKey fast side (CPU endian). + * @param drkey_protocol (network byte order). + * @param ns_valid time in nanoseconds for which the key should be valid. + * @param key Returning AS-AS key. + */ +static int +lf_keyfetcher_derive_shared_key(struct lf_crypto_drkey_ctx *drkey_ctx, + struct lf_keyfetcher_sv_dictionary_data *secret_node, uint64_t src_ia, + uint64_t dst_ia, uint16_t drkey_protocol, uint64_t ns_valid, + struct lf_keymanager_key_container *key) +{ + struct lf_keyfetcher_sv_container *secret = NULL; + uint64_t ms_valid; + ms_valid = ns_valid / LF_TIME_NS_IN_MS; + + // Find the correct shared secret to be used for current timestamp. + for (int i = 0; i < LF_CONFIG_SV_MAX; i++) { + if (memcmp(secret_node->secret_values[i].key.key, zero_secret_value, + sizeof secret_node->secret_values[i].key.key) == 0) { + continue; + } + if (secret_node->secret_values[i].validity_not_before <= ns_valid) { + if (secret == NULL) { + secret = &secret_node->secret_values[i]; + } else if (secret_node->secret_values[i].validity_not_before >= + secret->validity_not_before) { + secret = &secret_node->secret_values[i]; + } + } + } + if (secret == NULL) { + LF_KEYFETCHER_LOG(ERR, + "Could not find shared secret for: src_as " PRIISDAS + ", dst_as " PRIISDAS ", drkey_protocol %u, ms_valid %" PRIu64 + "\n", + PRIISDAS_VAL(rte_be_to_cpu_64(src_ia)), + PRIISDAS_VAL(rte_be_to_cpu_64(dst_ia)), + rte_be_to_cpu_16(drkey_protocol), ms_valid); + return -1; + } + + uint64_t validity_not_before_ns = + secret->validity_not_before + + (int)((ns_valid - secret->validity_not_before) / + LF_DRKEY_VALIDITY_PERIOD_NS) * + LF_DRKEY_VALIDITY_PERIOD_NS; + uint64_t validity_not_before_ns_be = + rte_cpu_to_be_64(validity_not_before_ns); + uint64_t validity_not_after_ns = + validity_not_before_ns + LF_DRKEY_VALIDITY_PERIOD_NS - 1; + + uint8_t buf[2 * LF_CRYPTO_CBC_BLOCK_SIZE] = { 0 }; + buf[0] = LF_DRKEY_DERIVATION_TYPE_AS_AS; + memcpy(buf + 1, &dst_ia, 8); + memcpy(buf + 9, &src_ia, 8); + memcpy(buf + 17, &validity_not_before_ns_be, 8); + + lf_crypto_drkey_derivation_step(drkey_ctx, &secret->key, buf, sizeof buf, + &key->key); + + LF_KEYFETCHER_LOG(INFO, + "Derived shared AS AS Key: src_as " PRIISDAS ", dst_as " PRIISDAS + ", drkey_protocol %u, ms_valid %" PRIu64 + ", validity_not_before_ms %" PRIu64 + ", validity_not_after_ms %" PRIu64 "\n", + PRIISDAS_VAL(rte_be_to_cpu_64(src_ia)), + PRIISDAS_VAL(rte_be_to_cpu_64(dst_ia)), + rte_be_to_cpu_16(drkey_protocol), ms_valid, + (validity_not_before_ns / LF_TIME_NS_IN_MS), + (validity_not_after_ns / LF_TIME_NS_IN_MS)); + + /* set values in returned key structure */ + key->validity_not_before = validity_not_before_ns; + key->validity_not_after = validity_not_after_ns; + + return 0; +} + +// should only be called when keymanager management lock is hold +int +lf_keyfetcher_fetch_as_as_key(struct lf_keyfetcher *kf, uint64_t src_ia, + uint64_t dst_ia, uint16_t drkey_protocol, uint64_t ns_valid, + struct lf_keymanager_key_container *key) +{ + int key_id, res; + struct lf_keyfetcher_dictionary_key dict_key; + struct lf_keyfetcher_sv_dictionary_data *shared_secret_node; + + // check if there is entry in cache + dict_key.as = src_ia == kf->src_ia ? dst_ia : src_ia; + dict_key.drkey_protocol = drkey_protocol; + key_id = rte_hash_lookup_data(kf->dict, &dict_key, + (void **)&shared_secret_node); + if (key_id >= 0) { + res = lf_keyfetcher_derive_shared_key(&kf->drkey_ctx, + shared_secret_node, src_ia, dst_ia, drkey_protocol, ns_valid, + key); + } else { + LF_KEYFETCHER_LOG(ERR, + "Fail to look up shared secret: src_as " PRIISDAS + ", dst_as " PRIISDAS ", drkey_protocol %u\n", + PRIISDAS_VAL(rte_be_to_cpu_64(src_ia)), + PRIISDAS_VAL(rte_be_to_cpu_64(dst_ia)), + rte_be_to_cpu_16(drkey_protocol)); + res = -1; + } + return res; +} + +// should only be called when keymanager management lock is hold +int +lf_keyfetcher_fetch_host_as_key(struct lf_keyfetcher *kf, uint64_t src_ia, + uint64_t dst_ia, const struct lf_host_addr *fast_side_host, + uint16_t drkey_protocol, uint64_t ns_valid, + struct lf_keymanager_key_container *key) +{ + int key_id, res; + struct lf_keyfetcher_dictionary_key dict_key; + struct lf_keyfetcher_sv_dictionary_data *shared_secret_node; + struct lf_keymanager_key_container as_as_key; + uint64_t ms_valid; + int64_t validity_not_before_ms, validity_not_after_ms; + uint8_t drkey_buf[LF_CRYPTO_DRKEY_SIZE]; + + // check if there is entry in cache + dict_key.as = src_ia; + dict_key.drkey_protocol = drkey_protocol; + key_id = rte_hash_lookup_data(kf->dict, &dict_key, + (void **)&shared_secret_node); + if (key_id >= 0) { + res = lf_keyfetcher_derive_shared_key(&kf->drkey_ctx, + shared_secret_node, src_ia, dst_ia, drkey_protocol, ns_valid, + &as_as_key); + if (res < 0) { + return res; + } + lf_drkey_derive_host_as_from_as_as(&kf->drkey_ctx, &as_as_key.key, + fast_side_host, drkey_protocol, &key->key); + key->validity_not_before = as_as_key.validity_not_before; + key->validity_not_after = as_as_key.validity_not_after; + } else { + // fetch from control service + ms_valid = ns_valid / LF_TIME_NS_IN_MS; + + // TODO: implement address parsing correctly. IPv6 addresses do not fit + // in uint64_t... + res = lf_drkey_fetcher_host_as_key(kf->drkey_service_addr, + rte_be_to_cpu_64(src_ia), rte_be_to_cpu_64(dst_ia), + rte_be_to_cpu_64(*(uint64_t *)(fast_side_host->addr)), + rte_be_to_cpu_16(drkey_protocol), (int64_t)ms_valid, + &validity_not_before_ms, &validity_not_after_ms, drkey_buf); + if (res < 0) { + return res; + } + key->validity_not_after = + (uint64_t)validity_not_after_ms * LF_TIME_NS_IN_MS; + key->validity_not_before = + (uint64_t)validity_not_before_ms * LF_TIME_NS_IN_MS; + lf_crypto_drkey_from_buf(&kf->drkey_ctx, drkey_buf, &key->key); + } + + return res; +} + +// should only be called when keymanager management lock is hold +int +lf_keyfetcher_fetch_host_host_key(struct lf_keyfetcher *kf, uint64_t src_ia, + uint64_t dst_ia, const struct lf_host_addr *fast_side_host, + const struct lf_host_addr *slow_side_host, uint16_t drkey_protocol, + uint64_t ns_valid, struct lf_keymanager_key_container *key) +{ + int key_id, res; + struct lf_keyfetcher_dictionary_key dict_key; + struct lf_keyfetcher_sv_dictionary_data *shared_secret_node; + struct lf_keymanager_key_container as_as_key; + uint64_t ms_valid; + int64_t validity_not_before_ms, validity_not_after_ms; + uint8_t drkey_buf[LF_CRYPTO_DRKEY_SIZE]; + + // check if there is entry in cache + dict_key.as = src_ia; + dict_key.drkey_protocol = drkey_protocol; + key_id = rte_hash_lookup_data(kf->dict, &dict_key, + (void **)&shared_secret_node); + if (key_id >= 0) { + res = lf_keyfetcher_derive_shared_key(&kf->drkey_ctx, + shared_secret_node, src_ia, dst_ia, drkey_protocol, ns_valid, + &as_as_key); + if (res < 0) { + return res; + } + lf_drkey_derive_host_host_from_as_as(&kf->drkey_ctx, &as_as_key.key, + fast_side_host, slow_side_host, drkey_protocol, &key->key); + key->validity_not_before = as_as_key.validity_not_before; + key->validity_not_after = as_as_key.validity_not_after; + } else { + // fetch from control service + ms_valid = ns_valid / LF_TIME_NS_IN_MS; + + // TODO: implement address parsing correctly. IPv6 addresses do not fit + // in uint64_t... + res = lf_drkey_fetcher_host_host_key(kf->drkey_service_addr, + rte_be_to_cpu_64(src_ia), rte_be_to_cpu_64(dst_ia), + rte_be_to_cpu_64(*(uint64_t *)(fast_side_host->addr)), + rte_be_to_cpu_64(*(uint64_t *)(slow_side_host->addr)), + rte_be_to_cpu_16(drkey_protocol), (int64_t)ms_valid, + &validity_not_before_ms, &validity_not_after_ms, drkey_buf); + if (res < 0) { + return res; + } + key->validity_not_after = + (uint64_t)validity_not_after_ms * LF_TIME_NS_IN_MS; + key->validity_not_before = + (uint64_t)validity_not_before_ms * LF_TIME_NS_IN_MS; + lf_crypto_drkey_from_buf(&kf->drkey_ctx, drkey_buf, &key->key); + } + + return res; +} + +// should only be called when keymanager management lock is hold +int +lf_keyfetcher_apply_config(struct lf_keyfetcher *kf, + const struct lf_config *config) +{ + int res, err = 0, key_id; + uint32_t iterator; + bool is_in_list; + struct lf_keyfetcher_dictionary_key key, *key_ptr; + struct lf_keyfetcher_sv_dictionary_data *shared_secret_data; + struct lf_config_peer *peer; + + LF_KEYFETCHER_LOG(NOTICE, "Apply config!\n"); + + memcpy(kf->drkey_service_addr, config->drkey_service_addr, + sizeof kf->drkey_service_addr); + + kf->src_ia = config->isd_as; + + for (iterator = 0; rte_hash_iterate(kf->dict, (void *)&key_ptr, + (void **)&shared_secret_data, &iterator) >= 0;) { + is_in_list = false; + for (peer = config->peers; peer != NULL; peer = peer->next) { + if (peer->isd_as == key_ptr->as && + peer->drkey_protocol == key_ptr->drkey_protocol) { + is_in_list = true; + break; + } + } + if (!is_in_list) { + // Remove SV since peer is no longer configured. + LF_KEYFETCHER_LOG(DEBUG, + "Remove SV entry for AS " PRIISDAS " DRKey protocol %u\n", + PRIISDAS_VAL(rte_be_to_cpu_64(key_ptr->as)), + rte_be_to_cpu_16(key_ptr->drkey_protocol)); + rte_hash_del_key(kf->dict, key_ptr); + // can be removed here since manager lock is beeing held + rte_free(shared_secret_data); + } + } + + for (peer = config->peers; peer != NULL; peer = peer->next) { + key.as = peer->isd_as; + key.drkey_protocol = peer->drkey_protocol; + + // update secret values that were already in dict + key_id = rte_hash_lookup_data(kf->dict, &key, + (void **)&shared_secret_data); + if (key_id >= 0) { + if (peer->shared_secrets_configured_option) { + for (int i = 0; i < LF_CONFIG_SV_MAX; i++) { + shared_secret_data->secret_values[i].validity_not_before = + peer->shared_secrets[i].not_before; + lf_crypto_drkey_from_buf(&kf->drkey_ctx, + peer->shared_secrets[i].sv, + &shared_secret_data->secret_values[i].key); + } + } else { + // Peer still exists but has no longer secret values defined. + LF_KEYFETCHER_LOG(DEBUG, + "Peer has no longer SVs defined. Remove SV entry for " + "AS " PRIISDAS " DRKey protocol %u\n", + PRIISDAS_VAL(rte_be_to_cpu_64(key.as)), + rte_be_to_cpu_16(key.drkey_protocol)); + rte_hash_del_key(kf->dict, &key); + // can be removed here since manager lock is beeing held + rte_free(shared_secret_data); + } + continue; + } + + if (peer->shared_secrets_configured_option) { + // create entry of secret value for new hash table + shared_secret_data = + (struct lf_keyfetcher_sv_dictionary_data *)rte_zmalloc(NULL, + sizeof(struct lf_keyfetcher_sv_dictionary_data), 0); + if (shared_secret_data == NULL) { + LF_KEYFETCHER_LOG(ERR, "Failed to allocate memory for key\n"); + err = 1; + break; + } + + // populate secret data and add to dict + for (int i = 0; i < LF_CONFIG_SV_MAX; i++) { + shared_secret_data->secret_values[i].validity_not_before = + peer->shared_secrets[i].not_before; + lf_crypto_drkey_from_buf(&kf->drkey_ctx, + peer->shared_secrets[i].sv, + &shared_secret_data->secret_values[i].key); + } + + res = rte_hash_add_key_data(kf->dict, &key, + (void *)shared_secret_data); + if (res != 0) { + LF_KEYFETCHER_LOG(ERR, "Add key failed with %d!\n", key_id); + rte_free(shared_secret_data); + err = 1; + break; + } + } + } + if (err == 0) { + return 0; + } else { + LF_KEYFETCHER_LOG(ERR, "Failed to set config"); + return -1; + } +} + +/** + * @param size of table. Must be at least 8. + * @return struct rte_hash* + */ +static struct rte_hash * +key_dictionary_init(uint32_t size) +{ + struct rte_hash *dic; + struct rte_hash_parameters params = { 0 }; + /* rte_hash table name */ + char name[RTE_HASH_NAMESIZE]; + /* counter to ensure unique rte_hash table name */ + static int counter = 0; + + LF_KEYFETCHER_LOG(DEBUG, "Init\n"); + + /* DPDK hash table entry must be at least 8 (undocumented) */ + if (size < 8) { + LF_KEYFETCHER_LOG(ERR, + "Hash creation failed because size is smaller than 8\n"); + return NULL; + } + + (void)snprintf(name, sizeof(name), "keyfetcher_dict_%d\n", counter); + counter += 1; + + params.name = name; + /* DPDK hash table entry must be at least 8 (undocumented) */ + params.entries = size; + /* AS + drkey_protocol */ + params.key_len = sizeof(struct lf_keymanager_dictionary_key); + /* hash function */ + params.hash_func = rte_jhash; + params.hash_func_init_val = 0; + /* TODO: (fstreun) potentially use multiple hash tables for different + * sockets */ + params.socket_id = (int)rte_socket_id(); + /* ensure that insertion always succeeds */ + params.extra_flag = RTE_HASH_EXTRA_FLAGS_EXT_TABLE; + /* Lock Free Read Write */ + params.extra_flag |= RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF; + + dic = rte_hash_create(¶ms); + + if (dic == NULL) { + LF_KEYFETCHER_LOG(ERR, "Hash creation failed with: %d\n", errno); + rte_hash_free(dic); + return NULL; + } + + LF_KEYFETCHER_LOG(DEBUG, "Created hash table (size = %d)\n", size); + + return dic; +} + +/** + * Free all keys stored in the dictionary and the dictionary itself. + */ +static void +lf_keyfetcher_dictionary_free(struct rte_hash *dict) +{ + uint32_t iterator; + struct lf_keyfetcher_dictionary_key *key_ptr; + struct lf_keyfetcher_sv_dictionary_data *data; + + for (iterator = 0; rte_hash_iterate(dict, (void *)&key_ptr, (void **)&data, + &iterator) >= 0;) { + rte_free(data); + } + rte_hash_free(dict); +} + +// should only be called when keymanager management lock is hold +int +lf_keyfetcher_close(struct lf_keyfetcher *kf) +{ + lf_keyfetcher_dictionary_free(kf->dict); + kf->dict = NULL; + lf_crypto_drkey_ctx_close(&kf->drkey_ctx); + return 0; +} + +int +lf_keyfetcher_init(struct lf_keyfetcher *kf, uint32_t initial_size) +{ + int res; + + /* dictionary requires a size of at least 8 (magic number) */ + // NOLINTBEGIN(readability-magic-numbers) + if (initial_size < 8) { + initial_size = 8; + } + // NOLINTEND(readability-magic-numbers) + kf->size = initial_size; + kf->dict = key_dictionary_init(initial_size); + if (kf->dict == NULL) { + return -1; + } + + memset(kf->drkey_service_addr, 0, sizeof kf->drkey_service_addr); + + res = lf_crypto_drkey_ctx_init(&kf->drkey_ctx); + if (res != 0) { + /* TODO: error handling*/ + return -1; + } + + return 0; +} diff --git a/src/keyfetcher.h b/src/keyfetcher.h new file mode 100644 index 0000000..5e66a6a --- /dev/null +++ b/src/keyfetcher.h @@ -0,0 +1,87 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2021 ETH Zurich + */ + +#ifndef LF_KEYFETCHER_H +#define LF_KEYFETCHER_H + +#include + +#include + +#include "config.h" +#include "drkey.h" +#include "drkey_fetcher.h" +#include "lib/crypto/crypto.h" +#include "lib/log/log.h" + +/** + * The keyfetcher fetches the requested DRKeys. + * It either fetches the keys from the control service or derives them for peers + * that have shared secret values configured. The configured shared values are + * stored in the keyfetcher. + * + * The keyfetcher does not implement additional caching. + * + * The CS fetching depends on a DRKey fetcher module, which depends on the + * deployment setup. + */ + +struct lf_keyfetcher_sv_container { + uint64_t validity_not_before; /* Unix timestamp (nanoseconds) */ + struct lf_crypto_drkey key; +}; + +struct lf_keyfetcher_sv_dictionary_data { + struct lf_keyfetcher_sv_container secret_values[LF_CONFIG_SV_MAX]; +}; + +struct lf_keyfetcher_dictionary_key { + uint64_t as; /* network byte order */ + uint16_t drkey_protocol; /* network byte order */ +} __attribute__((__packed__)); + + +struct lf_keyfetcher { + /* SV dictionary */ + struct rte_hash *dict; + /* max number of entries */ + uint32_t size; + + uint64_t src_ia; + + char drkey_service_addr[48]; + + /* crypto DRKey context */ + struct lf_crypto_drkey_ctx drkey_ctx; +}; + +int +lf_keyfetcher_fetch_as_as_key(struct lf_keyfetcher *kf, uint64_t src_ia, + uint64_t dst_ia, uint16_t drkey_protocol, uint64_t ns_valid, + struct lf_keymanager_key_container *key); + +int +lf_keyfetcher_fetch_host_as_key(struct lf_keyfetcher *kf, uint64_t src_ia, + uint64_t dst_ia, const struct lf_host_addr *fast_side_host, + uint16_t drkey_protocol, uint64_t ns_valid, + struct lf_keymanager_key_container *key); + +int +lf_keyfetcher_fetch_host_host_key(struct lf_keyfetcher *kf, uint64_t src_ia, + uint64_t dst_ia, const struct lf_host_addr *fast_side_host, + const struct lf_host_addr *slow_side_host, uint16_t drkey_protocol, + uint64_t ns_valid, struct lf_keymanager_key_container *key); + +// should only be called when keymanager management lock is hold +int +lf_keyfetcher_apply_config(struct lf_keyfetcher *kf, + const struct lf_config *config); + +int +lf_keyfetcher_close(struct lf_keyfetcher *kf); + +int +lf_keyfetcher_init(struct lf_keyfetcher *kf, uint32_t initial_size); + +#endif /* LF_KEYFETCHER_H */ \ No newline at end of file diff --git a/src/keymanager.c b/src/keymanager.c index a6fffb0..ea167f7 100644 --- a/src/keymanager.c +++ b/src/keymanager.c @@ -15,6 +15,7 @@ #include "config.h" #include "drkey_fetcher.h" +#include "keyfetcher.h" #include "keymanager.h" #include "lib/crypto/crypto.h" #include "lib/ipc/ipc.h" @@ -73,78 +74,11 @@ synchronize_worker(struct lf_keymanager *km) (void)rte_rcu_qsbr_synchronize(km->qsv, RTE_QSBR_THRID_INVALID); } -/** - * Fetch AS-AS key (Level 1). - * Increments statistics counter accordingly; increment fetch_success on success - * and fetch_fail otherwise. - * - * @param drkey_service_addr: address of drkey service, such as the SCION - * control service, e.g., 10.248.7.1:31008 - * @param src_ia: slow side of the DRKey (network byte order) - * @param dst_ia: fast side of the DRKey (network byte order) - * @param drkey_protocol: (network byte order) - * @param ns_valid: Unix timestamp in nanoseconds, at which the requested key - * must be valid. - * @param key: pointer to key container struct to store result in. - * @return 0 on success, otherwise, < 0. - */ -static int -fetch_as_as_key(struct lf_keymanager *km, const char drkey_service_addr[48], - uint64_t src_ia, uint64_t dst_ia, uint16_t drkey_protocol, - uint64_t ns_valid, struct lf_keymanager_key_container *key) -{ - int res; - uint64_t ms_valid; - int64_t validity_not_before_ms, validity_not_after_ms; - uint8_t drkey_buf[LF_CRYPTO_DRKEY_SIZE]; - - ms_valid = ns_valid / LF_TIME_NS_IN_MS; - - assert(ms_valid <= INT64_MAX); - res = lf_drkey_fetcher_as_as_key(drkey_service_addr, - rte_be_to_cpu_64(src_ia), rte_be_to_cpu_64(dst_ia), - rte_be_to_cpu_16(drkey_protocol), (int64_t)ms_valid, - &validity_not_before_ms, &validity_not_after_ms, drkey_buf); - - if (res != 0) { - km->statistics.fetch_fail++; - - LF_KEYMANAGER_LOG(ERR, - "Fetching AS AS Key failed with %d: drkey_service_addr " - "%s, src_as" PRIISDAS ", dst_as " PRIISDAS - ", drkey_protocol %u, ms_valid %" PRIu64 "\n", - res, drkey_service_addr, PRIISDAS_VAL(rte_be_to_cpu_64(src_ia)), - PRIISDAS_VAL(rte_be_to_cpu_64(dst_ia)), - rte_be_to_cpu_16(drkey_protocol), ms_valid); - return -1; - } - - km->statistics.fetch_successful++; - LF_KEYMANAGER_LOG(INFO, - "Fetched AS AS Key: drkey_service_addr " - "%s, src_as " PRIISDAS ", dst_as " PRIISDAS - ", drkey_protocol %u, ms_valid %" PRIu64 - ", validity_not_before_ms %" PRIu64 - ", validity_not_after_ms %" PRIu64 "\n", - drkey_service_addr, PRIISDAS_VAL(rte_be_to_cpu_64(src_ia)), - PRIISDAS_VAL(rte_be_to_cpu_64(dst_ia)), - rte_be_to_cpu_16(drkey_protocol), ms_valid, validity_not_before_ms, - validity_not_after_ms); - - /* set values in returned key structure */ - key->validity_not_after = - (uint64_t)validity_not_after_ms * LF_TIME_NS_IN_MS; - key->validity_not_before = - (uint64_t)validity_not_before_ms * LF_TIME_NS_IN_MS; - lf_crypto_drkey_from_buf(&km->drkey_ctx, drkey_buf, &key->key); - - return 0; -} void lf_keymanager_service_update(struct lf_keymanager *km) { - int res, key_id; + int res; int err = 0; struct lf_keymanager_dictionary_key *key_ptr; uint32_t iterator; @@ -179,11 +113,11 @@ lf_keymanager_service_update(struct lf_keymanager *km) (void)rte_memcpy(new_data, data, sizeof(struct lf_keymanager_dictionary_data)); - key_id = fetch_as_as_key(km, km->drkey_service_addr, key_ptr->as, + res = lf_keyfetcher_fetch_as_as_key(km->fetcher, key_ptr->as, km->src_as, key_ptr->drkey_protocol, ns_now + LF_DRKEY_PREFETCHING_PERIOD, &new_data->inbound_key); - if (key_id < 0) { + if (res < 0) { rte_free(new_data); err = -1; goto exit; @@ -227,11 +161,11 @@ lf_keymanager_service_update(struct lf_keymanager *km) (void)rte_memcpy(new_data, data, sizeof(struct lf_keymanager_dictionary_data)); - key_id = fetch_as_as_key(km, km->drkey_service_addr, km->src_as, + res = lf_keyfetcher_fetch_as_as_key(km->fetcher, km->src_as, key_ptr->as, key_ptr->drkey_protocol, ns_now + LF_DRKEY_PREFETCHING_PERIOD, &new_data->outbound_key); - if (key_id < 0) { + if (res < 0) { rte_free(new_data); err = -1; goto exit; @@ -255,7 +189,6 @@ lf_keymanager_service_update(struct lf_keymanager *km) (void)linked_list_push(&free_list, data); } } - exit: if (free_list != NULL) { /* free old data after no worker accesses it anymore */ @@ -384,6 +317,8 @@ lf_keymanager_apply_config(struct lf_keymanager *km, rte_spinlock_lock(&km->management_lock); LF_KEYMANAGER_LOG(NOTICE, "Apply config...\n"); + lf_keyfetcher_apply_config(km->fetcher, config); + /* * Update general keymanager configurations */ @@ -451,22 +386,15 @@ lf_keymanager_apply_config(struct lf_keymanager *km, break; } - /* - * Fetch keys from the new drkey service. - * If this does not succeed, initialize them as not valid, i.e., set - * validity_not_after to 0. - */ - res = fetch_as_as_key(km, config->drkey_service_addr, key.as, - config->isd_as, key.drkey_protocol, ns_now, - &dictionary_data->inbound_key); + res = lf_keyfetcher_fetch_as_as_key(km->fetcher, key.as, config->isd_as, + key.drkey_protocol, ns_now, &dictionary_data->inbound_key); if (res < 0) { dictionary_data->inbound_key.validity_not_after = 0; } dictionary_data->old_inbound_key.validity_not_after = 0; - res = fetch_as_as_key(km, config->drkey_service_addr, config->isd_as, - key.as, key.drkey_protocol, ns_now, - &dictionary_data->outbound_key); + res = lf_keyfetcher_fetch_as_as_key(km->fetcher, config->isd_as, key.as, + key.drkey_protocol, ns_now, &dictionary_data->outbound_key); if (res < 0) { dictionary_data->outbound_key.validity_not_after = 0; } @@ -521,6 +449,9 @@ lf_keymanager_close(struct lf_keymanager *km) km->workers[worker_id].dict = NULL; lf_crypto_drkey_ctx_close(&km->workers[worker_id].drkey_ctx); } + lf_keyfetcher_close(km->fetcher); + free(km->fetcher); + km->fetcher = NULL; return 0; } @@ -568,6 +499,15 @@ lf_keymanager_init(struct lf_keymanager *km, uint16_t nb_workers, reset_statistics(&km->statistics); + km->fetcher = malloc(sizeof(struct lf_keyfetcher)); + if (km->fetcher == NULL) { + return -1; + } + res = lf_keyfetcher_init(km->fetcher, initial_size); + if (res != 0) { + return -1; + } + return 0; } diff --git a/src/keymanager.h b/src/keymanager.h index 01dc1c1..6e72e4c 100644 --- a/src/keymanager.h +++ b/src/keymanager.h @@ -15,6 +15,8 @@ #include #include "config.h" +#include "drkey.h" +#include "keyfetcher.h" #include "lf.h" #include "lib/crypto/crypto.h" #include "lib/telemetry/counters.h" @@ -23,37 +25,15 @@ #include "lib/log/log.h" /** - * The key manager manages the storage and fetching of the required DRKeys. - * It provides an interface for workers to query host-to-host keys efficiently. + * The key manager manages the storage, caching and fetching of the required + * DRKeys. It provides an interface for workers to query host-to-host keys + * efficiently. * - * For the fetching, it depends on a DRKey fetcher module, which depends on the - * deployment setup. + * For the fetching, it uses the keyfetcher. */ #define LF_KEYMANAGER_INTERVAL 0.5 /* seconds */ -/* - * A DRKey is valid during a certain epoch defined by a starting and ending - * point in time. During the transition between an old key and a new key, both - * keys are valid. This transition period is defined by the - * LF_DRKEY_GRACE_PERIOD, which extends the ending point of the old key by a - * certain amount of time. - */ -#define LF_DRKEY_GRACE_PERIOD (2 * LF_TIME_NS_IN_S) /* in nanoseconds */ -#define LF_DRKEY_PREFETCHING_PERIOD (1 * LF_TIME_NS_IN_S) /* in nanoseconds */ - -/** - * The key container wraps all information required to use a key. - * A DRKeys validity is usually defined in seconds. Because the workers operate - * with nanosecond timestamps, the validity timestamps are also stored in - * nanoseconds to avoid any conversion. - */ -struct lf_keymanager_key_container { - uint64_t validity_not_before; /* Unix timestamp (nanoseconds) */ - uint64_t validity_not_after; /* Unix timestamp (nanoseconds) */ - struct lf_crypto_drkey key; -}; - struct lf_keymanager_worker { struct rte_hash *dict; struct lf_crypto_drkey_ctx drkey_ctx; @@ -93,6 +73,8 @@ struct lf_keymanager { uint64_t src_as; + struct lf_keyfetcher *fetcher; + char drkey_service_addr[48]; /* crypto DRKey context */ @@ -133,36 +115,6 @@ lf_keymanager_check_drkey_validity(struct lf_keymanager_key_container *drkey, return -1; } -/** - * Derive host-host DRKey from AS-AS DRKey. - * - * @param kmw Keymanager worker context. - * @param drkey_asas AS-AS DRKey. - * @param fast_side_host Fast side host address. - * @param slow_side_host Slow side host address. - * @param drkey_hh Returning host-host DRKey. - */ -static inline void -lf_keymanager_drkey_from_asas(struct lf_keymanager_worker *kmw, - const struct lf_crypto_drkey *drkey_asas, - const struct lf_host_addr *fast_side_host, - const struct lf_host_addr *slow_side_host, - struct lf_crypto_drkey *drkey_hh) -{ - assert(LF_HOST_ADDR_LENGTH(fast_side_host) <= LF_CRYPTO_CBC_BLOCK_SIZE); - assert(LF_HOST_ADDR_LENGTH(slow_side_host) <= LF_CRYPTO_CBC_BLOCK_SIZE); - - /* TODO: prepend key type and address length/type */ - uint8_t buf[2 * LF_CRYPTO_CBC_BLOCK_SIZE] = { 0 }; - - memcpy(buf, fast_side_host->addr, LF_HOST_ADDR_LENGTH(fast_side_host)); - memcpy(buf + LF_CRYPTO_CBC_BLOCK_SIZE, slow_side_host->addr, - LF_HOST_ADDR_LENGTH(slow_side_host)); - - lf_crypto_drkey_derivation_step(&kmw->drkey_ctx, drkey_asas, buf, - sizeof(buf), drkey_hh); -} - /** * Obtain inbound DRKey. * @@ -205,8 +157,9 @@ lf_keymanager_worker_inbound_get_drkey(struct lf_keymanager_worker *kmw, grace_period = 0; #endif if (res >= 0 && (res == grace_period)) { - lf_keymanager_drkey_from_asas(kmw, &dict_node->inbound_key.key, - backend_addr, peer_addr, drkey); + lf_drkey_derive_host_host_from_as_as(&kmw->drkey_ctx, + &dict_node->inbound_key.key, backend_addr, peer_addr, + drkey_protocol, drkey); return 0; } @@ -215,8 +168,9 @@ lf_keymanager_worker_inbound_get_drkey(struct lf_keymanager_worker *kmw, res = lf_keymanager_check_drkey_validity(&dict_node->old_inbound_key, ns_valid); if (res >= 0 && (res == grace_period)) { - lf_keymanager_drkey_from_asas(kmw, &dict_node->old_inbound_key.key, - backend_addr, peer_addr, drkey); + lf_drkey_derive_host_host_from_as_as(&kmw->drkey_ctx, + &dict_node->old_inbound_key.key, backend_addr, peer_addr, + drkey_protocol, drkey); return 0; } @@ -266,8 +220,9 @@ lf_keymanager_worker_outbound_get_drkey(struct lf_keymanager_worker *kmw, res = 0; #endif if (likely(res == 0 || res == 1)) { - lf_keymanager_drkey_from_asas(kmw, &dict_node->outbound_key.key, - peer_addr, backend_addr, drkey); + lf_drkey_derive_host_host_from_as_as(&kmw->drkey_ctx, + &dict_node->outbound_key.key, peer_addr, backend_addr, + drkey_protocol, drkey); return res; } @@ -275,8 +230,9 @@ lf_keymanager_worker_outbound_get_drkey(struct lf_keymanager_worker *kmw, res = lf_keymanager_check_drkey_validity(&dict_node->old_outbound_key, ns_valid); if (likely(res == 0 || res == 1)) { - lf_keymanager_drkey_from_asas(kmw, &dict_node->old_outbound_key.key, - peer_addr, backend_addr, drkey); + lf_drkey_derive_host_host_from_as_as(&kmw->drkey_ctx, + &dict_node->old_outbound_key.key, peer_addr, backend_addr, + drkey_protocol, drkey); return res; } diff --git a/src/lib/json-parser/lf_json_util.h b/src/lib/json-parser/lf_json_util.h index 6d1700b..3353bd1 100644 --- a/src/lib/json-parser/lf_json_util.h +++ b/src/lib/json-parser/lf_json_util.h @@ -9,6 +9,8 @@ #include #include +#include + #include #include "../utils/parse.h" @@ -44,19 +46,19 @@ lf_json_parse_string(const json_value *json_val, char *dst, size_t n) } static inline int -lf_json_parse_uint16(const json_value *json_val, uint16_t *dst) +lf_json_parse_uint16(const json_value *json_val, uint16_t *val) { - int64_t drkey_protocol; + int64_t raw_value; if (json_val->type != json_integer) { return -1; } - drkey_protocol = json_val->u.integer; - if (drkey_protocol < 0 || drkey_protocol > UINT16_MAX) { + raw_value = json_val->u.integer; + if (raw_value < 0 || raw_value > UINT16_MAX) { return -1; } - *dst = (uint16_t)drkey_protocol; + *val = (uint16_t)raw_value; return 0; } @@ -103,10 +105,10 @@ lf_json_parse_ether(const json_value *json_val, uint8_t val[6]) j = i; do { assert(j <= json_val->u.string.length); - if (('0' <= addrstr[j]) && (int)(addrstr[j] <= '9')) { - val[k] = (val[k] << 4) | (addrstr[j] - '0'); + if (('0' <= addrstr[j]) && (addrstr[j] <= '9')) { + val[k] = (val[k] << 4) | (uint8_t)(addrstr[j] - '0'); } else if (('a' <= addrstr[j]) && (addrstr[j] <= 'f')) { - val[k] = (val[k] << 4) | (int)(addrstr[j] - 'a' + 10); + val[k] = (val[k] << 4) | (uint8_t)(addrstr[j] - 'a' + 10); } else { return -1; } @@ -164,14 +166,14 @@ lf_json_parse_ipv6(const json_value *json_val, uint8_t val[16]) * @param val result port number (newtork byte order). */ static inline int -lf_json_parse_port(const json_value *json_val, uint16_t *dst) +lf_json_parse_port(const json_value *json_val, uint16_t *val) { int res; - res = lf_json_parse_uint16(json_val, dst); + res = lf_json_parse_uint16(json_val, val); if (res != 0) { return res; } - *dst = rte_cpu_to_be_16(*dst); + *val = rte_cpu_to_be_16(*val); return 0; } @@ -208,4 +210,117 @@ lf_json_parse_isd_as_be(json_value *json_val, uint64_t *val) return 0; } + +/** + * Parse byte buffer from hex string. + * @param val result byte buffer of length len (newtork byte order). + */ +static inline int +lf_json_parse_byte_buffer(const json_value *json_val, int len, uint8_t val[]) +{ + char *bufstr; + + if (json_val->type != json_string) { + return -1; + } + + bufstr = json_val->u.string.ptr; + + int bufstr_len = json_val->u.string.length; + if (bufstr_len != 2 * len) { + return -1; + } + + for (uint8_t i = 0; i < len; i++) { + val[i] = 0; + for (uint8_t j = 2 * i; j < 2 * i + 2; j++) { + assert(j < bufstr_len); + if (('0' <= bufstr[j]) && (bufstr[j] <= '9')) { + val[i] = (val[i] << 4) | (uint8_t)(bufstr[j] - '0'); + } else if (('a' <= bufstr[j]) && (bufstr[j] <= 'f')) { + val[i] = (val[i] << 4) | (uint8_t)(bufstr[j] - 'a' + 10); + } else { + return -1; + } + } + } + + return 0; +} + +/** + * Parse timestamp from iso string. + * @param val result timestamp in unix time + */ +static inline int +lf_json_parse_timestamp(const json_value *json_val, uint64_t *val) +{ + if (json_val->type != json_string) { + return -1; + } + + char *bufstr; + bufstr = json_val->u.string.ptr; + + int bufstr_len = json_val->u.string.length; + if (bufstr_len != 19) { + return -1; + } + + struct tm date; + // expect time in format "%Y-%m-%dT%H:%M:%S" + if (bufstr[4] != '-' || bufstr[7] != '-' || bufstr[10] != 'T' || + bufstr[13] != ':' || bufstr[16] != ':') { + return -1; + } + + uint64_t v; + int res; + res = lf_parse_unum(bufstr, &v); + if (res < 0) { + return -1; + } + date.tm_year = (int)v - 1900; + + res = lf_parse_unum(bufstr + 5, &v); + if (res < 0) { + return -1; + } + date.tm_mon = (int)v - 1; + + res = lf_parse_unum(bufstr + 8, &v); + if (res < 0) { + return -1; + } + date.tm_mday = (int)v; + + res = lf_parse_unum(bufstr + 11, &v); + if (res < 0) { + return -1; + } + date.tm_hour = (int)v; + + res = lf_parse_unum(bufstr + 14, &v); + if (res < 0) { + return -1; + } + date.tm_min = (int)v; + + res = lf_parse_unum(bufstr + 17, &v); + if (res < 0) { + return -1; + } + date.tm_sec = (int)v; + + // NOTE: timegm is only available on linux systems + time_t unix_time = timegm(&date); + if (unix_time < 0) { + return -1; + } + + *val = (uint64_t)(unix_time) * (uint64_t)1e9; + + return 0; +} + #endif /* LF_JSON_UTIL_H */ \ No newline at end of file diff --git a/src/lib/scion_drkey/drkey.go b/src/lib/scion_drkey/drkey.go index 12cde17..d38c29f 100644 --- a/src/lib/scion_drkey/drkey.go +++ b/src/lib/scion_drkey/drkey.go @@ -6,65 +6,22 @@ package main import ( "C" "unsafe" - - "context" - "fmt" - "time" - - "github.com/scionproto/scion/go/lib/addr" - drkeyctrl "github.com/scionproto/scion/go/lib/ctrl/drkey" - "github.com/scionproto/scion/go/lib/drkey" - cppb "github.com/scionproto/scion/go/pkg/proto/control_plane" - - "google.golang.org/grpc" ) -//export GetASASKey -func GetASASKey(sciondAddr *C.char, fastIA, slowIA uint64, drkeyProtocol uint16, valTime int64, +//export GetHostASKey +func GetHostASKey(sciondAddr *C.char, fastIA, slowIA, fastAddr uint64, drkeyProtocol uint16, valTime int64, validityNotBefore, validityNotAfter *int64, keyPtr unsafe.Pointer) int { + + // TODO: implement key fetching from SCION control service + return -1 +} - meta := drkey.Lvl1Meta{ - ProtoId: drkey.Protocol(drkeyProtocol), - Validity: time.Unix(valTime/1000, 0).UTC(), - SrcIA: addr.IA(fastIA), - DstIA: addr.IA(slowIA), - } - - ctx, cancelF := context.WithTimeout(context.Background(), 10*time.Second) - defer cancelF() - - // Dial - conn, err := grpc.DialContext(ctx, C.GoString(sciondAddr), grpc.WithInsecure()) - if err != nil { - fmt.Println("DialContext failed") - return -1 - } - - defer conn.Close() - client := cppb.NewDRKeyIntraServiceClient(conn) - protoReq, err := drkeyctrl.IntraLvl1ToProtoRequest(meta) - if err != nil { - fmt.Println("IntraLvl1ToProtoRequest failed") - return -1 - } - - rep, err := client.IntraLvl1(ctx, protoReq) - if err != nil { - fmt.Println("IntraLvl1 failed") - return -1 - } - - key, err := drkeyctrl.GetASASKeyFromReply(meta, rep) - if err != nil { - fmt.Println("GetASASKeyFromReply failed") - return -1 - } - - *validityNotBefore = key.Epoch.NotBefore.Unix() * 1000 - *validityNotAfter = key.Epoch.NotAfter.Unix() * 1000 - copy((*[16]byte)(keyPtr)[:], key.Key[:]) +//export GetHostHostKey +func GetHostHostKey(sciondAddr *C.char, fastIA, slowIA, fastAddr, slowAddr uint64, drkeyProtocol uint16, valTime int64, + validityNotBefore, validityNotAfter *int64, keyPtr unsafe.Pointer) int { - return 0 + // TODO: implement key fetching from SCION control service + return -1 } func main() {} diff --git a/src/lib/scion_drkey/go.mod b/src/lib/scion_drkey/go.mod index 407ca54..19fce0e 100644 --- a/src/lib/scion_drkey/go.mod +++ b/src/lib/scion_drkey/go.mod @@ -1,10 +1,40 @@ module example.com/lightning-filter -go 1.16 +go 1.21 + +require github.com/scionproto/scion v0.9.1 require ( - github.com/scionproto/scion v0.6.1-0.20220202161514-5883c725f748 - google.golang.org/grpc v1.40.0 + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/dchest/cmac v1.0.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/google/gopacket v1.1.19 // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-sqlite3 v1.14.18 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect + github.com/prometheus/client_golang v1.17.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.26.0 // indirect + golang.org/x/crypto v0.15.0 // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/sys v0.14.0 // indirect + golang.org/x/tools v0.15.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect + lukechampine.com/uint128 v1.3.0 // indirect + modernc.org/cc/v3 v3.41.0 // indirect + modernc.org/ccgo/v3 v3.16.15 // indirect + modernc.org/libc v1.34.9 // indirect + modernc.org/mathutil v1.6.0 // indirect + modernc.org/memory v1.7.2 // indirect + modernc.org/opt v0.1.3 // indirect + modernc.org/sqlite v1.27.0 // indirect + modernc.org/strutil v1.2.0 // indirect + modernc.org/token v1.1.0 // indirect ) - -replace github.com/scionproto/scion => github.com/netsec-ethz/scion v0.6.1-0.20220422080039-25976708fd6b diff --git a/src/lib/scion_drkey/go.sum b/src/lib/scion_drkey/go.sum index e96a4fe..592532b 100644 --- a/src/lib/scion_drkey/go.sum +++ b/src/lib/scion_drkey/go.sum @@ -1,1159 +1,117 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= -dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= -dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= -git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4 v0.0.0-20181218183524-be58ebffde8e/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/bazelbuild/rules_go v0.29.0/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= -github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/buildkite/go-buildkite/v2 v2.8.1/go.mod h1:kRCClqF2FuCFK42+Jk8ggYUMMAQXJC3uMjBt6W/ajJ0= -github.com/cenkalti/backoff v1.1.1-0.20171020064038-309aa717adbf/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dchest/cmac v0.0.0-20150527144652-62ff55a1048c h1:qoavXEzRRUfup81LsDQv4fnUQbLyorpPz6WxiwdiU7A= -github.com/dchest/cmac v0.0.0-20150527144652-62ff55a1048c/go.mod h1:vWqNmss2I/DL9JKC95Lkwp+lzw+v8hwsQs7hQKyQpwk= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= -github.com/deepmap/oapi-codegen v1.9.0/go.mod h1:7t4DbSxmAffcTEgrWvsPYEE2aOARZ8ZKWp3hDuZkHNc= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emojisum/emojisum v0.0.0-20210601164913-cb9db27ebae2/go.mod h1:WC2DpT1Je6GNGFgfBtMSrjTnWwb24TYpNin8zB4jIuI= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/getkin/kin-openapi v0.80.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.7.4/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= -github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-chi/chi/v5 v5.0.2/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-chi/cors v1.1.1/go.mod h1:K2Yje0VW/SJzxiyMYu6iPQYa7hMjQX2i/F491VChg1I= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-playground/validator/v10 v10.9.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/goccy/go-json v0.7.8/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/dchest/cmac v1.0.0 h1:Vaorm9FVpO2P+YmRdH0RVCUB1XF3Ge1yg9scPvJphyk= +github.com/dchest/cmac v1.0.0/go.mod h1:0zViPqHm8iZwwMl1cuK3HqK7Tu4Q7DV4EuMIOUwBVQ0= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/go-querystring v1.0.1-0.20190318165438-c8c88dbee036/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gopacket v1.1.16-0.20190123011826-102d5ca2098c h1:eR3RuANqlK0CQoHJxUdXQNsco+gJykcti01+wqBCuPs= -github.com/google/gopacket v1.1.16-0.20190123011826-102d5ca2098c/go.mod h1:UCLx9mCmAwsVbn6qQl1WIEt2SO7Nd2fD0th1TBAsqBw= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= -github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/iancoleman/strcase v0.0.0-20190422225806-e506e3ef7365/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= -github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ= -github.com/lestrrat-go/codegen v1.0.2/go.mod h1:JhJw6OQAuPEfVKUCLItpaVLumDGWQznd1VaXrBk9TdM= -github.com/lestrrat-go/httpcc v1.0.0/go.mod h1:tGS/u00Vh5N6FHNkExqGGNId8e0Big+++0Gf8MBnAvE= -github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= -github.com/lestrrat-go/jwx v1.2.7/go.mod h1:bw24IXWbavc0R2RsOtpXL7RtMyP589yZ1+L7kd09ZGA= -github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= -github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= -github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= -github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= -github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= -github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-sqlite3 v1.14.4 h1:4rQjbDxdu9fSgI/r3KN72G3c2goxknAqHHgPWWs8UlI= -github.com/mattn/go-sqlite3 v1.14.4/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/mdlayher/raw v0.0.0-20191009151244-50f2db8cc065/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg= -github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= -github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= -github.com/netsec-ethz/scion v0.6.1-0.20220422080039-25976708fd6b h1:cLQzuQ51QiGVdwGgUZdFh6QyoXAM64YkdWqdGjBgfSg= -github.com/netsec-ethz/scion v0.6.1-0.20220422080039-25976708fd6b/go.mod h1:9EyDb3Bfn7kDmy6v+gHKwl2eIxFo3Reod4TwDaKY5zo= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/patrickmn/go-cache v2.1.1-0.20180815053127-5633e0862627+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= +github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= +github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.0 h1:HRmM4uANZDAjdvbsdfOoqI5UDbjz0faKeMs/cGPKKI0= -github.com/prometheus/common v0.32.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= -github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= -github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= -github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= -github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= -github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= -github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= -github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= -github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= -github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= -github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= -github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= -github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= -github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= -github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= -github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= -github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/songgao/water v0.0.0-20190725173103-fd331bda3f4b/go.mod h1:P5HUIBuIWKbyjl083/loAegFkfbFNx5i2qEP4CNbm7E= -github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= -github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhUPP4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/uber/jaeger-client-go v2.29.1+incompatible h1:R9ec3zO3sGpzs0abd43Y+fBZRJ9uiH6lXyR/+u6brW4= -github.com/uber/jaeger-client-go v2.29.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-lib v2.0.0+incompatible h1:iMSCV0rmXEogjNWPh2D0xk9YVKvrtGoHJNe9ebLu/pw= -github.com/uber/jaeger-lib v2.0.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= -github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go4.org v0.0.0-20180809161055-417644f6feb5 h1:+hE86LblG4AyDgwMCLTE6FOlM9+qjHSYS+rKqxUVdsM= -go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -go4.org/intern v0.0.0-20210108033219-3eb7198706b2 h1:VFTf+jjIgsldaz/Mr00VaCSswHJrI2hIjQygE/W4IMg= -go4.org/intern v0.0.0-20210108033219-3eb7198706b2/go.mod h1:vLqJ+12kCw61iCWsPto0EOHhBS+o4rO5VIucbc9g2Cc= -go4.org/unsafe/assume-no-moving-gc v0.0.0-20201222175341-b30ae309168e/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= -go4.org/unsafe/assume-no-moving-gc v0.0.0-20201222180813-1025295fd063 h1:1tk03FUNpulq2cuWpXZWj649rwJpk0d20rxWiopKRmc= -go4.org/unsafe/assume-no-moving-gc v0.0.0-20201222180813-1025295fd063/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= -golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/scionproto/scion v0.9.1 h1:agRbJ2n2RjI6BdewTqK2Vo0DnjPQ4qRjG00PKMIg8GM= +github.com/scionproto/scion v0.9.1/go.mod h1:5oZGBv6ZI6gK5MgYlZ70FaNUXihxYLrRfolvO3bQAY4= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201217014255-9d1352758620/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= +golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190419010253-1f3472d942ba/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190418153312-f0ce4c0180be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211031064116-611d5d643895/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210114065538-d78b04bdf963/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= +golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= -google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71 h1:z+ErRPu0+KS02Td3fOAgdX+lnPDh/VyaABEJPD4JRQs= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/grpc/examples v0.0.0-20210630181457-52546c5d89b7/go.mod h1:bF8wuZSAZTcbF7ZPKrDI/qY52toTP/yxLpRRY4Eu9Js= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878 h1:lv6/DhyiFFGsmzxbsUUTOkN29II+zeWHxvT8Lpdxsv0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/grpc v1.57.2 h1:uw37EN34aMFFXB2QPW7Tq6tdTbind1GpRxw5aOX3a5k= +google.golang.org/grpc v1.57.2/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -inet.af/netaddr v0.0.0-20210903134321-85fa6c94624e h1:tvgqez5ZQoBBiBAGNU/fmJy247yB/7++kcLOEoMYup0= -inet.af/netaddr v0.0.0-20210903134321-85fa6c94624e/go.mod h1:z0nx+Dh+7N7CC8V5ayHtHGpZpxLQZZxkIaaz6HN65Ls= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= +lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= +modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y= +modernc.org/ccgo/v3 v3.16.15 h1:KbDR3ZAVU+wiLyMESPtbtE/Add4elztFyfsWoNTgxS0= +modernc.org/ccgo/v3 v3.16.15/go.mod h1:yT7B+/E2m43tmMOT51GMoM98/MtHIcQQSleGnddkUNI= +modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v1.34.9 h1:yhQGs5jsWHJIU7jY6nCe8GJw27j+z6xYi0eorwPpGgI= +modernc.org/libc v1.34.9/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.27.0 h1:MpKAHoyYB7xqcwnUwkuD+npwEa0fojF0B5QRbN+auJ8= +modernc.org/sqlite v1.27.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= +modernc.org/tcl v1.15.2/go.mod h1:3+k/ZaEbKrC8ePv8zJWPtBSW0V7Gg9g8rkmhI1Kfs3c= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= +modernc.org/z v1.7.3/go.mod h1:Ipv4tsdxZRbQyLq9Q1M6gdbkxYzdlrciF2Hi/lS7nWE= diff --git a/src/mock/drkey_fetcher_mock.c b/src/mock/drkey_fetcher_mock.c index 97fe472..4eccd93 100644 --- a/src/mock/drkey_fetcher_mock.c +++ b/src/mock/drkey_fetcher_mock.c @@ -5,20 +5,82 @@ #include #include +#include "../drkey.h" #include "../drkey_fetcher.h" +#include "../lf.h" #include "../lib/crypto/crypto.h" #define DRKEY_SIZE 16 #define VALIDITY_PERIOD 10000 /* 10 seconds */ +// TODO: add constant for drkey_service_addr len (48). + +int +lf_drkey_fetcher_host_as_key(const char drkey_service_addr[48], uint64_t src_ia, + uint64_t dst_ia, uint64_t src_addr, uint16_t drkey_protocol, + int64_t val_time_ms, int64_t *validity_not_before, + int64_t *validity_not_after, void *key) +{ + int res; + struct lf_crypto_drkey_ctx drkey_ctx; + struct lf_crypto_drkey sv_drkey, as_as_drkey, host_as_drkey; + struct lf_host_addr fast_side_addr; + fast_side_addr.addr = &src_addr; + fast_side_addr.type_length = LF_HOST_ADDR_TL_IPV4; + + (void)drkey_service_addr; + /* + * Validity period starts and stops at multiples of VALIDITY_PERIOD and has + * a duration of VALIDITY_PERIOD. I.e., the n-th validity period is + * [n*VALIDITY_PERIOD,(n+1)*VALIDITY_PERIOD]. + * With this approach, the DRKey epochs are deterministic, as long as + * VALIDITY_PERIOD is defined. + */ + *validity_not_before = (val_time_ms / VALIDITY_PERIOD) * VALIDITY_PERIOD; + *validity_not_after = + (val_time_ms / VALIDITY_PERIOD) * VALIDITY_PERIOD + VALIDITY_PERIOD; + + /* The DRKey's secret value (SV) has the drkey_protocol identifier (cpu + * endian) as its first two bytes and zeros for the following bytes */ + uint8_t sv[DRKEY_SIZE] = { 0 }; + memcpy(sv, &drkey_protocol, sizeof(drkey_protocol)); + uint8_t buf[16] = { 0 }; + memcpy(buf, &src_ia, sizeof src_ia); + memcpy(buf + 8, &dst_ia, sizeof dst_ia); + + res = lf_crypto_drkey_ctx_init(&drkey_ctx); + if (res != 0) { + return -1; + } + + uint8_t as_as_drkey_buf[DRKEY_SIZE] = { 0 }; + lf_crypto_drkey_from_buf(&drkey_ctx, sv, &sv_drkey); + lf_crypto_drkey_cbcmac(&drkey_ctx, &sv_drkey, buf, 16, as_as_drkey_buf); + + lf_crypto_drkey_from_buf(&drkey_ctx, as_as_drkey_buf, &as_as_drkey); + lf_drkey_derive_host_as_from_as_as(&drkey_ctx, &as_as_drkey, + &fast_side_addr, drkey_protocol, &host_as_drkey); + memcpy(key, host_as_drkey.key, DRKEY_SIZE); + + lf_crypto_drkey_ctx_close(&drkey_ctx); + + return 0; +} + int -lf_drkey_fetcher_as_as_key(const char drkey_service_addr[48], uint64_t src_ia, - uint64_t dst_ia, uint16_t drkey_protocol, int64_t val_time_ms, +lf_drkey_fetcher_host_host_key(const char drkey_service_addr[48], + uint64_t src_ia, uint64_t dst_ia, uint64_t src_addr, uint64_t dst_addr, + uint16_t drkey_protocol, int64_t val_time_ms, int64_t *validity_not_before, int64_t *validity_not_after, void *key) { int res; struct lf_crypto_drkey_ctx drkey_ctx; - struct lf_crypto_drkey sv_drkey; + struct lf_crypto_drkey sv_drkey, as_as_drkey, host_host_drkey; + struct lf_host_addr fast_side_addr, slow_side_addr; + fast_side_addr.addr = &src_addr; + fast_side_addr.type_length = LF_HOST_ADDR_TL_IPV4; + slow_side_addr.addr = &dst_addr; + slow_side_addr.type_length = LF_HOST_ADDR_TL_IPV4; (void)drkey_service_addr; /* @@ -34,9 +96,9 @@ lf_drkey_fetcher_as_as_key(const char drkey_service_addr[48], uint64_t src_ia, /* The DRKey's secret value (SV) has the drkey_protocol identifier (cpu * endian) as its first two bytes and zeros for the following bytes */ - uint8_t sv[DRKEY_SIZE] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + uint8_t sv[DRKEY_SIZE] = { 0 }; memcpy(sv, &drkey_protocol, sizeof(drkey_protocol)); - uint8_t buf[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + uint8_t buf[16] = { 0 }; memcpy(buf, &src_ia, sizeof src_ia); memcpy(buf + 8, &dst_ia, sizeof dst_ia); @@ -45,9 +107,16 @@ lf_drkey_fetcher_as_as_key(const char drkey_service_addr[48], uint64_t src_ia, return -1; } + uint8_t as_as_drkey_buf[DRKEY_SIZE] = { 0 }; lf_crypto_drkey_from_buf(&drkey_ctx, sv, &sv_drkey); - lf_crypto_drkey_cbcmac(&drkey_ctx, &sv_drkey, buf, 16, key); + lf_crypto_drkey_cbcmac(&drkey_ctx, &sv_drkey, buf, 16, as_as_drkey_buf); + + lf_crypto_drkey_from_buf(&drkey_ctx, as_as_drkey_buf, &as_as_drkey); + lf_drkey_derive_host_host_from_as_as(&drkey_ctx, &as_as_drkey, + &fast_side_addr, &slow_side_addr, drkey_protocol, &host_host_drkey); + memcpy(key, host_host_drkey.key, DRKEY_SIZE); lf_crypto_drkey_ctx_close(&drkey_ctx); + return 0; -} \ No newline at end of file +} diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index d5f4966..96e272d 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -51,7 +51,7 @@ add_executable(keymanager_test EXCLUDE_FROM_ALL keymanager_test.c) add_test(NAME keymanager_test COMMAND keymanager_test --no-huge) # Dependencies target_sources(keymanager_test PRIVATE log_mock.c) -target_sources(keymanager_test PRIVATE ../keymanager.c ../mock/drkey_fetcher_mock.c ../lib/crypto/crypto.c ../config.c ../lib/ipc/ipc.c) +target_sources(keymanager_test PRIVATE ../mock/drkey_fetcher_mock.c ../keyfetcher.c ../keymanager.c ../lib/crypto/crypto.c ../config.c ../lib/ipc/ipc.c) # DPDK add_definitions(${DPDK_STATIC_CFLAGS}) # TODO: target target_include_directories(keymanager_test PRIVATE ${DPDK_SATIC_INCLUDE_DIRS}) @@ -70,6 +70,7 @@ add_custom_target(keymanager_test_file copy_if_different ${CMAKE_CURRENT_LIST_DIR}/keymanager_test1.json ${CMAKE_CURRENT_LIST_DIR}/keymanager_test2.json + ${CMAKE_CURRENT_LIST_DIR}/keymanager_test3.json ${CMAKE_CURRENT_BINARY_DIR}/ ) add_dependencies(keymanager_test keymanager_test_file) diff --git a/src/test/keymanager_test.c b/src/test/keymanager_test.c index ed7d2ed..ffe244e 100644 --- a/src/test/keymanager_test.c +++ b/src/test/keymanager_test.c @@ -8,6 +8,8 @@ #include #include "../config.h" +#include "../drkey.h" +#include "../keyfetcher.h" #include "../keymanager.h" #include "../lf.h" #include "../lib/log/log.h" @@ -15,6 +17,7 @@ #define TEST1_JSON "keymanager_test1.json" #define TEST2_JSON "keymanager_test2.json" +#define TEST3_JSON "keymanager_test3.json" #define LF_TEST_NO_RCU 1 @@ -97,6 +100,18 @@ new_test_context() return keymanager; } +void +print_keys(uint8_t expected[LF_CRYPTO_DRKEY_SIZE], + uint8_t actual[LF_CRYPTO_DRKEY_SIZE]) +{ + printf("Expected: \t"); + for (int i = 0; i < LF_CRYPTO_DRKEY_SIZE; i++) + printf("%02hhx", expected[i]); + printf("\nGot: \t\t"); + for (int i = 0; i < LF_CRYPTO_DRKEY_SIZE; i++) printf("%02hhx", actual[i]); + printf("\n"); +} + int test1() { @@ -162,13 +177,14 @@ test1() error_count += 1; } - ns_now = ns_now + 20 * LF_TIME_NS_IN_S; /* 20 seconds (the validity period - of the mock keys is 10 seconds) */ + ns_now = + ns_now + + 3 * 24 * 3600 * LF_TIME_NS_IN_S; // 3 days (the max validity period) res = lf_keymanager_worker_inbound_get_drkey(kmw, config->peers->isd_as, &src_host_addr, &dst_host_addr, config->peers->drkey_protocol, ns_now, 0, &drkey); if (res != -2) { - printf("Error: ns_now = ns_now + 20*1e9; " + printf("Error: ns_now = ns_now + 3*24*3600*1e9; " "lf_keymanager_worker_inbound_get_drkey (expected = -2, res = " "%d)\n", res); @@ -179,7 +195,7 @@ test1() &dst_host_addr, &src_host_addr, config->peers->drkey_protocol, ns_now, &drkey); if (res != -2) { - printf("Error: ns_now = ns_now + 20*1e9; " + printf("Error: ns_now = ns_now + 3*24*3600*1e9; " "lf_keymanager_worker_outbound_get_drkey (expected = -2, res = " "%d)\n", res); @@ -279,6 +295,7 @@ test2() if (memcmp(&drkey1, &drkey2, sizeof(drkey1)) != 0) { printf("Error: DRKey are not the same\n"); error_count += 1; + print_keys(drkey1.key, drkey2.key); } free_test_context(km1); @@ -287,6 +304,207 @@ test2() return error_count; } +/** + * Test that the DRKey derivation is correct. + * + * @return int + */ +int +test3() +{ + int error_count = 0; + struct lf_keymanager *km; + struct lf_keymanager_worker *kmw; + struct lf_crypto_drkey drkey; + struct lf_crypto_drkey as_as_zero_drkey, as_as_drkey; + struct lf_host_addr src_host_addr; + struct lf_host_addr dst_host_addr; + + const uint8_t zero_key[LF_CRYPTO_DRKEY_SIZE] = { 0 }; + const uint8_t random_key[LF_CRYPTO_DRKEY_SIZE] = { 0x01, 0x23, 0x45, 0x67, + 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, + 0xef }; + + uint32_t src_addr = 0; + uint32_t dst_addr = 0; + + src_host_addr.addr = &src_addr; + src_host_addr.type_length = 0x0; + dst_host_addr.addr = &dst_addr; + dst_host_addr.type_length = 0x0; + + km = new_test_context(); + if (km == NULL) { + return 1; + } + kmw = &km->workers[0]; + + lf_crypto_drkey_from_buf(&kmw->drkey_ctx, zero_key, &as_as_zero_drkey); + lf_crypto_drkey_from_buf(&kmw->drkey_ctx, random_key, &as_as_drkey); + + // test most general derivation + uint8_t expected_key_1[LF_CRYPTO_DRKEY_SIZE] = { 0x82, 0x67, 0xa4, 0xe9, + 0x10, 0x60, 0x8f, 0xa8, 0xdd, 0x46, 0xb1, 0x1b, 0x43, 0x95, 0x97, + 0x49 }; + lf_drkey_derive_host_host_from_as_as(&kmw->drkey_ctx, &as_as_zero_drkey, + &src_host_addr, &dst_host_addr, 0, &drkey); + + if (memcmp(expected_key_1, drkey.key, sizeof expected_key_1) != 0) { + printf("Error: DRKey derivation wrong\n"); + print_keys(expected_key_1, drkey.key); + error_count += 1; + } + + // test IPv4 addresses + src_addr = 0x0202f80a; // 10.248.2.2 + dst_addr = 0x0505f80a; // 10.248.5.5 + + uint8_t expected_key_2[LF_CRYPTO_DRKEY_SIZE] = { 0x75, 0xde, 0xfa, 0x86, + 0xd5, 0x6d, 0x26, 0x5b, 0x0c, 0xc7, 0xe6, 0x31, 0x3a, 0x9a, 0x13, + 0x14 }; + lf_drkey_derive_host_host_from_as_as(&kmw->drkey_ctx, &as_as_drkey, + &src_host_addr, &dst_host_addr, 0, &drkey); + + if (memcmp(expected_key_2, drkey.key, sizeof expected_key_2) != 0) { + printf("Error: DRKey derivation wrong\n"); + print_keys(expected_key_2, drkey.key); + error_count += 1; + } + + // test DRKey protocol number + uint8_t expected_key_3[LF_CRYPTO_DRKEY_SIZE] = { 0x81, 0xc0, 0x7f, 0xbc, + 0x5c, 0xdd, 0xb1, 0xda, 0x18, 0xaa, 0xa0, 0x56, 0xbc, 0x22, 0xef, + 0x56 }; + lf_drkey_derive_host_host_from_as_as(&kmw->drkey_ctx, &as_as_drkey, + &src_host_addr, &dst_host_addr, 0x0300, &drkey); + + if (memcmp(expected_key_3, drkey.key, sizeof expected_key_3) != 0) { + printf("Error: DRKey derivation wrong\n"); + print_keys(expected_key_3, drkey.key); + error_count += 1; + } + + // test IPv4 as IPv6 addresses + uint8_t src_addr_ipv6[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x0a, 0xf8, 0x02, 0x02 }; // 10.248.2.2 + uint8_t dst_addr_ipv6[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x0a, 0xf8, 0x05, 0x05 }; // 10.248.5.5 + + src_host_addr.addr = &src_addr_ipv6; + src_host_addr.type_length = 0x03; + dst_host_addr.addr = &dst_addr_ipv6; + dst_host_addr.type_length = 0x03; + + lf_drkey_derive_host_host_from_as_as(&kmw->drkey_ctx, &as_as_drkey, + &src_host_addr, &dst_host_addr, 0, &drkey); + + if (memcmp(expected_key_2, drkey.key, sizeof expected_key_2) != 0) { + printf("Error: DRKey derivation wrong\n"); + print_keys(expected_key_2, drkey.key); + error_count += 1; + } + + free_test_context(km); + + return error_count; +} + +/** + * Test that the config replacement changes keys as expected. + * + * @return int + */ +int +test4() +{ + int res = 0, error_count = 0; + struct lf_keymanager *km = NULL; + struct lf_config *config1 = NULL; + struct lf_config *config3 = NULL; + uint64_t ns_timestamp = 1702422000 * LF_TIME_NS_IN_S; + + struct lf_keymanager_dictionary_key key; + struct lf_keyfetcher_sv_dictionary_data *shared_secret_node; + struct lf_keymanager_key_container asas_key1, asas_key3; + + km = new_test_context(); + if (km == NULL) { + return 1; + } + + config1 = lf_config_new_from_file(TEST1_JSON); + if (config1 == NULL) { + printf("Error: lf_config_new_from_file\n"); + error_count = 1; + goto exit; + } + + res = lf_keymanager_apply_config(km, config1); + if (res != 0) { + printf("Error: lf_keymanager_apply_config\n"); + error_count = 1; + goto exit; + } + + key.as = config1->peers->isd_as; + key.drkey_protocol = config1->peers->drkey_protocol; + res = lf_keyfetcher_fetch_as_as_key(km->fetcher, km->src_as, key.as, + key.drkey_protocol, ns_timestamp, &asas_key1); + if (res != 0) { + printf("Error: lf_keymanager_derive_shared_key\n"); + error_count += 1; + } + + config3 = lf_config_new_from_file(TEST3_JSON); + if (config3 == NULL) { + printf("Error: lf_config_new_from_file\n"); + error_count = 1; + goto exit; + } + + // apply new config with additional key + res = lf_keymanager_apply_config(km, config3); + if (res != 0) { + printf("Error: lf_keymanager_apply_config\n"); + error_count = 1; + goto exit; + } + + res = rte_hash_lookup_data(km->fetcher->dict, &key, + (void **)&shared_secret_node); + if (res != 0) { + printf("Error: rte_hash_lookup_data\n"); + error_count = 1; + goto exit; + } + + res = lf_keyfetcher_fetch_as_as_key(km->fetcher, km->src_as, key.as, + key.drkey_protocol, ns_timestamp, &asas_key3); + if (res != 0) { + printf("Error: lf_keymanager_derive_shared_key\n"); + error_count += 1; + } + + if (memcmp(asas_key1.key.key, asas_key3.key.key, + sizeof asas_key1.key.key) == 0) { + printf("Error: Key replacement failed\n"); + error_count += 1; + } + +exit: + if (config3 != NULL) { + free(config3); + } + if (config1 != NULL) { + free(config1); + } + if (km != NULL) { + free_test_context(km); + } + + return error_count; +} + int main(int argc, char *argv[]) { @@ -298,6 +516,8 @@ main(int argc, char *argv[]) error_counter += test1(); error_counter += test2(); + error_counter += test3(); + error_counter += test4(); if (error_counter > 0) { printf("Error Count: %d\n", error_counter); diff --git a/src/test/keymanager_test1.json b/src/test/keymanager_test1.json index e20ba40..8867400 100644 --- a/src/test/keymanager_test1.json +++ b/src/test/keymanager_test1.json @@ -1,13 +1,26 @@ { "isd_as": "1-1", + "drkey_protocol": 3, "peers": [ { "isd_as": "2-1", - "drkey_protocol": 3 + "drkey_protocol": 3, + "shared_secrets": [ + { + "sv": "0123456789abcdef0123456789abcdef", + "not_before": "2023-11-29T00:00:00" + } + ] }, { "isd_as": "4-0", - "drkey_protocol": 3 + "drkey_protocol": 3, + "shared_secrets": [ + { + "sv": "0000000000000000fedcba9876543210", + "not_before": "2023-11-29T00:00:00" + } + ] } ] } \ No newline at end of file diff --git a/src/test/keymanager_test2.json b/src/test/keymanager_test2.json index 72df355..f8c79bb 100644 --- a/src/test/keymanager_test2.json +++ b/src/test/keymanager_test2.json @@ -1,13 +1,26 @@ { "isd_as": "2-1", + "drkey_protocol": 3, "peers": [ { "isd_as": "1-1", - "drkey_protocol": 3 + "drkey_protocol": 3, + "shared_secrets": [ + { + "sv": "0123456789abcdef0123456789abcdef", + "not_before": "2023-11-29T00:00:00" + } + ] }, { "isd_as": "4-0", - "drkey_protocol": 3 + "drkey_protocol": 3, + "shared_secrets": [ + { + "sv": "0000000000000000fedcba9876543210", + "not_before": "2023-11-29T00:00:00" + } + ] } ] } \ No newline at end of file diff --git a/src/test/keymanager_test3.json b/src/test/keymanager_test3.json new file mode 100644 index 0000000..be1b285 --- /dev/null +++ b/src/test/keymanager_test3.json @@ -0,0 +1,20 @@ +{ + "isd_as": "1-1", + "drkey_protocol": 3, + "peers": [ + { + "isd_as": "2-1", + "drkey_protocol": 3, + "shared_secrets": [ + { + "sv": "0123456789abcdef0123456789abcdef", + "not_before": "2023-11-29T00:00:00" + }, + { + "sv": "fedcba9876543210fedcba9876543210", + "not_before": "2023-12-01T00:00:00" + } + ] + } + ] +} \ No newline at end of file diff --git a/test/testnet_ip/config/lf1.json b/test/testnet_ip/config/lf1.json index 693d959..0474f75 100644 --- a/test/testnet_ip/config/lf1.json +++ b/test/testnet_ip/config/lf1.json @@ -13,7 +13,13 @@ "ratelimit": { "byte_rate": 9223372036854775807, "packet_rate": 9223372036854775807 - } + }, + "shared_secrets": [ + { + "sv": "00000000000000000123456789abcdef", + "not_before": "2023-11-29T00:00:00" + } + ] }, { "isd_as": "2-1", @@ -22,7 +28,13 @@ "byte_rate": 9223372036854775807, "packet_rate": 9223372036854775807 }, - "ip": "10.248.2.1" + "ip": "10.248.2.1", + "shared_secrets": [ + { + "sv": "0123456789abcdef0123456789abcdef", + "not_before": "2023-11-29T00:00:00" + } + ] } ], "inbound": { diff --git a/test/testnet_ip/config/lf2.json b/test/testnet_ip/config/lf2.json index 0789af9..4e58643 100644 --- a/test/testnet_ip/config/lf2.json +++ b/test/testnet_ip/config/lf2.json @@ -13,7 +13,13 @@ "ratelimit": { "byte_rate": 9223372036854775807, "packet_rate": 9223372036854775807 - } + }, + "shared_secrets": [ + { + "sv": "0123456789abcdef0000000000000000", + "not_before": "2023-11-29T00:00:00" + } + ] }, { "isd_as": "1-1", @@ -22,7 +28,13 @@ "byte_rate": 9223372036854775807, "packet_rate": 9223372036854775807 }, - "ip": "10.248.1.1" + "ip": "10.248.1.1", + "shared_secrets": [ + { + "sv": "0123456789abcdef0123456789abcdef", + "not_before": "2023-11-29T00:00:00" + } + ] } ], "inbound": { diff --git a/test/testnet_scion/README.md b/test/testnet_scion/README.md index 81f3b3a..2063049 100644 --- a/test/testnet_scion/README.md +++ b/test/testnet_scion/README.md @@ -32,20 +32,21 @@ To remove the network run The LightningFilter documentation provides instructions to install SCION on a machine (see [docs/SCION.md](../../docs/SCION.md)). For the test setup the following SCION modules are required: -control service (cs), border router (posix-router), dispatcher (dispatcher), daemon (daemon), and the PKI (scion-pki). +control service (control), border router (router), dispatcher (dispatcher), daemon (daemon), and the PKI (scion-pki), and SCION tools like ping (scion). For that run following code in the SCION directory: ``` -go build -o ./bin/ ./go/cs/ -go build -o ./bin/ ./go/posix-router/ -go build -o ./bin/ ./go/dispatcher/ -go build -o ./bin/ ./go/daemon/ -go build -o ./bin/ ./go/scion-pki/ +go build -o ./bin/ ./control/cmd/control +go build -o ./bin/ ./daemon/cmd/daemon +go build -o ./bin/ ./dispatcher/cmd/dispatcher +go build -o ./bin/ ./router/cmd/router +go build -o ./bin/ ./scion/cmd/scion +go build -o ./bin/ ./scion-pki/cmd/scion-pki ``` Optionally also build the SIG: ``` -go build -o ./bin/ ./go/posix-gateway/ +go build -o ./bin/ ./gateway/cmd/gateway ``` ### SCION Topology diff --git a/test/testnet_scion/config/lf_1_ff00_0_111.json b/test/testnet_scion/config/lf_1_ff00_0_111.json index d459300..e780ac0 100644 --- a/test/testnet_scion/config/lf_1_ff00_0_111.json +++ b/test/testnet_scion/config/lf_1_ff00_0_111.json @@ -10,6 +10,12 @@ { "isd_as": "1-ff00:0:112", "drkey_protocol": 3, + "shared_secrets": [ + { + "sv": "0123456789abcdef0123456789abcdef", + "not_before": "2023-11-29T00:00:00" + } + ], "ratelimit": { "byte_rate": 9223372036854775807, "packet_rate": 9223372036854775807 diff --git a/test/testnet_scion/config/lf_1_ff00_0_112.json b/test/testnet_scion/config/lf_1_ff00_0_112.json index cf2c26d..79c6cfd 100644 --- a/test/testnet_scion/config/lf_1_ff00_0_112.json +++ b/test/testnet_scion/config/lf_1_ff00_0_112.json @@ -5,10 +5,17 @@ "byte_rate": 9223372036854775807, "packet_rate": 9223372036854775807 }, + "peers": [ { "isd_as": "1-ff00:0:111", "drkey_protocol": 3, + "shared_secrets": [ + { + "sv": "0123456789abcdef0123456789abcdef", + "not_before": "2023-11-29T00:00:00" + } + ], "ratelimit": { "byte_rate": 9223372036854775807, "packet_rate": 9223372036854775807 diff --git a/test/testnet_scion/scion/gen-topo.sh b/test/testnet_scion/scion/gen-topo.sh index 3624a01..191508b 100755 --- a/test/testnet_scion/scion/gen-topo.sh +++ b/test/testnet_scion/scion/gen-topo.sh @@ -16,7 +16,10 @@ export PYTHONPATH=. printf '#!/bin/bash\necho "0.0.0.0"' > tools/docker-ip echo "Create topology, configuration, and execution files." -python/topology/generator.py -c $SCRIPTPATH/tiny.topo -o $SCRIPTPATH/tmp +tools/topogen.py -c $SCRIPTPATH/tiny.topo -o $SCRIPTPATH/tmp + +export PYTHONPATH=. +$SCRIPTPATH/scion-topo-add-drkey.py popd > /dev/null diff --git a/test/testnet_scion/scion/scion-topo-add-drkey.py b/test/testnet_scion/scion/scion-topo-add-drkey.py new file mode 100755 index 0000000..dd67291 --- /dev/null +++ b/test/testnet_scion/scion/scion-topo-add-drkey.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +import os +from plumbum import local +from acceptance.common import scion + +def main(): + gen_dir = local.path(os.path.dirname(__file__) + "/tmp") + isd_ases = scion.ASList.load(gen_dir / "as_list.yml").all + + for isd_as in isd_ases: + conf_dir = gen_dir / ("AS" + isd_as.as_file_fmt()) + scion.update_toml({ + "drkey": { + "level1_db": { + "connection": "gen-cache/cs%s-1.drkey_level1.db" % isd_as.file_fmt(), + }, + "secret_value_db": { + "connection": "gen-cache/cs%s-1.secret_value.db" % isd_as.file_fmt() + } + } + }, conf_dir // "cs*-1.toml") + scion.update_toml({ + "drkey_level2_db": { + "connection": "gen-cache/sd%s.drkey_level2.db" % isd_as.file_fmt() + } + }, conf_dir // "sd.toml") + +if __name__ == "__main__": + main() diff --git a/test/testnet_scion/scion/template/ASff00_0_110/cs1-ff00_0_110-1.toml b/test/testnet_scion/scion/template/ASff00_0_110/cs1-ff00_0_110-1.toml index 5e6a0ff..947f4b4 100644 --- a/test/testnet_scion/scion/template/ASff00_0_110/cs1-ff00_0_110-1.toml +++ b/test/testnet_scion/scion/template/ASff00_0_110/cs1-ff00_0_110-1.toml @@ -31,11 +31,8 @@ mode = "in-process" [log.console] level = "debug" -[drkey.lvl1_db] -connection = "gen-cache/cs1-ff00_0_110-1.lvl1.db" +[drkey.level1_db] +connection = "gen-cache/cs1-ff00_0_110-1.drkey_level1.db" -[drkey.sv_db] -connection = "gen-cache/cs1-ff00_0_110-1.sv.db" - -[drkey.delegation] -colibri = [ "127.0.0.11", "127.0.0.1",] +[drkey.secret_value_db] +connection = "gen-cache/cs1-ff00_0_110-1.secret_value.db" diff --git a/test/testnet_scion/scion/template/ASff00_0_110/sd.toml b/test/testnet_scion/scion/template/ASff00_0_110/sd.toml index 27a3795..ad2fa98 100644 --- a/test/testnet_scion/scion/template/ASff00_0_110/sd.toml +++ b/test/testnet_scion/scion/template/ASff00_0_110/sd.toml @@ -9,12 +9,11 @@ connection = "gen-cache/sd1-ff00_0_110.trust.db" [path_db] connection = "gen-cache/sd1-ff00_0_110.path.db" -[drkey_lvl2_db] -connection = "gen-cache/sd1-ff00_0_110.drkey.db" +[drkey_level2_db] +connection = "gen-cache/sd1-ff00_0_110.drkey_level2.db" [sd] address = "127.0.0.13:30255" -bind_dialer_to_address = true [tracing] enabled = true diff --git a/test/testnet_scion/scion/template/ASff00_0_111/cs1-ff00_0_111-1.toml b/test/testnet_scion/scion/template/ASff00_0_111/cs1-ff00_0_111-1.toml index ea766ec..546c291 100644 --- a/test/testnet_scion/scion/template/ASff00_0_111/cs1-ff00_0_111-1.toml +++ b/test/testnet_scion/scion/template/ASff00_0_111/cs1-ff00_0_111-1.toml @@ -28,11 +28,8 @@ addr = "127.0.0.19:31152" [log.console] level = "debug" -[drkey.lvl1_db] -connection = "gen-cache/cs1-ff00_0_111-1.lvl1.db" +[drkey.level1_db] +connection = "gen-cache/cs1-ff00_0_111-1.drkey_level1.db" -[drkey.sv_db] -connection = "gen-cache/cs1-ff00_0_111-1.sv.db" - -[drkey.delegation] -colibri = [ "10.248.7.1", "10.248.7.2",] +[drkey.secret_value_db] +connection = "gen-cache/cs1-ff00_0_111-1.secret_value.db" diff --git a/test/testnet_scion/scion/template/ASff00_0_111/sd.toml b/test/testnet_scion/scion/template/ASff00_0_111/sd.toml index 4965ef1..04414dc 100644 --- a/test/testnet_scion/scion/template/ASff00_0_111/sd.toml +++ b/test/testnet_scion/scion/template/ASff00_0_111/sd.toml @@ -9,12 +9,11 @@ connection = "gen-cache/sd1-ff00_0_111.trust.db" [path_db] connection = "gen-cache/sd1-ff00_0_111.path.db" -[drkey_lvl2_db] -connection = "gen-cache/sd1-ff00_0_111.drkey.db" +[drkey_level2_db] +connection = "gen-cache/sd1-ff00_0_111.drkey_level2.db" [sd] address = "127.0.0.20:30255" -bind_dialer_to_address = true [tracing] enabled = true diff --git a/test/testnet_scion/scion/template/ASff00_0_112/cs1-ff00_0_112-1.toml b/test/testnet_scion/scion/template/ASff00_0_112/cs1-ff00_0_112-1.toml index 9a21caa..b009f9c 100644 --- a/test/testnet_scion/scion/template/ASff00_0_112/cs1-ff00_0_112-1.toml +++ b/test/testnet_scion/scion/template/ASff00_0_112/cs1-ff00_0_112-1.toml @@ -28,11 +28,8 @@ addr = "127.0.0.27:31152" [log.console] level = "debug" -[drkey.lvl1_db] -connection = "gen-cache/cs1-ff00_0_112-1.lvl1.db" +[drkey.level1_db] +connection = "gen-cache/cs1-ff00_0_112-1.drkey_level1.db" -[drkey.sv_db] -connection = "gen-cache/cs1-ff00_0_112-1.sv.db" - -[drkey.delegation] -colibri = [ "10.248.8.1", "10.248.8.2",] +[drkey.secret_value_db] +connection = "gen-cache/cs1-ff00_0_112-1.secret_value.db" diff --git a/test/testnet_scion/scion/template/ASff00_0_112/sd.toml b/test/testnet_scion/scion/template/ASff00_0_112/sd.toml index 378142c..8919362 100644 --- a/test/testnet_scion/scion/template/ASff00_0_112/sd.toml +++ b/test/testnet_scion/scion/template/ASff00_0_112/sd.toml @@ -9,12 +9,11 @@ connection = "gen-cache/sd1-ff00_0_112.trust.db" [path_db] connection = "gen-cache/sd1-ff00_0_112.path.db" -[drkey_lvl2_db] -connection = "gen-cache/sd1-ff00_0_112.drkey.db" +[drkey_level2_db] +connection = "gen-cache/sd1-ff00_0_112.drkey_level2.db" [sd] address = "127.0.0.28:30255" -bind_dialer_to_address = true [tracing] enabled = true diff --git a/test/testnet_scion/scion/template/supervisord.conf b/test/testnet_scion/scion/template/supervisord.conf index bb91cb8..8ab5829 100644 --- a/test/testnet_scion/scion/template/supervisord.conf +++ b/test/testnet_scion/scion/template/supervisord.conf @@ -8,7 +8,7 @@ startretries = 0 startsecs = 5 priority = 100 user = %(ENV_SCION_USER)s -command = %(ENV_SCION_BIN)s/posix-router --config gen/ASff00_0_110/br1-ff00_0_110-1.toml +command = %(ENV_SCION_BIN)s/router --config gen/ASff00_0_110/br1-ff00_0_110-1.toml [program:br1-ff00_0_110-2] autostart = false @@ -20,7 +20,7 @@ startretries = 0 startsecs = 5 priority = 100 user = %(ENV_SCION_USER)s -command = %(ENV_SCION_BIN)s/posix-router --config gen/ASff00_0_110/br1-ff00_0_110-2.toml +command = %(ENV_SCION_BIN)s/router --config gen/ASff00_0_110/br1-ff00_0_110-2.toml [program:cs1-ff00_0_110-1] autostart = false @@ -32,7 +32,7 @@ startretries = 0 startsecs = 5 priority = 100 user = %(ENV_SCION_USER)s -command = %(ENV_SCION_BIN)s/cs --config gen/ASff00_0_110/cs1-ff00_0_110-1.toml +command = %(ENV_SCION_BIN)s/control --config gen/ASff00_0_110/cs1-ff00_0_110-1.toml [program:sd1-ff00_0_110] autostart = false @@ -59,7 +59,7 @@ redirect_stderr = True startretries = 0 startsecs = 5 priority = 100 -command = %(ENV_SCION_BIN)s/posix-router --config gen/ASff00_0_111/br1-ff00_0_111-1.toml +command = %(ENV_SCION_BIN)s/router --config gen/ASff00_0_111/br1-ff00_0_111-1.toml [program:cs1-ff00_0_111-1] autostart = false @@ -71,7 +71,7 @@ startretries = 0 startsecs = 5 priority = 100 user = %(ENV_SCION_USER)s -command = %(ENV_SCION_BIN)s/cs --config gen/ASff00_0_111/cs1-ff00_0_111-1.toml +command = %(ENV_SCION_BIN)s/control --config gen/ASff00_0_111/cs1-ff00_0_111-1.toml [program:sd1-ff00_0_111] autostart = false @@ -99,7 +99,7 @@ startretries = 0 startsecs = 5 priority = 100 user = %(ENV_SCION_USER)s -command = %(ENV_SCION_BIN)s/posix-router --config gen/ASff00_0_112/br1-ff00_0_112-1.toml +command = %(ENV_SCION_BIN)s/router --config gen/ASff00_0_112/br1-ff00_0_112-1.toml [program:cs1-ff00_0_112-1] autostart = false @@ -111,7 +111,7 @@ startretries = 0 startsecs = 5 priority = 100 user = %(ENV_SCION_USER)s -command = %(ENV_SCION_BIN)s/cs --config gen/ASff00_0_112/cs1-ff00_0_112-1.toml +command = %(ENV_SCION_BIN)s/control --config gen/ASff00_0_112/cs1-ff00_0_112-1.toml [program:sd1-ff00_0_112] autostart = false @@ -176,7 +176,7 @@ startsecs = 5 priority = 10 user = root environment = SCION_DISPATCHER="/run/shm/dispatcher/endhost1-ff00_0_111.sock" -command = ip netns exec far-0 %(ENV_SCION_BIN)s/posix-gateway --config gen-eh/ASff00_0_111/sig.toml +command = ip netns exec far-0 %(ENV_SCION_BIN)s/gateway --config gen-eh/ASff00_0_111/sig.toml [program:sd1-ff00_0_112-eh] autostart = false @@ -213,7 +213,7 @@ startsecs = 5 priority = 10 user = root environment = SCION_DISPATCHER="/run/shm/dispatcher/endhost1-ff00_0_112.sock" -command = ip netns exec far-1 %(ENV_SCION_BIN)s/posix-gateway --config gen-eh/ASff00_0_112/sig.toml +command = ip netns exec far-1 %(ENV_SCION_BIN)s/gateway --config gen-eh/ASff00_0_112/sig.toml [group:sig-eh] programs = sig1-ff00_0_111-eh,sig1-ff00_0_112-eh \ No newline at end of file diff --git a/test/testnet_scion/scion/template6/supervisord.conf b/test/testnet_scion/scion/template6/supervisord.conf index bb91cb8..890ad20 100644 --- a/test/testnet_scion/scion/template6/supervisord.conf +++ b/test/testnet_scion/scion/template6/supervisord.conf @@ -8,7 +8,7 @@ startretries = 0 startsecs = 5 priority = 100 user = %(ENV_SCION_USER)s -command = %(ENV_SCION_BIN)s/posix-router --config gen/ASff00_0_110/br1-ff00_0_110-1.toml +command = %(ENV_SCION_BIN)s/router --config gen/ASff00_0_110/br1-ff00_0_110-1.toml [program:br1-ff00_0_110-2] autostart = false @@ -20,7 +20,7 @@ startretries = 0 startsecs = 5 priority = 100 user = %(ENV_SCION_USER)s -command = %(ENV_SCION_BIN)s/posix-router --config gen/ASff00_0_110/br1-ff00_0_110-2.toml +command = %(ENV_SCION_BIN)s/router --config gen/ASff00_0_110/br1-ff00_0_110-2.toml [program:cs1-ff00_0_110-1] autostart = false @@ -59,7 +59,7 @@ redirect_stderr = True startretries = 0 startsecs = 5 priority = 100 -command = %(ENV_SCION_BIN)s/posix-router --config gen/ASff00_0_111/br1-ff00_0_111-1.toml +command = %(ENV_SCION_BIN)s/router --config gen/ASff00_0_111/br1-ff00_0_111-1.toml [program:cs1-ff00_0_111-1] autostart = false @@ -99,7 +99,7 @@ startretries = 0 startsecs = 5 priority = 100 user = %(ENV_SCION_USER)s -command = %(ENV_SCION_BIN)s/posix-router --config gen/ASff00_0_112/br1-ff00_0_112-1.toml +command = %(ENV_SCION_BIN)s/router --config gen/ASff00_0_112/br1-ff00_0_112-1.toml [program:cs1-ff00_0_112-1] autostart = false @@ -176,7 +176,7 @@ startsecs = 5 priority = 10 user = root environment = SCION_DISPATCHER="/run/shm/dispatcher/endhost1-ff00_0_111.sock" -command = ip netns exec far-0 %(ENV_SCION_BIN)s/posix-gateway --config gen-eh/ASff00_0_111/sig.toml +command = ip netns exec far-0 %(ENV_SCION_BIN)s/gateway --config gen-eh/ASff00_0_111/sig.toml [program:sd1-ff00_0_112-eh] autostart = false @@ -213,7 +213,7 @@ startsecs = 5 priority = 10 user = root environment = SCION_DISPATCHER="/run/shm/dispatcher/endhost1-ff00_0_112.sock" -command = ip netns exec far-1 %(ENV_SCION_BIN)s/posix-gateway --config gen-eh/ASff00_0_112/sig.toml +command = ip netns exec far-1 %(ENV_SCION_BIN)s/gateway --config gen-eh/ASff00_0_112/sig.toml [group:sig-eh] programs = sig1-ff00_0_111-eh,sig1-ff00_0_112-eh \ No newline at end of file diff --git a/test/testnet_scion/scion/template_eh/ASff00_0_111/sd.toml b/test/testnet_scion/scion/template_eh/ASff00_0_111/sd.toml index 59a65f2..331006b 100644 --- a/test/testnet_scion/scion/template_eh/ASff00_0_111/sd.toml +++ b/test/testnet_scion/scion/template_eh/ASff00_0_111/sd.toml @@ -9,12 +9,11 @@ connection = "gen-cache/sd1-ff00_0_111-eh.trust.db" [path_db] connection = "gen-cache/sd1-ff00_0_111-eh.path.db" -[drkey_lvl2_db] -connection = "gen-cache/sd1-ff00_0_111-eh.drkey.db" +[drkey_level2_db] +connection = "gen-cache/sd1-ff00_0_111-eh.drkey_level2.db" [sd] address = "10.248.3.1:30255" -bind_dialer_to_address = true [tracing] enabled = false diff --git a/test/testnet_scion/scion/template_eh/ASff00_0_112/sd.toml b/test/testnet_scion/scion/template_eh/ASff00_0_112/sd.toml index 065890a..eba251d 100644 --- a/test/testnet_scion/scion/template_eh/ASff00_0_112/sd.toml +++ b/test/testnet_scion/scion/template_eh/ASff00_0_112/sd.toml @@ -9,12 +9,11 @@ connection = "gen-cache/sd1-ff00_0_112-eh.trust.db" [path_db] connection = "gen-cache/sd1-ff00_0_112-eh.path.db" -[drkey_lvl2_db] -connection = "gen-cache/sd1-ff00_0_112-eh.drkey.db" +[drkey_level2_db] +connection = "gen-cache/sd1-ff00_0_112-eh.drkey_level2.db" [sd] address = "10.248.6.1:30255" -bind_dialer_to_address = true [tracing] enabled = false diff --git a/usertools/install_deps.sh b/usertools/install_deps.sh index 22683c4..3f99936 100755 --- a/usertools/install_deps.sh +++ b/usertools/install_deps.sh @@ -63,9 +63,9 @@ popd && popd && popd ####################################### pushd $DEP_DIR # Get source -curl -LO https://go.dev/dl/go1.17.9.linux-amd64.tar.gz -echo "9dacf782028fdfc79120576c872dee488b81257b1c48e9032d122cfdb379cca6 go1.17.9.linux-amd64.tar.gz" | sha256sum -c -sudo tar -C $DEP_DIR -xzf go1.17.9.linux-amd64.tar.gz +curl -LO https://golang.org/dl/go1.21.2.linux-amd64.tar.gz +echo "f5414a770e5e11c6e9674d4cd4dd1f4f630e176d1828d3427ea8ca4211eee90d go1.21.2.linux-amd64.tar.gz" | sha256sum -c +sudo tar -C $DEP_DIR -xzf go1.21.2.linux-amd64.tar.gz # Add to PATH echo >> $ENV_VARS_FILE echo "# set PATH so it includes Go" >> $ENV_VARS_FILE