mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 13:13:44 +01:00
Make crypto_pseudo_rand* never fail.
svn:r797
This commit is contained in:
parent
99a6d48f62
commit
785f5cdac8
@ -999,10 +999,23 @@ int crypto_rand(unsigned int n, unsigned char *to)
|
||||
return (RAND_bytes(to, n) != 1);
|
||||
}
|
||||
|
||||
int crypto_pseudo_rand(unsigned int n, unsigned char *to)
|
||||
void crypto_pseudo_rand(unsigned int n, unsigned char *to)
|
||||
{
|
||||
assert(to);
|
||||
return (RAND_pseudo_bytes(to, n) == -1);
|
||||
if (RAND_pseudo_bytes(to, n) == -1) {
|
||||
log_fn(LOG_ERR, "RAND_pseudo_bytes failed unexpectedly.");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
int crypto_pseudo_rand_int(int max) {
|
||||
unsigned int val;
|
||||
crypto_pseudo_rand(sizeof(val), (unsigned char*) &val);
|
||||
/* Bug: Low values are _slightly_ favored over high values because
|
||||
* ((unsigned)-1)%max != max-1 . This shouldn't matter if max is
|
||||
* significantly smaller than ((unsigned)-1).
|
||||
**/
|
||||
return val % max;
|
||||
}
|
||||
|
||||
/* errors */
|
||||
|
@ -100,9 +100,8 @@ int crypto_SHA_digest(unsigned char *m, int len, unsigned char *digest);
|
||||
/* random numbers */
|
||||
int crypto_seed_rng();
|
||||
int crypto_rand(unsigned int n, unsigned char *to);
|
||||
int crypto_pseudo_rand(unsigned int n, unsigned char *to);
|
||||
|
||||
#define CRYPTO_PSEUDO_RAND_INT(v) crypto_pseudo_rand(sizeof(v),(char*)&(v))
|
||||
void crypto_pseudo_rand(unsigned int n, unsigned char *to);
|
||||
int crypto_pseudo_rand_int(int max);
|
||||
|
||||
/* errors */
|
||||
char *crypto_perror();
|
||||
|
@ -608,11 +608,8 @@ static int connection_ap_handshake_send_begin(connection_t *ap_conn, circuit_t *
|
||||
assert(ap_conn->socks_request);
|
||||
assert(ap_conn->socks_request->addr);
|
||||
|
||||
if(crypto_pseudo_rand(STREAM_ID_SIZE, ap_conn->stream_id) < 0) {
|
||||
/* XXX can we just make this call abort if it fails? then this func could be a void. */
|
||||
/* FIXME check for collisions */
|
||||
return -1;
|
||||
}
|
||||
crypto_pseudo_rand(STREAM_ID_SIZE, ap_conn->stream_id);
|
||||
/* FIXME check for collisions */
|
||||
|
||||
memcpy(payload, ap_conn->stream_id, STREAM_ID_SIZE);
|
||||
payload_len = STREAM_ID_SIZE + 1 +
|
||||
|
@ -160,17 +160,13 @@ int onionskin_answer(circuit_t *circ, unsigned char *payload, unsigned char *key
|
||||
/* uses a weighted coin with weight cw to choose a route length */
|
||||
static int chooselen(double cw) {
|
||||
int len = 2;
|
||||
uint8_t coin;
|
||||
|
||||
if ((cw < 0) || (cw >= 1)) /* invalid parameter */
|
||||
return -1;
|
||||
|
||||
while(1)
|
||||
{
|
||||
if (CRYPTO_PSEUDO_RAND_INT(coin))
|
||||
return -1;
|
||||
|
||||
if (coin > cw*255) /* don't extend */
|
||||
if (crypto_pseudo_rand_int(255) > cw*255) /* don't extend */
|
||||
break;
|
||||
else
|
||||
len++;
|
||||
@ -279,10 +275,7 @@ int onion_extend_cpath(crypt_path_t **head_ptr, int path_len, routerinfo_t **rou
|
||||
log_fn(LOG_DEBUG, "Path is %d long; we want %d", cur_len, path_len);
|
||||
|
||||
again:
|
||||
if (CRYPTO_PSEUDO_RAND_INT(choice)) {
|
||||
return -1;
|
||||
}
|
||||
choice %= rarray_len;
|
||||
choice = crypto_pseudo_rand_int(rarray_len);
|
||||
log_fn(LOG_DEBUG,"Contemplating router %s for hop %d",
|
||||
rarray[choice]->nickname, cur_len);
|
||||
for (i = 0, cpath = *head_ptr; i < cur_len; ++i, cpath=cpath->next) {
|
||||
|
Loading…
Reference in New Issue
Block a user