937 lines
25 KiB
Diff
937 lines
25 KiB
Diff
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
|
|
};
|