1272343Sngie/* $NetBSD: h_sha1hmac.c,v 1.2 2014/01/18 02:31:14 joerg Exp $ */
2272343Sngie
3272343Sngie/*-
4272343Sngie * Copyright (c) 2014 The NetBSD Foundation, Inc.
5272343Sngie * All rights reserved.
6272343Sngie *
7272343Sngie * Redistribution and use in source and binary forms, with or without
8272343Sngie * modification, are permitted provided that the following conditions
9272343Sngie * are met:
10272343Sngie * 1. Redistributions of source code must retain the above copyright
11272343Sngie *    notice, this list of conditions and the following disclaimer.
12272343Sngie * 2. Redistributions in binary form must reproduce the above copyright
13272343Sngie *    notice, this list of conditions and the following disclaimer in the
14272343Sngie *    documentation and/or other materials provided with the distribution.
15272343Sngie *
16272343Sngie * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17272343Sngie * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18272343Sngie * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19272343Sngie * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20272343Sngie * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21272343Sngie * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22272343Sngie * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23272343Sngie * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24272343Sngie * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25272343Sngie * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26272343Sngie * POSSIBILITY OF SUCH DAMAGE.
27272343Sngie */
28272343Sngie
29272343Sngie#include <err.h>
30272343Sngie#include <fcntl.h>
31272343Sngie#include <stdio.h>
32272343Sngie#include <string.h>
33272343Sngie
34272343Sngie#include <sys/ioctl.h>
35272343Sngie#include <sys/time.h>
36272343Sngie
37272343Sngie#include <crypto/cryptodev.h>
38272343Sngie
39272343Sngie#define SHA1_HMAC_KEYLEN	20	/* Only key-length we support */
40272343Sngie
41272343Sngie/* Test data from RFC2202 */
42272343Sngieconst struct {
43272343Sngie	int num;
44272343Sngie        size_t key_len;
45272343Sngie        size_t len;
46272343Sngie        unsigned char key[80];
47272343Sngie        unsigned char data[80];
48272343Sngie        unsigned char mac[20];
49272343Sngie} tests[] = {
50272343Sngie        /* Test #1 */
51272343Sngie	{ 1, 20, 8,
52272343Sngie	  { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
53272343Sngie	    0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
54272343Sngie	    0x0b, 0x0b, 0x0b, 0x0b },
55272343Sngie	  "Hi There",
56272343Sngie	  { 0xb6, 0x17, 0x31, 0x86, 0x55, 0x05, 0x72, 0x64,
57272343Sngie	    0xe2, 0x8b, 0xc0, 0xb6, 0xfb, 0x37, 0x8c, 0x8e,
58272343Sngie	    0xf1, 0x46, 0xbe, 0x00 }
59272343Sngie	},
60272343Sngie        /* Test #2 */
61272343Sngie	{ 2, 4, 28,
62272343Sngie	  "Jefe",
63272343Sngie	  "what do ya want for nothing?",
64272343Sngie	  { 0xef, 0xfc, 0xdf, 0x6a, 0xe5, 0xeb, 0x2f, 0xa2,
65272343Sngie	    0xd2, 0x74, 0x16, 0xd5, 0xf1, 0x84, 0xdf, 0x9c,
66272343Sngie	    0x25, 0x9a, 0x7c, 0x79 }
67272343Sngie	},
68272343Sngie        /* Test #3 */
69272343Sngie	{ 3, 20, 50,
70272343Sngie	  { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
71272343Sngie	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
72272343Sngie	    0xaa, 0xaa, 0xaa, 0xaa },
73272343Sngie	  { 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
74272343Sngie	    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
75272343Sngie	    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
76272343Sngie	    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
77272343Sngie	    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
78272343Sngie	    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
79272343Sngie	    0xdd, 0xdd },
80272343Sngie	  { 0x12, 0x5d, 0x73, 0x42, 0xb9, 0xac, 0x11, 0xcd,
81272343Sngie	    0x91, 0xa3, 0x9a, 0xf4, 0x8a, 0xa1, 0x7b, 0x4f,
82272343Sngie	    0x63, 0xf1, 0x75, 0xd3 }
83272343Sngie	},
84272343Sngie        /* Test #4 */
85272343Sngie	{ 4, 25, 50,
86272343Sngie	  { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
87272343Sngie	    0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
88272343Sngie	    0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
89272343Sngie	    0x19 },
90272343Sngie	  { 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
91272343Sngie	    0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
92272343Sngie	    0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
93272343Sngie	    0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
94272343Sngie	    0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
95272343Sngie	    0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
96272343Sngie	    0xcd, 0xcd },
97272343Sngie	  { 0x4c, 0x90, 0x07, 0xf4, 0x02, 0x62, 0x50, 0xc6,
98272343Sngie	    0xbc, 0x84, 0x14, 0xf9, 0xbf, 0x50, 0xc8, 0x6c,
99272343Sngie	    0x2d, 0x72, 0x35, 0xda }
100272343Sngie	},
101272343Sngie        /* Test #5 */
102272343Sngie	{ 5, 20, 20,
103272343Sngie	  { 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
104272343Sngie	    0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
105272343Sngie	    0x0c, 0x0c, 0x0c, 0x0c },
106272343Sngie	  "Test With Truncation",
107272343Sngie	  { 0x4c, 0x1a, 0x03, 0x42, 0x4b, 0x55, 0xe0, 0x7f,
108272343Sngie	    0xe7, 0xf2, 0x7b, 0xe1, 0xd5, 0x8b, 0xb9, 0x32,
109272343Sngie	    0x4a, 0x9a, 0x5a, 0x04 }
110272343Sngie	},
111272343Sngie        /* Test #6 */
112272343Sngie	{ 6, 80, 54,
113272343Sngie	  { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
114272343Sngie	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
115272343Sngie	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
116272343Sngie	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
117272343Sngie	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
118272343Sngie	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
119272343Sngie	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
120272343Sngie	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
121272343Sngie	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
122272343Sngie	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa },
123272343Sngie	  "Test Using Larger Than Block-Size Key - Hash Key First",
124272343Sngie	  { 0xaa, 0x4a, 0xe5, 0xe1, 0x52, 0x72, 0xd0, 0x0e,
125272343Sngie	    0x95, 0x70, 0x56, 0x37, 0xce, 0x8a, 0x3b, 0x55,
126272343Sngie	    0xed, 0x40, 0x21, 0x12 }
127272343Sngie	},
128272343Sngie        /* Test #7 */
129272343Sngie	{ 7, 80, 73,
130272343Sngie	  { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
131272343Sngie	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
132272343Sngie	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
133272343Sngie	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
134272343Sngie	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
135272343Sngie	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
136272343Sngie	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
137272343Sngie	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
138272343Sngie	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
139272343Sngie	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa },
140272343Sngie	  "Test Using Larger Than Block-Size Key and Larger Than "
141272343Sngie		"One Block-Size Data",
142272343Sngie	  { 0xe8, 0xe9, 0x9d, 0x0f, 0x45, 0x23, 0x7d, 0x78,
143272343Sngie	    0x6d, 0x6b, 0xba, 0xa7, 0x96, 0x5c, 0x78, 0x08,
144272343Sngie	    0xbb, 0xff, 0x1a, 0x91 }
145272343Sngie	},
146272343Sngie};
147272343Sngie
148272343Sngieint
149272343Sngiemain(void)
150272343Sngie{
151272343Sngie	size_t i;
152272343Sngie	int fd, res;
153272343Sngie	struct session_op cs;
154272343Sngie	struct crypt_op co;
155272343Sngie	unsigned char buf[20];
156272343Sngie
157272343Sngie	fd = open("/dev/crypto", O_RDWR, 0);
158272343Sngie	if (fd < 0)
159272343Sngie		err(1, "open");
160272343Sngie	for (i = 0; i < __arraycount(tests); i++) {
161272343Sngie		if (tests[i].key_len != SHA1_HMAC_KEYLEN)
162272343Sngie			continue;
163272343Sngie
164272343Sngie		memset(&cs, 0, sizeof(cs));
165272343Sngie		cs.mac = CRYPTO_SHA1_HMAC;
166272343Sngie		cs.mackeylen = tests[i].key_len;
167272343Sngie		cs.mackey = __UNCONST(&tests[i].key);
168272343Sngie		res = ioctl(fd, CIOCGSESSION, &cs);
169272343Sngie		if (res < 0)
170272343Sngie			err(1, "CIOCGSESSION test %d", tests[i].num);
171272343Sngie
172272343Sngie		memset(&co, 0, sizeof(co));
173272343Sngie		memset(buf, 0, sizeof(buf));
174272343Sngie		co.ses = cs.ses;
175272343Sngie		co.op = COP_ENCRYPT;
176272343Sngie		co.len = tests[i].len;
177272343Sngie		co.src = __UNCONST(&tests[i].data);
178272343Sngie		co.mac = buf;
179272343Sngie		res = ioctl(fd, CIOCCRYPT, &co);
180272343Sngie		if (res < 0)
181272343Sngie			err(1, "CIOCCRYPT test %d", tests[i].num);
182272343Sngie
183272343Sngie		if (memcmp(co.mac, &tests[i].mac, sizeof(tests[i].mac)))
184272343Sngie			errx(1, "verification failed test %d", tests[i].num);
185272343Sngie
186272343Sngie		res = ioctl(fd, CIOCFSESSION, &cs.ses);
187272343Sngie		if (res < 0)
188272343Sngie			err(1, "CIOCFSESSION test %d", tests[i].num);
189272343Sngie	}
190272343Sngie	return 0;
191272343Sngie}
192