#include <openssl/ssl.h>
#include <assert.h>
#include <string.h>
#include <algorithm>
#include <utility>
#include <openssl/aead.h>
#include <openssl/bytestring.h>
#include <openssl/curve25519.h>
#include <openssl/err.h>
#include <openssl/hkdf.h>
#include <openssl/hpke.h>
#include <openssl/rand.h>
#include "internal.h"
BSSL_NAMESPACE_BEGIN
static constexpr uint16_t kECHConfigVersion = …;
static const decltype(&EVP_hpke_aes_128_gcm) kSupportedAEADs[] = …;
static const EVP_HPKE_AEAD *get_ech_aead(uint16_t aead_id) { … }
static bool ssl_client_hello_write_without_extensions(
const SSL_CLIENT_HELLO *client_hello, CBB *out) { … }
static bool is_valid_client_hello_inner(SSL *ssl, uint8_t *out_alert,
Span<const uint8_t> body) { … }
bool ssl_decode_client_hello_inner(
SSL *ssl, uint8_t *out_alert, Array<uint8_t> *out_client_hello_inner,
Span<const uint8_t> encoded_client_hello_inner,
const SSL_CLIENT_HELLO *client_hello_outer) { … }
bool ssl_client_hello_decrypt(SSL_HANDSHAKE *hs, uint8_t *out_alert,
bool *out_is_decrypt_error, Array<uint8_t> *out,
const SSL_CLIENT_HELLO *client_hello_outer,
Span<const uint8_t> payload) { … }
static bool is_hex_component(Span<const uint8_t> in) { … }
static bool is_decimal_component(Span<const uint8_t> in) { … }
bool ssl_is_valid_ech_public_name(Span<const uint8_t> public_name) { … }
static bool parse_ech_config(CBS *cbs, ECHConfig *out, bool *out_supported,
bool all_extensions_mandatory) { … }
bool ECHServerConfig::Init(Span<const uint8_t> ech_config,
const EVP_HPKE_KEY *key, bool is_retry_config) { … }
bool ECHServerConfig::SetupContext(EVP_HPKE_CTX *ctx, uint16_t kdf_id,
uint16_t aead_id,
Span<const uint8_t> enc) const { … }
bool ssl_is_valid_ech_config_list(Span<const uint8_t> ech_config_list) { … }
static bool select_ech_cipher_suite(const EVP_HPKE_KDF **out_kdf,
const EVP_HPKE_AEAD **out_aead,
Span<const uint8_t> cipher_suites,
const bool has_aes_hardware) { … }
bool ssl_select_ech_config(SSL_HANDSHAKE *hs, Span<uint8_t> out_enc,
size_t *out_enc_len) { … }
static size_t aead_overhead(const EVP_HPKE_AEAD *aead) { … }
static size_t random_size(size_t min, size_t max) { … }
static bool setup_ech_grease(SSL_HANDSHAKE *hs) { … }
bool ssl_encrypt_client_hello(SSL_HANDSHAKE *hs, Span<const uint8_t> enc) { … }
BSSL_NAMESPACE_END
usingnamespacebssl;
void SSL_set_enable_ech_grease(SSL *ssl, int enable) { … }
int SSL_set1_ech_config_list(SSL *ssl, const uint8_t *ech_config_list,
size_t ech_config_list_len) { … }
void SSL_get0_ech_name_override(const SSL *ssl, const char **out_name,
size_t *out_name_len) { … }
void SSL_get0_ech_retry_configs(
const SSL *ssl, const uint8_t **out_retry_configs,
size_t *out_retry_configs_len) { … }
int SSL_marshal_ech_config(uint8_t **out, size_t *out_len, uint8_t config_id,
const EVP_HPKE_KEY *key, const char *public_name,
size_t max_name_len) { … }
SSL_ECH_KEYS *SSL_ECH_KEYS_new() { … }
void SSL_ECH_KEYS_up_ref(SSL_ECH_KEYS *keys) { … }
void SSL_ECH_KEYS_free(SSL_ECH_KEYS *keys) { … }
int SSL_ECH_KEYS_add(SSL_ECH_KEYS *configs, int is_retry_config,
const uint8_t *ech_config, size_t ech_config_len,
const EVP_HPKE_KEY *key) { … }
int SSL_ECH_KEYS_has_duplicate_config_id(const SSL_ECH_KEYS *keys) { … }
int SSL_ECH_KEYS_marshal_retry_configs(const SSL_ECH_KEYS *keys, uint8_t **out,
size_t *out_len) { … }
int SSL_CTX_set1_ech_keys(SSL_CTX *ctx, SSL_ECH_KEYS *keys) { … }
int SSL_ech_accepted(const SSL *ssl) { … }