Go to the documentation of this file.
30 #include "../internal.h"
35 #define MAX_SEED_LEN X25519_PRIVATE_KEY_LEN
36 #define MAX_SHARED_SECRET_LEN SHA256_DIGEST_LENGTH
47 size_t *out_shared_secret_len,
uint8_t *out_enc,
48 size_t *out_enc_len,
size_t max_enc,
53 size_t *out_shared_secret_len,
const uint8_t *enc,
78 size_t *out_len,
const uint8_t *salt,
79 size_t salt_len,
const uint8_t *suite_id,
80 size_t suite_id_len,
const char *
label,
81 const uint8_t *ikm,
size_t ikm_len) {
90 CBB_len(&labeled_ikm), salt, salt_len);
96 size_t out_len,
const uint8_t *prk,
97 size_t prk_len,
const uint8_t *suite_id,
98 size_t suite_id_len,
const char *
label,
99 const uint8_t *info,
size_t info_len) {
108 HKDF_expand(out_key, out_len, hkdf_md, prk, prk_len,
120 uint8_t *out_key,
size_t out_len,
121 const uint8_t *dh,
size_t dh_len,
123 size_t kem_context_len) {
125 uint8_t suite_id[5] = {
'K',
'E',
'M', kem_id >> 8, kem_id & 0xff};
129 sizeof(suite_id),
"eae_prk", dh, dh_len) &&
131 sizeof(suite_id),
"shared_secret", kem_context,
136 size_t priv_key_len) {
154 size_t *out_shared_secret_len,
uint8_t *out_enc,
size_t *out_enc_len,
155 size_t max_enc,
const uint8_t *peer_public_key,
size_t peer_public_key_len,
180 kem_context,
sizeof(kem_context))) {
190 size_t *out_shared_secret_len,
const uint8_t *enc,
205 kem_context,
sizeof(kem_context))) {
262 const uint8_t *priv_key,
size_t priv_key_len) {
287 size_t *out_len,
size_t max_out) {
288 if (max_out < key->kem->public_key_len) {
293 *out_len =
key->kem->public_key_len;
298 size_t *out_len,
size_t max_out) {
299 if (max_out < key->kem->private_key_len) {
304 *out_len =
key->kem->private_key_len;
346 #define HPKE_SUITE_ID_LEN 10
362 #define HPKE_MODE_BASE 0
365 size_t shared_secret_len,
const uint8_t *info,
374 const EVP_MD *hkdf_md =
ctx->kdf->hkdf_md_func();
376 size_t psk_id_hash_len;
378 suite_id,
sizeof(suite_id),
"psk_id_hash", NULL,
385 size_t info_hash_len;
387 suite_id,
sizeof(suite_id),
"info_hash", info,
398 !
CBB_add_bytes(&context_cbb, psk_id_hash, psk_id_hash_len) ||
400 !
CBB_finish(&context_cbb, NULL, &context_len)) {
408 shared_secret_len, suite_id,
sizeof(suite_id),
409 "secret", NULL, 0)) {
418 sizeof(suite_id),
"key",
context, context_len) ||
427 suite_id,
sizeof(suite_id),
"base_nonce",
context,
434 secret, secret_len, suite_id,
sizeof(suite_id),
435 "exp",
context, context_len)) {
469 size_t *out_enc_len,
size_t max_enc,
472 const uint8_t *peer_public_key,
473 size_t peer_public_key_len,
const uint8_t *info,
478 ctx, out_enc, out_enc_len, max_enc, kem, kdf, aead, peer_public_key,
479 peer_public_key_len, info, info_len,
seed, kem->
seed_len);
485 const uint8_t *peer_public_key,
size_t peer_public_key_len,
493 size_t shared_secret_len;
494 if (!kem->
encap_with_seed(kem, shared_secret, &shared_secret_len, out_enc,
495 out_enc_len, max_enc, peer_public_key,
496 peer_public_key_len,
seed, seed_len) ||
508 size_t enc_len,
const uint8_t *info,
515 size_t shared_secret_len;
516 if (!
key->kem->decap(
key, shared_secret, &shared_secret_len, enc, enc_len) ||
527 assert(nonce_len >= 8);
532 for (
size_t i = 0;
i < 8;
i++) {
533 out_nonce[nonce_len -
i - 1] = seq_copy & 0xff;
538 for (
size_t i = 0;
i < nonce_len;
i++) {
539 out_nonce[
i] ^=
ctx->base_nonce[
i];
544 size_t max_out_len,
const uint8_t *
in,
size_t in_len,
545 const uint8_t *ad,
size_t ad_len) {
546 if (
ctx->is_sender) {
560 nonce_len,
in, in_len, ad, ad_len)) {
568 size_t max_out_len,
const uint8_t *
in,
size_t in_len,
569 const uint8_t *ad,
size_t ad_len) {
570 if (!
ctx->is_sender) {
584 nonce_len,
in, in_len, ad, ad_len)) {
593 size_t context_len) {
598 const EVP_MD *hkdf_md =
ctx->kdf->hkdf_md_func();
601 "sec",
context, context_len)) {
608 assert(
ctx->is_sender);
const EVP_HPKE_KEM * EVP_hpke_x25519_hkdf_sha256(void)
#define EVP_HPKE_DHKEM_X25519_HKDF_SHA256
#define X25519_PRIVATE_KEY_LEN
#define EVP_AEAD_MAX_NONCE_LENGTH
static int hpke_key_schedule(EVP_HPKE_CTX *ctx, const uint8_t *shared_secret, size_t shared_secret_len, const uint8_t *info, size_t info_len)
void EVP_HPKE_CTX_cleanup(EVP_HPKE_CTX *ctx)
#define OPENSSL_PUT_ERROR(library, reason)
static const uint8_t seed[20]
int EVP_HPKE_KEY_init(EVP_HPKE_KEY *key, const EVP_HPKE_KEM *kem, const uint8_t *priv_key, size_t priv_key_len)
static struct test_ctx ctx
static int hpke_build_suite_id(const EVP_HPKE_CTX *ctx, uint8_t out[HPKE_SUITE_ID_LEN])
int EVP_HPKE_KEY_copy(EVP_HPKE_KEY *dst, const EVP_HPKE_KEY *src)
uint16_t EVP_HPKE_KEM_id(const EVP_HPKE_KEM *kem)
#define EVP_AEAD_CTX_aead
const OPENSSL_EXPORT EVP_MD * EVP_sha256(void)
int EVP_HPKE_CTX_export(const EVP_HPKE_CTX *ctx, uint8_t *out, size_t secret_len, const uint8_t *context, size_t context_len)
#define EVP_R_INVALID_PEER_KEY
#define EVP_AEAD_CTX_cleanup
static void * OPENSSL_memset(void *dst, int c, size_t n)
#define EVP_AEAD_CTX_zero
static int x25519_decap(const EVP_HPKE_KEY *key, uint8_t *out_shared_secret, size_t *out_shared_secret_len, const uint8_t *enc, size_t enc_len)
#define EVP_AEAD_nonce_length
int EVP_HPKE_CTX_seal(EVP_HPKE_CTX *ctx, uint8_t *out, size_t *out_len, size_t max_out_len, const uint8_t *in, size_t in_len, const uint8_t *ad, size_t ad_len)
#define EVP_AEAD_DEFAULT_TAG_LENGTH
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_256_gcm(void)
void EVP_HPKE_CTX_free(EVP_HPKE_CTX *ctx)
EVP_HPKE_KEY * EVP_HPKE_KEY_new(void)
#define EVP_R_DECODE_ERROR
const EVP_HPKE_KDF * EVP_hpke_hkdf_sha256(void)
const EVP_HPKE_AEAD * EVP_hpke_chacha20_poly1305(void)
#define ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED
#define EVP_HPKE_HKDF_SHA256
int EVP_HPKE_KEY_generate(EVP_HPKE_KEY *key, const EVP_HPKE_KEM *kem)
#define EVP_HPKE_AES_256_GCM
unsigned __int64 uint64_t
#define EVP_AEAD_CTX_seal
static int hpke_labeled_expand(const EVP_MD *hkdf_md, uint8_t *out_key, size_t out_len, const uint8_t *prk, size_t prk_len, const uint8_t *suite_id, size_t suite_id_len, const char *label, const uint8_t *info, size_t info_len)
static void * OPENSSL_memcpy(void *dst, const void *src, size_t n)
#define MAX_SHARED_SECRET_LEN
#define EVP_AEAD_CTX_init
const EVP_AEAD *(* aead_func)(void)
static int x25519_encap_with_seed(const EVP_HPKE_KEM *kem, uint8_t *out_shared_secret, size_t *out_shared_secret_len, uint8_t *out_enc, size_t *out_enc_len, size_t max_enc, const uint8_t *peer_public_key, size_t peer_public_key_len, const uint8_t *seed, size_t seed_len)
void EVP_HPKE_KEY_cleanup(EVP_HPKE_KEY *key)
uint16_t EVP_HPKE_KDF_id(const EVP_HPKE_KDF *kdf)
static int dhkem_extract_and_expand(uint16_t kem_id, const EVP_MD *hkdf_md, uint8_t *out_key, size_t out_len, const uint8_t *dh, size_t dh_len, const uint8_t *kem_context, size_t kem_context_len)
int EVP_HPKE_KEY_private_key(const EVP_HPKE_KEY *key, uint8_t *out, size_t *out_len, size_t max_out)
int EVP_HPKE_CTX_setup_recipient(EVP_HPKE_CTX *ctx, const EVP_HPKE_KEY *key, const EVP_HPKE_KDF *kdf, const EVP_HPKE_AEAD *aead, const uint8_t *enc, size_t enc_len, const uint8_t *info, size_t info_len)
static const char kHpkeVersionId[]
int EVP_HPKE_KEY_public_key(const EVP_HPKE_KEY *key, uint8_t *out, size_t *out_len, size_t max_out)
#define EVP_AEAD_CTX_open
const EVP_HPKE_KEM * EVP_HPKE_KEY_kem(const EVP_HPKE_KEY *key)
void EVP_HPKE_KEY_free(EVP_HPKE_KEY *key)
#define EVP_AEAD_MAX_KEY_LENGTH
int EVP_HPKE_CTX_setup_sender(EVP_HPKE_CTX *ctx, uint8_t *out_enc, size_t *out_enc_len, size_t max_enc, const EVP_HPKE_KEM *kem, const EVP_HPKE_KDF *kdf, const EVP_HPKE_AEAD *aead, const uint8_t *peer_public_key, size_t peer_public_key_len, const uint8_t *info, size_t info_len)
static int x25519_init_key(EVP_HPKE_KEY *key, const uint8_t *priv_key, size_t priv_key_len)
#define EVP_HPKE_AES_128_GCM
int EVP_HPKE_CTX_setup_sender_with_seed_for_testing(EVP_HPKE_CTX *ctx, uint8_t *out_enc, size_t *out_enc_len, size_t max_enc, const EVP_HPKE_KEM *kem, const EVP_HPKE_KDF *kdf, const EVP_HPKE_AEAD *aead, const uint8_t *peer_public_key, size_t peer_public_key_len, const uint8_t *info, size_t info_len, const uint8_t *seed, size_t seed_len)
#define X25519_public_from_private
int EVP_HPKE_CTX_open(EVP_HPKE_CTX *ctx, uint8_t *out, size_t *out_len, size_t max_out_len, const uint8_t *in, size_t in_len, const uint8_t *ad, size_t ad_len)
UniquePtr< SSL_SESSION > ret
const EVP_HPKE_AEAD * EVP_hpke_aes_256_gcm(void)
#define SHA256_DIGEST_LENGTH
void EVP_HPKE_KEY_zero(EVP_HPKE_KEY *key)
#define EVP_R_INVALID_BUFFER_SIZE
static void hpke_nonce(const EVP_HPKE_CTX *ctx, uint8_t *out_nonce, size_t nonce_len)
#define HPKE_SUITE_ID_LEN
#define EVP_HPKE_CHACHA20_POLY1305
int(* encap_with_seed)(const EVP_HPKE_KEM *kem, uint8_t *out_shared_secret, size_t *out_shared_secret_len, uint8_t *out_enc, size_t *out_enc_len, size_t max_enc, const uint8_t *peer_public_key, size_t peer_public_key_len, const uint8_t *seed, size_t seed_len)
const EVP_AEAD * EVP_HPKE_AEAD_aead(const EVP_HPKE_AEAD *aead)
int(* decap)(const EVP_HPKE_KEY *key, uint8_t *out_shared_secret, size_t *out_shared_secret_len, const uint8_t *enc, size_t enc_len)
#define EVP_aead_chacha20_poly1305
void EVP_HPKE_CTX_zero(EVP_HPKE_CTX *ctx)
int(* init_key)(EVP_HPKE_KEY *key, const uint8_t *priv_key, size_t priv_key_len)
EVP_HPKE_CTX * EVP_HPKE_CTX_new(void)
grpc::ClientContext context
uint16_t EVP_HPKE_AEAD_id(const EVP_HPKE_AEAD *aead)
static int hpke_labeled_extract(const EVP_MD *hkdf_md, uint8_t *out_key, size_t *out_len, const uint8_t *salt, size_t salt_len, const uint8_t *suite_id, size_t suite_id_len, const char *label, const uint8_t *ikm, size_t ikm_len)
#define X25519_SHARED_KEY_LEN
const EVP_HPKE_KDF * EVP_HPKE_CTX_kdf(const EVP_HPKE_CTX *ctx)
#define EVP_AEAD_key_length
#define X25519_PUBLIC_VALUE_LEN
static int add_label_string(CBB *cbb, const char *label)
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_128_gcm(void)
int(* generate_key)(EVP_HPKE_KEY *key)
size_t EVP_HPKE_CTX_max_overhead(const EVP_HPKE_CTX *ctx)
static int x25519_generate_key(EVP_HPKE_KEY *key)
const EVP_HPKE_AEAD * EVP_hpke_aes_128_gcm(void)
const EVP_HPKE_AEAD * EVP_HPKE_CTX_aead(const EVP_HPKE_CTX *ctx)
#define ERR_R_MALLOC_FAILURE
#define EVP_AEAD_max_overhead
grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:01