| #include "quiche/http2/test_tools/http2_random.h" |
| |
| #include "absl/strings/escaping.h" |
| #include "openssl/chacha.h" |
| #include "openssl/rand.h" |
| #include "quiche/common/platform/api/quiche_logging.h" |
| |
| static const uint8_t kZeroNonce[12] = {0}; |
| |
| namespace http2 { |
| namespace test { |
| |
| Http2Random::Http2Random() { |
| RAND_bytes(key_, sizeof(key_)); |
| |
| QUICHE_LOG(INFO) << "Initialized test RNG with the following key: " << Key(); |
| } |
| |
| Http2Random::Http2Random(absl::string_view key) { |
| std::string decoded_key = absl::HexStringToBytes(key); |
| QUICHE_CHECK_EQ(sizeof(key_), decoded_key.size()); |
| memcpy(key_, decoded_key.data(), sizeof(key_)); |
| } |
| |
| std::string Http2Random::Key() const { |
| return absl::BytesToHexString( |
| absl::string_view(reinterpret_cast<const char*>(key_), sizeof(key_))); |
| } |
| |
| void Http2Random::FillRandom(void* buffer, size_t buffer_size) { |
| memset(buffer, 0, buffer_size); |
| uint8_t* buffer_u8 = reinterpret_cast<uint8_t*>(buffer); |
| CRYPTO_chacha_20(buffer_u8, buffer_u8, buffer_size, key_, kZeroNonce, |
| counter_++); |
| } |
| |
| std::string Http2Random::RandString(int length) { |
| std::string result; |
| result.resize(length); |
| FillRandom(&result[0], length); |
| return result; |
| } |
| |
| uint64_t Http2Random::Rand64() { |
| union { |
| uint64_t number; |
| uint8_t bytes[sizeof(uint64_t)]; |
| } result; |
| FillRandom(result.bytes, sizeof(result.bytes)); |
| return result.number; |
| } |
| |
| double Http2Random::RandDouble() { |
| union { |
| double f; |
| uint64_t i; |
| } value; |
| value.i = (1023ull << 52ull) | (Rand64() & 0xfffffffffffffu); |
| return value.f - 1.0; |
| } |
| |
| std::string Http2Random::RandStringWithAlphabet(int length, |
| absl::string_view alphabet) { |
| std::string result; |
| result.resize(length); |
| for (int i = 0; i < length; i++) { |
| result[i] = alphabet[Uniform(alphabet.size())]; |
| } |
| return result; |
| } |
| |
| } // namespace test |
| } // namespace http2 |