aboutsummaryrefslogtreecommitdiff
path: root/src/test/test_hs_circ.c
blob: af28af2573cdfef29706498e2f45613ea50de0f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/* Copyright (c) 2017-2019, The Tor Project, Inc. */
/* See LICENSE for licensing information */

/**
 * \file test_hs_circ.c
 * \brief Test hidden service circuit functionality.
 */

#define CIRCUITLIST_PRIVATE

#include "test/test.h"
#include "test/test_helpers.h"
#include "test/log_test_helpers.h"

#include "core/or/circuitbuild.h"
#include "core/or/circuitlist.h"
#include "core/or/circuituse.h"
#include "core/or/origin_circuit_st.h"

#include "feature/hs/hs_circuit.h"
#include "feature/hs/hs_circuitmap.h"

static void
test_circuit_repurpose(void *arg)
{
  origin_circuit_t *intro_circ = NULL;
  const origin_circuit_t *search;
  ed25519_keypair_t kp;

  (void) arg;

  hs_init();

  intro_circ = origin_circuit_init(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, 0);
  tt_assert(intro_circ);
  ed25519_keypair_generate(&kp, 0);

  /* Register circuit in global map and make sure it is actually there. */
  hs_circuitmap_register_intro_circ_v3_service_side(intro_circ,
                                                    &kp.pubkey);
  tt_assert(TO_CIRCUIT(intro_circ)->hs_token);
  search = hs_circuitmap_get_intro_circ_v3_service_side(&kp.pubkey);
  tt_mem_op(search, OP_EQ, intro_circ, sizeof(origin_circuit_t));

  /* Setup circuit HS ident. We don't care about the service pubkey. */
  intro_circ->hs_ident = hs_ident_circuit_new(&kp.pubkey,
                                              HS_IDENT_CIRCUIT_INTRO);
  tt_assert(intro_circ->hs_ident);

  /* Trigger a repurpose. State should be cleaned up. */
  hs_circ_repurpose(TO_CIRCUIT(intro_circ));

  /* Removed from map. */
  search = hs_circuitmap_get_intro_circ_v3_service_side(&kp.pubkey);
  tt_assert(!search);
  /* HS identifier has been removed. */
  tt_assert(!intro_circ->hs_ident);

 done:
  circuit_free_(TO_CIRCUIT(intro_circ));
  hs_free_all();
}

struct testcase_t hs_circ_tests[] = {
  { "repurpose", test_circuit_repurpose, TT_FORK,
    NULL, NULL },

  END_OF_TESTCASES
};