#ifndef TOR_HS_CELL_H
#define TOR_HS_CELL_H
#include "core/or/or.h"
#include "feature/hs/hs_service.h"
#define HS_CELL_INTRODUCE1_MIN_SIZE 246
typedef struct hs_cell_introduce1_data_t {
unsigned int is_legacy : 1;
const crypto_pk_t *legacy_key;
const ed25519_public_key_t *auth_pk;
const curve25519_public_key_t *enc_pk;
const uint8_t *subcredential;
const curve25519_public_key_t *onion_pk;
const uint8_t *rendezvous_cookie;
const curve25519_keypair_t *client_kp;
smartlist_t *link_specifiers;
} hs_cell_introduce1_data_t;
typedef struct hs_cell_introduce2_data_t {
const ed25519_public_key_t *auth_pk;
const curve25519_keypair_t *enc_kp;
const uint8_t *subcredential;
const uint8_t *payload;
size_t payload_len;
curve25519_public_key_t onion_pk;
uint8_t rendezvous_cookie[REND_COOKIE_LEN];
curve25519_public_key_t client_pk;
smartlist_t *link_specifiers;
replaycache_t *replay_cache;
} hs_cell_introduce2_data_t;
ssize_t hs_cell_build_establish_intro(const char *circ_nonce,
const hs_service_config_t *config,
const hs_service_intro_point_t *ip,
uint8_t *cell_out);
ssize_t hs_cell_build_rendezvous1(const uint8_t *rendezvous_cookie,
size_t rendezvous_cookie_len,
const uint8_t *rendezvous_handshake_info,
size_t rendezvous_handshake_info_len,
uint8_t *cell_out);
ssize_t hs_cell_build_introduce1(const hs_cell_introduce1_data_t *data,
uint8_t *cell_out);
ssize_t hs_cell_build_establish_rendezvous(const uint8_t *rendezvous_cookie,
uint8_t *cell_out);
ssize_t hs_cell_parse_intro_established(const uint8_t *payload,
size_t payload_len);
ssize_t hs_cell_parse_introduce2(hs_cell_introduce2_data_t *data,
const origin_circuit_t *circ,
const hs_service_t *service);
int hs_cell_parse_introduce_ack(const uint8_t *payload, size_t payload_len);
int hs_cell_parse_rendezvous2(const uint8_t *payload, size_t payload_len,
uint8_t *handshake_info,
size_t handshake_info_len);
void hs_cell_introduce1_data_clear(hs_cell_introduce1_data_t *data);
#ifdef TOR_UNIT_TESTS
#include "trunnel/hs/cell_common.h"
STATIC trn_cell_extension_t *
build_establish_intro_extensions(const hs_service_config_t *service_config,
const hs_service_intro_point_t *ip);
#endif
#endif