Line data Source code
1 : /* Copyright (c) 2016-2021, The Tor Project, Inc. */ 2 : /* See LICENSE for licensing information */ 3 : 4 : #ifndef TOR_SHARED_RANDOM_H 5 : #define TOR_SHARED_RANDOM_H 6 : 7 : /** 8 : * \file shared_random.h 9 : * 10 : * \brief This file contains ABI/API of the shared random protocol defined in 11 : * proposal #250. Every public functions and data structure are namespaced 12 : * with "sr_" which stands for shared random. 13 : */ 14 : 15 : #include "core/or/or.h" 16 : 17 : /** Protocol version */ 18 : #define SR_PROTO_VERSION 1 19 : /** Default digest algorithm. */ 20 : #define SR_DIGEST_ALG DIGEST_SHA3_256 21 : /** Invariant token in the SRV calculation. */ 22 : #define SR_SRV_TOKEN "shared-random" 23 : /** Don't count the NUL terminated byte even though the TOKEN has it. */ 24 : #define SR_SRV_TOKEN_LEN (sizeof(SR_SRV_TOKEN) - 1) 25 : 26 : /** Length of the random number (in bytes). */ 27 : #define SR_RANDOM_NUMBER_LEN 32 28 : /** Size of a decoded commit value in a vote or state. It's a hash and a 29 : * timestamp. It adds up to 40 bytes. */ 30 : #define SR_COMMIT_LEN (sizeof(uint64_t) + DIGEST256_LEN) 31 : /** Size of a decoded reveal value from a vote or state. It's a 64 bit 32 : * timestamp and the hashed random number. This adds up to 40 bytes. */ 33 : #define SR_REVEAL_LEN (sizeof(uint64_t) + DIGEST256_LEN) 34 : /** Size of SRV message length. The construction is has follow: 35 : * "shared-random" | INT_8(reveal_num) | INT_4(version) | PREV_SRV */ 36 : #define SR_SRV_MSG_LEN \ 37 : (SR_SRV_TOKEN_LEN + sizeof(uint64_t) + sizeof(uint32_t) + DIGEST256_LEN) 38 : 39 : /** Length of base64 encoded commit NOT including the NUL terminated byte. 40 : * Formula is taken from base64_encode_size. This adds up to 56 bytes. */ 41 : #define SR_COMMIT_BASE64_LEN (BASE64_LEN(SR_COMMIT_LEN)) 42 : /** Length of base64 encoded reveal NOT including the NUL terminated byte. 43 : * Formula is taken from base64_encode_size. This adds up to 56 bytes. */ 44 : #define SR_REVEAL_BASE64_LEN (BASE64_LEN(SR_REVEAL_LEN)) 45 : /** Length of base64 encoded shared random value. It's 32 bytes long so 44 46 : * bytes from the base64_encode_size formula. That includes the '=' 47 : * character at the end. */ 48 : #define SR_SRV_VALUE_BASE64_LEN (BASE64_LEN(DIGEST256_LEN)) 49 : 50 : /** Assert if commit valid flag is not set. */ 51 : #define ASSERT_COMMIT_VALID(c) tor_assert((c)->valid) 52 : 53 : /** Protocol phase. */ 54 : typedef enum { 55 : /** Commitment phase */ 56 : SR_PHASE_COMMIT = 1, 57 : /** Reveal phase */ 58 : SR_PHASE_REVEAL = 2, 59 : } sr_phase_t; 60 : 61 : /** A shared random value (SRV). */ 62 : typedef struct sr_srv_t { 63 : /** The number of reveal values used to derive this SRV. */ 64 : uint64_t num_reveals; 65 : /** The actual value. This is the stored result of SHA3-256. */ 66 : uint8_t value[DIGEST256_LEN]; 67 : } sr_srv_t; 68 : 69 : /** A commit (either ours or from another authority). */ 70 : typedef struct sr_commit_t { 71 : /** Hashing algorithm used. */ 72 : digest_algorithm_t alg; 73 : /** Indicate if this commit has been verified thus valid. */ 74 : unsigned int valid:1; 75 : 76 : /* Commit owner info */ 77 : 78 : /** The RSA identity key of the authority and its base16 representation, 79 : * which includes the NUL terminated byte. */ 80 : char rsa_identity[DIGEST_LEN]; 81 : char rsa_identity_hex[HEX_DIGEST_LEN + 1]; 82 : 83 : /* Commitment information */ 84 : 85 : /** Timestamp of reveal. Correspond to TIMESTAMP. */ 86 : uint64_t reveal_ts; 87 : /* H(REVEAL) as found in COMMIT message. */ 88 : char hashed_reveal[DIGEST256_LEN]; 89 : /* Base64 encoded COMMIT. We use this to put it in our vote. */ 90 : char encoded_commit[SR_COMMIT_BASE64_LEN + 1]; 91 : 92 : /* Reveal information */ 93 : 94 : /** H(RN) which is what we used as the random value for this commit. We 95 : * don't use the raw bytes since those are sent on the network thus 96 : * avoiding possible information leaks of our PRNG. */ 97 : uint8_t random_number[SR_RANDOM_NUMBER_LEN]; 98 : /** Timestamp of commit. Correspond to TIMESTAMP. */ 99 : uint64_t commit_ts; 100 : /** This is the whole reveal message. We use it during verification */ 101 : char encoded_reveal[SR_REVEAL_BASE64_LEN + 1]; 102 : } sr_commit_t; 103 : 104 : /* API */ 105 : 106 : /* Public methods used _outside_ of the module. 107 : * 108 : * We need to nullify them if the module is disabled. */ 109 : #ifdef HAVE_MODULE_DIRAUTH 110 : 111 : int sr_init(int save_to_disk); 112 : void sr_save_and_cleanup(void); 113 : void sr_act_post_consensus(const networkstatus_t *consensus); 114 : 115 : #else /* !defined(HAVE_MODULE_DIRAUTH) */ 116 : 117 : static inline int 118 : sr_init(int save_to_disk) 119 : { 120 : (void) save_to_disk; 121 : /* Always return success. */ 122 : return 0; 123 : } 124 : 125 : static inline void 126 : sr_save_and_cleanup(void) 127 : { 128 : } 129 : 130 : static inline void 131 : sr_act_post_consensus(const networkstatus_t *consensus) 132 : { 133 : (void) consensus; 134 : } 135 : 136 : #endif /* defined(HAVE_MODULE_DIRAUTH) */ 137 : 138 : /* Public methods used only by dirauth code. */ 139 : 140 : void sr_handle_received_commits(smartlist_t *commits, 141 : crypto_pk_t *voter_key); 142 : sr_commit_t *sr_parse_commit(const smartlist_t *args); 143 : char *sr_get_string_for_vote(void); 144 : char *sr_get_string_for_consensus(const smartlist_t *votes, 145 : int32_t num_srv_agreements); 146 : void sr_commit_free_(sr_commit_t *commit); 147 : #define sr_commit_free(sr) FREE_AND_NULL(sr_commit_t, sr_commit_free_, (sr)) 148 : 149 : /* Private methods (only used by shared_random_state.c): */ 150 : static inline 151 1397 : const char *sr_commit_get_rsa_fpr(const sr_commit_t *commit) 152 : { 153 1397 : return commit->rsa_identity_hex; 154 : } 155 : 156 : void sr_compute_srv(void); 157 : sr_commit_t *sr_generate_our_commit(time_t timestamp, 158 : const authority_cert_t *my_rsa_cert); 159 : sr_srv_t *sr_srv_dup(const sr_srv_t *orig); 160 : 161 : #ifdef SHARED_RANDOM_PRIVATE 162 : 163 : /* Encode */ 164 : STATIC int reveal_encode(const sr_commit_t *commit, char *dst, size_t len); 165 : STATIC int commit_encode(const sr_commit_t *commit, char *dst, size_t len); 166 : /* Decode. */ 167 : STATIC int commit_decode(const char *encoded, sr_commit_t *commit); 168 : STATIC int reveal_decode(const char *encoded, sr_commit_t *commit); 169 : 170 : STATIC int commit_has_reveal_value(const sr_commit_t *commit); 171 : 172 : STATIC int verify_commit_and_reveal(const sr_commit_t *commit); 173 : 174 : STATIC sr_srv_t *get_majority_srv_from_votes(const smartlist_t *votes, 175 : int current); 176 : 177 : STATIC void save_commit_to_state(sr_commit_t *commit); 178 : STATIC int commitments_are_the_same(const sr_commit_t *commit_one, 179 : const sr_commit_t *commit_two); 180 : STATIC int commit_is_authoritative(const sr_commit_t *commit, 181 : const char *voter_key); 182 : STATIC int should_keep_commit(const sr_commit_t *commit, 183 : const char *voter_key, 184 : sr_phase_t phase); 185 : STATIC void save_commit_during_reveal_phase(const sr_commit_t *commit); 186 : 187 : #endif /* defined(SHARED_RANDOM_PRIVATE) */ 188 : 189 : #ifdef TOR_UNIT_TESTS 190 : 191 : void set_num_srv_agreements(int32_t value); 192 : 193 : #endif /* TOR_UNIT_TESTS */ 194 : 195 : #endif /* !defined(TOR_SHARED_RANDOM_H) */