1*8d67ca89SAndroid Build Coastguard Worker /*
2*8d67ca89SAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project
3*8d67ca89SAndroid Build Coastguard Worker *
4*8d67ca89SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*8d67ca89SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*8d67ca89SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*8d67ca89SAndroid Build Coastguard Worker *
8*8d67ca89SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*8d67ca89SAndroid Build Coastguard Worker *
10*8d67ca89SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*8d67ca89SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*8d67ca89SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8d67ca89SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*8d67ca89SAndroid Build Coastguard Worker * limitations under the License.
15*8d67ca89SAndroid Build Coastguard Worker */
16*8d67ca89SAndroid Build Coastguard Worker
17*8d67ca89SAndroid Build Coastguard Worker // <sys/random.h> was only added as of glibc version 2.25.
18*8d67ca89SAndroid Build Coastguard Worker // Don't try to compile this code on older glibc versions.
19*8d67ca89SAndroid Build Coastguard Worker
20*8d67ca89SAndroid Build Coastguard Worker #include <sys/cdefs.h>
21*8d67ca89SAndroid Build Coastguard Worker #if defined(__BIONIC__)
22*8d67ca89SAndroid Build Coastguard Worker #define HAVE_SYS_RANDOM 1
23*8d67ca89SAndroid Build Coastguard Worker #elif defined(__GLIBC_PREREQ)
24*8d67ca89SAndroid Build Coastguard Worker #if __GLIBC_PREREQ(2, 25)
25*8d67ca89SAndroid Build Coastguard Worker #define HAVE_SYS_RANDOM 1
26*8d67ca89SAndroid Build Coastguard Worker #endif
27*8d67ca89SAndroid Build Coastguard Worker #endif
28*8d67ca89SAndroid Build Coastguard Worker
29*8d67ca89SAndroid Build Coastguard Worker
30*8d67ca89SAndroid Build Coastguard Worker #if defined(HAVE_SYS_RANDOM)
31*8d67ca89SAndroid Build Coastguard Worker #include <sys/random.h>
32*8d67ca89SAndroid Build Coastguard Worker #endif
33*8d67ca89SAndroid Build Coastguard Worker
34*8d67ca89SAndroid Build Coastguard Worker #include <errno.h>
35*8d67ca89SAndroid Build Coastguard Worker #include <gtest/gtest.h>
36*8d67ca89SAndroid Build Coastguard Worker
37*8d67ca89SAndroid Build Coastguard Worker #include "utils.h"
38*8d67ca89SAndroid Build Coastguard Worker
TEST(sys_random,getentropy)39*8d67ca89SAndroid Build Coastguard Worker TEST(sys_random, getentropy) {
40*8d67ca89SAndroid Build Coastguard Worker #if defined(HAVE_SYS_RANDOM)
41*8d67ca89SAndroid Build Coastguard Worker char buf1[64];
42*8d67ca89SAndroid Build Coastguard Worker char buf2[64];
43*8d67ca89SAndroid Build Coastguard Worker
44*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0, getentropy(buf1, sizeof(buf1)));
45*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0, getentropy(buf2, sizeof(buf2)));
46*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(memcmp(buf1, buf2, sizeof(buf1)) != 0);
47*8d67ca89SAndroid Build Coastguard Worker #else
48*8d67ca89SAndroid Build Coastguard Worker GTEST_SKIP() << "<sys/random.h> not available";
49*8d67ca89SAndroid Build Coastguard Worker #endif
50*8d67ca89SAndroid Build Coastguard Worker }
51*8d67ca89SAndroid Build Coastguard Worker
TEST(sys_random,getentropy_EFAULT)52*8d67ca89SAndroid Build Coastguard Worker TEST(sys_random, getentropy_EFAULT) {
53*8d67ca89SAndroid Build Coastguard Worker #pragma clang diagnostic push
54*8d67ca89SAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wnonnull"
55*8d67ca89SAndroid Build Coastguard Worker #if defined(HAVE_SYS_RANDOM)
56*8d67ca89SAndroid Build Coastguard Worker errno = 0;
57*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(-1, getentropy(nullptr, 1));
58*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(EFAULT);
59*8d67ca89SAndroid Build Coastguard Worker #else
60*8d67ca89SAndroid Build Coastguard Worker GTEST_SKIP() << "<sys/random.h> not available";
61*8d67ca89SAndroid Build Coastguard Worker #endif
62*8d67ca89SAndroid Build Coastguard Worker #pragma clang diagnostic pop
63*8d67ca89SAndroid Build Coastguard Worker }
64*8d67ca89SAndroid Build Coastguard Worker
TEST(sys_random,getentropy_EIO)65*8d67ca89SAndroid Build Coastguard Worker TEST(sys_random, getentropy_EIO) {
66*8d67ca89SAndroid Build Coastguard Worker #if defined(HAVE_SYS_RANDOM)
67*8d67ca89SAndroid Build Coastguard Worker char buf[BUFSIZ];
68*8d67ca89SAndroid Build Coastguard Worker static_assert(BUFSIZ > 256, "BUFSIZ <= 256!");
69*8d67ca89SAndroid Build Coastguard Worker
70*8d67ca89SAndroid Build Coastguard Worker errno = 0;
71*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(-1, getentropy(buf, sizeof(buf)));
72*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(EIO);
73*8d67ca89SAndroid Build Coastguard Worker #else
74*8d67ca89SAndroid Build Coastguard Worker GTEST_SKIP() << "<sys/random.h> not available";
75*8d67ca89SAndroid Build Coastguard Worker #endif
76*8d67ca89SAndroid Build Coastguard Worker }
77*8d67ca89SAndroid Build Coastguard Worker
TEST(sys_random,getrandom)78*8d67ca89SAndroid Build Coastguard Worker TEST(sys_random, getrandom) {
79*8d67ca89SAndroid Build Coastguard Worker #if defined(HAVE_SYS_RANDOM)
80*8d67ca89SAndroid Build Coastguard Worker char buf1[64];
81*8d67ca89SAndroid Build Coastguard Worker char buf2[64];
82*8d67ca89SAndroid Build Coastguard Worker
83*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(64, getrandom(buf1, sizeof(buf1), 0));
84*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(64, getrandom(buf2, sizeof(buf2), 0));
85*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(memcmp(buf1, buf2, sizeof(buf1)) != 0);
86*8d67ca89SAndroid Build Coastguard Worker #else
87*8d67ca89SAndroid Build Coastguard Worker GTEST_SKIP() << "<sys/random.h> not available";
88*8d67ca89SAndroid Build Coastguard Worker #endif
89*8d67ca89SAndroid Build Coastguard Worker }
90*8d67ca89SAndroid Build Coastguard Worker
TEST(sys_random,getrandom_EFAULT)91*8d67ca89SAndroid Build Coastguard Worker TEST(sys_random, getrandom_EFAULT) {
92*8d67ca89SAndroid Build Coastguard Worker #pragma clang diagnostic push
93*8d67ca89SAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wnonnull"
94*8d67ca89SAndroid Build Coastguard Worker #if defined(HAVE_SYS_RANDOM)
95*8d67ca89SAndroid Build Coastguard Worker errno = 0;
96*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(-1, getrandom(nullptr, 256, 0));
97*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(EFAULT);
98*8d67ca89SAndroid Build Coastguard Worker #else
99*8d67ca89SAndroid Build Coastguard Worker GTEST_SKIP() << "<sys/random.h> not available";
100*8d67ca89SAndroid Build Coastguard Worker #endif
101*8d67ca89SAndroid Build Coastguard Worker #pragma clang diagnostic pop
102*8d67ca89SAndroid Build Coastguard Worker }
103*8d67ca89SAndroid Build Coastguard Worker
TEST(sys_random,getrandom_EINVAL)104*8d67ca89SAndroid Build Coastguard Worker TEST(sys_random, getrandom_EINVAL) {
105*8d67ca89SAndroid Build Coastguard Worker #if defined(HAVE_SYS_RANDOM)
106*8d67ca89SAndroid Build Coastguard Worker errno = 0;
107*8d67ca89SAndroid Build Coastguard Worker char buf[64];
108*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(-1, getrandom(buf, sizeof(buf), ~0));
109*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(EINVAL);
110*8d67ca89SAndroid Build Coastguard Worker #else
111*8d67ca89SAndroid Build Coastguard Worker GTEST_SKIP() << "<sys/random.h> not available";
112*8d67ca89SAndroid Build Coastguard Worker #endif
113*8d67ca89SAndroid Build Coastguard Worker }
114