#ifndef TOR_HS_IDENT_H
#define TOR_HS_IDENT_H
#include "lib/crypt_ops/crypto_ed25519.h"
#include "feature/hs/hs_common.h"
#define HS_REND_COOKIE_LEN DIGEST_LEN
typedef enum {
HS_IDENT_CIRCUIT_INTRO = 1,
HS_IDENT_CIRCUIT_RENDEZVOUS = 2,
} hs_ident_circuit_type_t;
typedef struct hs_ident_circuit_t {
ed25519_public_key_t identity_pk;
ed25519_public_key_t intro_auth_pk;
curve25519_public_key_t intro_enc_pk;
uint8_t rendezvous_cookie[HS_REND_COOKIE_LEN];
uint8_t rendezvous_handshake_info[CURVE25519_PUBKEY_LEN + DIGEST256_LEN];
curve25519_keypair_t rendezvous_client_kp;
uint8_t rendezvous_ntor_key_seed[DIGEST256_LEN];
uint64_t num_rdv_streams;
} hs_ident_circuit_t;
typedef struct hs_ident_dir_conn_t {
ed25519_public_key_t identity_pk;
ed25519_public_key_t blinded_pk;
} hs_ident_dir_conn_t;
typedef struct hs_ident_edge_conn_t {
ed25519_public_key_t identity_pk;
uint16_t orig_virtual_port;
} hs_ident_edge_conn_t;
hs_ident_circuit_t *hs_ident_circuit_new(
const ed25519_public_key_t *identity_pk);
void hs_ident_circuit_free_(hs_ident_circuit_t *ident);
#define hs_ident_circuit_free(id) \
FREE_AND_NULL(hs_ident_circuit_t, hs_ident_circuit_free_, (id))
hs_ident_circuit_t *hs_ident_circuit_dup(const hs_ident_circuit_t *src);
hs_ident_dir_conn_t *hs_ident_dir_conn_dup(const hs_ident_dir_conn_t *src);
void hs_ident_dir_conn_free_(hs_ident_dir_conn_t *ident);
#define hs_ident_dir_conn_free(id) \
FREE_AND_NULL(hs_ident_dir_conn_t, hs_ident_dir_conn_free_, (id))
void hs_ident_dir_conn_init(const ed25519_public_key_t *identity_pk,
const ed25519_public_key_t *blinded_pk,
hs_ident_dir_conn_t *ident);
hs_ident_edge_conn_t *hs_ident_edge_conn_new(
const ed25519_public_key_t *identity_pk);
void hs_ident_edge_conn_free_(hs_ident_edge_conn_t *ident);
#define hs_ident_edge_conn_free(id) \
FREE_AND_NULL(hs_ident_edge_conn_t, hs_ident_edge_conn_free_, (id))
int hs_ident_intro_circ_is_valid(const hs_ident_circuit_t *ident);
#endif