static int hwrand(uint8_t *buf, const size_t len) { if (!have_rdrand()) { return 0; } const size_t len_multiple8 = len & ~7; if (!CRYPTO_rdrand_multiple8_buf(buf, len_multiple8)) { return 0; } const size_t remainder = len - len_multiple8; if (remainder != 0) { assert(remainder < 8); uint8_t rand_buf[8]; if (!CRYPTO_rdrand(rand_buf)) { return 0; } OPENSSL_memcpy(buf + len_multiple8, rand_buf, remainder); } #if defined(BORINGSSL_FIPS_BREAK_CRNG) // This breaks the "continuous random number generator test" defined in FIPS // 140-2, section 4.9.2, and implemented in rand_get_seed(). OPENSSL_memset(buf, 0, len); #endif return 1; }
int CRYPTO_hwrand(uint8_t *buf, size_t len) { if (!have_rdrand()) { return 0; } const size_t len_multiple8 = len & ~7; if (!CRYPTO_rdrand_multiple8_buf(buf, len_multiple8)) { return 0; } len -= len_multiple8; if (len != 0) { assert(len < 8); uint8_t rand_buf[8]; if (!CRYPTO_rdrand(rand_buf)) { return 0; } memcpy(buf + len_multiple8, rand_buf, len); } return 1; }