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