| diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-ws/include/srtp.h srtp/include/srtp.h |
| --- srtp-ws/include/srtp.h 2009-04-22 19:06:22.000000000 -0400 |
| +++ srtp/include/srtp.h 2009-04-23 15:17:49.000000000 -0400 |
| @@ -225,6 +225,12 @@ typedef struct srtp_policy_t { |
| * for this stream (if any) */ |
| unsigned long window_size; /**< The window size to use for replay |
| * protection. */ |
| + int allow_repeat_tx; /**< Whether retransmissions of |
| + * packets with the same sequence number |
| + * are allowed. (Note that such repeated |
| + * transmissions must have the same RTP |
| + * payload, or a severe security weakness |
| + * is introduced!) */ |
| struct srtp_policy_t *next; /**< Pointer to next stream policy. */ |
| } srtp_policy_t; |
| |
| diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-ws/include/srtp_priv.h srtp/include/srtp_priv.h |
| --- srtp-ws/include/srtp_priv.h 2007-06-15 14:17:40.000000000 -0400 |
| +++ srtp/include/srtp_priv.h 2009-04-22 19:27:10.000000000 -0400 |
| @@ -218,6 +218,7 @@ typedef struct srtp_stream_ctx_t { |
| sec_serv_t rtcp_services; |
| key_limit_ctx_t *limit; |
| direction_t direction; |
| + int allow_repeat_tx; |
| ekt_stream_t ekt; |
| struct srtp_stream_ctx_t *next; /* linked list of streams */ |
| } srtp_stream_ctx_t; |
| diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-ws/srtp/srtp.c srtp/srtp/srtp.c |
| --- srtp-ws/srtp/srtp.c 2009-04-22 19:18:43.000000000 -0400 |
| +++ srtp/srtp/srtp.c 2009-04-22 19:30:23.000000000 -0400 |
| @@ -280,6 +280,7 @@ srtp_stream_clone(const srtp_stream_ctx_ |
| if (status) |
| return status; |
| rdb_init(&str->rtcp_rdb); |
| + str->allow_repeat_tx = stream_template->allow_repeat_tx; |
| |
| /* set ssrc to that provided */ |
| str->ssrc = ssrc; |
| @@ -525,6 +526,9 @@ srtp_stream_init(srtp_stream_ctx_t *srtp |
| /* initialize SRTCP replay database */ |
| rdb_init(&srtp->rtcp_rdb); |
| |
| + /* initialize allow_repeat_tx */ |
| + srtp->allow_repeat_tx = p->allow_repeat_tx; |
| + |
| /* DAM - no RTCP key limit at present */ |
| |
| /* initialize keys */ |
| @@ -732,9 +736,12 @@ srtp_stream_init(srtp_stream_ctx_t *srtp |
| */ |
| delta = rdbx_estimate_index(&stream->rtp_rdbx, &est, ntohs(hdr->seq)); |
| status = rdbx_check(&stream->rtp_rdbx, delta); |
| - if (status) |
| - return status; /* we've been asked to reuse an index */ |
| - rdbx_add_index(&stream->rtp_rdbx, delta); |
| + if (status) { |
| + if (status != err_status_replay_fail || !stream->allow_repeat_tx) |
| + return status; /* we've been asked to reuse an index */ |
| + } |
| + else |
| + rdbx_add_index(&stream->rtp_rdbx, delta); |
| |
| #ifdef NO_64BIT_MATH |
| debug_print2(mod_srtp, "estimated packet index: %08x%08x", |
| diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-ws/test/dtls_srtp_driver.c srtp/test/dtls_srtp_driver.c |
| --- srtp-ws/test/dtls_srtp_driver.c 2009-04-23 15:50:48.000000000 -0400 |
| +++ srtp/test/dtls_srtp_driver.c 2009-04-23 15:51:11.000000000 -0400 |
| @@ -185,6 +185,7 @@ test_dtls_srtp() { |
| policy.ssrc.type = ssrc_any_inbound; |
| policy.ekt = NULL; |
| policy.window_size = 128; |
| + policy.allow_repeat_tx = 0; |
| policy.next = NULL; |
| |
| err = srtp_add_stream(s, &policy); |
| diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-ws/test/rtpw.c srtp/test/rtpw.c |
| --- srtp-ws/test/rtpw.c 2009-04-22 19:16:52.000000000 -0400 |
| +++ srtp/test/rtpw.c 2009-04-23 15:16:18.000000000 -0400 |
| @@ -331,6 +331,7 @@ main (int argc, char *argv[]) { |
| policy.key = (uint8_t *) key; |
| policy.next = NULL; |
| policy.window_size = 128; |
| + policy.allow_repeat_tx = 0; |
| policy.rtp.sec_serv = sec_servs; |
| policy.rtcp.sec_serv = sec_serv_none; /* we don't do RTCP anyway */ |
| |
| @@ -384,6 +385,7 @@ main (int argc, char *argv[]) { |
| policy.rtcp.auth_tag_len = 0; |
| policy.rtcp.sec_serv = sec_serv_none; |
| policy.window_size = 0; |
| + policy.allow_repeat_tx = 0; |
| policy.next = NULL; |
| } |
| |
| diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-ws/test/srtp_driver.c srtp/test/srtp_driver.c |
| --- srtp-ws/test/srtp_driver.c 2009-04-22 19:16:52.000000000 -0400 |
| +++ srtp/test/srtp_driver.c 2009-04-23 15:16:18.000000000 -0400 |
| @@ -323,6 +323,7 @@ main (int argc, char *argv[]) { |
| policy.key = test_key; |
| policy.ekt = NULL; |
| policy.window_size = 128; |
| + policy.allow_repeat_tx = 0; |
| policy.next = NULL; |
| |
| printf("mips estimate: %e\n", mips); |
| @@ -992,7 +993,8 @@ srtp_session_print_policy(srtp_t srtp) { |
| "# rtcp cipher: %s\r\n" |
| "# rtcp auth: %s\r\n" |
| "# rtcp services: %s\r\n" |
| - "# window size: %lu\r\n", |
| + "# window size: %lu\r\n" |
| + "# tx rtx allowed:%s\r\n", |
| direction[stream->direction], |
| stream->rtp_cipher->type->description, |
| stream->rtp_auth->type->description, |
| @@ -1000,7 +1002,8 @@ srtp_session_print_policy(srtp_t srtp) { |
| stream->rtcp_cipher->type->description, |
| stream->rtcp_auth->type->description, |
| serv_descr[stream->rtcp_services], |
| - rdbx_get_window_size(&stream->rtp_rdbx)); |
| + rdbx_get_window_size(&stream->rtp_rdbx), |
| + stream->allow_repeat_tx ? "true" : "false"); |
| } |
| |
| /* loop over streams in session, printing the policy of each */ |
| @@ -1016,7 +1019,8 @@ srtp_session_print_policy(srtp_t srtp) { |
| "# rtcp cipher: %s\r\n" |
| "# rtcp auth: %s\r\n" |
| "# rtcp services: %s\r\n" |
| - "# window size: %lu\r\n", |
| + "# window size: %lu\r\n" |
| + "# tx rtx allowed:%s\r\n", |
| stream->ssrc, |
| stream->rtp_cipher->type->description, |
| stream->rtp_auth->type->description, |
| @@ -1024,7 +1028,8 @@ srtp_session_print_policy(srtp_t srtp) { |
| stream->rtcp_cipher->type->description, |
| stream->rtcp_auth->type->description, |
| serv_descr[stream->rtcp_services], |
| - rdbx_get_window_size(&stream->rtp_rdbx)); |
| + rdbx_get_window_size(&stream->rtp_rdbx), |
| + stream->allow_repeat_tx ? "true" : "false"); |
| |
| /* advance to next stream in the list */ |
| stream = stream->next; |
| @@ -1180,6 +1185,7 @@ srtp_validate() { |
| policy.key = test_key; |
| policy.ekt = NULL; |
| policy.window_size = 128; |
| + policy.allow_repeat_tx = 0; |
| policy.next = NULL; |
| |
| status = srtp_create(&srtp_snd, &policy); |
| @@ -1337,6 +1343,7 @@ const srtp_policy_t default_policy = { |
| test_key, |
| NULL, /* indicates that EKT is not in use */ |
| 128, /* replay window size */ |
| + 0, /* retransmission not allowed */ |
| NULL |
| }; |
| |
| @@ -1361,6 +1368,7 @@ const srtp_policy_t aes_tmmh_policy = { |
| test_key, |
| NULL, /* indicates that EKT is not in use */ |
| 128, /* replay window size */ |
| + 0, /* retransmission not allowed */ |
| NULL |
| }; |
| |
| @@ -1385,6 +1393,7 @@ const srtp_policy_t tmmh_only_policy = { |
| test_key, |
| NULL, /* indicates that EKT is not in use */ |
| 128, /* replay window size */ |
| + 0, /* retransmission not allowed */ |
| NULL |
| }; |
| |
| @@ -1409,6 +1418,7 @@ const srtp_policy_t aes_only_policy = { |
| test_key, |
| NULL, /* indicates that EKT is not in use */ |
| 128, /* replay window size */ |
| + 0, /* retransmission not allowed */ |
| NULL |
| }; |
| |
| @@ -1433,6 +1443,7 @@ const srtp_policy_t hmac_only_policy = { |
| test_key, |
| NULL, /* indicates that EKT is not in use */ |
| 128, /* replay window size */ |
| + 0, /* retransmission not allowed */ |
| NULL |
| }; |
| |
| @@ -1457,6 +1468,7 @@ const srtp_policy_t null_policy = { |
| test_key, |
| NULL, /* indicates that EKT is not in use */ |
| 128, /* replay window size */ |
| + 0, /* retransmission not allowed */ |
| NULL |
| }; |
| |
| @@ -1495,6 +1507,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 */ |
| + 0, /* retransmission not allowed */ |
| NULL |
| }; |
| |
| @@ -1548,5 +1561,6 @@ const srtp_policy_t wildcard_policy = { |
| test_key, |
| NULL, |
| 128, /* replay window size */ |
| + 0, /* retransmission not allowed */ |
| NULL |
| }; |