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