xref: /aosp_15_r20/external/libsrtp2/test/roc_driver.c (revision 90e502c7aef8d77d0622bb67d75435c6190cfc1a)
1*90e502c7SAndroid Build Coastguard Worker /*
2*90e502c7SAndroid Build Coastguard Worker  * roc_driver.c
3*90e502c7SAndroid Build Coastguard Worker  *
4*90e502c7SAndroid Build Coastguard Worker  * test driver for rollover counter replay implementation
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  * Copyright (c) 2001-2017, Cisco Systems, Inc.
13*90e502c7SAndroid Build Coastguard Worker  * All rights reserved.
14*90e502c7SAndroid Build Coastguard Worker  *
15*90e502c7SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
16*90e502c7SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
17*90e502c7SAndroid Build Coastguard Worker  * are met:
18*90e502c7SAndroid Build Coastguard Worker  *
19*90e502c7SAndroid Build Coastguard Worker  *   Redistributions of source code must retain the above copyright
20*90e502c7SAndroid Build Coastguard Worker  *   notice, this list of conditions and the following disclaimer.
21*90e502c7SAndroid Build Coastguard Worker  *
22*90e502c7SAndroid Build Coastguard Worker  *   Redistributions in binary form must reproduce the above
23*90e502c7SAndroid Build Coastguard Worker  *   copyright notice, this list of conditions and the following
24*90e502c7SAndroid Build Coastguard Worker  *   disclaimer in the documentation and/or other materials provided
25*90e502c7SAndroid Build Coastguard Worker  *   with the distribution.
26*90e502c7SAndroid Build Coastguard Worker  *
27*90e502c7SAndroid Build Coastguard Worker  *   Neither the name of the Cisco Systems, Inc. nor the names of its
28*90e502c7SAndroid Build Coastguard Worker  *   contributors may be used to endorse or promote products derived
29*90e502c7SAndroid Build Coastguard Worker  *   from this software without specific prior written permission.
30*90e502c7SAndroid Build Coastguard Worker  *
31*90e502c7SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*90e502c7SAndroid Build Coastguard Worker  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*90e502c7SAndroid Build Coastguard Worker  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
34*90e502c7SAndroid Build Coastguard Worker  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
35*90e502c7SAndroid Build Coastguard Worker  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
36*90e502c7SAndroid Build Coastguard Worker  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
37*90e502c7SAndroid Build Coastguard Worker  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
38*90e502c7SAndroid Build Coastguard Worker  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39*90e502c7SAndroid Build Coastguard Worker  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40*90e502c7SAndroid Build Coastguard Worker  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
41*90e502c7SAndroid Build Coastguard Worker  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
42*90e502c7SAndroid Build Coastguard Worker  * OF THE POSSIBILITY OF SUCH DAMAGE.
43*90e502c7SAndroid Build Coastguard Worker  *
44*90e502c7SAndroid Build Coastguard Worker  */
45*90e502c7SAndroid Build Coastguard Worker 
46*90e502c7SAndroid Build Coastguard Worker #ifdef HAVE_CONFIG_H
47*90e502c7SAndroid Build Coastguard Worker #include <config.h>
48*90e502c7SAndroid Build Coastguard Worker #endif
49*90e502c7SAndroid Build Coastguard Worker 
50*90e502c7SAndroid Build Coastguard Worker #include <stdio.h>
51*90e502c7SAndroid Build Coastguard Worker 
52*90e502c7SAndroid Build Coastguard Worker /*
53*90e502c7SAndroid Build Coastguard Worker  * defining ROC_TEST causes small datatypes to be used in
54*90e502c7SAndroid Build Coastguard Worker  * srtp_xtd_seq_num_t - this allows the functions to be exhaustively tested.
55*90e502c7SAndroid Build Coastguard Worker  */
56*90e502c7SAndroid Build Coastguard Worker #if ROC_NEEDS_TO_BE_TESTED
57*90e502c7SAndroid Build Coastguard Worker #define ROC_TEST
58*90e502c7SAndroid Build Coastguard Worker #endif
59*90e502c7SAndroid Build Coastguard Worker 
60*90e502c7SAndroid Build Coastguard Worker #include "rdbx.h"
61*90e502c7SAndroid Build Coastguard Worker #include "ut_sim.h"
62*90e502c7SAndroid Build Coastguard Worker 
63*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t roc_test(int num_trials);
64*90e502c7SAndroid Build Coastguard Worker 
main(void)65*90e502c7SAndroid Build Coastguard Worker int main(void)
66*90e502c7SAndroid Build Coastguard Worker {
67*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
68*90e502c7SAndroid Build Coastguard Worker 
69*90e502c7SAndroid Build Coastguard Worker     printf("rollover counter test driver\n"
70*90e502c7SAndroid Build Coastguard Worker            "David A. McGrew\n"
71*90e502c7SAndroid Build Coastguard Worker            "Cisco Systems, Inc.\n");
72*90e502c7SAndroid Build Coastguard Worker 
73*90e502c7SAndroid Build Coastguard Worker     printf("testing index functions...");
74*90e502c7SAndroid Build Coastguard Worker     status = roc_test(1 << 18);
75*90e502c7SAndroid Build Coastguard Worker     if (status) {
76*90e502c7SAndroid Build Coastguard Worker         printf("failed\n");
77*90e502c7SAndroid Build Coastguard Worker         exit(status);
78*90e502c7SAndroid Build Coastguard Worker     }
79*90e502c7SAndroid Build Coastguard Worker     printf("passed\n");
80*90e502c7SAndroid Build Coastguard Worker     return 0;
81*90e502c7SAndroid Build Coastguard Worker }
82*90e502c7SAndroid Build Coastguard Worker 
83*90e502c7SAndroid Build Coastguard Worker #define ROC_VERBOSE 0
84*90e502c7SAndroid Build Coastguard Worker 
roc_test(int num_trials)85*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t roc_test(int num_trials)
86*90e502c7SAndroid Build Coastguard Worker {
87*90e502c7SAndroid Build Coastguard Worker     srtp_xtd_seq_num_t local, est, ref;
88*90e502c7SAndroid Build Coastguard Worker     ut_connection utc;
89*90e502c7SAndroid Build Coastguard Worker     int i, num_bad_est = 0;
90*90e502c7SAndroid Build Coastguard Worker     int delta;
91*90e502c7SAndroid Build Coastguard Worker     uint32_t ircvd;
92*90e502c7SAndroid Build Coastguard Worker     double failure_rate;
93*90e502c7SAndroid Build Coastguard Worker 
94*90e502c7SAndroid Build Coastguard Worker     srtp_index_init(&local);
95*90e502c7SAndroid Build Coastguard Worker     srtp_index_init(&ref);
96*90e502c7SAndroid Build Coastguard Worker     srtp_index_init(&est);
97*90e502c7SAndroid Build Coastguard Worker 
98*90e502c7SAndroid Build Coastguard Worker     printf("\n\ttesting sequential insertion...");
99*90e502c7SAndroid Build Coastguard Worker     for (i = 0; i < 2048; i++) {
100*90e502c7SAndroid Build Coastguard Worker         srtp_index_guess(&local, &est, (uint16_t)ref);
101*90e502c7SAndroid Build Coastguard Worker #if ROC_VERBOSE
102*90e502c7SAndroid Build Coastguard Worker         printf("%lld, %lld, %d\n", ref, est, i);
103*90e502c7SAndroid Build Coastguard Worker #endif
104*90e502c7SAndroid Build Coastguard Worker         if (ref != est) {
105*90e502c7SAndroid Build Coastguard Worker #if ROC_VERBOSE
106*90e502c7SAndroid Build Coastguard Worker             printf(" *bad estimate*\n");
107*90e502c7SAndroid Build Coastguard Worker #endif
108*90e502c7SAndroid Build Coastguard Worker             ++num_bad_est;
109*90e502c7SAndroid Build Coastguard Worker         }
110*90e502c7SAndroid Build Coastguard Worker         srtp_index_advance(&ref, 1);
111*90e502c7SAndroid Build Coastguard Worker     }
112*90e502c7SAndroid Build Coastguard Worker     failure_rate = (double)num_bad_est / num_trials;
113*90e502c7SAndroid Build Coastguard Worker     if (failure_rate > 0.01) {
114*90e502c7SAndroid Build Coastguard Worker         printf("error: failure rate too high (%d bad estimates in %d trials)\n",
115*90e502c7SAndroid Build Coastguard Worker                num_bad_est, num_trials);
116*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_algo_fail;
117*90e502c7SAndroid Build Coastguard Worker     }
118*90e502c7SAndroid Build Coastguard Worker     printf("done\n");
119*90e502c7SAndroid Build Coastguard Worker 
120*90e502c7SAndroid Build Coastguard Worker     printf("\ttesting non-sequential insertion...");
121*90e502c7SAndroid Build Coastguard Worker     srtp_index_init(&local);
122*90e502c7SAndroid Build Coastguard Worker     srtp_index_init(&ref);
123*90e502c7SAndroid Build Coastguard Worker     srtp_index_init(&est);
124*90e502c7SAndroid Build Coastguard Worker     ut_init(&utc);
125*90e502c7SAndroid Build Coastguard Worker 
126*90e502c7SAndroid Build Coastguard Worker     for (i = 0; i < num_trials; i++) {
127*90e502c7SAndroid Build Coastguard Worker         /* get next seq num from unreliable transport simulator */
128*90e502c7SAndroid Build Coastguard Worker         ircvd = ut_next_index(&utc);
129*90e502c7SAndroid Build Coastguard Worker 
130*90e502c7SAndroid Build Coastguard Worker         /* set ref to value of ircvd */
131*90e502c7SAndroid Build Coastguard Worker         ref = ircvd;
132*90e502c7SAndroid Build Coastguard Worker 
133*90e502c7SAndroid Build Coastguard Worker         /* estimate index based on low bits of ircvd */
134*90e502c7SAndroid Build Coastguard Worker         delta = srtp_index_guess(&local, &est, (uint16_t)ref);
135*90e502c7SAndroid Build Coastguard Worker #if ROC_VERBOSE
136*90e502c7SAndroid Build Coastguard Worker         printf("ref: %lld, local: %lld, est: %lld, ircvd: %d, delta: %d\n", ref,
137*90e502c7SAndroid Build Coastguard Worker                local, est, ircvd, delta);
138*90e502c7SAndroid Build Coastguard Worker #endif
139*90e502c7SAndroid Build Coastguard Worker 
140*90e502c7SAndroid Build Coastguard Worker         if (local + delta != est) {
141*90e502c7SAndroid Build Coastguard Worker             printf(" *bad delta*: local %llu + delta %d != est %llu\n",
142*90e502c7SAndroid Build Coastguard Worker                    (unsigned long long)local, delta, (unsigned long long)est);
143*90e502c7SAndroid Build Coastguard Worker             return srtp_err_status_algo_fail;
144*90e502c7SAndroid Build Coastguard Worker         }
145*90e502c7SAndroid Build Coastguard Worker 
146*90e502c7SAndroid Build Coastguard Worker         /* now update local srtp_xtd_seq_num_t as necessary */
147*90e502c7SAndroid Build Coastguard Worker         if (delta > 0)
148*90e502c7SAndroid Build Coastguard Worker             srtp_index_advance(&local, delta);
149*90e502c7SAndroid Build Coastguard Worker 
150*90e502c7SAndroid Build Coastguard Worker         if (ref != est) {
151*90e502c7SAndroid Build Coastguard Worker #if ROC_VERBOSE
152*90e502c7SAndroid Build Coastguard Worker             printf(" *bad estimate*\n");
153*90e502c7SAndroid Build Coastguard Worker #endif
154*90e502c7SAndroid Build Coastguard Worker             /* record failure event */
155*90e502c7SAndroid Build Coastguard Worker             ++num_bad_est;
156*90e502c7SAndroid Build Coastguard Worker 
157*90e502c7SAndroid Build Coastguard Worker             /* reset local value to correct value */
158*90e502c7SAndroid Build Coastguard Worker             local = ref;
159*90e502c7SAndroid Build Coastguard Worker         }
160*90e502c7SAndroid Build Coastguard Worker     }
161*90e502c7SAndroid Build Coastguard Worker     failure_rate = (double)num_bad_est / num_trials;
162*90e502c7SAndroid Build Coastguard Worker     if (failure_rate > 0.01) {
163*90e502c7SAndroid Build Coastguard Worker         printf("error: failure rate too high (%d bad estimates in %d trials)\n",
164*90e502c7SAndroid Build Coastguard Worker                num_bad_est, num_trials);
165*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_algo_fail;
166*90e502c7SAndroid Build Coastguard Worker     }
167*90e502c7SAndroid Build Coastguard Worker     printf("done\n");
168*90e502c7SAndroid Build Coastguard Worker 
169*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
170*90e502c7SAndroid Build Coastguard Worker }
171