1 /*
2 * Copyright 2003,2004 Red Hat, Inc.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, and the entire permission notice in its entirety,
9 * including the disclaimer of warranties.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote
14 * products derived from this software without specific prior
15 * written permission.
16 *
17 * ALTERNATIVELY, this product may be distributed under the terms of
18 * the GNU Public License, in which case the provisions of the GPL are
19 * required INSTEAD OF the above restrictions. (This clause is
20 * necessary due to a potential bad interaction between the GPL and
21 * the restrictions contained in a BSD-style copyright.)
22 *
23 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
24 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
27 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
33 * OF THE POSSIBILITY OF SUCH DAMAGE.
34 */
35
36 #include "pam_inline.h"
37
38 #include <sys/types.h>
39 #include <sys/stat.h>
40 #include <errno.h>
41 #include <fcntl.h>
42 #include <stdio.h>
43 #include <stdlib.h>
44 #include <string.h>
45 #include <unistd.h>
46 #include "hmacsha1.h"
47
48 static void
49 testvectors(void)
50 {
51 void *hmac;
52 size_t hmac_len;
53 size_t i, j;
54 char hex[3];
55 struct vector {
56 const char *key;
57 int key_len;
58 const char *data;
59 int data_len;
60 const char *hmac;
61 } vectors[] = {
62 {
63 "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 20,
64 "Hi There", 8,
65 "b617318655057264e28bc0b6fb378c8ef146be00",
66 },
67
68 #ifdef HMAC_ALLOW_SHORT_KEYS
69 {
70 "Jefe", 4,
71 "what do ya want for nothing?", 28,
72 "effcdf6ae5eb2fa2d27416d5f184df9c259a7c79",
73 },
74 #endif
75
76 {
77 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 20,
78 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd", 50,
79 "125d7342b9ac11cd91a39af48aa17b4f63f175d3",
80 },
81
82 {
83 "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19", 25,
84 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd",
85 50,
86 "4c9007f4026250c6bc8414f9bf50c86c2d7235da",
87 },
88
89 {
90 "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20,
91 "Test With Truncation", 20,
92 "4c1a03424b55e07fe7f27be1d58bb9324a9a5a04",
93 },
94
95 {
96 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
97 80,
98 "Test Using Larger Than Block-Size Key - Hash Key First", 54,
99 "aa4ae5e15272d00e95705637ce8a3b55ed402112",
100 },
101
102 {
103 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
104 80,
105 "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data", 73,
106 "e8e99d0f45237d786d6bbaa7965c7808bbff1a91",
107 },
108 };
109 for (i = 0; i < PAM_ARRAY_SIZE(vectors); i++) {
110 hmac = NULL;
111 hmac_len = 0;
112 hmac_sha1_generate(&hmac, &hmac_len,
113 vectors[i].key, vectors[i].key_len,
114 vectors[i].data, vectors[i].data_len);
115 if (hmac != NULL) {
116 unsigned char *hmacc = hmac;
117 for (j = 0; j < hmac_len; j++) {
118 snprintf(hex, sizeof(hex), "%02x",
119 hmacc[j] & 0xff);
120 if (strncasecmp(hex,
121 vectors[i].hmac + 2 * j,
122 2) != 0) {
123 printf("Incorrect result for vector %lu\n",
124 (unsigned long) i + 1);
125 exit(1);
126
127 }
128 }
129 free(hmac);
130 } else {
131 printf("Error in vector %lu.\n",
132 (unsigned long) i + 1);
133 exit(1);
134 }
135 }
136 }
137
138 int
139 main(int argc, char **argv)
140 {
141 void *hmac;
142 size_t maclen;
143 const char *keyfile;
144 int i;
145 size_t j;
146
147 testvectors();
148
149 keyfile = argv[1];
150 for (i = 2; i < argc; i++) {
151 hmac_sha1_generate_file(NULL, &hmac, &maclen, keyfile, -1, -1,
152 argv[i], strlen(argv[i]));
153 if (hmac != NULL) {
154 unsigned char *hmacc = hmac;
155 for (j = 0; j < maclen; j++) {
156 printf("%02x", hmacc[j] & 0xff);
157 }
158 printf(" %s\n", argv[i]);
159 free(hmac);
160 }
161 }
162 return 0;
163 }