xref: /freebsd-src/contrib/netbsd-tests/kernel/t_rnd.c (revision 1a36faad54665288ed4eb839d2a4699ae2ead45e)
1*63d1fd59SEnji Cooper /*	$NetBSD: t_rnd.c,v 1.10 2017/01/13 21:30:41 christos Exp $	*/
257718be8SEnji Cooper 
357718be8SEnji Cooper /*
457718be8SEnji Cooper  * Copyright (c) 2009 The NetBSD Foundation, Inc.
557718be8SEnji Cooper  * All rights reserved.
657718be8SEnji Cooper  *
757718be8SEnji Cooper  * Redistribution and use in source and binary forms, with or without
857718be8SEnji Cooper  * modification, are permitted provided that the following conditions
957718be8SEnji Cooper  * are met:
1057718be8SEnji Cooper  * 1. Redistributions of source code must retain the above copyright
1157718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer.
1257718be8SEnji Cooper  * 2. Redistributions in binary form must reproduce the above copyright
1357718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer in the
1457718be8SEnji Cooper  *    documentation and/or other materials provided with the distribution.
1557718be8SEnji Cooper  *
1657718be8SEnji Cooper  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
1757718be8SEnji Cooper  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
1857718be8SEnji Cooper  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1957718be8SEnji Cooper  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2057718be8SEnji Cooper  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2157718be8SEnji Cooper  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2257718be8SEnji Cooper  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2357718be8SEnji Cooper  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2457718be8SEnji Cooper  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2557718be8SEnji Cooper  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2657718be8SEnji Cooper  * POSSIBILITY OF SUCH DAMAGE.
2757718be8SEnji Cooper  */
2857718be8SEnji Cooper 
2957718be8SEnji Cooper #include <sys/cdefs.h>
30*63d1fd59SEnji Cooper __RCSID("$NetBSD: t_rnd.c,v 1.10 2017/01/13 21:30:41 christos Exp $");
3157718be8SEnji Cooper 
3257718be8SEnji Cooper #include <sys/types.h>
3357718be8SEnji Cooper #include <sys/fcntl.h>
3457718be8SEnji Cooper #include <sys/ioctl.h>
35640235e2SEnji Cooper #include <sys/rndio.h>
3657718be8SEnji Cooper 
3757718be8SEnji Cooper #include <atf-c.h>
3857718be8SEnji Cooper 
3957718be8SEnji Cooper #include <rump/rump.h>
4057718be8SEnji Cooper #include <rump/rump_syscalls.h>
4157718be8SEnji Cooper 
42*63d1fd59SEnji Cooper #include "h_macros.h"
4357718be8SEnji Cooper 
4457718be8SEnji Cooper ATF_TC(RNDADDDATA);
ATF_TC_HEAD(RNDADDDATA,tc)4557718be8SEnji Cooper ATF_TC_HEAD(RNDADDDATA, tc)
4657718be8SEnji Cooper {
4757718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
4857718be8SEnji Cooper 	    "Checks ioctl(RNDADDDATA) (PR kern/42020)");
4957718be8SEnji Cooper }
5057718be8SEnji Cooper 
5157718be8SEnji Cooper /* Adapted from example provided by Juho Salminen in the noted PR. */
ATF_TC_BODY(RNDADDDATA,tc)5257718be8SEnji Cooper ATF_TC_BODY(RNDADDDATA, tc)
5357718be8SEnji Cooper {
5457718be8SEnji Cooper 	rnddata_t rd;
5557718be8SEnji Cooper 	int fd;
5657718be8SEnji Cooper 
5757718be8SEnji Cooper 	rump_init();
5857718be8SEnji Cooper 	fd = rump_sys_open("/dev/random", O_RDWR, 0);
5957718be8SEnji Cooper 	if (fd == -1)
6057718be8SEnji Cooper 		atf_tc_fail_errno("cannot open /dev/random");
6157718be8SEnji Cooper 
6257718be8SEnji Cooper 	rd.entropy = 1;
6357718be8SEnji Cooper 	rd.len = 1;
6457718be8SEnji Cooper 	if (rump_sys_ioctl(fd, RNDADDDATA, &rd) == -1)
6557718be8SEnji Cooper 		atf_tc_fail_errno("RNDADDDATA");
6657718be8SEnji Cooper }
6757718be8SEnji Cooper 
6857718be8SEnji Cooper ATF_TC(RNDADDDATA2);
ATF_TC_HEAD(RNDADDDATA2,tc)6957718be8SEnji Cooper ATF_TC_HEAD(RNDADDDATA2, tc)
7057718be8SEnji Cooper {
7157718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "checks ioctl(RNDADDDATA) deals with "
7257718be8SEnji Cooper 	    "garbage len field");
7357718be8SEnji Cooper }
ATF_TC_BODY(RNDADDDATA2,tc)7457718be8SEnji Cooper ATF_TC_BODY(RNDADDDATA2, tc)
7557718be8SEnji Cooper {
7657718be8SEnji Cooper 	rnddata_t rd;
7757718be8SEnji Cooper 	int fd;
7857718be8SEnji Cooper 
7957718be8SEnji Cooper 	rump_init();
8057718be8SEnji Cooper 	fd = rump_sys_open("/dev/random", O_RDWR, 0);
8157718be8SEnji Cooper 	if (fd == -1)
8257718be8SEnji Cooper 		atf_tc_fail_errno("cannot open /dev/random");
8357718be8SEnji Cooper 
8457718be8SEnji Cooper 	rd.entropy = 1;
8557718be8SEnji Cooper 	rd.len = -1;
8657718be8SEnji Cooper 	ATF_REQUIRE_ERRNO(EINVAL, rump_sys_ioctl(fd, RNDADDDATA, &rd) == -1);
8757718be8SEnji Cooper }
8857718be8SEnji Cooper 
89640235e2SEnji Cooper ATF_TC(read_random);
ATF_TC_HEAD(read_random,tc)90640235e2SEnji Cooper ATF_TC_HEAD(read_random, tc)
91640235e2SEnji Cooper {
92640235e2SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "does reading /dev/random return "
93640235e2SEnji Cooper 	    "within reasonable time");
94640235e2SEnji Cooper 	atf_tc_set_md_var(tc, "timeout", "10");
95640235e2SEnji Cooper }
96640235e2SEnji Cooper 
ATF_TC_BODY(read_random,tc)97640235e2SEnji Cooper ATF_TC_BODY(read_random, tc)
98640235e2SEnji Cooper {
99640235e2SEnji Cooper 	char buf[128];
100640235e2SEnji Cooper 	int fd;
101640235e2SEnji Cooper 
102640235e2SEnji Cooper 	rump_init();
103640235e2SEnji Cooper 	RL(fd = rump_sys_open("/dev/random", O_RDONLY));
104640235e2SEnji Cooper 	RL(rump_sys_read(fd, buf, sizeof(buf)));
105640235e2SEnji Cooper }
106640235e2SEnji Cooper 
ATF_TP_ADD_TCS(tp)10757718be8SEnji Cooper ATF_TP_ADD_TCS(tp)
10857718be8SEnji Cooper {
10957718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, RNDADDDATA);
11057718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, RNDADDDATA2);
111640235e2SEnji Cooper 	ATF_TP_ADD_TC(tp, read_random);
11257718be8SEnji Cooper 
11357718be8SEnji Cooper 	return atf_no_error();
11457718be8SEnji Cooper }
115