1*90e502c7SAndroid Build Coastguard Worker /* 2*90e502c7SAndroid Build Coastguard Worker * rdbx.h 3*90e502c7SAndroid Build Coastguard Worker * 4*90e502c7SAndroid Build Coastguard Worker * replay database with extended packet indices, using a rollover counter 5*90e502c7SAndroid Build Coastguard Worker * 6*90e502c7SAndroid Build Coastguard Worker * David A. McGrew 7*90e502c7SAndroid Build Coastguard Worker * Cisco Systems, Inc. 8*90e502c7SAndroid Build Coastguard Worker * 9*90e502c7SAndroid Build Coastguard Worker */ 10*90e502c7SAndroid Build Coastguard Worker 11*90e502c7SAndroid Build Coastguard Worker /* 12*90e502c7SAndroid Build Coastguard Worker * 13*90e502c7SAndroid Build Coastguard Worker * Copyright (c) 2001-2017, Cisco Systems, Inc. 14*90e502c7SAndroid Build Coastguard Worker * All rights reserved. 15*90e502c7SAndroid Build Coastguard Worker * 16*90e502c7SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 17*90e502c7SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions 18*90e502c7SAndroid Build Coastguard Worker * are met: 19*90e502c7SAndroid Build Coastguard Worker * 20*90e502c7SAndroid Build Coastguard Worker * Redistributions of source code must retain the above copyright 21*90e502c7SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 22*90e502c7SAndroid Build Coastguard Worker * 23*90e502c7SAndroid Build Coastguard Worker * Redistributions in binary form must reproduce the above 24*90e502c7SAndroid Build Coastguard Worker * copyright notice, this list of conditions and the following 25*90e502c7SAndroid Build Coastguard Worker * disclaimer in the documentation and/or other materials provided 26*90e502c7SAndroid Build Coastguard Worker * with the distribution. 27*90e502c7SAndroid Build Coastguard Worker * 28*90e502c7SAndroid Build Coastguard Worker * Neither the name of the Cisco Systems, Inc. nor the names of its 29*90e502c7SAndroid Build Coastguard Worker * contributors may be used to endorse or promote products derived 30*90e502c7SAndroid Build Coastguard Worker * from this software without specific prior written permission. 31*90e502c7SAndroid Build Coastguard Worker * 32*90e502c7SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33*90e502c7SAndroid Build Coastguard Worker * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34*90e502c7SAndroid Build Coastguard Worker * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 35*90e502c7SAndroid Build Coastguard Worker * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 36*90e502c7SAndroid Build Coastguard Worker * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 37*90e502c7SAndroid Build Coastguard Worker * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 38*90e502c7SAndroid Build Coastguard Worker * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 39*90e502c7SAndroid Build Coastguard Worker * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 40*90e502c7SAndroid Build Coastguard Worker * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 41*90e502c7SAndroid Build Coastguard Worker * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 42*90e502c7SAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 43*90e502c7SAndroid Build Coastguard Worker * OF THE POSSIBILITY OF SUCH DAMAGE. 44*90e502c7SAndroid Build Coastguard Worker * 45*90e502c7SAndroid Build Coastguard Worker */ 46*90e502c7SAndroid Build Coastguard Worker 47*90e502c7SAndroid Build Coastguard Worker #ifndef RDBX_H 48*90e502c7SAndroid Build Coastguard Worker #define RDBX_H 49*90e502c7SAndroid Build Coastguard Worker 50*90e502c7SAndroid Build Coastguard Worker #include "datatypes.h" 51*90e502c7SAndroid Build Coastguard Worker #include "err.h" 52*90e502c7SAndroid Build Coastguard Worker 53*90e502c7SAndroid Build Coastguard Worker #ifdef __cplusplus 54*90e502c7SAndroid Build Coastguard Worker extern "C" { 55*90e502c7SAndroid Build Coastguard Worker #endif 56*90e502c7SAndroid Build Coastguard Worker 57*90e502c7SAndroid Build Coastguard Worker /* #define ROC_TEST */ 58*90e502c7SAndroid Build Coastguard Worker 59*90e502c7SAndroid Build Coastguard Worker #ifndef ROC_TEST 60*90e502c7SAndroid Build Coastguard Worker 61*90e502c7SAndroid Build Coastguard Worker typedef uint16_t srtp_sequence_number_t; /* 16 bit sequence number */ 62*90e502c7SAndroid Build Coastguard Worker typedef uint32_t srtp_rollover_counter_t; /* 32 bit rollover counter */ 63*90e502c7SAndroid Build Coastguard Worker 64*90e502c7SAndroid Build Coastguard Worker #else /* use small seq_num and roc datatypes for testing purposes */ 65*90e502c7SAndroid Build Coastguard Worker 66*90e502c7SAndroid Build Coastguard Worker typedef unsigned char srtp_sequence_number_t; /* 8 bit sequence number */ 67*90e502c7SAndroid Build Coastguard Worker typedef uint16_t srtp_rollover_counter_t; /* 16 bit rollover counter */ 68*90e502c7SAndroid Build Coastguard Worker 69*90e502c7SAndroid Build Coastguard Worker #endif 70*90e502c7SAndroid Build Coastguard Worker 71*90e502c7SAndroid Build Coastguard Worker #define seq_num_median (1 << (8 * sizeof(srtp_sequence_number_t) - 1)) 72*90e502c7SAndroid Build Coastguard Worker #define seq_num_max (1 << (8 * sizeof(srtp_sequence_number_t))) 73*90e502c7SAndroid Build Coastguard Worker 74*90e502c7SAndroid Build Coastguard Worker /* 75*90e502c7SAndroid Build Coastguard Worker * An rtp_xtd_seq_num_t is a 64-bit unsigned integer used as an 'extended' 76*90e502c7SAndroid Build Coastguard Worker * sequence number. 77*90e502c7SAndroid Build Coastguard Worker */ 78*90e502c7SAndroid Build Coastguard Worker typedef uint64_t srtp_xtd_seq_num_t; 79*90e502c7SAndroid Build Coastguard Worker 80*90e502c7SAndroid Build Coastguard Worker /* 81*90e502c7SAndroid Build Coastguard Worker * An srtp_rdbx_t is a replay database with extended range; it uses an 82*90e502c7SAndroid Build Coastguard Worker * xtd_seq_num_t and a bitmask of recently received indices. 83*90e502c7SAndroid Build Coastguard Worker */ 84*90e502c7SAndroid Build Coastguard Worker typedef struct { 85*90e502c7SAndroid Build Coastguard Worker srtp_xtd_seq_num_t index; 86*90e502c7SAndroid Build Coastguard Worker bitvector_t bitmask; 87*90e502c7SAndroid Build Coastguard Worker } srtp_rdbx_t; 88*90e502c7SAndroid Build Coastguard Worker 89*90e502c7SAndroid Build Coastguard Worker /* 90*90e502c7SAndroid Build Coastguard Worker * srtp_rdbx_init(rdbx_ptr, ws) 91*90e502c7SAndroid Build Coastguard Worker * 92*90e502c7SAndroid Build Coastguard Worker * initializes the rdbx pointed to by its argument with the window size ws, 93*90e502c7SAndroid Build Coastguard Worker * setting the rollover counter and sequence number to zero 94*90e502c7SAndroid Build Coastguard Worker */ 95*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_rdbx_init(srtp_rdbx_t *rdbx, unsigned long ws); 96*90e502c7SAndroid Build Coastguard Worker 97*90e502c7SAndroid Build Coastguard Worker /* 98*90e502c7SAndroid Build Coastguard Worker * srtp_rdbx_dealloc(rdbx_ptr) 99*90e502c7SAndroid Build Coastguard Worker * 100*90e502c7SAndroid Build Coastguard Worker * frees memory associated with the rdbx 101*90e502c7SAndroid Build Coastguard Worker */ 102*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_rdbx_dealloc(srtp_rdbx_t *rdbx); 103*90e502c7SAndroid Build Coastguard Worker 104*90e502c7SAndroid Build Coastguard Worker /* 105*90e502c7SAndroid Build Coastguard Worker * srtp_rdbx_estimate_index(rdbx, guess, s) 106*90e502c7SAndroid Build Coastguard Worker * 107*90e502c7SAndroid Build Coastguard Worker * given an rdbx and a sequence number s (from a newly arrived packet), 108*90e502c7SAndroid Build Coastguard Worker * sets the contents of *guess to contain the best guess of the packet 109*90e502c7SAndroid Build Coastguard Worker * index to which s corresponds, and returns the difference between 110*90e502c7SAndroid Build Coastguard Worker * *guess and the locally stored synch info 111*90e502c7SAndroid Build Coastguard Worker */ 112*90e502c7SAndroid Build Coastguard Worker int32_t srtp_rdbx_estimate_index(const srtp_rdbx_t *rdbx, 113*90e502c7SAndroid Build Coastguard Worker srtp_xtd_seq_num_t *guess, 114*90e502c7SAndroid Build Coastguard Worker srtp_sequence_number_t s); 115*90e502c7SAndroid Build Coastguard Worker 116*90e502c7SAndroid Build Coastguard Worker /* 117*90e502c7SAndroid Build Coastguard Worker * srtp_rdbx_check(rdbx, delta); 118*90e502c7SAndroid Build Coastguard Worker * 119*90e502c7SAndroid Build Coastguard Worker * srtp_rdbx_check(&r, delta) checks to see if the xtd_seq_num_t 120*90e502c7SAndroid Build Coastguard Worker * which is at rdbx->window_start + delta is in the rdb 121*90e502c7SAndroid Build Coastguard Worker * 122*90e502c7SAndroid Build Coastguard Worker */ 123*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_rdbx_check(const srtp_rdbx_t *rdbx, int difference); 124*90e502c7SAndroid Build Coastguard Worker 125*90e502c7SAndroid Build Coastguard Worker /* 126*90e502c7SAndroid Build Coastguard Worker * srtp_replay_add_index(rdbx, delta) 127*90e502c7SAndroid Build Coastguard Worker * 128*90e502c7SAndroid Build Coastguard Worker * adds the srtp_xtd_seq_num_t at rdbx->window_start + delta to replay_db 129*90e502c7SAndroid Build Coastguard Worker * (and does *not* check if that xtd_seq_num_t appears in db) 130*90e502c7SAndroid Build Coastguard Worker * 131*90e502c7SAndroid Build Coastguard Worker * this function should be called *only* after replay_check has 132*90e502c7SAndroid Build Coastguard Worker * indicated that the index does not appear in the rdbx, and a mutex 133*90e502c7SAndroid Build Coastguard Worker * should protect the rdbx between these calls if necessary. 134*90e502c7SAndroid Build Coastguard Worker */ 135*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_rdbx_add_index(srtp_rdbx_t *rdbx, int delta); 136*90e502c7SAndroid Build Coastguard Worker 137*90e502c7SAndroid Build Coastguard Worker /* 138*90e502c7SAndroid Build Coastguard Worker * srtp_rdbx_set_roc(rdbx, roc) initalizes the srtp_rdbx_t at the location rdbx 139*90e502c7SAndroid Build Coastguard Worker * to have the rollover counter value roc. If that value is less than 140*90e502c7SAndroid Build Coastguard Worker * the current rollover counter value, then the function returns 141*90e502c7SAndroid Build Coastguard Worker * srtp_err_status_replay_old; otherwise, srtp_err_status_ok is returned. 142*90e502c7SAndroid Build Coastguard Worker * 143*90e502c7SAndroid Build Coastguard Worker */ 144*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_rdbx_set_roc(srtp_rdbx_t *rdbx, uint32_t roc); 145*90e502c7SAndroid Build Coastguard Worker 146*90e502c7SAndroid Build Coastguard Worker /* 147*90e502c7SAndroid Build Coastguard Worker * srtp_rdbx_get_packet_index(rdbx) returns the value of the rollover counter 148*90e502c7SAndroid Build Coastguard Worker * for 149*90e502c7SAndroid Build Coastguard Worker * the srtp_rdbx_t pointed to by rdbx 150*90e502c7SAndroid Build Coastguard Worker * 151*90e502c7SAndroid Build Coastguard Worker */ 152*90e502c7SAndroid Build Coastguard Worker srtp_xtd_seq_num_t srtp_rdbx_get_packet_index(const srtp_rdbx_t *rdbx); 153*90e502c7SAndroid Build Coastguard Worker 154*90e502c7SAndroid Build Coastguard Worker /* 155*90e502c7SAndroid Build Coastguard Worker * srtp_xtd_seq_num_t functions - these are *internal* functions of rdbx, and 156*90e502c7SAndroid Build Coastguard Worker * shouldn't be used to manipulate rdbx internal values. use the rdbx 157*90e502c7SAndroid Build Coastguard Worker * api instead! 158*90e502c7SAndroid Build Coastguard Worker */ 159*90e502c7SAndroid Build Coastguard Worker 160*90e502c7SAndroid Build Coastguard Worker /* 161*90e502c7SAndroid Build Coastguard Worker * srtp_rdbx_get_ws(rdbx_ptr) 162*90e502c7SAndroid Build Coastguard Worker * 163*90e502c7SAndroid Build Coastguard Worker * gets the window size which was used to initialize the rdbx 164*90e502c7SAndroid Build Coastguard Worker */ 165*90e502c7SAndroid Build Coastguard Worker unsigned long srtp_rdbx_get_window_size(const srtp_rdbx_t *rdbx); 166*90e502c7SAndroid Build Coastguard Worker 167*90e502c7SAndroid Build Coastguard Worker /* index_init(&pi) initializes a packet index pi (sets it to zero) */ 168*90e502c7SAndroid Build Coastguard Worker void srtp_index_init(srtp_xtd_seq_num_t *pi); 169*90e502c7SAndroid Build Coastguard Worker 170*90e502c7SAndroid Build Coastguard Worker /* index_advance(&pi, s) advances a xtd_seq_num_t forward by s */ 171*90e502c7SAndroid Build Coastguard Worker void srtp_index_advance(srtp_xtd_seq_num_t *pi, srtp_sequence_number_t s); 172*90e502c7SAndroid Build Coastguard Worker 173*90e502c7SAndroid Build Coastguard Worker /* 174*90e502c7SAndroid Build Coastguard Worker * srtp_index_guess(local, guess, s) 175*90e502c7SAndroid Build Coastguard Worker * 176*90e502c7SAndroid Build Coastguard Worker * given a srtp_xtd_seq_num_t local (which represents the highest 177*90e502c7SAndroid Build Coastguard Worker * known-to-be-good index) and a sequence number s (from a newly 178*90e502c7SAndroid Build Coastguard Worker * arrived packet), sets the contents of *guess to contain the best 179*90e502c7SAndroid Build Coastguard Worker * guess of the packet index to which s corresponds, and returns the 180*90e502c7SAndroid Build Coastguard Worker * difference between *guess and *local 181*90e502c7SAndroid Build Coastguard Worker */ 182*90e502c7SAndroid Build Coastguard Worker int32_t srtp_index_guess(const srtp_xtd_seq_num_t *local, 183*90e502c7SAndroid Build Coastguard Worker srtp_xtd_seq_num_t *guess, 184*90e502c7SAndroid Build Coastguard Worker srtp_sequence_number_t s); 185*90e502c7SAndroid Build Coastguard Worker 186*90e502c7SAndroid Build Coastguard Worker /* 187*90e502c7SAndroid Build Coastguard Worker * srtp_rdbx_get_roc(rdbx) 188*90e502c7SAndroid Build Coastguard Worker * 189*90e502c7SAndroid Build Coastguard Worker * Get the current rollover counter 190*90e502c7SAndroid Build Coastguard Worker * 191*90e502c7SAndroid Build Coastguard Worker */ 192*90e502c7SAndroid Build Coastguard Worker uint32_t srtp_rdbx_get_roc(const srtp_rdbx_t *rdbx); 193*90e502c7SAndroid Build Coastguard Worker 194*90e502c7SAndroid Build Coastguard Worker /* 195*90e502c7SAndroid Build Coastguard Worker * srtp_rdbx_set_roc_seq(rdbx, roc, seq) initalizes the srtp_rdbx_t at the 196*90e502c7SAndroid Build Coastguard Worker * location rdbx to have the rollover counter value roc and packet sequence 197*90e502c7SAndroid Build Coastguard Worker * number seq. If the new rollover counter value is less than the current 198*90e502c7SAndroid Build Coastguard Worker * rollover counter value, then the function returns 199*90e502c7SAndroid Build Coastguard Worker * srtp_err_status_replay_old, otherwise, srtp_err_status_ok is returned. 200*90e502c7SAndroid Build Coastguard Worker */ 201*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_rdbx_set_roc_seq(srtp_rdbx_t *rdbx, 202*90e502c7SAndroid Build Coastguard Worker uint32_t roc, 203*90e502c7SAndroid Build Coastguard Worker uint16_t seq); 204*90e502c7SAndroid Build Coastguard Worker 205*90e502c7SAndroid Build Coastguard Worker #ifdef __cplusplus 206*90e502c7SAndroid Build Coastguard Worker } 207*90e502c7SAndroid Build Coastguard Worker #endif 208*90e502c7SAndroid Build Coastguard Worker 209*90e502c7SAndroid Build Coastguard Worker #endif /* RDBX_H */ 210