OLD | NEW |
| (Empty) |
1 /* | |
2 * auth_driver.c | |
3 * | |
4 * a driver for auth functions | |
5 * | |
6 * David A. McGrew | |
7 * Cisco Systems, Inc. | |
8 */ | |
9 | |
10 /* | |
11 * | |
12 * Copyright (c) 2001-2006, Cisco Systems, Inc. | |
13 * All rights reserved. | |
14 * | |
15 * Redistribution and use in source and binary forms, with or without | |
16 * modification, are permitted provided that the following conditions | |
17 * are met: | |
18 * | |
19 * Redistributions of source code must retain the above copyright | |
20 * notice, this list of conditions and the following disclaimer. | |
21 * | |
22 * Redistributions in binary form must reproduce the above | |
23 * copyright notice, this list of conditions and the following | |
24 * disclaimer in the documentation and/or other materials provided | |
25 * with the distribution. | |
26 * | |
27 * Neither the name of the Cisco Systems, Inc. nor the names of its | |
28 * contributors may be used to endorse or promote products derived | |
29 * from this software without specific prior written permission. | |
30 * | |
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | |
34 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | |
35 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |
36 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
37 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
38 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | |
40 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
41 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | |
42 * OF THE POSSIBILITY OF SUCH DAMAGE. | |
43 * | |
44 */ | |
45 | |
46 | |
47 #include <stdio.h> /* for printf() */ | |
48 #include <stdlib.h> /* for xalloc() */ | |
49 #include <unistd.h> /* for getopt() */ | |
50 | |
51 #include "auth.h" | |
52 #include "null_auth.h" | |
53 | |
54 #define PRINT_DEBUG_DATA 0 | |
55 | |
56 extern auth_type_t tmmhv2; | |
57 | |
58 const uint16_t msg0[9] = { | |
59 0x6015, 0xf141, 0x5ba1, 0x29a0, 0xf604, 0xd1c, 0x2d9, 0xaa8a, 0x7931 | |
60 }; | |
61 | |
62 /* key1 is for TAG_WORDS = 2 */ | |
63 | |
64 const uint16_t key1[47] = { | |
65 0xe627, 0x6a01, 0x5ea7, 0xf27a, 0xc536, 0x2192, 0x11be, 0xea35, | |
66 0xdb9d, 0x63d6, 0xfa8a, 0xfc45, 0xe08b, 0xd216, 0xced2, 0x7853, | |
67 0x1a82, 0x22f5, 0x90fb, 0x1c29, 0x708e, 0xd06f, 0x82c3, 0xbee6, | |
68 0x4f21, 0x6f33, 0x65c0, 0xd211, 0xc25e, 0x9138, 0x4fa3, 0x7c1f, | |
69 0x61ac, 0x3489, 0x2976, 0x8c19, 0x8252, 0xddbf, 0xcad3, 0xc28f, | |
70 0x68d6, 0x58dd, 0x504f, 0x2bbf, 0x0278, 0x70b7, 0xcfca | |
71 }; | |
72 | |
73 double | |
74 auth_bits_per_second(auth_t *h, int msg_len); | |
75 | |
76 | |
77 void | |
78 usage(char *prog_name) { | |
79 printf("usage: %s [ -t | -v ]\n", prog_name); | |
80 exit(255); | |
81 } | |
82 | |
83 #define MAX_MSG_LEN 2048 | |
84 | |
85 int | |
86 main (int argc, char *argv[]) { | |
87 auth_t *a = NULL; | |
88 err_status_t status; | |
89 int i; | |
90 int c; | |
91 unsigned do_timing_test = 0; | |
92 unsigned do_validation = 0; | |
93 | |
94 /* process input arguments */ | |
95 while (1) { | |
96 c = getopt(argc, argv, "tv"); | |
97 if (c == -1) | |
98 break; | |
99 switch (c) { | |
100 case 't': | |
101 do_timing_test = 1; | |
102 break; | |
103 case 'v': | |
104 do_validation = 1; | |
105 break; | |
106 default: | |
107 usage(argv[0]); | |
108 } | |
109 } | |
110 | |
111 printf("auth driver\nDavid A. McGrew\nCisco Systems, Inc.\n"); | |
112 | |
113 if (!do_validation && !do_timing_test) | |
114 usage(argv[0]); | |
115 | |
116 if (do_validation) { | |
117 printf("running self-test for %s...", tmmhv2.description); | |
118 status = tmmhv2_add_big_test(); | |
119 if (status) { | |
120 printf("tmmhv2_add_big_test failed with error code %d\n", status); | |
121 exit(status); | |
122 } | |
123 status = auth_type_self_test(&tmmhv2); | |
124 if (status) { | |
125 printf("failed with error code %d\n", status); | |
126 exit(status); | |
127 } | |
128 printf("passed\n"); | |
129 } | |
130 | |
131 if (do_timing_test) { | |
132 | |
133 /* tmmhv2 timing test */ | |
134 status = auth_type_alloc(&tmmhv2, &a, 94, 4); | |
135 if (status) { | |
136 fprintf(stderr, "can't allocate tmmhv2\n"); | |
137 exit(status); | |
138 } | |
139 status = auth_init(a, (uint8_t *)key1); | |
140 if (status) { | |
141 printf("error initializaing auth function\n"); | |
142 exit(status); | |
143 } | |
144 | |
145 printf("timing %s (tag length %d)\n", | |
146 tmmhv2.description, auth_get_tag_length(a)); | |
147 for (i=8; i <= MAX_MSG_LEN; i *= 2) | |
148 printf("msg len: %d\tgigabits per second: %f\n", | |
149 i, auth_bits_per_second(a, i) / 1E9); | |
150 | |
151 status = auth_dealloc(a); | |
152 if (status) { | |
153 printf("error deallocating auth function\n"); | |
154 exit(status); | |
155 } | |
156 | |
157 } | |
158 | |
159 return 0; | |
160 } | |
161 | |
162 #define NUM_TRIALS 100000 | |
163 | |
164 #include <time.h> | |
165 | |
166 double | |
167 auth_bits_per_second(auth_t *a, int msg_len_octets) { | |
168 int i; | |
169 clock_t timer; | |
170 uint8_t *result; | |
171 int msg_len = (msg_len_octets + 1)/2; | |
172 uint16_t *msg_string; | |
173 | |
174 /* create random message */ | |
175 msg_string = (uint16_t *) crypto_alloc(msg_len_octets); | |
176 if (msg_string == NULL) | |
177 return 0.0; /* indicate failure */ | |
178 for (i=0; i < msg_len; i++) | |
179 msg_string[i] = (uint16_t) random(); | |
180 | |
181 /* allocate temporary storage for authentication tag */ | |
182 result = crypto_alloc(auth_get_tag_length(a)); | |
183 if (result == NULL) { | |
184 free(msg_string); | |
185 return 0.0; /* indicate failure */ | |
186 } | |
187 | |
188 timer = clock(); | |
189 for (i=0; i < NUM_TRIALS; i++) { | |
190 auth_compute(a, (uint8_t *)msg_string, msg_len_octets, (uint8_t *)result); | |
191 } | |
192 timer = clock() - timer; | |
193 | |
194 free(msg_string); | |
195 free(result); | |
196 | |
197 return (double) NUM_TRIALS * 8 * msg_len_octets * CLOCKS_PER_SEC / timer; | |
198 } | |
199 | |
200 | |
OLD | NEW |