]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Turn relay_crypto_t into a tagged union.
authorNick Mathewson <nickm@torproject.org>
Wed, 28 May 2025 19:14:51 +0000 (15:14 -0400)
committerNick Mathewson <nickm@torproject.org>
Tue, 10 Jun 2025 23:06:47 +0000 (19:06 -0400)
src/core/crypto/relay_crypto.c
src/core/crypto/relay_crypto.h
src/core/crypto/relay_crypto_st.h
src/test/test_hs_client.c
src/test/test_hs_service.c
src/test/test_sendme.c

index 659785e39f0309cb829a5d07a7fad05a0a6a2ae0..e6e9e6d8e5bc72a1e561d451de7383e652bbed8a 100644 (file)
@@ -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);
 }
index 25c2318fb6c40c5dec713e0a88674dc18a159247..dd8429279342dc528d9398973949289f7163f162 100644 (file)
@@ -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
  */
index 1df08b486d3d28dc9354d195c6a68c2d6422bfb6..54e8eb059299c9efcc3a7ff0752facac144a5aa7 100644 (file)
 #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) */
index c8d15ae2f7df54e0ffe92b7861809afe838496aa..73c2fb5edf3fdfddccf21a80e6e6313496092f7b 100644 (file)
@@ -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);
index d278fd475b8bc0f6ce5d105d35b185519ffa3579..9695d0829a073fc89793632f0cd72a64b1bed214 100644 (file)
@@ -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);
index 97fb1d950d9149fc8d903f52b96a1abb78950828..b633f3500141517219e36daa07b1f661e3628546 100644 (file)
@@ -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);