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