From c80e41635384324c13562a6727948193234f35d9 Mon Sep 17 00:00:00 2001 From: Aaron Green Date: Fri, 13 Jan 2017 11:49:38 -0800 Subject: [PATCH] Add support for Fuchsia in crypto/rand. This change adds the OS-specific routines to get random bytes when using BoringSSL on Fuchsia. Fuchsia uses the Magenta kernel, which provides random bytes via a syscall rather than via a file or library function. Change-Id: I32f858246425309d643d142214c7b8de0c62250a Reviewed-on: https://boringssl-review.googlesource.com/13140 Reviewed-by: David Benjamin Commit-Queue: David Benjamin CQ-Verified: CQ bot account: commit-bot@chromium.org --- crypto/rand/CMakeLists.txt | 1 + crypto/rand/fuchsia.c | 43 ++++++++++++++++++++++++++++++++++++++ include/openssl/base.h | 4 ++++ 3 files changed, 48 insertions(+) create mode 100644 crypto/rand/fuchsia.c diff --git a/crypto/rand/CMakeLists.txt b/crypto/rand/CMakeLists.txt index c66d2eeb..f7c11f1c 100644 --- a/crypto/rand/CMakeLists.txt +++ b/crypto/rand/CMakeLists.txt @@ -14,6 +14,7 @@ add_library( OBJECT deterministic.c + fuchsia.c rand.c urandom.c windows.c diff --git a/crypto/rand/fuchsia.c b/crypto/rand/fuchsia.c new file mode 100644 index 00000000..2e138d0a --- /dev/null +++ b/crypto/rand/fuchsia.c @@ -0,0 +1,43 @@ +/* Copyright (c) 2017, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + +#include + +#if defined(OPENSSL_FUCHSIA) && !defined(BORINGSSL_UNSAFE_DETERMINISTIC_MODE) + +#include +#include + +#include + +#include "internal.h" + +void CRYPTO_sysrand(uint8_t *out, size_t requested) { + while (requested > 0) { + size_t output_bytes_this_pass = MX_CPRNG_DRAW_MAX_LEN; + if (requested < output_bytes_this_pass) { + output_bytes_this_pass = requested; + } + size_t bytes_drawn; + mx_status_t status = + mx_cprng_draw(out, output_bytes_this_pass, &bytes_drawn); + if (status != NO_ERROR) { + abort(); + } + requested -= bytes_drawn; + out += bytes_drawn; + } +} + +#endif /* OPENSSL_FUCHSIA && !BORINGSSL_UNSAFE_DETERMINISTIC_MODE */ diff --git a/include/openssl/base.h b/include/openssl/base.h index 8c1fd344..3f47521d 100644 --- a/include/openssl/base.h +++ b/include/openssl/base.h @@ -118,6 +118,10 @@ extern "C" { #define OPENSSL_LINUX #endif +#if defined(__Fuchsia__) +#define OPENSSL_FUCHSIA +#endif + #if defined(TRUSTY) #define OPENSSL_TRUSTY #define OPENSSL_NO_THREADS