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