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