| 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 |