Now that crypto_rand() cannot fail, it should return void.

This commit is contained in:
Nick Mathewson 2015-11-25 10:42:00 -05:00
parent 10fdee6285
commit ddcbe26474
12 changed files with 20 additions and 45 deletions

View File

@ -270,8 +270,7 @@ crypto_init_siphash_key(void)
if (have_seeded_siphash) if (have_seeded_siphash)
return 0; return 0;
if (crypto_rand((char*) &key, sizeof(key)) < 0) crypto_rand((char*) &key, sizeof(key));
return -1;
siphash_set_global_key(&key); siphash_set_global_key(&key);
have_seeded_siphash = 1; have_seeded_siphash = 1;
return 0; return 0;
@ -2368,27 +2367,26 @@ crypto_seed_rng(void)
/** Write <b>n</b> bytes of strong random data to <b>to</b>. Return 0 on /** Write <b>n</b> bytes of strong random data to <b>to</b>. Return 0 on
* success, -1 on failure, with support for mocking for unit tests. * success, -1 on failure, with support for mocking for unit tests.
*/ */
MOCK_IMPL(int, MOCK_IMPL(void,
crypto_rand, (char *to, size_t n)) crypto_rand, (char *to, size_t n))
{ {
return crypto_rand_unmocked(to, n); crypto_rand_unmocked(to, n);
} }
/** Write <b>n</b> bytes of strong random data to <b>to</b>. Return 0 on /** Write <b>n</b> bytes of strong random data to <b>to</b>. Return 0 on
* success, -1 on failure. Most callers will want crypto_rand instead. * success, -1 on failure. Most callers will want crypto_rand instead.
*/ */
int void
crypto_rand_unmocked(char *to, size_t n) crypto_rand_unmocked(char *to, size_t n)
{ {
int r; int r;
if (n == 0) if (n == 0)
return 0; return;
tor_assert(n < INT_MAX); tor_assert(n < INT_MAX);
tor_assert(to); tor_assert(to);
r = RAND_bytes((unsigned char*)to, (int)n); r = RAND_bytes((unsigned char*)to, (int)n);
tor_assert(r >= 0); tor_assert(r >= 0);
return 0;
} }
/** Return a pseudorandom integer, chosen uniformly from the values /** Return a pseudorandom integer, chosen uniformly from the values

View File

@ -260,8 +260,8 @@ int crypto_expand_key_material_rfc5869_sha256(
/* random numbers */ /* random numbers */
int crypto_seed_rng(void) ATTR_WUR; int crypto_seed_rng(void) ATTR_WUR;
MOCK_DECL(int,crypto_rand,(char *to, size_t n)); MOCK_DECL(void,crypto_rand,(char *to, size_t n));
int crypto_rand_unmocked(char *to, size_t n); void crypto_rand_unmocked(char *to, size_t n);
int crypto_strongest_rand(uint8_t *out, size_t out_len); int crypto_strongest_rand(uint8_t *out, size_t out_len);
int crypto_rand_int(unsigned int max); int crypto_rand_int(unsigned int max);
int crypto_rand_int_range(unsigned int min, unsigned int max); int crypto_rand_int_range(unsigned int min, unsigned int max);

View File

@ -113,8 +113,7 @@ curve25519_rand_seckey_bytes(uint8_t *out, int extra_strong)
{ {
uint8_t k_tmp[CURVE25519_SECKEY_LEN]; uint8_t k_tmp[CURVE25519_SECKEY_LEN];
if (crypto_rand((char*)out, CURVE25519_SECKEY_LEN) < 0) crypto_rand((char*)out, CURVE25519_SECKEY_LEN);
return -1;
if (extra_strong && !crypto_strongest_rand(k_tmp, CURVE25519_SECKEY_LEN)) { if (extra_strong && !crypto_strongest_rand(k_tmp, CURVE25519_SECKEY_LEN)) {
/* If they asked for extra-strong entropy and we have some, use it as an /* If they asked for extra-strong entropy and we have some, use it as an
* HMAC key to improve not-so-good entropy rather than using it directly, * HMAC key to improve not-so-good entropy rather than using it directly,

View File

@ -601,8 +601,7 @@ tor_tls_create_certificate(crypto_pk_t *rsa,
goto error; goto error;
{ /* our serial number is 8 random bytes. */ { /* our serial number is 8 random bytes. */
if (crypto_rand((char *)serial_tmp, sizeof(serial_tmp)) < 0) crypto_rand((char *)serial_tmp, sizeof(serial_tmp));
goto error;
if (!(serial_number = BN_bin2bn(serial_tmp, sizeof(serial_tmp), NULL))) if (!(serial_number = BN_bin2bn(serial_tmp, sizeof(serial_tmp), NULL)))
goto error; goto error;
if (!(BN_to_ASN1_INTEGER(serial_number, X509_get_serialNumber(x509)))) if (!(BN_to_ASN1_INTEGER(serial_number, X509_get_serialNumber(x509))))

View File

@ -7329,8 +7329,7 @@ init_cookie_authentication(const char *fname, const char *header,
/* Generate the cookie */ /* Generate the cookie */
*cookie_out = tor_malloc(cookie_len); *cookie_out = tor_malloc(cookie_len);
if (crypto_rand((char *)*cookie_out, cookie_len) < 0) crypto_rand((char *)*cookie_out, cookie_len);
goto done;
/* Create the string that should be written on the file. */ /* Create the string that should be written on the file. */
memcpy(cookie_file_str, header, strlen(header)); memcpy(cookie_file_str, header, strlen(header));

View File

@ -2290,8 +2290,7 @@ connection_or_send_auth_challenge_cell(or_connection_t *conn)
auth_challenge_cell_t *ac = auth_challenge_cell_new(); auth_challenge_cell_t *ac = auth_challenge_cell_new();
if (crypto_rand((char*)ac->challenge, sizeof(ac->challenge)) < 0) crypto_rand((char*)ac->challenge, sizeof(ac->challenge));
goto done;
auth_challenge_cell_add_methods(ac, AUTHTYPE_RSA_SHA256_TLSSECRET); auth_challenge_cell_add_methods(ac, AUTHTYPE_RSA_SHA256_TLSSECRET);
auth_challenge_cell_set_n_methods(ac, auth_challenge_cell_set_n_methods(ac,

View File

@ -3418,8 +3418,7 @@ handle_control_authchallenge(control_connection_t *conn, uint32_t len,
tor_free(client_nonce); tor_free(client_nonce);
return -1; return -1;
} }
const int fail = crypto_rand(server_nonce, SAFECOOKIE_SERVER_NONCE_LEN); crypto_rand(server_nonce, SAFECOOKIE_SERVER_NONCE_LEN);
tor_assert(!fail);
/* Now compute and send the server-to-controller response, and the /* Now compute and send the server-to-controller response, and the
* server's nonce. */ * server's nonce. */

View File

@ -193,8 +193,7 @@ handle_client_auth_nonce(const char *client_nonce, size_t client_nonce_len,
return -1; return -1;
/* Get our nonce */ /* Get our nonce */
if (crypto_rand(server_nonce, EXT_OR_PORT_AUTH_NONCE_LEN) < 0) crypto_rand(server_nonce, EXT_OR_PORT_AUTH_NONCE_LEN);
return -1;
{ /* set up macs */ { /* set up macs */
size_t hmac_s_msg_len = strlen(EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST) + size_t hmac_s_msg_len = strlen(EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST) +

View File

@ -30,10 +30,7 @@ fast_onionskin_create(fast_handshake_state_t **handshake_state_out,
{ {
fast_handshake_state_t *s; fast_handshake_state_t *s;
*handshake_state_out = s = tor_malloc(sizeof(fast_handshake_state_t)); *handshake_state_out = s = tor_malloc(sizeof(fast_handshake_state_t));
if (crypto_rand((char*)s->state, sizeof(s->state)) < 0) { crypto_rand((char*)s->state, sizeof(s->state));
tor_free(s);
return -1;
}
memcpy(handshake_out, s->state, DIGEST_LEN); memcpy(handshake_out, s->state, DIGEST_LEN);
return 0; return 0;
} }
@ -56,8 +53,7 @@ fast_server_handshake(const uint8_t *key_in, /* DIGEST_LEN bytes */
size_t out_len; size_t out_len;
int r = -1; int r = -1;
if (crypto_rand((char*)handshake_reply_out, DIGEST_LEN)<0) crypto_rand((char*)handshake_reply_out, DIGEST_LEN);
return -1;
memcpy(tmp, key_in, DIGEST_LEN); memcpy(tmp, key_in, DIGEST_LEN);
memcpy(tmp+DIGEST_LEN, handshake_reply_out, DIGEST_LEN); memcpy(tmp+DIGEST_LEN, handshake_reply_out, DIGEST_LEN);

View File

@ -65,11 +65,7 @@ rend_client_send_establish_rendezvous(origin_circuit_t *circ)
tor_assert(circ->rend_data); tor_assert(circ->rend_data);
log_info(LD_REND, "Sending an ESTABLISH_RENDEZVOUS cell"); log_info(LD_REND, "Sending an ESTABLISH_RENDEZVOUS cell");
if (crypto_rand(circ->rend_data->rend_cookie, REND_COOKIE_LEN) < 0) { crypto_rand(circ->rend_data->rend_cookie, REND_COOKIE_LEN);
log_warn(LD_BUG, "Internal error: Couldn't produce random cookie.");
circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL);
return -1;
}
/* Set timestamp_dirty, because circuit_expire_building expects it, /* Set timestamp_dirty, because circuit_expire_building expects it,
* and the rend cookie also means we've used the circ. */ * and the rend cookie also means we've used the circ. */

View File

@ -268,11 +268,7 @@ rend_encrypt_v2_intro_points_basic(char **encrypted_out,
tor_assert(client_cookies && smartlist_len(client_cookies) > 0); tor_assert(client_cookies && smartlist_len(client_cookies) > 0);
/* Generate session key. */ /* Generate session key. */
if (crypto_rand(session_key, CIPHER_KEY_LEN) < 0) { crypto_rand(session_key, CIPHER_KEY_LEN);
log_warn(LD_REND, "Unable to generate random session key to encrypt "
"introduction point string.");
goto done;
}
/* Determine length of encrypted introduction points including session /* Determine length of encrypted introduction points including session
* keys. */ * keys. */
@ -334,11 +330,7 @@ rend_encrypt_v2_intro_points_basic(char **encrypted_out,
REND_BASIC_AUTH_CLIENT_MULTIPLE; REND_BASIC_AUTH_CLIENT_MULTIPLE;
i < REND_BASIC_AUTH_CLIENT_MULTIPLE - 1; i++) { i < REND_BASIC_AUTH_CLIENT_MULTIPLE - 1; i++) {
client_part = tor_malloc_zero(REND_BASIC_AUTH_CLIENT_ENTRY_LEN); client_part = tor_malloc_zero(REND_BASIC_AUTH_CLIENT_ENTRY_LEN);
if (crypto_rand(client_part, REND_BASIC_AUTH_CLIENT_ENTRY_LEN) < 0) { crypto_rand(client_part, REND_BASIC_AUTH_CLIENT_ENTRY_LEN);
log_warn(LD_REND, "Unable to generate fake client entry.");
tor_free(client_part);
goto done;
}
smartlist_add(encrypted_session_keys, client_part); smartlist_add(encrypted_session_keys, client_part);
} }
/* Sort smartlist and put elements in result in order. */ /* Sort smartlist and put elements in result in order. */

View File

@ -309,15 +309,14 @@ test_ext_or_cookie_auth(void *arg)
tor_free(client_hash2); tor_free(client_hash2);
} }
static int static void
crypto_rand_return_tse_str(char *to, size_t n) crypto_rand_return_tse_str(char *to, size_t n)
{ {
if (n != 32) { if (n != 32) {
TT_FAIL(("Asked for %d bytes, not 32", (int)n)); TT_FAIL(("Asked for %d bytes, not 32", (int)n));
return -1; return;
} }
memcpy(to, "te road There is always another ", 32); memcpy(to, "te road There is always another ", 32);
return 0;
} }
static void static void