From c966198513b96fe1081e6c90a920d127f4d780b6 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Wed, 28 May 2025 15:14:51 -0400 Subject: [PATCH] Turn relay_crypto_t into a tagged union. --- src/core/crypto/relay_crypto.c | 27 +++++++++++++++------------ src/core/crypto/relay_crypto.h | 2 -- src/core/crypto/relay_crypto_st.h | 10 +++++++++- src/test/test_hs_client.c | 8 ++++---- src/test/test_hs_service.c | 8 ++++---- src/test/test_sendme.c | 2 +- 6 files changed, 33 insertions(+), 24 deletions(-) diff --git a/src/core/crypto/relay_crypto.c b/src/core/crypto/relay_crypto.c index 659785e39f..e6e9e6d8e5 100644 --- 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 cell 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 crypto 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 index 25c2318fb6..dd84292793 100644 --- 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 index 1df08b486d..54e8eb0592 100644 --- 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 index c8d15ae2f7..73c2fb5edf 100644 --- 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 index d278fd475b..9695d0829a 100644 --- 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 index 97fb1d950d..b633f35001 100644 --- 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); -- 2.47.2