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