xref: /netbsd-src/tests/crypto/opencrypto/h_ioctl.c (revision cdd57aa330f4b4b77669afb8de4ad492c5911675)
1*cdd57aa3Sriastradh /*	$NetBSD: h_ioctl.c,v 1.6 2023/08/05 13:29:57 riastradh Exp $	*/
21c9c1256Sknakahara 
31c9c1256Sknakahara /*-
41c9c1256Sknakahara  * Copyright (c) 2017 Internet Initiative Japan Inc.
51c9c1256Sknakahara  * All rights reserved.
61c9c1256Sknakahara  *
71c9c1256Sknakahara  * Redistribution and use in source and binary forms, with or without
81c9c1256Sknakahara  * modification, are permitted provided that the following conditions
91c9c1256Sknakahara  * are met:
101c9c1256Sknakahara  * 1. Redistributions of source code must retain the above copyright
111c9c1256Sknakahara  *    notice, this list of conditions and the following disclaimer.
121c9c1256Sknakahara  * 2. Redistributions in binary form must reproduce the above copyright
131c9c1256Sknakahara  *    notice, this list of conditions and the following disclaimer in the
141c9c1256Sknakahara  *    documentation and/or other materials provided with the distribution.
151c9c1256Sknakahara  *
161c9c1256Sknakahara  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
171c9c1256Sknakahara  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
181c9c1256Sknakahara  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
191c9c1256Sknakahara  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
201c9c1256Sknakahara  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
211c9c1256Sknakahara  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
221c9c1256Sknakahara  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
231c9c1256Sknakahara  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
241c9c1256Sknakahara  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
251c9c1256Sknakahara  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
261c9c1256Sknakahara  * POSSIBILITY OF SUCH DAMAGE.
271c9c1256Sknakahara  */
281c9c1256Sknakahara 
291c9c1256Sknakahara #include <err.h>
301c9c1256Sknakahara #include <errno.h>
311c9c1256Sknakahara #include <fcntl.h>
322043158fSriastradh #include <poll.h>
331c9c1256Sknakahara #include <stdio.h>
341c9c1256Sknakahara #include <string.h>
35*cdd57aa3Sriastradh #include <unistd.h>
361c9c1256Sknakahara 
371c9c1256Sknakahara #include <sys/errno.h>
381c9c1256Sknakahara #include <sys/ioctl.h>
391c9c1256Sknakahara #include <sys/sysctl.h>
401c9c1256Sknakahara 
411c9c1256Sknakahara #include <crypto/cryptodev.h>
421c9c1256Sknakahara 
431c9c1256Sknakahara /* copy from h_aescbc.c */
441c9c1256Sknakahara #define AES_KEY_LEN 16
451c9c1256Sknakahara unsigned char aes_key[AES_KEY_LEN] =
461c9c1256Sknakahara { 0x06, 0xa9, 0x21, 0x40, 0x36, 0xb8, 0xa1, 0x5b,
471c9c1256Sknakahara   0x51, 0x2e, 0x03, 0xd5, 0x34, 0x12, 0x00, 0x06, };
481c9c1256Sknakahara 
491c9c1256Sknakahara #define AES_IV_LEN 16
501c9c1256Sknakahara unsigned char aes_iv[AES_IV_LEN] =
511c9c1256Sknakahara { 0x3d, 0xaf, 0xba, 0x42, 0x9d, 0x9e, 0xb4, 0x30,
521c9c1256Sknakahara   0xb4, 0x22, 0xda, 0x80, 0x2c, 0x9f, 0xac, 0x41, };
531c9c1256Sknakahara 
541c9c1256Sknakahara #define AES_PLAINTX_LEN 64
551c9c1256Sknakahara unsigned char aes_plaintx[AES_PLAINTX_LEN] = "Single block msg";
561c9c1256Sknakahara 
571c9c1256Sknakahara #define AES_CIPHER_LEN 64
581c9c1256Sknakahara unsigned char aes_cipher[AES_CIPHER_LEN] =
591c9c1256Sknakahara { 0xe3, 0x53, 0x77, 0x9c, 0x10, 0x79, 0xae, 0xb8,
601c9c1256Sknakahara   0x27, 0x08, 0x94, 0x2d, 0xbe, 0x77, 0x18, 0x1a, };
611c9c1256Sknakahara 
6297ebf3e4Schristos #define COUNT 2
6397ebf3e4Schristos 
642043158fSriastradh static int
wait_for_read(int fd)652043158fSriastradh wait_for_read(int fd)
662043158fSriastradh {
672043158fSriastradh 	struct pollfd pfd = { .fd = fd, .events = POLLIN };
682043158fSriastradh 	int nfd;
692043158fSriastradh 
702043158fSriastradh 	nfd = poll(&pfd, 1, 5000);
712043158fSriastradh 	if (nfd == -1) {
722043158fSriastradh 		warn("failed: poll");
732043158fSriastradh 		return -1;
742043158fSriastradh 	}
752043158fSriastradh 	if (nfd == 0) {
762043158fSriastradh 		warnx("failed: timeout");
772043158fSriastradh 		errno = ETIMEDOUT;
782043158fSriastradh 		return -1;
792043158fSriastradh 	}
802043158fSriastradh 	if (nfd != 1 || (pfd.revents & POLLIN) == 0) {
812043158fSriastradh 		warnx("failed: invalid poll: %d", nfd);
822043158fSriastradh 		errno = EIO;
832043158fSriastradh 		return -1;
842043158fSriastradh 	}
852043158fSriastradh 	return 0;
862043158fSriastradh }
872043158fSriastradh 
881c9c1256Sknakahara /*
891c9c1256Sknakahara  * CRIOGET is deprecated.
901c9c1256Sknakahara  */
911c9c1256Sknakahara 
921c9c1256Sknakahara /*
931c9c1256Sknakahara  * CIOCNGSESSION
941c9c1256Sknakahara  * Hmm, who uses? (1)
951c9c1256Sknakahara  */
961c9c1256Sknakahara static int
test_ngsession(int fd)971c9c1256Sknakahara test_ngsession(int fd)
981c9c1256Sknakahara {
991c9c1256Sknakahara 	int ret;
1001c9c1256Sknakahara 	struct crypt_sgop sg;
10197ebf3e4Schristos 	struct session_n_op css[COUNT];
1021c9c1256Sknakahara 
10397ebf3e4Schristos 	for (size_t i = 0; i < COUNT; i++) {
1041c9c1256Sknakahara 		struct session_n_op *cs = &css[i];
1051c9c1256Sknakahara 
1061c9c1256Sknakahara 		memset(cs, 0, sizeof(*cs));
1071c9c1256Sknakahara 		cs->cipher = CRYPTO_AES_CBC;
1081c9c1256Sknakahara 		cs->keylen = AES_KEY_LEN;
1091c9c1256Sknakahara 		cs->key = __UNCONST(&aes_key);
1101c9c1256Sknakahara 	}
1111c9c1256Sknakahara 	memset(&sg, 0, sizeof(sg));
11297ebf3e4Schristos 	sg.count = COUNT;
1131c9c1256Sknakahara 	sg.sessions = css;
1141c9c1256Sknakahara 
1151c9c1256Sknakahara 	ret = ioctl(fd, CIOCNGSESSION, &sg);
1161c9c1256Sknakahara 	if (ret < 0)
1172efe87beSriastradh 		warn("failed: CIOCNGSESSION");
1181c9c1256Sknakahara 
1191c9c1256Sknakahara 	return ret;
1201c9c1256Sknakahara }
1211c9c1256Sknakahara 
1221c9c1256Sknakahara /*
1231c9c1256Sknakahara  * CIOCNFSESSION
1241c9c1256Sknakahara  * Hmm, who uses? (2)
1251c9c1256Sknakahara  */
1261c9c1256Sknakahara static int
test_nfsession(int fd)1271c9c1256Sknakahara test_nfsession(int fd)
1281c9c1256Sknakahara {
1291c9c1256Sknakahara 	int ret;
1301c9c1256Sknakahara 	struct crypt_sfop sf;
13197ebf3e4Schristos 	u_int32_t sids[COUNT];
1321c9c1256Sknakahara 
1331c9c1256Sknakahara 	memset(sids, 0, sizeof(sids));
1341c9c1256Sknakahara 	memset(&sf, 0, sizeof(sf));
13597ebf3e4Schristos 	sf.count = COUNT;
1361c9c1256Sknakahara 	sf.sesid = sids;
1371c9c1256Sknakahara 
1381c9c1256Sknakahara 	ret = ioctl(fd, CIOCNFSESSION, &sf);
1391c9c1256Sknakahara 	if (ret < 0)
1402efe87beSriastradh 		warn("failed: CIOCNFSESSION");
1411c9c1256Sknakahara 
1421c9c1256Sknakahara 	return ret;
1431c9c1256Sknakahara }
1441c9c1256Sknakahara 
1451c9c1256Sknakahara /*
1461c9c1256Sknakahara  * CIOCNCRYPTM
1471c9c1256Sknakahara  * Hmm, who uses? (3)
1481c9c1256Sknakahara  */
1491c9c1256Sknakahara static int
test_ncryptm(int fd)1501c9c1256Sknakahara test_ncryptm(int fd)
1511c9c1256Sknakahara {
1521c9c1256Sknakahara 	int ret;
1531c9c1256Sknakahara 	struct crypt_mop mop;
15497ebf3e4Schristos 	struct crypt_n_op css[COUNT];
1551c9c1256Sknakahara 
15697ebf3e4Schristos 	for (size_t i = 0; i < COUNT; i++) {
1571c9c1256Sknakahara 		struct crypt_n_op *cs;
1581c9c1256Sknakahara 		cs = &css[i];
1591c9c1256Sknakahara 
1601c9c1256Sknakahara 		memset(cs, 0, sizeof(*cs));
1611c9c1256Sknakahara 		cs->ses = 0; /* session id */
1621c9c1256Sknakahara 		cs->op = COP_ENCRYPT;
1631c9c1256Sknakahara 		/* XXX */
1641c9c1256Sknakahara 	}
1651c9c1256Sknakahara 
1661c9c1256Sknakahara 	memset(&mop, 0, sizeof(mop));
16797ebf3e4Schristos 	mop.count = COUNT;
1681c9c1256Sknakahara 	mop.reqs = css;
1691c9c1256Sknakahara 
1701c9c1256Sknakahara 	ret = ioctl(fd, CIOCNCRYPTM, &mop);
1711c9c1256Sknakahara 	if (ret < 0)
1722efe87beSriastradh 		warn("failed: CIOCNCRYPTM");
1731c9c1256Sknakahara 
1741c9c1256Sknakahara 	return ret;
1751c9c1256Sknakahara }
1761c9c1256Sknakahara 
1771c9c1256Sknakahara /*
1781c9c1256Sknakahara  * CIOCNCRYPTRETM
1791c9c1256Sknakahara  * Hmm, who uses? (4)
1801c9c1256Sknakahara  */
1811c9c1256Sknakahara static int
test_ncryptretm(int fd)1821c9c1256Sknakahara test_ncryptretm(int fd)
1831c9c1256Sknakahara {
1841c9c1256Sknakahara 	int ret;
1851c9c1256Sknakahara 	struct session_op cs;
1861c9c1256Sknakahara 
1871c9c1256Sknakahara 	struct crypt_mop mop;
18897ebf3e4Schristos 	struct crypt_n_op cnos[COUNT];
18997ebf3e4Schristos 	unsigned char cno_dst[COUNT][AES_CIPHER_LEN];
1901c9c1256Sknakahara 	struct cryptret cret;
19197ebf3e4Schristos 	struct crypt_result crs[COUNT];
1921c9c1256Sknakahara 
1931c9c1256Sknakahara 	memset(&cs, 0, sizeof(cs));
1941c9c1256Sknakahara 	cs.cipher = CRYPTO_AES_CBC;
1951c9c1256Sknakahara 	cs.keylen = AES_KEY_LEN;
1961c9c1256Sknakahara 	cs.key = __UNCONST(&aes_key);
1971c9c1256Sknakahara 	ret = ioctl(fd, CIOCGSESSION, &cs);
1981c9c1256Sknakahara 	if (ret < 0) {
1992efe87beSriastradh 		warn("failed: CIOCGSESSION");
2001c9c1256Sknakahara 		return ret;
2011c9c1256Sknakahara 	}
2021c9c1256Sknakahara 
20397ebf3e4Schristos 	for (size_t i = 0; i < COUNT; i++) {
2041c9c1256Sknakahara 		struct crypt_n_op *cno = &cnos[i];
2051c9c1256Sknakahara 
2061c9c1256Sknakahara 		memset(cno, 0, sizeof(*cno));
2071c9c1256Sknakahara 		cno->ses = cs.ses;
2081c9c1256Sknakahara 		cno->op = COP_ENCRYPT;
2091c9c1256Sknakahara 		cno->len = AES_PLAINTX_LEN;
2101c9c1256Sknakahara 		cno->src = aes_plaintx;
2111c9c1256Sknakahara 		cno->dst_len = AES_CIPHER_LEN;
2121c9c1256Sknakahara 		cno->dst = cno_dst[i];
2131c9c1256Sknakahara 	}
2141c9c1256Sknakahara 
2151c9c1256Sknakahara 	memset(&mop, 0, sizeof(mop));
21697ebf3e4Schristos 	mop.count = COUNT;
2171c9c1256Sknakahara 	mop.reqs = cnos;
2181c9c1256Sknakahara 	ret = ioctl(fd, CIOCNCRYPTM, &mop);
2192043158fSriastradh 	if (ret < 0) {
2202efe87beSriastradh 		warn("failed: CIOCNCRYPTM");
2212043158fSriastradh 		return ret;
2222043158fSriastradh 	}
2231c9c1256Sknakahara 
22497ebf3e4Schristos 	for (size_t i = 0; i < COUNT; i++) {
2251c9c1256Sknakahara 		struct crypt_result *cr = &crs[i];
2261c9c1256Sknakahara 
2271c9c1256Sknakahara 		memset(cr, 0, sizeof(*cr));
2281c9c1256Sknakahara 		cr->reqid = cnos[i].reqid;
2291c9c1256Sknakahara 	}
2301c9c1256Sknakahara 
2311c9c1256Sknakahara 	memset(&cret, 0, sizeof(cret));
23297ebf3e4Schristos 	cret.count = COUNT;
2331c9c1256Sknakahara 	cret.results = crs;
2341c9c1256Sknakahara 	ret = ioctl(fd, CIOCNCRYPTRETM, &cret);
2352043158fSriastradh 	if (ret < 0) {
2362043158fSriastradh 		if (errno != EINPROGRESS) {
2372efe87beSriastradh 			warn("failed: CIOCNCRYPTRETM");
2382043158fSriastradh 			return ret;
2392043158fSriastradh 		}
2402043158fSriastradh 
2412043158fSriastradh 		ret = wait_for_read(fd);
2422043158fSriastradh 		if (ret < 0)
2432043158fSriastradh 			return ret;
2442043158fSriastradh 
2452043158fSriastradh 		cret.count = COUNT;
2462043158fSriastradh 		cret.results = crs;
2472043158fSriastradh 		ret = ioctl(fd, CIOCNCRYPTRETM, &cret);
2482043158fSriastradh 		if (ret < 0) {
2492043158fSriastradh 			warn("failed: CIOCNCRYPTRET");
2502043158fSriastradh 			return ret;
2512043158fSriastradh 		}
2522043158fSriastradh 	}
2531c9c1256Sknakahara 
2541c9c1256Sknakahara 	return ret;
2551c9c1256Sknakahara }
2561c9c1256Sknakahara 
2571c9c1256Sknakahara /*
2581c9c1256Sknakahara  * CIOCNCRYPTRET
2591c9c1256Sknakahara  * Hmm, who uses? (5)
2601c9c1256Sknakahara  */
2611c9c1256Sknakahara /* test when it does not request yet. */
2621c9c1256Sknakahara static int
test_ncryptret_noent(int fd)2631c9c1256Sknakahara test_ncryptret_noent(int fd)
2641c9c1256Sknakahara {
2651c9c1256Sknakahara 	int ret;
2661c9c1256Sknakahara 	struct crypt_result cr;
2671c9c1256Sknakahara 
2681c9c1256Sknakahara 	memset(&cr, 0, sizeof(cr));
2691c9c1256Sknakahara 
2701c9c1256Sknakahara 	ret = ioctl(fd, CIOCNCRYPTRET, &cr);
2711c9c1256Sknakahara 	if (ret == 0) {
2722efe87beSriastradh 		warn("failed: CIOCNCRYPTRET unexpected success when no entry");
2731c9c1256Sknakahara 		ret = -1;
2741c9c1256Sknakahara 	} else if (errno == EINPROGRESS) {
2751c9c1256Sknakahara 		/* expected fail */
2761c9c1256Sknakahara 		ret = 0;
2771c9c1256Sknakahara 	}
2781c9c1256Sknakahara 
2791c9c1256Sknakahara 	return ret;
2801c9c1256Sknakahara }
2811c9c1256Sknakahara 
2821c9c1256Sknakahara static int
test_ncryptret_ent(int fd)2831c9c1256Sknakahara test_ncryptret_ent(int fd)
2841c9c1256Sknakahara {
2851c9c1256Sknakahara 	int ret;
2861c9c1256Sknakahara 	struct session_op cs;
2871c9c1256Sknakahara 
2881c9c1256Sknakahara 	struct crypt_mop mop;
2891c9c1256Sknakahara 	struct crypt_n_op cno;
2901c9c1256Sknakahara 	unsigned char cno_dst[AES_CIPHER_LEN];
2911c9c1256Sknakahara 
2921c9c1256Sknakahara 	struct crypt_result cr;
2931c9c1256Sknakahara 
2941c9c1256Sknakahara 	memset(&cs, 0, sizeof(cs));
2951c9c1256Sknakahara 	cs.cipher = CRYPTO_AES_CBC;
2961c9c1256Sknakahara 	cs.keylen = AES_KEY_LEN;
2971c9c1256Sknakahara 	cs.key = __UNCONST(&aes_key);
2981c9c1256Sknakahara 	ret = ioctl(fd, CIOCGSESSION, &cs);
2991c9c1256Sknakahara 	if (ret < 0) {
3002efe87beSriastradh 		warn("failed: CIOCGSESSION");
3011c9c1256Sknakahara 		return ret;
3021c9c1256Sknakahara 	}
3031c9c1256Sknakahara 
3041c9c1256Sknakahara 	memset(&cno, 0, sizeof(cno));
3051c9c1256Sknakahara 	cno.ses = cs.ses;
3061c9c1256Sknakahara 	cno.op = COP_ENCRYPT;
3071c9c1256Sknakahara 	cno.len = AES_PLAINTX_LEN;
3081c9c1256Sknakahara 	cno.src = aes_plaintx;
3091c9c1256Sknakahara 	cno.dst_len = AES_CIPHER_LEN;
3101c9c1256Sknakahara 	cno.dst = cno_dst;
3111c9c1256Sknakahara 
3121c9c1256Sknakahara 	memset(&mop, 0, sizeof(mop));
3131c9c1256Sknakahara 	mop.count = 1;
3141c9c1256Sknakahara 	mop.reqs = &cno;
3151c9c1256Sknakahara 	ret = ioctl(fd, CIOCNCRYPTM, &mop);
3162043158fSriastradh 	if (ret < 0) {
3172efe87beSriastradh 		warn("failed: CIOCNCRYPTM");
3182043158fSriastradh 		return ret;
3192043158fSriastradh 	}
3201c9c1256Sknakahara 
3211c9c1256Sknakahara 	memset(&cr, 0, sizeof(cr));
3221c9c1256Sknakahara 	cr.reqid = cno.reqid;
3231c9c1256Sknakahara 
3241c9c1256Sknakahara 	ret = ioctl(fd, CIOCNCRYPTRET, &cr);
3252043158fSriastradh 	if (ret < 0) {
3262043158fSriastradh 		if (errno != EINPROGRESS) {
3272efe87beSriastradh 			warn("failed: CIOCNCRYPTRET");
3282043158fSriastradh 			return ret;
3292043158fSriastradh 		}
3302043158fSriastradh 
3312043158fSriastradh 		ret = wait_for_read(fd);
3322043158fSriastradh 		if (ret < 0)
3332043158fSriastradh 			return ret;
3342043158fSriastradh 		ret = ioctl(fd, CIOCNCRYPTRET, &cr);
3352043158fSriastradh 		if (ret < 0) {
3362043158fSriastradh 			warn("failed: CIOCNCRYPTRET");
3372043158fSriastradh 			return ret;
3382043158fSriastradh 		}
3392043158fSriastradh 		return 0;
3402043158fSriastradh 	}
3411c9c1256Sknakahara 
3421c9c1256Sknakahara 	return ret;
3431c9c1256Sknakahara }
3441c9c1256Sknakahara 
3451c9c1256Sknakahara static int
test_ncryptret(int fd)3461c9c1256Sknakahara test_ncryptret(int fd)
3471c9c1256Sknakahara {
3481c9c1256Sknakahara 	int ret;
3491c9c1256Sknakahara 
3501c9c1256Sknakahara 	ret = test_ncryptret_noent(fd);
3511c9c1256Sknakahara 	if (ret < 0)
3521c9c1256Sknakahara 		return ret;
3531c9c1256Sknakahara 
3541c9c1256Sknakahara 	ret = test_ncryptret_ent(fd);
3551c9c1256Sknakahara 	if (ret < 0)
3561c9c1256Sknakahara 		return ret;
3571c9c1256Sknakahara 
3581c9c1256Sknakahara 	return ret;
3591c9c1256Sknakahara }
3601c9c1256Sknakahara 
3611c9c1256Sknakahara /*
3621c9c1256Sknakahara  * CIOCASYMFEAT
3631c9c1256Sknakahara  */
3641c9c1256Sknakahara static int
set_userasymcrypto(int new,int * old)3651c9c1256Sknakahara set_userasymcrypto(int new, int *old)
3661c9c1256Sknakahara {
3671c9c1256Sknakahara 	int ret;
3681c9c1256Sknakahara 
3691c9c1256Sknakahara 	ret = sysctlbyname("kern.userasymcrypto", NULL, NULL, &new, sizeof(new));
3701c9c1256Sknakahara 	if (ret < 0) {
3712efe87beSriastradh 		warn("failed: kern.userasymcrypto=%d", new);
3721c9c1256Sknakahara 		return ret;
3731c9c1256Sknakahara 	}
3741c9c1256Sknakahara 
3751c9c1256Sknakahara 	if (old != NULL)
3761c9c1256Sknakahara 		*old = new;
3771c9c1256Sknakahara 
3781c9c1256Sknakahara 	return ret;
3791c9c1256Sknakahara }
3801c9c1256Sknakahara 
3811c9c1256Sknakahara static int
test_asymfeat_each(int fd,u_int32_t * asymfeat,int userasym)3821c9c1256Sknakahara test_asymfeat_each(int fd, u_int32_t *asymfeat, int userasym)
3831c9c1256Sknakahara {
3841c9c1256Sknakahara 	int ret;
3851c9c1256Sknakahara 
3861c9c1256Sknakahara 	ret = ioctl(fd, CIOCASYMFEAT, asymfeat);
3871c9c1256Sknakahara 	if (ret < 0)
3882efe87beSriastradh 		warn("failed: CIOCASYMFEAT when userasym=%d", userasym);
3891c9c1256Sknakahara 
3901c9c1256Sknakahara 	return ret;
3911c9c1256Sknakahara }
3921c9c1256Sknakahara 
3931c9c1256Sknakahara static int
test_asymfeat(int fd)3941c9c1256Sknakahara test_asymfeat(int fd)
3951c9c1256Sknakahara {
3961c9c1256Sknakahara 	int ret, new, orig;
3971c9c1256Sknakahara 	u_int32_t asymfeat = 0;
3981c9c1256Sknakahara 
3991c9c1256Sknakahara 	/* test for kern.userasymcrypto=1 */
4001c9c1256Sknakahara 	new = 1;
4011c9c1256Sknakahara 	ret = set_userasymcrypto(new, &orig);
4021c9c1256Sknakahara 	if (ret < 0)
4031c9c1256Sknakahara 		return ret;
4041c9c1256Sknakahara 	ret = test_asymfeat_each(fd, &asymfeat, new);
4051c9c1256Sknakahara 	if (ret < 0)
4061c9c1256Sknakahara 		return ret;
4071c9c1256Sknakahara 
4081c9c1256Sknakahara 	/* test for kern.userasymcrypto=0 */
4091c9c1256Sknakahara 	new = 0;
4101c9c1256Sknakahara 	ret = set_userasymcrypto(new, NULL);
4111c9c1256Sknakahara 	if (ret < 0)
4121c9c1256Sknakahara 		return ret;
4131c9c1256Sknakahara 	ret = test_asymfeat_each(fd, &asymfeat, new);
4141c9c1256Sknakahara 	if (ret < 0)
4151c9c1256Sknakahara 		return ret;
4161c9c1256Sknakahara 
4171c9c1256Sknakahara 	/* cleanup */
4181c9c1256Sknakahara 	ret = set_userasymcrypto(orig, NULL);
4191c9c1256Sknakahara 	if (ret < 0)
4202efe87beSriastradh 		warnx("failed: cleanup kern.userasymcrypto");
4211c9c1256Sknakahara 
4221c9c1256Sknakahara 	return ret;
4231c9c1256Sknakahara }
4241c9c1256Sknakahara 
4251c9c1256Sknakahara int
main(void)4261c9c1256Sknakahara main(void)
4271c9c1256Sknakahara {
4281c9c1256Sknakahara 	int fd, ret;
4291c9c1256Sknakahara 
4301c9c1256Sknakahara 	fd = open("/dev/crypto", O_RDWR, 0);
4311c9c1256Sknakahara 	if (fd < 0)
4321c9c1256Sknakahara 		err(1, "open");
4331c9c1256Sknakahara 
4341c9c1256Sknakahara 	ret = test_ngsession(fd);
4351c9c1256Sknakahara 	if (ret < 0)
4361c9c1256Sknakahara 		err(1, "test_ngsession");
4371c9c1256Sknakahara 
4381c9c1256Sknakahara 	ret = test_nfsession(fd);
4391c9c1256Sknakahara 	if (ret < 0)
4401c9c1256Sknakahara 		err(1, "test_ngsession");
4411c9c1256Sknakahara 
4421c9c1256Sknakahara 	ret = test_ncryptm(fd);
4431c9c1256Sknakahara 	if (ret < 0)
4441c9c1256Sknakahara 		err(1, "test_ncryptm");
4451c9c1256Sknakahara 
4461c9c1256Sknakahara 	test_ncryptretm(fd);
4471c9c1256Sknakahara 	if (ret < 0)
4481c9c1256Sknakahara 		err(1, "test_ncryptretm");
4491c9c1256Sknakahara 
4501c9c1256Sknakahara 	ret = test_ncryptret(fd);
4511c9c1256Sknakahara 	if (ret < 0)
4521c9c1256Sknakahara 		err(1, "test_ncryptret");
4531c9c1256Sknakahara 
454*cdd57aa3Sriastradh 	if (getuid() == 0) {
4551c9c1256Sknakahara 		ret = test_asymfeat(fd);
4561c9c1256Sknakahara 		if (ret < 0)
4571c9c1256Sknakahara 			err(1, "test_asymfeat");
458*cdd57aa3Sriastradh 	}
4591c9c1256Sknakahara 
4601c9c1256Sknakahara 	return 0;
4611c9c1256Sknakahara }
462