crypto_rand_fast.c (13276B)
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-2021, The Tor Project, Inc. */ 5 /* See LICENSE for licensing information */ 6 7 /** 8 * \file crypto_rand_fast.c 9 * 10 * \brief A fast strong PRNG for use when our underlying cryptographic 11 * library's PRNG isn't fast enough. 12 **/ 13 14 /* This library is currently implemented to use the same implementation 15 * technique as libottery, using AES-CTR-256 as our underlying stream cipher. 16 * It's backtracking-resistant immediately, and prediction-resistant after 17 * a while. 18 * 19 * Here's how it works: 20 * 21 * We generate pseudorandom bytes using AES-CTR-256. We generate BUFLEN bytes 22 * at a time. When we do this, we keep the first SEED_LEN bytes as the key 23 * and the IV for our next invocation of AES_CTR, and yield the remaining 24 * BUFLEN - SEED_LEN bytes to the user as they invoke the PRNG. As we yield 25 * bytes to the user, we clear them from the buffer. 26 * 27 * After we have refilled the buffer RESEED_AFTER times, we mix in an 28 * additional SEED_LEN bytes from our strong PRNG into the seed. 29 * 30 * If the user ever asks for a huge number of bytes at once, we pull SEED_LEN 31 * bytes from the PRNG and use them with our stream cipher to fill the user's 32 * request. 33 */ 34 35 #define CRYPTO_PRIVATE 36 37 #include "lib/crypt_ops/crypto_rand.h" 38 #include "lib/crypt_ops/crypto_cipher.h" 39 #include "lib/crypt_ops/crypto_digest.h" 40 #include "lib/crypt_ops/crypto_util.h" 41 #include "lib/intmath/cmp.h" 42 #include "lib/cc/ctassert.h" 43 #include "lib/malloc/map_anon.h" 44 #include "lib/thread/threads.h" 45 46 #include "lib/log/util_bug.h" 47 48 #ifdef HAVE_SYS_TYPES_H 49 #include <sys/types.h> 50 #endif 51 #ifdef HAVE_UNISTD_H 52 #include <unistd.h> 53 #endif 54 55 #include <string.h> 56 57 #ifdef NOINHERIT_CAN_FAIL 58 #define CHECK_PID 59 #endif 60 61 #ifdef CHECK_PID 62 #define PID_FIELD_LEN sizeof(pid_t) 63 #else 64 #define PID_FIELD_LEN 0 65 #endif 66 67 /* Alias for CRYPTO_FAST_RNG_SEED_LEN to make our code shorter. 68 */ 69 #define SEED_LEN (CRYPTO_FAST_RNG_SEED_LEN) 70 71 /* The amount of space that we mmap for a crypto_fast_rng_t. 72 */ 73 #define MAPLEN 4096 74 75 /* The number of random bytes that we can yield to the user after each 76 * time we fill a crypto_fast_rng_t's buffer. 77 */ 78 #define BUFLEN (MAPLEN - 2*sizeof(uint16_t) - SEED_LEN - PID_FIELD_LEN) 79 80 /* The number of buffer refills after which we should fetch more 81 * entropy from crypto_strongest_rand(). 82 */ 83 #define RESEED_AFTER 16 84 85 /* The length of the stream cipher key we will use for the PRNG, in bytes. 86 */ 87 #define KEY_LEN (CRYPTO_FAST_RNG_SEED_LEN - CIPHER_IV_LEN) 88 /* The length of the stream cipher key we will use for the PRNG, in bits. 89 */ 90 #define KEY_BITS (KEY_LEN * 8) 91 92 /* Make sure that we have a key length we can actually use with AES. */ 93 CTASSERT(KEY_BITS == 128 || KEY_BITS == 192 || KEY_BITS == 256); 94 95 struct crypto_fast_rng_t { 96 /** How many more fills does this buffer have before we should mix 97 * in the output of crypto_strongest_rand()? 98 * 99 * This value may be negative if unit tests are enabled. If so, it 100 * indicates that we should never mix in extra data from 101 * crypto_strongest_rand(). 102 */ 103 int16_t n_till_reseed; 104 /** How many bytes are remaining in cbuf_t.bytes? */ 105 uint16_t bytes_left; 106 #ifdef CHECK_PID 107 /** Which process owns this fast_rng? If this value is zero, we do not 108 * need to test the owner. */ 109 pid_t owner; 110 #endif 111 struct cbuf_t { 112 /** The seed (key and IV) that we will use the next time that we refill 113 * cbuf_t. */ 114 uint8_t seed[SEED_LEN]; 115 /** 116 * Bytes that we are yielding to the user. The next byte to be 117 * yielded is at bytes[BUFLEN-bytes_left]; all other bytes in this 118 * array are set to zero. 119 */ 120 uint8_t bytes[BUFLEN]; 121 } buf; 122 }; 123 124 /* alignof(uint8_t) should be 1, so there shouldn't be any padding in cbuf_t. 125 */ 126 CTASSERT(sizeof(struct cbuf_t) == BUFLEN+SEED_LEN); 127 /* We're trying to fit all of the RNG state into a nice mmapable chunk. 128 */ 129 CTASSERT(sizeof(crypto_fast_rng_t) <= MAPLEN); 130 131 /** 132 * Initialize and return a new fast PRNG, using a strong random seed. 133 * 134 * Note that this object is NOT thread-safe. If you need a thread-safe 135 * prng, use crypto_rand(), or wrap this in a mutex. 136 **/ 137 crypto_fast_rng_t * 138 crypto_fast_rng_new(void) 139 { 140 uint8_t seed[SEED_LEN]; 141 crypto_strongest_rand(seed, sizeof(seed)); 142 crypto_fast_rng_t *result = crypto_fast_rng_new_from_seed(seed); 143 memwipe(seed, 0, sizeof(seed)); 144 return result; 145 } 146 147 /** 148 * Initialize and return a new fast PRNG, using a seed value specified 149 * in <b>seed</b>. This value must be CRYPTO_FAST_RNG_SEED_LEN bytes 150 * long. 151 * 152 * Note that this object is NOT thread-safe. If you need a thread-safe 153 * prng, you should probably look at get_thread_fast_rng(). Alternatively, 154 * use crypto_rand(), wrap this in a mutex. 155 **/ 156 crypto_fast_rng_t * 157 crypto_fast_rng_new_from_seed(const uint8_t *seed) 158 { 159 unsigned inherit = INHERIT_RES_KEEP; 160 /* We try to allocate this object as securely as we can, to avoid 161 * having it get dumped, swapped, or shared after fork. 162 */ 163 crypto_fast_rng_t *result = tor_mmap_anonymous(sizeof(*result), 164 ANONMAP_PRIVATE | ANONMAP_NOINHERIT, 165 &inherit); 166 memcpy(result->buf.seed, seed, SEED_LEN); 167 /* Causes an immediate refill once the user asks for data. */ 168 result->bytes_left = 0; 169 result->n_till_reseed = RESEED_AFTER; 170 #ifdef CHECK_PID 171 if (inherit == INHERIT_RES_KEEP) { 172 /* This value will neither be dropped nor zeroed after fork, so we need to 173 * check our pid to make sure we are not sharing it across a fork. This 174 * can be expensive if the pid value isn't cached, sadly. 175 */ 176 result->owner = getpid(); 177 } 178 #elif defined(_WIN32) 179 /* Windows can't fork(), so there's no need to noinherit. */ 180 #else 181 /* We decided above that noinherit would always do _something_. Assert here 182 * that we were correct. */ 183 tor_assertf(inherit != INHERIT_RES_KEEP, 184 "We failed to create a non-inheritable memory region, even " 185 "though we believed such a failure to be impossible! This is " 186 "probably a bug in Tor support for your platform; please report " 187 "it."); 188 #endif /* defined(CHECK_PID) || ... */ 189 return result; 190 } 191 192 #ifdef TOR_UNIT_TESTS 193 /** 194 * Unit tests only: prevent a crypto_fast_rng_t from ever mixing in more 195 * entropy. 196 */ 197 void 198 crypto_fast_rng_disable_reseed(crypto_fast_rng_t *rng) 199 { 200 rng->n_till_reseed = -1; 201 } 202 #endif /* defined(TOR_UNIT_TESTS) */ 203 204 /** 205 * Helper: create a crypto_cipher_t object from SEED_LEN bytes of 206 * input. The first KEY_LEN bytes are used as the stream cipher's key, 207 * and the remaining CIPHER_IV_LEN bytes are used as its IV. 208 **/ 209 static inline crypto_cipher_t * 210 cipher_from_seed(const uint8_t *seed) 211 { 212 return crypto_cipher_new_with_iv_and_bits(seed, seed+KEY_LEN, KEY_BITS); 213 } 214 215 /** 216 * Helper: mix additional entropy into <b>rng</b> by using our XOF to mix the 217 * old value for the seed with some additional bytes from 218 * crypto_strongest_rand(). 219 **/ 220 static void 221 crypto_fast_rng_add_entopy(crypto_fast_rng_t *rng) 222 { 223 crypto_xof_t *xof = crypto_xof_new(); 224 crypto_xof_add_bytes(xof, rng->buf.seed, SEED_LEN); 225 { 226 uint8_t seedbuf[SEED_LEN]; 227 crypto_strongest_rand(seedbuf, SEED_LEN); 228 crypto_xof_add_bytes(xof, seedbuf, SEED_LEN); 229 memwipe(seedbuf, 0, SEED_LEN); 230 } 231 crypto_xof_squeeze_bytes(xof, rng->buf.seed, SEED_LEN); 232 crypto_xof_free(xof); 233 } 234 235 /** 236 * Helper: refill the seed bytes and output buffer of <b>rng</b>, using 237 * the input seed bytes as input (key and IV) for the stream cipher. 238 * 239 * If the n_till_reseed counter has reached zero, mix more random bytes into 240 * the seed before refilling the buffer. 241 **/ 242 static void 243 crypto_fast_rng_refill(crypto_fast_rng_t *rng) 244 { 245 rng->n_till_reseed--; 246 if (rng->n_till_reseed == 0) { 247 /* It's time to reseed the RNG. */ 248 crypto_fast_rng_add_entopy(rng); 249 rng->n_till_reseed = RESEED_AFTER; 250 } else if (rng->n_till_reseed < 0) { 251 #ifdef TOR_UNIT_TESTS 252 /* Reseeding is disabled for testing; never do it on this prng. */ 253 rng->n_till_reseed = -1; 254 #else 255 /* If testing is disabled, this shouldn't be able to become negative. */ 256 tor_assert_unreached(); 257 #endif /* defined(TOR_UNIT_TESTS) */ 258 } 259 /* Now fill rng->buf with output from our stream cipher, initialized from 260 * that seed value. */ 261 crypto_cipher_t *c = cipher_from_seed(rng->buf.seed); 262 memset(&rng->buf, 0, sizeof(rng->buf)); 263 crypto_cipher_crypt_inplace(c, (char*)&rng->buf, sizeof(rng->buf)); 264 crypto_cipher_free(c); 265 266 rng->bytes_left = sizeof(rng->buf.bytes); 267 } 268 269 /** 270 * Release all storage held by <b>rng</b>. 271 **/ 272 void 273 crypto_fast_rng_free_(crypto_fast_rng_t *rng) 274 { 275 if (!rng) 276 return; 277 memwipe(rng, 0, sizeof(*rng)); 278 tor_munmap_anonymous(rng, sizeof(*rng)); 279 } 280 281 /** 282 * Helper: extract bytes from the PRNG, refilling it as necessary. Does not 283 * optimize the case when the user has asked for a huge output. 284 **/ 285 static void 286 crypto_fast_rng_getbytes_impl(crypto_fast_rng_t *rng, uint8_t *out, 287 const size_t n) 288 { 289 #ifdef CHECK_PID 290 if (rng->owner) { 291 /* Note that we only need to do this check when we have owner set: that 292 * is, when our attempt to block inheriting failed, and the result was 293 * INHERIT_RES_KEEP. 294 * 295 * If the result was INHERIT_RES_DROP, then any attempt to access the rng 296 * memory after forking will crash. 297 * 298 * If the result was INHERIT_RES_ZERO, then forking will set the bytes_left 299 * and n_till_reseed fields to zero. This function will call 300 * crypto_fast_rng_refill(), which will in turn reseed the PRNG. 301 * 302 * So we only need to do this test in the case when mmap_anonymous() 303 * returned INHERIT_KEEP. We avoid doing it needlessly, since getpid() is 304 * often a system call, and that can be slow. 305 */ 306 tor_assert(rng->owner == getpid()); 307 } 308 #endif /* defined(CHECK_PID) */ 309 310 size_t bytes_to_yield = n; 311 312 while (bytes_to_yield) { 313 if (rng->bytes_left == 0) 314 crypto_fast_rng_refill(rng); 315 316 const size_t to_copy = MIN(rng->bytes_left, bytes_to_yield); 317 318 tor_assert(sizeof(rng->buf.bytes) >= rng->bytes_left); 319 uint8_t *copy_from = rng->buf.bytes + 320 (sizeof(rng->buf.bytes) - rng->bytes_left); 321 memcpy(out, copy_from, to_copy); 322 memset(copy_from, 0, to_copy); 323 324 out += to_copy; 325 bytes_to_yield -= to_copy; 326 rng->bytes_left -= to_copy; 327 } 328 } 329 330 /** 331 * Extract <b>n</b> bytes from <b>rng</b> into the buffer at <b>out</b>. 332 **/ 333 void 334 crypto_fast_rng_getbytes(crypto_fast_rng_t *rng, uint8_t *out, size_t n) 335 { 336 if (PREDICT_UNLIKELY(n > BUFLEN)) { 337 /* The user has asked for a lot of output; generate it from a stream 338 * cipher seeded by the PRNG rather than by pulling it out of the PRNG 339 * directly. 340 */ 341 uint8_t seed[SEED_LEN]; 342 crypto_fast_rng_getbytes_impl(rng, seed, SEED_LEN); 343 crypto_cipher_t *c = cipher_from_seed(seed); 344 memset(out, 0, n); 345 crypto_cipher_crypt_inplace(c, (char*)out, n); 346 crypto_cipher_free(c); 347 memwipe(seed, 0, sizeof(seed)); 348 return; 349 } 350 351 crypto_fast_rng_getbytes_impl(rng, out, n); 352 } 353 354 #if defined(TOR_UNIT_TESTS) 355 /** for white-box testing: return the number of bytes that are returned from 356 * the user for each invocation of the stream cipher in this RNG. */ 357 size_t 358 crypto_fast_rng_get_bytes_used_per_stream(void) 359 { 360 return BUFLEN; 361 } 362 #endif /* defined(TOR_UNIT_TESTS) */ 363 364 /** 365 * Thread-local instance for our fast RNG. 366 **/ 367 static tor_threadlocal_t thread_rng; 368 369 /** 370 * Return a per-thread fast RNG, initializing it if necessary. 371 * 372 * You do not need to free this yourself. 373 * 374 * It is NOT safe to share this value across threads. 375 **/ 376 crypto_fast_rng_t * 377 get_thread_fast_rng(void) 378 { 379 crypto_fast_rng_t *rng = tor_threadlocal_get(&thread_rng); 380 381 if (PREDICT_UNLIKELY(rng == NULL)) { 382 rng = crypto_fast_rng_new(); 383 tor_threadlocal_set(&thread_rng, rng); 384 } 385 386 return rng; 387 } 388 389 /** 390 * Used when a thread is exiting: free the per-thread fast RNG if needed. 391 * Invoked from the crypto subsystem's thread-cleanup code. 392 **/ 393 void 394 destroy_thread_fast_rng(void) 395 { 396 crypto_fast_rng_t *rng = tor_threadlocal_get(&thread_rng); 397 if (!rng) 398 return; 399 crypto_fast_rng_free(rng); 400 tor_threadlocal_set(&thread_rng, NULL); 401 } 402 403 #ifdef TOR_UNIT_TESTS 404 /** 405 * Replace the current thread's rng with <b>rng</b>. For use by the 406 * unit tests only. Returns the previous thread rng. 407 **/ 408 crypto_fast_rng_t * 409 crypto_replace_thread_fast_rng(crypto_fast_rng_t *rng) 410 { 411 crypto_fast_rng_t *old_rng = tor_threadlocal_get(&thread_rng); 412 tor_threadlocal_set(&thread_rng, rng); 413 return old_rng; 414 } 415 #endif /* defined(TOR_UNIT_TESTS) */ 416 417 /** 418 * Initialize the global thread-local key that will be used to keep track 419 * of per-thread fast RNG instances. Called from the crypto subsystem's 420 * initialization code. 421 **/ 422 void 423 crypto_rand_fast_init(void) 424 { 425 tor_threadlocal_init(&thread_rng); 426 } 427 428 /** 429 * Initialize the global thread-local key that will be used to keep track 430 * of per-thread fast RNG instances. Called from the crypto subsystem's 431 * shutdown code. 432 **/ 433 void 434 crypto_rand_fast_shutdown(void) 435 { 436 destroy_thread_fast_rng(); 437 tor_threadlocal_destroy(&thread_rng); 438 }