commit c966198513b96fe1081e6c90a920d127f4d780b6
parent df90c781653b81763345b2bfae76e09d1e4c5586
Author: Nick Mathewson <nickm@torproject.org>
Date: Wed, 28 May 2025 15:14:51 -0400
Turn relay_crypto_t into a tagged union.
Diffstat:
6 files changed, 33 insertions(+), 24 deletions(-)
diff --git a/src/core/crypto/relay_crypto.c b/src/core/crypto/relay_crypto.c
@@ -42,7 +42,7 @@ relay_crypto_get_sendme_tag(relay_crypto_t *crypto,
{
tor_assert(crypto);
*len_out = DIGEST_LEN;
- return crypto->tor1.sendme_digest;
+ return crypto->c.tor1.sendme_digest;
}
/** Do the appropriate en/decryptions for <b>cell</b> arriving on
@@ -87,7 +87,7 @@ relay_decrypt_cell(circuit_t *circ, cell_t *cell,
tor_assert(thishop);
bool rec = tor1_crypt_client_backward(
- &thishop->pvt_crypto.tor1, cell);
+ &thishop->pvt_crypto.c.tor1, cell);
if (rec) {
*recognized = 1;
*layer_hint = thishop;
@@ -101,13 +101,13 @@ relay_decrypt_cell(circuit_t *circ, cell_t *cell,
} else {
/* We're in the middle. Encrypt one layer. */
relay_crypto_t *crypto = &TO_OR_CIRCUIT(circ)->crypto;
- tor1_crypt_relay_backward(&crypto->tor1, cell);
+ tor1_crypt_relay_backward(&crypto->c.tor1, cell);
}
} else /* cell_direction == CELL_DIRECTION_OUT */ {
/* We're in the middle. Decrypt one layer. */
relay_crypto_t *crypto = &TO_OR_CIRCUIT(circ)->crypto;
- bool rec = tor1_crypt_relay_forward(&crypto->tor1, cell);
+ bool rec = tor1_crypt_relay_forward(&crypto->c.tor1, cell);
if (rec) {
*recognized = 1;
return 0;
@@ -130,11 +130,11 @@ relay_encrypt_cell_outbound(cell_t *cell,
{
crypt_path_t *thishop = layer_hint;
- tor1_crypt_client_originate(&thishop->pvt_crypto.tor1, cell);
+ tor1_crypt_client_originate(&thishop->pvt_crypto.c.tor1, cell);
thishop = thishop->prev;
while (thishop != circ->cpath->prev) {
- tor1_crypt_client_forward(&thishop->pvt_crypto.tor1, cell);
+ tor1_crypt_client_forward(&thishop->pvt_crypto.c.tor1, cell);
thishop = thishop->prev;
}
}
@@ -150,7 +150,7 @@ void
relay_encrypt_cell_inbound(cell_t *cell,
or_circuit_t *or_circ)
{
- tor1_crypt_relay_originate(&or_circ->crypto.tor1, cell);
+ tor1_crypt_relay_originate(&or_circ->crypto.c.tor1, cell);
}
/**
@@ -160,7 +160,7 @@ relay_encrypt_cell_inbound(cell_t *cell,
void
relay_crypto_clear(relay_crypto_t *crypto)
{
- tor1_crypt_clear(&crypto->tor1);
+ tor1_crypt_clear(&crypto->c.tor1);
}
/** Initialize <b>crypto</b> from the key material in key_data.
@@ -188,13 +188,16 @@ relay_crypto_init(relay_crypto_alg_t alg,
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,
+ crypto->kind = RCK_TOR1;
+ return tor1_crypt_init(&crypto->c.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,
+ crypto->kind = RCK_TOR1;
+ return tor1_crypt_init(&crypto->c.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,
+ crypto->kind = RCK_TOR1;
+ return tor1_crypt_init(&crypto->c.tor1, key_data, key_data_len,
true, true);
}
tor_assert_unreached();
@@ -222,5 +225,5 @@ relay_crypto_key_material_len(relay_crypto_alg_t alg)
void
relay_crypto_assert_ok(const relay_crypto_t *crypto)
{
- tor1_crypt_assert_ok(&crypto->tor1);
+ tor1_crypt_assert_ok(&crypto->c.tor1);
}
diff --git a/src/core/crypto/relay_crypto.h b/src/core/crypto/relay_crypto.h
@@ -26,8 +26,6 @@ typedef enum relay_crypto_alg_t {
RELAY_CRYPTO_ALG_TOR1_HSS,
} relay_crypto_alg_t;
-#define relay_crypto_alg_bitfield_t ENUM_BF(relay_crypto_alg_t)
-
/** Largest possible return value for relay_crypto_key_material_len. */
/* This is 2x the length needed for a single cgo direction with 256-bit AES
*/
diff --git a/src/core/crypto/relay_crypto_st.h b/src/core/crypto/relay_crypto_st.h
@@ -13,9 +13,17 @@
#define RELAY_CRYPTO_ST_H
#include "core/crypto/tor1_crypt_st.h"
+#include "core/crypto/relay_crypto_cgo.h"
+
+typedef enum relay_crypto_kind_t {
+ RCK_TOR1,
+} relay_crypto_kind_t;
struct relay_crypto_t {
- struct tor1_crypt_t tor1;
+ relay_crypto_kind_t kind;
+ union {
+ struct tor1_crypt_t tor1;
+ } c;
};
#endif /* !defined(RELAY_CRYPTO_ST_H) */
diff --git a/src/test/test_hs_client.c b/src/test/test_hs_client.c
@@ -247,13 +247,13 @@ test_e2e_rend_circuit_setup(void *arg)
/* Check that the crypt path has prop224 algorithm parameters */
tt_int_op(crypto_digest_get_algorithm(
- or_circ->cpath->pvt_crypto.tor1.f_digest),
+ or_circ->cpath->pvt_crypto.c.tor1.f_digest),
OP_EQ, DIGEST_SHA3_256);
tt_int_op(crypto_digest_get_algorithm(
- or_circ->cpath->pvt_crypto.tor1.b_digest),
+ or_circ->cpath->pvt_crypto.c.tor1.b_digest),
OP_EQ, DIGEST_SHA3_256);
- tt_assert(or_circ->cpath->pvt_crypto.tor1.f_crypto);
- tt_assert(or_circ->cpath->pvt_crypto.tor1.b_crypto);
+ tt_assert(or_circ->cpath->pvt_crypto.c.tor1.f_crypto);
+ tt_assert(or_circ->cpath->pvt_crypto.c.tor1.b_crypto);
/* Ensure that circ purpose was changed */
tt_int_op(or_circ->base_.purpose, OP_EQ, CIRCUIT_PURPOSE_C_REND_JOINED);
diff --git a/src/test/test_hs_service.c b/src/test/test_hs_service.c
@@ -225,13 +225,13 @@ test_e2e_rend_circuit_setup(void *arg)
/* Check the digest algo */
tt_int_op(crypto_digest_get_algorithm(
- or_circ->cpath->pvt_crypto.tor1.f_digest),
+ or_circ->cpath->pvt_crypto.c.tor1.f_digest),
OP_EQ, DIGEST_SHA3_256);
tt_int_op(crypto_digest_get_algorithm(
- or_circ->cpath->pvt_crypto.tor1.b_digest),
+ or_circ->cpath->pvt_crypto.c.tor1.b_digest),
OP_EQ, DIGEST_SHA3_256);
- tt_assert(or_circ->cpath->pvt_crypto.tor1.f_crypto);
- tt_assert(or_circ->cpath->pvt_crypto.tor1.b_crypto);
+ tt_assert(or_circ->cpath->pvt_crypto.c.tor1.f_crypto);
+ tt_assert(or_circ->cpath->pvt_crypto.c.tor1.b_crypto);
/* Ensure that circ purpose was changed */
tt_int_op(or_circ->base_.purpose, OP_EQ, CIRCUIT_PURPOSE_S_REND_JOINED);
diff --git a/src/test/test_sendme.c b/src/test/test_sendme.c
@@ -189,7 +189,7 @@ test_v1_build_cell(void *arg)
teardown_capture_of_logs();
/* Record the cell digest into the circuit, cell should validate. */
- memcpy(or_circ->crypto.tor1.sendme_digest, digest, sizeof(digest));
+ memcpy(or_circ->crypto.c.tor1.sendme_digest, digest, sizeof(digest));
circ->package_window = CIRCWINDOW_INCREMENT + 1;
sendme_record_cell_digest_on_circ(circ, NULL);
tt_int_op(smartlist_len(circ->sendme_last_digests), OP_EQ, 1);