1*7c478bd9Sstevel@tonic-gate /* 2*7c478bd9Sstevel@tonic-gate * CDDL HEADER START 3*7c478bd9Sstevel@tonic-gate * 4*7c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*7c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 6*7c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 7*7c478bd9Sstevel@tonic-gate * with the License. 8*7c478bd9Sstevel@tonic-gate * 9*7c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*7c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 11*7c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 12*7c478bd9Sstevel@tonic-gate * and limitations under the License. 13*7c478bd9Sstevel@tonic-gate * 14*7c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 15*7c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*7c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 17*7c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 18*7c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 19*7c478bd9Sstevel@tonic-gate * 20*7c478bd9Sstevel@tonic-gate * CDDL HEADER END 21*7c478bd9Sstevel@tonic-gate */ 22*7c478bd9Sstevel@tonic-gate /* 23*7c478bd9Sstevel@tonic-gate * Copyright 2002-2003 Sun Microsystems, Inc. All rights reserved. 24*7c478bd9Sstevel@tonic-gate * Use is subject to license terms. 25*7c478bd9Sstevel@tonic-gate */ 26*7c478bd9Sstevel@tonic-gate 27*7c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 28*7c478bd9Sstevel@tonic-gate 29*7c478bd9Sstevel@tonic-gate /* 30*7c478bd9Sstevel@tonic-gate * HMAC SHA-1 test cases as defined by RFC 2202. 31*7c478bd9Sstevel@tonic-gate * 32*7c478bd9Sstevel@tonic-gate * The test uses predefined keys, data and digests. The data and keys 33*7c478bd9Sstevel@tonic-gate * are used by the HMAC SHA-1 implemention to produce a hash digest and 34*7c478bd9Sstevel@tonic-gate * the the result is compared against the expected digest. 35*7c478bd9Sstevel@tonic-gate */ 36*7c478bd9Sstevel@tonic-gate 37*7c478bd9Sstevel@tonic-gate #include <stdio.h> 38*7c478bd9Sstevel@tonic-gate #include <string.h> 39*7c478bd9Sstevel@tonic-gate #include <strings.h> 40*7c478bd9Sstevel@tonic-gate 41*7c478bd9Sstevel@tonic-gate #include "hmac_sha1.h" 42*7c478bd9Sstevel@tonic-gate #include "hmac_test.h" 43*7c478bd9Sstevel@tonic-gate #include "cmn_test.h" 44*7c478bd9Sstevel@tonic-gate 45*7c478bd9Sstevel@tonic-gate typedef struct test_data { 46*7c478bd9Sstevel@tonic-gate unsigned char key[80]; 47*7c478bd9Sstevel@tonic-gate int keylen; 48*7c478bd9Sstevel@tonic-gate unsigned char data[80]; 49*7c478bd9Sstevel@tonic-gate int datalen; 50*7c478bd9Sstevel@tonic-gate unsigned char digest[20]; 51*7c478bd9Sstevel@tonic-gate } test_data_t; 52*7c478bd9Sstevel@tonic-gate 53*7c478bd9Sstevel@tonic-gate int 54*7c478bd9Sstevel@tonic-gate hmactest(void) 55*7c478bd9Sstevel@tonic-gate { 56*7c478bd9Sstevel@tonic-gate test_data_t td[7]; 57*7c478bd9Sstevel@tonic-gate SHA1_CTX sha; 58*7c478bd9Sstevel@tonic-gate uchar_t digest[20]; 59*7c478bd9Sstevel@tonic-gate int fail; 60*7c478bd9Sstevel@tonic-gate int num; 61*7c478bd9Sstevel@tonic-gate int i; 62*7c478bd9Sstevel@tonic-gate 63*7c478bd9Sstevel@tonic-gate td[0].keylen = 20; 64*7c478bd9Sstevel@tonic-gate getxdata(td[0].key, "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", 65*7c478bd9Sstevel@tonic-gate td[0].keylen); 66*7c478bd9Sstevel@tonic-gate td[0].datalen = 8; 67*7c478bd9Sstevel@tonic-gate (void) strcpy((char *)td[0].data, "Hi There"); 68*7c478bd9Sstevel@tonic-gate getxdata(td[0].digest, "b617318655057264e28bc0b6fb378c8ef146be00", 20); 69*7c478bd9Sstevel@tonic-gate 70*7c478bd9Sstevel@tonic-gate td[1].keylen = 4; 71*7c478bd9Sstevel@tonic-gate (void) strcpy((char *)td[1].key, "Jefe"); 72*7c478bd9Sstevel@tonic-gate td[1].datalen = 28; 73*7c478bd9Sstevel@tonic-gate (void) strcpy((char *)td[1].data, "what do ya want for nothing?"); 74*7c478bd9Sstevel@tonic-gate getxdata(td[1].digest, "effcdf6ae5eb2fa2d27416d5f184df9c259a7c79", 20); 75*7c478bd9Sstevel@tonic-gate 76*7c478bd9Sstevel@tonic-gate td[2].keylen = 20; 77*7c478bd9Sstevel@tonic-gate getxdata(td[2].key, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 78*7c478bd9Sstevel@tonic-gate td[2].keylen); 79*7c478bd9Sstevel@tonic-gate td[2].datalen = 50; 80*7c478bd9Sstevel@tonic-gate getxdata(td[2].data, "ddddddddddddddddddddddddddddddddddddddddddddd" 81*7c478bd9Sstevel@tonic-gate "ddddddddddddddddddddddddddddddddddddddddddddddddddddddd", 50); 82*7c478bd9Sstevel@tonic-gate getxdata(td[2].digest, "125d7342b9ac11cd91a39af48aa17b4f63f175d3", 20); 83*7c478bd9Sstevel@tonic-gate 84*7c478bd9Sstevel@tonic-gate td[3].keylen = 25; 85*7c478bd9Sstevel@tonic-gate getxdata(td[3].key, "0102030405060708090a0b0c0d0e0f1011121314151617" 86*7c478bd9Sstevel@tonic-gate "1819", td[3].keylen); 87*7c478bd9Sstevel@tonic-gate td[3].datalen = 50; 88*7c478bd9Sstevel@tonic-gate getxdata(td[3].data, "cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd" 89*7c478bd9Sstevel@tonic-gate "cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd", 90*7c478bd9Sstevel@tonic-gate td[3].datalen); 91*7c478bd9Sstevel@tonic-gate getxdata(td[3].digest, "4c9007f4026250c6bc8414f9bf50c86c2d7235da", 20); 92*7c478bd9Sstevel@tonic-gate 93*7c478bd9Sstevel@tonic-gate td[4].keylen = 20; 94*7c478bd9Sstevel@tonic-gate getxdata(td[4].key, "0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c", 95*7c478bd9Sstevel@tonic-gate td[4].keylen); 96*7c478bd9Sstevel@tonic-gate td[4].datalen = 20; 97*7c478bd9Sstevel@tonic-gate (void) strcpy((char *)td[4].data, "Test With Truncation"); 98*7c478bd9Sstevel@tonic-gate getxdata(td[4].digest, "4c1a03424b55e07fe7f27be1d58bb9324a9a5a04", 20); 99*7c478bd9Sstevel@tonic-gate 100*7c478bd9Sstevel@tonic-gate td[5].keylen = 80; 101*7c478bd9Sstevel@tonic-gate getxdata(td[5].key, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 102*7c478bd9Sstevel@tonic-gate "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 103*7c478bd9Sstevel@tonic-gate "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 104*7c478bd9Sstevel@tonic-gate td[5].keylen); 105*7c478bd9Sstevel@tonic-gate td[5].datalen = 54; 106*7c478bd9Sstevel@tonic-gate (void) strcpy((char *)td[5].data, 107*7c478bd9Sstevel@tonic-gate "Test Using Larger Than Block-Size Key - Hash Key First"); 108*7c478bd9Sstevel@tonic-gate getxdata(td[5].digest, "aa4ae5e15272d00e95705637ce8a3b55ed402112", 20); 109*7c478bd9Sstevel@tonic-gate 110*7c478bd9Sstevel@tonic-gate td[6].keylen = 80; 111*7c478bd9Sstevel@tonic-gate getxdata(td[6].key, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 112*7c478bd9Sstevel@tonic-gate "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 113*7c478bd9Sstevel@tonic-gate "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 114*7c478bd9Sstevel@tonic-gate td[6].keylen); 115*7c478bd9Sstevel@tonic-gate td[6].datalen = 73; 116*7c478bd9Sstevel@tonic-gate (void) strcpy((char *)td[6].data, 117*7c478bd9Sstevel@tonic-gate "Test Using Larger Than Block-Size Key and Larger Than One " 118*7c478bd9Sstevel@tonic-gate "Block-Size Data"); 119*7c478bd9Sstevel@tonic-gate getxdata(td[6].digest, "e8e99d0f45237d786d6bbaa7965c7808bbff1a91", 20); 120*7c478bd9Sstevel@tonic-gate 121*7c478bd9Sstevel@tonic-gate num = sizeof (td) / sizeof (test_data_t); 122*7c478bd9Sstevel@tonic-gate for (i = 0; i < num; i++) { 123*7c478bd9Sstevel@tonic-gate fail = 0; 124*7c478bd9Sstevel@tonic-gate 125*7c478bd9Sstevel@tonic-gate (void) printf("Test #%d ", i); 126*7c478bd9Sstevel@tonic-gate HMACInit(&sha, td[i].key, td[i].keylen); 127*7c478bd9Sstevel@tonic-gate HMACUpdate(&sha, td[i].data, td[i].datalen); 128*7c478bd9Sstevel@tonic-gate HMACFinal(&sha, td[i].key, td[i].keylen, digest); 129*7c478bd9Sstevel@tonic-gate 130*7c478bd9Sstevel@tonic-gate if (bcmp(digest, td[i].digest, 20) != 0) { 131*7c478bd9Sstevel@tonic-gate (void) printf("FAILED\n"); 132*7c478bd9Sstevel@tonic-gate fail++; 133*7c478bd9Sstevel@tonic-gate } else { 134*7c478bd9Sstevel@tonic-gate (void) printf("PASSED\n"); 135*7c478bd9Sstevel@tonic-gate } 136*7c478bd9Sstevel@tonic-gate } 137*7c478bd9Sstevel@tonic-gate return (fail); 138*7c478bd9Sstevel@tonic-gate } 139