1*6777b538SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #include "base/rand_util.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #include <zircon/syscalls.h> 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker #include <atomic> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h" 12*6777b538SAndroid Build Coastguard Worker #include "base/feature_list.h" 13*6777b538SAndroid Build Coastguard Worker #include "third_party/boringssl/src/include/openssl/crypto.h" 14*6777b538SAndroid Build Coastguard Worker #include "third_party/boringssl/src/include/openssl/rand.h" 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker namespace base { 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker namespace internal { 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker namespace { 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker // The BoringSSl helpers are duplicated in rand_util_posix.cc and 23*6777b538SAndroid Build Coastguard Worker // rand_util_win.cc. 24*6777b538SAndroid Build Coastguard Worker std::atomic<bool> g_use_boringssl; 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker BASE_FEATURE(kUseBoringSSLForRandBytes, 27*6777b538SAndroid Build Coastguard Worker "UseBoringSSLForRandBytes", 28*6777b538SAndroid Build Coastguard Worker FEATURE_DISABLED_BY_DEFAULT); 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker } // namespace 31*6777b538SAndroid Build Coastguard Worker ConfigureBoringSSLBackedRandBytesFieldTrial()32*6777b538SAndroid Build Coastguard Workervoid ConfigureBoringSSLBackedRandBytesFieldTrial() { 33*6777b538SAndroid Build Coastguard Worker g_use_boringssl.store(FeatureList::IsEnabled(kUseBoringSSLForRandBytes), 34*6777b538SAndroid Build Coastguard Worker std::memory_order_relaxed); 35*6777b538SAndroid Build Coastguard Worker } 36*6777b538SAndroid Build Coastguard Worker UseBoringSSLForRandBytes()37*6777b538SAndroid Build Coastguard Workerbool UseBoringSSLForRandBytes() { 38*6777b538SAndroid Build Coastguard Worker return g_use_boringssl.load(std::memory_order_relaxed); 39*6777b538SAndroid Build Coastguard Worker } 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker } // namespace internal 42*6777b538SAndroid Build Coastguard Worker RandBytes(span<uint8_t> output)43*6777b538SAndroid Build Coastguard Workervoid RandBytes(span<uint8_t> output) { 44*6777b538SAndroid Build Coastguard Worker if (internal::UseBoringSSLForRandBytes()) { 45*6777b538SAndroid Build Coastguard Worker // Ensure BoringSSL is initialized so it can use things like RDRAND. 46*6777b538SAndroid Build Coastguard Worker CRYPTO_library_init(); 47*6777b538SAndroid Build Coastguard Worker // BoringSSL's RAND_bytes always returns 1. Any error aborts the program. 48*6777b538SAndroid Build Coastguard Worker (void)RAND_bytes(output.data(), output.size()); 49*6777b538SAndroid Build Coastguard Worker return; 50*6777b538SAndroid Build Coastguard Worker } 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker zx_cprng_draw(output.data(), output.size()); 53*6777b538SAndroid Build Coastguard Worker } 54*6777b538SAndroid Build Coastguard Worker RandBytes(void * output,size_t output_length)55*6777b538SAndroid Build Coastguard Workervoid RandBytes(void* output, size_t output_length) { 56*6777b538SAndroid Build Coastguard Worker RandBytes(make_span(static_cast<uint8_t*>(output), output_length)); 57*6777b538SAndroid Build Coastguard Worker } 58*6777b538SAndroid Build Coastguard Worker 59*6777b538SAndroid Build Coastguard Worker namespace internal { 60*6777b538SAndroid Build Coastguard Worker RandDoubleAvoidAllocation()61*6777b538SAndroid Build Coastguard Workerdouble RandDoubleAvoidAllocation() { 62*6777b538SAndroid Build Coastguard Worker uint64_t number; 63*6777b538SAndroid Build Coastguard Worker zx_cprng_draw(&number, sizeof(number)); 64*6777b538SAndroid Build Coastguard Worker // This transformation is explained in rand_util.cc. 65*6777b538SAndroid Build Coastguard Worker return (number >> 11) * 0x1.0p-53; 66*6777b538SAndroid Build Coastguard Worker } 67*6777b538SAndroid Build Coastguard Worker 68*6777b538SAndroid Build Coastguard Worker } // namespace internal 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker } // namespace base 71