OLD | NEW |
1 /* | 1 /* |
2 * datatypes.c | 2 * datatypes.c |
3 * | 3 * |
4 * data types for finite fields and functions for input, output, and | 4 * data types for finite fields and functions for input, output, and |
5 * manipulation | 5 * manipulation |
6 * | 6 * |
7 * David A. McGrew | 7 * David A. McGrew |
8 * Cisco Systems, Inc. | 8 * Cisco Systems, Inc. |
9 */ | 9 */ |
10 /* | 10 /* |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 /* | 95 /* |
96 * bit_string is a buffer that is used to hold output strings, e.g. | 96 * bit_string is a buffer that is used to hold output strings, e.g. |
97 * for printing. | 97 * for printing. |
98 */ | 98 */ |
99 | 99 |
100 /* the value MAX_PRINT_STRING_LEN is defined in datatypes.h */ | 100 /* the value MAX_PRINT_STRING_LEN is defined in datatypes.h */ |
101 | 101 |
102 char bit_string[MAX_PRINT_STRING_LEN]; | 102 char bit_string[MAX_PRINT_STRING_LEN]; |
103 | 103 |
104 uint8_t | 104 uint8_t |
105 nibble_to_hex_char(uint8_t nibble) { | 105 srtp_nibble_to_hex_char(uint8_t nibble) { |
106 char buf[16] = {'0', '1', '2', '3', '4', '5', '6', '7', | 106 char buf[16] = {'0', '1', '2', '3', '4', '5', '6', '7', |
107 '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; | 107 '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; |
108 return buf[nibble & 0xF]; | 108 return buf[nibble & 0xF]; |
109 } | 109 } |
110 | 110 |
111 char * | 111 char * srtp_octet_string_hex_string(const void *s, int length) { |
112 octet_string_hex_string(const void *s, int length) { | |
113 const uint8_t *str = (const uint8_t *)s; | 112 const uint8_t *str = (const uint8_t *)s; |
114 int i; | 113 int i; |
115 | 114 |
116 /* double length, since one octet takes two hex characters */ | 115 /* double length, since one octet takes two hex characters */ |
117 length *= 2; | 116 length *= 2; |
118 | 117 |
119 /* truncate string if it would be too long */ | 118 /* truncate string if it would be too long */ |
120 if (length > MAX_PRINT_STRING_LEN) | 119 if (length > MAX_PRINT_STRING_LEN) |
121 length = MAX_PRINT_STRING_LEN-1; | 120 length = MAX_PRINT_STRING_LEN-2; |
122 | 121 |
123 for (i=0; i < length; i+=2) { | 122 for (i=0; i < length; i+=2) { |
124 bit_string[i] = nibble_to_hex_char(*str >> 4); | 123 bit_string[i] = srtp_nibble_to_hex_char(*str >> 4); |
125 bit_string[i+1] = nibble_to_hex_char(*str++ & 0xF); | 124 bit_string[i+1] = srtp_nibble_to_hex_char(*str++ & 0xF); |
126 } | 125 } |
127 bit_string[i] = 0; /* null terminate string */ | 126 bit_string[i] = 0; /* null terminate string */ |
128 return bit_string; | 127 return bit_string; |
129 } | 128 } |
130 | 129 |
131 static inline int | |
132 hex_char_to_nibble(uint8_t c) { | |
133 switch(c) { | |
134 case ('0'): return 0x0; | |
135 case ('1'): return 0x1; | |
136 case ('2'): return 0x2; | |
137 case ('3'): return 0x3; | |
138 case ('4'): return 0x4; | |
139 case ('5'): return 0x5; | |
140 case ('6'): return 0x6; | |
141 case ('7'): return 0x7; | |
142 case ('8'): return 0x8; | |
143 case ('9'): return 0x9; | |
144 case ('a'): return 0xa; | |
145 case ('A'): return 0xa; | |
146 case ('b'): return 0xb; | |
147 case ('B'): return 0xb; | |
148 case ('c'): return 0xc; | |
149 case ('C'): return 0xc; | |
150 case ('d'): return 0xd; | |
151 case ('D'): return 0xd; | |
152 case ('e'): return 0xe; | |
153 case ('E'): return 0xe; | |
154 case ('f'): return 0xf; | |
155 case ('F'): return 0xf; | |
156 default: return -1; /* this flags an error */ | |
157 } | |
158 /* NOTREACHED */ | |
159 return -1; /* this keeps compilers from complaining */ | |
160 } | |
161 | |
162 int | |
163 is_hex_string(char *s) { | |
164 while(*s != 0) | |
165 if (hex_char_to_nibble(*s++) == -1) | |
166 return 0; | |
167 return 1; | |
168 } | |
169 | |
170 /* | |
171 * hex_string_to_octet_string converts a hexadecimal string | |
172 * of length 2 * len to a raw octet string of length len | |
173 */ | |
174 | |
175 int | |
176 hex_string_to_octet_string(char *raw, char *hex, int len) { | |
177 uint8_t x; | |
178 int tmp; | |
179 int hex_len; | |
180 | |
181 hex_len = 0; | |
182 while (hex_len < len) { | |
183 tmp = hex_char_to_nibble(hex[0]); | |
184 if (tmp == -1) | |
185 return hex_len; | |
186 x = (tmp << 4); | |
187 hex_len++; | |
188 tmp = hex_char_to_nibble(hex[1]); | |
189 if (tmp == -1) | |
190 return hex_len; | |
191 x |= (tmp & 0xff); | |
192 hex_len++; | |
193 *raw++ = x; | |
194 hex += 2; | |
195 } | |
196 return hex_len; | |
197 } | |
198 | |
199 char * | 130 char * |
200 v128_hex_string(v128_t *x) { | 131 v128_hex_string(v128_t *x) { |
201 int i, j; | 132 int i, j; |
202 | 133 |
203 for (i=j=0; i < 16; i++) { | 134 for (i=j=0; i < 16; i++) { |
204 bit_string[j++] = nibble_to_hex_char(x->v8[i] >> 4); | 135 bit_string[j++] = srtp_nibble_to_hex_char(x->v8[i] >> 4); |
205 bit_string[j++] = nibble_to_hex_char(x->v8[i] & 0xF); | 136 bit_string[j++] = srtp_nibble_to_hex_char(x->v8[i] & 0xF); |
206 } | 137 } |
207 | 138 |
208 bit_string[j] = 0; /* null terminate string */ | 139 bit_string[j] = 0; /* null terminate string */ |
209 return bit_string; | 140 return bit_string; |
210 } | 141 } |
211 | 142 |
212 char * | 143 char * |
213 v128_bit_string(v128_t *x) { | 144 v128_bit_string(v128_t *x) { |
214 int j, i; | 145 int j, i; |
215 uint32_t mask; | 146 uint32_t mask; |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
422 | 353 |
423 /* Round length up to a multiple of bits_per_word */ | 354 /* Round length up to a multiple of bits_per_word */ |
424 length = (length + bits_per_word - 1) & ~(unsigned long)((bits_per_word - 1)); | 355 length = (length + bits_per_word - 1) & ~(unsigned long)((bits_per_word - 1)); |
425 | 356 |
426 l = length / bits_per_word * bytes_per_word; | 357 l = length / bits_per_word * bytes_per_word; |
427 | 358 |
428 /* allocate memory, then set parameters */ | 359 /* allocate memory, then set parameters */ |
429 if (l == 0) | 360 if (l == 0) |
430 v->word = NULL; | 361 v->word = NULL; |
431 else { | 362 else { |
432 v->word = (uint32_t*)crypto_alloc(l); | 363 v->word = (uint32_t*)srtp_crypto_alloc(l); |
433 if (v->word == NULL) { | 364 if (v->word == NULL) { |
434 v->word = NULL; | 365 v->word = NULL; |
435 v->length = 0; | 366 v->length = 0; |
436 return -1; | 367 return -1; |
437 } | 368 } |
438 } | 369 } |
439 v->length = length; | 370 v->length = length; |
440 | 371 |
441 /* initialize bitvector to zero */ | 372 /* initialize bitvector to zero */ |
442 bitvector_set_to_zero(v); | 373 bitvector_set_to_zero(v); |
443 | 374 |
444 return 0; | 375 return 0; |
445 } | 376 } |
446 | 377 |
447 | 378 |
448 void | 379 void |
449 bitvector_dealloc(bitvector_t *v) { | 380 bitvector_dealloc(bitvector_t *v) { |
450 if (v->word != NULL) | 381 if (v->word != NULL) |
451 crypto_free(v->word); | 382 srtp_crypto_free(v->word); |
452 v->word = NULL; | 383 v->word = NULL; |
453 v->length = 0; | 384 v->length = 0; |
454 } | 385 } |
455 | 386 |
456 void | 387 void |
457 bitvector_set_to_zero(bitvector_t *x) | 388 bitvector_set_to_zero(bitvector_t *x) |
458 { | 389 { |
459 /* C99 guarantees that memset(0) will set the value 0 for uint32_t */ | 390 /* C99 guarantees that memset(0) will set the value 0 for uint32_t */ |
460 memset(x->word, 0, x->length >> 3); | 391 memset(x->word, 0, x->length >> 3); |
461 } | 392 } |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
502 (x->word[i+base_index+1] << (32 - bit_index)); | 433 (x->word[i+base_index+1] << (32 - bit_index)); |
503 x->word[word_length - base_index-1] = x->word[word_length-1] >> bit_index; | 434 x->word[word_length - base_index-1] = x->word[word_length-1] >> bit_index; |
504 } | 435 } |
505 | 436 |
506 /* now wrap up the final portion */ | 437 /* now wrap up the final portion */ |
507 for (i = word_length - base_index; i < word_length; i++) | 438 for (i = word_length - base_index; i < word_length; i++) |
508 x->word[i] = 0; | 439 x->word[i] = 0; |
509 | 440 |
510 } | 441 } |
511 | 442 |
512 | |
513 int | 443 int |
514 octet_string_is_eq(uint8_t *a, uint8_t *b, int len) { | 444 octet_string_is_eq(uint8_t *a, uint8_t *b, int len) { |
515 uint8_t *end = b + len; | 445 uint8_t *end = b + len; |
| 446 uint8_t accumulator = 0; |
| 447 |
| 448 /* |
| 449 * We use this somewhat obscure implementation to try to ensure the running |
| 450 * time only depends on len, even accounting for compiler optimizations. |
| 451 * The accumulator ends up zero iff the strings are equal. |
| 452 */ |
516 while (b < end) | 453 while (b < end) |
517 if (*a++ != *b++) | 454 accumulator |= (*a++ ^ *b++); |
518 return 1; | 455 |
519 return 0; | 456 /* Return 1 if *not* equal. */ |
| 457 return accumulator != 0; |
520 } | 458 } |
521 | 459 |
522 void | 460 void |
523 octet_string_set_to_zero(uint8_t *s, int len) { | 461 octet_string_set_to_zero(uint8_t *s, int len) { |
524 uint8_t *end = s + len; | 462 uint8_t *end = s + len; |
525 | 463 |
526 do { | 464 do { |
527 *s = 0; | 465 *s = 0; |
528 } while (++s < end); | 466 } while (++s < end); |
529 | 467 |
(...skipping 30 matching lines...) Expand all Loading... |
560 while (i < len && j == 0) { | 498 while (i < len && j == 0) { |
561 j = base64_block_to_octet_triple(out + k, in + i); | 499 j = base64_block_to_octet_triple(out + k, in + i); |
562 k += 3; | 500 k += 3; |
563 i += 4; | 501 i += 4; |
564 } | 502 } |
565 *pad = j; | 503 *pad = j; |
566 return i; | 504 return i; |
567 } | 505 } |
568 | 506 |
569 #endif | 507 #endif |
OLD | NEW |