mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-11 05:33:47 +01:00
Move weakrng into lib/intmath
This commit is contained in:
parent
aa3edfd205
commit
48ebd9bf76
@ -460,48 +460,6 @@ load_windows_system_library(const TCHAR *library_name)
|
||||
}
|
||||
#endif /* defined(_WIN32) */
|
||||
|
||||
/** Initialize the insecure RNG <b>rng</b> from a seed value <b>seed</b>. */
|
||||
void
|
||||
tor_init_weak_random(tor_weak_rng_t *rng, unsigned seed)
|
||||
{
|
||||
rng->state = (uint32_t)(seed & 0x7fffffff);
|
||||
}
|
||||
|
||||
/** Return a randomly chosen value in the range 0..TOR_WEAK_RANDOM_MAX based
|
||||
* on the RNG state of <b>rng</b>. This entropy will not be cryptographically
|
||||
* strong; do not rely on it for anything an adversary should not be able to
|
||||
* predict. */
|
||||
int32_t
|
||||
tor_weak_random(tor_weak_rng_t *rng)
|
||||
{
|
||||
/* Here's a linear congruential generator. OpenBSD and glibc use these
|
||||
* parameters; they aren't too bad, and should have maximal period over the
|
||||
* range 0..INT32_MAX. We don't want to use the platform rand() or random(),
|
||||
* since some platforms have bad weak RNGs that only return values in the
|
||||
* range 0..INT16_MAX, which just isn't enough. */
|
||||
rng->state = (rng->state * 1103515245 + 12345) & 0x7fffffff;
|
||||
return (int32_t) rng->state;
|
||||
}
|
||||
|
||||
/** Return a random number in the range [0 , <b>top</b>). {That is, the range
|
||||
* of integers i such that 0 <= i < top.} Chooses uniformly. Requires that
|
||||
* top is greater than 0. This randomness is not cryptographically strong; do
|
||||
* not rely on it for anything an adversary should not be able to predict. */
|
||||
int32_t
|
||||
tor_weak_random_range(tor_weak_rng_t *rng, int32_t top)
|
||||
{
|
||||
/* We don't want to just do tor_weak_random() % top, since random() is often
|
||||
* implemented with an LCG whose modulus is a power of 2, and those are
|
||||
* cyclic in their low-order bits. */
|
||||
int divisor, result;
|
||||
tor_assert(top > 0);
|
||||
divisor = TOR_WEAK_RANDOM_MAX / top;
|
||||
do {
|
||||
result = (int32_t)(tor_weak_random(rng) / divisor);
|
||||
} while (result >= top);
|
||||
return result;
|
||||
}
|
||||
|
||||
/** Cast a given double value to a int64_t. Return 0 if number is NaN.
|
||||
* Returns either INT64_MIN or INT64_MAX if number is outside of the int64_t
|
||||
* range. */
|
||||
|
@ -95,18 +95,4 @@ int64_t tv_to_msec(const struct timeval *tv);
|
||||
HANDLE load_windows_system_library(const TCHAR *library_name);
|
||||
#endif
|
||||
|
||||
/* ===== Insecure rng */
|
||||
typedef struct tor_weak_rng_t {
|
||||
uint32_t state;
|
||||
} tor_weak_rng_t;
|
||||
|
||||
#define TOR_WEAK_RNG_INIT {383745623}
|
||||
#define TOR_WEAK_RANDOM_MAX (INT_MAX)
|
||||
void tor_init_weak_random(tor_weak_rng_t *weak_rng, unsigned seed);
|
||||
int32_t tor_weak_random(tor_weak_rng_t *weak_rng);
|
||||
int32_t tor_weak_random_range(tor_weak_rng_t *rng, int32_t top);
|
||||
/** Randomly return true according to <b>rng</b> with probability 1 in
|
||||
* <b>n</b> */
|
||||
#define tor_weak_random_one_in_n(rng, n) (0==tor_weak_random_range((rng),(n)))
|
||||
|
||||
#endif /* !defined(TOR_UTIL_H) */
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include "tor_queue.h"
|
||||
#include "lib/net/alertsock.h"
|
||||
#include "lib/log/torlog.h"
|
||||
#include "lib/intmath/weakrng.h"
|
||||
|
||||
#include <event2/event.h>
|
||||
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include "lib/log/torlog.h"
|
||||
#include "common/util.h"
|
||||
#include "lib/encoding/binascii.h"
|
||||
#include "lib/intmath/weakrng.h"
|
||||
|
||||
DISABLE_GCC_WARNING(redundant-decls)
|
||||
#include <openssl/rand.h>
|
||||
|
@ -8,7 +8,8 @@ endif
|
||||
src_lib_libtor_intmath_a_SOURCES = \
|
||||
src/lib/intmath/addsub.c \
|
||||
src/lib/intmath/bits.c \
|
||||
src/lib/intmath/muldiv.c
|
||||
src/lib/intmath/muldiv.c \
|
||||
src/lib/intmath/weakrng.c
|
||||
|
||||
src_lib_libtor_intmath_testing_a_SOURCES = \
|
||||
$(src_lib_libtor_intmath_a_SOURCES)
|
||||
@ -19,4 +20,5 @@ noinst_HEADERS += \
|
||||
src/lib/intmath/addsub.h \
|
||||
src/lib/intmath/cmp.h \
|
||||
src/lib/intmath/bits.h \
|
||||
src/lib/intmath/muldiv.h
|
||||
src/lib/intmath/muldiv.h \
|
||||
src/lib/intmath/weakrng.h
|
||||
|
51
src/lib/intmath/weakrng.c
Normal file
51
src/lib/intmath/weakrng.c
Normal file
@ -0,0 +1,51 @@
|
||||
/* Copyright (c) 2003, Roger Dingledine
|
||||
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
|
||||
* Copyright (c) 2007-2018, The Tor Project, Inc. */
|
||||
/* See LICENSE for licensing information */
|
||||
|
||||
#include "lib/intmath/weakrng.h"
|
||||
#include "lib/err/torerr.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
/** Initialize the insecure RNG <b>rng</b> from a seed value <b>seed</b>. */
|
||||
void
|
||||
tor_init_weak_random(tor_weak_rng_t *rng, unsigned seed)
|
||||
{
|
||||
rng->state = (uint32_t)(seed & 0x7fffffff);
|
||||
}
|
||||
|
||||
/** Return a randomly chosen value in the range 0..TOR_WEAK_RANDOM_MAX based
|
||||
* on the RNG state of <b>rng</b>. This entropy will not be cryptographically
|
||||
* strong; do not rely on it for anything an adversary should not be able to
|
||||
* predict. */
|
||||
int32_t
|
||||
tor_weak_random(tor_weak_rng_t *rng)
|
||||
{
|
||||
/* Here's a linear congruential generator. OpenBSD and glibc use these
|
||||
* parameters; they aren't too bad, and should have maximal period over the
|
||||
* range 0..INT32_MAX. We don't want to use the platform rand() or random(),
|
||||
* since some platforms have bad weak RNGs that only return values in the
|
||||
* range 0..INT16_MAX, which just isn't enough. */
|
||||
rng->state = (rng->state * 1103515245 + 12345) & 0x7fffffff;
|
||||
return (int32_t) rng->state;
|
||||
}
|
||||
|
||||
/** Return a random number in the range [0 , <b>top</b>). {That is, the range
|
||||
* of integers i such that 0 <= i < top.} Chooses uniformly. Requires that
|
||||
* top is greater than 0. This randomness is not cryptographically strong; do
|
||||
* not rely on it for anything an adversary should not be able to predict. */
|
||||
int32_t
|
||||
tor_weak_random_range(tor_weak_rng_t *rng, int32_t top)
|
||||
{
|
||||
/* We don't want to just do tor_weak_random() % top, since random() is often
|
||||
* implemented with an LCG whose modulus is a power of 2, and those are
|
||||
* cyclic in their low-order bits. */
|
||||
int divisor, result;
|
||||
raw_assert(top > 0);
|
||||
divisor = TOR_WEAK_RANDOM_MAX / top;
|
||||
do {
|
||||
result = (int32_t)(tor_weak_random(rng) / divisor);
|
||||
} while (result >= top);
|
||||
return result;
|
||||
}
|
25
src/lib/intmath/weakrng.h
Normal file
25
src/lib/intmath/weakrng.h
Normal file
@ -0,0 +1,25 @@
|
||||
/* Copyright (c) 2003, Roger Dingledine
|
||||
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
|
||||
* Copyright (c) 2007-2018, The Tor Project, Inc. */
|
||||
/* See LICENSE for licensing information */
|
||||
|
||||
#ifndef TOR_WEAKRNG_H
|
||||
#define TOR_WEAKRNG_H
|
||||
|
||||
#include "lib/cc/torint.h"
|
||||
|
||||
/* ===== Insecure rng */
|
||||
typedef struct tor_weak_rng_t {
|
||||
uint32_t state;
|
||||
} tor_weak_rng_t;
|
||||
|
||||
#define TOR_WEAK_RNG_INIT {383745623}
|
||||
#define TOR_WEAK_RANDOM_MAX (INT_MAX)
|
||||
void tor_init_weak_random(tor_weak_rng_t *weak_rng, unsigned seed);
|
||||
int32_t tor_weak_random(tor_weak_rng_t *weak_rng);
|
||||
int32_t tor_weak_random_range(tor_weak_rng_t *rng, int32_t top);
|
||||
/** Randomly return true according to <b>rng</b> with probability 1 in
|
||||
* <b>n</b> */
|
||||
#define tor_weak_random_one_in_n(rng, n) (0==tor_weak_random_range((rng),(n)))
|
||||
|
||||
#endif
|
@ -33,6 +33,7 @@
|
||||
#include "common/workqueue.h"
|
||||
|
||||
#include "or/or_circuit_st.h"
|
||||
#include "lib/intmath/weakrng.h"
|
||||
|
||||
static void queue_pending_tasks(void);
|
||||
|
||||
@ -596,4 +597,3 @@ cpuworker_cancel_circ_handshake(or_circuit_t *circ)
|
||||
circ->workqueue_entry = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -94,6 +94,8 @@
|
||||
#include "or/routerinfo_st.h"
|
||||
#include "or/socks_request_st.h"
|
||||
|
||||
#include "lib/intmath/weakrng.h"
|
||||
|
||||
static edge_connection_t *relay_lookup_conn(circuit_t *circ, cell_t *cell,
|
||||
cell_direction_t cell_direction,
|
||||
crypt_path_t *layer_hint);
|
||||
@ -3084,4 +3086,3 @@ circuit_queue_streams_are_blocked(circuit_t *circ)
|
||||
return circ->streams_blocked_on_p_chan;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include "lib/process/env.h"
|
||||
#include "lib/process/pidfile.h"
|
||||
#include "lib/process/subprocess.h"
|
||||
#include "lib/intmath/weakrng.h"
|
||||
|
||||
#ifdef HAVE_PWD_H
|
||||
#include <pwd.h>
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include "lib/crypt_ops/crypto_rand.h"
|
||||
#include "lib/net/alertsock.h"
|
||||
#include "common/compat_libevent.h"
|
||||
#include "lib/intmath/weakrng.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user