blob: 9c3783fbdf2ba24e27b503bfe10773c3cafdbb0b [file] [log] [blame]
Aaron Greenc80e4162017-01-13 11:49:38 -08001/* Copyright (c) 2017, Google Inc.
2 *
3 * Permission to use, copy, modify, and/or distribute this software for any
4 * purpose with or without fee is hereby granted, provided that the above
5 * copyright notice and this permission notice appear in all copies.
6 *
7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14
15#include <openssl/rand.h>
16
17#if defined(OPENSSL_FUCHSIA) && !defined(BORINGSSL_UNSAFE_DETERMINISTIC_MODE)
18
19#include <limits.h>
20#include <stdlib.h>
21
David Benjaminf51f2732017-09-15 14:54:02 -040022// TODO(davidben): Remove this once https://crbug.com/765754 is resolved.
23#if defined(CHROMIUM_ROLLING_MAGENTA_TO_ZIRCON)
Aaron Green36d59472017-09-15 11:30:29 -070024#include <zircon/syscalls.h>
David Benjaminf51f2732017-09-15 14:54:02 -040025#else
26#include <magenta/syscalls.h>
27#define ZX_CPRNG_DRAW_MAX_LEN MX_CPRNG_DRAW_MAX_LEN
28#define ZX_OK MX_OK
29#define zx_status_t mx_status_t
30#define zx_cprng_draw mx_cprng_draw
31#endif
Aaron Greenc80e4162017-01-13 11:49:38 -080032
Adam Langley77841042017-04-14 11:16:20 -070033#include "../fipsmodule/rand/internal.h"
Aaron Greenc80e4162017-01-13 11:49:38 -080034
35void CRYPTO_sysrand(uint8_t *out, size_t requested) {
36 while (requested > 0) {
Aaron Green36d59472017-09-15 11:30:29 -070037 size_t output_bytes_this_pass = ZX_CPRNG_DRAW_MAX_LEN;
Aaron Greenc80e4162017-01-13 11:49:38 -080038 if (requested < output_bytes_this_pass) {
39 output_bytes_this_pass = requested;
40 }
41 size_t bytes_drawn;
Aaron Green36d59472017-09-15 11:30:29 -070042 zx_status_t status =
43 zx_cprng_draw(out, output_bytes_this_pass, &bytes_drawn);
44 if (status != ZX_OK) {
Aaron Greenc80e4162017-01-13 11:49:38 -080045 abort();
46 }
47 requested -= bytes_drawn;
48 out += bytes_drawn;
49 }
50}
51
David Benjamin808f8322017-08-18 14:06:02 -040052#endif // OPENSSL_FUCHSIA && !BORINGSSL_UNSAFE_DETERMINISTIC_MODE