1d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman/*
2d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * Copyright (C) 2016 The Android Open Source Project
3d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman *
4d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * Licensed under the Apache License, Version 2.0 (the "License");
5d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * you may not use this file except in compliance with the License.
6d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * You may obtain a copy of the License at
7d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman *
8d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman *      http://www.apache.org/licenses/LICENSE-2.0
9d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman *
10d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * Unless required by applicable law or agreed to in writing, software
11d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * distributed under the License is distributed on an "AS IS" BASIS,
12d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * See the License for the specific language governing permissions and
14d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * limitations under the License.
15d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman */
16d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
17d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#include "aslr_test.h"
18d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
19d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman/* run tests if on supported arch */
20b543b4ed380bd3571f23225b216ad82860d281eedcashman#if defined(__x86_64__) || defined(__i386__) || defined(__aarch64__) || defined(__arm__)
21d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
22d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman/* make sure the default entropy values matches what we expect */
23d661642651a6689c76d3f575b4b5dbf04e6b75bddcashmanTEST_F(AslrMmapTest, match_default) {
24d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    if (user32) {
25d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        // running 32-bit userspace on 64-bit kernel, only compat used.
26d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        return;
27d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    } else {
28d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_EQ(def, get_mmap_rnd_bits(false));
29d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    }
30d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman}
31d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
32d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman/* make sure the default compat entropy values matches what we expect */
33d661642651a6689c76d3f575b4b5dbf04e6b75bddcashmanTEST_F(AslrMmapTest, match_compat_default) {
34d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    if (compat || user32)
35d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_EQ(def_cmpt, get_mmap_rnd_bits(true));
36d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman}
37d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
38d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman/* make sure we can't set entropy below a minimum threshold */
39d661642651a6689c76d3f575b4b5dbf04e6b75bddcashmanTEST_F(AslrMmapTest, match_min) {
40d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    if (user32) {
41d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        // running 32-bit userspace on 64-bit kernel, only compat used.
42d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        return;
43d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    } else {
44d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_FALSE(set_mmap_rnd_bits(min - 1, false));
45d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_TRUE(set_mmap_rnd_bits(min, false));
46d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_EQ(min, get_mmap_rnd_bits(false));
47d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    }
48d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman}
49d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
50d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman/* make sure we can't set compat entropy below a minimum threshold */
51d661642651a6689c76d3f575b4b5dbf04e6b75bddcashmanTEST_F(AslrMmapTest, match_compat_min) {
52d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    if (compat || user32) {
53d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_FALSE(set_mmap_rnd_bits(min_cmpt - 1, true));
54d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_TRUE(set_mmap_rnd_bits(min_cmpt, true));
55d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_EQ(min_cmpt, get_mmap_rnd_bits(true));
56d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    }
57d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman}
58d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
59d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman/* make sure we can't set entropy above a maximum threshold */
60d661642651a6689c76d3f575b4b5dbf04e6b75bddcashmanTEST_F(AslrMmapTest, match_max) {
61d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    if (user32) {
62d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        // running 32-bit userspace on 64-bit kernel, only compat used.
63d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        return;
64d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    } else {
65d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_FALSE(set_mmap_rnd_bits(max + 1, false));
66d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_TRUE(set_mmap_rnd_bits(max, false));
67d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_EQ(max, get_mmap_rnd_bits(false));
68d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    }
69d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman}
70d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
71d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman/* make sure we can't set compat entropy above a maximum threshold */
72d661642651a6689c76d3f575b4b5dbf04e6b75bddcashmanTEST_F(AslrMmapTest, match_compat_max) {
73d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    if (compat || user32) {
74d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_FALSE(set_mmap_rnd_bits(max_cmpt + 1, true));
75d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_TRUE(set_mmap_rnd_bits(max_cmpt, true));
76d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_EQ(max_cmpt, get_mmap_rnd_bits(true));
77d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    }
78d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman}
79d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
80d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman/* make sure observed entropy is what we expect when we set min value */
81d661642651a6689c76d3f575b4b5dbf04e6b75bddcashmanTEST_F(AslrMmapTest, entropy_min) {
82d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    if (user32) {
83d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        // running 32-bit userspace on 64-bit kernel, only compat used.
84d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        return;
85d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    } else {
86d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_TRUE(set_mmap_rnd_bits(min, false));
87d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_EQ(min, calc_mmap_entropy(path, lib, 16));
88d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    }
89d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman}
90d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
91d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman/* make sure observed compat entropy is what we expect when we set min value */
92d661642651a6689c76d3f575b4b5dbf04e6b75bddcashmanTEST_F(AslrMmapTest, entropy_cmpt_min) {
93d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    if (compat || user32) {
94d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_TRUE(set_mmap_rnd_bits(min_cmpt, true));
95d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_EQ(min_cmpt, calc_mmap_entropy(SCRAPE_PATH_32, SCRAPE_LIB_32, 16));
96d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    }
97d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman}
98d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
99d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman/* make sure observed entropy is what we expect when we set max value */
100d661642651a6689c76d3f575b4b5dbf04e6b75bddcashmanTEST_F(AslrMmapTest, entropy_max) {
101d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    if (user32) {
102d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        // running 32-bit userspace on 64-bit kernel, only compat used.
103d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        return;
104d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    } else {
105d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_TRUE(set_mmap_rnd_bits(max, false));
106d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_EQ(max, calc_mmap_entropy(path, lib, 16));
107d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    }
108d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman}
109d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
110d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman/* make sure observed compat entropy is what we expect when we set max value */
111d661642651a6689c76d3f575b4b5dbf04e6b75bddcashmanTEST_F(AslrMmapTest, entropy_cmpt_max) {
112d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    if (compat || user32) {
113d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_TRUE(set_mmap_rnd_bits(max_cmpt, true));
114d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_EQ(max_cmpt, calc_mmap_entropy(SCRAPE_PATH_32, SCRAPE_LIB_32, 16));
115d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    }
116d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman}
117d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
118d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman/* make sure observed entropy is what we expect for default value */
119d661642651a6689c76d3f575b4b5dbf04e6b75bddcashmanTEST_F(AslrMmapTest, entropy_def) {
120d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    if (user32) {
121d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        // running 32-bit userspace on 64-bit kernel, only compat used.
122d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        return;
123d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    } else {
124d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_EQ(def, calc_mmap_entropy(path, lib, 16));
125d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    }
126d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman}
127d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
128d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman/* make sure observed entropy is what we expect for default compat value */
129d661642651a6689c76d3f575b4b5dbf04e6b75bddcashmanTEST_F(AslrMmapTest, entropy_cmpt_def) {
130d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    if (compat || user32) {
131d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman        EXPECT_EQ(def_cmpt, calc_mmap_entropy(SCRAPE_PATH_32, SCRAPE_LIB_32, 16));
132d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    }
133d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman}
134d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
135d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#endif /* supported arch */
136