* Return 0 if init was successful, else -1 if it failed.
*/
int
-relay_crypto_init(relay_crypto_t *crypto,
- const char *key_data, size_t key_data_len,
- int reverse, int is_hs_v3)
+relay_crypto_init(relay_crypto_alg_t alg,
+ relay_crypto_t *crypto,
+ const char *key_data, size_t key_data_len)
{
- return tor1_crypt_init(&crypto->tor1,
- key_data, key_data_len, reverse, is_hs_v3);
+ switch (alg) {
+ /* Tor1 cases: the booleans are "reverse" and "is_hs_v3". */
+ case RELAY_CRYPTO_ALG_TOR1:
+ return tor1_crypt_init(&crypto->tor1, key_data, key_data_len,
+ false, false);
+ case RELAY_CRYPTO_ALG_TOR1_HSC:
+ return tor1_crypt_init(&crypto->tor1, key_data, key_data_len,
+ false, true);
+ case RELAY_CRYPTO_ALG_TOR1_HSS:
+ return tor1_crypt_init(&crypto->tor1, key_data, key_data_len,
+ true, true);
+ }
+ tor_assert_unreached();
}
/** Return the amount of key material we need to initialize
switch (alg) {
case RELAY_CRYPTO_ALG_TOR1:
return tor1_key_material_len(false);
- case RELAY_CRYPTO_ALG_TOR1_HS:
+ case RELAY_CRYPTO_ALG_TOR1_HSC:
+ case RELAY_CRYPTO_ALG_TOR1_HSS:
return tor1_key_material_len(true);
}
return -1;
#ifndef TOR_RELAY_CRYPTO_H
#define TOR_RELAY_CRYPTO_H
+/** Enumeration to identify which relay crypto algorithm is in use. */
typedef enum relay_crypto_alg_t {
+ /** Tor1 relay crypto, as used for ordinary circuit hops. */
RELAY_CRYPTO_ALG_TOR1,
- RELAY_CRYPTO_ALG_TOR1_HS,
+ /** Tor1 relay crypto, as used as an onion service client for
+ * the shared virtual HS hop created with an INTRODUCE/RENVEZVOUS
+ * handshake. */
+ RELAY_CRYPTO_ALG_TOR1_HSC,
+ /** Tor1 relay crypto, as used as an onion service for
+ * the shared virtual HS hop created with an INTRODUCE/RENVEZVOUS
+ * handshake. */
+ RELAY_CRYPTO_ALG_TOR1_HSS,
} relay_crypto_alg_t;
#define relay_crypto_alg_bitfield_t ENUM_BF(relay_crypto_alg_t)
ssize_t relay_crypto_key_material_len(relay_crypto_alg_t alg);
-int relay_crypto_init(relay_crypto_t *crypto,
- const char *key_data, size_t key_data_len,
- int reverse, int is_hs_v3);
+int relay_crypto_init(relay_crypto_alg_t alg,
+ relay_crypto_t *crypto,
+ const char *key_data, size_t key_data_len);
int relay_decrypt_cell(circuit_t *circ, cell_t *cell,
cell_direction_t cell_direction,
onion_handshake_state_release(&hop->handshake_state);
- if (cpath_init_circuit_crypto(hop, keys, sizeof(keys), 0, 0)<0) {
+ if (cpath_init_circuit_crypto(RELAY_CRYPTO_ALG_TOR1,
+ hop, keys, sizeof(keys))<0) {
return -END_CIRC_REASON_TORPROTOCOL;
}
* Return 0 if init was successful, else -1 if it failed.
*/
int
-cpath_init_circuit_crypto(crypt_path_t *cpath,
- const char *key_data, size_t key_data_len,
- int reverse, int is_hs_v3)
+cpath_init_circuit_crypto(relay_crypto_alg_t alg,
+ crypt_path_t *cpath,
+ const char *key_data, size_t key_data_len)
{
tor_assert(cpath);
- return relay_crypto_init(&cpath->pvt_crypto, key_data, key_data_len,
- reverse, is_hs_v3);
+ return relay_crypto_init(alg, &cpath->pvt_crypto, key_data, key_data_len);
}
/** Deallocate space associated with the cpath node <b>victim</b>. */
#ifndef CRYPT_PATH_H
#define CRYPT_PATH_H
+#include "core/crypto/relay_crypto.h"
+
void cpath_assert_layer_ok(const crypt_path_t *cp);
void cpath_assert_ok(const crypt_path_t *cp);
int cpath_append_hop(crypt_path_t **head_ptr, extend_info_t *choice);
-int cpath_init_circuit_crypto(crypt_path_t *cpath,
- const char *key_data, size_t key_data_len,
- int reverse, int is_hs_v3);
+int cpath_init_circuit_crypto(relay_crypto_alg_t alg,
+ crypt_path_t *cpath,
+ const char *key_data, size_t key_data_len);
void
cpath_free(crypt_path_t *victim);
// TODO CGO: Pick relay cell format based on capabilities.
cpath->relay_cell_format = RELAY_CELL_FORMAT_V0;
+ relay_crypto_alg_t alg = is_service_side ? RELAY_CRYPTO_ALG_TOR1_HSS :
+ RELAY_CRYPTO_ALG_TOR1_HSC;
- if (cpath_init_circuit_crypto(cpath, (char*)keys, sizeof(keys),
- is_service_side, 1) < 0) {
+ if (cpath_init_circuit_crypto(alg, cpath, (char*)keys, sizeof(keys)) < 0) {
tor_free(cpath);
goto err;
}
return -1;
}
+ // XXXX: This will be wrong for cgo.
tor_assert(keys_len == CPATH_KEY_MATERIAL_LEN);
if (created_cell_format(&cell, created_cell) < 0) {
log_debug(LD_CIRC,"init digest forward 0x%.8x, backward 0x%.8x.",
(unsigned int)get_uint32(keys),
(unsigned int)get_uint32(keys+20));
- if (relay_crypto_init(&circ->crypto, keys, keys_len, 0, 0)<0) {
+ if (relay_crypto_init(RELAY_CRYPTO_ALG_TOR1,
+ &circ->crypto, keys, keys_len)<0) {
log_warn(LD_BUG,"Circuit initialization failed.");
return -1;
}
char keys[CPATH_KEY_MATERIAL_LEN];
crypto_rand(keys, sizeof(keys));
size_t keylen = sizeof(keys);
- relay_crypto_init(&or_circ->crypto,
- keys, keylen, false, false);
+ relay_crypto_init(RELAY_CRYPTO_ALG_TOR1,
+ &or_circ->crypto, keys, keylen);
reset_perftime();
cell_queue_init(&(orcirc->p_chan_cells));
memset(&tmp_cpath, 0, sizeof(tmp_cpath));
- if (cpath_init_circuit_crypto(&tmp_cpath, whatevs_key,
- sizeof(whatevs_key), 0, 0)<0) {
+ if (cpath_init_circuit_crypto(RELAY_CRYPTO_ALG_TOR1,
+ &tmp_cpath, whatevs_key,
+ sizeof(whatevs_key))<0) {
log_warn(LD_BUG,"Circuit initialization failed");
return NULL;
}
digest, NULL, NULL,
&addr, padding, NULL, false);
- cpath_init_circuit_crypto(hop, whatevs_key, sizeof(whatevs_key), 0, 0);
+ cpath_init_circuit_crypto(RELAY_CRYPTO_ALG_TOR1, hop,
+ whatevs_key, sizeof(whatevs_key));
hop->package_window = circuit_initial_package_window();
hop->deliver_window = CIRCWINDOW_START;
digest, NULL, NULL,
&addr, exit, NULL, exit);
- cpath_init_circuit_crypto(hop, whatevs_key, sizeof(whatevs_key), 0, 0);
+ cpath_init_circuit_crypto(RELAY_CRYPTO_ALG_TOR1, hop,
+ whatevs_key, sizeof(whatevs_key));
hop->package_window = circuit_initial_package_window();
hop->deliver_window = CIRCWINDOW_START;
for (i=0; i<3; ++i) {
cs->or_circ[i] = or_circuit_new(0, NULL);
tt_int_op(0, OP_EQ,
- relay_crypto_init(&cs->or_circ[i]->crypto,
- KEY_MATERIAL[i], sizeof(KEY_MATERIAL[i]),
- 0, 0));
+ relay_crypto_init(RELAY_CRYPTO_ALG_TOR1,
+ &cs->or_circ[i]->crypto,
+ KEY_MATERIAL[i], sizeof(KEY_MATERIAL[i])));
}
cs->origin_circ = origin_circuit_new();
cs->origin_circ->base_.purpose = CIRCUIT_PURPOSE_C_GENERAL;
for (i=0; i<3; ++i) {
crypt_path_t *hop = tor_malloc_zero(sizeof(*hop));
- relay_crypto_init(&hop->pvt_crypto, KEY_MATERIAL[i],
- sizeof(KEY_MATERIAL[i]), 0, 0);
+ relay_crypto_init(RELAY_CRYPTO_ALG_TOR1,
+ &hop->pvt_crypto, KEY_MATERIAL[i],
+ sizeof(KEY_MATERIAL[i]));
hop->state = CPATH_STATE_OPEN;
cpath_extend_linked_list(&cs->origin_circ->cpath, hop);
tt_ptr_op(hop, OP_EQ, cs->origin_circ->cpath->prev);