| Index: crypto/math/datatypes.c
|
| diff --git a/srtp/crypto/math/datatypes.c b/crypto/math/datatypes.c
|
| similarity index 84%
|
| rename from srtp/crypto/math/datatypes.c
|
| rename to crypto/math/datatypes.c
|
| index a30873eead055971a9689708ee12201899fc6eba..ff18cb77211efff663879ae6bba5c4edd52e8c85 100644
|
| --- a/srtp/crypto/math/datatypes.c
|
| +++ b/crypto/math/datatypes.c
|
| @@ -102,14 +102,13 @@ octet_get_weight(uint8_t octet) {
|
| char bit_string[MAX_PRINT_STRING_LEN];
|
|
|
| uint8_t
|
| -nibble_to_hex_char(uint8_t nibble) {
|
| +srtp_nibble_to_hex_char(uint8_t nibble) {
|
| char buf[16] = {'0', '1', '2', '3', '4', '5', '6', '7',
|
| '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
|
| return buf[nibble & 0xF];
|
| }
|
|
|
| -char *
|
| -octet_string_hex_string(const void *s, int length) {
|
| +char * srtp_octet_string_hex_string(const void *s, int length) {
|
| const uint8_t *str = (const uint8_t *)s;
|
| int i;
|
|
|
| @@ -118,91 +117,23 @@ octet_string_hex_string(const void *s, int length) {
|
|
|
| /* truncate string if it would be too long */
|
| if (length > MAX_PRINT_STRING_LEN)
|
| - length = MAX_PRINT_STRING_LEN-1;
|
| + length = MAX_PRINT_STRING_LEN-2;
|
|
|
| for (i=0; i < length; i+=2) {
|
| - bit_string[i] = nibble_to_hex_char(*str >> 4);
|
| - bit_string[i+1] = nibble_to_hex_char(*str++ & 0xF);
|
| + bit_string[i] = srtp_nibble_to_hex_char(*str >> 4);
|
| + bit_string[i+1] = srtp_nibble_to_hex_char(*str++ & 0xF);
|
| }
|
| bit_string[i] = 0; /* null terminate string */
|
| return bit_string;
|
| }
|
|
|
| -static inline int
|
| -hex_char_to_nibble(uint8_t c) {
|
| - switch(c) {
|
| - case ('0'): return 0x0;
|
| - case ('1'): return 0x1;
|
| - case ('2'): return 0x2;
|
| - case ('3'): return 0x3;
|
| - case ('4'): return 0x4;
|
| - case ('5'): return 0x5;
|
| - case ('6'): return 0x6;
|
| - case ('7'): return 0x7;
|
| - case ('8'): return 0x8;
|
| - case ('9'): return 0x9;
|
| - case ('a'): return 0xa;
|
| - case ('A'): return 0xa;
|
| - case ('b'): return 0xb;
|
| - case ('B'): return 0xb;
|
| - case ('c'): return 0xc;
|
| - case ('C'): return 0xc;
|
| - case ('d'): return 0xd;
|
| - case ('D'): return 0xd;
|
| - case ('e'): return 0xe;
|
| - case ('E'): return 0xe;
|
| - case ('f'): return 0xf;
|
| - case ('F'): return 0xf;
|
| - default: return -1; /* this flags an error */
|
| - }
|
| - /* NOTREACHED */
|
| - return -1; /* this keeps compilers from complaining */
|
| -}
|
| -
|
| -int
|
| -is_hex_string(char *s) {
|
| - while(*s != 0)
|
| - if (hex_char_to_nibble(*s++) == -1)
|
| - return 0;
|
| - return 1;
|
| -}
|
| -
|
| -/*
|
| - * hex_string_to_octet_string converts a hexadecimal string
|
| - * of length 2 * len to a raw octet string of length len
|
| - */
|
| -
|
| -int
|
| -hex_string_to_octet_string(char *raw, char *hex, int len) {
|
| - uint8_t x;
|
| - int tmp;
|
| - int hex_len;
|
| -
|
| - hex_len = 0;
|
| - while (hex_len < len) {
|
| - tmp = hex_char_to_nibble(hex[0]);
|
| - if (tmp == -1)
|
| - return hex_len;
|
| - x = (tmp << 4);
|
| - hex_len++;
|
| - tmp = hex_char_to_nibble(hex[1]);
|
| - if (tmp == -1)
|
| - return hex_len;
|
| - x |= (tmp & 0xff);
|
| - hex_len++;
|
| - *raw++ = x;
|
| - hex += 2;
|
| - }
|
| - return hex_len;
|
| -}
|
| -
|
| char *
|
| v128_hex_string(v128_t *x) {
|
| int i, j;
|
|
|
| for (i=j=0; i < 16; i++) {
|
| - bit_string[j++] = nibble_to_hex_char(x->v8[i] >> 4);
|
| - bit_string[j++] = nibble_to_hex_char(x->v8[i] & 0xF);
|
| + bit_string[j++] = srtp_nibble_to_hex_char(x->v8[i] >> 4);
|
| + bit_string[j++] = srtp_nibble_to_hex_char(x->v8[i] & 0xF);
|
| }
|
|
|
| bit_string[j] = 0; /* null terminate string */
|
| @@ -429,7 +360,7 @@ bitvector_alloc(bitvector_t *v, unsigned long length) {
|
| if (l == 0)
|
| v->word = NULL;
|
| else {
|
| - v->word = (uint32_t*)crypto_alloc(l);
|
| + v->word = (uint32_t*)srtp_crypto_alloc(l);
|
| if (v->word == NULL) {
|
| v->word = NULL;
|
| v->length = 0;
|
| @@ -448,7 +379,7 @@ bitvector_alloc(bitvector_t *v, unsigned long length) {
|
| void
|
| bitvector_dealloc(bitvector_t *v) {
|
| if (v->word != NULL)
|
| - crypto_free(v->word);
|
| + srtp_crypto_free(v->word);
|
| v->word = NULL;
|
| v->length = 0;
|
| }
|
| @@ -509,14 +440,21 @@ bitvector_left_shift(bitvector_t *x, int shift) {
|
|
|
| }
|
|
|
| -
|
| int
|
| octet_string_is_eq(uint8_t *a, uint8_t *b, int len) {
|
| uint8_t *end = b + len;
|
| + uint8_t accumulator = 0;
|
| +
|
| + /*
|
| + * We use this somewhat obscure implementation to try to ensure the running
|
| + * time only depends on len, even accounting for compiler optimizations.
|
| + * The accumulator ends up zero iff the strings are equal.
|
| + */
|
| while (b < end)
|
| - if (*a++ != *b++)
|
| - return 1;
|
| - return 0;
|
| + accumulator |= (*a++ ^ *b++);
|
| +
|
| + /* Return 1 if *not* equal. */
|
| + return accumulator != 0;
|
| }
|
|
|
| void
|
|
|