63#define KEYSTREAM_2_LABEL 0
64#define SALT_3E2M_LABEL 1
68#define SALT_4E3M_LABEL 5
70#define PRK_OUT_LABEL 7
73#define PRK_EXPORTER_LABEL 10
78typedef struct edhoc_config {
89typedef struct edhoc_state {
90 uint8_t suite_selected;
96 uint8_t prk_2e[HASH_LEN];
97 uint8_t prk_3e2m[HASH_LEN];
98 uint8_t prk_4e3m[HASH_LEN];
99 uint8_t gx[ECC_KEY_LEN];
102typedef struct edhoc_buffers {
111 uint8_t id_cred_x[EDHOC_MAX_ID_CRED_LEN];
115typedef struct edhoc_creds {
117 ecc_key_t ephemeral_key;
120typedef struct edhoc_context {
121 edhoc_config_t config;
124 edhoc_buffers_t buffers;
147edhoc_context_t *edhoc_new(
void);
235int16_t
edhoc_kdf(
const uint8_t *prk, uint8_t info_label,
const uint8_t *context, uint8_t context_sz, uint16_t length, uint8_t *result);
258int16_t
edhoc_expand(
const uint8_t *prk,
const uint8_t *info, uint16_t info_sz, uint16_t length, uint8_t *result);
312 uint8_t *msg, uint16_t msg_sz);
326 const uint8_t *cred, uint16_t cred_sz,
327 const uint8_t *plaintext, uint16_t plaintext_sz);
341 const uint8_t *cred, uint16_t cred_sz,
342 const uint8_t *plaintext, uint16_t plaintext_sz);
399 const uint8_t *ks_2e,
400 uint8_t *plaintext, uint16_t plaintext_sz);
434uint8_t
edhoc_calc_mac(
const edhoc_context_t *ctx, uint8_t mac_num,
435 uint8_t mac_len, uint8_t *mac);
ECDH interface for the EDHOC implementation.
EDHOC configuration file.
edhoc_error_t
Unified error type for EDHOC operations.
struct cose_key cose_key_t
KEY length in bytes.
EDHOC message serialization and parsing API.
void edhoc_print_session_info(const edhoc_context_t *ctx)
Print current EDHOC session information for debugging.
int8_t edhoc_generate_transcript_hash_2(edhoc_context_t *ctx, const uint8_t *eph_pub, uint8_t *msg, uint16_t msg_sz)
Generate transcript hash TH_2.
int8_t edhoc_set_config_from_suite(edhoc_context_t *ctx, uint8_t suite)
Set EDHOC configuration parameters based on cipher suite.
uint8_t edhoc_calc_mac(const edhoc_context_t *ctx, uint8_t mac_num, uint8_t mac_len, uint8_t *mac)
Calculate message authentication code (MAC).
uint8_t edhoc_setup_suites(edhoc_context_t *ctx)
Initialize the EDHOC Context with the defined EDHOC parameters.
size_t edhoc_generate_id_cred_x(const cose_key_t *cose, uint8_t *cred, size_t cred_sz)
Generate credential identifier ID_CRED_X.
bool edhoc_generate_prk_2e(edhoc_context_t *ctx)
Generate pseudorandom key PRK_2e.
uint8_t edhoc_get_own_auth_key(edhoc_context_t *ctx, cose_key_t **key)
Retrieve own authentication key from key storage.
int16_t edhoc_kdf(const uint8_t *prk, uint8_t info_label, const uint8_t *context, uint8_t context_sz, uint16_t length, uint8_t *result)
EDHOC Key Derivation Function (KDF) based on HMAC-based Expand (RFC 5869).
void edhoc_print_config_summary(const edhoc_context_t *ctx)
Print EDHOC session configuration summary.
int16_t edhoc_enc_dec_ciphertext_2(const edhoc_context_t *ctx, const uint8_t *ks_2e, uint8_t *plaintext, uint16_t plaintext_sz)
Encrypt/decrypt ciphertext 2 using XOR with keystream.
int16_t edhoc_expand(const uint8_t *prk, const uint8_t *info, uint16_t info_sz, uint16_t length, uint8_t *result)
HMAC-based Key Expansion Function for EDHOC context using HKDF (RFC 5869).
uint8_t edhoc_initialize_context(edhoc_context_t *ctx)
Internal API functions.
int edhoc_authenticate_msg(edhoc_context_t *ctx, uint8_t *ad, bool msg2)
Authenticate the rx message.
edhoc_error_t edhoc_generate_message_1(edhoc_context_t *ctx, uint8_t *ad, size_t ad_sz, bool suite_array)
Generate the EDHOC Message 1 and set it in the EDHOC context.
edhoc_context_t * edhoc_ctx
EDHOC context struct used in the EDHOC protocol.
void edhoc_storage_init(void)
Reserve memory for the EDHOC context struct.
bool edhoc_generate_prk_4e3m(edhoc_context_t *ctx, const ecc_key_t *auth_key, uint8_t gen)
Generate pseudorandom key PRK_4e3m.
bool edhoc_generate_prk_3e2m(edhoc_context_t *ctx, const ecc_key_t *auth_key, uint8_t gen)
Generate pseudorandom key PRK_3e2m.
uint8_t edhoc_generate_error_message(uint8_t *msg_er, size_t msg_er_sz, const edhoc_context_t *ctx, int8_t err)
Generate the EDHOC ERROR Message.
size_t edhoc_generate_cred_x(const cose_key_t *cose, uint8_t *cred, size_t cred_sz)
Generate CBOR-encoded credential CRED_X.
edhoc_error_t edhoc_generate_message_3(edhoc_context_t *ctx, const uint8_t *auth_data, size_t auth_data_size)
Generate the EDHOC Message 3 and set it in the EDHOC context.
uint8_t edhoc_generate_transcript_hash_3(edhoc_context_t *ctx, const uint8_t *cred, uint16_t cred_sz, const uint8_t *plaintext, uint16_t plaintext_sz)
Generate transcript hash TH_3.
int16_t edhoc_generate_keystream_2e(edhoc_context_t *ctx, uint16_t length, uint8_t *ks_2e)
Generate keystream KS_2e for encryption.
void edhoc_finalize(edhoc_context_t *ctx)
Close the EDHOC context.
uint8_t edhoc_generate_transcript_hash_4(edhoc_context_t *ctx, const uint8_t *cred, uint16_t cred_sz, const uint8_t *plaintext, uint16_t plaintext_sz)
Generate transcript hash TH_4.
edhoc_error_t edhoc_generate_message_2(edhoc_context_t *ctx, const uint8_t *auth_data, size_t auth_data_size)
Generate the EDHOC Message 2 and set it in the EDHOC context.
#define EDHOC_SUITES_MAX_COUNT
The max number of suites.
#define EDHOC_MAX_CRED_LEN
Optimized buffer sizes for credentials based on COSE standard analysis CRED_X: 84-120 bytes typical →...
#define EDHOC_MAX_PAYLOAD_LEN
The max length of the EDHOC message.
#define EDHOC_MAX_BUFFER
The max size of the buffers.
#define EDHOC_MAX_CID_LEN
Maximum length of connection identifiers RFC 9528 allows variable-length CIDs including negative inte...