Provide __NR_getrandom fillins in urandom test too. The urandom test added in 3e502c84f04 assumed that __NR_getrandom was defined by the system's headers, but urandom.c doesn't. This change pulls the fills for that system call into a common header that's used by both. Change-Id: I71c3b9bfa69c34b320e724a4c977cd63163cbdec Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/40067 Reviewed-by: David Benjamin <davidben@google.com> Commit-Queue: Adam Langley <agl@google.com>
diff --git a/crypto/fipsmodule/rand/getrandom_fillin.h b/crypto/fipsmodule/rand/getrandom_fillin.h new file mode 100644 index 0000000..9871854 --- /dev/null +++ b/crypto/fipsmodule/rand/getrandom_fillin.h
@@ -0,0 +1,64 @@ +/* Copyright (c) 2020, 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. */ + +#ifndef OPENSSL_HEADER_CRYPTO_RAND_GETRANDOM_FILLIN_H +#define OPENSSL_HEADER_CRYPTO_RAND_GETRANDOM_FILLIN_H + +#include <openssl/base.h> + + +#if defined(OPENSSL_LINUX) + +#include <sys/syscall.h> + +#if defined(OPENSSL_X86_64) +#define EXPECTED_NR_getrandom 318 +#elif defined(OPENSSL_X86) +#define EXPECTED_NR_getrandom 355 +#elif defined(OPENSSL_AARCH64) +#define EXPECTED_NR_getrandom 278 +#elif defined(OPENSSL_ARM) +#define EXPECTED_NR_getrandom 384 +#elif defined(OPENSSL_PPC64LE) +#define EXPECTED_NR_getrandom 359 +#endif + +#if defined(EXPECTED_NR_getrandom) +#define USE_NR_getrandom + +#if defined(__NR_getrandom) + +#if __NR_getrandom != EXPECTED_NR_getrandom +#error "system call number for getrandom is not the expected value" +#endif + +#else // __NR_getrandom + +#define __NR_getrandom EXPECTED_NR_getrandom + +#endif // __NR_getrandom + +#endif // EXPECTED_NR_getrandom + +#if !defined(GRND_NONBLOCK) +#define GRND_NONBLOCK 1 +#endif +#if !defined(GRND_RANDOM) +#define GRND_RANDOM 2 +#endif + +#endif // OPENSSL_LINUX + + +#endif // OPENSSL_HEADER_CRYPTO_RAND_GETRANDOM_FILLIN_H
diff --git a/crypto/fipsmodule/rand/urandom.c b/crypto/fipsmodule/rand/urandom.c index 4a60eb2..6ca3400 100644 --- a/crypto/fipsmodule/rand/urandom.c +++ b/crypto/fipsmodule/rand/urandom.c
@@ -65,38 +65,12 @@ #include <openssl/thread.h> #include <openssl/mem.h> +#include "getrandom_fillin.h" #include "../delocate.h" #include "../../internal.h" -#if defined(OPENSSL_LINUX) - -#if defined(OPENSSL_X86_64) -#define EXPECTED_NR_getrandom 318 -#elif defined(OPENSSL_X86) -#define EXPECTED_NR_getrandom 355 -#elif defined(OPENSSL_AARCH64) -#define EXPECTED_NR_getrandom 278 -#elif defined(OPENSSL_ARM) -#define EXPECTED_NR_getrandom 384 -#elif defined(OPENSSL_PPC64LE) -#define EXPECTED_NR_getrandom 359 -#endif - -#if defined(EXPECTED_NR_getrandom) -#define USE_NR_getrandom - -#if defined(__NR_getrandom) - -#if __NR_getrandom != EXPECTED_NR_getrandom -#error "system call number for getrandom is not the expected value" -#endif - -#else // __NR_getrandom - -#define __NR_getrandom EXPECTED_NR_getrandom - -#endif // __NR_getrandom +#if defined(USE_NR_getrandom) #if defined(OPENSSL_MSAN) void __msan_unpoison(void *, size_t); @@ -119,16 +93,7 @@ return ret; } -#endif // EXPECTED_NR_getrandom - -#if !defined(GRND_NONBLOCK) -#define GRND_NONBLOCK 1 -#endif -#if !defined(GRND_RANDOM) -#define GRND_RANDOM 2 -#endif - -#endif // OPENSSL_LINUX +#endif // USE_NR_getrandom // rand_lock is used to protect the |*_requested| variables. DEFINE_STATIC_MUTEX(rand_lock)
diff --git a/crypto/fipsmodule/rand/urandom_test.cc b/crypto/fipsmodule/rand/urandom_test.cc index 1119778..38b0202 100644 --- a/crypto/fipsmodule/rand/urandom_test.cc +++ b/crypto/fipsmodule/rand/urandom_test.cc
@@ -18,11 +18,10 @@ #include <openssl/rand.h> #include "internal.h" +#include "getrandom_fillin.h" - -#if defined(OPENSSL_X86_64) && defined(OPENSSL_LINUX) && \ - !defined(BORINGSSL_SHARED_LIBRARY) && \ - !defined(BORINGSSL_UNSAFE_DETERMINISTIC_MODE) +#if defined(OPENSSL_X86_64) && !defined(BORINGSSL_SHARED_LIBRARY) && \ + !defined(BORINGSSL_UNSAFE_DETERMINISTIC_MODE) && defined(USE_NR_getrandom) #include <linux/random.h> #include <sys/ptrace.h> @@ -476,4 +475,5 @@ return 0; } -#endif // X86_64 && LINUX && !SHARED_LIBRARY && !UNSAFE_DETERMINISTIC_MODE +#endif // X86_64 && !SHARED_LIBRARY && !UNSAFE_DETERMINISTIC_MODE && + // USE_NR_getrandom