Imported Upstream version 1.1.6
[platform/upstream/pam.git] / modules / pam_timestamp / hmacfile.c
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 <sys/types.h>
37 #include <sys/stat.h>
38 #include <errno.h>
39 #include <fcntl.h>
40 #include <stdio.h>
41 #include <stdlib.h>
42 #include <string.h>
43 #include <unistd.h>
44 #include "hmacsha1.h"
45
46 static void
47 testvectors(void)
48 {
49         void *hmac;
50         size_t hmac_len;
51         size_t i, j;
52         char hex[3];
53         struct vector {
54                 const char *key;
55                 int key_len;
56                 const char *data;
57                 int data_len;
58                 const char *hmac;
59         } vectors[] = {
60                 {
61                 "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 20,
62                 "Hi There", 8,
63                 "b617318655057264e28bc0b6fb378c8ef146be00",
64                 },
65
66 #ifdef HMAC_ALLOW_SHORT_KEYS
67                 {
68                 "Jefe", 4,
69                 "what do ya want for nothing?", 28,
70                 "effcdf6ae5eb2fa2d27416d5f184df9c259a7c79",
71                 },
72 #endif
73
74                 {
75                 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 20,
76                 "\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,
77                 "125d7342b9ac11cd91a39af48aa17b4f63f175d3",
78                 },
79
80                 {
81                 "\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,
82                 "\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",
83                 50,
84                 "4c9007f4026250c6bc8414f9bf50c86c2d7235da",
85                 },
86
87                 {
88                 "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20,
89                 "Test With Truncation", 20,
90                 "4c1a03424b55e07fe7f27be1d58bb9324a9a5a04",
91                 },
92
93                 {
94                 "\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",
95                 80,
96                 "Test Using Larger Than Block-Size Key - Hash Key First", 54,
97                 "aa4ae5e15272d00e95705637ce8a3b55ed402112",
98                 },
99
100                 {
101                 "\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",
102                 80,
103                 "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data", 73,
104                 "e8e99d0f45237d786d6bbaa7965c7808bbff1a91",
105                 },
106         };
107         for (i = 0; i < sizeof(vectors) / sizeof(vectors[0]); i++) {
108                 hmac = NULL;
109                 hmac_len = 0;
110                 hmac_sha1_generate(&hmac, &hmac_len,
111                                    vectors[i].key, vectors[i].key_len,
112                                    vectors[i].data, vectors[i].data_len);
113                 if (hmac != NULL) {
114                         unsigned char *hmacc = hmac;
115                         for (j = 0; j < hmac_len; j++) {
116                                 snprintf(hex, sizeof(hex), "%02x",
117                                          hmacc[j] & 0xff);
118                                 if (strncasecmp(hex,
119                                                 vectors[i].hmac + 2 * j,
120                                                 2) != 0) {
121                                         printf("Incorrect result for vector %lu\n", i + 1);
122                                         exit(1);
123
124                                 }
125                         }
126                         free(hmac);
127                 } else {
128                         printf("Error in vector %lu.\n", i + 1);
129                         exit(1);
130                 }
131         }
132 }
133
134 int
135 main(int argc, char **argv)
136 {
137         void *hmac;
138         size_t maclen;
139         const char *keyfile;
140         int i;
141         size_t j;
142
143         testvectors();
144
145         keyfile = argv[1];
146         for (i = 2; i < argc; i++) {
147                 hmac_sha1_generate_file(NULL, &hmac, &maclen, keyfile, -1, -1,
148                                         argv[i], strlen(argv[i]));
149                 if (hmac != NULL) {
150                         unsigned char *hmacc = hmac;
151                         for (j = 0; j < maclen; j++) {
152                                 printf("%02x", hmacc[j] & 0xff);
153                         }
154                         printf("  %s\n", argv[i]);
155                         free(hmac);
156                 }
157         }
158         return 0;
159 }