#ifndef PURECRYPTO_H
#define PURECRYPTO_H
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef enum {
PC_OK = 0,
PC_NULL_POINTER = -1,
PC_BUFFER_TOO_SMALL = -2,
PC_BAD_ENCODING = -3,
PC_VERIFICATION = -4,
PC_UNSUPPORTED = -5,
PC_INTERNAL = -6,
PC_WANT_READ = -7,
PC_WANT_WRITE = -8,
PC_WANT_HANDSHAKE = -9,
PC_CLOSED = -10,
PC_TLS_ALERT = -11
} pc_status;
typedef enum {
PC_AEAD_AES128_GCM = 1,
PC_AEAD_AES256_GCM = 2,
PC_AEAD_CHACHA20_POLY1305 = 3,
PC_AEAD_AES128_CCM = 4,
PC_AEAD_AES256_CCM = 5,
PC_AEAD_AES128_CCM8 = 6,
PC_AEAD_AES256_CCM8 = 7,
PC_AEAD_AES128_GCM_SIV = 8,
PC_AEAD_AES256_GCM_SIV = 9,
PC_AEAD_XCHACHA20_POLY1305 = 10,
PC_AEAD_AES128_SIV = 11,
PC_AEAD_AES256_SIV = 12,
PC_AEAD_AEGIS128L = 13,
PC_AEAD_AEGIS256 = 14,
PC_AEAD_ASCON_AEAD128 = 15
} pc_aead_id;
typedef enum {
PC_ARGON2D = 4,
PC_ARGON2I = 5,
PC_ARGON2ID = 6
} pc_argon2_variant;
typedef enum {
PC_SHA224 = 1,
PC_SHA256 = 2,
PC_SHA384 = 3,
PC_SHA512 = 4,
PC_SHA512_224 = 5,
PC_SHA512_256 = 6,
PC_SHA3_224 = 7,
PC_SHA3_256 = 8,
PC_SHA3_384 = 9,
PC_SHA3_512 = 10,
PC_KECCAK256 = 11,
PC_BLAKE2B256 = 12,
PC_BLAKE2B512 = 13,
PC_BLAKE2S256 = 14,
PC_BLAKE3 = 15,
PC_SM3 = 16,
PC_SHA1 = 17,
PC_MD5 = 18,
PC_RIPEMD160 = 19,
PC_ASCON_HASH256 = 20
} pc_hash_id;
typedef enum {
PC_KBKDF_HMAC_SHA256 = 1,
PC_KBKDF_HMAC_SHA384 = 2,
PC_KBKDF_HMAC_SHA512 = 3,
PC_KBKDF_CMAC_AES128 = 4,
PC_KBKDF_CMAC_AES256 = 5
} pc_kbkdf_prf;
typedef enum {
PC_P256 = 1,
PC_P384 = 2,
PC_P521 = 3,
PC_SECP256K1 = 4
} pc_curve;
typedef enum {
PC_ML_KEM_512 = 1,
PC_ML_KEM_768 = 2,
PC_ML_KEM_1024 = 3
} pc_mlkem_set;
typedef enum {
PC_ML_DSA_44 = 1,
PC_ML_DSA_65 = 2,
PC_ML_DSA_87 = 3
} pc_mldsa_set;
typedef enum {
PC_SLH_DSA_SHA2_128S = 1,
PC_SLH_DSA_SHA2_128F = 2,
PC_SLH_DSA_SHA2_192S = 3,
PC_SLH_DSA_SHA2_192F = 4,
PC_SLH_DSA_SHA2_256S = 5,
PC_SLH_DSA_SHA2_256F = 6,
PC_SLH_DSA_SHAKE_128S = 7,
PC_SLH_DSA_SHAKE_128F = 8,
PC_SLH_DSA_SHAKE_192S = 9,
PC_SLH_DSA_SHAKE_192F = 10,
PC_SLH_DSA_SHAKE_256S = 11,
PC_SLH_DSA_SHAKE_256F = 12
} pc_slhdsa_set;
typedef enum {
PC_LMS_SHA256_M32_H5 = 5,
PC_LMS_SHA256_M32_H10 = 6,
PC_LMS_SHA256_M32_H15 = 7,
PC_LMS_SHA256_M32_H20 = 8,
PC_LMS_SHA256_M32_H25 = 9
} pc_lms_type;
typedef enum {
PC_LMOTS_SHA256_N32_W1 = 1,
PC_LMOTS_SHA256_N32_W2 = 2,
PC_LMOTS_SHA256_N32_W4 = 3,
PC_LMOTS_SHA256_N32_W8 = 4
} pc_lmots_type;
typedef struct PcHash PcHash;
typedef struct PcRsaKey PcRsaKey;
typedef struct PcEcKey PcEcKey;
typedef struct PcEd25519Key PcEd25519Key;
typedef struct PcEd448Key PcEd448Key;
typedef struct PcCert PcCert;
typedef struct PcMlKem PcMlKem;
typedef struct PcMlDsa PcMlDsa;
typedef struct PcSlhDsa PcSlhDsa;
typedef struct PcSm2 PcSm2;
typedef struct PcLms PcLms;
typedef struct PcHss PcHss;
typedef struct PcXmss PcXmss;
typedef struct PcXmssMt PcXmssMt;
typedef struct PcCsr PcCsr;
typedef struct PcCrl PcCrl;
typedef struct PcTlsCfg PcTlsCfg;
typedef struct PcTls PcTls;
typedef struct PcQuicCfg PcQuicCfg;
typedef struct PcQuic PcQuic;
typedef enum { PC_TLS_CLIENT = 0, PC_TLS_SERVER = 1 } pc_tls_role;
typedef enum {
PC_TLS_1_2 = 0x0303,
PC_TLS_1_3 = 0x0304,
PC_DTLS_1_2 = (int)0xFEFD,
PC_DTLS_1_3 = (int)0xFEFC
} pc_tls_version;
pc_status pc_digest(int32_t alg, const uint8_t *data, size_t data_len,
uint8_t *out, size_t *out_len);
PcHash *pc_hash_new(int32_t alg);
pc_status pc_hash_update(PcHash *h, const uint8_t *data, size_t len);
pc_status pc_hash_finish(PcHash *h, uint8_t *out, size_t *out_len);
void pc_hash_free(PcHash *h);
pc_status pc_hmac(int32_t alg, const uint8_t *key, size_t key_len,
const uint8_t *msg, size_t msg_len, uint8_t *out,
size_t *out_len);
pc_status pc_aead_encrypt(int32_t alg, const uint8_t *key, size_t key_len,
const uint8_t *nonce, size_t nonce_len,
const uint8_t *aad, size_t aad_len,
const uint8_t *pt, size_t pt_len,
uint8_t *ct_and_tag, size_t *ct_and_tag_len);
pc_status pc_aead_decrypt(int32_t alg, const uint8_t *key, size_t key_len,
const uint8_t *nonce, size_t nonce_len,
const uint8_t *aad, size_t aad_len,
const uint8_t *ct_and_tag, size_t ct_and_tag_len,
uint8_t *pt, size_t *pt_len);
pc_status pc_aes_kw_wrap(const uint8_t *kek, size_t kek_len,
const uint8_t *key, size_t key_len,
uint8_t *out, size_t *out_len);
pc_status pc_aes_kw_unwrap(const uint8_t *kek, size_t kek_len,
const uint8_t *ct, size_t ct_len,
uint8_t *out, size_t *out_len);
pc_status pc_aes_kwp_wrap(const uint8_t *kek, size_t kek_len,
const uint8_t *key, size_t key_len,
uint8_t *out, size_t *out_len);
pc_status pc_aes_kwp_unwrap(const uint8_t *kek, size_t kek_len,
const uint8_t *ct, size_t ct_len,
uint8_t *out, size_t *out_len);
pc_status pc_cmac(const uint8_t *key, size_t key_len,
const uint8_t *msg, size_t msg_len,
uint8_t *out, size_t *out_len);
pc_status pc_gmac(const uint8_t *key, size_t key_len,
const uint8_t *nonce, size_t nonce_len,
const uint8_t *data, size_t data_len,
uint8_t *out, size_t *out_len);
pc_status pc_ascon_xof(const uint8_t *data, size_t data_len,
uint8_t *out, size_t out_len);
pc_status pc_ascon_cxof(const uint8_t *custom, size_t custom_len,
const uint8_t *data, size_t data_len,
uint8_t *out, size_t out_len);
pc_status pc_hkdf(int32_t hash,
const uint8_t *salt, size_t salt_len,
const uint8_t *ikm, size_t ikm_len,
const uint8_t *info, size_t info_len,
uint8_t *out, size_t out_len);
pc_status pc_pbkdf2(int32_t hash,
const uint8_t *pw, size_t pw_len,
const uint8_t *salt, size_t salt_len,
uint32_t iterations,
uint8_t *out, size_t out_len);
pc_status pc_scrypt(const uint8_t *pw, size_t pw_len,
const uint8_t *salt, size_t salt_len,
uint32_t n, uint32_t r, uint32_t p,
uint8_t *out, size_t out_len);
pc_status pc_argon2(int32_t variant,
const uint8_t *pw, size_t pw_len,
const uint8_t *salt, size_t salt_len,
uint32_t t_cost, uint32_t m_cost, uint32_t parallelism,
uint8_t *out, size_t out_len);
pc_status pc_kbkdf_counter(int32_t prf,
const uint8_t *ki, size_t ki_len,
const uint8_t *label, size_t label_len,
const uint8_t *context, size_t context_len,
uint8_t *out, size_t out_len);
pc_status pc_kbkdf_feedback(int32_t prf,
const uint8_t *ki, size_t ki_len,
const uint8_t *iv, size_t iv_len,
const uint8_t *label, size_t label_len,
const uint8_t *context, size_t context_len,
uint8_t *out, size_t out_len);
pc_status pc_rand_bytes(uint8_t *out, size_t len);
PcRsaKey *pc_rsa_generate(uint32_t bits);
PcRsaKey *pc_rsa_from_pem(const uint8_t *pem, size_t len);
pc_status pc_rsa_private_to_pem(const PcRsaKey *key, uint8_t *out,
size_t *out_len);
pc_status pc_rsa_public_to_pem(const PcRsaKey *key, uint8_t *out,
size_t *out_len);
pc_status pc_rsa_sign_pkcs1(const PcRsaKey *key, int32_t alg,
const uint8_t *msg, size_t msg_len, uint8_t *out,
size_t *out_len);
pc_status pc_rsa_verify_pkcs1(const uint8_t *spki, size_t spki_len, int32_t alg,
const uint8_t *msg, size_t msg_len,
const uint8_t *sig, size_t sig_len);
void pc_rsa_free(PcRsaKey *key);
PcEcKey *pc_ec_generate(int32_t curve);
PcEcKey *pc_ec_from_pem(const uint8_t *pem, size_t len);
pc_status pc_ec_private_to_pem(const PcEcKey *key, uint8_t *out,
size_t *out_len);
pc_status pc_ec_public_to_pem(const PcEcKey *key, uint8_t *out, size_t *out_len);
pc_status pc_ec_sign(const PcEcKey *key, const uint8_t *msg, size_t msg_len,
uint8_t *out, size_t *out_len);
pc_status pc_ec_verify(const uint8_t *spki, size_t spki_len, const uint8_t *msg,
size_t msg_len, const uint8_t *sig, size_t sig_len);
void pc_ec_free(PcEcKey *key);
pc_status pc_ecdh(int32_t curve, const uint8_t *priv_be, size_t priv_len,
const uint8_t *peer_spki, size_t peer_spki_len,
uint8_t *out, size_t *out_len);
pc_status pc_x25519(const uint8_t *scalar, const uint8_t *peer, uint8_t *out);
pc_status pc_x25519_public(const uint8_t *scalar, uint8_t *out);
pc_status pc_x448(const uint8_t *scalar, const uint8_t *peer, uint8_t *out);
pc_status pc_x448_public(const uint8_t *scalar, uint8_t *out);
PcEd25519Key *pc_ed25519_generate(void);
PcEd25519Key *pc_ed25519_from_pem(const uint8_t *pem, size_t len);
pc_status pc_ed25519_private_to_pem(const PcEd25519Key *key, uint8_t *out,
size_t *out_len);
pc_status pc_ed25519_public_to_pem(const PcEd25519Key *key, uint8_t *out,
size_t *out_len);
pc_status pc_ed25519_sign(const PcEd25519Key *key, const uint8_t *msg,
size_t msg_len, uint8_t *out, size_t *out_len);
pc_status pc_ed25519_verify(const uint8_t *spki, size_t spki_len,
const uint8_t *msg, size_t msg_len,
const uint8_t *sig, size_t sig_len);
void pc_ed25519_free(PcEd25519Key *key);
PcEd448Key *pc_ed448_generate(void);
PcEd448Key *pc_ed448_from_pem(const uint8_t *pem, size_t len);
pc_status pc_ed448_private_to_pem(const PcEd448Key *key, uint8_t *out,
size_t *out_len);
pc_status pc_ed448_public_to_pem(const PcEd448Key *key, uint8_t *out,
size_t *out_len);
pc_status pc_ed448_sign(const PcEd448Key *key, const uint8_t *msg,
size_t msg_len, uint8_t *out, size_t *out_len);
pc_status pc_ed448_verify(const uint8_t *spki, size_t spki_len,
const uint8_t *msg, size_t msg_len,
const uint8_t *sig, size_t sig_len);
void pc_ed448_free(PcEd448Key *key);
PcCert *pc_cert_from_pem(const uint8_t *pem, size_t len);
PcCert *pc_cert_from_der(const uint8_t *der, size_t len);
pc_status pc_cert_to_der(const PcCert *cert, uint8_t *out, size_t *out_len);
pc_status pc_cert_public_key_spki(const PcCert *cert, uint8_t *out,
size_t *out_len);
pc_status pc_cert_verify(const PcCert *cert, const PcCert *issuer);
void pc_cert_free(PcCert *cert);
pc_status pc_ec_self_signed_pem(const PcEcKey *key, const char *cn,
uint32_t days, uint8_t *out, size_t *out_len);
pc_status pc_rsa_sign_pss(const PcRsaKey *key, int32_t alg,
const uint8_t *msg, size_t msg_len,
uint8_t *out, size_t *out_len);
pc_status pc_rsa_verify_pss(const uint8_t *spki, size_t spki_len, int32_t alg,
const uint8_t *msg, size_t msg_len,
const uint8_t *sig, size_t sig_len);
pc_status pc_rsa_encrypt_oaep(const uint8_t *spki, size_t spki_len, int32_t hash,
const uint8_t *label, size_t label_len,
const uint8_t *pt, size_t pt_len,
uint8_t *out, size_t *out_len);
pc_status pc_rsa_decrypt_oaep(const PcRsaKey *key, int32_t hash,
const uint8_t *label, size_t label_len,
const uint8_t *ct, size_t ct_len,
uint8_t *out, size_t *out_len);
PcMlKem *pc_mlkem_generate(int32_t set);
PcMlKem *pc_mlkem_from_pkcs8_pem(const uint8_t *pem, size_t len);
pc_status pc_mlkem_private_to_pem(const PcMlKem *k, uint8_t *out, size_t *out_len);
pc_status pc_mlkem_public_to_pem(const PcMlKem *k, uint8_t *out, size_t *out_len);
pc_status pc_mlkem_public_to_der(const PcMlKem *k, uint8_t *out, size_t *out_len);
pc_status pc_mlkem_encaps(int32_t set, const uint8_t *ek_spki, size_t ek_spki_len,
uint8_t *ct, size_t *ct_len, uint8_t ss[32]);
pc_status pc_mlkem_decaps(const PcMlKem *k, const uint8_t *ct, size_t ct_len, uint8_t ss[32]);
void pc_mlkem_free(PcMlKem *k);
PcMlDsa *pc_mldsa_generate(int32_t set);
PcMlDsa *pc_mldsa_from_pkcs8_pem(const uint8_t *pem, size_t len);
pc_status pc_mldsa_private_to_pem(const PcMlDsa *k, uint8_t *out, size_t *out_len);
pc_status pc_mldsa_public_to_pem(const PcMlDsa *k, uint8_t *out, size_t *out_len);
pc_status pc_mldsa_sign(const PcMlDsa *k, const uint8_t *msg, size_t msg_len,
uint8_t *out, size_t *out_len);
pc_status pc_mldsa_verify(int32_t set, const uint8_t *spki, size_t spki_len,
const uint8_t *msg, size_t msg_len,
const uint8_t *sig, size_t sig_len);
void pc_mldsa_free(PcMlDsa *k);
PcSlhDsa *pc_slhdsa_generate(int32_t set);
PcSlhDsa *pc_slhdsa_from_pkcs8_pem(const uint8_t *pem, size_t len);
pc_status pc_slhdsa_private_to_pem(const PcSlhDsa *k, uint8_t *out, size_t *out_len);
pc_status pc_slhdsa_public_to_pem(const PcSlhDsa *k, uint8_t *out, size_t *out_len);
pc_status pc_slhdsa_sign(const PcSlhDsa *k, const uint8_t *msg, size_t msg_len,
uint8_t *out, size_t *out_len);
pc_status pc_slhdsa_verify(const uint8_t *spki, size_t spki_len,
const uint8_t *msg, size_t msg_len,
const uint8_t *sig, size_t sig_len);
void pc_slhdsa_free(PcSlhDsa *k);
PcSm2 *pc_sm2_generate(void);
PcSm2 *pc_sm2_from_pem(const uint8_t *pem, size_t len);
pc_status pc_sm2_private_to_pem(const PcSm2 *k, uint8_t *out, size_t *out_len);
pc_status pc_sm2_public_to_pem(const PcSm2 *k, uint8_t *out, size_t *out_len);
pc_status pc_sm2_sign(const PcSm2 *k, const uint8_t *id, size_t id_len,
const uint8_t *msg, size_t msg_len,
uint8_t *out, size_t *out_len);
pc_status pc_sm2_verify(const uint8_t *spki, size_t spki_len,
const uint8_t *id, size_t id_len,
const uint8_t *msg, size_t msg_len,
const uint8_t *sig, size_t sig_len);
pc_status pc_sm2_encrypt(const uint8_t *spki, size_t spki_len,
const uint8_t *pt, size_t pt_len,
uint8_t *out, size_t *out_len);
pc_status pc_sm2_decrypt(const PcSm2 *k, const uint8_t *ct, size_t ct_len,
uint8_t *out, size_t *out_len);
void pc_sm2_free(PcSm2 *k);
PcLms *pc_lms_generate(int32_t lms_param, int32_t lmots_param);
PcLms *pc_lms_from_bytes(const uint8_t *bytes, size_t len);
pc_status pc_lms_private_to_bytes(const PcLms *k, uint8_t *out, size_t *out_len);
pc_status pc_lms_public_to_bytes(const PcLms *k, uint8_t *out, size_t *out_len);
pc_status pc_lms_sign(PcLms *k, const uint8_t *msg, size_t msg_len,
uint8_t *out, size_t *out_len);
pc_status pc_lms_verify(const uint8_t *pubkey, size_t pubkey_len,
const uint8_t *msg, size_t msg_len,
const uint8_t *sig, size_t sig_len);
void pc_lms_free(PcLms *k);
PcHss *pc_hss_generate(size_t levels, int32_t lms_param, int32_t lmots_param);
PcHss *pc_hss_from_bytes(const uint8_t *bytes, size_t len);
pc_status pc_hss_private_to_bytes(const PcHss *k, uint8_t *out, size_t *out_len);
pc_status pc_hss_public_to_bytes(const PcHss *k, uint8_t *out, size_t *out_len);
pc_status pc_hss_sign(PcHss *k, const uint8_t *msg, size_t msg_len,
uint8_t *out, size_t *out_len);
pc_status pc_hss_verify(const uint8_t *pubkey, size_t pubkey_len,
const uint8_t *msg, size_t msg_len,
const uint8_t *sig, size_t sig_len);
void pc_hss_free(PcHss *k);
PcXmss *pc_xmss_generate(uint32_t oid);
PcXmss *pc_xmss_from_bytes(const uint8_t *bytes, size_t len);
pc_status pc_xmss_private_to_bytes(const PcXmss *k, uint8_t *out, size_t *out_len);
pc_status pc_xmss_public_to_bytes(const PcXmss *k, uint8_t *out, size_t *out_len);
pc_status pc_xmss_sign(PcXmss *k, const uint8_t *msg, size_t msg_len,
uint8_t *out, size_t *out_len);
pc_status pc_xmss_verify(const uint8_t *pubkey, size_t pubkey_len,
const uint8_t *msg, size_t msg_len,
const uint8_t *sig, size_t sig_len);
void pc_xmss_free(PcXmss *k);
PcXmssMt *pc_xmssmt_generate(uint32_t oid);
PcXmssMt *pc_xmssmt_from_bytes(const uint8_t *bytes, size_t len);
pc_status pc_xmssmt_private_to_bytes(const PcXmssMt *k, uint8_t *out, size_t *out_len);
pc_status pc_xmssmt_public_to_bytes(const PcXmssMt *k, uint8_t *out, size_t *out_len);
pc_status pc_xmssmt_sign(PcXmssMt *k, const uint8_t *msg, size_t msg_len,
uint8_t *out, size_t *out_len);
pc_status pc_xmssmt_verify(const uint8_t *pubkey, size_t pubkey_len,
const uint8_t *msg, size_t msg_len,
const uint8_t *sig, size_t sig_len);
void pc_xmssmt_free(PcXmssMt *k);
PcCsr *pc_csr_create_rsa(const PcRsaKey *rsa_key, const char *subject_cn,
const char *const *dns_names, size_t dns_count);
PcCsr *pc_csr_from_pem(const uint8_t *pem, size_t len);
pc_status pc_csr_to_pem(const PcCsr *csr, uint8_t *out, size_t *out_len);
pc_status pc_csr_verify_self_signed(const PcCsr *csr);
pc_status pc_csr_subject_cn(const PcCsr *csr, uint8_t *out, size_t *out_len);
void pc_csr_free(PcCsr *csr);
PcCrl *pc_crl_from_pem(const uint8_t *pem, size_t len);
PcCrl *pc_crl_from_der(const uint8_t *der, size_t len);
pc_status pc_crl_verify_with(const PcCrl *crl, const PcCert *issuer);
int pc_crl_is_revoked(const PcCrl *crl, const uint8_t *serial_be, size_t len);
void pc_crl_free(PcCrl *crl);
PcTlsCfg *pc_tls_cfg_new(int32_t role, int32_t version);
void pc_tls_cfg_free(PcTlsCfg *cfg);
pc_status pc_tls_cfg_add_root_pem(PcTlsCfg *cfg, const uint8_t *pem, size_t len);
pc_status pc_tls_cfg_set_server_name(PcTlsCfg *cfg, const char *sni);
pc_status pc_tls_cfg_set_certificate(PcTlsCfg *cfg,
const uint8_t *chain_pem, size_t chain_len,
const uint8_t *key_pem, size_t key_pem_len);
pc_status pc_tls_cfg_set_alpn(PcTlsCfg *cfg, const char *const *protocols, size_t n);
pc_status pc_tls_cfg_set_verify_certificates(PcTlsCfg *cfg, int32_t verify);
pc_status pc_tls_cfg_set_client_auth(PcTlsCfg *cfg, int32_t required,
const uint8_t *roots_pem, size_t roots_pem_len);
pc_status pc_tls_cfg_add_crl_pem(PcTlsCfg *cfg, const uint8_t *pem, size_t len);
pc_status pc_dtls_cfg_set_cookie_secret(PcTlsCfg *cfg,
const uint8_t *secret, size_t secret_len);
pc_status pc_dtls_cfg_set_no_cookie(PcTlsCfg *cfg);
PcTls *pc_tls_new(const PcTlsCfg *cfg);
void pc_tls_free(PcTls *tls);
pc_status pc_tls_feed(PcTls *tls, const uint8_t *wire_in, size_t in_len, size_t *consumed);
pc_status pc_tls_pop(PcTls *tls, uint8_t *wire_out, size_t *out_len);
pc_status pc_tls_send(PcTls *tls, const uint8_t *app_in, size_t in_len);
pc_status pc_tls_recv(PcTls *tls, uint8_t *app_out, size_t *out_len);
pc_status pc_tls_handshake(PcTls *tls);
pc_status pc_tls_close(PcTls *tls);
int pc_tls_is_handshake_complete(const PcTls *tls);
pc_status pc_tls_negotiated_version(const PcTls *tls, uint16_t *out);
pc_status pc_tls_negotiated_cipher_suite(const PcTls *tls, uint16_t *out);
pc_status pc_tls_negotiated_cipher_suite_name(const PcTls *tls,
uint8_t *out, size_t *out_len);
pc_status pc_tls_alpn_selected(const PcTls *tls, uint8_t *out, size_t *out_len);
pc_status pc_tls_peer_server_name(const PcTls *tls, uint8_t *out, size_t *out_len);
pc_status pc_tls_peer_certificate(const PcTls *tls, uint8_t *out, size_t *out_len);
pc_status pc_dtls_next_timeout(const PcTls *tls,
uint64_t *seconds_out, uint32_t *nanos_out,
int32_t *has_timeout);
pc_status pc_dtls_on_timeout(PcTls *tls, uint64_t now_seconds, uint32_t now_nanos);
#define PC_QUIC_V1 0x00000001
PcQuicCfg *pc_quic_cfg_new(int32_t role);
void pc_quic_cfg_free(PcQuicCfg *cfg);
pc_status pc_quic_cfg_add_root_pem(PcQuicCfg *cfg, const uint8_t *pem, size_t len);
pc_status pc_quic_cfg_set_server_name(PcQuicCfg *cfg, const char *sni);
pc_status pc_quic_cfg_set_certificate(PcQuicCfg *cfg,
const uint8_t *chain_pem, size_t chain_len,
const uint8_t *key_pem, size_t key_len);
pc_status pc_quic_cfg_set_alpn(PcQuicCfg *cfg, const char *const *protocols, size_t n);
pc_status pc_quic_cfg_set_verify_certificates(PcQuicCfg *cfg, int32_t verify);
pc_status pc_quic_cfg_set_max_idle_timeout_ms(PcQuicCfg *cfg, uint64_t ms);
pc_status pc_quic_cfg_set_initial_max_data(PcQuicCfg *cfg, uint64_t bytes);
pc_status pc_quic_cfg_set_initial_max_streams_bidi(PcQuicCfg *cfg, uint64_t streams);
pc_status pc_quic_cfg_set_max_datagram_frame_size(PcQuicCfg *cfg, uint64_t bytes);
pc_status pc_quic_cfg_set_require_retry(PcQuicCfg *cfg, int32_t require);
PcQuic *pc_quic_new(const PcQuicCfg *cfg);
void pc_quic_free(PcQuic *q);
pc_status pc_quic_feed_datagram(PcQuic *q, const uint8_t *dg, size_t len);
pc_status pc_quic_pop_datagram(PcQuic *q, uint8_t *out, size_t *out_len);
pc_status pc_quic_handshake(PcQuic *q);
pc_status pc_quic_is_handshake_complete(const PcQuic *q, int32_t *out);
pc_status pc_quic_next_timeout(const PcQuic *q,
uint64_t *seconds_out, uint32_t *nanos_out,
int32_t *has_timeout);
pc_status pc_quic_on_timeout(PcQuic *q,
uint64_t since_start_secs, uint32_t since_start_nanos);
pc_status pc_quic_open_bidi(PcQuic *q, uint64_t *id_out);
pc_status pc_quic_open_uni(PcQuic *q, uint64_t *id_out);
pc_status pc_quic_stream_write(PcQuic *q, uint64_t id,
const uint8_t *data, size_t len,
size_t *written_out);
pc_status pc_quic_stream_finish(PcQuic *q, uint64_t id);
pc_status pc_quic_stream_read(PcQuic *q, uint64_t id,
uint8_t *out, size_t *out_len,
int32_t *fin_seen);
pc_status pc_quic_stream_reset(PcQuic *q, uint64_t id, uint64_t app_error);
pc_status pc_quic_stream_stop_sending(PcQuic *q, uint64_t id, uint64_t app_error);
pc_status pc_quic_send_datagram(PcQuic *q, const uint8_t *data, size_t len);
pc_status pc_quic_recv_datagram(PcQuic *q, uint8_t *out, size_t *out_len);
pc_status pc_quic_initiate_key_update(PcQuic *q);
pc_status pc_quic_set_peer_addr(PcQuic *q,
const uint8_t *ipv6_bytes, size_t ipv6_bytes_len,
uint16_t port);
pc_status pc_quic_negotiated_alpn(const PcQuic *q, uint8_t *out, size_t *out_len);
pc_status pc_quic_peer_certificate(const PcQuic *q, uint8_t *out, size_t *out_len);
#ifdef __cplusplus
}
#endif
#endif