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