File syn_cose.h¶
File List > proto > syn_cose.h
Go to the documentation of this file
#ifndef SYN_COSE_H
#define SYN_COSE_H
#if __has_include("syn_config.h")
#include "syn_config.h"
#endif
#if !defined(SYN_USE_COSE) || SYN_USE_COSE
#include "syntropic/common/syn_defs.h"
#include "syntropic/crypto/syn_aes.h"
#include "syntropic/crypto/syn_chacha20poly1305.h"
#include "syntropic/crypto/syn_ed25519.h"
#include "syntropic/crypto/syn_hmac.h"
#include "syntropic/crypto/syn_p256.h"
#include "syntropic/crypto/syn_sha256.h"
#include "syntropic/util/syn_cbor_read.h"
#include "syntropic/util/syn_cbor_write.h"
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/* ── COSE Header Parameter Labels (RFC 9052 Section 3.1) ─────────────────── */
#define SYN_COSE_HEADER_ALG 1
#define SYN_COSE_HEADER_CRIT 2
#define SYN_COSE_HEADER_CONTENT_TYPE 3
#define SYN_COSE_HEADER_KID 4
#define SYN_COSE_HEADER_IV 5
#define SYN_COSE_HEADER_PARTIAL_IV 6
/* ── COSE Key Parameter Labels (RFC 9052 Section 7 / RFC 9053 Section 7) ─── */
#define SYN_COSE_KEY_KTY 1
#define SYN_COSE_KEY_KID 2
#define SYN_COSE_KEY_ALG 3
#define SYN_COSE_KEY_CRV (-1)
#define SYN_COSE_KEY_X (-2)
#define SYN_COSE_KEY_Y (-3)
#define SYN_COSE_KEY_D (-4)
#define SYN_COSE_KEY_K (-1)
/* ── COSE Key Types & Curves ────────────────────────────────────────────── */
typedef enum {
SYN_COSE_KTY_RESERVED = 0,
SYN_COSE_KTY_OKP = 1,
SYN_COSE_KTY_EC2 = 2,
SYN_COSE_KTY_SYMMETRIC = 4
} SYN_COSE_KeyType;
typedef enum {
SYN_COSE_CRV_RESERVED = 0,
SYN_COSE_CRV_P256 = 1,
SYN_COSE_CRV_ED25519 = 6
} SYN_COSE_Curve;
/* ── COSE Algorithm Identifiers (RFC 9053 / IANA COSE Algorithms) ────────── */
typedef enum {
SYN_COSE_ALGO_UNKNOWN = 0,
SYN_COSE_ALGO_A128GCM = 1,
SYN_COSE_ALGO_A192GCM = 2,
SYN_COSE_ALGO_A256GCM = 3,
SYN_COSE_ALGO_HMAC_256_64 = 4,
SYN_COSE_ALGO_HMAC_256_256 = 5,
SYN_COSE_ALGO_AES_CCM_16_64_128 =
10,
SYN_COSE_ALGO_AES_CCM_16_64_256 =
11,
SYN_COSE_ALGO_CHACHA20_POLY1305 = 24,
SYN_COSE_ALGO_AES_CCM_16_128_128 =
30,
SYN_COSE_ALGO_AES_CCM_16_128_256 =
31,
SYN_COSE_ALGO_ES256 = -7,
SYN_COSE_ALGO_EDDSA = -8
} SYN_COSE_Algorithm;
/* ── Constants ──────────────────────────────────────────────────────────── */
#define SYN_COSE_MAX_KID_LEN 32U
#define SYN_COSE_MAX_IV_LEN 16U
#define SYN_COSE_MAX_SIG_LEN 64U
#define SYN_COSE_MAX_TAG_LEN 32U
#define SYN_COSE_MAX_PROTECTED_LEN 64U
/* ── COSE Parsed Message & Key Structures ────────────────────────────────── */
typedef struct {
SYN_COSE_KeyType kty;
SYN_COSE_Algorithm alg;
SYN_COSE_Curve crv;
uint8_t kid[SYN_COSE_MAX_KID_LEN];
size_t kid_len;
uint8_t pub_x[32];
size_t pub_x_len;
uint8_t pub_y[32];
size_t pub_y_len;
uint8_t priv_d[32];
size_t priv_d_len;
} SYN_COSE_Key;
typedef struct {
SYN_COSE_Algorithm alg;
uint8_t kid[SYN_COSE_MAX_KID_LEN];
size_t kid_len;
const uint8_t *payload;
size_t payload_len;
const uint8_t *signature;
size_t signature_len;
uint8_t protected_hdr[SYN_COSE_MAX_PROTECTED_LEN];
size_t protected_hdr_len;
} SYN_COSE_Sign1Message;
typedef struct {
SYN_COSE_Algorithm alg;
uint8_t kid[SYN_COSE_MAX_KID_LEN];
size_t kid_len;
uint8_t iv[SYN_COSE_MAX_IV_LEN];
size_t iv_len;
const uint8_t *ciphertext;
size_t ciphertext_len;
uint8_t protected_hdr[SYN_COSE_MAX_PROTECTED_LEN];
size_t protected_hdr_len;
} SYN_COSE_Encrypt0Message;
typedef struct {
SYN_COSE_Algorithm alg;
uint8_t kid[SYN_COSE_MAX_KID_LEN];
size_t kid_len;
const uint8_t *payload;
size_t payload_len;
const uint8_t *tag;
size_t tag_len;
uint8_t protected_hdr[SYN_COSE_MAX_PROTECTED_LEN];
size_t protected_hdr_len;
} SYN_COSE_Mac0Message;
/* ── COSE_Sign1 API ──────────────────────────────────────────────────────── */
SYN_Status syn_cose_sign1_create(SYN_COSE_Algorithm alg, const uint8_t *secret_key,
const uint8_t *public_key, const uint8_t *kid, size_t kid_len,
const uint8_t *payload, size_t payload_len,
const uint8_t *external_aad, size_t external_aad_len,
uint8_t *out_buf, size_t out_buf_size, size_t *out_len);
SYN_Status syn_cose_sign1_verify(const uint8_t *msg, size_t msg_len, const uint8_t *public_key,
size_t public_key_len, const uint8_t *external_aad,
size_t external_aad_len, SYN_COSE_Sign1Message *parsed_out);
/* ── COSE_Encrypt0 API ───────────────────────────────────────────────────── */
SYN_Status syn_cose_encrypt0_create(SYN_COSE_Algorithm alg, const uint8_t *key, const uint8_t *iv,
size_t iv_len, const uint8_t *kid, size_t kid_len,
const uint8_t *plaintext, size_t plaintext_len,
const uint8_t *external_aad, size_t external_aad_len,
uint8_t *out_buf, size_t out_buf_size, size_t *out_len);
SYN_Status syn_cose_encrypt0_decrypt(const uint8_t *msg, size_t msg_len, const uint8_t *key,
const uint8_t *external_aad, size_t external_aad_len,
uint8_t *out_plaintext, size_t out_plaintext_size,
size_t *out_plaintext_len,
SYN_COSE_Encrypt0Message *parsed_out);
/* ── COSE_Mac0 API ───────────────────────────────────────────────────────── */
SYN_Status syn_cose_mac0_create(SYN_COSE_Algorithm alg, const uint8_t *key, size_t key_len,
const uint8_t *kid, size_t kid_len, const uint8_t *payload,
size_t payload_len, const uint8_t *external_aad,
size_t external_aad_len, uint8_t *out_buf, size_t out_buf_size,
size_t *out_len);
SYN_Status syn_cose_mac0_verify(const uint8_t *msg, size_t msg_len, const uint8_t *key,
size_t key_len, const uint8_t *external_aad,
size_t external_aad_len, SYN_COSE_Mac0Message *parsed_out);
/* ── COSE_Key API ────────────────────────────────────────────────────────── */
SYN_Status syn_cose_key_encode(const SYN_COSE_Key *key, uint8_t *out_buf, size_t out_buf_size,
size_t *out_len);
SYN_Status syn_cose_key_decode(const uint8_t *buf, size_t buf_len, SYN_COSE_Key *key_out);
#ifdef __cplusplus
}
#endif
#endif /* SYN_USE_COSE */
#endif /* SYN_COSE_H */