xref: /aosp_15_r20/external/cronet/base/rand_util_fuchsia.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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 Worker void 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 Worker bool 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 Worker void 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 Worker void 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 Worker double 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