Tor 0.4.9.2-alpha-dev
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
relay_crypto_cgo.h
Go to the documentation of this file.
1/* Copyright (c) 2001 Matej Pfajfar.
2 * Copyright (c) 2001-2004, Roger Dingledine.
3 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
4 * Copyright (c) 2007-2025, The Tor Project, Inc. */
5/* See LICENSE for licensing information */
6
7/**
8 * \file relay_crypto_cgo.h
9 * \brief Header file for relay_crypto_cgo.c.
10 **/
11
12#ifndef TOR_RELAY_CRYPTO_CGO_H
13#define TOR_RELAY_CRYPTO_CGO_H
14
16
17/**
18 * State to implement forward _or_ reverse crypto between a client and a single
19 * hop on a circuit.
20 *
21 * (There needs to be one of these for each direction.
22 */
23typedef struct cgo_crypt_t cgo_crypt_t;
24
25typedef enum {
26 CGO_MODE_CLIENT_FORWARD,
27 CGO_MODE_CLIENT_BACKWARD,
28 CGO_MODE_RELAY_FORWARD,
29 CGO_MODE_RELAY_BACKWARD,
30} cgo_mode_t;
31
32struct cell_t;
33
34size_t cgo_key_material_len(int aesbits);
35cgo_crypt_t * cgo_crypt_new(cgo_mode_t mode, int aesbits,
36 const uint8_t *keys, size_t keylen);
38#define cgo_crypt_free(cgo) \
39 FREE_AND_NULL(cgo_crypt_t, cgo_crypt_free_, (cgo))
40
41void cgo_crypt_relay_forward(cgo_crypt_t *cgo, struct cell_t *cell,
42 const uint8_t **recognized_tag_out);
43void cgo_crypt_relay_backward(cgo_crypt_t *cgo, struct cell_t *cell);
44void cgo_crypt_relay_originate(cgo_crypt_t *cgo, struct cell_t *cell,
45 const uint8_t **tag_out);
46void cgo_crypt_client_forward(cgo_crypt_t *cgo, struct cell_t *cell);
47void cgo_crypt_client_originate(cgo_crypt_t *cgo, struct cell_t *cell,
48 const uint8_t **tag_out);
49void cgo_crypt_client_backward(cgo_crypt_t *cgo, struct cell_t *cell,
50 const uint8_t **recognized_tag_out);
51
52#ifdef RELAY_CRYPTO_CGO_PRIVATE
53/* Internal types and definitions for CGO encryption algorithms.
54 *
55 * Where reasonable, the identifiers here are chosen to match those
56 * in the spec (proposal 359), which in turn were chosen to match
57 * those in the paper.
58 */
59
60/**
61 * Tweakable block cipher, following the LRW2 construction,
62 * instantiated with AES.
63 *
64 * Any given instance can be used for encryption _or_ decryption,
65 * not both.
66 */
67typedef struct cgo_et_t {
68 /**
69 * AES block cipher instance
70 */
71 aes_raw_t *kb;
72 /**
73 * Polyval instance, with expanded key.
74 */
75 polyvalx_t ku;
76} cgo_et_t;
77/**
78 * Keyed pseudorandom function, based on polyval and AES-CTR.
79 */
80typedef struct cgo_prf_t {
81 /**
82 * AES stream cipher: may be 128, 192, or 256 bits.
83 */
85 /**
86 * Polyval instance.
87 */
89} cgo_prf_t;
90/**
91 * Rugged tweakable pseudorandom permutation, using the UIV+ construction.
92 *
93 * This is, roughly, a wide-block cipher where _encryption_
94 * is non-malleable, but where _decryption_ is malleable.
95 *
96 * UIV+ is the basis of CGO encryption, though it is used in different
97 * ways for each of the relay operations.
98 */
99typedef struct cgo_uiv_t {
100 /**
101 * Tweakable block cipher instance.
102 */
103 cgo_et_t j;
104 /**
105 * PRF instance.
106 */
107 cgo_prf_t s;
108#ifdef TOR_UNIT_TESTS
109 /** Testing only: Copy of keys used to instantiate this UIV.
110 * We use this in tests so that we can confirm the correctness
111 * of cgo_uiv_update().
112 */
113 uint8_t uiv_keys_[32 * 2 + 16 * 2];
114#endif
115} cgo_uiv_t;
116/**
117 * Length of the 'h' component of uiv_tweak_t.
118 */
119#define ET_TWEAK_LEN_H 16
120/**
121 * Length of the 'x_r' component of et_tweak_t.
122 */
123#define ET_TWEAK_LEN_X_R 493
124
125/**
126 * Tweak for the UIV+ wide-block cipher.
127 */
128typedef struct uiv_tweak_t {
129 /** H component of the wide-block cipher.
130 *
131 * This must be ET_TWEAK_LEN_H bytes long.
132 **/
133 const uint8_t *h;
134 /** Additional data component of the wide-block cipher.
135 * This value is sent to the cell command (RELAY or RELAY_EARLY)
136 * for each relay cell.
137 */
138 const uint8_t cmd;
139} uiv_tweak_t;
140/**
141 * Tweak for the ET tweakable block cipher.
142 */
143typedef struct et_tweak_t {
144 /** Components from the UIV+ tweak. */
145 uiv_tweak_t uiv;
146 /**
147 * X_R component of the ET tweak.
148 *
149 * This must be X_R bytes long.
150 */
151 const uint8_t *x_r;
152} et_tweak_t;
153
154/** Length of expected input to the PRF. */
155#define PRF_INPUT_LEN 16
156/** Output length for cgo_prf_xor_t0(). */
157#define PRF_T0_DATA_LEN 493
158
159/** Length of block handled by uiv instantiation. */
160#define UIV_BLOCK_LEN 509
161
162STATIC int cgo_et_init(cgo_et_t *et, int aesbits, bool encrypt,
163 const uint8_t *key);
164STATIC void cgo_et_set_key(cgo_et_t *et, int aesbits, bool encrypt,
165 const uint8_t *key);
166STATIC void cgo_et_encrypt(cgo_et_t *et, const et_tweak_t tweak,
167 uint8_t *block);
168STATIC void cgo_et_decrypt(cgo_et_t *et, const et_tweak_t tweak,
169 uint8_t *block);
170STATIC void cgo_et_clear(cgo_et_t *et);
171
172STATIC int cgo_prf_init(cgo_prf_t *prf, int aesbits,
173 const uint8_t *key);
174STATIC void cgo_prf_set_key(cgo_prf_t *prf, int aesbits,
175 const uint8_t *key);
176STATIC void cgo_prf_xor_t0(cgo_prf_t *prf, const uint8_t *input,
177 uint8_t *data);
178STATIC void cgo_prf_gen_t1(cgo_prf_t *prf, const uint8_t *input,
179 uint8_t *buf, size_t n);
180STATIC void cgo_prf_clear(cgo_prf_t *prf);
181
182STATIC int cgo_uiv_init(cgo_uiv_t *uiv, int aesbits, bool encrypt,
183 const uint8_t *key);
184STATIC void cgo_uiv_encrypt(cgo_uiv_t *uiv, const uiv_tweak_t tweak,
185 uint8_t *cell_body);
186STATIC void cgo_uiv_decrypt(cgo_uiv_t *uiv, const uiv_tweak_t tweak,
187 uint8_t *cell_body);
188STATIC void cgo_uiv_update(cgo_uiv_t *uiv, int aesbits, bool encrypt,
189 uint8_t *nonce);
190STATIC void cgo_uiv_clear(cgo_uiv_t *uiv);
191
192struct cgo_crypt_t {
193 cgo_uiv_t uiv;
194 uint8_t nonce[SENDME_TAG_LEN_CGO];
195 uint8_t tprime[SENDME_TAG_LEN_CGO];
196 /**
197 * Stored version of the last incoming cell tag.
198 * Only used for cgo_crypt_relay_fwd, where this information is not
199 * otherwise available after encryption.
200 */
201 uint8_t last_tag_relay_fwd[SENDME_TAG_LEN_CGO];
202 uint8_t aes_bytes;
203};
204#endif
205
206#endif /* !defined(TOR_RELAY_CRYPTO_CGO_H) */
#define SENDME_TAG_LEN_CGO
Definition: or.h:457
STATIC int cgo_et_init(cgo_et_t *et, int aesbits, bool encrypt, const uint8_t *key)
STATIC int cgo_uiv_init(cgo_uiv_t *uiv, int aesbits, bool encrypt, const uint8_t *key)
STATIC void cgo_prf_xor_t0(cgo_prf_t *prf, const uint8_t *input, uint8_t *data)
STATIC void cgo_uiv_clear(cgo_uiv_t *uiv)
STATIC void cgo_et_decrypt(cgo_et_t *et, const et_tweak_t tweak, uint8_t *block)
STATIC void cgo_et_set_key(cgo_et_t *et, int aesbits, bool encrypt, const uint8_t *key)
STATIC void cgo_uiv_encrypt(cgo_uiv_t *uiv, const uiv_tweak_t tweak, uint8_t *cell_body)
STATIC void cgo_et_clear(cgo_et_t *et)
STATIC int cgo_prf_init(cgo_prf_t *prf, int aesbits, const uint8_t *key)
STATIC void cgo_prf_clear(cgo_prf_t *prf)
STATIC void cgo_uiv_update(cgo_uiv_t *uiv, int aesbits, bool encrypt, uint8_t *nonce)
STATIC void cgo_prf_set_key(cgo_prf_t *prf, int aesbits, const uint8_t *key)
STATIC void cgo_prf_gen_t1(cgo_prf_t *prf, const uint8_t *input, uint8_t *buf, size_t n)
STATIC void cgo_et_encrypt(cgo_et_t *et, const et_tweak_t tweak, uint8_t *block)
STATIC void cgo_uiv_decrypt(cgo_uiv_t *uiv, const uiv_tweak_t tweak, uint8_t *cell_body)
void cgo_crypt_client_backward(cgo_crypt_t *cgo, struct cell_t *cell, const uint8_t **recognized_tag_out)
void cgo_crypt_client_originate(cgo_crypt_t *cgo, struct cell_t *cell, const uint8_t **tag_out)
void cgo_crypt_client_forward(cgo_crypt_t *cgo, struct cell_t *cell)
size_t cgo_key_material_len(int aesbits)
void cgo_crypt_relay_forward(cgo_crypt_t *cgo, struct cell_t *cell, const uint8_t **recognized_tag_out)
struct cgo_crypt_t cgo_crypt_t
void cgo_crypt_free_(cgo_crypt_t *cgo)
cgo_crypt_t * cgo_crypt_new(cgo_mode_t mode, int aesbits, const uint8_t *keys, size_t keylen)
void cgo_crypt_relay_backward(cgo_crypt_t *cgo, struct cell_t *cell)
void cgo_crypt_relay_originate(cgo_crypt_t *cgo, struct cell_t *cell, const uint8_t **tag_out)
Definition: cell_st.h:17
Macros to implement mocking and selective exposure for the test code.
#define STATIC
Definition: testsupport.h:32