1 /* $NetBSD: h_sha1hmac.c,v 1.2 2014/01/18 02:31:14 joerg Exp $ */ 2 3 /*- 4 * Copyright (c) 2014 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include <err.h> 30 #include <fcntl.h> 31 #include <stdio.h> 32 #include <string.h> 33 34 #include <sys/ioctl.h> 35 #include <sys/time.h> 36 37 #include <crypto/cryptodev.h> 38 39 #define SHA1_HMAC_KEYLEN 20 /* Only key-length we support */ 40 41 /* Test data from RFC2202 */ 42 const struct { 43 int num; 44 size_t key_len; 45 size_t len; 46 unsigned char key[80]; 47 unsigned char data[80]; 48 unsigned char mac[20]; 49 } tests[] = { 50 /* Test #1 */ 51 { 1, 20, 8, 52 { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 53 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 54 0x0b, 0x0b, 0x0b, 0x0b }, 55 "Hi There", 56 { 0xb6, 0x17, 0x31, 0x86, 0x55, 0x05, 0x72, 0x64, 57 0xe2, 0x8b, 0xc0, 0xb6, 0xfb, 0x37, 0x8c, 0x8e, 58 0xf1, 0x46, 0xbe, 0x00 } 59 }, 60 /* Test #2 */ 61 { 2, 4, 28, 62 "Jefe", 63 "what do ya want for nothing?", 64 { 0xef, 0xfc, 0xdf, 0x6a, 0xe5, 0xeb, 0x2f, 0xa2, 65 0xd2, 0x74, 0x16, 0xd5, 0xf1, 0x84, 0xdf, 0x9c, 66 0x25, 0x9a, 0x7c, 0x79 } 67 }, 68 /* Test #3 */ 69 { 3, 20, 50, 70 { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 71 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 72 0xaa, 0xaa, 0xaa, 0xaa }, 73 { 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 74 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 75 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 76 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 77 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 78 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 79 0xdd, 0xdd }, 80 { 0x12, 0x5d, 0x73, 0x42, 0xb9, 0xac, 0x11, 0xcd, 81 0x91, 0xa3, 0x9a, 0xf4, 0x8a, 0xa1, 0x7b, 0x4f, 82 0x63, 0xf1, 0x75, 0xd3 } 83 }, 84 /* Test #4 */ 85 { 4, 25, 50, 86 { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 87 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 88 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 89 0x19 }, 90 { 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 91 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 92 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 93 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 94 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 95 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 96 0xcd, 0xcd }, 97 { 0x4c, 0x90, 0x07, 0xf4, 0x02, 0x62, 0x50, 0xc6, 98 0xbc, 0x84, 0x14, 0xf9, 0xbf, 0x50, 0xc8, 0x6c, 99 0x2d, 0x72, 0x35, 0xda } 100 }, 101 /* Test #5 */ 102 { 5, 20, 20, 103 { 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 104 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 105 0x0c, 0x0c, 0x0c, 0x0c }, 106 "Test With Truncation", 107 { 0x4c, 0x1a, 0x03, 0x42, 0x4b, 0x55, 0xe0, 0x7f, 108 0xe7, 0xf2, 0x7b, 0xe1, 0xd5, 0x8b, 0xb9, 0x32, 109 0x4a, 0x9a, 0x5a, 0x04 } 110 }, 111 /* Test #6 */ 112 { 6, 80, 54, 113 { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 114 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 115 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 116 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 117 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 118 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 119 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 120 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 121 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 122 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa }, 123 "Test Using Larger Than Block-Size Key - Hash Key First", 124 { 0xaa, 0x4a, 0xe5, 0xe1, 0x52, 0x72, 0xd0, 0x0e, 125 0x95, 0x70, 0x56, 0x37, 0xce, 0x8a, 0x3b, 0x55, 126 0xed, 0x40, 0x21, 0x12 } 127 }, 128 /* Test #7 */ 129 { 7, 80, 73, 130 { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 131 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 132 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 133 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 134 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 135 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 136 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 137 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 138 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 139 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa }, 140 "Test Using Larger Than Block-Size Key and Larger Than " 141 "One Block-Size Data", 142 { 0xe8, 0xe9, 0x9d, 0x0f, 0x45, 0x23, 0x7d, 0x78, 143 0x6d, 0x6b, 0xba, 0xa7, 0x96, 0x5c, 0x78, 0x08, 144 0xbb, 0xff, 0x1a, 0x91 } 145 }, 146 }; 147 148 int 149 main(void) 150 { 151 size_t i; 152 int fd, res; 153 struct session_op cs; 154 struct crypt_op co; 155 unsigned char buf[20]; 156 157 fd = open("/dev/crypto", O_RDWR, 0); 158 if (fd < 0) 159 err(1, "open"); 160 for (i = 0; i < __arraycount(tests); i++) { 161 if (tests[i].key_len != SHA1_HMAC_KEYLEN) 162 continue; 163 164 memset(&cs, 0, sizeof(cs)); 165 cs.mac = CRYPTO_SHA1_HMAC; 166 cs.mackeylen = tests[i].key_len; 167 cs.mackey = __UNCONST(&tests[i].key); 168 res = ioctl(fd, CIOCGSESSION, &cs); 169 if (res < 0) 170 err(1, "CIOCGSESSION test %d", tests[i].num); 171 172 memset(&co, 0, sizeof(co)); 173 memset(buf, 0, sizeof(buf)); 174 co.ses = cs.ses; 175 co.op = COP_ENCRYPT; 176 co.len = tests[i].len; 177 co.src = __UNCONST(&tests[i].data); 178 co.mac = buf; 179 res = ioctl(fd, CIOCCRYPT, &co); 180 if (res < 0) 181 err(1, "CIOCCRYPT test %d", tests[i].num); 182 183 if (memcmp(co.mac, &tests[i].mac, sizeof(tests[i].mac))) 184 errx(1, "verification failed test %d", tests[i].num); 185 186 res = ioctl(fd, CIOCFSESSION, &cs.ses); 187 if (res < 0) 188 err(1, "CIOCFSESSION test %d", tests[i].num); 189 } 190 return 0; 191 } 192