| diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-lin/crypto/include/crypto_math.h srtp/crypto/include/crypto_math.h |
| --- srtp-lin/crypto/include/crypto_math.h 2006-06-08 13:00:27.000000000 -0400 |
| +++ srtp/crypto/include/crypto_math.h 2009-04-22 19:03:15.000000000 -0400 |
| @@ -233,40 +233,6 @@ void |
| octet_string_set_to_zero(uint8_t *s, int len); |
| |
| |
| -/* |
| - * functions manipulating bit_vector_t |
| - * |
| - * A bitvector_t consists of an array of words and an integer |
| - * representing the number of significant bits stored in the array. |
| - * The bits are packed as follows: the least significant bit is that |
| - * of word[0], while the most significant bit is the nth most |
| - * significant bit of word[m], where length = bits_per_word * m + n. |
| - * |
| - */ |
| - |
| -#define bits_per_word 32 |
| -#define bytes_per_word 4 |
| - |
| -typedef struct { |
| - uint32_t length; |
| - uint32_t *word; |
| -} bitvector_t; |
| - |
| -int |
| -bitvector_alloc(bitvector_t *v, unsigned long length); |
| - |
| -void |
| -bitvector_set_bit(bitvector_t *v, int bit_index); |
| - |
| -int |
| -bitvector_get_bit(const bitvector_t *v, int bit_index); |
| - |
| -int |
| -bitvector_print_hex(const bitvector_t *v, FILE *stream); |
| - |
| -int |
| -bitvector_set_from_hex(bitvector_t *v, char *string); |
| - |
| #endif /* MATH_H */ |
| |
| |
| diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-lin/crypto/include/datatypes.h srtp/crypto/include/datatypes.h |
| --- srtp-lin/crypto/include/datatypes.h 2006-07-12 18:41:57.000000000 -0400 |
| +++ srtp/crypto/include/datatypes.h 2009-04-22 19:20:01.000000000 -0400 |
| @@ -424,4 +424,83 @@ static inline uint64_t be64_to_cpu(uint6 |
| |
| #endif /* WORDS_BIGENDIAN */ |
| |
| +/* |
| + * functions manipulating bitvector_t |
| + * |
| + * A bitvector_t consists of an array of words and an integer |
| + * representing the number of significant bits stored in the array. |
| + * The bits are packed as follows: the least significant bit is that |
| + * of word[0], while the most significant bit is the nth most |
| + * significant bit of word[m], where length = bits_per_word * m + n. |
| + * |
| + */ |
| + |
| +#define bits_per_word 32 |
| +#define bytes_per_word 4 |
| + |
| +typedef struct { |
| + uint32_t length; |
| + uint32_t *word; |
| +} bitvector_t; |
| + |
| + |
| +#define _bitvector_get_bit(v, bit_index) \ |
| +( \ |
| + ((((v)->word[((bit_index) >> 5)]) >> ((bit_index) & 31)) & 1) \ |
| +) |
| + |
| + |
| +#define _bitvector_set_bit(v, bit_index) \ |
| +( \ |
| + (((v)->word[((bit_index) >> 5)] |= ((uint32_t)1 << ((bit_index) & 31)))) \ |
| +) |
| + |
| +#define _bitvector_clear_bit(v, bit_index) \ |
| +( \ |
| + (((v)->word[((bit_index) >> 5)] &= ~((uint32_t)1 << ((bit_index) & 31)))) \ |
| +) |
| + |
| +#define _bitvector_get_length(v) \ |
| +( \ |
| + ((v)->length) \ |
| +) |
| + |
| +#ifdef DATATYPES_USE_MACROS /* little functions are really macros */ |
| + |
| +#define bitvector_get_bit(v, bit_index) _bitvector_get_bit(v, bit_index) |
| +#define bitvector_set_bit(v, bit_index) _bitvector_set_bit(v, bit_index) |
| +#define bitvector_clear_bit(v, bit_index) _bitvector_clear_bit(v, bit_index) |
| +#define bitvector_get_length(v) _bitvector_get_length(v) |
| + |
| +#else |
| + |
| +int |
| +bitvector_get_bit(const bitvector_t *v, int bit_index); |
| + |
| +void |
| +bitvector_set_bit(bitvector_t *v, int bit_index); |
| + |
| +void |
| +bitvector_clear_bit(bitvector_t *v, int bit_index); |
| + |
| +unsigned long |
| +bitvector_get_length(const bitvector_t *v); |
| + |
| +#endif |
| + |
| +int |
| +bitvector_alloc(bitvector_t *v, unsigned long length); |
| + |
| +void |
| +bitvector_dealloc(bitvector_t *v); |
| + |
| +void |
| +bitvector_set_to_zero(bitvector_t *x); |
| + |
| +void |
| +bitvector_left_shift(bitvector_t *x, int index); |
| + |
| +char * |
| +bitvector_bit_string(bitvector_t *x, char* buf, int len); |
| + |
| #endif /* _DATATYPES_H */ |
| diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-lin/crypto/include/rdbx.h srtp/crypto/include/rdbx.h |
| --- srtp-lin/crypto/include/rdbx.h 2007-06-15 14:17:40.000000000 -0400 |
| +++ srtp/crypto/include/rdbx.h 2009-04-22 19:03:15.000000000 -0400 |
| @@ -46,19 +46,29 @@ typedef uint64_t xtd_seq_num_t; |
| |
| typedef struct { |
| xtd_seq_num_t index; |
| - v128_t bitmask; |
| + bitvector_t bitmask; |
| } rdbx_t; |
| |
| |
| /* |
| - * rdbx_init(rdbx_ptr) |
| + * rdbx_init(rdbx_ptr, ws) |
| * |
| - * initializes the rdbx pointed to by its argument, setting the |
| - * rollover counter and sequence number to zero |
| + * initializes the rdbx pointed to by its argument with the window size ws, |
| + * setting the rollover counter and sequence number to zero |
| */ |
| |
| err_status_t |
| -rdbx_init(rdbx_t *rdbx); |
| +rdbx_init(rdbx_t *rdbx, unsigned long ws); |
| + |
| + |
| +/* |
| + * rdbx_uninit(rdbx_ptr) |
| + * |
| + * frees memory associated with the rdbx |
| + */ |
| + |
| +err_status_t |
| +rdbx_uninit(rdbx_t *rdbx); |
| |
| |
| /* |
| @@ -127,6 +137,15 @@ rdbx_get_packet_index(const rdbx_t *rdbx |
| * api instead! |
| */ |
| |
| +/* |
| + * rdbx_get_ws(rdbx_ptr) |
| + * |
| + * gets the window size which was used to initialize the rdbx |
| + */ |
| + |
| +unsigned long |
| +rdbx_get_window_size(const rdbx_t *rdbx); |
| + |
| |
| /* index_init(&pi) initializes a packet index pi (sets it to zero) */ |
| |
| diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-lin/crypto/math/datatypes.c srtp/crypto/math/datatypes.c |
| --- srtp-lin/crypto/math/datatypes.c 2006-07-18 15:45:46.000000000 -0400 |
| +++ srtp/crypto/math/datatypes.c 2009-04-22 19:03:15.000000000 -0400 |
| @@ -387,6 +387,124 @@ v128_left_shift(v128_t *x, int index) { |
| |
| } |
| |
| +/* functions manipulating bitvector_t */ |
| + |
| +#ifndef DATATYPES_USE_MACROS /* little functions are not macros */ |
| + |
| +int |
| +bitvector_get_bit(const bitvector_t *v, int bit_index) |
| +{ |
| + return _bitvector_get_bit(v, bit_index); |
| +} |
| + |
| +void |
| +bitvector_set_bit(bitvector_t *v, int bit_index) |
| +{ |
| + _bitvector_set_bit(v, bit_index); |
| +} |
| + |
| +void |
| +bitvector_clear_bit(bitvector_t *v, int bit_index) |
| +{ |
| + _bitvector_clear_bit(v, bit_index); |
| +} |
| + |
| + |
| +#endif /* DATATYPES_USE_MACROS */ |
| + |
| +int |
| +bitvector_alloc(bitvector_t *v, unsigned long length) { |
| + unsigned long l; |
| + |
| + /* Round length up to a multiple of bits_per_word */ |
| + length = (length + bits_per_word - 1) & ~(unsigned long)((bits_per_word - 1)); |
| + |
| + l = length / bits_per_word * bytes_per_word; |
| + |
| + /* allocate memory, then set parameters */ |
| + if (l == 0) |
| + v->word = NULL; |
| + else { |
| + v->word = (uint32_t*)crypto_alloc(l); |
| + if (v->word == NULL) { |
| + v->word = NULL; |
| + v->length = 0; |
| + return -1; |
| + } |
| + } |
| + v->length = length; |
| + |
| + /* initialize bitvector to zero */ |
| + bitvector_set_to_zero(v); |
| + |
| + return 0; |
| +} |
| + |
| + |
| +void |
| +bitvector_dealloc(bitvector_t *v) { |
| + if (v->word != NULL) |
| + crypto_free(v->word); |
| + v->word = NULL; |
| + v->length = 0; |
| +} |
| + |
| +void |
| +bitvector_set_to_zero(bitvector_t *x) |
| +{ |
| + /* C99 guarantees that memset(0) will set the value 0 for uint32_t */ |
| + memset(x->word, 0, x->length >> 3); |
| +} |
| + |
| +char * |
| +bitvector_bit_string(bitvector_t *x, char* buf, int len) { |
| + int j, index; |
| + uint32_t mask; |
| + |
| + for (j=index=0; j < (int)(x->length>>5) && index < len-1; j++) { |
| + for (mask=0x80000000; mask > 0; mask >>= 1) { |
| + if (x->word[j] & mask) |
| + buf[index] = '1'; |
| + else |
| + buf[index] = '0'; |
| + ++index; |
| + if (index >= len-1) |
| + break; |
| + } |
| + } |
| + buf[index] = 0; /* null terminate string */ |
| + |
| + return buf; |
| +} |
| + |
| +void |
| +bitvector_left_shift(bitvector_t *x, int index) { |
| + int i; |
| + const int base_index = index >> 5; |
| + const int bit_index = index & 31; |
| + const int word_length = x->length >> 5; |
| + |
| + if (index >= (int)x->length) { |
| + bitvector_set_to_zero(x); |
| + return; |
| + } |
| + |
| + if (bit_index == 0) { |
| + for (i=0; i < word_length - base_index; i++) |
| + x->word[i] = x->word[i+base_index]; |
| + } else { |
| + for (i=0; i < word_length - base_index - 1; i++) |
| + x->word[i] = (x->word[i+base_index] >> bit_index) ^ |
| + (x->word[i+base_index+1] << (32 - bit_index)); |
| + x->word[word_length - base_index-1] = x->word[word_length-1] >> bit_index; |
| + } |
| + |
| + /* now wrap up the final portion */ |
| + for (i = word_length - base_index; i < word_length; i++) |
| + x->word[i] = 0; |
| + |
| +} |
| + |
| |
| int |
| octet_string_is_eq(uint8_t *a, uint8_t *b, int len) { |
| diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-lin/crypto/math/math.c srtp/crypto/math/math.c |
| --- srtp-lin/crypto/math/math.c 2006-06-08 13:00:28.000000000 -0400 |
| +++ srtp/crypto/math/math.c 2009-04-22 19:03:15.000000000 -0400 |
| @@ -43,7 +43,6 @@ |
| */ |
| |
| #include "crypto_math.h" |
| -#include <stdlib.h> /* malloc() used in bitvector_alloc */ |
| |
| int |
| octet_weight[256] = { |
| @@ -773,165 +772,6 @@ octet_string_set_to_zero(uint8_t *s, int |
| |
| } |
| |
| -/* functions manipulating bit_vector_t */ |
| - |
| -#define BITVECTOR_MAX_WORDS 5 |
| - |
| -int |
| -bitvector_alloc(bitvector_t *v, unsigned long length) { |
| - unsigned long l = (length + bytes_per_word - 1) / bytes_per_word; |
| - int i; |
| - |
| - /* allocate memory, then set parameters */ |
| - if (l > BITVECTOR_MAX_WORDS) |
| - return -1; |
| - else |
| - l = BITVECTOR_MAX_WORDS; |
| - v->word = malloc(l); |
| - if (v->word == NULL) |
| - return -1; |
| - v->length = length; |
| - |
| - /* initialize bitvector to zero */ |
| - for (i=0; i < (length >> 5); i++) { |
| - v->word = 0; |
| - } |
| - |
| - return 0; |
| -} |
| - |
| -void |
| -bitvector_set_bit(bitvector_t *v, int bit_index) { |
| - |
| - v->word[(bit_index >> 5)] |= (1 << (bit_index & 31)); |
| - |
| -} |
| - |
| -int |
| -bitvector_get_bit(const bitvector_t *v, int bit_index) { |
| - |
| - return ((v->word[(bit_index >> 5)]) >> (bit_index & 31)) & 1; |
| - |
| -} |
| - |
| -#include <stdio.h> |
| - |
| -int |
| -bitvector_print_hex(const bitvector_t *v, FILE *stream) { |
| - int i; |
| - int m = v->length >> 5; |
| - int n = v->length & 31; |
| - char string[9]; |
| - uint32_t tmp; |
| - |
| - /* if length isn't a multiple of four, we can't hex_print */ |
| - if (n & 3) |
| - return -1; |
| - |
| - /* if the length is zero, do nothing */ |
| - if (v->length == 0) |
| - return 0; |
| - |
| - /* |
| - * loop over words from most significant to least significant - |
| - */ |
| - |
| - for (i=m; i > 0; i++) { |
| - char *str = string + 7; |
| - tmp = v->word[i]; |
| - |
| - /* null terminate string */ |
| - string[8] = 0; |
| - |
| - /* loop over nibbles */ |
| - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; |
| - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; |
| - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; |
| - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; |
| - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; |
| - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; |
| - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; |
| - *str-- = nibble_to_hex_char(tmp & 0xf); |
| - |
| - /* now print stream */ |
| - fprintf(stream, string); |
| - } |
| - |
| - return 0; |
| - |
| -} |
| - |
| - |
| -int |
| -hex_string_length(char *s) { |
| - int count = 0; |
| - |
| - /* ignore leading zeros */ |
| - while ((*s != 0) && *s == '0') |
| - s++; |
| - |
| - /* count remaining characters */ |
| - while (*s != 0) { |
| - if (hex_char_to_nibble(*s++) == -1) |
| - return -1; |
| - count++; |
| - } |
| - |
| - return count; |
| -} |
| - |
| -int |
| -bitvector_set_from_hex(bitvector_t *v, char *string) { |
| - int num_hex_chars, m, n, i, j; |
| - uint32_t tmp; |
| - |
| - num_hex_chars = hex_string_length(string); |
| - if (num_hex_chars == -1) |
| - return -1; |
| - |
| - /* set length */ |
| - v->length = num_hex_chars * 4; |
| - /* |
| - * at this point, we should subtract away a bit if the high |
| - * bit of the first character is zero, but we ignore that |
| - * for now and assume that we're four-bit aligned - DAM |
| - */ |
| - |
| - |
| - m = num_hex_chars / 8; /* number of words */ |
| - n = num_hex_chars % 8; /* number of nibbles in last word */ |
| - |
| - /* if the length is greater than the bitvector, return an error */ |
| - if (m > BITVECTOR_MAX_WORDS) |
| - return -1; |
| - |
| - /* |
| - * loop over words from most significant - first word is a special |
| - * case |
| - */ |
| - |
| - if (n) { |
| - tmp = 0; |
| - for (i=0; i < n; i++) { |
| - tmp = hex_char_to_nibble(*string++); |
| - tmp <<= 4; |
| - } |
| - v->word[m] = tmp; |
| - } |
| - |
| - /* now loop over the rest of the words */ |
| - for (i=m-1; i >= 0; i--) { |
| - tmp = 0; |
| - for (j=0; j < 8; j++) { |
| - tmp = hex_char_to_nibble(*string++); |
| - tmp <<= 4; |
| - } |
| - v->word[i] = tmp; |
| - } |
| - |
| - return 0; |
| -} |
| - |
| |
| /* functions below not yet tested! */ |
| |
| diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-lin/crypto/replay/rdbx.c srtp/crypto/replay/rdbx.c |
| --- srtp-lin/crypto/replay/rdbx.c 2007-06-15 14:17:40.000000000 -0400 |
| +++ srtp/crypto/replay/rdbx.c 2009-04-22 19:03:15.000000000 -0400 |
| @@ -45,7 +45,6 @@ |
| |
| #include "rdbx.h" |
| |
| -#define rdbx_high_bit_in_bitmask 127 |
| |
| /* |
| * from draft-ietf-avt-srtp-00.txt: |
| @@ -180,17 +179,32 @@ index_guess(const xtd_seq_num_t *local, |
| |
| |
| /* |
| - * rdbx_init(&r) initalizes the rdbx_t pointed to by r |
| + * rdbx_init(&r, ws) initializes the rdbx_t pointed to by r with window size ws |
| */ |
| |
| err_status_t |
| -rdbx_init(rdbx_t *rdbx) { |
| - v128_set_to_zero(&rdbx->bitmask); |
| +rdbx_init(rdbx_t *rdbx, unsigned long ws) { |
| + if (ws == 0) |
| + return err_status_bad_param; |
| + |
| + if (bitvector_alloc(&rdbx->bitmask, ws) != 0) |
| + return err_status_alloc_fail; |
| + |
| index_init(&rdbx->index); |
| |
| return err_status_ok; |
| } |
| |
| +/* |
| + * rdbx_uninit(&r) uninitializes the rdbx_t pointed to by r |
| + */ |
| + |
| +err_status_t |
| +rdbx_uninit(rdbx_t *rdbx) { |
| + bitvector_dealloc(&rdbx->bitmask); |
| + |
| + return err_status_ok; |
| +} |
| |
| /* |
| * rdbx_set_roc(rdbx, roc) initalizes the rdbx_t at the location rdbx |
| @@ -202,7 +216,7 @@ rdbx_init(rdbx_t *rdbx) { |
| |
| err_status_t |
| rdbx_set_roc(rdbx_t *rdbx, uint32_t roc) { |
| - v128_set_to_zero(&rdbx->bitmask); |
| + bitvector_set_to_zero(&rdbx->bitmask); |
| |
| #ifdef NO_64BIT_MATH |
| #error not yet implemented |
| @@ -231,6 +245,17 @@ rdbx_get_packet_index(const rdbx_t *rdbx |
| } |
| |
| /* |
| + * rdbx_get_window_size(rdbx) returns the value of the window size |
| + * for the rdbx_t pointed to by rdbx |
| + * |
| + */ |
| + |
| +unsigned long |
| +rdbx_get_window_size(const rdbx_t *rdbx) { |
| + return bitvector_get_length(&rdbx->bitmask); |
| +} |
| + |
| +/* |
| * rdbx_check(&r, delta) checks to see if the xtd_seq_num_t |
| * which is at rdbx->index + delta is in the rdb |
| */ |
| @@ -240,11 +265,11 @@ rdbx_check(const rdbx_t *rdbx, int delta |
| |
| if (delta > 0) { /* if delta is positive, it's good */ |
| return err_status_ok; |
| - } else if (rdbx_high_bit_in_bitmask + delta < 0) { |
| + } else if ((int)(bitvector_get_length(&rdbx->bitmask) - 1) + delta < 0) { |
| /* if delta is lower than the bitmask, it's bad */ |
| return err_status_replay_old; |
| - } else if (v128_get_bit(&rdbx->bitmask, |
| - rdbx_high_bit_in_bitmask + delta) == 1) { |
| + } else if (bitvector_get_bit(&rdbx->bitmask, |
| + (int)(bitvector_get_length(&rdbx->bitmask) - 1) + delta) == 1) { |
| /* delta is within the window, so check the bitmask */ |
| return err_status_replay_fail; |
| } |
| @@ -268,11 +293,11 @@ rdbx_add_index(rdbx_t *rdbx, int delta) |
| if (delta > 0) { |
| /* shift forward by delta */ |
| index_advance(&rdbx->index, delta); |
| - v128_left_shift(&rdbx->bitmask, delta); |
| - v128_set_bit(&rdbx->bitmask, 127); |
| + bitvector_left_shift(&rdbx->bitmask, delta); |
| + bitvector_set_bit(&rdbx->bitmask, bitvector_get_length(&rdbx->bitmask) - 1); |
| } else { |
| /* delta is in window, so flip bit in bitmask */ |
| - v128_set_bit(&rdbx->bitmask, -delta); |
| + bitvector_set_bit(&rdbx->bitmask, -delta); |
| } |
| |
| /* note that we need not consider the case that delta == 0 */ |
| diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-lin/include/srtp.h srtp/include/srtp.h |
| --- srtp-lin/include/srtp.h 2007-06-15 14:17:40.000000000 -0400 |
| +++ srtp/include/srtp.h 2009-04-22 19:06:22.000000000 -0400 |
| @@ -223,6 +223,8 @@ typedef struct srtp_policy_t { |
| * this stream. */ |
| ekt_policy_t ekt; /**< Pointer to the EKT policy structure |
| * for this stream (if any) */ |
| + unsigned long window_size; /**< The window size to use for replay |
| + * protection. */ |
| struct srtp_policy_t *next; /**< Pointer to next stream policy. */ |
| } srtp_policy_t; |
| |
| diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-lin/srtp/srtp.c srtp/srtp/srtp.c |
| --- srtp-lin/srtp/srtp.c 2007-06-15 14:17:40.000000000 -0400 |
| +++ srtp/srtp/srtp.c 2009-04-22 19:18:43.000000000 -0400 |
| @@ -275,7 +275,10 @@ srtp_stream_clone(const srtp_stream_ctx_ |
| return status; |
| |
| /* initialize replay databases */ |
| - rdbx_init(&str->rtp_rdbx); |
| + status = rdbx_init(&str->rtp_rdbx, |
| + rdbx_get_window_size(&stream_template->rtp_rdbx)); |
| + if (status) |
| + return status; |
| rdb_init(&str->rtcp_rdb); |
| |
| /* set ssrc to that provided */ |
| @@ -491,7 +494,8 @@ srtp_stream_init(srtp_stream_ctx_t *srtp |
| p->ssrc.value); |
| |
| /* initialize replay database */ |
| - rdbx_init(&srtp->rtp_rdbx); |
| + err = rdbx_init(&srtp->rtp_rdbx, p->window_size); |
| + if (err) return err; |
| |
| /* initialize key limit to maximum value */ |
| #ifdef NO_64BIT_MATH |
| @@ -525,14 +529,20 @@ srtp_stream_init(srtp_stream_ctx_t *srtp |
| |
| /* initialize keys */ |
| err = srtp_stream_init_keys(srtp, p->key); |
| - if (err) return err; |
| + if (err) { |
| + rdbx_uninit(&srtp->rtp_rdbx); |
| + return err; |
| + } |
| |
| /* |
| * if EKT is in use, then initialize the EKT data associated with |
| * the stream |
| */ |
| err = ekt_stream_init_from_policy(srtp->ekt, p->ekt); |
| - if (err) return err; |
| + if (err) { |
| + rdbx_uninit(&srtp->rtp_rdbx); |
| + return err; |
| + } |
| |
| return err_status_ok; |
| } |
| diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-lin/test/dtls_srtp_driver.c srtp/test/dtls_srtp_driver.c |
| --- srtp-lin/test/dtls_srtp_driver.c 2009-04-23 15:50:26.000000000 -0400 |
| +++ srtp/test/dtls_srtp_driver.c 2009-04-23 15:50:48.000000000 -0400 |
| @@ -184,6 +184,7 @@ test_dtls_srtp() { |
| if (err) return err; |
| policy.ssrc.type = ssrc_any_inbound; |
| policy.ekt = NULL; |
| + policy.window_size = 128; |
| policy.next = NULL; |
| |
| err = srtp_add_stream(s, &policy); |
| diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-lin/test/rdbx_driver.c srtp/test/rdbx_driver.c |
| --- srtp-lin/test/rdbx_driver.c 2006-07-17 16:41:22.000000000 -0400 |
| +++ srtp/test/rdbx_driver.c 2009-04-22 19:22:21.000000000 -0400 |
| @@ -55,10 +55,10 @@ |
| #include "ut_sim.h" |
| |
| err_status_t |
| -test_replay_dbx(int num_trials); |
| +test_replay_dbx(int num_trials, unsigned long ws); |
| |
| double |
| -rdbx_check_adds_per_second(int num_trials); |
| +rdbx_check_adds_per_second(int num_trials, unsigned long ws); |
| |
| void |
| usage(char *prog_name) { |
| @@ -99,9 +99,18 @@ main (int argc, char *argv[]) { |
| usage(argv[0]); |
| |
| if (do_validation) { |
| - printf("testing rdbx_t...\n"); |
| + printf("testing rdbx_t (ws=128)...\n"); |
| |
| - status = test_replay_dbx(1 << 12); |
| + status = test_replay_dbx(1 << 12, 128); |
| + if (status) { |
| + printf("failed\n"); |
| + exit(1); |
| + } |
| + printf("passed\n"); |
| + |
| + printf("testing rdbx_t (ws=1024)...\n"); |
| + |
| + status = test_replay_dbx(1 << 12, 1024); |
| if (status) { |
| printf("failed\n"); |
| exit(1); |
| @@ -110,8 +119,10 @@ main (int argc, char *argv[]) { |
| } |
| |
| if (do_timing_test) { |
| - rate = rdbx_check_adds_per_second(1 << 18); |
| - printf("rdbx_check/replay_adds per second: %e\n", rate); |
| + rate = rdbx_check_adds_per_second(1 << 18, 128); |
| + printf("rdbx_check/replay_adds per second (ws=128): %e\n", rate); |
| + rate = rdbx_check_adds_per_second(1 << 18, 1024); |
| + printf("rdbx_check/replay_adds per second (ws=1024): %e\n", rate); |
| } |
| |
| return 0; |
| @@ -119,8 +130,11 @@ main (int argc, char *argv[]) { |
| |
| void |
| print_rdbx(rdbx_t *rdbx) { |
| + char buf[2048]; |
| printf("rdbx: {%llu, %s}\n", |
| - (unsigned long long)(rdbx->index), v128_bit_string(&rdbx->bitmask)); |
| + (unsigned long long)(rdbx->index), |
| + bitvector_bit_string(&rdbx->bitmask, buf, sizeof(buf)) |
| +); |
| } |
| |
| |
| @@ -194,17 +208,15 @@ rdbx_check_unordered(rdbx_t *rdbx, uint3 |
| return err_status_ok; |
| } |
| |
| -#define MAX_IDX 160 |
| - |
| err_status_t |
| -test_replay_dbx(int num_trials) { |
| +test_replay_dbx(int num_trials, unsigned long ws) { |
| rdbx_t rdbx; |
| uint32_t idx, ircvd; |
| ut_connection utc; |
| err_status_t status; |
| int num_fp_trials; |
| |
| - status = rdbx_init(&rdbx); |
| + status = rdbx_init(&rdbx, ws); |
| if (status) { |
| printf("replay_init failed with error code %d\n", status); |
| exit(1); |
| @@ -241,7 +253,9 @@ test_replay_dbx(int num_trials) { |
| printf("passed\n"); |
| |
| /* re-initialize */ |
| - if (rdbx_init(&rdbx) != err_status_ok) { |
| + rdbx_uninit(&rdbx); |
| + |
| + if (rdbx_init(&rdbx, ws) != err_status_ok) { |
| printf("replay_init failed\n"); |
| return err_status_init_fail; |
| } |
| @@ -263,6 +277,8 @@ test_replay_dbx(int num_trials) { |
| } |
| printf("passed\n"); |
| |
| + rdbx_uninit(&rdbx); |
| + |
| return err_status_ok; |
| } |
| |
| @@ -272,7 +288,7 @@ test_replay_dbx(int num_trials) { |
| #include <stdlib.h> /* for random() */ |
| |
| double |
| -rdbx_check_adds_per_second(int num_trials) { |
| +rdbx_check_adds_per_second(int num_trials, unsigned long ws) { |
| uint32_t i; |
| int delta; |
| rdbx_t rdbx; |
| @@ -280,7 +296,7 @@ rdbx_check_adds_per_second(int num_trial |
| clock_t timer; |
| int failures; /* count number of failures */ |
| |
| - if (rdbx_init(&rdbx) != err_status_ok) { |
| + if (rdbx_init(&rdbx, ws) != err_status_ok) { |
| printf("replay_init failed\n"); |
| exit(1); |
| } |
| @@ -301,6 +317,8 @@ rdbx_check_adds_per_second(int num_trial |
| |
| printf("number of failures: %d \n", failures); |
| |
| + rdbx_uninit(&rdbx); |
| + |
| return (double) CLOCKS_PER_SEC * num_trials / timer; |
| } |
| |
| diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-lin/test/rtpw.c srtp/test/rtpw.c |
| --- srtp-lin/test/rtpw.c 2006-07-17 16:41:22.000000000 -0400 |
| +++ srtp/test/rtpw.c 2009-04-22 19:16:52.000000000 -0400 |
| @@ -330,6 +330,7 @@ main (int argc, char *argv[]) { |
| policy.ssrc.value = ssrc; |
| policy.key = (uint8_t *) key; |
| policy.next = NULL; |
| + policy.window_size = 128; |
| policy.rtp.sec_serv = sec_servs; |
| policy.rtcp.sec_serv = sec_serv_none; /* we don't do RTCP anyway */ |
| |
| @@ -382,6 +383,7 @@ main (int argc, char *argv[]) { |
| policy.rtcp.auth_key_len = 0; |
| policy.rtcp.auth_tag_len = 0; |
| policy.rtcp.sec_serv = sec_serv_none; |
| + policy.window_size = 0; |
| policy.next = NULL; |
| } |
| |
| diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-lin/test/srtp_driver.c srtp/test/srtp_driver.c |
| --- srtp-lin/test/srtp_driver.c 2009-04-22 18:20:27.000000000 -0400 |
| +++ srtp/test/srtp_driver.c 2009-04-22 19:16:52.000000000 -0400 |
| @@ -321,6 +321,8 @@ main (int argc, char *argv[]) { |
| policy.ssrc.type = ssrc_specific; |
| policy.ssrc.value = 0xdecafbad; |
| policy.key = test_key; |
| + policy.ekt = NULL; |
| + policy.window_size = 128; |
| policy.next = NULL; |
| |
| printf("mips estimate: %e\n", mips); |
| @@ -989,14 +991,16 @@ srtp_session_print_policy(srtp_t srtp) { |
| "# rtp services: %s\r\n" |
| "# rtcp cipher: %s\r\n" |
| "# rtcp auth: %s\r\n" |
| - "# rtcp services: %s\r\n", |
| + "# rtcp services: %s\r\n" |
| + "# window size: %lu\r\n", |
| direction[stream->direction], |
| stream->rtp_cipher->type->description, |
| stream->rtp_auth->type->description, |
| serv_descr[stream->rtp_services], |
| stream->rtcp_cipher->type->description, |
| stream->rtcp_auth->type->description, |
| - serv_descr[stream->rtcp_services]); |
| + serv_descr[stream->rtcp_services], |
| + rdbx_get_window_size(&stream->rtp_rdbx)); |
| } |
| |
| /* loop over streams in session, printing the policy of each */ |
| @@ -1011,14 +1015,16 @@ srtp_session_print_policy(srtp_t srtp) { |
| "# rtp services: %s\r\n" |
| "# rtcp cipher: %s\r\n" |
| "# rtcp auth: %s\r\n" |
| - "# rtcp services: %s\r\n", |
| + "# rtcp services: %s\r\n" |
| + "# window size: %lu\r\n", |
| stream->ssrc, |
| stream->rtp_cipher->type->description, |
| stream->rtp_auth->type->description, |
| serv_descr[stream->rtp_services], |
| stream->rtcp_cipher->type->description, |
| stream->rtcp_auth->type->description, |
| - serv_descr[stream->rtcp_services]); |
| + serv_descr[stream->rtcp_services], |
| + rdbx_get_window_size(&stream->rtp_rdbx)); |
| |
| /* advance to next stream in the list */ |
| stream = stream->next; |
| @@ -1172,6 +1178,8 @@ srtp_validate() { |
| policy.ssrc.type = ssrc_specific; |
| policy.ssrc.value = 0xcafebabe; |
| policy.key = test_key; |
| + policy.ekt = NULL; |
| + policy.window_size = 128; |
| policy.next = NULL; |
| |
| status = srtp_create(&srtp_snd, &policy); |
| @@ -1328,6 +1336,7 @@ const srtp_policy_t default_policy = { |
| }, |
| test_key, |
| NULL, /* indicates that EKT is not in use */ |
| + 128, /* replay window size */ |
| NULL |
| }; |
| |
| @@ -1351,6 +1360,7 @@ const srtp_policy_t aes_tmmh_policy = { |
| }, |
| test_key, |
| NULL, /* indicates that EKT is not in use */ |
| + 128, /* replay window size */ |
| NULL |
| }; |
| |
| @@ -1374,6 +1384,7 @@ const srtp_policy_t tmmh_only_policy = { |
| }, |
| test_key, |
| NULL, /* indicates that EKT is not in use */ |
| + 128, /* replay window size */ |
| NULL |
| }; |
| |
| @@ -1397,6 +1408,7 @@ const srtp_policy_t aes_only_policy = { |
| }, |
| test_key, |
| NULL, /* indicates that EKT is not in use */ |
| + 128, /* replay window size */ |
| NULL |
| }; |
| |
| @@ -1420,6 +1432,7 @@ const srtp_policy_t hmac_only_policy = { |
| }, |
| test_key, |
| NULL, /* indicates that EKT is not in use */ |
| + 128, /* replay window size */ |
| NULL |
| }; |
| |
| @@ -1443,6 +1456,7 @@ const srtp_policy_t null_policy = { |
| }, |
| test_key, |
| NULL, /* indicates that EKT is not in use */ |
| + 128, /* replay window size */ |
| NULL |
| }; |
| |
| @@ -1480,6 +1494,7 @@ const srtp_policy_t hmac_only_with_ekt_p |
| }, |
| test_key, |
| &ekt_test_policy, /* indicates that EKT is not in use */ |
| + 128, /* replay window size */ |
| NULL |
| }; |
| |
| @@ -1531,5 +1546,7 @@ const srtp_policy_t wildcard_policy = { |
| sec_serv_conf_and_auth /* security services flag */ |
| }, |
| test_key, |
| + NULL, |
| + 128, /* replay window size */ |
| NULL |
| }; |