1e9ac2743SConrad Meyer /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 3e9ac2743SConrad Meyer * 4e9ac2743SConrad Meyer * Copyright (c) 2018 Conrad Meyer <cem@FreeBSD.org> 5e9ac2743SConrad Meyer * All rights reserved. 6e9ac2743SConrad Meyer * 7e9ac2743SConrad Meyer * Redistribution and use in source and binary forms, with or without 8e9ac2743SConrad Meyer * modification, are permitted provided that the following conditions 9e9ac2743SConrad Meyer * are met: 10e9ac2743SConrad Meyer * 1. Redistributions of source code must retain the above copyright 11e9ac2743SConrad Meyer * notice, this list of conditions and the following disclaimer. 12e9ac2743SConrad Meyer * 2. Redistributions in binary form must reproduce the above copyright 13e9ac2743SConrad Meyer * notice, this list of conditions and the following disclaimer in the 14e9ac2743SConrad Meyer * documentation and/or other materials provided with the distribution. 15e9ac2743SConrad Meyer * 16e9ac2743SConrad Meyer * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17e9ac2743SConrad Meyer * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18e9ac2743SConrad Meyer * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19e9ac2743SConrad Meyer * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20e9ac2743SConrad Meyer * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21e9ac2743SConrad Meyer * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22e9ac2743SConrad Meyer * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23e9ac2743SConrad Meyer * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24e9ac2743SConrad Meyer * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25e9ac2743SConrad Meyer * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26e9ac2743SConrad Meyer * SUCH DAMAGE. 27e9ac2743SConrad Meyer */ 28e9ac2743SConrad Meyer 29e9ac2743SConrad Meyer #include <sys/cdefs.h> 30e9ac2743SConrad Meyer __FBSDID("$FreeBSD$"); 31e9ac2743SConrad Meyer 32e9ac2743SConrad Meyer #include <sys/param.h> 33e9ac2743SConrad Meyer #include <errno.h> 3408a7e74cSConrad Meyer #include <signal.h> 35e9ac2743SConrad Meyer #include <unistd.h> 36e9ac2743SConrad Meyer 37e9ac2743SConrad Meyer #include <atf-c.h> 38e9ac2743SConrad Meyer 39e9ac2743SConrad Meyer ATF_TC_WITHOUT_HEAD(getentropy_count); 40e9ac2743SConrad Meyer ATF_TC_BODY(getentropy_count, tc) 41e9ac2743SConrad Meyer { 42e9ac2743SConrad Meyer char buf[2]; 43e9ac2743SConrad Meyer int ret; 44e9ac2743SConrad Meyer 45e9ac2743SConrad Meyer /* getentropy(2) does not modify buf past the requested length */ 46e9ac2743SConrad Meyer buf[1] = 0x7C; 47e9ac2743SConrad Meyer ret = getentropy(buf, 1); 48e9ac2743SConrad Meyer ATF_REQUIRE_EQ(ret, 0); 49e9ac2743SConrad Meyer ATF_REQUIRE_EQ(buf[1], 0x7C); 50e9ac2743SConrad Meyer } 51e9ac2743SConrad Meyer 52e9ac2743SConrad Meyer ATF_TC_WITHOUT_HEAD(getentropy_fault); 53e9ac2743SConrad Meyer ATF_TC_BODY(getentropy_fault, tc) 54e9ac2743SConrad Meyer { 55e9ac2743SConrad Meyer int ret; 56e9ac2743SConrad Meyer 57e9ac2743SConrad Meyer ret = getentropy(NULL, 1); 58e9ac2743SConrad Meyer ATF_REQUIRE_EQ(ret, -1); 59e9ac2743SConrad Meyer ATF_REQUIRE_EQ(errno, EFAULT); 60e9ac2743SConrad Meyer } 61e9ac2743SConrad Meyer 62e9ac2743SConrad Meyer ATF_TC_WITHOUT_HEAD(getentropy_sizes); 63e9ac2743SConrad Meyer ATF_TC_BODY(getentropy_sizes, tc) 64e9ac2743SConrad Meyer { 65e9ac2743SConrad Meyer char buf[512]; 66e9ac2743SConrad Meyer 67e9ac2743SConrad Meyer ATF_REQUIRE_EQ(getentropy(buf, sizeof(buf)), -1); 68e9ac2743SConrad Meyer ATF_REQUIRE_EQ(errno, EIO); 69e9ac2743SConrad Meyer ATF_REQUIRE_EQ(getentropy(buf, 257), -1); 70e9ac2743SConrad Meyer ATF_REQUIRE_EQ(errno, EIO); 71e9ac2743SConrad Meyer 72e9ac2743SConrad Meyer /* Smaller sizes always succeed: */ 73e9ac2743SConrad Meyer ATF_REQUIRE_EQ(getentropy(buf, 256), 0); 74e9ac2743SConrad Meyer ATF_REQUIRE_EQ(getentropy(buf, 128), 0); 75e9ac2743SConrad Meyer ATF_REQUIRE_EQ(getentropy(buf, 0), 0); 76e9ac2743SConrad Meyer } 77e9ac2743SConrad Meyer 78e9ac2743SConrad Meyer ATF_TP_ADD_TCS(tp) 79e9ac2743SConrad Meyer { 80e9ac2743SConrad Meyer 8108a7e74cSConrad Meyer signal(SIGSYS, SIG_IGN); 8208a7e74cSConrad Meyer 83e9ac2743SConrad Meyer ATF_TP_ADD_TC(tp, getentropy_count); 84e9ac2743SConrad Meyer ATF_TP_ADD_TC(tp, getentropy_fault); 85e9ac2743SConrad Meyer ATF_TP_ADD_TC(tp, getentropy_sizes); 86e9ac2743SConrad Meyer return (atf_no_error()); 87e9ac2743SConrad Meyer } 88