xref: /aosp_15_r20/external/libsrtp2/test/rdbx_driver.c (revision 90e502c7aef8d77d0622bb67d75435c6190cfc1a)
1*90e502c7SAndroid Build Coastguard Worker /*
2*90e502c7SAndroid Build Coastguard Worker  * rdbx_driver.c
3*90e502c7SAndroid Build Coastguard Worker  *
4*90e502c7SAndroid Build Coastguard Worker  * driver for the rdbx implementation (replay database with extended range)
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  * Copyright (c) 2001-2017, Cisco Systems, Inc.
12*90e502c7SAndroid Build Coastguard Worker  * All rights reserved.
13*90e502c7SAndroid Build Coastguard Worker  *
14*90e502c7SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
15*90e502c7SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
16*90e502c7SAndroid Build Coastguard Worker  * are met:
17*90e502c7SAndroid Build Coastguard Worker  *
18*90e502c7SAndroid Build Coastguard Worker  *   Redistributions of source code must retain the above copyright
19*90e502c7SAndroid Build Coastguard Worker  *   notice, this list of conditions and the following disclaimer.
20*90e502c7SAndroid Build Coastguard Worker  *
21*90e502c7SAndroid Build Coastguard Worker  *   Redistributions in binary form must reproduce the above
22*90e502c7SAndroid Build Coastguard Worker  *   copyright notice, this list of conditions and the following
23*90e502c7SAndroid Build Coastguard Worker  *   disclaimer in the documentation and/or other materials provided
24*90e502c7SAndroid Build Coastguard Worker  *   with the distribution.
25*90e502c7SAndroid Build Coastguard Worker  *
26*90e502c7SAndroid Build Coastguard Worker  *   Neither the name of the Cisco Systems, Inc. nor the names of its
27*90e502c7SAndroid Build Coastguard Worker  *   contributors may be used to endorse or promote products derived
28*90e502c7SAndroid Build Coastguard Worker  *   from this software without specific prior written permission.
29*90e502c7SAndroid Build Coastguard Worker  *
30*90e502c7SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
31*90e502c7SAndroid Build Coastguard Worker  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
32*90e502c7SAndroid Build Coastguard Worker  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
33*90e502c7SAndroid Build Coastguard Worker  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
34*90e502c7SAndroid Build Coastguard Worker  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
35*90e502c7SAndroid Build Coastguard Worker  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
36*90e502c7SAndroid Build Coastguard Worker  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
37*90e502c7SAndroid Build Coastguard Worker  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*90e502c7SAndroid Build Coastguard Worker  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*90e502c7SAndroid Build Coastguard Worker  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
40*90e502c7SAndroid Build Coastguard Worker  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
41*90e502c7SAndroid Build Coastguard Worker  * OF THE POSSIBILITY OF SUCH DAMAGE.
42*90e502c7SAndroid Build Coastguard Worker  *
43*90e502c7SAndroid Build Coastguard Worker  */
44*90e502c7SAndroid Build Coastguard Worker 
45*90e502c7SAndroid Build Coastguard Worker #ifdef HAVE_CONFIG_H
46*90e502c7SAndroid Build Coastguard Worker #include <config.h>
47*90e502c7SAndroid Build Coastguard Worker #endif
48*90e502c7SAndroid Build Coastguard Worker 
49*90e502c7SAndroid Build Coastguard Worker #include <stdio.h>    /* for printf()          */
50*90e502c7SAndroid Build Coastguard Worker #include "getopt_s.h" /* for local getopt()    */
51*90e502c7SAndroid Build Coastguard Worker 
52*90e502c7SAndroid Build Coastguard Worker #include "rdbx.h"
53*90e502c7SAndroid Build Coastguard Worker #include "cipher_priv.h"
54*90e502c7SAndroid Build Coastguard Worker 
55*90e502c7SAndroid Build Coastguard Worker #ifdef ROC_TEST
56*90e502c7SAndroid Build Coastguard Worker #error "srtp_rdbx_t won't work with ROC_TEST - bitmask same size as seq_median"
57*90e502c7SAndroid Build Coastguard Worker #endif
58*90e502c7SAndroid Build Coastguard Worker 
59*90e502c7SAndroid Build Coastguard Worker #include "ut_sim.h"
60*90e502c7SAndroid Build Coastguard Worker 
61*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t test_replay_dbx(int num_trials, unsigned long ws);
62*90e502c7SAndroid Build Coastguard Worker 
63*90e502c7SAndroid Build Coastguard Worker double rdbx_check_adds_per_second(int num_trials, unsigned long ws);
64*90e502c7SAndroid Build Coastguard Worker 
usage(char * prog_name)65*90e502c7SAndroid Build Coastguard Worker void usage(char *prog_name)
66*90e502c7SAndroid Build Coastguard Worker {
67*90e502c7SAndroid Build Coastguard Worker     printf("usage: %s [ -t | -v ]\n", prog_name);
68*90e502c7SAndroid Build Coastguard Worker     exit(255);
69*90e502c7SAndroid Build Coastguard Worker }
70*90e502c7SAndroid Build Coastguard Worker 
main(int argc,char * argv[])71*90e502c7SAndroid Build Coastguard Worker int main(int argc, char *argv[])
72*90e502c7SAndroid Build Coastguard Worker {
73*90e502c7SAndroid Build Coastguard Worker     double rate;
74*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
75*90e502c7SAndroid Build Coastguard Worker     int q;
76*90e502c7SAndroid Build Coastguard Worker     unsigned do_timing_test = 0;
77*90e502c7SAndroid Build Coastguard Worker     unsigned do_validation = 0;
78*90e502c7SAndroid Build Coastguard Worker 
79*90e502c7SAndroid Build Coastguard Worker     /* process input arguments */
80*90e502c7SAndroid Build Coastguard Worker     while (1) {
81*90e502c7SAndroid Build Coastguard Worker         q = getopt_s(argc, argv, "tv");
82*90e502c7SAndroid Build Coastguard Worker         if (q == -1)
83*90e502c7SAndroid Build Coastguard Worker             break;
84*90e502c7SAndroid Build Coastguard Worker         switch (q) {
85*90e502c7SAndroid Build Coastguard Worker         case 't':
86*90e502c7SAndroid Build Coastguard Worker             do_timing_test = 1;
87*90e502c7SAndroid Build Coastguard Worker             break;
88*90e502c7SAndroid Build Coastguard Worker         case 'v':
89*90e502c7SAndroid Build Coastguard Worker             do_validation = 1;
90*90e502c7SAndroid Build Coastguard Worker             break;
91*90e502c7SAndroid Build Coastguard Worker         default:
92*90e502c7SAndroid Build Coastguard Worker             usage(argv[0]);
93*90e502c7SAndroid Build Coastguard Worker         }
94*90e502c7SAndroid Build Coastguard Worker     }
95*90e502c7SAndroid Build Coastguard Worker 
96*90e502c7SAndroid Build Coastguard Worker     printf("rdbx (replay database w/ extended range) test driver\n"
97*90e502c7SAndroid Build Coastguard Worker            "David A. McGrew\n"
98*90e502c7SAndroid Build Coastguard Worker            "Cisco Systems, Inc.\n");
99*90e502c7SAndroid Build Coastguard Worker 
100*90e502c7SAndroid Build Coastguard Worker     if (!do_validation && !do_timing_test)
101*90e502c7SAndroid Build Coastguard Worker         usage(argv[0]);
102*90e502c7SAndroid Build Coastguard Worker 
103*90e502c7SAndroid Build Coastguard Worker     if (do_validation) {
104*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp_rdbx_t (ws=128)...\n");
105*90e502c7SAndroid Build Coastguard Worker 
106*90e502c7SAndroid Build Coastguard Worker         status = test_replay_dbx(1 << 12, 128);
107*90e502c7SAndroid Build Coastguard Worker         if (status) {
108*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
109*90e502c7SAndroid Build Coastguard Worker             exit(1);
110*90e502c7SAndroid Build Coastguard Worker         }
111*90e502c7SAndroid Build Coastguard Worker         printf("passed\n");
112*90e502c7SAndroid Build Coastguard Worker 
113*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp_rdbx_t (ws=1024)...\n");
114*90e502c7SAndroid Build Coastguard Worker 
115*90e502c7SAndroid Build Coastguard Worker         status = test_replay_dbx(1 << 12, 1024);
116*90e502c7SAndroid Build Coastguard Worker         if (status) {
117*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
118*90e502c7SAndroid Build Coastguard Worker             exit(1);
119*90e502c7SAndroid Build Coastguard Worker         }
120*90e502c7SAndroid Build Coastguard Worker         printf("passed\n");
121*90e502c7SAndroid Build Coastguard Worker     }
122*90e502c7SAndroid Build Coastguard Worker 
123*90e502c7SAndroid Build Coastguard Worker     if (do_timing_test) {
124*90e502c7SAndroid Build Coastguard Worker         rate = rdbx_check_adds_per_second(1 << 18, 128);
125*90e502c7SAndroid Build Coastguard Worker         printf("rdbx_check/replay_adds per second (ws=128): %e\n", rate);
126*90e502c7SAndroid Build Coastguard Worker         rate = rdbx_check_adds_per_second(1 << 18, 1024);
127*90e502c7SAndroid Build Coastguard Worker         printf("rdbx_check/replay_adds per second (ws=1024): %e\n", rate);
128*90e502c7SAndroid Build Coastguard Worker     }
129*90e502c7SAndroid Build Coastguard Worker 
130*90e502c7SAndroid Build Coastguard Worker     return 0;
131*90e502c7SAndroid Build Coastguard Worker }
132*90e502c7SAndroid Build Coastguard Worker 
print_rdbx(srtp_rdbx_t * rdbx)133*90e502c7SAndroid Build Coastguard Worker void print_rdbx(srtp_rdbx_t *rdbx)
134*90e502c7SAndroid Build Coastguard Worker {
135*90e502c7SAndroid Build Coastguard Worker     char buf[2048];
136*90e502c7SAndroid Build Coastguard Worker     printf("rdbx: {%llu, %s}\n", (unsigned long long)(rdbx->index),
137*90e502c7SAndroid Build Coastguard Worker            bitvector_bit_string(&rdbx->bitmask, buf, sizeof(buf)));
138*90e502c7SAndroid Build Coastguard Worker }
139*90e502c7SAndroid Build Coastguard Worker 
140*90e502c7SAndroid Build Coastguard Worker /*
141*90e502c7SAndroid Build Coastguard Worker  * rdbx_check_add(rdbx, idx) checks a known-to-be-good idx against
142*90e502c7SAndroid Build Coastguard Worker  * rdbx, then adds it.  if a failure is detected (i.e., the check
143*90e502c7SAndroid Build Coastguard Worker  * indicates that the value is already in rdbx) then
144*90e502c7SAndroid Build Coastguard Worker  * srtp_err_status_algo_fail is returned.
145*90e502c7SAndroid Build Coastguard Worker  *
146*90e502c7SAndroid Build Coastguard Worker  */
147*90e502c7SAndroid Build Coastguard Worker 
rdbx_check_add(srtp_rdbx_t * rdbx,uint32_t idx)148*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t rdbx_check_add(srtp_rdbx_t *rdbx, uint32_t idx)
149*90e502c7SAndroid Build Coastguard Worker {
150*90e502c7SAndroid Build Coastguard Worker     int delta;
151*90e502c7SAndroid Build Coastguard Worker     srtp_xtd_seq_num_t est;
152*90e502c7SAndroid Build Coastguard Worker 
153*90e502c7SAndroid Build Coastguard Worker     delta = srtp_index_guess(&rdbx->index, &est, idx);
154*90e502c7SAndroid Build Coastguard Worker 
155*90e502c7SAndroid Build Coastguard Worker     if (srtp_rdbx_check(rdbx, delta) != srtp_err_status_ok) {
156*90e502c7SAndroid Build Coastguard Worker         printf("replay_check failed at index %u\n", idx);
157*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_algo_fail;
158*90e502c7SAndroid Build Coastguard Worker     }
159*90e502c7SAndroid Build Coastguard Worker 
160*90e502c7SAndroid Build Coastguard Worker     /*
161*90e502c7SAndroid Build Coastguard Worker      * in practice, we'd authenticate the packet containing idx, using
162*90e502c7SAndroid Build Coastguard Worker      * the estimated value est, at this point
163*90e502c7SAndroid Build Coastguard Worker      */
164*90e502c7SAndroid Build Coastguard Worker 
165*90e502c7SAndroid Build Coastguard Worker     if (srtp_rdbx_add_index(rdbx, delta) != srtp_err_status_ok) {
166*90e502c7SAndroid Build Coastguard Worker         printf("rdbx_add_index failed at index %u\n", idx);
167*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_algo_fail;
168*90e502c7SAndroid Build Coastguard Worker     }
169*90e502c7SAndroid Build Coastguard Worker 
170*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
171*90e502c7SAndroid Build Coastguard Worker }
172*90e502c7SAndroid Build Coastguard Worker 
173*90e502c7SAndroid Build Coastguard Worker /*
174*90e502c7SAndroid Build Coastguard Worker  * rdbx_check_expect_failure(srtp_rdbx_t *rdbx, uint32_t idx)
175*90e502c7SAndroid Build Coastguard Worker  *
176*90e502c7SAndroid Build Coastguard Worker  * checks that a sequence number idx is in the replay database
177*90e502c7SAndroid Build Coastguard Worker  * and thus will be rejected
178*90e502c7SAndroid Build Coastguard Worker  */
179*90e502c7SAndroid Build Coastguard Worker 
rdbx_check_expect_failure(srtp_rdbx_t * rdbx,uint32_t idx)180*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t rdbx_check_expect_failure(srtp_rdbx_t *rdbx, uint32_t idx)
181*90e502c7SAndroid Build Coastguard Worker {
182*90e502c7SAndroid Build Coastguard Worker     int delta;
183*90e502c7SAndroid Build Coastguard Worker     srtp_xtd_seq_num_t est;
184*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
185*90e502c7SAndroid Build Coastguard Worker 
186*90e502c7SAndroid Build Coastguard Worker     delta = srtp_index_guess(&rdbx->index, &est, idx);
187*90e502c7SAndroid Build Coastguard Worker 
188*90e502c7SAndroid Build Coastguard Worker     status = srtp_rdbx_check(rdbx, delta);
189*90e502c7SAndroid Build Coastguard Worker     if (status == srtp_err_status_ok) {
190*90e502c7SAndroid Build Coastguard Worker         printf("delta: %d ", delta);
191*90e502c7SAndroid Build Coastguard Worker         printf("replay_check failed at index %u (false positive)\n", idx);
192*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_algo_fail;
193*90e502c7SAndroid Build Coastguard Worker     }
194*90e502c7SAndroid Build Coastguard Worker 
195*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
196*90e502c7SAndroid Build Coastguard Worker }
197*90e502c7SAndroid Build Coastguard Worker 
rdbx_check_add_unordered(srtp_rdbx_t * rdbx,uint32_t idx)198*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t rdbx_check_add_unordered(srtp_rdbx_t *rdbx, uint32_t idx)
199*90e502c7SAndroid Build Coastguard Worker {
200*90e502c7SAndroid Build Coastguard Worker     int delta;
201*90e502c7SAndroid Build Coastguard Worker     srtp_xtd_seq_num_t est;
202*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t rstat;
203*90e502c7SAndroid Build Coastguard Worker 
204*90e502c7SAndroid Build Coastguard Worker     delta = srtp_index_guess(&rdbx->index, &est, idx);
205*90e502c7SAndroid Build Coastguard Worker 
206*90e502c7SAndroid Build Coastguard Worker     rstat = srtp_rdbx_check(rdbx, delta);
207*90e502c7SAndroid Build Coastguard Worker     if ((rstat != srtp_err_status_ok) &&
208*90e502c7SAndroid Build Coastguard Worker         (rstat != srtp_err_status_replay_old)) {
209*90e502c7SAndroid Build Coastguard Worker         printf("replay_check_add_unordered failed at index %u\n", idx);
210*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_algo_fail;
211*90e502c7SAndroid Build Coastguard Worker     }
212*90e502c7SAndroid Build Coastguard Worker     if (rstat == srtp_err_status_replay_old) {
213*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_ok;
214*90e502c7SAndroid Build Coastguard Worker     }
215*90e502c7SAndroid Build Coastguard Worker     if (srtp_rdbx_add_index(rdbx, delta) != srtp_err_status_ok) {
216*90e502c7SAndroid Build Coastguard Worker         printf("rdbx_add_index failed at index %u\n", idx);
217*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_algo_fail;
218*90e502c7SAndroid Build Coastguard Worker     }
219*90e502c7SAndroid Build Coastguard Worker 
220*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
221*90e502c7SAndroid Build Coastguard Worker }
222*90e502c7SAndroid Build Coastguard Worker 
test_replay_dbx(int num_trials,unsigned long ws)223*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t test_replay_dbx(int num_trials, unsigned long ws)
224*90e502c7SAndroid Build Coastguard Worker {
225*90e502c7SAndroid Build Coastguard Worker     srtp_rdbx_t rdbx;
226*90e502c7SAndroid Build Coastguard Worker     uint32_t idx, ircvd;
227*90e502c7SAndroid Build Coastguard Worker     ut_connection utc;
228*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
229*90e502c7SAndroid Build Coastguard Worker     int num_fp_trials;
230*90e502c7SAndroid Build Coastguard Worker 
231*90e502c7SAndroid Build Coastguard Worker     status = srtp_rdbx_init(&rdbx, ws);
232*90e502c7SAndroid Build Coastguard Worker     if (status) {
233*90e502c7SAndroid Build Coastguard Worker         printf("replay_init failed with error code %d\n", status);
234*90e502c7SAndroid Build Coastguard Worker         exit(1);
235*90e502c7SAndroid Build Coastguard Worker     }
236*90e502c7SAndroid Build Coastguard Worker 
237*90e502c7SAndroid Build Coastguard Worker     /*
238*90e502c7SAndroid Build Coastguard Worker      *  test sequential insertion
239*90e502c7SAndroid Build Coastguard Worker      */
240*90e502c7SAndroid Build Coastguard Worker     printf("\ttesting sequential insertion...");
241*90e502c7SAndroid Build Coastguard Worker     for (idx = 0; (int)idx < num_trials; idx++) {
242*90e502c7SAndroid Build Coastguard Worker         status = rdbx_check_add(&rdbx, idx);
243*90e502c7SAndroid Build Coastguard Worker         if (status)
244*90e502c7SAndroid Build Coastguard Worker             return status;
245*90e502c7SAndroid Build Coastguard Worker     }
246*90e502c7SAndroid Build Coastguard Worker     printf("passed\n");
247*90e502c7SAndroid Build Coastguard Worker 
248*90e502c7SAndroid Build Coastguard Worker     /*
249*90e502c7SAndroid Build Coastguard Worker      *  test for false positives by checking all of the index
250*90e502c7SAndroid Build Coastguard Worker      *  values which we've just added
251*90e502c7SAndroid Build Coastguard Worker      *
252*90e502c7SAndroid Build Coastguard Worker      * note that we limit the number of trials here, since allowing the
253*90e502c7SAndroid Build Coastguard Worker      * rollover counter to roll over would defeat this test
254*90e502c7SAndroid Build Coastguard Worker      */
255*90e502c7SAndroid Build Coastguard Worker     num_fp_trials = num_trials % 0x10000;
256*90e502c7SAndroid Build Coastguard Worker     if (num_fp_trials == 0) {
257*90e502c7SAndroid Build Coastguard Worker         printf("warning: no false positive tests performed\n");
258*90e502c7SAndroid Build Coastguard Worker     }
259*90e502c7SAndroid Build Coastguard Worker     printf("\ttesting for false positives...");
260*90e502c7SAndroid Build Coastguard Worker     for (idx = 0; (int)idx < num_fp_trials; idx++) {
261*90e502c7SAndroid Build Coastguard Worker         status = rdbx_check_expect_failure(&rdbx, idx);
262*90e502c7SAndroid Build Coastguard Worker         if (status)
263*90e502c7SAndroid Build Coastguard Worker             return status;
264*90e502c7SAndroid Build Coastguard Worker     }
265*90e502c7SAndroid Build Coastguard Worker     printf("passed\n");
266*90e502c7SAndroid Build Coastguard Worker 
267*90e502c7SAndroid Build Coastguard Worker     /* re-initialize */
268*90e502c7SAndroid Build Coastguard Worker     srtp_rdbx_dealloc(&rdbx);
269*90e502c7SAndroid Build Coastguard Worker 
270*90e502c7SAndroid Build Coastguard Worker     if (srtp_rdbx_init(&rdbx, ws) != srtp_err_status_ok) {
271*90e502c7SAndroid Build Coastguard Worker         printf("replay_init failed\n");
272*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_init_fail;
273*90e502c7SAndroid Build Coastguard Worker     }
274*90e502c7SAndroid Build Coastguard Worker 
275*90e502c7SAndroid Build Coastguard Worker     /*
276*90e502c7SAndroid Build Coastguard Worker      * test non-sequential insertion
277*90e502c7SAndroid Build Coastguard Worker      *
278*90e502c7SAndroid Build Coastguard Worker      * this test covers only fase negatives, since the values returned
279*90e502c7SAndroid Build Coastguard Worker      * by ut_next_index(...) are distinct
280*90e502c7SAndroid Build Coastguard Worker      */
281*90e502c7SAndroid Build Coastguard Worker     ut_init(&utc);
282*90e502c7SAndroid Build Coastguard Worker 
283*90e502c7SAndroid Build Coastguard Worker     printf("\ttesting non-sequential insertion...");
284*90e502c7SAndroid Build Coastguard Worker     for (idx = 0; (int)idx < num_trials; idx++) {
285*90e502c7SAndroid Build Coastguard Worker         ircvd = ut_next_index(&utc);
286*90e502c7SAndroid Build Coastguard Worker         status = rdbx_check_add_unordered(&rdbx, ircvd);
287*90e502c7SAndroid Build Coastguard Worker         if (status)
288*90e502c7SAndroid Build Coastguard Worker             return status;
289*90e502c7SAndroid Build Coastguard Worker         status = rdbx_check_expect_failure(&rdbx, ircvd);
290*90e502c7SAndroid Build Coastguard Worker         if (status)
291*90e502c7SAndroid Build Coastguard Worker             return status;
292*90e502c7SAndroid Build Coastguard Worker     }
293*90e502c7SAndroid Build Coastguard Worker     printf("passed\n");
294*90e502c7SAndroid Build Coastguard Worker 
295*90e502c7SAndroid Build Coastguard Worker     /* re-initialize */
296*90e502c7SAndroid Build Coastguard Worker     srtp_rdbx_dealloc(&rdbx);
297*90e502c7SAndroid Build Coastguard Worker 
298*90e502c7SAndroid Build Coastguard Worker     if (srtp_rdbx_init(&rdbx, ws) != srtp_err_status_ok) {
299*90e502c7SAndroid Build Coastguard Worker         printf("replay_init failed\n");
300*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_init_fail;
301*90e502c7SAndroid Build Coastguard Worker     }
302*90e502c7SAndroid Build Coastguard Worker 
303*90e502c7SAndroid Build Coastguard Worker     /*
304*90e502c7SAndroid Build Coastguard Worker      * test insertion with large gaps.
305*90e502c7SAndroid Build Coastguard Worker      * check for false positives for each insertion.
306*90e502c7SAndroid Build Coastguard Worker      */
307*90e502c7SAndroid Build Coastguard Worker     printf("\ttesting insertion with large gaps...");
308*90e502c7SAndroid Build Coastguard Worker     for (idx = 0, ircvd = 0; (int)idx < num_trials;
309*90e502c7SAndroid Build Coastguard Worker          idx++, ircvd += (1 << (srtp_cipher_rand_u32_for_tests() % 12))) {
310*90e502c7SAndroid Build Coastguard Worker         status = rdbx_check_add(&rdbx, ircvd);
311*90e502c7SAndroid Build Coastguard Worker         if (status)
312*90e502c7SAndroid Build Coastguard Worker             return status;
313*90e502c7SAndroid Build Coastguard Worker         status = rdbx_check_expect_failure(&rdbx, ircvd);
314*90e502c7SAndroid Build Coastguard Worker         if (status)
315*90e502c7SAndroid Build Coastguard Worker             return status;
316*90e502c7SAndroid Build Coastguard Worker     }
317*90e502c7SAndroid Build Coastguard Worker     printf("passed\n");
318*90e502c7SAndroid Build Coastguard Worker 
319*90e502c7SAndroid Build Coastguard Worker     srtp_rdbx_dealloc(&rdbx);
320*90e502c7SAndroid Build Coastguard Worker 
321*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
322*90e502c7SAndroid Build Coastguard Worker }
323*90e502c7SAndroid Build Coastguard Worker 
324*90e502c7SAndroid Build Coastguard Worker #include <time.h> /* for clock()  */
325*90e502c7SAndroid Build Coastguard Worker 
rdbx_check_adds_per_second(int num_trials,unsigned long ws)326*90e502c7SAndroid Build Coastguard Worker double rdbx_check_adds_per_second(int num_trials, unsigned long ws)
327*90e502c7SAndroid Build Coastguard Worker {
328*90e502c7SAndroid Build Coastguard Worker     uint32_t i;
329*90e502c7SAndroid Build Coastguard Worker     int delta;
330*90e502c7SAndroid Build Coastguard Worker     srtp_rdbx_t rdbx;
331*90e502c7SAndroid Build Coastguard Worker     srtp_xtd_seq_num_t est;
332*90e502c7SAndroid Build Coastguard Worker     clock_t timer;
333*90e502c7SAndroid Build Coastguard Worker     int failures; /* count number of failures */
334*90e502c7SAndroid Build Coastguard Worker 
335*90e502c7SAndroid Build Coastguard Worker     if (srtp_rdbx_init(&rdbx, ws) != srtp_err_status_ok) {
336*90e502c7SAndroid Build Coastguard Worker         printf("replay_init failed\n");
337*90e502c7SAndroid Build Coastguard Worker         exit(1);
338*90e502c7SAndroid Build Coastguard Worker     }
339*90e502c7SAndroid Build Coastguard Worker 
340*90e502c7SAndroid Build Coastguard Worker     failures = 0;
341*90e502c7SAndroid Build Coastguard Worker     timer = clock();
342*90e502c7SAndroid Build Coastguard Worker     for (i = 0; (int)i < num_trials; i++) {
343*90e502c7SAndroid Build Coastguard Worker         delta = srtp_index_guess(&rdbx.index, &est, i);
344*90e502c7SAndroid Build Coastguard Worker 
345*90e502c7SAndroid Build Coastguard Worker         if (srtp_rdbx_check(&rdbx, delta) != srtp_err_status_ok)
346*90e502c7SAndroid Build Coastguard Worker             ++failures;
347*90e502c7SAndroid Build Coastguard Worker         else if (srtp_rdbx_add_index(&rdbx, delta) != srtp_err_status_ok)
348*90e502c7SAndroid Build Coastguard Worker             ++failures;
349*90e502c7SAndroid Build Coastguard Worker     }
350*90e502c7SAndroid Build Coastguard Worker     timer = clock() - timer;
351*90e502c7SAndroid Build Coastguard Worker     if (timer < 1) {
352*90e502c7SAndroid Build Coastguard Worker         timer = 1;
353*90e502c7SAndroid Build Coastguard Worker     }
354*90e502c7SAndroid Build Coastguard Worker 
355*90e502c7SAndroid Build Coastguard Worker     printf("number of failures: %d \n", failures);
356*90e502c7SAndroid Build Coastguard Worker 
357*90e502c7SAndroid Build Coastguard Worker     srtp_rdbx_dealloc(&rdbx);
358*90e502c7SAndroid Build Coastguard Worker 
359*90e502c7SAndroid Build Coastguard Worker     return (double)CLOCKS_PER_SEC * num_trials / timer;
360*90e502c7SAndroid Build Coastguard Worker }
361