aboutsummaryrefslogtreecommitdiff
path: root/src/feature/hs/hs_ident.c
blob: 1d93ff9610452dc8fe2503f056ffa1e8eb390bc6 (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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/* Copyright (c) 2017-2020, The Tor Project, Inc. */
/* See LICENSE for licensing information */

/**
 * \file hs_ident.c
 * \brief Contains circuit and connection identifier code for the whole HS
 *        subsytem.
 **/

#include "lib/crypt_ops/crypto_util.h"
#include "feature/hs/hs_ident.h"

/** Return a newly allocated circuit identifier. The given public key is copied
 * identity_pk into the identifier. */
hs_ident_circuit_t *
hs_ident_circuit_new(const ed25519_public_key_t *identity_pk)
{
  hs_ident_circuit_t *ident = tor_malloc_zero(sizeof(*ident));
  ed25519_pubkey_copy(&ident->identity_pk, identity_pk);
  return ident;
}

/** Free the given circuit identifier. */
void
hs_ident_circuit_free_(hs_ident_circuit_t *ident)
{
  if (ident == NULL) {
    return;
  }
  memwipe(ident, 0, sizeof(hs_ident_circuit_t));
  tor_free(ident);
}

/** For a given circuit identifier src, return a newly allocated copy of it.
 * This can't fail. */
hs_ident_circuit_t *
hs_ident_circuit_dup(const hs_ident_circuit_t *src)
{
  hs_ident_circuit_t *ident = tor_malloc_zero(sizeof(*ident));
  memcpy(ident, src, sizeof(*ident));
  return ident;
}

/** For a given directory connection identifier src, return a newly allocated
 * copy of it. This can't fail. */
hs_ident_dir_conn_t *
hs_ident_dir_conn_dup(const hs_ident_dir_conn_t *src)
{
  hs_ident_dir_conn_t *ident = tor_malloc_zero(sizeof(*ident));
  memcpy(ident, src, sizeof(*ident));
  return ident;
}

/** Free the given directory connection identifier. */
void
hs_ident_dir_conn_free_(hs_ident_dir_conn_t *ident)
{
  if (ident == NULL) {
    return;
  }
  memwipe(ident, 0, sizeof(hs_ident_dir_conn_t));
  tor_free(ident);
}

/** Initialized the allocated ident object with identity_pk and blinded_pk.
 * None of them can be NULL since a valid directory connection identifier must
 * have all fields set. */
void
hs_ident_dir_conn_init(const ed25519_public_key_t *identity_pk,
                       const ed25519_public_key_t *blinded_pk,
                       hs_ident_dir_conn_t *ident)
{
  tor_assert(identity_pk);
  tor_assert(blinded_pk);
  tor_assert(ident);

  ed25519_pubkey_copy(&ident->identity_pk, identity_pk);
  ed25519_pubkey_copy(&ident->blinded_pk, blinded_pk);
}

/** Return a newly allocated edge connection identifier. The given public key
 * identity_pk is copied into the identifier. */
hs_ident_edge_conn_t *
hs_ident_edge_conn_new(const ed25519_public_key_t *identity_pk)
{
  hs_ident_edge_conn_t *ident = tor_malloc_zero(sizeof(*ident));
  ed25519_pubkey_copy(&ident->identity_pk, identity_pk);
  return ident;
}

/** Free the given edge connection identifier. */
void
hs_ident_edge_conn_free_(hs_ident_edge_conn_t *ident)
{
  if (ident == NULL) {
    return;
  }
  memwipe(ident, 0, sizeof(hs_ident_edge_conn_t));
  tor_free(ident);
}

/** Return true if the given ident is valid for an introduction circuit. */
int
hs_ident_intro_circ_is_valid(const hs_ident_circuit_t *ident)
{
  if (ident == NULL) {
    goto invalid;
  }

  if (ed25519_public_key_is_zero(&ident->identity_pk)) {
    goto invalid;
  }

  if (ed25519_public_key_is_zero(&ident->intro_auth_pk)) {
    goto invalid;
  }

  /* Valid. */
  return 1;
 invalid:
  return 0;
}