xref: /aosp_15_r20/external/libsrtp2/test/srtp_driver.c (revision 90e502c7aef8d77d0622bb67d75435c6190cfc1a)
1*90e502c7SAndroid Build Coastguard Worker /*
2*90e502c7SAndroid Build Coastguard Worker  * srtp_driver.c
3*90e502c7SAndroid Build Coastguard Worker  *
4*90e502c7SAndroid Build Coastguard Worker  * a test driver for libSRTP
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 #include <string.h>   /* for memcpy()          */
46*90e502c7SAndroid Build Coastguard Worker #include <time.h>     /* for clock()           */
47*90e502c7SAndroid Build Coastguard Worker #include <stdlib.h>   /* for malloc(), free()  */
48*90e502c7SAndroid Build Coastguard Worker #include <stdio.h>    /* for print(), fflush() */
49*90e502c7SAndroid Build Coastguard Worker #include "getopt_s.h" /* for local getopt()    */
50*90e502c7SAndroid Build Coastguard Worker 
51*90e502c7SAndroid Build Coastguard Worker #include "srtp_priv.h"
52*90e502c7SAndroid Build Coastguard Worker #include "util.h"
53*90e502c7SAndroid Build Coastguard Worker 
54*90e502c7SAndroid Build Coastguard Worker #ifdef HAVE_NETINET_IN_H
55*90e502c7SAndroid Build Coastguard Worker #include <netinet/in.h>
56*90e502c7SAndroid Build Coastguard Worker #elif defined HAVE_WINSOCK2_H
57*90e502c7SAndroid Build Coastguard Worker #include <winsock2.h>
58*90e502c7SAndroid Build Coastguard Worker #endif
59*90e502c7SAndroid Build Coastguard Worker 
60*90e502c7SAndroid Build Coastguard Worker #define PRINT_REFERENCE_PACKET 1
61*90e502c7SAndroid Build Coastguard Worker 
62*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_validate(void);
63*90e502c7SAndroid Build Coastguard Worker 
64*90e502c7SAndroid Build Coastguard Worker #ifdef GCM
65*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_validate_gcm(void);
66*90e502c7SAndroid Build Coastguard Worker #endif
67*90e502c7SAndroid Build Coastguard Worker 
68*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_validate_encrypted_extensions_headers(void);
69*90e502c7SAndroid Build Coastguard Worker 
70*90e502c7SAndroid Build Coastguard Worker #ifdef GCM
71*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_validate_encrypted_extensions_headers_gcm(void);
72*90e502c7SAndroid Build Coastguard Worker #endif
73*90e502c7SAndroid Build Coastguard Worker 
74*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_validate_aes_256(void);
75*90e502c7SAndroid Build Coastguard Worker 
76*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_create_big_policy(srtp_policy_t **list);
77*90e502c7SAndroid Build Coastguard Worker 
78*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_dealloc_big_policy(srtp_policy_t *list);
79*90e502c7SAndroid Build Coastguard Worker 
80*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_empty_payload(void);
81*90e502c7SAndroid Build Coastguard Worker 
82*90e502c7SAndroid Build Coastguard Worker #ifdef GCM
83*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_empty_payload_gcm(void);
84*90e502c7SAndroid Build Coastguard Worker #endif
85*90e502c7SAndroid Build Coastguard Worker 
86*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_remove_stream(void);
87*90e502c7SAndroid Build Coastguard Worker 
88*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_update(void);
89*90e502c7SAndroid Build Coastguard Worker 
90*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_protect_trailer_length(void);
91*90e502c7SAndroid Build Coastguard Worker 
92*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_protect_rtcp_trailer_length(void);
93*90e502c7SAndroid Build Coastguard Worker 
94*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_get_roc(void);
95*90e502c7SAndroid Build Coastguard Worker 
96*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_set_receiver_roc(void);
97*90e502c7SAndroid Build Coastguard Worker 
98*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_set_sender_roc(void);
99*90e502c7SAndroid Build Coastguard Worker 
100*90e502c7SAndroid Build Coastguard Worker double srtp_bits_per_second(int msg_len_octets, const srtp_policy_t *policy);
101*90e502c7SAndroid Build Coastguard Worker 
102*90e502c7SAndroid Build Coastguard Worker double srtp_rejections_per_second(int msg_len_octets,
103*90e502c7SAndroid Build Coastguard Worker                                   const srtp_policy_t *policy);
104*90e502c7SAndroid Build Coastguard Worker 
105*90e502c7SAndroid Build Coastguard Worker void srtp_do_timing(const srtp_policy_t *policy);
106*90e502c7SAndroid Build Coastguard Worker 
107*90e502c7SAndroid Build Coastguard Worker void srtp_do_rejection_timing(const srtp_policy_t *policy);
108*90e502c7SAndroid Build Coastguard Worker 
109*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test(const srtp_policy_t *policy,
110*90e502c7SAndroid Build Coastguard Worker                             int extension_header,
111*90e502c7SAndroid Build Coastguard Worker                             int mki_index);
112*90e502c7SAndroid Build Coastguard Worker 
113*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtcp_test(const srtp_policy_t *policy, int mki_index);
114*90e502c7SAndroid Build Coastguard Worker 
115*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_session_print_policy(srtp_t srtp);
116*90e502c7SAndroid Build Coastguard Worker 
117*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_print_policy(const srtp_policy_t *policy);
118*90e502c7SAndroid Build Coastguard Worker 
119*90e502c7SAndroid Build Coastguard Worker char *srtp_packet_to_string(srtp_hdr_t *hdr, int packet_len);
120*90e502c7SAndroid Build Coastguard Worker 
121*90e502c7SAndroid Build Coastguard Worker double mips_estimate(int num_trials, int *ignore);
122*90e502c7SAndroid Build Coastguard Worker 
123*90e502c7SAndroid Build Coastguard Worker #define TEST_MKI_ID_SIZE 4
124*90e502c7SAndroid Build Coastguard Worker 
125*90e502c7SAndroid Build Coastguard Worker extern uint8_t test_key[46];
126*90e502c7SAndroid Build Coastguard Worker extern uint8_t test_key_2[46];
127*90e502c7SAndroid Build Coastguard Worker extern uint8_t test_mki_id[TEST_MKI_ID_SIZE];
128*90e502c7SAndroid Build Coastguard Worker extern uint8_t test_mki_id_2[TEST_MKI_ID_SIZE];
129*90e502c7SAndroid Build Coastguard Worker 
130*90e502c7SAndroid Build Coastguard Worker // clang-format off
131*90e502c7SAndroid Build Coastguard Worker srtp_master_key_t master_key_1 = {
132*90e502c7SAndroid Build Coastguard Worker     test_key,
133*90e502c7SAndroid Build Coastguard Worker     test_mki_id,
134*90e502c7SAndroid Build Coastguard Worker     TEST_MKI_ID_SIZE
135*90e502c7SAndroid Build Coastguard Worker };
136*90e502c7SAndroid Build Coastguard Worker 
137*90e502c7SAndroid Build Coastguard Worker srtp_master_key_t master_key_2 = {
138*90e502c7SAndroid Build Coastguard Worker     test_key_2,
139*90e502c7SAndroid Build Coastguard Worker     test_mki_id_2,
140*90e502c7SAndroid Build Coastguard Worker     TEST_MKI_ID_SIZE
141*90e502c7SAndroid Build Coastguard Worker };
142*90e502c7SAndroid Build Coastguard Worker 
143*90e502c7SAndroid Build Coastguard Worker srtp_master_key_t *test_keys[2] = {
144*90e502c7SAndroid Build Coastguard Worker     &master_key_1,
145*90e502c7SAndroid Build Coastguard Worker     &master_key_2
146*90e502c7SAndroid Build Coastguard Worker };
147*90e502c7SAndroid Build Coastguard Worker // clang-format on
148*90e502c7SAndroid Build Coastguard Worker 
usage(char * prog_name)149*90e502c7SAndroid Build Coastguard Worker void usage(char *prog_name)
150*90e502c7SAndroid Build Coastguard Worker {
151*90e502c7SAndroid Build Coastguard Worker     printf("usage: %s [ -t ][ -c ][ -v ][ -o ][-d <debug_module> ]* [ -l ]\n"
152*90e502c7SAndroid Build Coastguard Worker            "  -t         run timing test\n"
153*90e502c7SAndroid Build Coastguard Worker            "  -r         run rejection timing test\n"
154*90e502c7SAndroid Build Coastguard Worker            "  -c         run codec timing test\n"
155*90e502c7SAndroid Build Coastguard Worker            "  -v         run validation tests\n"
156*90e502c7SAndroid Build Coastguard Worker            "  -o         output logging to stdout\n"
157*90e502c7SAndroid Build Coastguard Worker            "  -d <mod>   turn on debugging module <mod>\n"
158*90e502c7SAndroid Build Coastguard Worker            "  -l         list debugging modules\n",
159*90e502c7SAndroid Build Coastguard Worker            prog_name);
160*90e502c7SAndroid Build Coastguard Worker     exit(1);
161*90e502c7SAndroid Build Coastguard Worker }
162*90e502c7SAndroid Build Coastguard Worker 
log_handler(srtp_log_level_t level,const char * msg,void * data)163*90e502c7SAndroid Build Coastguard Worker void log_handler(srtp_log_level_t level, const char *msg, void *data)
164*90e502c7SAndroid Build Coastguard Worker {
165*90e502c7SAndroid Build Coastguard Worker     char level_char = '?';
166*90e502c7SAndroid Build Coastguard Worker     switch (level) {
167*90e502c7SAndroid Build Coastguard Worker     case srtp_log_level_error:
168*90e502c7SAndroid Build Coastguard Worker         level_char = 'e';
169*90e502c7SAndroid Build Coastguard Worker         break;
170*90e502c7SAndroid Build Coastguard Worker     case srtp_log_level_warning:
171*90e502c7SAndroid Build Coastguard Worker         level_char = 'w';
172*90e502c7SAndroid Build Coastguard Worker         break;
173*90e502c7SAndroid Build Coastguard Worker     case srtp_log_level_info:
174*90e502c7SAndroid Build Coastguard Worker         level_char = 'i';
175*90e502c7SAndroid Build Coastguard Worker         break;
176*90e502c7SAndroid Build Coastguard Worker     case srtp_log_level_debug:
177*90e502c7SAndroid Build Coastguard Worker         level_char = 'd';
178*90e502c7SAndroid Build Coastguard Worker         break;
179*90e502c7SAndroid Build Coastguard Worker     }
180*90e502c7SAndroid Build Coastguard Worker     printf("SRTP-LOG [%c]: %s\n", level_char, msg);
181*90e502c7SAndroid Build Coastguard Worker }
182*90e502c7SAndroid Build Coastguard Worker 
183*90e502c7SAndroid Build Coastguard Worker /*
184*90e502c7SAndroid Build Coastguard Worker  * The policy_array is a null-terminated array of policy structs. it
185*90e502c7SAndroid Build Coastguard Worker  * is declared at the end of this file
186*90e502c7SAndroid Build Coastguard Worker  */
187*90e502c7SAndroid Build Coastguard Worker 
188*90e502c7SAndroid Build Coastguard Worker extern const srtp_policy_t *policy_array[];
189*90e502c7SAndroid Build Coastguard Worker 
190*90e502c7SAndroid Build Coastguard Worker /* the wildcard_policy is declared below; it has a wildcard ssrc */
191*90e502c7SAndroid Build Coastguard Worker 
192*90e502c7SAndroid Build Coastguard Worker extern const srtp_policy_t wildcard_policy;
193*90e502c7SAndroid Build Coastguard Worker 
194*90e502c7SAndroid Build Coastguard Worker /*
195*90e502c7SAndroid Build Coastguard Worker  * mod_driver debug module - debugging module for this test driver
196*90e502c7SAndroid Build Coastguard Worker  *
197*90e502c7SAndroid Build Coastguard Worker  * we use the crypto_kernel debugging system in this driver, which
198*90e502c7SAndroid Build Coastguard Worker  * makes the interface uniform and increases portability
199*90e502c7SAndroid Build Coastguard Worker  */
200*90e502c7SAndroid Build Coastguard Worker 
201*90e502c7SAndroid Build Coastguard Worker srtp_debug_module_t mod_driver = {
202*90e502c7SAndroid Build Coastguard Worker     0,       /* debugging is off by default */
203*90e502c7SAndroid Build Coastguard Worker     "driver" /* printable name for module   */
204*90e502c7SAndroid Build Coastguard Worker };
205*90e502c7SAndroid Build Coastguard Worker 
main(int argc,char * argv[])206*90e502c7SAndroid Build Coastguard Worker int main(int argc, char *argv[])
207*90e502c7SAndroid Build Coastguard Worker {
208*90e502c7SAndroid Build Coastguard Worker     int q;
209*90e502c7SAndroid Build Coastguard Worker     unsigned do_timing_test = 0;
210*90e502c7SAndroid Build Coastguard Worker     unsigned do_rejection_test = 0;
211*90e502c7SAndroid Build Coastguard Worker     unsigned do_codec_timing = 0;
212*90e502c7SAndroid Build Coastguard Worker     unsigned do_validation = 0;
213*90e502c7SAndroid Build Coastguard Worker     unsigned do_list_mods = 0;
214*90e502c7SAndroid Build Coastguard Worker     unsigned do_log_stdout = 0;
215*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
216*90e502c7SAndroid Build Coastguard Worker 
217*90e502c7SAndroid Build Coastguard Worker     /*
218*90e502c7SAndroid Build Coastguard Worker      * verify that the compiler has interpreted the header data
219*90e502c7SAndroid Build Coastguard Worker      * structure srtp_hdr_t correctly
220*90e502c7SAndroid Build Coastguard Worker      */
221*90e502c7SAndroid Build Coastguard Worker     if (sizeof(srtp_hdr_t) != 12) {
222*90e502c7SAndroid Build Coastguard Worker         printf("error: srtp_hdr_t has incorrect size"
223*90e502c7SAndroid Build Coastguard Worker                "(size is %ld bytes, expected 12)\n",
224*90e502c7SAndroid Build Coastguard Worker                (long)sizeof(srtp_hdr_t));
225*90e502c7SAndroid Build Coastguard Worker         exit(1);
226*90e502c7SAndroid Build Coastguard Worker     }
227*90e502c7SAndroid Build Coastguard Worker 
228*90e502c7SAndroid Build Coastguard Worker     /* initialize srtp library */
229*90e502c7SAndroid Build Coastguard Worker     status = srtp_init();
230*90e502c7SAndroid Build Coastguard Worker     if (status) {
231*90e502c7SAndroid Build Coastguard Worker         printf("error: srtp init failed with error code %d\n", status);
232*90e502c7SAndroid Build Coastguard Worker         exit(1);
233*90e502c7SAndroid Build Coastguard Worker     }
234*90e502c7SAndroid Build Coastguard Worker 
235*90e502c7SAndroid Build Coastguard Worker     /*  load srtp_driver debug module */
236*90e502c7SAndroid Build Coastguard Worker     status = srtp_crypto_kernel_load_debug_module(&mod_driver);
237*90e502c7SAndroid Build Coastguard Worker     if (status) {
238*90e502c7SAndroid Build Coastguard Worker         printf("error: load of srtp_driver debug module failed "
239*90e502c7SAndroid Build Coastguard Worker                "with error code %d\n",
240*90e502c7SAndroid Build Coastguard Worker                status);
241*90e502c7SAndroid Build Coastguard Worker         exit(1);
242*90e502c7SAndroid Build Coastguard Worker     }
243*90e502c7SAndroid Build Coastguard Worker 
244*90e502c7SAndroid Build Coastguard Worker     /* process input arguments */
245*90e502c7SAndroid Build Coastguard Worker     while (1) {
246*90e502c7SAndroid Build Coastguard Worker         q = getopt_s(argc, argv, "trcvold:");
247*90e502c7SAndroid Build Coastguard Worker         if (q == -1) {
248*90e502c7SAndroid Build Coastguard Worker             break;
249*90e502c7SAndroid Build Coastguard Worker         }
250*90e502c7SAndroid Build Coastguard Worker         switch (q) {
251*90e502c7SAndroid Build Coastguard Worker         case 't':
252*90e502c7SAndroid Build Coastguard Worker             do_timing_test = 1;
253*90e502c7SAndroid Build Coastguard Worker             break;
254*90e502c7SAndroid Build Coastguard Worker         case 'r':
255*90e502c7SAndroid Build Coastguard Worker             do_rejection_test = 1;
256*90e502c7SAndroid Build Coastguard Worker             break;
257*90e502c7SAndroid Build Coastguard Worker         case 'c':
258*90e502c7SAndroid Build Coastguard Worker             do_codec_timing = 1;
259*90e502c7SAndroid Build Coastguard Worker             break;
260*90e502c7SAndroid Build Coastguard Worker         case 'v':
261*90e502c7SAndroid Build Coastguard Worker             do_validation = 1;
262*90e502c7SAndroid Build Coastguard Worker             break;
263*90e502c7SAndroid Build Coastguard Worker         case 'o':
264*90e502c7SAndroid Build Coastguard Worker             do_log_stdout = 1;
265*90e502c7SAndroid Build Coastguard Worker             break;
266*90e502c7SAndroid Build Coastguard Worker         case 'l':
267*90e502c7SAndroid Build Coastguard Worker             do_list_mods = 1;
268*90e502c7SAndroid Build Coastguard Worker             break;
269*90e502c7SAndroid Build Coastguard Worker         case 'd':
270*90e502c7SAndroid Build Coastguard Worker             status = srtp_set_debug_module(optarg_s, 1);
271*90e502c7SAndroid Build Coastguard Worker             if (status) {
272*90e502c7SAndroid Build Coastguard Worker                 printf("error: set debug module (%s) failed\n", optarg_s);
273*90e502c7SAndroid Build Coastguard Worker                 exit(1);
274*90e502c7SAndroid Build Coastguard Worker             }
275*90e502c7SAndroid Build Coastguard Worker             break;
276*90e502c7SAndroid Build Coastguard Worker         default:
277*90e502c7SAndroid Build Coastguard Worker             usage(argv[0]);
278*90e502c7SAndroid Build Coastguard Worker         }
279*90e502c7SAndroid Build Coastguard Worker     }
280*90e502c7SAndroid Build Coastguard Worker 
281*90e502c7SAndroid Build Coastguard Worker     if (!do_validation && !do_timing_test && !do_codec_timing &&
282*90e502c7SAndroid Build Coastguard Worker         !do_list_mods && !do_rejection_test) {
283*90e502c7SAndroid Build Coastguard Worker         usage(argv[0]);
284*90e502c7SAndroid Build Coastguard Worker     }
285*90e502c7SAndroid Build Coastguard Worker 
286*90e502c7SAndroid Build Coastguard Worker     if (do_log_stdout) {
287*90e502c7SAndroid Build Coastguard Worker         status = srtp_install_log_handler(log_handler, NULL);
288*90e502c7SAndroid Build Coastguard Worker         if (status) {
289*90e502c7SAndroid Build Coastguard Worker             printf("error: install log handler failed\n");
290*90e502c7SAndroid Build Coastguard Worker             exit(1);
291*90e502c7SAndroid Build Coastguard Worker         }
292*90e502c7SAndroid Build Coastguard Worker     }
293*90e502c7SAndroid Build Coastguard Worker 
294*90e502c7SAndroid Build Coastguard Worker     if (do_list_mods) {
295*90e502c7SAndroid Build Coastguard Worker         status = srtp_list_debug_modules();
296*90e502c7SAndroid Build Coastguard Worker         if (status) {
297*90e502c7SAndroid Build Coastguard Worker             printf("error: list of debug modules failed\n");
298*90e502c7SAndroid Build Coastguard Worker             exit(1);
299*90e502c7SAndroid Build Coastguard Worker         }
300*90e502c7SAndroid Build Coastguard Worker     }
301*90e502c7SAndroid Build Coastguard Worker 
302*90e502c7SAndroid Build Coastguard Worker     if (do_validation) {
303*90e502c7SAndroid Build Coastguard Worker         const srtp_policy_t **policy = policy_array;
304*90e502c7SAndroid Build Coastguard Worker         srtp_policy_t *big_policy;
305*90e502c7SAndroid Build Coastguard Worker 
306*90e502c7SAndroid Build Coastguard Worker         /* loop over policy array, testing srtp and srtcp for each policy */
307*90e502c7SAndroid Build Coastguard Worker         while (*policy != NULL) {
308*90e502c7SAndroid Build Coastguard Worker             printf("testing srtp_protect and srtp_unprotect\n");
309*90e502c7SAndroid Build Coastguard Worker             if (srtp_test(*policy, 0, -1) == srtp_err_status_ok) {
310*90e502c7SAndroid Build Coastguard Worker                 printf("passed\n\n");
311*90e502c7SAndroid Build Coastguard Worker             } else {
312*90e502c7SAndroid Build Coastguard Worker                 printf("failed\n");
313*90e502c7SAndroid Build Coastguard Worker                 exit(1);
314*90e502c7SAndroid Build Coastguard Worker             }
315*90e502c7SAndroid Build Coastguard Worker 
316*90e502c7SAndroid Build Coastguard Worker             printf("testing srtp_protect and srtp_unprotect with encrypted "
317*90e502c7SAndroid Build Coastguard Worker                    "extensions headers\n");
318*90e502c7SAndroid Build Coastguard Worker             if (srtp_test(*policy, 1, -1) == srtp_err_status_ok) {
319*90e502c7SAndroid Build Coastguard Worker                 printf("passed\n\n");
320*90e502c7SAndroid Build Coastguard Worker             } else {
321*90e502c7SAndroid Build Coastguard Worker                 printf("failed\n");
322*90e502c7SAndroid Build Coastguard Worker                 exit(1);
323*90e502c7SAndroid Build Coastguard Worker             }
324*90e502c7SAndroid Build Coastguard Worker             printf("testing srtp_protect_rtcp and srtp_unprotect_rtcp\n");
325*90e502c7SAndroid Build Coastguard Worker             if (srtcp_test(*policy, -1) == srtp_err_status_ok) {
326*90e502c7SAndroid Build Coastguard Worker                 printf("passed\n\n");
327*90e502c7SAndroid Build Coastguard Worker             } else {
328*90e502c7SAndroid Build Coastguard Worker                 printf("failed\n");
329*90e502c7SAndroid Build Coastguard Worker                 exit(1);
330*90e502c7SAndroid Build Coastguard Worker             }
331*90e502c7SAndroid Build Coastguard Worker             printf("testing srtp_protect_rtp and srtp_unprotect_rtp with MKI "
332*90e502c7SAndroid Build Coastguard Worker                    "index set to 0\n");
333*90e502c7SAndroid Build Coastguard Worker             if (srtp_test(*policy, 0, 0) == srtp_err_status_ok) {
334*90e502c7SAndroid Build Coastguard Worker                 printf("passed\n\n");
335*90e502c7SAndroid Build Coastguard Worker             } else {
336*90e502c7SAndroid Build Coastguard Worker                 printf("failed\n");
337*90e502c7SAndroid Build Coastguard Worker                 exit(1);
338*90e502c7SAndroid Build Coastguard Worker             }
339*90e502c7SAndroid Build Coastguard Worker             printf("testing srtp_protect_rtp and srtp_unprotect_rtp with MKI "
340*90e502c7SAndroid Build Coastguard Worker                    "index set to 1\n");
341*90e502c7SAndroid Build Coastguard Worker             if (srtp_test(*policy, 0, 1) == srtp_err_status_ok) {
342*90e502c7SAndroid Build Coastguard Worker                 printf("passed\n\n");
343*90e502c7SAndroid Build Coastguard Worker             } else {
344*90e502c7SAndroid Build Coastguard Worker                 printf("failed\n");
345*90e502c7SAndroid Build Coastguard Worker                 exit(1);
346*90e502c7SAndroid Build Coastguard Worker             }
347*90e502c7SAndroid Build Coastguard Worker 
348*90e502c7SAndroid Build Coastguard Worker             printf("testing srtp_protect_rtcp and srtp_unprotect_rtcp with MKI "
349*90e502c7SAndroid Build Coastguard Worker                    "index set to 0\n");
350*90e502c7SAndroid Build Coastguard Worker             if (srtcp_test(*policy, 0) == srtp_err_status_ok) {
351*90e502c7SAndroid Build Coastguard Worker                 printf("passed\n\n");
352*90e502c7SAndroid Build Coastguard Worker             } else {
353*90e502c7SAndroid Build Coastguard Worker                 printf("failed\n");
354*90e502c7SAndroid Build Coastguard Worker                 exit(1);
355*90e502c7SAndroid Build Coastguard Worker             }
356*90e502c7SAndroid Build Coastguard Worker             printf("testing srtp_protect_rtcp and srtp_unprotect_rtcp with MKI "
357*90e502c7SAndroid Build Coastguard Worker                    "index set to 1\n");
358*90e502c7SAndroid Build Coastguard Worker             if (srtcp_test(*policy, 1) == srtp_err_status_ok) {
359*90e502c7SAndroid Build Coastguard Worker                 printf("passed\n\n");
360*90e502c7SAndroid Build Coastguard Worker             } else {
361*90e502c7SAndroid Build Coastguard Worker                 printf("failed\n");
362*90e502c7SAndroid Build Coastguard Worker                 exit(1);
363*90e502c7SAndroid Build Coastguard Worker             }
364*90e502c7SAndroid Build Coastguard Worker             policy++;
365*90e502c7SAndroid Build Coastguard Worker         }
366*90e502c7SAndroid Build Coastguard Worker 
367*90e502c7SAndroid Build Coastguard Worker         /* create a big policy list and run tests on it */
368*90e502c7SAndroid Build Coastguard Worker         status = srtp_create_big_policy(&big_policy);
369*90e502c7SAndroid Build Coastguard Worker         if (status) {
370*90e502c7SAndroid Build Coastguard Worker             printf("unexpected failure with error code %d\n", status);
371*90e502c7SAndroid Build Coastguard Worker             exit(1);
372*90e502c7SAndroid Build Coastguard Worker         }
373*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp_protect and srtp_unprotect with big policy\n");
374*90e502c7SAndroid Build Coastguard Worker         if (srtp_test(big_policy, 0, -1) == srtp_err_status_ok) {
375*90e502c7SAndroid Build Coastguard Worker             printf("passed\n\n");
376*90e502c7SAndroid Build Coastguard Worker         } else {
377*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
378*90e502c7SAndroid Build Coastguard Worker             exit(1);
379*90e502c7SAndroid Build Coastguard Worker         }
380*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp_protect and srtp_unprotect with big policy and "
381*90e502c7SAndroid Build Coastguard Worker                "encrypted extensions headers\n");
382*90e502c7SAndroid Build Coastguard Worker         if (srtp_test(big_policy, 1, -1) == srtp_err_status_ok) {
383*90e502c7SAndroid Build Coastguard Worker             printf("passed\n\n");
384*90e502c7SAndroid Build Coastguard Worker         } else {
385*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
386*90e502c7SAndroid Build Coastguard Worker             exit(1);
387*90e502c7SAndroid Build Coastguard Worker         }
388*90e502c7SAndroid Build Coastguard Worker         status = srtp_dealloc_big_policy(big_policy);
389*90e502c7SAndroid Build Coastguard Worker         if (status) {
390*90e502c7SAndroid Build Coastguard Worker             printf("unexpected failure with error code %d\n", status);
391*90e502c7SAndroid Build Coastguard Worker             exit(1);
392*90e502c7SAndroid Build Coastguard Worker         }
393*90e502c7SAndroid Build Coastguard Worker 
394*90e502c7SAndroid Build Coastguard Worker         /* run test on wildcard policy */
395*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp_protect and srtp_unprotect on "
396*90e502c7SAndroid Build Coastguard Worker                "wildcard ssrc policy\n");
397*90e502c7SAndroid Build Coastguard Worker         if (srtp_test(&wildcard_policy, 0, -1) == srtp_err_status_ok) {
398*90e502c7SAndroid Build Coastguard Worker             printf("passed\n\n");
399*90e502c7SAndroid Build Coastguard Worker         } else {
400*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
401*90e502c7SAndroid Build Coastguard Worker             exit(1);
402*90e502c7SAndroid Build Coastguard Worker         }
403*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp_protect and srtp_unprotect on "
404*90e502c7SAndroid Build Coastguard Worker                "wildcard ssrc policy and encrypted extensions headers\n");
405*90e502c7SAndroid Build Coastguard Worker         if (srtp_test(&wildcard_policy, 1, -1) == srtp_err_status_ok) {
406*90e502c7SAndroid Build Coastguard Worker             printf("passed\n\n");
407*90e502c7SAndroid Build Coastguard Worker         } else {
408*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
409*90e502c7SAndroid Build Coastguard Worker             exit(1);
410*90e502c7SAndroid Build Coastguard Worker         }
411*90e502c7SAndroid Build Coastguard Worker 
412*90e502c7SAndroid Build Coastguard Worker         /*
413*90e502c7SAndroid Build Coastguard Worker          * run validation test against the reference packets - note
414*90e502c7SAndroid Build Coastguard Worker          * that this test only covers the default policy
415*90e502c7SAndroid Build Coastguard Worker          */
416*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp_protect and srtp_unprotect against "
417*90e502c7SAndroid Build Coastguard Worker                "reference packet\n");
418*90e502c7SAndroid Build Coastguard Worker         if (srtp_validate() == srtp_err_status_ok) {
419*90e502c7SAndroid Build Coastguard Worker             printf("passed\n\n");
420*90e502c7SAndroid Build Coastguard Worker         } else {
421*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
422*90e502c7SAndroid Build Coastguard Worker             exit(1);
423*90e502c7SAndroid Build Coastguard Worker         }
424*90e502c7SAndroid Build Coastguard Worker 
425*90e502c7SAndroid Build Coastguard Worker #ifdef GCM
426*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp_protect and srtp_unprotect against "
427*90e502c7SAndroid Build Coastguard Worker                "reference packet using GCM\n");
428*90e502c7SAndroid Build Coastguard Worker         if (srtp_validate_gcm() == srtp_err_status_ok) {
429*90e502c7SAndroid Build Coastguard Worker             printf("passed\n\n");
430*90e502c7SAndroid Build Coastguard Worker         } else {
431*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
432*90e502c7SAndroid Build Coastguard Worker             exit(1);
433*90e502c7SAndroid Build Coastguard Worker         }
434*90e502c7SAndroid Build Coastguard Worker #endif
435*90e502c7SAndroid Build Coastguard Worker 
436*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp_protect and srtp_unprotect against "
437*90e502c7SAndroid Build Coastguard Worker                "reference packet with encrypted extensions headers\n");
438*90e502c7SAndroid Build Coastguard Worker         if (srtp_validate_encrypted_extensions_headers() == srtp_err_status_ok)
439*90e502c7SAndroid Build Coastguard Worker             printf("passed\n\n");
440*90e502c7SAndroid Build Coastguard Worker         else {
441*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
442*90e502c7SAndroid Build Coastguard Worker             exit(1);
443*90e502c7SAndroid Build Coastguard Worker         }
444*90e502c7SAndroid Build Coastguard Worker 
445*90e502c7SAndroid Build Coastguard Worker #ifdef GCM
446*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp_protect and srtp_unprotect against "
447*90e502c7SAndroid Build Coastguard Worker                "reference packet with encrypted extension headers (GCM)\n");
448*90e502c7SAndroid Build Coastguard Worker         if (srtp_validate_encrypted_extensions_headers_gcm() ==
449*90e502c7SAndroid Build Coastguard Worker             srtp_err_status_ok) {
450*90e502c7SAndroid Build Coastguard Worker             printf("passed\n\n");
451*90e502c7SAndroid Build Coastguard Worker         } else {
452*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
453*90e502c7SAndroid Build Coastguard Worker             exit(1);
454*90e502c7SAndroid Build Coastguard Worker         }
455*90e502c7SAndroid Build Coastguard Worker #endif
456*90e502c7SAndroid Build Coastguard Worker 
457*90e502c7SAndroid Build Coastguard Worker         /*
458*90e502c7SAndroid Build Coastguard Worker          * run validation test against the reference packets for
459*90e502c7SAndroid Build Coastguard Worker          * AES-256
460*90e502c7SAndroid Build Coastguard Worker          */
461*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp_protect and srtp_unprotect against "
462*90e502c7SAndroid Build Coastguard Worker                "reference packet (AES-256)\n");
463*90e502c7SAndroid Build Coastguard Worker         if (srtp_validate_aes_256() == srtp_err_status_ok) {
464*90e502c7SAndroid Build Coastguard Worker             printf("passed\n\n");
465*90e502c7SAndroid Build Coastguard Worker         } else {
466*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
467*90e502c7SAndroid Build Coastguard Worker             exit(1);
468*90e502c7SAndroid Build Coastguard Worker         }
469*90e502c7SAndroid Build Coastguard Worker 
470*90e502c7SAndroid Build Coastguard Worker         /*
471*90e502c7SAndroid Build Coastguard Worker          * test packets with empty payload
472*90e502c7SAndroid Build Coastguard Worker          */
473*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp_protect and srtp_unprotect against "
474*90e502c7SAndroid Build Coastguard Worker                "packet with empty payload\n");
475*90e502c7SAndroid Build Coastguard Worker         if (srtp_test_empty_payload() == srtp_err_status_ok) {
476*90e502c7SAndroid Build Coastguard Worker             printf("passed\n");
477*90e502c7SAndroid Build Coastguard Worker         } else {
478*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
479*90e502c7SAndroid Build Coastguard Worker             exit(1);
480*90e502c7SAndroid Build Coastguard Worker         }
481*90e502c7SAndroid Build Coastguard Worker #ifdef GCM
482*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp_protect and srtp_unprotect against "
483*90e502c7SAndroid Build Coastguard Worker                "packet with empty payload (GCM)\n");
484*90e502c7SAndroid Build Coastguard Worker         if (srtp_test_empty_payload_gcm() == srtp_err_status_ok) {
485*90e502c7SAndroid Build Coastguard Worker             printf("passed\n");
486*90e502c7SAndroid Build Coastguard Worker         } else {
487*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
488*90e502c7SAndroid Build Coastguard Worker             exit(1);
489*90e502c7SAndroid Build Coastguard Worker         }
490*90e502c7SAndroid Build Coastguard Worker #endif
491*90e502c7SAndroid Build Coastguard Worker 
492*90e502c7SAndroid Build Coastguard Worker         /*
493*90e502c7SAndroid Build Coastguard Worker          * test the function srtp_remove_stream()
494*90e502c7SAndroid Build Coastguard Worker          */
495*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp_remove_stream()...");
496*90e502c7SAndroid Build Coastguard Worker         if (srtp_test_remove_stream() == srtp_err_status_ok) {
497*90e502c7SAndroid Build Coastguard Worker             printf("passed\n");
498*90e502c7SAndroid Build Coastguard Worker         } else {
499*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
500*90e502c7SAndroid Build Coastguard Worker             exit(1);
501*90e502c7SAndroid Build Coastguard Worker         }
502*90e502c7SAndroid Build Coastguard Worker 
503*90e502c7SAndroid Build Coastguard Worker         /*
504*90e502c7SAndroid Build Coastguard Worker          * test the function srtp_update()
505*90e502c7SAndroid Build Coastguard Worker          */
506*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp_update()...");
507*90e502c7SAndroid Build Coastguard Worker         if (srtp_test_update() == srtp_err_status_ok) {
508*90e502c7SAndroid Build Coastguard Worker             printf("passed\n");
509*90e502c7SAndroid Build Coastguard Worker         } else {
510*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
511*90e502c7SAndroid Build Coastguard Worker             exit(1);
512*90e502c7SAndroid Build Coastguard Worker         }
513*90e502c7SAndroid Build Coastguard Worker 
514*90e502c7SAndroid Build Coastguard Worker         /*
515*90e502c7SAndroid Build Coastguard Worker          * test the functions srtp_get_protect_trailer_length
516*90e502c7SAndroid Build Coastguard Worker          * and srtp_get_protect_rtcp_trailer_length
517*90e502c7SAndroid Build Coastguard Worker          */
518*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp_get_protect_trailer_length()...");
519*90e502c7SAndroid Build Coastguard Worker         if (srtp_test_protect_trailer_length() == srtp_err_status_ok) {
520*90e502c7SAndroid Build Coastguard Worker             printf("passed\n");
521*90e502c7SAndroid Build Coastguard Worker         } else {
522*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
523*90e502c7SAndroid Build Coastguard Worker             exit(1);
524*90e502c7SAndroid Build Coastguard Worker         }
525*90e502c7SAndroid Build Coastguard Worker 
526*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp_get_protect_rtcp_trailer_length()...");
527*90e502c7SAndroid Build Coastguard Worker         if (srtp_test_protect_rtcp_trailer_length() == srtp_err_status_ok) {
528*90e502c7SAndroid Build Coastguard Worker             printf("passed\n");
529*90e502c7SAndroid Build Coastguard Worker         } else {
530*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
531*90e502c7SAndroid Build Coastguard Worker             exit(1);
532*90e502c7SAndroid Build Coastguard Worker         }
533*90e502c7SAndroid Build Coastguard Worker 
534*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp_test_get_roc()...");
535*90e502c7SAndroid Build Coastguard Worker         if (srtp_test_get_roc() == srtp_err_status_ok) {
536*90e502c7SAndroid Build Coastguard Worker             printf("passed\n");
537*90e502c7SAndroid Build Coastguard Worker         } else {
538*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
539*90e502c7SAndroid Build Coastguard Worker             exit(1);
540*90e502c7SAndroid Build Coastguard Worker         }
541*90e502c7SAndroid Build Coastguard Worker 
542*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp_test_set_receiver_roc()...");
543*90e502c7SAndroid Build Coastguard Worker         if (srtp_test_set_receiver_roc() == srtp_err_status_ok) {
544*90e502c7SAndroid Build Coastguard Worker             printf("passed\n");
545*90e502c7SAndroid Build Coastguard Worker         } else {
546*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
547*90e502c7SAndroid Build Coastguard Worker             exit(1);
548*90e502c7SAndroid Build Coastguard Worker         }
549*90e502c7SAndroid Build Coastguard Worker 
550*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp_test_set_sender_roc()...");
551*90e502c7SAndroid Build Coastguard Worker         if (srtp_test_set_sender_roc() == srtp_err_status_ok) {
552*90e502c7SAndroid Build Coastguard Worker             printf("passed\n");
553*90e502c7SAndroid Build Coastguard Worker         } else {
554*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
555*90e502c7SAndroid Build Coastguard Worker             exit(1);
556*90e502c7SAndroid Build Coastguard Worker         }
557*90e502c7SAndroid Build Coastguard Worker     }
558*90e502c7SAndroid Build Coastguard Worker 
559*90e502c7SAndroid Build Coastguard Worker     if (do_timing_test) {
560*90e502c7SAndroid Build Coastguard Worker         const srtp_policy_t **policy = policy_array;
561*90e502c7SAndroid Build Coastguard Worker 
562*90e502c7SAndroid Build Coastguard Worker         /* loop over policies, run timing test for each */
563*90e502c7SAndroid Build Coastguard Worker         while (*policy != NULL) {
564*90e502c7SAndroid Build Coastguard Worker             srtp_print_policy(*policy);
565*90e502c7SAndroid Build Coastguard Worker             srtp_do_timing(*policy);
566*90e502c7SAndroid Build Coastguard Worker             policy++;
567*90e502c7SAndroid Build Coastguard Worker         }
568*90e502c7SAndroid Build Coastguard Worker     }
569*90e502c7SAndroid Build Coastguard Worker 
570*90e502c7SAndroid Build Coastguard Worker     if (do_rejection_test) {
571*90e502c7SAndroid Build Coastguard Worker         const srtp_policy_t **policy = policy_array;
572*90e502c7SAndroid Build Coastguard Worker 
573*90e502c7SAndroid Build Coastguard Worker         /* loop over policies, run rejection timing test for each */
574*90e502c7SAndroid Build Coastguard Worker         while (*policy != NULL) {
575*90e502c7SAndroid Build Coastguard Worker             srtp_print_policy(*policy);
576*90e502c7SAndroid Build Coastguard Worker             srtp_do_rejection_timing(*policy);
577*90e502c7SAndroid Build Coastguard Worker             policy++;
578*90e502c7SAndroid Build Coastguard Worker         }
579*90e502c7SAndroid Build Coastguard Worker     }
580*90e502c7SAndroid Build Coastguard Worker 
581*90e502c7SAndroid Build Coastguard Worker     if (do_codec_timing) {
582*90e502c7SAndroid Build Coastguard Worker         srtp_policy_t policy;
583*90e502c7SAndroid Build Coastguard Worker         int ignore;
584*90e502c7SAndroid Build Coastguard Worker         double mips_value = mips_estimate(1000000000, &ignore);
585*90e502c7SAndroid Build Coastguard Worker 
586*90e502c7SAndroid Build Coastguard Worker         memset(&policy, 0, sizeof(policy));
587*90e502c7SAndroid Build Coastguard Worker         srtp_crypto_policy_set_rtp_default(&policy.rtp);
588*90e502c7SAndroid Build Coastguard Worker         srtp_crypto_policy_set_rtcp_default(&policy.rtcp);
589*90e502c7SAndroid Build Coastguard Worker         policy.ssrc.type = ssrc_specific;
590*90e502c7SAndroid Build Coastguard Worker         policy.ssrc.value = 0xdecafbad;
591*90e502c7SAndroid Build Coastguard Worker         policy.key = test_key;
592*90e502c7SAndroid Build Coastguard Worker         policy.ekt = NULL;
593*90e502c7SAndroid Build Coastguard Worker         policy.window_size = 128;
594*90e502c7SAndroid Build Coastguard Worker         policy.allow_repeat_tx = 0;
595*90e502c7SAndroid Build Coastguard Worker         policy.next = NULL;
596*90e502c7SAndroid Build Coastguard Worker 
597*90e502c7SAndroid Build Coastguard Worker         printf("mips estimate: %e\n", mips_value);
598*90e502c7SAndroid Build Coastguard Worker 
599*90e502c7SAndroid Build Coastguard Worker         printf("testing srtp processing time for voice codecs:\n");
600*90e502c7SAndroid Build Coastguard Worker         printf("codec\t\tlength (octets)\t\tsrtp instructions/second\n");
601*90e502c7SAndroid Build Coastguard Worker         printf("G.711\t\t%d\t\t\t%e\n", 80,
602*90e502c7SAndroid Build Coastguard Worker                (double)mips_value * (80 * 8) /
603*90e502c7SAndroid Build Coastguard Worker                    srtp_bits_per_second(80, &policy) / .01);
604*90e502c7SAndroid Build Coastguard Worker         printf("G.711\t\t%d\t\t\t%e\n", 160,
605*90e502c7SAndroid Build Coastguard Worker                (double)mips_value * (160 * 8) /
606*90e502c7SAndroid Build Coastguard Worker                    srtp_bits_per_second(160, &policy) / .02);
607*90e502c7SAndroid Build Coastguard Worker         printf("G.726-32\t%d\t\t\t%e\n", 40,
608*90e502c7SAndroid Build Coastguard Worker                (double)mips_value * (40 * 8) /
609*90e502c7SAndroid Build Coastguard Worker                    srtp_bits_per_second(40, &policy) / .01);
610*90e502c7SAndroid Build Coastguard Worker         printf("G.726-32\t%d\t\t\t%e\n", 80,
611*90e502c7SAndroid Build Coastguard Worker                (double)mips_value * (80 * 8) /
612*90e502c7SAndroid Build Coastguard Worker                    srtp_bits_per_second(80, &policy) / .02);
613*90e502c7SAndroid Build Coastguard Worker         printf("G.729\t\t%d\t\t\t%e\n", 10,
614*90e502c7SAndroid Build Coastguard Worker                (double)mips_value * (10 * 8) /
615*90e502c7SAndroid Build Coastguard Worker                    srtp_bits_per_second(10, &policy) / .01);
616*90e502c7SAndroid Build Coastguard Worker         printf("G.729\t\t%d\t\t\t%e\n", 20,
617*90e502c7SAndroid Build Coastguard Worker                (double)mips_value * (20 * 8) /
618*90e502c7SAndroid Build Coastguard Worker                    srtp_bits_per_second(20, &policy) / .02);
619*90e502c7SAndroid Build Coastguard Worker         printf("Wideband\t%d\t\t\t%e\n", 320,
620*90e502c7SAndroid Build Coastguard Worker                (double)mips_value * (320 * 8) /
621*90e502c7SAndroid Build Coastguard Worker                    srtp_bits_per_second(320, &policy) / .01);
622*90e502c7SAndroid Build Coastguard Worker         printf("Wideband\t%d\t\t\t%e\n", 640,
623*90e502c7SAndroid Build Coastguard Worker                (double)mips_value * (640 * 8) /
624*90e502c7SAndroid Build Coastguard Worker                    srtp_bits_per_second(640, &policy) / .02);
625*90e502c7SAndroid Build Coastguard Worker     }
626*90e502c7SAndroid Build Coastguard Worker 
627*90e502c7SAndroid Build Coastguard Worker     status = srtp_shutdown();
628*90e502c7SAndroid Build Coastguard Worker     if (status) {
629*90e502c7SAndroid Build Coastguard Worker         printf("error: srtp shutdown failed with error code %d\n", status);
630*90e502c7SAndroid Build Coastguard Worker         exit(1);
631*90e502c7SAndroid Build Coastguard Worker     }
632*90e502c7SAndroid Build Coastguard Worker 
633*90e502c7SAndroid Build Coastguard Worker     return 0;
634*90e502c7SAndroid Build Coastguard Worker }
635*90e502c7SAndroid Build Coastguard Worker 
636*90e502c7SAndroid Build Coastguard Worker /*
637*90e502c7SAndroid Build Coastguard Worker  * srtp_create_test_packet(len, ssrc) returns a pointer to a
638*90e502c7SAndroid Build Coastguard Worker  * (malloced) example RTP packet whose data field has the length given
639*90e502c7SAndroid Build Coastguard Worker  * by pkt_octet_len and the SSRC value ssrc.  The total length of the
640*90e502c7SAndroid Build Coastguard Worker  * packet is twelve octets longer, since the header is at the
641*90e502c7SAndroid Build Coastguard Worker  * beginning.  There is room at the end of the packet for a trailer,
642*90e502c7SAndroid Build Coastguard Worker  * and the four octets following the packet are filled with 0xff
643*90e502c7SAndroid Build Coastguard Worker  * values to enable testing for overwrites.
644*90e502c7SAndroid Build Coastguard Worker  *
645*90e502c7SAndroid Build Coastguard Worker  * note that the location of the test packet can (and should) be
646*90e502c7SAndroid Build Coastguard Worker  * deallocated with the free() call once it is no longer needed.
647*90e502c7SAndroid Build Coastguard Worker  */
648*90e502c7SAndroid Build Coastguard Worker 
srtp_create_test_packet(int pkt_octet_len,uint32_t ssrc,int * pkt_len)649*90e502c7SAndroid Build Coastguard Worker srtp_hdr_t *srtp_create_test_packet(int pkt_octet_len,
650*90e502c7SAndroid Build Coastguard Worker                                     uint32_t ssrc,
651*90e502c7SAndroid Build Coastguard Worker                                     int *pkt_len)
652*90e502c7SAndroid Build Coastguard Worker {
653*90e502c7SAndroid Build Coastguard Worker     int i;
654*90e502c7SAndroid Build Coastguard Worker     uint8_t *buffer;
655*90e502c7SAndroid Build Coastguard Worker     srtp_hdr_t *hdr;
656*90e502c7SAndroid Build Coastguard Worker     int bytes_in_hdr = 12;
657*90e502c7SAndroid Build Coastguard Worker 
658*90e502c7SAndroid Build Coastguard Worker     /* allocate memory for test packet */
659*90e502c7SAndroid Build Coastguard Worker     hdr = (srtp_hdr_t *)malloc(pkt_octet_len + bytes_in_hdr +
660*90e502c7SAndroid Build Coastguard Worker                                SRTP_MAX_TRAILER_LEN + 4);
661*90e502c7SAndroid Build Coastguard Worker     if (!hdr) {
662*90e502c7SAndroid Build Coastguard Worker         return NULL;
663*90e502c7SAndroid Build Coastguard Worker     }
664*90e502c7SAndroid Build Coastguard Worker 
665*90e502c7SAndroid Build Coastguard Worker     hdr->version = 2;            /* RTP version two     */
666*90e502c7SAndroid Build Coastguard Worker     hdr->p = 0;                  /* no padding needed   */
667*90e502c7SAndroid Build Coastguard Worker     hdr->x = 0;                  /* no header extension */
668*90e502c7SAndroid Build Coastguard Worker     hdr->cc = 0;                 /* no CSRCs            */
669*90e502c7SAndroid Build Coastguard Worker     hdr->m = 0;                  /* marker bit          */
670*90e502c7SAndroid Build Coastguard Worker     hdr->pt = 0xf;               /* payload type        */
671*90e502c7SAndroid Build Coastguard Worker     hdr->seq = htons(0x1234);    /* sequence number     */
672*90e502c7SAndroid Build Coastguard Worker     hdr->ts = htonl(0xdecafbad); /* timestamp           */
673*90e502c7SAndroid Build Coastguard Worker     hdr->ssrc = htonl(ssrc);     /* synch. source       */
674*90e502c7SAndroid Build Coastguard Worker 
675*90e502c7SAndroid Build Coastguard Worker     buffer = (uint8_t *)hdr;
676*90e502c7SAndroid Build Coastguard Worker     buffer += bytes_in_hdr;
677*90e502c7SAndroid Build Coastguard Worker 
678*90e502c7SAndroid Build Coastguard Worker     /* set RTP data to 0xab */
679*90e502c7SAndroid Build Coastguard Worker     for (i = 0; i < pkt_octet_len; i++) {
680*90e502c7SAndroid Build Coastguard Worker         *buffer++ = 0xab;
681*90e502c7SAndroid Build Coastguard Worker     }
682*90e502c7SAndroid Build Coastguard Worker 
683*90e502c7SAndroid Build Coastguard Worker     /* set post-data value to 0xffff to enable overrun checking */
684*90e502c7SAndroid Build Coastguard Worker     for (i = 0; i < SRTP_MAX_TRAILER_LEN + 4; i++) {
685*90e502c7SAndroid Build Coastguard Worker         *buffer++ = 0xff;
686*90e502c7SAndroid Build Coastguard Worker     }
687*90e502c7SAndroid Build Coastguard Worker 
688*90e502c7SAndroid Build Coastguard Worker     *pkt_len = bytes_in_hdr + pkt_octet_len;
689*90e502c7SAndroid Build Coastguard Worker 
690*90e502c7SAndroid Build Coastguard Worker     return hdr;
691*90e502c7SAndroid Build Coastguard Worker }
692*90e502c7SAndroid Build Coastguard Worker 
srtp_create_test_packet_extended(int pkt_octet_len,uint32_t ssrc,uint16_t seq,uint32_t ts,int * pkt_len)693*90e502c7SAndroid Build Coastguard Worker static srtp_hdr_t *srtp_create_test_packet_extended(int pkt_octet_len,
694*90e502c7SAndroid Build Coastguard Worker                                                     uint32_t ssrc,
695*90e502c7SAndroid Build Coastguard Worker                                                     uint16_t seq,
696*90e502c7SAndroid Build Coastguard Worker                                                     uint32_t ts,
697*90e502c7SAndroid Build Coastguard Worker                                                     int *pkt_len)
698*90e502c7SAndroid Build Coastguard Worker {
699*90e502c7SAndroid Build Coastguard Worker     srtp_hdr_t *hdr;
700*90e502c7SAndroid Build Coastguard Worker 
701*90e502c7SAndroid Build Coastguard Worker     hdr = srtp_create_test_packet(pkt_octet_len, ssrc, pkt_len);
702*90e502c7SAndroid Build Coastguard Worker     if (hdr == NULL)
703*90e502c7SAndroid Build Coastguard Worker         return hdr;
704*90e502c7SAndroid Build Coastguard Worker 
705*90e502c7SAndroid Build Coastguard Worker     hdr->seq = htons(seq);
706*90e502c7SAndroid Build Coastguard Worker     hdr->ts = htonl(ts);
707*90e502c7SAndroid Build Coastguard Worker     return hdr;
708*90e502c7SAndroid Build Coastguard Worker }
709*90e502c7SAndroid Build Coastguard Worker 
srtp_create_test_packet_ext_hdr(int pkt_octet_len,uint32_t ssrc,int * pkt_len)710*90e502c7SAndroid Build Coastguard Worker srtp_hdr_t *srtp_create_test_packet_ext_hdr(int pkt_octet_len,
711*90e502c7SAndroid Build Coastguard Worker                                             uint32_t ssrc,
712*90e502c7SAndroid Build Coastguard Worker                                             int *pkt_len)
713*90e502c7SAndroid Build Coastguard Worker {
714*90e502c7SAndroid Build Coastguard Worker     int i;
715*90e502c7SAndroid Build Coastguard Worker     uint8_t *buffer;
716*90e502c7SAndroid Build Coastguard Worker     srtp_hdr_t *hdr;
717*90e502c7SAndroid Build Coastguard Worker     int bytes_in_hdr = 12;
718*90e502c7SAndroid Build Coastguard Worker     uint8_t extension_header[12] = { /* one-byte header */
719*90e502c7SAndroid Build Coastguard Worker                                      0xbe, 0xde,
720*90e502c7SAndroid Build Coastguard Worker                                      /* size */
721*90e502c7SAndroid Build Coastguard Worker                                      0x00, 0x02,
722*90e502c7SAndroid Build Coastguard Worker                                      /* id 1, length 1 (i.e. 2 bytes) */
723*90e502c7SAndroid Build Coastguard Worker                                      0x11,
724*90e502c7SAndroid Build Coastguard Worker                                      /* payload */
725*90e502c7SAndroid Build Coastguard Worker                                      0xca, 0xfe,
726*90e502c7SAndroid Build Coastguard Worker                                      /* padding */
727*90e502c7SAndroid Build Coastguard Worker                                      0x00,
728*90e502c7SAndroid Build Coastguard Worker                                      /* id 2, length 0 (i.e. 1 byte) */
729*90e502c7SAndroid Build Coastguard Worker                                      0x20,
730*90e502c7SAndroid Build Coastguard Worker                                      /* payload */
731*90e502c7SAndroid Build Coastguard Worker                                      0xba,
732*90e502c7SAndroid Build Coastguard Worker                                      /* padding */
733*90e502c7SAndroid Build Coastguard Worker                                      0x00, 0x00
734*90e502c7SAndroid Build Coastguard Worker     };
735*90e502c7SAndroid Build Coastguard Worker 
736*90e502c7SAndroid Build Coastguard Worker     /* allocate memory for test packet */
737*90e502c7SAndroid Build Coastguard Worker     hdr = (srtp_hdr_t *)malloc(pkt_octet_len + bytes_in_hdr +
738*90e502c7SAndroid Build Coastguard Worker                                sizeof(extension_header) + SRTP_MAX_TRAILER_LEN +
739*90e502c7SAndroid Build Coastguard Worker                                4);
740*90e502c7SAndroid Build Coastguard Worker     if (!hdr)
741*90e502c7SAndroid Build Coastguard Worker         return NULL;
742*90e502c7SAndroid Build Coastguard Worker 
743*90e502c7SAndroid Build Coastguard Worker     hdr->version = 2;            /* RTP version two     */
744*90e502c7SAndroid Build Coastguard Worker     hdr->p = 0;                  /* no padding needed   */
745*90e502c7SAndroid Build Coastguard Worker     hdr->x = 1;                  /* no header extension */
746*90e502c7SAndroid Build Coastguard Worker     hdr->cc = 0;                 /* no CSRCs            */
747*90e502c7SAndroid Build Coastguard Worker     hdr->m = 0;                  /* marker bit          */
748*90e502c7SAndroid Build Coastguard Worker     hdr->pt = 0xf;               /* payload type        */
749*90e502c7SAndroid Build Coastguard Worker     hdr->seq = htons(0x1234);    /* sequence number     */
750*90e502c7SAndroid Build Coastguard Worker     hdr->ts = htonl(0xdecafbad); /* timestamp           */
751*90e502c7SAndroid Build Coastguard Worker     hdr->ssrc = htonl(ssrc);     /* synch. source       */
752*90e502c7SAndroid Build Coastguard Worker 
753*90e502c7SAndroid Build Coastguard Worker     buffer = (uint8_t *)hdr;
754*90e502c7SAndroid Build Coastguard Worker     buffer += bytes_in_hdr;
755*90e502c7SAndroid Build Coastguard Worker 
756*90e502c7SAndroid Build Coastguard Worker     memcpy(buffer, extension_header, sizeof(extension_header));
757*90e502c7SAndroid Build Coastguard Worker     buffer += sizeof(extension_header);
758*90e502c7SAndroid Build Coastguard Worker 
759*90e502c7SAndroid Build Coastguard Worker     /* set RTP data to 0xab */
760*90e502c7SAndroid Build Coastguard Worker     for (i = 0; i < pkt_octet_len; i++)
761*90e502c7SAndroid Build Coastguard Worker         *buffer++ = 0xab;
762*90e502c7SAndroid Build Coastguard Worker 
763*90e502c7SAndroid Build Coastguard Worker     /* set post-data value to 0xffff to enable overrun checking */
764*90e502c7SAndroid Build Coastguard Worker     for (i = 0; i < SRTP_MAX_TRAILER_LEN + 4; i++)
765*90e502c7SAndroid Build Coastguard Worker         *buffer++ = 0xff;
766*90e502c7SAndroid Build Coastguard Worker 
767*90e502c7SAndroid Build Coastguard Worker     *pkt_len = bytes_in_hdr + sizeof(extension_header) + pkt_octet_len;
768*90e502c7SAndroid Build Coastguard Worker 
769*90e502c7SAndroid Build Coastguard Worker     return hdr;
770*90e502c7SAndroid Build Coastguard Worker }
771*90e502c7SAndroid Build Coastguard Worker 
srtp_do_timing(const srtp_policy_t * policy)772*90e502c7SAndroid Build Coastguard Worker void srtp_do_timing(const srtp_policy_t *policy)
773*90e502c7SAndroid Build Coastguard Worker {
774*90e502c7SAndroid Build Coastguard Worker     int len;
775*90e502c7SAndroid Build Coastguard Worker 
776*90e502c7SAndroid Build Coastguard Worker     /*
777*90e502c7SAndroid Build Coastguard Worker      * note: the output of this function is formatted so that it
778*90e502c7SAndroid Build Coastguard Worker      * can be used in gnuplot.  '#' indicates a comment, and "\r\n"
779*90e502c7SAndroid Build Coastguard Worker      * terminates a record
780*90e502c7SAndroid Build Coastguard Worker      */
781*90e502c7SAndroid Build Coastguard Worker 
782*90e502c7SAndroid Build Coastguard Worker     printf("# testing srtp throughput:\r\n");
783*90e502c7SAndroid Build Coastguard Worker     printf("# mesg length (octets)\tthroughput (megabits per second)\r\n");
784*90e502c7SAndroid Build Coastguard Worker 
785*90e502c7SAndroid Build Coastguard Worker     for (len = 16; len <= 2048; len *= 2) {
786*90e502c7SAndroid Build Coastguard Worker         printf("%d\t\t\t%f\r\n", len,
787*90e502c7SAndroid Build Coastguard Worker                srtp_bits_per_second(len, policy) / 1.0E6);
788*90e502c7SAndroid Build Coastguard Worker     }
789*90e502c7SAndroid Build Coastguard Worker 
790*90e502c7SAndroid Build Coastguard Worker     /* these extra linefeeds let gnuplot know that a dataset is done */
791*90e502c7SAndroid Build Coastguard Worker     printf("\r\n\r\n");
792*90e502c7SAndroid Build Coastguard Worker }
793*90e502c7SAndroid Build Coastguard Worker 
srtp_do_rejection_timing(const srtp_policy_t * policy)794*90e502c7SAndroid Build Coastguard Worker void srtp_do_rejection_timing(const srtp_policy_t *policy)
795*90e502c7SAndroid Build Coastguard Worker {
796*90e502c7SAndroid Build Coastguard Worker     int len;
797*90e502c7SAndroid Build Coastguard Worker 
798*90e502c7SAndroid Build Coastguard Worker     /*
799*90e502c7SAndroid Build Coastguard Worker      * note: the output of this function is formatted so that it
800*90e502c7SAndroid Build Coastguard Worker      * can be used in gnuplot.  '#' indicates a comment, and "\r\n"
801*90e502c7SAndroid Build Coastguard Worker      * terminates a record
802*90e502c7SAndroid Build Coastguard Worker      */
803*90e502c7SAndroid Build Coastguard Worker 
804*90e502c7SAndroid Build Coastguard Worker     printf("# testing srtp rejection throughput:\r\n");
805*90e502c7SAndroid Build Coastguard Worker     printf("# mesg length (octets)\trejections per second\r\n");
806*90e502c7SAndroid Build Coastguard Worker 
807*90e502c7SAndroid Build Coastguard Worker     for (len = 8; len <= 2048; len *= 2) {
808*90e502c7SAndroid Build Coastguard Worker         printf("%d\t\t\t%e\r\n", len, srtp_rejections_per_second(len, policy));
809*90e502c7SAndroid Build Coastguard Worker     }
810*90e502c7SAndroid Build Coastguard Worker 
811*90e502c7SAndroid Build Coastguard Worker     /* these extra linefeeds let gnuplot know that a dataset is done */
812*90e502c7SAndroid Build Coastguard Worker     printf("\r\n\r\n");
813*90e502c7SAndroid Build Coastguard Worker }
814*90e502c7SAndroid Build Coastguard Worker 
815*90e502c7SAndroid Build Coastguard Worker #define MAX_MSG_LEN 1024
816*90e502c7SAndroid Build Coastguard Worker 
srtp_bits_per_second(int msg_len_octets,const srtp_policy_t * policy)817*90e502c7SAndroid Build Coastguard Worker double srtp_bits_per_second(int msg_len_octets, const srtp_policy_t *policy)
818*90e502c7SAndroid Build Coastguard Worker {
819*90e502c7SAndroid Build Coastguard Worker     srtp_t srtp;
820*90e502c7SAndroid Build Coastguard Worker     srtp_hdr_t *mesg;
821*90e502c7SAndroid Build Coastguard Worker     int i;
822*90e502c7SAndroid Build Coastguard Worker     clock_t timer;
823*90e502c7SAndroid Build Coastguard Worker     int num_trials = 100000;
824*90e502c7SAndroid Build Coastguard Worker     int input_len, len;
825*90e502c7SAndroid Build Coastguard Worker     uint32_t ssrc;
826*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
827*90e502c7SAndroid Build Coastguard Worker 
828*90e502c7SAndroid Build Coastguard Worker     /*
829*90e502c7SAndroid Build Coastguard Worker      * allocate and initialize an srtp session
830*90e502c7SAndroid Build Coastguard Worker      */
831*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&srtp, policy);
832*90e502c7SAndroid Build Coastguard Worker     if (status) {
833*90e502c7SAndroid Build Coastguard Worker         printf("error: srtp_create() failed with error code %d\n", status);
834*90e502c7SAndroid Build Coastguard Worker         exit(1);
835*90e502c7SAndroid Build Coastguard Worker     }
836*90e502c7SAndroid Build Coastguard Worker 
837*90e502c7SAndroid Build Coastguard Worker     /*
838*90e502c7SAndroid Build Coastguard Worker      * if the ssrc is unspecified, use a predetermined one
839*90e502c7SAndroid Build Coastguard Worker      */
840*90e502c7SAndroid Build Coastguard Worker     if (policy->ssrc.type != ssrc_specific) {
841*90e502c7SAndroid Build Coastguard Worker         ssrc = 0xdeadbeef;
842*90e502c7SAndroid Build Coastguard Worker     } else {
843*90e502c7SAndroid Build Coastguard Worker         ssrc = policy->ssrc.value;
844*90e502c7SAndroid Build Coastguard Worker     }
845*90e502c7SAndroid Build Coastguard Worker 
846*90e502c7SAndroid Build Coastguard Worker     /*
847*90e502c7SAndroid Build Coastguard Worker      * create a test packet
848*90e502c7SAndroid Build Coastguard Worker      */
849*90e502c7SAndroid Build Coastguard Worker     mesg = srtp_create_test_packet(msg_len_octets, ssrc, &input_len);
850*90e502c7SAndroid Build Coastguard Worker     if (mesg == NULL) {
851*90e502c7SAndroid Build Coastguard Worker         return 0.0; /* indicate failure by returning zero */
852*90e502c7SAndroid Build Coastguard Worker     }
853*90e502c7SAndroid Build Coastguard Worker     timer = clock();
854*90e502c7SAndroid Build Coastguard Worker     for (i = 0; i < num_trials; i++) {
855*90e502c7SAndroid Build Coastguard Worker         len = input_len;
856*90e502c7SAndroid Build Coastguard Worker         /* srtp protect message */
857*90e502c7SAndroid Build Coastguard Worker         status = srtp_protect(srtp, mesg, &len);
858*90e502c7SAndroid Build Coastguard Worker         if (status) {
859*90e502c7SAndroid Build Coastguard Worker             printf("error: srtp_protect() failed with error code %d\n", status);
860*90e502c7SAndroid Build Coastguard Worker             exit(1);
861*90e502c7SAndroid Build Coastguard Worker         }
862*90e502c7SAndroid Build Coastguard Worker 
863*90e502c7SAndroid Build Coastguard Worker         /* increment message number */
864*90e502c7SAndroid Build Coastguard Worker         {
865*90e502c7SAndroid Build Coastguard Worker             /* hack sequence to avoid problems with macros for htons/ntohs on
866*90e502c7SAndroid Build Coastguard Worker              * some systems */
867*90e502c7SAndroid Build Coastguard Worker             short new_seq = ntohs(mesg->seq) + 1;
868*90e502c7SAndroid Build Coastguard Worker             mesg->seq = htons(new_seq);
869*90e502c7SAndroid Build Coastguard Worker         }
870*90e502c7SAndroid Build Coastguard Worker     }
871*90e502c7SAndroid Build Coastguard Worker     timer = clock() - timer;
872*90e502c7SAndroid Build Coastguard Worker 
873*90e502c7SAndroid Build Coastguard Worker     free(mesg);
874*90e502c7SAndroid Build Coastguard Worker 
875*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(srtp);
876*90e502c7SAndroid Build Coastguard Worker     if (status) {
877*90e502c7SAndroid Build Coastguard Worker         printf("error: srtp_dealloc() failed with error code %d\n", status);
878*90e502c7SAndroid Build Coastguard Worker         exit(1);
879*90e502c7SAndroid Build Coastguard Worker     }
880*90e502c7SAndroid Build Coastguard Worker 
881*90e502c7SAndroid Build Coastguard Worker     return (double)(msg_len_octets)*8 * num_trials * CLOCKS_PER_SEC / timer;
882*90e502c7SAndroid Build Coastguard Worker }
883*90e502c7SAndroid Build Coastguard Worker 
srtp_rejections_per_second(int msg_len_octets,const srtp_policy_t * policy)884*90e502c7SAndroid Build Coastguard Worker double srtp_rejections_per_second(int msg_len_octets,
885*90e502c7SAndroid Build Coastguard Worker                                   const srtp_policy_t *policy)
886*90e502c7SAndroid Build Coastguard Worker {
887*90e502c7SAndroid Build Coastguard Worker     srtp_ctx_t *srtp;
888*90e502c7SAndroid Build Coastguard Worker     srtp_hdr_t *mesg;
889*90e502c7SAndroid Build Coastguard Worker     int i;
890*90e502c7SAndroid Build Coastguard Worker     int len;
891*90e502c7SAndroid Build Coastguard Worker     clock_t timer;
892*90e502c7SAndroid Build Coastguard Worker     int num_trials = 1000000;
893*90e502c7SAndroid Build Coastguard Worker     uint32_t ssrc = policy->ssrc.value;
894*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
895*90e502c7SAndroid Build Coastguard Worker 
896*90e502c7SAndroid Build Coastguard Worker     /*
897*90e502c7SAndroid Build Coastguard Worker      * allocate and initialize an srtp session
898*90e502c7SAndroid Build Coastguard Worker      */
899*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&srtp, policy);
900*90e502c7SAndroid Build Coastguard Worker     if (status) {
901*90e502c7SAndroid Build Coastguard Worker         printf("error: srtp_create() failed with error code %d\n", status);
902*90e502c7SAndroid Build Coastguard Worker         exit(1);
903*90e502c7SAndroid Build Coastguard Worker     }
904*90e502c7SAndroid Build Coastguard Worker 
905*90e502c7SAndroid Build Coastguard Worker     mesg = srtp_create_test_packet(msg_len_octets, ssrc, &len);
906*90e502c7SAndroid Build Coastguard Worker     if (mesg == NULL) {
907*90e502c7SAndroid Build Coastguard Worker         return 0.0; /* indicate failure by returning zero */
908*90e502c7SAndroid Build Coastguard Worker     }
909*90e502c7SAndroid Build Coastguard Worker     srtp_protect(srtp, (srtp_hdr_t *)mesg, &len);
910*90e502c7SAndroid Build Coastguard Worker 
911*90e502c7SAndroid Build Coastguard Worker     timer = clock();
912*90e502c7SAndroid Build Coastguard Worker     for (i = 0; i < num_trials; i++) {
913*90e502c7SAndroid Build Coastguard Worker         len = msg_len_octets;
914*90e502c7SAndroid Build Coastguard Worker         srtp_unprotect(srtp, (srtp_hdr_t *)mesg, &len);
915*90e502c7SAndroid Build Coastguard Worker     }
916*90e502c7SAndroid Build Coastguard Worker     timer = clock() - timer;
917*90e502c7SAndroid Build Coastguard Worker 
918*90e502c7SAndroid Build Coastguard Worker     free(mesg);
919*90e502c7SAndroid Build Coastguard Worker 
920*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(srtp);
921*90e502c7SAndroid Build Coastguard Worker     if (status) {
922*90e502c7SAndroid Build Coastguard Worker         printf("error: srtp_dealloc() failed with error code %d\n", status);
923*90e502c7SAndroid Build Coastguard Worker         exit(1);
924*90e502c7SAndroid Build Coastguard Worker     }
925*90e502c7SAndroid Build Coastguard Worker 
926*90e502c7SAndroid Build Coastguard Worker     return (double)num_trials * CLOCKS_PER_SEC / timer;
927*90e502c7SAndroid Build Coastguard Worker }
928*90e502c7SAndroid Build Coastguard Worker 
err_check(srtp_err_status_t s)929*90e502c7SAndroid Build Coastguard Worker void err_check(srtp_err_status_t s)
930*90e502c7SAndroid Build Coastguard Worker {
931*90e502c7SAndroid Build Coastguard Worker     if (s == srtp_err_status_ok) {
932*90e502c7SAndroid Build Coastguard Worker         return;
933*90e502c7SAndroid Build Coastguard Worker     } else {
934*90e502c7SAndroid Build Coastguard Worker         fprintf(stderr, "error: unexpected srtp failure (code %d)\n", s);
935*90e502c7SAndroid Build Coastguard Worker     }
936*90e502c7SAndroid Build Coastguard Worker     exit(1);
937*90e502c7SAndroid Build Coastguard Worker }
938*90e502c7SAndroid Build Coastguard Worker 
srtp_test_call_protect(srtp_t srtp_sender,srtp_hdr_t * hdr,int * len,int mki_index)939*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_call_protect(srtp_t srtp_sender,
940*90e502c7SAndroid Build Coastguard Worker                                          srtp_hdr_t *hdr,
941*90e502c7SAndroid Build Coastguard Worker                                          int *len,
942*90e502c7SAndroid Build Coastguard Worker                                          int mki_index)
943*90e502c7SAndroid Build Coastguard Worker {
944*90e502c7SAndroid Build Coastguard Worker     if (mki_index == -1) {
945*90e502c7SAndroid Build Coastguard Worker         return srtp_protect(srtp_sender, hdr, len);
946*90e502c7SAndroid Build Coastguard Worker     } else {
947*90e502c7SAndroid Build Coastguard Worker         return srtp_protect_mki(srtp_sender, hdr, len, 1, mki_index);
948*90e502c7SAndroid Build Coastguard Worker     }
949*90e502c7SAndroid Build Coastguard Worker }
950*90e502c7SAndroid Build Coastguard Worker 
srtp_test_call_protect_rtcp(srtp_t srtp_sender,srtp_hdr_t * hdr,int * len,int mki_index)951*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_call_protect_rtcp(srtp_t srtp_sender,
952*90e502c7SAndroid Build Coastguard Worker                                               srtp_hdr_t *hdr,
953*90e502c7SAndroid Build Coastguard Worker                                               int *len,
954*90e502c7SAndroid Build Coastguard Worker                                               int mki_index)
955*90e502c7SAndroid Build Coastguard Worker {
956*90e502c7SAndroid Build Coastguard Worker     if (mki_index == -1) {
957*90e502c7SAndroid Build Coastguard Worker         return srtp_protect_rtcp(srtp_sender, hdr, len);
958*90e502c7SAndroid Build Coastguard Worker     } else {
959*90e502c7SAndroid Build Coastguard Worker         return srtp_protect_rtcp_mki(srtp_sender, hdr, len, 1, mki_index);
960*90e502c7SAndroid Build Coastguard Worker     }
961*90e502c7SAndroid Build Coastguard Worker }
962*90e502c7SAndroid Build Coastguard Worker 
srtp_test_call_unprotect(srtp_t srtp_sender,srtp_hdr_t * hdr,int * len,int use_mki)963*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_call_unprotect(srtp_t srtp_sender,
964*90e502c7SAndroid Build Coastguard Worker                                            srtp_hdr_t *hdr,
965*90e502c7SAndroid Build Coastguard Worker                                            int *len,
966*90e502c7SAndroid Build Coastguard Worker                                            int use_mki)
967*90e502c7SAndroid Build Coastguard Worker {
968*90e502c7SAndroid Build Coastguard Worker     if (use_mki == -1) {
969*90e502c7SAndroid Build Coastguard Worker         return srtp_unprotect(srtp_sender, hdr, len);
970*90e502c7SAndroid Build Coastguard Worker     } else {
971*90e502c7SAndroid Build Coastguard Worker         return srtp_unprotect_mki(srtp_sender, hdr, len, use_mki);
972*90e502c7SAndroid Build Coastguard Worker     }
973*90e502c7SAndroid Build Coastguard Worker }
974*90e502c7SAndroid Build Coastguard Worker 
srtp_test_call_unprotect_rtcp(srtp_t srtp_sender,srtp_hdr_t * hdr,int * len,int use_mki)975*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_call_unprotect_rtcp(srtp_t srtp_sender,
976*90e502c7SAndroid Build Coastguard Worker                                                 srtp_hdr_t *hdr,
977*90e502c7SAndroid Build Coastguard Worker                                                 int *len,
978*90e502c7SAndroid Build Coastguard Worker                                                 int use_mki)
979*90e502c7SAndroid Build Coastguard Worker {
980*90e502c7SAndroid Build Coastguard Worker     if (use_mki == -1) {
981*90e502c7SAndroid Build Coastguard Worker         return srtp_unprotect_rtcp(srtp_sender, hdr, len);
982*90e502c7SAndroid Build Coastguard Worker     } else {
983*90e502c7SAndroid Build Coastguard Worker         return srtp_unprotect_rtcp_mki(srtp_sender, hdr, len, use_mki);
984*90e502c7SAndroid Build Coastguard Worker     }
985*90e502c7SAndroid Build Coastguard Worker }
986*90e502c7SAndroid Build Coastguard Worker 
srtp_test(const srtp_policy_t * policy,int extension_header,int mki_index)987*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test(const srtp_policy_t *policy,
988*90e502c7SAndroid Build Coastguard Worker                             int extension_header,
989*90e502c7SAndroid Build Coastguard Worker                             int mki_index)
990*90e502c7SAndroid Build Coastguard Worker {
991*90e502c7SAndroid Build Coastguard Worker     int i;
992*90e502c7SAndroid Build Coastguard Worker     srtp_t srtp_sender;
993*90e502c7SAndroid Build Coastguard Worker     srtp_t srtp_rcvr;
994*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status = srtp_err_status_ok;
995*90e502c7SAndroid Build Coastguard Worker     srtp_hdr_t *hdr, *hdr2;
996*90e502c7SAndroid Build Coastguard Worker     uint8_t hdr_enc[64];
997*90e502c7SAndroid Build Coastguard Worker     uint8_t *pkt_end;
998*90e502c7SAndroid Build Coastguard Worker     int msg_len_octets, msg_len_enc, msg_len;
999*90e502c7SAndroid Build Coastguard Worker     int len, len2;
1000*90e502c7SAndroid Build Coastguard Worker     uint32_t tag_length;
1001*90e502c7SAndroid Build Coastguard Worker     uint32_t ssrc;
1002*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t *rcvr_policy;
1003*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t tmp_policy;
1004*90e502c7SAndroid Build Coastguard Worker     int header = 1;
1005*90e502c7SAndroid Build Coastguard Worker     int use_mki = 0;
1006*90e502c7SAndroid Build Coastguard Worker 
1007*90e502c7SAndroid Build Coastguard Worker     if (mki_index >= 0)
1008*90e502c7SAndroid Build Coastguard Worker         use_mki = 1;
1009*90e502c7SAndroid Build Coastguard Worker 
1010*90e502c7SAndroid Build Coastguard Worker     if (extension_header) {
1011*90e502c7SAndroid Build Coastguard Worker         memcpy(&tmp_policy, policy, sizeof(srtp_policy_t));
1012*90e502c7SAndroid Build Coastguard Worker         tmp_policy.enc_xtn_hdr = &header;
1013*90e502c7SAndroid Build Coastguard Worker         tmp_policy.enc_xtn_hdr_count = 1;
1014*90e502c7SAndroid Build Coastguard Worker         err_check(srtp_create(&srtp_sender, &tmp_policy));
1015*90e502c7SAndroid Build Coastguard Worker     } else {
1016*90e502c7SAndroid Build Coastguard Worker         err_check(srtp_create(&srtp_sender, policy));
1017*90e502c7SAndroid Build Coastguard Worker     }
1018*90e502c7SAndroid Build Coastguard Worker 
1019*90e502c7SAndroid Build Coastguard Worker     /* print out policy */
1020*90e502c7SAndroid Build Coastguard Worker     err_check(srtp_session_print_policy(srtp_sender));
1021*90e502c7SAndroid Build Coastguard Worker 
1022*90e502c7SAndroid Build Coastguard Worker     /*
1023*90e502c7SAndroid Build Coastguard Worker      * initialize data buffer, using the ssrc in the policy unless that
1024*90e502c7SAndroid Build Coastguard Worker      * value is a wildcard, in which case we'll just use an arbitrary
1025*90e502c7SAndroid Build Coastguard Worker      * one
1026*90e502c7SAndroid Build Coastguard Worker      */
1027*90e502c7SAndroid Build Coastguard Worker     if (policy->ssrc.type != ssrc_specific) {
1028*90e502c7SAndroid Build Coastguard Worker         ssrc = 0xdecafbad;
1029*90e502c7SAndroid Build Coastguard Worker     } else {
1030*90e502c7SAndroid Build Coastguard Worker         ssrc = policy->ssrc.value;
1031*90e502c7SAndroid Build Coastguard Worker     }
1032*90e502c7SAndroid Build Coastguard Worker     msg_len_octets = 28;
1033*90e502c7SAndroid Build Coastguard Worker     if (extension_header) {
1034*90e502c7SAndroid Build Coastguard Worker         hdr = srtp_create_test_packet_ext_hdr(msg_len_octets, ssrc, &len);
1035*90e502c7SAndroid Build Coastguard Worker         hdr2 = srtp_create_test_packet_ext_hdr(msg_len_octets, ssrc, &len2);
1036*90e502c7SAndroid Build Coastguard Worker     } else {
1037*90e502c7SAndroid Build Coastguard Worker         hdr = srtp_create_test_packet(msg_len_octets, ssrc, &len);
1038*90e502c7SAndroid Build Coastguard Worker         hdr2 = srtp_create_test_packet(msg_len_octets, ssrc, &len2);
1039*90e502c7SAndroid Build Coastguard Worker     }
1040*90e502c7SAndroid Build Coastguard Worker 
1041*90e502c7SAndroid Build Coastguard Worker     /* save original msg len */
1042*90e502c7SAndroid Build Coastguard Worker     msg_len = len;
1043*90e502c7SAndroid Build Coastguard Worker 
1044*90e502c7SAndroid Build Coastguard Worker     if (hdr == NULL) {
1045*90e502c7SAndroid Build Coastguard Worker         free(hdr2);
1046*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_alloc_fail;
1047*90e502c7SAndroid Build Coastguard Worker     }
1048*90e502c7SAndroid Build Coastguard Worker     if (hdr2 == NULL) {
1049*90e502c7SAndroid Build Coastguard Worker         free(hdr);
1050*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_alloc_fail;
1051*90e502c7SAndroid Build Coastguard Worker     }
1052*90e502c7SAndroid Build Coastguard Worker 
1053*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "before protection:\n%s",
1054*90e502c7SAndroid Build Coastguard Worker                 srtp_packet_to_string(hdr, len));
1055*90e502c7SAndroid Build Coastguard Worker 
1056*90e502c7SAndroid Build Coastguard Worker #if PRINT_REFERENCE_PACKET
1057*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "reference packet before protection:\n%s",
1058*90e502c7SAndroid Build Coastguard Worker                 octet_string_hex_string((uint8_t *)hdr, len));
1059*90e502c7SAndroid Build Coastguard Worker #endif
1060*90e502c7SAndroid Build Coastguard Worker     err_check(srtp_test_call_protect(srtp_sender, hdr, &len, mki_index));
1061*90e502c7SAndroid Build Coastguard Worker 
1062*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "after protection:\n%s",
1063*90e502c7SAndroid Build Coastguard Worker                 srtp_packet_to_string(hdr, len));
1064*90e502c7SAndroid Build Coastguard Worker #if PRINT_REFERENCE_PACKET
1065*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "after protection:\n%s",
1066*90e502c7SAndroid Build Coastguard Worker                 octet_string_hex_string((uint8_t *)hdr, len));
1067*90e502c7SAndroid Build Coastguard Worker #endif
1068*90e502c7SAndroid Build Coastguard Worker 
1069*90e502c7SAndroid Build Coastguard Worker     /* save protected message and length */
1070*90e502c7SAndroid Build Coastguard Worker     memcpy(hdr_enc, hdr, len);
1071*90e502c7SAndroid Build Coastguard Worker     msg_len_enc = len;
1072*90e502c7SAndroid Build Coastguard Worker 
1073*90e502c7SAndroid Build Coastguard Worker     /*
1074*90e502c7SAndroid Build Coastguard Worker      * check for overrun of the srtp_protect() function
1075*90e502c7SAndroid Build Coastguard Worker      *
1076*90e502c7SAndroid Build Coastguard Worker      * The packet is followed by a value of 0xfffff; if the value of the
1077*90e502c7SAndroid Build Coastguard Worker      * data following the packet is different, then we know that the
1078*90e502c7SAndroid Build Coastguard Worker      * protect function is overwriting the end of the packet.
1079*90e502c7SAndroid Build Coastguard Worker      */
1080*90e502c7SAndroid Build Coastguard Worker     err_check(srtp_get_protect_trailer_length(srtp_sender, use_mki, mki_index,
1081*90e502c7SAndroid Build Coastguard Worker                                               &tag_length));
1082*90e502c7SAndroid Build Coastguard Worker     pkt_end = (uint8_t *)hdr + msg_len + tag_length;
1083*90e502c7SAndroid Build Coastguard Worker     for (i = 0; i < 4; i++) {
1084*90e502c7SAndroid Build Coastguard Worker         if (pkt_end[i] != 0xff) {
1085*90e502c7SAndroid Build Coastguard Worker             fprintf(stdout, "overwrite in srtp_protect() function "
1086*90e502c7SAndroid Build Coastguard Worker                             "(expected %x, found %x in trailing octet %d)\n",
1087*90e502c7SAndroid Build Coastguard Worker                     0xff, ((uint8_t *)hdr)[i], i);
1088*90e502c7SAndroid Build Coastguard Worker             free(hdr);
1089*90e502c7SAndroid Build Coastguard Worker             free(hdr2);
1090*90e502c7SAndroid Build Coastguard Worker             return srtp_err_status_algo_fail;
1091*90e502c7SAndroid Build Coastguard Worker         }
1092*90e502c7SAndroid Build Coastguard Worker     }
1093*90e502c7SAndroid Build Coastguard Worker 
1094*90e502c7SAndroid Build Coastguard Worker     /*
1095*90e502c7SAndroid Build Coastguard Worker      * if the policy includes confidentiality, check that ciphertext is
1096*90e502c7SAndroid Build Coastguard Worker      * different than plaintext
1097*90e502c7SAndroid Build Coastguard Worker      *
1098*90e502c7SAndroid Build Coastguard Worker      * Note that this check will give false negatives, with some small
1099*90e502c7SAndroid Build Coastguard Worker      * probability, especially if the packets are short.  For that
1100*90e502c7SAndroid Build Coastguard Worker      * reason, we skip this check if the plaintext is less than four
1101*90e502c7SAndroid Build Coastguard Worker      * octets long.
1102*90e502c7SAndroid Build Coastguard Worker      */
1103*90e502c7SAndroid Build Coastguard Worker     if ((policy->rtp.sec_serv & sec_serv_conf) && (msg_len_octets >= 4)) {
1104*90e502c7SAndroid Build Coastguard Worker         printf("testing that ciphertext is distinct from plaintext...");
1105*90e502c7SAndroid Build Coastguard Worker         status = srtp_err_status_algo_fail;
1106*90e502c7SAndroid Build Coastguard Worker         for (i = 12; i < msg_len_octets + 12; i++) {
1107*90e502c7SAndroid Build Coastguard Worker             if (((uint8_t *)hdr)[i] != ((uint8_t *)hdr2)[i]) {
1108*90e502c7SAndroid Build Coastguard Worker                 status = srtp_err_status_ok;
1109*90e502c7SAndroid Build Coastguard Worker             }
1110*90e502c7SAndroid Build Coastguard Worker         }
1111*90e502c7SAndroid Build Coastguard Worker         if (status) {
1112*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
1113*90e502c7SAndroid Build Coastguard Worker             free(hdr);
1114*90e502c7SAndroid Build Coastguard Worker             free(hdr2);
1115*90e502c7SAndroid Build Coastguard Worker             return status;
1116*90e502c7SAndroid Build Coastguard Worker         }
1117*90e502c7SAndroid Build Coastguard Worker         printf("passed\n");
1118*90e502c7SAndroid Build Coastguard Worker     }
1119*90e502c7SAndroid Build Coastguard Worker 
1120*90e502c7SAndroid Build Coastguard Worker     /*
1121*90e502c7SAndroid Build Coastguard Worker      * if the policy uses a 'wildcard' ssrc, then we need to make a copy
1122*90e502c7SAndroid Build Coastguard Worker      * of the policy that changes the direction to inbound
1123*90e502c7SAndroid Build Coastguard Worker      *
1124*90e502c7SAndroid Build Coastguard Worker      * we always copy the policy into the rcvr_policy, since otherwise
1125*90e502c7SAndroid Build Coastguard Worker      * the compiler would fret about the constness of the policy
1126*90e502c7SAndroid Build Coastguard Worker      */
1127*90e502c7SAndroid Build Coastguard Worker     rcvr_policy = (srtp_policy_t *)malloc(sizeof(srtp_policy_t));
1128*90e502c7SAndroid Build Coastguard Worker     if (rcvr_policy == NULL) {
1129*90e502c7SAndroid Build Coastguard Worker         free(hdr);
1130*90e502c7SAndroid Build Coastguard Worker         free(hdr2);
1131*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_alloc_fail;
1132*90e502c7SAndroid Build Coastguard Worker     }
1133*90e502c7SAndroid Build Coastguard Worker     if (extension_header) {
1134*90e502c7SAndroid Build Coastguard Worker         memcpy(rcvr_policy, &tmp_policy, sizeof(srtp_policy_t));
1135*90e502c7SAndroid Build Coastguard Worker         if (tmp_policy.ssrc.type == ssrc_any_outbound) {
1136*90e502c7SAndroid Build Coastguard Worker             rcvr_policy->ssrc.type = ssrc_any_inbound;
1137*90e502c7SAndroid Build Coastguard Worker         }
1138*90e502c7SAndroid Build Coastguard Worker     } else {
1139*90e502c7SAndroid Build Coastguard Worker         memcpy(rcvr_policy, policy, sizeof(srtp_policy_t));
1140*90e502c7SAndroid Build Coastguard Worker         if (policy->ssrc.type == ssrc_any_outbound) {
1141*90e502c7SAndroid Build Coastguard Worker             rcvr_policy->ssrc.type = ssrc_any_inbound;
1142*90e502c7SAndroid Build Coastguard Worker         }
1143*90e502c7SAndroid Build Coastguard Worker     }
1144*90e502c7SAndroid Build Coastguard Worker 
1145*90e502c7SAndroid Build Coastguard Worker     err_check(srtp_create(&srtp_rcvr, rcvr_policy));
1146*90e502c7SAndroid Build Coastguard Worker 
1147*90e502c7SAndroid Build Coastguard Worker     err_check(srtp_test_call_unprotect(srtp_rcvr, hdr, &len, use_mki));
1148*90e502c7SAndroid Build Coastguard Worker 
1149*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "after unprotection:\n%s",
1150*90e502c7SAndroid Build Coastguard Worker                 srtp_packet_to_string(hdr, len));
1151*90e502c7SAndroid Build Coastguard Worker 
1152*90e502c7SAndroid Build Coastguard Worker     /* verify that the unprotected packet matches the origial one */
1153*90e502c7SAndroid Build Coastguard Worker     for (i = 0; i < len; i++) {
1154*90e502c7SAndroid Build Coastguard Worker         if (((uint8_t *)hdr)[i] != ((uint8_t *)hdr2)[i]) {
1155*90e502c7SAndroid Build Coastguard Worker             fprintf(stdout, "mismatch at octet %d\n", i);
1156*90e502c7SAndroid Build Coastguard Worker             status = srtp_err_status_algo_fail;
1157*90e502c7SAndroid Build Coastguard Worker         }
1158*90e502c7SAndroid Build Coastguard Worker     }
1159*90e502c7SAndroid Build Coastguard Worker     if (status) {
1160*90e502c7SAndroid Build Coastguard Worker         free(hdr);
1161*90e502c7SAndroid Build Coastguard Worker         free(hdr2);
1162*90e502c7SAndroid Build Coastguard Worker         free(rcvr_policy);
1163*90e502c7SAndroid Build Coastguard Worker         return status;
1164*90e502c7SAndroid Build Coastguard Worker     }
1165*90e502c7SAndroid Build Coastguard Worker 
1166*90e502c7SAndroid Build Coastguard Worker     /*
1167*90e502c7SAndroid Build Coastguard Worker      * if the policy includes authentication, then test for false positives
1168*90e502c7SAndroid Build Coastguard Worker      */
1169*90e502c7SAndroid Build Coastguard Worker     if (policy->rtp.sec_serv & sec_serv_auth) {
1170*90e502c7SAndroid Build Coastguard Worker         char *data = ((char *)hdr) + (extension_header ? 24 : 12);
1171*90e502c7SAndroid Build Coastguard Worker 
1172*90e502c7SAndroid Build Coastguard Worker         printf("testing for false positives in replay check...");
1173*90e502c7SAndroid Build Coastguard Worker 
1174*90e502c7SAndroid Build Coastguard Worker         /* unprotect a second time - should fail with a replay error */
1175*90e502c7SAndroid Build Coastguard Worker         status =
1176*90e502c7SAndroid Build Coastguard Worker             srtp_test_call_unprotect(srtp_rcvr, hdr, &msg_len_enc, use_mki);
1177*90e502c7SAndroid Build Coastguard Worker         if (status != srtp_err_status_replay_fail) {
1178*90e502c7SAndroid Build Coastguard Worker             printf("failed with error code %d\n", status);
1179*90e502c7SAndroid Build Coastguard Worker             free(hdr);
1180*90e502c7SAndroid Build Coastguard Worker             free(hdr2);
1181*90e502c7SAndroid Build Coastguard Worker             free(rcvr_policy);
1182*90e502c7SAndroid Build Coastguard Worker             return status;
1183*90e502c7SAndroid Build Coastguard Worker         } else {
1184*90e502c7SAndroid Build Coastguard Worker             printf("passed\n");
1185*90e502c7SAndroid Build Coastguard Worker         }
1186*90e502c7SAndroid Build Coastguard Worker 
1187*90e502c7SAndroid Build Coastguard Worker         printf("testing for false positives in auth check...");
1188*90e502c7SAndroid Build Coastguard Worker 
1189*90e502c7SAndroid Build Coastguard Worker         /* increment sequence number in header */
1190*90e502c7SAndroid Build Coastguard Worker         hdr->seq++;
1191*90e502c7SAndroid Build Coastguard Worker 
1192*90e502c7SAndroid Build Coastguard Worker         /* apply protection */
1193*90e502c7SAndroid Build Coastguard Worker         err_check(srtp_test_call_protect(srtp_sender, hdr, &len, mki_index));
1194*90e502c7SAndroid Build Coastguard Worker 
1195*90e502c7SAndroid Build Coastguard Worker         /* flip bits in packet */
1196*90e502c7SAndroid Build Coastguard Worker         data[0] ^= 0xff;
1197*90e502c7SAndroid Build Coastguard Worker 
1198*90e502c7SAndroid Build Coastguard Worker         /* unprotect, and check for authentication failure */
1199*90e502c7SAndroid Build Coastguard Worker         status = srtp_test_call_unprotect(srtp_rcvr, hdr, &len, use_mki);
1200*90e502c7SAndroid Build Coastguard Worker         if (status != srtp_err_status_auth_fail) {
1201*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
1202*90e502c7SAndroid Build Coastguard Worker             free(hdr);
1203*90e502c7SAndroid Build Coastguard Worker             free(hdr2);
1204*90e502c7SAndroid Build Coastguard Worker             free(rcvr_policy);
1205*90e502c7SAndroid Build Coastguard Worker             return status;
1206*90e502c7SAndroid Build Coastguard Worker         } else {
1207*90e502c7SAndroid Build Coastguard Worker             printf("passed\n");
1208*90e502c7SAndroid Build Coastguard Worker         }
1209*90e502c7SAndroid Build Coastguard Worker     }
1210*90e502c7SAndroid Build Coastguard Worker 
1211*90e502c7SAndroid Build Coastguard Worker     err_check(srtp_dealloc(srtp_sender));
1212*90e502c7SAndroid Build Coastguard Worker     err_check(srtp_dealloc(srtp_rcvr));
1213*90e502c7SAndroid Build Coastguard Worker 
1214*90e502c7SAndroid Build Coastguard Worker     free(hdr);
1215*90e502c7SAndroid Build Coastguard Worker     free(hdr2);
1216*90e502c7SAndroid Build Coastguard Worker     free(rcvr_policy);
1217*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
1218*90e502c7SAndroid Build Coastguard Worker }
1219*90e502c7SAndroid Build Coastguard Worker 
srtcp_test(const srtp_policy_t * policy,int mki_index)1220*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtcp_test(const srtp_policy_t *policy, int mki_index)
1221*90e502c7SAndroid Build Coastguard Worker {
1222*90e502c7SAndroid Build Coastguard Worker     int i;
1223*90e502c7SAndroid Build Coastguard Worker     srtp_t srtcp_sender;
1224*90e502c7SAndroid Build Coastguard Worker     srtp_t srtcp_rcvr;
1225*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status = srtp_err_status_ok;
1226*90e502c7SAndroid Build Coastguard Worker     srtp_hdr_t *hdr, *hdr2;
1227*90e502c7SAndroid Build Coastguard Worker     uint8_t hdr_enc[64];
1228*90e502c7SAndroid Build Coastguard Worker     uint8_t *pkt_end;
1229*90e502c7SAndroid Build Coastguard Worker     int msg_len_octets, msg_len_enc, msg_len;
1230*90e502c7SAndroid Build Coastguard Worker     int len, len2;
1231*90e502c7SAndroid Build Coastguard Worker     uint32_t tag_length;
1232*90e502c7SAndroid Build Coastguard Worker     uint32_t ssrc;
1233*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t *rcvr_policy;
1234*90e502c7SAndroid Build Coastguard Worker     int use_mki = 0;
1235*90e502c7SAndroid Build Coastguard Worker 
1236*90e502c7SAndroid Build Coastguard Worker     if (mki_index >= 0)
1237*90e502c7SAndroid Build Coastguard Worker         use_mki = 1;
1238*90e502c7SAndroid Build Coastguard Worker 
1239*90e502c7SAndroid Build Coastguard Worker     err_check(srtp_create(&srtcp_sender, policy));
1240*90e502c7SAndroid Build Coastguard Worker 
1241*90e502c7SAndroid Build Coastguard Worker     /* print out policy */
1242*90e502c7SAndroid Build Coastguard Worker     err_check(srtp_session_print_policy(srtcp_sender));
1243*90e502c7SAndroid Build Coastguard Worker 
1244*90e502c7SAndroid Build Coastguard Worker     /*
1245*90e502c7SAndroid Build Coastguard Worker      * initialize data buffer, using the ssrc in the policy unless that
1246*90e502c7SAndroid Build Coastguard Worker      * value is a wildcard, in which case we'll just use an arbitrary
1247*90e502c7SAndroid Build Coastguard Worker      * one
1248*90e502c7SAndroid Build Coastguard Worker      */
1249*90e502c7SAndroid Build Coastguard Worker     if (policy->ssrc.type != ssrc_specific) {
1250*90e502c7SAndroid Build Coastguard Worker         ssrc = 0xdecafbad;
1251*90e502c7SAndroid Build Coastguard Worker     } else {
1252*90e502c7SAndroid Build Coastguard Worker         ssrc = policy->ssrc.value;
1253*90e502c7SAndroid Build Coastguard Worker     }
1254*90e502c7SAndroid Build Coastguard Worker     msg_len_octets = 28;
1255*90e502c7SAndroid Build Coastguard Worker     hdr = srtp_create_test_packet(msg_len_octets, ssrc, &len);
1256*90e502c7SAndroid Build Coastguard Worker     /* save message len */
1257*90e502c7SAndroid Build Coastguard Worker     msg_len = len;
1258*90e502c7SAndroid Build Coastguard Worker 
1259*90e502c7SAndroid Build Coastguard Worker     if (hdr == NULL) {
1260*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_alloc_fail;
1261*90e502c7SAndroid Build Coastguard Worker     }
1262*90e502c7SAndroid Build Coastguard Worker     hdr2 = srtp_create_test_packet(msg_len_octets, ssrc, &len2);
1263*90e502c7SAndroid Build Coastguard Worker     if (hdr2 == NULL) {
1264*90e502c7SAndroid Build Coastguard Worker         free(hdr);
1265*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_alloc_fail;
1266*90e502c7SAndroid Build Coastguard Worker     }
1267*90e502c7SAndroid Build Coastguard Worker 
1268*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "before protection:\n%s",
1269*90e502c7SAndroid Build Coastguard Worker                 srtp_packet_to_string(hdr, len));
1270*90e502c7SAndroid Build Coastguard Worker 
1271*90e502c7SAndroid Build Coastguard Worker #if PRINT_REFERENCE_PACKET
1272*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "reference packet before protection:\n%s",
1273*90e502c7SAndroid Build Coastguard Worker                 octet_string_hex_string((uint8_t *)hdr, len));
1274*90e502c7SAndroid Build Coastguard Worker #endif
1275*90e502c7SAndroid Build Coastguard Worker     err_check(srtp_test_call_protect_rtcp(srtcp_sender, hdr, &len, mki_index));
1276*90e502c7SAndroid Build Coastguard Worker 
1277*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "after protection:\n%s",
1278*90e502c7SAndroid Build Coastguard Worker                 srtp_packet_to_string(hdr, len));
1279*90e502c7SAndroid Build Coastguard Worker #if PRINT_REFERENCE_PACKET
1280*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "after protection:\n%s",
1281*90e502c7SAndroid Build Coastguard Worker                 octet_string_hex_string((uint8_t *)hdr, len));
1282*90e502c7SAndroid Build Coastguard Worker #endif
1283*90e502c7SAndroid Build Coastguard Worker 
1284*90e502c7SAndroid Build Coastguard Worker     /* save protected message and length */
1285*90e502c7SAndroid Build Coastguard Worker     memcpy(hdr_enc, hdr, len);
1286*90e502c7SAndroid Build Coastguard Worker     msg_len_enc = len;
1287*90e502c7SAndroid Build Coastguard Worker 
1288*90e502c7SAndroid Build Coastguard Worker     /*
1289*90e502c7SAndroid Build Coastguard Worker      * check for overrun of the srtp_protect() function
1290*90e502c7SAndroid Build Coastguard Worker      *
1291*90e502c7SAndroid Build Coastguard Worker      * The packet is followed by a value of 0xfffff; if the value of the
1292*90e502c7SAndroid Build Coastguard Worker      * data following the packet is different, then we know that the
1293*90e502c7SAndroid Build Coastguard Worker      * protect function is overwriting the end of the packet.
1294*90e502c7SAndroid Build Coastguard Worker      */
1295*90e502c7SAndroid Build Coastguard Worker     srtp_get_protect_rtcp_trailer_length(srtcp_sender, use_mki, mki_index,
1296*90e502c7SAndroid Build Coastguard Worker                                          &tag_length);
1297*90e502c7SAndroid Build Coastguard Worker     pkt_end = (uint8_t *)hdr + msg_len + tag_length;
1298*90e502c7SAndroid Build Coastguard Worker     for (i = 0; i < 4; i++) {
1299*90e502c7SAndroid Build Coastguard Worker         if (pkt_end[i] != 0xff) {
1300*90e502c7SAndroid Build Coastguard Worker             fprintf(stdout, "overwrite in srtp_protect_rtcp() function "
1301*90e502c7SAndroid Build Coastguard Worker                             "(expected %x, found %x in trailing octet %d)\n",
1302*90e502c7SAndroid Build Coastguard Worker                     0xff, ((uint8_t *)hdr)[i], i);
1303*90e502c7SAndroid Build Coastguard Worker             free(hdr);
1304*90e502c7SAndroid Build Coastguard Worker             free(hdr2);
1305*90e502c7SAndroid Build Coastguard Worker             return srtp_err_status_algo_fail;
1306*90e502c7SAndroid Build Coastguard Worker         }
1307*90e502c7SAndroid Build Coastguard Worker     }
1308*90e502c7SAndroid Build Coastguard Worker 
1309*90e502c7SAndroid Build Coastguard Worker     /*
1310*90e502c7SAndroid Build Coastguard Worker      * if the policy includes confidentiality, check that ciphertext is
1311*90e502c7SAndroid Build Coastguard Worker      * different than plaintext
1312*90e502c7SAndroid Build Coastguard Worker      *
1313*90e502c7SAndroid Build Coastguard Worker      * Note that this check will give false negatives, with some small
1314*90e502c7SAndroid Build Coastguard Worker      * probability, especially if the packets are short.  For that
1315*90e502c7SAndroid Build Coastguard Worker      * reason, we skip this check if the plaintext is less than four
1316*90e502c7SAndroid Build Coastguard Worker      * octets long.
1317*90e502c7SAndroid Build Coastguard Worker      */
1318*90e502c7SAndroid Build Coastguard Worker     if ((policy->rtcp.sec_serv & sec_serv_conf) && (msg_len_octets >= 4)) {
1319*90e502c7SAndroid Build Coastguard Worker         printf("testing that ciphertext is distinct from plaintext...");
1320*90e502c7SAndroid Build Coastguard Worker         status = srtp_err_status_algo_fail;
1321*90e502c7SAndroid Build Coastguard Worker         for (i = 12; i < msg_len_octets + 12; i++) {
1322*90e502c7SAndroid Build Coastguard Worker             if (((uint8_t *)hdr)[i] != ((uint8_t *)hdr2)[i]) {
1323*90e502c7SAndroid Build Coastguard Worker                 status = srtp_err_status_ok;
1324*90e502c7SAndroid Build Coastguard Worker             }
1325*90e502c7SAndroid Build Coastguard Worker         }
1326*90e502c7SAndroid Build Coastguard Worker         if (status) {
1327*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
1328*90e502c7SAndroid Build Coastguard Worker             free(hdr);
1329*90e502c7SAndroid Build Coastguard Worker             free(hdr2);
1330*90e502c7SAndroid Build Coastguard Worker             return status;
1331*90e502c7SAndroid Build Coastguard Worker         }
1332*90e502c7SAndroid Build Coastguard Worker         printf("passed\n");
1333*90e502c7SAndroid Build Coastguard Worker     }
1334*90e502c7SAndroid Build Coastguard Worker 
1335*90e502c7SAndroid Build Coastguard Worker     /*
1336*90e502c7SAndroid Build Coastguard Worker      * if the policy uses a 'wildcard' ssrc, then we need to make a copy
1337*90e502c7SAndroid Build Coastguard Worker      * of the policy that changes the direction to inbound
1338*90e502c7SAndroid Build Coastguard Worker      *
1339*90e502c7SAndroid Build Coastguard Worker      * we always copy the policy into the rcvr_policy, since otherwise
1340*90e502c7SAndroid Build Coastguard Worker      * the compiler would fret about the constness of the policy
1341*90e502c7SAndroid Build Coastguard Worker      */
1342*90e502c7SAndroid Build Coastguard Worker     rcvr_policy = (srtp_policy_t *)malloc(sizeof(srtp_policy_t));
1343*90e502c7SAndroid Build Coastguard Worker     if (rcvr_policy == NULL) {
1344*90e502c7SAndroid Build Coastguard Worker         free(hdr);
1345*90e502c7SAndroid Build Coastguard Worker         free(hdr2);
1346*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_alloc_fail;
1347*90e502c7SAndroid Build Coastguard Worker     }
1348*90e502c7SAndroid Build Coastguard Worker     memcpy(rcvr_policy, policy, sizeof(srtp_policy_t));
1349*90e502c7SAndroid Build Coastguard Worker     if (policy->ssrc.type == ssrc_any_outbound) {
1350*90e502c7SAndroid Build Coastguard Worker         rcvr_policy->ssrc.type = ssrc_any_inbound;
1351*90e502c7SAndroid Build Coastguard Worker     }
1352*90e502c7SAndroid Build Coastguard Worker 
1353*90e502c7SAndroid Build Coastguard Worker     err_check(srtp_create(&srtcp_rcvr, rcvr_policy));
1354*90e502c7SAndroid Build Coastguard Worker 
1355*90e502c7SAndroid Build Coastguard Worker     err_check(srtp_test_call_unprotect_rtcp(srtcp_rcvr, hdr, &len, use_mki));
1356*90e502c7SAndroid Build Coastguard Worker 
1357*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "after unprotection:\n%s",
1358*90e502c7SAndroid Build Coastguard Worker                 srtp_packet_to_string(hdr, len));
1359*90e502c7SAndroid Build Coastguard Worker 
1360*90e502c7SAndroid Build Coastguard Worker     /* verify that the unprotected packet matches the origial one */
1361*90e502c7SAndroid Build Coastguard Worker     for (i = 0; i < len; i++) {
1362*90e502c7SAndroid Build Coastguard Worker         if (((uint8_t *)hdr)[i] != ((uint8_t *)hdr2)[i]) {
1363*90e502c7SAndroid Build Coastguard Worker             fprintf(stdout, "mismatch at octet %d\n", i);
1364*90e502c7SAndroid Build Coastguard Worker             status = srtp_err_status_algo_fail;
1365*90e502c7SAndroid Build Coastguard Worker         }
1366*90e502c7SAndroid Build Coastguard Worker     }
1367*90e502c7SAndroid Build Coastguard Worker     if (status) {
1368*90e502c7SAndroid Build Coastguard Worker         free(hdr);
1369*90e502c7SAndroid Build Coastguard Worker         free(hdr2);
1370*90e502c7SAndroid Build Coastguard Worker         free(rcvr_policy);
1371*90e502c7SAndroid Build Coastguard Worker         return status;
1372*90e502c7SAndroid Build Coastguard Worker     }
1373*90e502c7SAndroid Build Coastguard Worker 
1374*90e502c7SAndroid Build Coastguard Worker     /*
1375*90e502c7SAndroid Build Coastguard Worker      * if the policy includes authentication, then test for false positives
1376*90e502c7SAndroid Build Coastguard Worker      */
1377*90e502c7SAndroid Build Coastguard Worker     if (policy->rtp.sec_serv & sec_serv_auth) {
1378*90e502c7SAndroid Build Coastguard Worker         char *data = ((char *)hdr) + 12;
1379*90e502c7SAndroid Build Coastguard Worker 
1380*90e502c7SAndroid Build Coastguard Worker         printf("testing for false positives in replay check...");
1381*90e502c7SAndroid Build Coastguard Worker 
1382*90e502c7SAndroid Build Coastguard Worker         /* unprotect a second time - should fail with a replay error */
1383*90e502c7SAndroid Build Coastguard Worker         status = srtp_test_call_unprotect_rtcp(srtcp_rcvr, hdr, &msg_len_enc,
1384*90e502c7SAndroid Build Coastguard Worker                                                use_mki);
1385*90e502c7SAndroid Build Coastguard Worker         if (status != srtp_err_status_replay_fail) {
1386*90e502c7SAndroid Build Coastguard Worker             printf("failed with error code %d\n", status);
1387*90e502c7SAndroid Build Coastguard Worker             free(hdr);
1388*90e502c7SAndroid Build Coastguard Worker             free(hdr2);
1389*90e502c7SAndroid Build Coastguard Worker             free(rcvr_policy);
1390*90e502c7SAndroid Build Coastguard Worker             return status;
1391*90e502c7SAndroid Build Coastguard Worker         } else {
1392*90e502c7SAndroid Build Coastguard Worker             printf("passed\n");
1393*90e502c7SAndroid Build Coastguard Worker         }
1394*90e502c7SAndroid Build Coastguard Worker 
1395*90e502c7SAndroid Build Coastguard Worker         printf("testing for false positives in auth check...");
1396*90e502c7SAndroid Build Coastguard Worker 
1397*90e502c7SAndroid Build Coastguard Worker         /* increment sequence number in header */
1398*90e502c7SAndroid Build Coastguard Worker         hdr->seq++;
1399*90e502c7SAndroid Build Coastguard Worker 
1400*90e502c7SAndroid Build Coastguard Worker         /* apply protection */
1401*90e502c7SAndroid Build Coastguard Worker         err_check(
1402*90e502c7SAndroid Build Coastguard Worker             srtp_test_call_protect_rtcp(srtcp_sender, hdr, &len, mki_index));
1403*90e502c7SAndroid Build Coastguard Worker 
1404*90e502c7SAndroid Build Coastguard Worker         /* flip bits in packet */
1405*90e502c7SAndroid Build Coastguard Worker         data[0] ^= 0xff;
1406*90e502c7SAndroid Build Coastguard Worker 
1407*90e502c7SAndroid Build Coastguard Worker         /* unprotect, and check for authentication failure */
1408*90e502c7SAndroid Build Coastguard Worker         status = srtp_test_call_unprotect_rtcp(srtcp_rcvr, hdr, &len, use_mki);
1409*90e502c7SAndroid Build Coastguard Worker         if (status != srtp_err_status_auth_fail) {
1410*90e502c7SAndroid Build Coastguard Worker             printf("failed\n");
1411*90e502c7SAndroid Build Coastguard Worker             free(hdr);
1412*90e502c7SAndroid Build Coastguard Worker             free(hdr2);
1413*90e502c7SAndroid Build Coastguard Worker             free(rcvr_policy);
1414*90e502c7SAndroid Build Coastguard Worker             return status;
1415*90e502c7SAndroid Build Coastguard Worker         } else {
1416*90e502c7SAndroid Build Coastguard Worker             printf("passed\n");
1417*90e502c7SAndroid Build Coastguard Worker         }
1418*90e502c7SAndroid Build Coastguard Worker     }
1419*90e502c7SAndroid Build Coastguard Worker 
1420*90e502c7SAndroid Build Coastguard Worker     err_check(srtp_dealloc(srtcp_sender));
1421*90e502c7SAndroid Build Coastguard Worker     err_check(srtp_dealloc(srtcp_rcvr));
1422*90e502c7SAndroid Build Coastguard Worker 
1423*90e502c7SAndroid Build Coastguard Worker     free(hdr);
1424*90e502c7SAndroid Build Coastguard Worker     free(hdr2);
1425*90e502c7SAndroid Build Coastguard Worker     free(rcvr_policy);
1426*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
1427*90e502c7SAndroid Build Coastguard Worker }
1428*90e502c7SAndroid Build Coastguard Worker 
srtp_session_print_policy(srtp_t srtp)1429*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_session_print_policy(srtp_t srtp)
1430*90e502c7SAndroid Build Coastguard Worker {
1431*90e502c7SAndroid Build Coastguard Worker     char *serv_descr[4] = { "none", "confidentiality", "authentication",
1432*90e502c7SAndroid Build Coastguard Worker                             "confidentiality and authentication" };
1433*90e502c7SAndroid Build Coastguard Worker     char *direction[3] = { "unknown", "outbound", "inbound" };
1434*90e502c7SAndroid Build Coastguard Worker     srtp_stream_t stream;
1435*90e502c7SAndroid Build Coastguard Worker     srtp_session_keys_t *session_keys = NULL;
1436*90e502c7SAndroid Build Coastguard Worker 
1437*90e502c7SAndroid Build Coastguard Worker     /* sanity checking */
1438*90e502c7SAndroid Build Coastguard Worker     if (srtp == NULL) {
1439*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
1440*90e502c7SAndroid Build Coastguard Worker     }
1441*90e502c7SAndroid Build Coastguard Worker 
1442*90e502c7SAndroid Build Coastguard Worker     /* if there's a template stream, print it out */
1443*90e502c7SAndroid Build Coastguard Worker     if (srtp->stream_template != NULL) {
1444*90e502c7SAndroid Build Coastguard Worker         stream = srtp->stream_template;
1445*90e502c7SAndroid Build Coastguard Worker         session_keys = &stream->session_keys[0];
1446*90e502c7SAndroid Build Coastguard Worker         printf("# SSRC:          any %s\r\n"
1447*90e502c7SAndroid Build Coastguard Worker                "# rtp cipher:    %s\r\n"
1448*90e502c7SAndroid Build Coastguard Worker                "# rtp auth:      %s\r\n"
1449*90e502c7SAndroid Build Coastguard Worker                "# rtp services:  %s\r\n"
1450*90e502c7SAndroid Build Coastguard Worker                "# rtcp cipher:   %s\r\n"
1451*90e502c7SAndroid Build Coastguard Worker                "# rtcp auth:     %s\r\n"
1452*90e502c7SAndroid Build Coastguard Worker                "# rtcp services: %s\r\n"
1453*90e502c7SAndroid Build Coastguard Worker                "# window size:   %lu\r\n"
1454*90e502c7SAndroid Build Coastguard Worker                "# tx rtx allowed:%s\r\n",
1455*90e502c7SAndroid Build Coastguard Worker                direction[stream->direction],
1456*90e502c7SAndroid Build Coastguard Worker                session_keys->rtp_cipher->type->description,
1457*90e502c7SAndroid Build Coastguard Worker                session_keys->rtp_auth->type->description,
1458*90e502c7SAndroid Build Coastguard Worker                serv_descr[stream->rtp_services],
1459*90e502c7SAndroid Build Coastguard Worker                session_keys->rtcp_cipher->type->description,
1460*90e502c7SAndroid Build Coastguard Worker                session_keys->rtcp_auth->type->description,
1461*90e502c7SAndroid Build Coastguard Worker                serv_descr[stream->rtcp_services],
1462*90e502c7SAndroid Build Coastguard Worker                srtp_rdbx_get_window_size(&stream->rtp_rdbx),
1463*90e502c7SAndroid Build Coastguard Worker                stream->allow_repeat_tx ? "true" : "false");
1464*90e502c7SAndroid Build Coastguard Worker 
1465*90e502c7SAndroid Build Coastguard Worker         printf("# Encrypted extension headers: ");
1466*90e502c7SAndroid Build Coastguard Worker         if (stream->enc_xtn_hdr && stream->enc_xtn_hdr_count > 0) {
1467*90e502c7SAndroid Build Coastguard Worker             int *enc_xtn_hdr = stream->enc_xtn_hdr;
1468*90e502c7SAndroid Build Coastguard Worker             int count = stream->enc_xtn_hdr_count;
1469*90e502c7SAndroid Build Coastguard Worker             while (count > 0) {
1470*90e502c7SAndroid Build Coastguard Worker                 printf("%d ", *enc_xtn_hdr);
1471*90e502c7SAndroid Build Coastguard Worker                 enc_xtn_hdr++;
1472*90e502c7SAndroid Build Coastguard Worker                 count--;
1473*90e502c7SAndroid Build Coastguard Worker             }
1474*90e502c7SAndroid Build Coastguard Worker             printf("\n");
1475*90e502c7SAndroid Build Coastguard Worker         } else {
1476*90e502c7SAndroid Build Coastguard Worker             printf("none\n");
1477*90e502c7SAndroid Build Coastguard Worker         }
1478*90e502c7SAndroid Build Coastguard Worker     }
1479*90e502c7SAndroid Build Coastguard Worker 
1480*90e502c7SAndroid Build Coastguard Worker     /* loop over streams in session, printing the policy of each */
1481*90e502c7SAndroid Build Coastguard Worker     stream = srtp->stream_list;
1482*90e502c7SAndroid Build Coastguard Worker     while (stream != NULL) {
1483*90e502c7SAndroid Build Coastguard Worker         if (stream->rtp_services > sec_serv_conf_and_auth) {
1484*90e502c7SAndroid Build Coastguard Worker             return srtp_err_status_bad_param;
1485*90e502c7SAndroid Build Coastguard Worker         }
1486*90e502c7SAndroid Build Coastguard Worker         session_keys = &stream->session_keys[0];
1487*90e502c7SAndroid Build Coastguard Worker 
1488*90e502c7SAndroid Build Coastguard Worker         printf("# SSRC:          0x%08x\r\n"
1489*90e502c7SAndroid Build Coastguard Worker                "# rtp cipher:    %s\r\n"
1490*90e502c7SAndroid Build Coastguard Worker                "# rtp auth:      %s\r\n"
1491*90e502c7SAndroid Build Coastguard Worker                "# rtp services:  %s\r\n"
1492*90e502c7SAndroid Build Coastguard Worker                "# rtcp cipher:   %s\r\n"
1493*90e502c7SAndroid Build Coastguard Worker                "# rtcp auth:     %s\r\n"
1494*90e502c7SAndroid Build Coastguard Worker                "# rtcp services: %s\r\n"
1495*90e502c7SAndroid Build Coastguard Worker                "# window size:   %lu\r\n"
1496*90e502c7SAndroid Build Coastguard Worker                "# tx rtx allowed:%s\r\n",
1497*90e502c7SAndroid Build Coastguard Worker                stream->ssrc, session_keys->rtp_cipher->type->description,
1498*90e502c7SAndroid Build Coastguard Worker                session_keys->rtp_auth->type->description,
1499*90e502c7SAndroid Build Coastguard Worker                serv_descr[stream->rtp_services],
1500*90e502c7SAndroid Build Coastguard Worker                session_keys->rtcp_cipher->type->description,
1501*90e502c7SAndroid Build Coastguard Worker                session_keys->rtcp_auth->type->description,
1502*90e502c7SAndroid Build Coastguard Worker                serv_descr[stream->rtcp_services],
1503*90e502c7SAndroid Build Coastguard Worker                srtp_rdbx_get_window_size(&stream->rtp_rdbx),
1504*90e502c7SAndroid Build Coastguard Worker                stream->allow_repeat_tx ? "true" : "false");
1505*90e502c7SAndroid Build Coastguard Worker 
1506*90e502c7SAndroid Build Coastguard Worker         printf("# Encrypted extension headers: ");
1507*90e502c7SAndroid Build Coastguard Worker         if (stream->enc_xtn_hdr && stream->enc_xtn_hdr_count > 0) {
1508*90e502c7SAndroid Build Coastguard Worker             int *enc_xtn_hdr = stream->enc_xtn_hdr;
1509*90e502c7SAndroid Build Coastguard Worker             int count = stream->enc_xtn_hdr_count;
1510*90e502c7SAndroid Build Coastguard Worker             while (count > 0) {
1511*90e502c7SAndroid Build Coastguard Worker                 printf("%d ", *enc_xtn_hdr);
1512*90e502c7SAndroid Build Coastguard Worker                 enc_xtn_hdr++;
1513*90e502c7SAndroid Build Coastguard Worker                 count--;
1514*90e502c7SAndroid Build Coastguard Worker             }
1515*90e502c7SAndroid Build Coastguard Worker             printf("\n");
1516*90e502c7SAndroid Build Coastguard Worker         } else {
1517*90e502c7SAndroid Build Coastguard Worker             printf("none\n");
1518*90e502c7SAndroid Build Coastguard Worker         }
1519*90e502c7SAndroid Build Coastguard Worker 
1520*90e502c7SAndroid Build Coastguard Worker         /* advance to next stream in the list */
1521*90e502c7SAndroid Build Coastguard Worker         stream = stream->next;
1522*90e502c7SAndroid Build Coastguard Worker     }
1523*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
1524*90e502c7SAndroid Build Coastguard Worker }
1525*90e502c7SAndroid Build Coastguard Worker 
srtp_print_policy(const srtp_policy_t * policy)1526*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_print_policy(const srtp_policy_t *policy)
1527*90e502c7SAndroid Build Coastguard Worker {
1528*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
1529*90e502c7SAndroid Build Coastguard Worker     srtp_t session;
1530*90e502c7SAndroid Build Coastguard Worker 
1531*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&session, policy);
1532*90e502c7SAndroid Build Coastguard Worker     if (status) {
1533*90e502c7SAndroid Build Coastguard Worker         return status;
1534*90e502c7SAndroid Build Coastguard Worker     }
1535*90e502c7SAndroid Build Coastguard Worker     status = srtp_session_print_policy(session);
1536*90e502c7SAndroid Build Coastguard Worker     if (status) {
1537*90e502c7SAndroid Build Coastguard Worker         return status;
1538*90e502c7SAndroid Build Coastguard Worker     }
1539*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(session);
1540*90e502c7SAndroid Build Coastguard Worker     if (status) {
1541*90e502c7SAndroid Build Coastguard Worker         return status;
1542*90e502c7SAndroid Build Coastguard Worker     }
1543*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
1544*90e502c7SAndroid Build Coastguard Worker }
1545*90e502c7SAndroid Build Coastguard Worker 
1546*90e502c7SAndroid Build Coastguard Worker /*
1547*90e502c7SAndroid Build Coastguard Worker  * srtp_print_packet(...) is for debugging only
1548*90e502c7SAndroid Build Coastguard Worker  * it prints an RTP packet to the stdout
1549*90e502c7SAndroid Build Coastguard Worker  *
1550*90e502c7SAndroid Build Coastguard Worker  * note that this function is *not* threadsafe
1551*90e502c7SAndroid Build Coastguard Worker  */
1552*90e502c7SAndroid Build Coastguard Worker 
1553*90e502c7SAndroid Build Coastguard Worker #include <stdio.h>
1554*90e502c7SAndroid Build Coastguard Worker 
1555*90e502c7SAndroid Build Coastguard Worker #define MTU 2048
1556*90e502c7SAndroid Build Coastguard Worker 
1557*90e502c7SAndroid Build Coastguard Worker char packet_string[MTU];
1558*90e502c7SAndroid Build Coastguard Worker 
srtp_packet_to_string(srtp_hdr_t * hdr,int pkt_octet_len)1559*90e502c7SAndroid Build Coastguard Worker char *srtp_packet_to_string(srtp_hdr_t *hdr, int pkt_octet_len)
1560*90e502c7SAndroid Build Coastguard Worker {
1561*90e502c7SAndroid Build Coastguard Worker     int octets_in_rtp_header = 12;
1562*90e502c7SAndroid Build Coastguard Worker     uint8_t *data = ((uint8_t *)hdr) + octets_in_rtp_header;
1563*90e502c7SAndroid Build Coastguard Worker     int hex_len = pkt_octet_len - octets_in_rtp_header;
1564*90e502c7SAndroid Build Coastguard Worker 
1565*90e502c7SAndroid Build Coastguard Worker     /* sanity checking */
1566*90e502c7SAndroid Build Coastguard Worker     if ((hdr == NULL) || (pkt_octet_len > MTU)) {
1567*90e502c7SAndroid Build Coastguard Worker         return NULL;
1568*90e502c7SAndroid Build Coastguard Worker     }
1569*90e502c7SAndroid Build Coastguard Worker 
1570*90e502c7SAndroid Build Coastguard Worker     /* write packet into string */
1571*90e502c7SAndroid Build Coastguard Worker     sprintf(packet_string, "(s)rtp packet: {\n"
1572*90e502c7SAndroid Build Coastguard Worker                            "   version:\t%d\n"
1573*90e502c7SAndroid Build Coastguard Worker                            "   p:\t\t%d\n"
1574*90e502c7SAndroid Build Coastguard Worker                            "   x:\t\t%d\n"
1575*90e502c7SAndroid Build Coastguard Worker                            "   cc:\t\t%d\n"
1576*90e502c7SAndroid Build Coastguard Worker                            "   m:\t\t%d\n"
1577*90e502c7SAndroid Build Coastguard Worker                            "   pt:\t\t%x\n"
1578*90e502c7SAndroid Build Coastguard Worker                            "   seq:\t\t%x\n"
1579*90e502c7SAndroid Build Coastguard Worker                            "   ts:\t\t%x\n"
1580*90e502c7SAndroid Build Coastguard Worker                            "   ssrc:\t%x\n"
1581*90e502c7SAndroid Build Coastguard Worker                            "   data:\t%s\n"
1582*90e502c7SAndroid Build Coastguard Worker                            "} (%d octets in total)\n",
1583*90e502c7SAndroid Build Coastguard Worker             hdr->version, hdr->p, hdr->x, hdr->cc, hdr->m, hdr->pt, hdr->seq,
1584*90e502c7SAndroid Build Coastguard Worker             hdr->ts, hdr->ssrc, octet_string_hex_string(data, hex_len),
1585*90e502c7SAndroid Build Coastguard Worker             pkt_octet_len);
1586*90e502c7SAndroid Build Coastguard Worker 
1587*90e502c7SAndroid Build Coastguard Worker     return packet_string;
1588*90e502c7SAndroid Build Coastguard Worker }
1589*90e502c7SAndroid Build Coastguard Worker 
1590*90e502c7SAndroid Build Coastguard Worker /*
1591*90e502c7SAndroid Build Coastguard Worker  * mips_estimate() is a simple function to estimate the number of
1592*90e502c7SAndroid Build Coastguard Worker  * instructions per second that the host can perform.  note that this
1593*90e502c7SAndroid Build Coastguard Worker  * function can be grossly wrong; you may want to have a manual sanity
1594*90e502c7SAndroid Build Coastguard Worker  * check of its output!
1595*90e502c7SAndroid Build Coastguard Worker  *
1596*90e502c7SAndroid Build Coastguard Worker  * the 'ignore' pointer is there to convince the compiler to not just
1597*90e502c7SAndroid Build Coastguard Worker  * optimize away the function
1598*90e502c7SAndroid Build Coastguard Worker  */
1599*90e502c7SAndroid Build Coastguard Worker 
mips_estimate(int num_trials,int * ignore)1600*90e502c7SAndroid Build Coastguard Worker double mips_estimate(int num_trials, int *ignore)
1601*90e502c7SAndroid Build Coastguard Worker {
1602*90e502c7SAndroid Build Coastguard Worker     clock_t t;
1603*90e502c7SAndroid Build Coastguard Worker     volatile int i, sum;
1604*90e502c7SAndroid Build Coastguard Worker 
1605*90e502c7SAndroid Build Coastguard Worker     sum = 0;
1606*90e502c7SAndroid Build Coastguard Worker     t = clock();
1607*90e502c7SAndroid Build Coastguard Worker     for (i = 0; i < num_trials; i++) {
1608*90e502c7SAndroid Build Coastguard Worker         sum += i;
1609*90e502c7SAndroid Build Coastguard Worker     }
1610*90e502c7SAndroid Build Coastguard Worker     t = clock() - t;
1611*90e502c7SAndroid Build Coastguard Worker     if (t < 1) {
1612*90e502c7SAndroid Build Coastguard Worker         t = 1;
1613*90e502c7SAndroid Build Coastguard Worker     }
1614*90e502c7SAndroid Build Coastguard Worker 
1615*90e502c7SAndroid Build Coastguard Worker     /*   printf("%d\n", sum); */
1616*90e502c7SAndroid Build Coastguard Worker     *ignore = sum;
1617*90e502c7SAndroid Build Coastguard Worker 
1618*90e502c7SAndroid Build Coastguard Worker     return (double)num_trials * CLOCKS_PER_SEC / t;
1619*90e502c7SAndroid Build Coastguard Worker }
1620*90e502c7SAndroid Build Coastguard Worker 
1621*90e502c7SAndroid Build Coastguard Worker /*
1622*90e502c7SAndroid Build Coastguard Worker  * srtp_validate() verifies the correctness of libsrtp by comparing
1623*90e502c7SAndroid Build Coastguard Worker  * some computed packets against some pre-computed reference values.
1624*90e502c7SAndroid Build Coastguard Worker  * These packets were made with the default SRTP policy.
1625*90e502c7SAndroid Build Coastguard Worker  */
1626*90e502c7SAndroid Build Coastguard Worker 
srtp_validate()1627*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_validate()
1628*90e502c7SAndroid Build Coastguard Worker {
1629*90e502c7SAndroid Build Coastguard Worker     // clang-format off
1630*90e502c7SAndroid Build Coastguard Worker     uint8_t srtp_plaintext_ref[28] = {
1631*90e502c7SAndroid Build Coastguard Worker         0x80, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad,
1632*90e502c7SAndroid Build Coastguard Worker         0xca, 0xfe, 0xba, 0xbe, 0xab, 0xab, 0xab, 0xab,
1633*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
1634*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab
1635*90e502c7SAndroid Build Coastguard Worker     };
1636*90e502c7SAndroid Build Coastguard Worker     uint8_t srtp_plaintext[38] = {
1637*90e502c7SAndroid Build Coastguard Worker         0x80, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad,
1638*90e502c7SAndroid Build Coastguard Worker         0xca, 0xfe, 0xba, 0xbe, 0xab, 0xab, 0xab, 0xab,
1639*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
1640*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0x00, 0x00, 0x00, 0x00,
1641*90e502c7SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1642*90e502c7SAndroid Build Coastguard Worker     };
1643*90e502c7SAndroid Build Coastguard Worker     uint8_t srtp_ciphertext[38] = {
1644*90e502c7SAndroid Build Coastguard Worker         0x80, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad,
1645*90e502c7SAndroid Build Coastguard Worker         0xca, 0xfe, 0xba, 0xbe, 0x4e, 0x55, 0xdc, 0x4c,
1646*90e502c7SAndroid Build Coastguard Worker         0xe7, 0x99, 0x78, 0xd8, 0x8c, 0xa4, 0xd2, 0x15,
1647*90e502c7SAndroid Build Coastguard Worker         0x94, 0x9d, 0x24, 0x02, 0xb7, 0x8d, 0x6a, 0xcc,
1648*90e502c7SAndroid Build Coastguard Worker         0x99, 0xea, 0x17, 0x9b, 0x8d, 0xbb
1649*90e502c7SAndroid Build Coastguard Worker     };
1650*90e502c7SAndroid Build Coastguard Worker     uint8_t rtcp_plaintext_ref[24] = {
1651*90e502c7SAndroid Build Coastguard Worker         0x81, 0xc8, 0x00, 0x0b, 0xca, 0xfe, 0xba, 0xbe,
1652*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
1653*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
1654*90e502c7SAndroid Build Coastguard Worker     };
1655*90e502c7SAndroid Build Coastguard Worker     uint8_t rtcp_plaintext[38] = {
1656*90e502c7SAndroid Build Coastguard Worker         0x81, 0xc8, 0x00, 0x0b, 0xca, 0xfe, 0xba, 0xbe,
1657*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
1658*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
1659*90e502c7SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1660*90e502c7SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1661*90e502c7SAndroid Build Coastguard Worker     };
1662*90e502c7SAndroid Build Coastguard Worker     uint8_t srtcp_ciphertext[38] = {
1663*90e502c7SAndroid Build Coastguard Worker         0x81, 0xc8, 0x00, 0x0b, 0xca, 0xfe, 0xba, 0xbe,
1664*90e502c7SAndroid Build Coastguard Worker         0x71, 0x28, 0x03, 0x5b, 0xe4, 0x87, 0xb9, 0xbd,
1665*90e502c7SAndroid Build Coastguard Worker         0xbe, 0xf8, 0x90, 0x41, 0xf9, 0x77, 0xa5, 0xa8,
1666*90e502c7SAndroid Build Coastguard Worker         0x80, 0x00, 0x00, 0x01, 0x99, 0x3e, 0x08, 0xcd,
1667*90e502c7SAndroid Build Coastguard Worker         0x54, 0xd6, 0xc1, 0x23, 0x07, 0x98
1668*90e502c7SAndroid Build Coastguard Worker     };
1669*90e502c7SAndroid Build Coastguard Worker     // clang-format on
1670*90e502c7SAndroid Build Coastguard Worker 
1671*90e502c7SAndroid Build Coastguard Worker     srtp_t srtp_snd, srtp_recv;
1672*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
1673*90e502c7SAndroid Build Coastguard Worker     int len;
1674*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t policy;
1675*90e502c7SAndroid Build Coastguard Worker 
1676*90e502c7SAndroid Build Coastguard Worker     /*
1677*90e502c7SAndroid Build Coastguard Worker      * create a session with a single stream using the default srtp
1678*90e502c7SAndroid Build Coastguard Worker      * policy and with the SSRC value 0xcafebabe
1679*90e502c7SAndroid Build Coastguard Worker      */
1680*90e502c7SAndroid Build Coastguard Worker     memset(&policy, 0, sizeof(policy));
1681*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtp_default(&policy.rtp);
1682*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtcp_default(&policy.rtcp);
1683*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.type = ssrc_specific;
1684*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.value = 0xcafebabe;
1685*90e502c7SAndroid Build Coastguard Worker     policy.key = test_key;
1686*90e502c7SAndroid Build Coastguard Worker     policy.ekt = NULL;
1687*90e502c7SAndroid Build Coastguard Worker     policy.window_size = 128;
1688*90e502c7SAndroid Build Coastguard Worker     policy.allow_repeat_tx = 0;
1689*90e502c7SAndroid Build Coastguard Worker     policy.next = NULL;
1690*90e502c7SAndroid Build Coastguard Worker 
1691*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&srtp_snd, &policy);
1692*90e502c7SAndroid Build Coastguard Worker     if (status) {
1693*90e502c7SAndroid Build Coastguard Worker         return status;
1694*90e502c7SAndroid Build Coastguard Worker     }
1695*90e502c7SAndroid Build Coastguard Worker 
1696*90e502c7SAndroid Build Coastguard Worker     /*
1697*90e502c7SAndroid Build Coastguard Worker      * protect plaintext, then compare with ciphertext
1698*90e502c7SAndroid Build Coastguard Worker      */
1699*90e502c7SAndroid Build Coastguard Worker     len = 28;
1700*90e502c7SAndroid Build Coastguard Worker     status = srtp_protect(srtp_snd, srtp_plaintext, &len);
1701*90e502c7SAndroid Build Coastguard Worker     if (status || (len != 38)) {
1702*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
1703*90e502c7SAndroid Build Coastguard Worker     }
1704*90e502c7SAndroid Build Coastguard Worker 
1705*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "ciphertext:\n  %s",
1706*90e502c7SAndroid Build Coastguard Worker                 octet_string_hex_string(srtp_plaintext, len));
1707*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "ciphertext reference:\n  %s",
1708*90e502c7SAndroid Build Coastguard Worker                 octet_string_hex_string(srtp_ciphertext, len));
1709*90e502c7SAndroid Build Coastguard Worker 
1710*90e502c7SAndroid Build Coastguard Worker     if (srtp_octet_string_is_eq(srtp_plaintext, srtp_ciphertext, len)) {
1711*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
1712*90e502c7SAndroid Build Coastguard Worker     }
1713*90e502c7SAndroid Build Coastguard Worker 
1714*90e502c7SAndroid Build Coastguard Worker     /*
1715*90e502c7SAndroid Build Coastguard Worker      * protect plaintext rtcp, then compare with srtcp ciphertext
1716*90e502c7SAndroid Build Coastguard Worker      */
1717*90e502c7SAndroid Build Coastguard Worker     len = 24;
1718*90e502c7SAndroid Build Coastguard Worker     status = srtp_protect_rtcp(srtp_snd, rtcp_plaintext, &len);
1719*90e502c7SAndroid Build Coastguard Worker     if (status || (len != 38)) {
1720*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
1721*90e502c7SAndroid Build Coastguard Worker     }
1722*90e502c7SAndroid Build Coastguard Worker 
1723*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "srtcp ciphertext:\n  %s",
1724*90e502c7SAndroid Build Coastguard Worker                 octet_string_hex_string(rtcp_plaintext, len));
1725*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "srtcp ciphertext reference:\n  %s",
1726*90e502c7SAndroid Build Coastguard Worker                 octet_string_hex_string(srtcp_ciphertext, len));
1727*90e502c7SAndroid Build Coastguard Worker 
1728*90e502c7SAndroid Build Coastguard Worker     if (srtp_octet_string_is_eq(rtcp_plaintext, srtcp_ciphertext, len)) {
1729*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
1730*90e502c7SAndroid Build Coastguard Worker     }
1731*90e502c7SAndroid Build Coastguard Worker 
1732*90e502c7SAndroid Build Coastguard Worker     /*
1733*90e502c7SAndroid Build Coastguard Worker      * create a receiver session context comparable to the one created
1734*90e502c7SAndroid Build Coastguard Worker      * above - we need to do this so that the replay checking doesn't
1735*90e502c7SAndroid Build Coastguard Worker      * complain
1736*90e502c7SAndroid Build Coastguard Worker      */
1737*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&srtp_recv, &policy);
1738*90e502c7SAndroid Build Coastguard Worker     if (status) {
1739*90e502c7SAndroid Build Coastguard Worker         return status;
1740*90e502c7SAndroid Build Coastguard Worker     }
1741*90e502c7SAndroid Build Coastguard Worker 
1742*90e502c7SAndroid Build Coastguard Worker     /*
1743*90e502c7SAndroid Build Coastguard Worker      * unprotect ciphertext, then compare with plaintext
1744*90e502c7SAndroid Build Coastguard Worker      */
1745*90e502c7SAndroid Build Coastguard Worker     status = srtp_unprotect(srtp_recv, srtp_ciphertext, &len);
1746*90e502c7SAndroid Build Coastguard Worker     if (status || (len != 28)) {
1747*90e502c7SAndroid Build Coastguard Worker         return status;
1748*90e502c7SAndroid Build Coastguard Worker     }
1749*90e502c7SAndroid Build Coastguard Worker 
1750*90e502c7SAndroid Build Coastguard Worker     if (srtp_octet_string_is_eq(srtp_ciphertext, srtp_plaintext_ref, len)) {
1751*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
1752*90e502c7SAndroid Build Coastguard Worker     }
1753*90e502c7SAndroid Build Coastguard Worker 
1754*90e502c7SAndroid Build Coastguard Worker     /*
1755*90e502c7SAndroid Build Coastguard Worker      * unprotect srtcp ciphertext, then compare with rtcp plaintext
1756*90e502c7SAndroid Build Coastguard Worker      */
1757*90e502c7SAndroid Build Coastguard Worker     len = 38;
1758*90e502c7SAndroid Build Coastguard Worker     status = srtp_unprotect_rtcp(srtp_recv, srtcp_ciphertext, &len);
1759*90e502c7SAndroid Build Coastguard Worker     if (status || (len != 24)) {
1760*90e502c7SAndroid Build Coastguard Worker         return status;
1761*90e502c7SAndroid Build Coastguard Worker     }
1762*90e502c7SAndroid Build Coastguard Worker 
1763*90e502c7SAndroid Build Coastguard Worker     if (srtp_octet_string_is_eq(srtcp_ciphertext, rtcp_plaintext_ref, len)) {
1764*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
1765*90e502c7SAndroid Build Coastguard Worker     }
1766*90e502c7SAndroid Build Coastguard Worker 
1767*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(srtp_snd);
1768*90e502c7SAndroid Build Coastguard Worker     if (status) {
1769*90e502c7SAndroid Build Coastguard Worker         return status;
1770*90e502c7SAndroid Build Coastguard Worker     }
1771*90e502c7SAndroid Build Coastguard Worker 
1772*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(srtp_recv);
1773*90e502c7SAndroid Build Coastguard Worker     if (status) {
1774*90e502c7SAndroid Build Coastguard Worker         return status;
1775*90e502c7SAndroid Build Coastguard Worker     }
1776*90e502c7SAndroid Build Coastguard Worker 
1777*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
1778*90e502c7SAndroid Build Coastguard Worker }
1779*90e502c7SAndroid Build Coastguard Worker 
1780*90e502c7SAndroid Build Coastguard Worker #ifdef GCM
1781*90e502c7SAndroid Build Coastguard Worker /*
1782*90e502c7SAndroid Build Coastguard Worker  * srtp_validate_gcm() verifies the correctness of libsrtp by comparing
1783*90e502c7SAndroid Build Coastguard Worker  * an computed packet against the known ciphertext for the plaintext.
1784*90e502c7SAndroid Build Coastguard Worker  */
srtp_validate_gcm()1785*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_validate_gcm()
1786*90e502c7SAndroid Build Coastguard Worker {
1787*90e502c7SAndroid Build Coastguard Worker     // clang-format off
1788*90e502c7SAndroid Build Coastguard Worker     unsigned char test_key_gcm[28] = {
1789*90e502c7SAndroid Build Coastguard Worker         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1790*90e502c7SAndroid Build Coastguard Worker         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1791*90e502c7SAndroid Build Coastguard Worker         0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
1792*90e502c7SAndroid Build Coastguard Worker         0xa8, 0xa9, 0xaa, 0xab
1793*90e502c7SAndroid Build Coastguard Worker     };
1794*90e502c7SAndroid Build Coastguard Worker     uint8_t rtp_plaintext_ref[28] = {
1795*90e502c7SAndroid Build Coastguard Worker         0x80, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad,
1796*90e502c7SAndroid Build Coastguard Worker         0xca, 0xfe, 0xba, 0xbe, 0xab, 0xab, 0xab, 0xab,
1797*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
1798*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab
1799*90e502c7SAndroid Build Coastguard Worker     };
1800*90e502c7SAndroid Build Coastguard Worker     uint8_t rtp_plaintext[44] = {
1801*90e502c7SAndroid Build Coastguard Worker         0x80, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad,
1802*90e502c7SAndroid Build Coastguard Worker         0xca, 0xfe, 0xba, 0xbe, 0xab, 0xab, 0xab, 0xab,
1803*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
1804*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0x00, 0x00, 0x00, 0x00,
1805*90e502c7SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1806*90e502c7SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00
1807*90e502c7SAndroid Build Coastguard Worker     };
1808*90e502c7SAndroid Build Coastguard Worker     uint8_t srtp_ciphertext[44] = {
1809*90e502c7SAndroid Build Coastguard Worker         0x80, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad,
1810*90e502c7SAndroid Build Coastguard Worker         0xca, 0xfe, 0xba, 0xbe, 0xc5, 0x00, 0x2e, 0xde,
1811*90e502c7SAndroid Build Coastguard Worker         0x04, 0xcf, 0xdd, 0x2e, 0xb9, 0x11, 0x59, 0xe0,
1812*90e502c7SAndroid Build Coastguard Worker         0x88, 0x0a, 0xa0, 0x6e, 0xd2, 0x97, 0x68, 0x26,
1813*90e502c7SAndroid Build Coastguard Worker         0xf7, 0x96, 0xb2, 0x01, 0xdf, 0x31, 0x31, 0xa1,
1814*90e502c7SAndroid Build Coastguard Worker         0x27, 0xe8, 0xa3, 0x92
1815*90e502c7SAndroid Build Coastguard Worker     };
1816*90e502c7SAndroid Build Coastguard Worker     uint8_t rtcp_plaintext_ref[24] = {
1817*90e502c7SAndroid Build Coastguard Worker         0x81, 0xc8, 0x00, 0x0b, 0xca, 0xfe, 0xba, 0xbe,
1818*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
1819*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
1820*90e502c7SAndroid Build Coastguard Worker     };
1821*90e502c7SAndroid Build Coastguard Worker     uint8_t rtcp_plaintext[44] = {
1822*90e502c7SAndroid Build Coastguard Worker         0x81, 0xc8, 0x00, 0x0b, 0xca, 0xfe, 0xba, 0xbe,
1823*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
1824*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
1825*90e502c7SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1826*90e502c7SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1827*90e502c7SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00
1828*90e502c7SAndroid Build Coastguard Worker     };
1829*90e502c7SAndroid Build Coastguard Worker     uint8_t srtcp_ciphertext[44] = {
1830*90e502c7SAndroid Build Coastguard Worker         0x81, 0xc8, 0x00, 0x0b, 0xca, 0xfe, 0xba, 0xbe,
1831*90e502c7SAndroid Build Coastguard Worker         0xc9, 0x8b, 0x8b, 0x5d, 0xf0, 0x39, 0x2a, 0x55,
1832*90e502c7SAndroid Build Coastguard Worker         0x85, 0x2b, 0x6c, 0x21, 0xac, 0x8e, 0x70, 0x25,
1833*90e502c7SAndroid Build Coastguard Worker         0xc5, 0x2c, 0x6f, 0xbe, 0xa2, 0xb3, 0xb4, 0x46,
1834*90e502c7SAndroid Build Coastguard Worker         0xea, 0x31, 0x12, 0x3b, 0xa8, 0x8c, 0xe6, 0x1e,
1835*90e502c7SAndroid Build Coastguard Worker         0x80, 0x00, 0x00, 0x01
1836*90e502c7SAndroid Build Coastguard Worker     };
1837*90e502c7SAndroid Build Coastguard Worker     // clang-format on
1838*90e502c7SAndroid Build Coastguard Worker 
1839*90e502c7SAndroid Build Coastguard Worker     srtp_t srtp_snd, srtp_recv;
1840*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
1841*90e502c7SAndroid Build Coastguard Worker     int len;
1842*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t policy;
1843*90e502c7SAndroid Build Coastguard Worker 
1844*90e502c7SAndroid Build Coastguard Worker     /*
1845*90e502c7SAndroid Build Coastguard Worker      * create a session with a single stream using the default srtp
1846*90e502c7SAndroid Build Coastguard Worker      * policy and with the SSRC value 0xcafebabe
1847*90e502c7SAndroid Build Coastguard Worker      */
1848*90e502c7SAndroid Build Coastguard Worker     memset(&policy, 0, sizeof(policy));
1849*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_aes_gcm_128_16_auth(&policy.rtp);
1850*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_aes_gcm_128_16_auth(&policy.rtcp);
1851*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.type = ssrc_specific;
1852*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.value = 0xcafebabe;
1853*90e502c7SAndroid Build Coastguard Worker     policy.key = test_key_gcm;
1854*90e502c7SAndroid Build Coastguard Worker     policy.ekt = NULL;
1855*90e502c7SAndroid Build Coastguard Worker     policy.window_size = 128;
1856*90e502c7SAndroid Build Coastguard Worker     policy.allow_repeat_tx = 0;
1857*90e502c7SAndroid Build Coastguard Worker     policy.next = NULL;
1858*90e502c7SAndroid Build Coastguard Worker 
1859*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&srtp_snd, &policy);
1860*90e502c7SAndroid Build Coastguard Worker     if (status) {
1861*90e502c7SAndroid Build Coastguard Worker         return status;
1862*90e502c7SAndroid Build Coastguard Worker     }
1863*90e502c7SAndroid Build Coastguard Worker 
1864*90e502c7SAndroid Build Coastguard Worker     /*
1865*90e502c7SAndroid Build Coastguard Worker      * protect plaintext rtp, then compare with srtp ciphertext
1866*90e502c7SAndroid Build Coastguard Worker      */
1867*90e502c7SAndroid Build Coastguard Worker     len = 28;
1868*90e502c7SAndroid Build Coastguard Worker     status = srtp_protect(srtp_snd, rtp_plaintext, &len);
1869*90e502c7SAndroid Build Coastguard Worker     if (status || (len != 44)) {
1870*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
1871*90e502c7SAndroid Build Coastguard Worker     }
1872*90e502c7SAndroid Build Coastguard Worker 
1873*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "srtp ciphertext:\n  %s",
1874*90e502c7SAndroid Build Coastguard Worker                 octet_string_hex_string(rtp_plaintext, len));
1875*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "srtp ciphertext reference:\n  %s",
1876*90e502c7SAndroid Build Coastguard Worker                 octet_string_hex_string(srtp_ciphertext, len));
1877*90e502c7SAndroid Build Coastguard Worker 
1878*90e502c7SAndroid Build Coastguard Worker     if (srtp_octet_string_is_eq(rtp_plaintext, srtp_ciphertext, len)) {
1879*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
1880*90e502c7SAndroid Build Coastguard Worker     }
1881*90e502c7SAndroid Build Coastguard Worker 
1882*90e502c7SAndroid Build Coastguard Worker     /*
1883*90e502c7SAndroid Build Coastguard Worker      * protect plaintext rtcp, then compare with srtcp ciphertext
1884*90e502c7SAndroid Build Coastguard Worker      */
1885*90e502c7SAndroid Build Coastguard Worker     len = 24;
1886*90e502c7SAndroid Build Coastguard Worker     status = srtp_protect_rtcp(srtp_snd, rtcp_plaintext, &len);
1887*90e502c7SAndroid Build Coastguard Worker     if (status || (len != 44)) {
1888*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
1889*90e502c7SAndroid Build Coastguard Worker     }
1890*90e502c7SAndroid Build Coastguard Worker 
1891*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "srtcp ciphertext:\n  %s",
1892*90e502c7SAndroid Build Coastguard Worker                 octet_string_hex_string(rtcp_plaintext, len));
1893*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "srtcp ciphertext reference:\n  %s",
1894*90e502c7SAndroid Build Coastguard Worker                 octet_string_hex_string(srtcp_ciphertext, len));
1895*90e502c7SAndroid Build Coastguard Worker 
1896*90e502c7SAndroid Build Coastguard Worker     if (srtp_octet_string_is_eq(rtcp_plaintext, srtcp_ciphertext, len)) {
1897*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
1898*90e502c7SAndroid Build Coastguard Worker     }
1899*90e502c7SAndroid Build Coastguard Worker 
1900*90e502c7SAndroid Build Coastguard Worker     /*
1901*90e502c7SAndroid Build Coastguard Worker      * create a receiver session context comparable to the one created
1902*90e502c7SAndroid Build Coastguard Worker      * above - we need to do this so that the replay checking doesn't
1903*90e502c7SAndroid Build Coastguard Worker      * complain
1904*90e502c7SAndroid Build Coastguard Worker      */
1905*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&srtp_recv, &policy);
1906*90e502c7SAndroid Build Coastguard Worker     if (status) {
1907*90e502c7SAndroid Build Coastguard Worker         return status;
1908*90e502c7SAndroid Build Coastguard Worker     }
1909*90e502c7SAndroid Build Coastguard Worker 
1910*90e502c7SAndroid Build Coastguard Worker     /*
1911*90e502c7SAndroid Build Coastguard Worker      * unprotect srtp ciphertext, then compare with rtp plaintext
1912*90e502c7SAndroid Build Coastguard Worker      */
1913*90e502c7SAndroid Build Coastguard Worker     len = 44;
1914*90e502c7SAndroid Build Coastguard Worker     status = srtp_unprotect(srtp_recv, srtp_ciphertext, &len);
1915*90e502c7SAndroid Build Coastguard Worker     if (status || (len != 28)) {
1916*90e502c7SAndroid Build Coastguard Worker         return status;
1917*90e502c7SAndroid Build Coastguard Worker     }
1918*90e502c7SAndroid Build Coastguard Worker 
1919*90e502c7SAndroid Build Coastguard Worker     if (srtp_octet_string_is_eq(srtp_ciphertext, rtp_plaintext_ref, len)) {
1920*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
1921*90e502c7SAndroid Build Coastguard Worker     }
1922*90e502c7SAndroid Build Coastguard Worker 
1923*90e502c7SAndroid Build Coastguard Worker     /*
1924*90e502c7SAndroid Build Coastguard Worker      * unprotect srtcp ciphertext, then compare with rtcp plaintext
1925*90e502c7SAndroid Build Coastguard Worker      */
1926*90e502c7SAndroid Build Coastguard Worker     len = 44;
1927*90e502c7SAndroid Build Coastguard Worker     status = srtp_unprotect_rtcp(srtp_recv, srtcp_ciphertext, &len);
1928*90e502c7SAndroid Build Coastguard Worker     if (status || (len != 24)) {
1929*90e502c7SAndroid Build Coastguard Worker         return status;
1930*90e502c7SAndroid Build Coastguard Worker     }
1931*90e502c7SAndroid Build Coastguard Worker 
1932*90e502c7SAndroid Build Coastguard Worker     if (srtp_octet_string_is_eq(srtcp_ciphertext, rtcp_plaintext_ref, len)) {
1933*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
1934*90e502c7SAndroid Build Coastguard Worker     }
1935*90e502c7SAndroid Build Coastguard Worker 
1936*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(srtp_snd);
1937*90e502c7SAndroid Build Coastguard Worker     if (status) {
1938*90e502c7SAndroid Build Coastguard Worker         return status;
1939*90e502c7SAndroid Build Coastguard Worker     }
1940*90e502c7SAndroid Build Coastguard Worker 
1941*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(srtp_recv);
1942*90e502c7SAndroid Build Coastguard Worker     if (status) {
1943*90e502c7SAndroid Build Coastguard Worker         return status;
1944*90e502c7SAndroid Build Coastguard Worker     }
1945*90e502c7SAndroid Build Coastguard Worker 
1946*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
1947*90e502c7SAndroid Build Coastguard Worker }
1948*90e502c7SAndroid Build Coastguard Worker #endif
1949*90e502c7SAndroid Build Coastguard Worker 
1950*90e502c7SAndroid Build Coastguard Worker /*
1951*90e502c7SAndroid Build Coastguard Worker  * Test vectors taken from RFC 6904, Appendix A
1952*90e502c7SAndroid Build Coastguard Worker  */
srtp_validate_encrypted_extensions_headers()1953*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_validate_encrypted_extensions_headers()
1954*90e502c7SAndroid Build Coastguard Worker {
1955*90e502c7SAndroid Build Coastguard Worker     // clang-format off
1956*90e502c7SAndroid Build Coastguard Worker     unsigned char test_key_ext_headers[30] = {
1957*90e502c7SAndroid Build Coastguard Worker         0xe1, 0xf9, 0x7a, 0x0d, 0x3e, 0x01, 0x8b, 0xe0,
1958*90e502c7SAndroid Build Coastguard Worker         0xd6, 0x4f, 0xa3, 0x2c, 0x06, 0xde, 0x41, 0x39,
1959*90e502c7SAndroid Build Coastguard Worker         0x0e, 0xc6, 0x75, 0xad, 0x49, 0x8a, 0xfe, 0xeb,
1960*90e502c7SAndroid Build Coastguard Worker         0xb6, 0x96, 0x0b, 0x3a, 0xab, 0xe6
1961*90e502c7SAndroid Build Coastguard Worker     };
1962*90e502c7SAndroid Build Coastguard Worker     uint8_t srtp_plaintext_ref[56] = {
1963*90e502c7SAndroid Build Coastguard Worker         0x90, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad,
1964*90e502c7SAndroid Build Coastguard Worker         0xca, 0xfe, 0xba, 0xbe, 0xBE, 0xDE, 0x00, 0x06,
1965*90e502c7SAndroid Build Coastguard Worker         0x17, 0x41, 0x42, 0x73, 0xA4, 0x75, 0x26, 0x27,
1966*90e502c7SAndroid Build Coastguard Worker         0x48, 0x22, 0x00, 0x00, 0xC8, 0x30, 0x8E, 0x46,
1967*90e502c7SAndroid Build Coastguard Worker         0x55, 0x99, 0x63, 0x86, 0xB3, 0x95, 0xFB, 0x00,
1968*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
1969*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab
1970*90e502c7SAndroid Build Coastguard Worker     };
1971*90e502c7SAndroid Build Coastguard Worker     uint8_t srtp_plaintext[66] = {
1972*90e502c7SAndroid Build Coastguard Worker         0x90, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad,
1973*90e502c7SAndroid Build Coastguard Worker         0xca, 0xfe, 0xba, 0xbe, 0xBE, 0xDE, 0x00, 0x06,
1974*90e502c7SAndroid Build Coastguard Worker         0x17, 0x41, 0x42, 0x73, 0xA4, 0x75, 0x26, 0x27,
1975*90e502c7SAndroid Build Coastguard Worker         0x48, 0x22, 0x00, 0x00, 0xC8, 0x30, 0x8E, 0x46,
1976*90e502c7SAndroid Build Coastguard Worker         0x55, 0x99, 0x63, 0x86, 0xB3, 0x95, 0xFB, 0x00,
1977*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
1978*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
1979*90e502c7SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1980*90e502c7SAndroid Build Coastguard Worker         0x00, 0x00
1981*90e502c7SAndroid Build Coastguard Worker     };
1982*90e502c7SAndroid Build Coastguard Worker     uint8_t srtp_ciphertext[66] = {
1983*90e502c7SAndroid Build Coastguard Worker         0x90, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad,
1984*90e502c7SAndroid Build Coastguard Worker         0xca, 0xfe, 0xba, 0xbe, 0xBE, 0xDE, 0x00, 0x06,
1985*90e502c7SAndroid Build Coastguard Worker         0x17, 0x58, 0x8A, 0x92, 0x70, 0xF4, 0xE1, 0x5E,
1986*90e502c7SAndroid Build Coastguard Worker         0x1C, 0x22, 0x00, 0x00, 0xC8, 0x30, 0x95, 0x46,
1987*90e502c7SAndroid Build Coastguard Worker         0xA9, 0x94, 0xF0, 0xBC, 0x54, 0x78, 0x97, 0x00,
1988*90e502c7SAndroid Build Coastguard Worker         0x4e, 0x55, 0xdc, 0x4c, 0xe7, 0x99, 0x78, 0xd8,
1989*90e502c7SAndroid Build Coastguard Worker         0x8c, 0xa4, 0xd2, 0x15, 0x94, 0x9d, 0x24, 0x02,
1990*90e502c7SAndroid Build Coastguard Worker         0x5a, 0x46, 0xb3, 0xca, 0x35, 0xc5, 0x35, 0xa8,
1991*90e502c7SAndroid Build Coastguard Worker         0x91, 0xc7
1992*90e502c7SAndroid Build Coastguard Worker     };
1993*90e502c7SAndroid Build Coastguard Worker     // clang-format on
1994*90e502c7SAndroid Build Coastguard Worker 
1995*90e502c7SAndroid Build Coastguard Worker     srtp_t srtp_snd, srtp_recv;
1996*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
1997*90e502c7SAndroid Build Coastguard Worker     int len;
1998*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t policy;
1999*90e502c7SAndroid Build Coastguard Worker     int headers[3] = { 1, 3, 4 };
2000*90e502c7SAndroid Build Coastguard Worker 
2001*90e502c7SAndroid Build Coastguard Worker     /*
2002*90e502c7SAndroid Build Coastguard Worker      * create a session with a single stream using the default srtp
2003*90e502c7SAndroid Build Coastguard Worker      * policy and with the SSRC value 0xcafebabe
2004*90e502c7SAndroid Build Coastguard Worker      */
2005*90e502c7SAndroid Build Coastguard Worker     memset(&policy, 0, sizeof(policy));
2006*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtp_default(&policy.rtp);
2007*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtcp_default(&policy.rtcp);
2008*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.type = ssrc_specific;
2009*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.value = 0xcafebabe;
2010*90e502c7SAndroid Build Coastguard Worker     policy.key = test_key_ext_headers;
2011*90e502c7SAndroid Build Coastguard Worker     policy.ekt = NULL;
2012*90e502c7SAndroid Build Coastguard Worker     policy.window_size = 128;
2013*90e502c7SAndroid Build Coastguard Worker     policy.allow_repeat_tx = 0;
2014*90e502c7SAndroid Build Coastguard Worker     policy.enc_xtn_hdr = headers;
2015*90e502c7SAndroid Build Coastguard Worker     policy.enc_xtn_hdr_count = sizeof(headers) / sizeof(headers[0]);
2016*90e502c7SAndroid Build Coastguard Worker     policy.next = NULL;
2017*90e502c7SAndroid Build Coastguard Worker 
2018*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&srtp_snd, &policy);
2019*90e502c7SAndroid Build Coastguard Worker     if (status)
2020*90e502c7SAndroid Build Coastguard Worker         return status;
2021*90e502c7SAndroid Build Coastguard Worker 
2022*90e502c7SAndroid Build Coastguard Worker     /*
2023*90e502c7SAndroid Build Coastguard Worker      * protect plaintext, then compare with ciphertext
2024*90e502c7SAndroid Build Coastguard Worker      */
2025*90e502c7SAndroid Build Coastguard Worker     len = sizeof(srtp_plaintext_ref);
2026*90e502c7SAndroid Build Coastguard Worker     status = srtp_protect(srtp_snd, srtp_plaintext, &len);
2027*90e502c7SAndroid Build Coastguard Worker     if (status || (len != sizeof(srtp_plaintext)))
2028*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2029*90e502c7SAndroid Build Coastguard Worker 
2030*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "ciphertext:\n  %s",
2031*90e502c7SAndroid Build Coastguard Worker                 srtp_octet_string_hex_string(srtp_plaintext, len));
2032*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "ciphertext reference:\n  %s",
2033*90e502c7SAndroid Build Coastguard Worker                 srtp_octet_string_hex_string(srtp_ciphertext, len));
2034*90e502c7SAndroid Build Coastguard Worker 
2035*90e502c7SAndroid Build Coastguard Worker     if (srtp_octet_string_is_eq(srtp_plaintext, srtp_ciphertext, len))
2036*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2037*90e502c7SAndroid Build Coastguard Worker 
2038*90e502c7SAndroid Build Coastguard Worker     /*
2039*90e502c7SAndroid Build Coastguard Worker      * create a receiver session context comparable to the one created
2040*90e502c7SAndroid Build Coastguard Worker      * above - we need to do this so that the replay checking doesn't
2041*90e502c7SAndroid Build Coastguard Worker      * complain
2042*90e502c7SAndroid Build Coastguard Worker      */
2043*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&srtp_recv, &policy);
2044*90e502c7SAndroid Build Coastguard Worker     if (status)
2045*90e502c7SAndroid Build Coastguard Worker         return status;
2046*90e502c7SAndroid Build Coastguard Worker 
2047*90e502c7SAndroid Build Coastguard Worker     /*
2048*90e502c7SAndroid Build Coastguard Worker      * unprotect ciphertext, then compare with plaintext
2049*90e502c7SAndroid Build Coastguard Worker      */
2050*90e502c7SAndroid Build Coastguard Worker     status = srtp_unprotect(srtp_recv, srtp_ciphertext, &len);
2051*90e502c7SAndroid Build Coastguard Worker     if (status) {
2052*90e502c7SAndroid Build Coastguard Worker         return status;
2053*90e502c7SAndroid Build Coastguard Worker     } else if (len != sizeof(srtp_plaintext_ref)) {
2054*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2055*90e502c7SAndroid Build Coastguard Worker     }
2056*90e502c7SAndroid Build Coastguard Worker 
2057*90e502c7SAndroid Build Coastguard Worker     if (srtp_octet_string_is_eq(srtp_ciphertext, srtp_plaintext_ref, len))
2058*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2059*90e502c7SAndroid Build Coastguard Worker 
2060*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(srtp_snd);
2061*90e502c7SAndroid Build Coastguard Worker     if (status)
2062*90e502c7SAndroid Build Coastguard Worker         return status;
2063*90e502c7SAndroid Build Coastguard Worker 
2064*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(srtp_recv);
2065*90e502c7SAndroid Build Coastguard Worker     if (status)
2066*90e502c7SAndroid Build Coastguard Worker         return status;
2067*90e502c7SAndroid Build Coastguard Worker 
2068*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
2069*90e502c7SAndroid Build Coastguard Worker }
2070*90e502c7SAndroid Build Coastguard Worker 
2071*90e502c7SAndroid Build Coastguard Worker #ifdef GCM
2072*90e502c7SAndroid Build Coastguard Worker 
2073*90e502c7SAndroid Build Coastguard Worker /*
2074*90e502c7SAndroid Build Coastguard Worker  * Headers of test vectors taken from RFC 6904, Appendix A
2075*90e502c7SAndroid Build Coastguard Worker  */
srtp_validate_encrypted_extensions_headers_gcm()2076*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_validate_encrypted_extensions_headers_gcm()
2077*90e502c7SAndroid Build Coastguard Worker {
2078*90e502c7SAndroid Build Coastguard Worker     // clang-format off
2079*90e502c7SAndroid Build Coastguard Worker     unsigned char test_key_ext_headers[30] = {
2080*90e502c7SAndroid Build Coastguard Worker         0xe1, 0xf9, 0x7a, 0x0d, 0x3e, 0x01, 0x8b, 0xe0,
2081*90e502c7SAndroid Build Coastguard Worker         0xd6, 0x4f, 0xa3, 0x2c, 0x06, 0xde, 0x41, 0x39,
2082*90e502c7SAndroid Build Coastguard Worker         0x0e, 0xc6, 0x75, 0xad, 0x49, 0x8a, 0xfe, 0xeb,
2083*90e502c7SAndroid Build Coastguard Worker         0xb6, 0x96, 0x0b, 0x3a, 0xab, 0xe6
2084*90e502c7SAndroid Build Coastguard Worker     };
2085*90e502c7SAndroid Build Coastguard Worker     uint8_t srtp_plaintext_ref[56] = {
2086*90e502c7SAndroid Build Coastguard Worker         0x90, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad,
2087*90e502c7SAndroid Build Coastguard Worker         0xca, 0xfe, 0xba, 0xbe, 0xBE, 0xDE, 0x00, 0x06,
2088*90e502c7SAndroid Build Coastguard Worker         0x17, 0x41, 0x42, 0x73, 0xA4, 0x75, 0x26, 0x27,
2089*90e502c7SAndroid Build Coastguard Worker         0x48, 0x22, 0x00, 0x00, 0xC8, 0x30, 0x8E, 0x46,
2090*90e502c7SAndroid Build Coastguard Worker         0x55, 0x99, 0x63, 0x86, 0xB3, 0x95, 0xFB, 0x00,
2091*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
2092*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab
2093*90e502c7SAndroid Build Coastguard Worker     };
2094*90e502c7SAndroid Build Coastguard Worker     uint8_t srtp_plaintext[64] = {
2095*90e502c7SAndroid Build Coastguard Worker         0x90, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad,
2096*90e502c7SAndroid Build Coastguard Worker         0xca, 0xfe, 0xba, 0xbe, 0xBE, 0xDE, 0x00, 0x06,
2097*90e502c7SAndroid Build Coastguard Worker         0x17, 0x41, 0x42, 0x73, 0xA4, 0x75, 0x26, 0x27,
2098*90e502c7SAndroid Build Coastguard Worker         0x48, 0x22, 0x00, 0x00, 0xC8, 0x30, 0x8E, 0x46,
2099*90e502c7SAndroid Build Coastguard Worker         0x55, 0x99, 0x63, 0x86, 0xB3, 0x95, 0xFB, 0x00,
2100*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
2101*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
2102*90e502c7SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
2103*90e502c7SAndroid Build Coastguard Worker     };
2104*90e502c7SAndroid Build Coastguard Worker     uint8_t srtp_ciphertext[64] = {
2105*90e502c7SAndroid Build Coastguard Worker         0x90, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad,
2106*90e502c7SAndroid Build Coastguard Worker         0xca, 0xfe, 0xba, 0xbe, 0xBE, 0xDE, 0x00, 0x06,
2107*90e502c7SAndroid Build Coastguard Worker         0x17, 0x12, 0xe0, 0x20, 0x5b, 0xfa, 0x94, 0x9b,
2108*90e502c7SAndroid Build Coastguard Worker         0x1C, 0x22, 0x00, 0x00, 0xC8, 0x30, 0xbb, 0x46,
2109*90e502c7SAndroid Build Coastguard Worker         0x73, 0x27, 0x78, 0xd9, 0x92, 0x9a, 0xab, 0x00,
2110*90e502c7SAndroid Build Coastguard Worker         0x0e, 0xca, 0x0c, 0xf9, 0x5e, 0xe9, 0x55, 0xb2,
2111*90e502c7SAndroid Build Coastguard Worker         0x6c, 0xd3, 0xd2, 0x88, 0xb4, 0x9f, 0x6c, 0xa9,
2112*90e502c7SAndroid Build Coastguard Worker         0xf4, 0xb1, 0xb7, 0x59, 0x71, 0x9e, 0xb5, 0xbc
2113*90e502c7SAndroid Build Coastguard Worker     };
2114*90e502c7SAndroid Build Coastguard Worker     // clang-format on
2115*90e502c7SAndroid Build Coastguard Worker 
2116*90e502c7SAndroid Build Coastguard Worker     srtp_t srtp_snd, srtp_recv;
2117*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
2118*90e502c7SAndroid Build Coastguard Worker     int len;
2119*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t policy;
2120*90e502c7SAndroid Build Coastguard Worker     int headers[3] = { 1, 3, 4 };
2121*90e502c7SAndroid Build Coastguard Worker 
2122*90e502c7SAndroid Build Coastguard Worker     /*
2123*90e502c7SAndroid Build Coastguard Worker      * create a session with a single stream using the default srtp
2124*90e502c7SAndroid Build Coastguard Worker      * policy and with the SSRC value 0xcafebabe
2125*90e502c7SAndroid Build Coastguard Worker      */
2126*90e502c7SAndroid Build Coastguard Worker     memset(&policy, 0, sizeof(policy));
2127*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_aes_gcm_128_8_auth(&policy.rtp);
2128*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_aes_gcm_128_8_auth(&policy.rtcp);
2129*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.type = ssrc_specific;
2130*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.value = 0xcafebabe;
2131*90e502c7SAndroid Build Coastguard Worker     policy.key = test_key_ext_headers;
2132*90e502c7SAndroid Build Coastguard Worker     policy.ekt = NULL;
2133*90e502c7SAndroid Build Coastguard Worker     policy.window_size = 128;
2134*90e502c7SAndroid Build Coastguard Worker     policy.allow_repeat_tx = 0;
2135*90e502c7SAndroid Build Coastguard Worker     policy.enc_xtn_hdr = headers;
2136*90e502c7SAndroid Build Coastguard Worker     policy.enc_xtn_hdr_count = sizeof(headers) / sizeof(headers[0]);
2137*90e502c7SAndroid Build Coastguard Worker     policy.next = NULL;
2138*90e502c7SAndroid Build Coastguard Worker 
2139*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&srtp_snd, &policy);
2140*90e502c7SAndroid Build Coastguard Worker     if (status)
2141*90e502c7SAndroid Build Coastguard Worker         return status;
2142*90e502c7SAndroid Build Coastguard Worker 
2143*90e502c7SAndroid Build Coastguard Worker     /*
2144*90e502c7SAndroid Build Coastguard Worker      * protect plaintext, then compare with ciphertext
2145*90e502c7SAndroid Build Coastguard Worker      */
2146*90e502c7SAndroid Build Coastguard Worker     len = sizeof(srtp_plaintext_ref);
2147*90e502c7SAndroid Build Coastguard Worker     status = srtp_protect(srtp_snd, srtp_plaintext, &len);
2148*90e502c7SAndroid Build Coastguard Worker     if (status || (len != sizeof(srtp_plaintext)))
2149*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2150*90e502c7SAndroid Build Coastguard Worker 
2151*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "ciphertext:\n  %s",
2152*90e502c7SAndroid Build Coastguard Worker                 srtp_octet_string_hex_string(srtp_plaintext, len));
2153*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "ciphertext reference:\n  %s",
2154*90e502c7SAndroid Build Coastguard Worker                 srtp_octet_string_hex_string(srtp_ciphertext, len));
2155*90e502c7SAndroid Build Coastguard Worker 
2156*90e502c7SAndroid Build Coastguard Worker     if (srtp_octet_string_is_eq(srtp_plaintext, srtp_ciphertext, len))
2157*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2158*90e502c7SAndroid Build Coastguard Worker 
2159*90e502c7SAndroid Build Coastguard Worker     /*
2160*90e502c7SAndroid Build Coastguard Worker      * create a receiver session context comparable to the one created
2161*90e502c7SAndroid Build Coastguard Worker      * above - we need to do this so that the replay checking doesn't
2162*90e502c7SAndroid Build Coastguard Worker      * complain
2163*90e502c7SAndroid Build Coastguard Worker      */
2164*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&srtp_recv, &policy);
2165*90e502c7SAndroid Build Coastguard Worker     if (status)
2166*90e502c7SAndroid Build Coastguard Worker         return status;
2167*90e502c7SAndroid Build Coastguard Worker 
2168*90e502c7SAndroid Build Coastguard Worker     /*
2169*90e502c7SAndroid Build Coastguard Worker      * unprotect ciphertext, then compare with plaintext
2170*90e502c7SAndroid Build Coastguard Worker      */
2171*90e502c7SAndroid Build Coastguard Worker     status = srtp_unprotect(srtp_recv, srtp_ciphertext, &len);
2172*90e502c7SAndroid Build Coastguard Worker     if (status) {
2173*90e502c7SAndroid Build Coastguard Worker         return status;
2174*90e502c7SAndroid Build Coastguard Worker     } else if (len != sizeof(srtp_plaintext_ref)) {
2175*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2176*90e502c7SAndroid Build Coastguard Worker     }
2177*90e502c7SAndroid Build Coastguard Worker 
2178*90e502c7SAndroid Build Coastguard Worker     if (srtp_octet_string_is_eq(srtp_ciphertext, srtp_plaintext_ref, len))
2179*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2180*90e502c7SAndroid Build Coastguard Worker 
2181*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(srtp_snd);
2182*90e502c7SAndroid Build Coastguard Worker     if (status)
2183*90e502c7SAndroid Build Coastguard Worker         return status;
2184*90e502c7SAndroid Build Coastguard Worker 
2185*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(srtp_recv);
2186*90e502c7SAndroid Build Coastguard Worker     if (status)
2187*90e502c7SAndroid Build Coastguard Worker         return status;
2188*90e502c7SAndroid Build Coastguard Worker 
2189*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
2190*90e502c7SAndroid Build Coastguard Worker }
2191*90e502c7SAndroid Build Coastguard Worker #endif
2192*90e502c7SAndroid Build Coastguard Worker 
2193*90e502c7SAndroid Build Coastguard Worker /*
2194*90e502c7SAndroid Build Coastguard Worker  * srtp_validate_aes_256() verifies the correctness of libsrtp by comparing
2195*90e502c7SAndroid Build Coastguard Worker  * some computed packets against some pre-computed reference values.
2196*90e502c7SAndroid Build Coastguard Worker  * These packets were made with the AES-CM-256/HMAC-SHA-1-80 policy.
2197*90e502c7SAndroid Build Coastguard Worker  */
2198*90e502c7SAndroid Build Coastguard Worker 
srtp_validate_aes_256()2199*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_validate_aes_256()
2200*90e502c7SAndroid Build Coastguard Worker {
2201*90e502c7SAndroid Build Coastguard Worker     // clang-format off
2202*90e502c7SAndroid Build Coastguard Worker     unsigned char aes_256_test_key[46] = {
2203*90e502c7SAndroid Build Coastguard Worker         0xf0, 0xf0, 0x49, 0x14, 0xb5, 0x13, 0xf2, 0x76,
2204*90e502c7SAndroid Build Coastguard Worker         0x3a, 0x1b, 0x1f, 0xa1, 0x30, 0xf1, 0x0e, 0x29,
2205*90e502c7SAndroid Build Coastguard Worker         0x98, 0xf6, 0xf6, 0xe4, 0x3e, 0x43, 0x09, 0xd1,
2206*90e502c7SAndroid Build Coastguard Worker         0xe6, 0x22, 0xa0, 0xe3, 0x32, 0xb9, 0xf1, 0xb6,
2207*90e502c7SAndroid Build Coastguard Worker 
2208*90e502c7SAndroid Build Coastguard Worker         0x3b, 0x04, 0x80, 0x3d, 0xe5, 0x1e, 0xe7, 0xc9,
2209*90e502c7SAndroid Build Coastguard Worker         0x64, 0x23, 0xab, 0x5b, 0x78, 0xd2
2210*90e502c7SAndroid Build Coastguard Worker     };
2211*90e502c7SAndroid Build Coastguard Worker     uint8_t srtp_plaintext_ref[28] = {
2212*90e502c7SAndroid Build Coastguard Worker         0x80, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad,
2213*90e502c7SAndroid Build Coastguard Worker         0xca, 0xfe, 0xba, 0xbe, 0xab, 0xab, 0xab, 0xab,
2214*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
2215*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab
2216*90e502c7SAndroid Build Coastguard Worker     };
2217*90e502c7SAndroid Build Coastguard Worker     uint8_t srtp_plaintext[38] = {
2218*90e502c7SAndroid Build Coastguard Worker         0x80, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad,
2219*90e502c7SAndroid Build Coastguard Worker         0xca, 0xfe, 0xba, 0xbe, 0xab, 0xab, 0xab, 0xab,
2220*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
2221*90e502c7SAndroid Build Coastguard Worker         0xab, 0xab, 0xab, 0xab, 0x00, 0x00, 0x00, 0x00,
2222*90e502c7SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00
2223*90e502c7SAndroid Build Coastguard Worker     };
2224*90e502c7SAndroid Build Coastguard Worker     uint8_t srtp_ciphertext[38] = {
2225*90e502c7SAndroid Build Coastguard Worker         0x80, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad,
2226*90e502c7SAndroid Build Coastguard Worker         0xca, 0xfe, 0xba, 0xbe, 0xf1, 0xd9, 0xde, 0x17,
2227*90e502c7SAndroid Build Coastguard Worker         0xff, 0x25, 0x1f, 0xf1, 0xaa, 0x00, 0x77, 0x74,
2228*90e502c7SAndroid Build Coastguard Worker         0xb0, 0xb4, 0xb4, 0x0d, 0xa0, 0x8d, 0x9d, 0x9a,
2229*90e502c7SAndroid Build Coastguard Worker         0x5b, 0x3a, 0x55, 0xd8, 0x87, 0x3b
2230*90e502c7SAndroid Build Coastguard Worker     };
2231*90e502c7SAndroid Build Coastguard Worker     // clang-format on
2232*90e502c7SAndroid Build Coastguard Worker 
2233*90e502c7SAndroid Build Coastguard Worker     srtp_t srtp_snd, srtp_recv;
2234*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
2235*90e502c7SAndroid Build Coastguard Worker     int len;
2236*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t policy;
2237*90e502c7SAndroid Build Coastguard Worker 
2238*90e502c7SAndroid Build Coastguard Worker     /*
2239*90e502c7SAndroid Build Coastguard Worker      * create a session with a single stream using the default srtp
2240*90e502c7SAndroid Build Coastguard Worker      * policy and with the SSRC value 0xcafebabe
2241*90e502c7SAndroid Build Coastguard Worker      */
2242*90e502c7SAndroid Build Coastguard Worker     memset(&policy, 0, sizeof(policy));
2243*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_aes_cm_256_hmac_sha1_80(&policy.rtp);
2244*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_aes_cm_256_hmac_sha1_80(&policy.rtcp);
2245*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.type = ssrc_specific;
2246*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.value = 0xcafebabe;
2247*90e502c7SAndroid Build Coastguard Worker     policy.key = aes_256_test_key;
2248*90e502c7SAndroid Build Coastguard Worker     policy.ekt = NULL;
2249*90e502c7SAndroid Build Coastguard Worker     policy.window_size = 128;
2250*90e502c7SAndroid Build Coastguard Worker     policy.allow_repeat_tx = 0;
2251*90e502c7SAndroid Build Coastguard Worker     policy.next = NULL;
2252*90e502c7SAndroid Build Coastguard Worker 
2253*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&srtp_snd, &policy);
2254*90e502c7SAndroid Build Coastguard Worker     if (status) {
2255*90e502c7SAndroid Build Coastguard Worker         return status;
2256*90e502c7SAndroid Build Coastguard Worker     }
2257*90e502c7SAndroid Build Coastguard Worker 
2258*90e502c7SAndroid Build Coastguard Worker     /*
2259*90e502c7SAndroid Build Coastguard Worker      * protect plaintext, then compare with ciphertext
2260*90e502c7SAndroid Build Coastguard Worker      */
2261*90e502c7SAndroid Build Coastguard Worker     len = 28;
2262*90e502c7SAndroid Build Coastguard Worker     status = srtp_protect(srtp_snd, srtp_plaintext, &len);
2263*90e502c7SAndroid Build Coastguard Worker     if (status || (len != 38)) {
2264*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2265*90e502c7SAndroid Build Coastguard Worker     }
2266*90e502c7SAndroid Build Coastguard Worker 
2267*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "ciphertext:\n  %s",
2268*90e502c7SAndroid Build Coastguard Worker                 octet_string_hex_string(srtp_plaintext, len));
2269*90e502c7SAndroid Build Coastguard Worker     debug_print(mod_driver, "ciphertext reference:\n  %s",
2270*90e502c7SAndroid Build Coastguard Worker                 octet_string_hex_string(srtp_ciphertext, len));
2271*90e502c7SAndroid Build Coastguard Worker 
2272*90e502c7SAndroid Build Coastguard Worker     if (srtp_octet_string_is_eq(srtp_plaintext, srtp_ciphertext, len)) {
2273*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2274*90e502c7SAndroid Build Coastguard Worker     }
2275*90e502c7SAndroid Build Coastguard Worker 
2276*90e502c7SAndroid Build Coastguard Worker     /*
2277*90e502c7SAndroid Build Coastguard Worker      * create a receiver session context comparable to the one created
2278*90e502c7SAndroid Build Coastguard Worker      * above - we need to do this so that the replay checking doesn't
2279*90e502c7SAndroid Build Coastguard Worker      * complain
2280*90e502c7SAndroid Build Coastguard Worker      */
2281*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&srtp_recv, &policy);
2282*90e502c7SAndroid Build Coastguard Worker     if (status) {
2283*90e502c7SAndroid Build Coastguard Worker         return status;
2284*90e502c7SAndroid Build Coastguard Worker     }
2285*90e502c7SAndroid Build Coastguard Worker 
2286*90e502c7SAndroid Build Coastguard Worker     /*
2287*90e502c7SAndroid Build Coastguard Worker      * unprotect ciphertext, then compare with plaintext
2288*90e502c7SAndroid Build Coastguard Worker      */
2289*90e502c7SAndroid Build Coastguard Worker     status = srtp_unprotect(srtp_recv, srtp_ciphertext, &len);
2290*90e502c7SAndroid Build Coastguard Worker     if (status || (len != 28)) {
2291*90e502c7SAndroid Build Coastguard Worker         return status;
2292*90e502c7SAndroid Build Coastguard Worker     }
2293*90e502c7SAndroid Build Coastguard Worker 
2294*90e502c7SAndroid Build Coastguard Worker     if (srtp_octet_string_is_eq(srtp_ciphertext, srtp_plaintext_ref, len)) {
2295*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2296*90e502c7SAndroid Build Coastguard Worker     }
2297*90e502c7SAndroid Build Coastguard Worker 
2298*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(srtp_snd);
2299*90e502c7SAndroid Build Coastguard Worker     if (status) {
2300*90e502c7SAndroid Build Coastguard Worker         return status;
2301*90e502c7SAndroid Build Coastguard Worker     }
2302*90e502c7SAndroid Build Coastguard Worker 
2303*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(srtp_recv);
2304*90e502c7SAndroid Build Coastguard Worker     if (status) {
2305*90e502c7SAndroid Build Coastguard Worker         return status;
2306*90e502c7SAndroid Build Coastguard Worker     }
2307*90e502c7SAndroid Build Coastguard Worker 
2308*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
2309*90e502c7SAndroid Build Coastguard Worker }
2310*90e502c7SAndroid Build Coastguard Worker 
srtp_create_big_policy(srtp_policy_t ** list)2311*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_create_big_policy(srtp_policy_t **list)
2312*90e502c7SAndroid Build Coastguard Worker {
2313*90e502c7SAndroid Build Coastguard Worker     extern const srtp_policy_t *policy_array[];
2314*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t *p, *tmp;
2315*90e502c7SAndroid Build Coastguard Worker     int i = 0;
2316*90e502c7SAndroid Build Coastguard Worker     uint32_t ssrc = 0;
2317*90e502c7SAndroid Build Coastguard Worker 
2318*90e502c7SAndroid Build Coastguard Worker     /* sanity checking */
2319*90e502c7SAndroid Build Coastguard Worker     if ((list == NULL) || (policy_array[0] == NULL)) {
2320*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_bad_param;
2321*90e502c7SAndroid Build Coastguard Worker     }
2322*90e502c7SAndroid Build Coastguard Worker 
2323*90e502c7SAndroid Build Coastguard Worker     /*
2324*90e502c7SAndroid Build Coastguard Worker      * loop over policy list, mallocing a new list and copying values
2325*90e502c7SAndroid Build Coastguard Worker      * into it (and incrementing the SSRC value as we go along)
2326*90e502c7SAndroid Build Coastguard Worker      */
2327*90e502c7SAndroid Build Coastguard Worker     tmp = NULL;
2328*90e502c7SAndroid Build Coastguard Worker     while (policy_array[i] != NULL) {
2329*90e502c7SAndroid Build Coastguard Worker         p = (srtp_policy_t *)malloc(sizeof(srtp_policy_t));
2330*90e502c7SAndroid Build Coastguard Worker         if (p == NULL) {
2331*90e502c7SAndroid Build Coastguard Worker             return srtp_err_status_bad_param;
2332*90e502c7SAndroid Build Coastguard Worker         }
2333*90e502c7SAndroid Build Coastguard Worker         memcpy(p, policy_array[i], sizeof(srtp_policy_t));
2334*90e502c7SAndroid Build Coastguard Worker         p->ssrc.type = ssrc_specific;
2335*90e502c7SAndroid Build Coastguard Worker         p->ssrc.value = ssrc++;
2336*90e502c7SAndroid Build Coastguard Worker         p->next = tmp;
2337*90e502c7SAndroid Build Coastguard Worker         tmp = p;
2338*90e502c7SAndroid Build Coastguard Worker         i++;
2339*90e502c7SAndroid Build Coastguard Worker     }
2340*90e502c7SAndroid Build Coastguard Worker     *list = p;
2341*90e502c7SAndroid Build Coastguard Worker 
2342*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
2343*90e502c7SAndroid Build Coastguard Worker }
2344*90e502c7SAndroid Build Coastguard Worker 
srtp_dealloc_big_policy(srtp_policy_t * list)2345*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_dealloc_big_policy(srtp_policy_t *list)
2346*90e502c7SAndroid Build Coastguard Worker {
2347*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t *p, *next;
2348*90e502c7SAndroid Build Coastguard Worker 
2349*90e502c7SAndroid Build Coastguard Worker     for (p = list; p != NULL; p = next) {
2350*90e502c7SAndroid Build Coastguard Worker         next = p->next;
2351*90e502c7SAndroid Build Coastguard Worker         free(p);
2352*90e502c7SAndroid Build Coastguard Worker     }
2353*90e502c7SAndroid Build Coastguard Worker 
2354*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
2355*90e502c7SAndroid Build Coastguard Worker }
2356*90e502c7SAndroid Build Coastguard Worker 
srtp_test_empty_payload()2357*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_empty_payload()
2358*90e502c7SAndroid Build Coastguard Worker {
2359*90e502c7SAndroid Build Coastguard Worker     srtp_t srtp_snd, srtp_recv;
2360*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
2361*90e502c7SAndroid Build Coastguard Worker     int len;
2362*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t policy;
2363*90e502c7SAndroid Build Coastguard Worker     srtp_hdr_t *mesg;
2364*90e502c7SAndroid Build Coastguard Worker 
2365*90e502c7SAndroid Build Coastguard Worker     /*
2366*90e502c7SAndroid Build Coastguard Worker      * create a session with a single stream using the default srtp
2367*90e502c7SAndroid Build Coastguard Worker      * policy and with the SSRC value 0xcafebabe
2368*90e502c7SAndroid Build Coastguard Worker      */
2369*90e502c7SAndroid Build Coastguard Worker     memset(&policy, 0, sizeof(policy));
2370*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtp_default(&policy.rtp);
2371*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtcp_default(&policy.rtcp);
2372*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.type = ssrc_specific;
2373*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.value = 0xcafebabe;
2374*90e502c7SAndroid Build Coastguard Worker     policy.key = test_key;
2375*90e502c7SAndroid Build Coastguard Worker     policy.ekt = NULL;
2376*90e502c7SAndroid Build Coastguard Worker     policy.window_size = 128;
2377*90e502c7SAndroid Build Coastguard Worker     policy.allow_repeat_tx = 0;
2378*90e502c7SAndroid Build Coastguard Worker     policy.next = NULL;
2379*90e502c7SAndroid Build Coastguard Worker 
2380*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&srtp_snd, &policy);
2381*90e502c7SAndroid Build Coastguard Worker     if (status) {
2382*90e502c7SAndroid Build Coastguard Worker         return status;
2383*90e502c7SAndroid Build Coastguard Worker     }
2384*90e502c7SAndroid Build Coastguard Worker 
2385*90e502c7SAndroid Build Coastguard Worker     mesg = srtp_create_test_packet(0, policy.ssrc.value, &len);
2386*90e502c7SAndroid Build Coastguard Worker     if (mesg == NULL) {
2387*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2388*90e502c7SAndroid Build Coastguard Worker     }
2389*90e502c7SAndroid Build Coastguard Worker 
2390*90e502c7SAndroid Build Coastguard Worker     status = srtp_protect(srtp_snd, mesg, &len);
2391*90e502c7SAndroid Build Coastguard Worker     if (status) {
2392*90e502c7SAndroid Build Coastguard Worker         return status;
2393*90e502c7SAndroid Build Coastguard Worker     } else if (len != 12 + 10) {
2394*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2395*90e502c7SAndroid Build Coastguard Worker     }
2396*90e502c7SAndroid Build Coastguard Worker 
2397*90e502c7SAndroid Build Coastguard Worker     /*
2398*90e502c7SAndroid Build Coastguard Worker      * create a receiver session context comparable to the one created
2399*90e502c7SAndroid Build Coastguard Worker      * above - we need to do this so that the replay checking doesn't
2400*90e502c7SAndroid Build Coastguard Worker      * complain
2401*90e502c7SAndroid Build Coastguard Worker      */
2402*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&srtp_recv, &policy);
2403*90e502c7SAndroid Build Coastguard Worker     if (status) {
2404*90e502c7SAndroid Build Coastguard Worker         return status;
2405*90e502c7SAndroid Build Coastguard Worker     }
2406*90e502c7SAndroid Build Coastguard Worker 
2407*90e502c7SAndroid Build Coastguard Worker     /*
2408*90e502c7SAndroid Build Coastguard Worker      * unprotect ciphertext, then compare with plaintext
2409*90e502c7SAndroid Build Coastguard Worker      */
2410*90e502c7SAndroid Build Coastguard Worker     status = srtp_unprotect(srtp_recv, mesg, &len);
2411*90e502c7SAndroid Build Coastguard Worker     if (status) {
2412*90e502c7SAndroid Build Coastguard Worker         return status;
2413*90e502c7SAndroid Build Coastguard Worker     } else if (len != 12) {
2414*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2415*90e502c7SAndroid Build Coastguard Worker     }
2416*90e502c7SAndroid Build Coastguard Worker 
2417*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(srtp_snd);
2418*90e502c7SAndroid Build Coastguard Worker     if (status) {
2419*90e502c7SAndroid Build Coastguard Worker         return status;
2420*90e502c7SAndroid Build Coastguard Worker     }
2421*90e502c7SAndroid Build Coastguard Worker 
2422*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(srtp_recv);
2423*90e502c7SAndroid Build Coastguard Worker     if (status) {
2424*90e502c7SAndroid Build Coastguard Worker         return status;
2425*90e502c7SAndroid Build Coastguard Worker     }
2426*90e502c7SAndroid Build Coastguard Worker 
2427*90e502c7SAndroid Build Coastguard Worker     free(mesg);
2428*90e502c7SAndroid Build Coastguard Worker 
2429*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
2430*90e502c7SAndroid Build Coastguard Worker }
2431*90e502c7SAndroid Build Coastguard Worker 
2432*90e502c7SAndroid Build Coastguard Worker #ifdef GCM
srtp_test_empty_payload_gcm()2433*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_empty_payload_gcm()
2434*90e502c7SAndroid Build Coastguard Worker {
2435*90e502c7SAndroid Build Coastguard Worker     srtp_t srtp_snd, srtp_recv;
2436*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
2437*90e502c7SAndroid Build Coastguard Worker     int len;
2438*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t policy;
2439*90e502c7SAndroid Build Coastguard Worker     srtp_hdr_t *mesg;
2440*90e502c7SAndroid Build Coastguard Worker 
2441*90e502c7SAndroid Build Coastguard Worker     /*
2442*90e502c7SAndroid Build Coastguard Worker      * create a session with a single stream using the default srtp
2443*90e502c7SAndroid Build Coastguard Worker      * policy and with the SSRC value 0xcafebabe
2444*90e502c7SAndroid Build Coastguard Worker      */
2445*90e502c7SAndroid Build Coastguard Worker     memset(&policy, 0, sizeof(policy));
2446*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_aes_gcm_128_8_auth(&policy.rtp);
2447*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_aes_gcm_128_8_auth(&policy.rtcp);
2448*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.type = ssrc_specific;
2449*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.value = 0xcafebabe;
2450*90e502c7SAndroid Build Coastguard Worker     policy.key = test_key;
2451*90e502c7SAndroid Build Coastguard Worker     policy.ekt = NULL;
2452*90e502c7SAndroid Build Coastguard Worker     policy.window_size = 128;
2453*90e502c7SAndroid Build Coastguard Worker     policy.allow_repeat_tx = 0;
2454*90e502c7SAndroid Build Coastguard Worker     policy.next = NULL;
2455*90e502c7SAndroid Build Coastguard Worker 
2456*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&srtp_snd, &policy);
2457*90e502c7SAndroid Build Coastguard Worker     if (status) {
2458*90e502c7SAndroid Build Coastguard Worker         return status;
2459*90e502c7SAndroid Build Coastguard Worker     }
2460*90e502c7SAndroid Build Coastguard Worker 
2461*90e502c7SAndroid Build Coastguard Worker     mesg = srtp_create_test_packet(0, policy.ssrc.value, &len);
2462*90e502c7SAndroid Build Coastguard Worker     if (mesg == NULL) {
2463*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2464*90e502c7SAndroid Build Coastguard Worker     }
2465*90e502c7SAndroid Build Coastguard Worker 
2466*90e502c7SAndroid Build Coastguard Worker     status = srtp_protect(srtp_snd, mesg, &len);
2467*90e502c7SAndroid Build Coastguard Worker     if (status) {
2468*90e502c7SAndroid Build Coastguard Worker         return status;
2469*90e502c7SAndroid Build Coastguard Worker     } else if (len != 12 + 8) {
2470*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2471*90e502c7SAndroid Build Coastguard Worker     }
2472*90e502c7SAndroid Build Coastguard Worker 
2473*90e502c7SAndroid Build Coastguard Worker     /*
2474*90e502c7SAndroid Build Coastguard Worker      * create a receiver session context comparable to the one created
2475*90e502c7SAndroid Build Coastguard Worker      * above - we need to do this so that the replay checking doesn't
2476*90e502c7SAndroid Build Coastguard Worker      * complain
2477*90e502c7SAndroid Build Coastguard Worker      */
2478*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&srtp_recv, &policy);
2479*90e502c7SAndroid Build Coastguard Worker     if (status) {
2480*90e502c7SAndroid Build Coastguard Worker         return status;
2481*90e502c7SAndroid Build Coastguard Worker     }
2482*90e502c7SAndroid Build Coastguard Worker 
2483*90e502c7SAndroid Build Coastguard Worker     /*
2484*90e502c7SAndroid Build Coastguard Worker      * unprotect ciphertext, then compare with plaintext
2485*90e502c7SAndroid Build Coastguard Worker      */
2486*90e502c7SAndroid Build Coastguard Worker     status = srtp_unprotect(srtp_recv, mesg, &len);
2487*90e502c7SAndroid Build Coastguard Worker     if (status) {
2488*90e502c7SAndroid Build Coastguard Worker         return status;
2489*90e502c7SAndroid Build Coastguard Worker     } else if (len != 12) {
2490*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2491*90e502c7SAndroid Build Coastguard Worker     }
2492*90e502c7SAndroid Build Coastguard Worker 
2493*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(srtp_snd);
2494*90e502c7SAndroid Build Coastguard Worker     if (status) {
2495*90e502c7SAndroid Build Coastguard Worker         return status;
2496*90e502c7SAndroid Build Coastguard Worker     }
2497*90e502c7SAndroid Build Coastguard Worker 
2498*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(srtp_recv);
2499*90e502c7SAndroid Build Coastguard Worker     if (status) {
2500*90e502c7SAndroid Build Coastguard Worker         return status;
2501*90e502c7SAndroid Build Coastguard Worker     }
2502*90e502c7SAndroid Build Coastguard Worker 
2503*90e502c7SAndroid Build Coastguard Worker     free(mesg);
2504*90e502c7SAndroid Build Coastguard Worker 
2505*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
2506*90e502c7SAndroid Build Coastguard Worker }
2507*90e502c7SAndroid Build Coastguard Worker #endif // GCM
2508*90e502c7SAndroid Build Coastguard Worker 
srtp_test_remove_stream()2509*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_remove_stream()
2510*90e502c7SAndroid Build Coastguard Worker {
2511*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
2512*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t *policy_list, policy;
2513*90e502c7SAndroid Build Coastguard Worker     srtp_t session;
2514*90e502c7SAndroid Build Coastguard Worker     srtp_stream_t stream;
2515*90e502c7SAndroid Build Coastguard Worker 
2516*90e502c7SAndroid Build Coastguard Worker     /*
2517*90e502c7SAndroid Build Coastguard Worker      * srtp_get_stream() is a libSRTP internal function that we declare
2518*90e502c7SAndroid Build Coastguard Worker      * here so that we can use it to verify the correct operation of the
2519*90e502c7SAndroid Build Coastguard Worker      * library
2520*90e502c7SAndroid Build Coastguard Worker      */
2521*90e502c7SAndroid Build Coastguard Worker     extern srtp_stream_t srtp_get_stream(srtp_t srtp, uint32_t ssrc);
2522*90e502c7SAndroid Build Coastguard Worker 
2523*90e502c7SAndroid Build Coastguard Worker     status = srtp_create_big_policy(&policy_list);
2524*90e502c7SAndroid Build Coastguard Worker     if (status) {
2525*90e502c7SAndroid Build Coastguard Worker         return status;
2526*90e502c7SAndroid Build Coastguard Worker     }
2527*90e502c7SAndroid Build Coastguard Worker 
2528*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&session, policy_list);
2529*90e502c7SAndroid Build Coastguard Worker     if (status) {
2530*90e502c7SAndroid Build Coastguard Worker         return status;
2531*90e502c7SAndroid Build Coastguard Worker     }
2532*90e502c7SAndroid Build Coastguard Worker 
2533*90e502c7SAndroid Build Coastguard Worker     /*
2534*90e502c7SAndroid Build Coastguard Worker      * check for false positives by trying to remove a stream that's not
2535*90e502c7SAndroid Build Coastguard Worker      * in the session
2536*90e502c7SAndroid Build Coastguard Worker      */
2537*90e502c7SAndroid Build Coastguard Worker     status = srtp_remove_stream(session, htonl(0xaaaaaaaa));
2538*90e502c7SAndroid Build Coastguard Worker     if (status != srtp_err_status_no_ctx) {
2539*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2540*90e502c7SAndroid Build Coastguard Worker     }
2541*90e502c7SAndroid Build Coastguard Worker 
2542*90e502c7SAndroid Build Coastguard Worker     /*
2543*90e502c7SAndroid Build Coastguard Worker      * check for false negatives by removing stream 0x1, then
2544*90e502c7SAndroid Build Coastguard Worker      * searching for streams 0x0 and 0x2
2545*90e502c7SAndroid Build Coastguard Worker      */
2546*90e502c7SAndroid Build Coastguard Worker     status = srtp_remove_stream(session, htonl(0x1));
2547*90e502c7SAndroid Build Coastguard Worker     if (status != srtp_err_status_ok) {
2548*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2549*90e502c7SAndroid Build Coastguard Worker     }
2550*90e502c7SAndroid Build Coastguard Worker     stream = srtp_get_stream(session, htonl(0x0));
2551*90e502c7SAndroid Build Coastguard Worker     if (stream == NULL) {
2552*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2553*90e502c7SAndroid Build Coastguard Worker     }
2554*90e502c7SAndroid Build Coastguard Worker     stream = srtp_get_stream(session, htonl(0x2));
2555*90e502c7SAndroid Build Coastguard Worker     if (stream == NULL) {
2556*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2557*90e502c7SAndroid Build Coastguard Worker     }
2558*90e502c7SAndroid Build Coastguard Worker 
2559*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(session);
2560*90e502c7SAndroid Build Coastguard Worker     if (status != srtp_err_status_ok) {
2561*90e502c7SAndroid Build Coastguard Worker         return status;
2562*90e502c7SAndroid Build Coastguard Worker     }
2563*90e502c7SAndroid Build Coastguard Worker 
2564*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc_big_policy(policy_list);
2565*90e502c7SAndroid Build Coastguard Worker     if (status != srtp_err_status_ok) {
2566*90e502c7SAndroid Build Coastguard Worker         return status;
2567*90e502c7SAndroid Build Coastguard Worker     }
2568*90e502c7SAndroid Build Coastguard Worker 
2569*90e502c7SAndroid Build Coastguard Worker     /* Now test adding and removing a single stream */
2570*90e502c7SAndroid Build Coastguard Worker     memset(&policy, 0, sizeof(policy));
2571*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtp_default(&policy.rtp);
2572*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtcp_default(&policy.rtcp);
2573*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.type = ssrc_specific;
2574*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.value = 0xcafebabe;
2575*90e502c7SAndroid Build Coastguard Worker     policy.key = test_key;
2576*90e502c7SAndroid Build Coastguard Worker     policy.ekt = NULL;
2577*90e502c7SAndroid Build Coastguard Worker     policy.window_size = 128;
2578*90e502c7SAndroid Build Coastguard Worker     policy.allow_repeat_tx = 0;
2579*90e502c7SAndroid Build Coastguard Worker     policy.next = NULL;
2580*90e502c7SAndroid Build Coastguard Worker 
2581*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&session, NULL);
2582*90e502c7SAndroid Build Coastguard Worker     if (status != srtp_err_status_ok) {
2583*90e502c7SAndroid Build Coastguard Worker         return status;
2584*90e502c7SAndroid Build Coastguard Worker     }
2585*90e502c7SAndroid Build Coastguard Worker 
2586*90e502c7SAndroid Build Coastguard Worker     status = srtp_add_stream(session, &policy);
2587*90e502c7SAndroid Build Coastguard Worker     if (status != srtp_err_status_ok) {
2588*90e502c7SAndroid Build Coastguard Worker         return status;
2589*90e502c7SAndroid Build Coastguard Worker     }
2590*90e502c7SAndroid Build Coastguard Worker 
2591*90e502c7SAndroid Build Coastguard Worker     status = srtp_remove_stream(session, htonl(0xcafebabe));
2592*90e502c7SAndroid Build Coastguard Worker     if (status != srtp_err_status_ok) {
2593*90e502c7SAndroid Build Coastguard Worker         return status;
2594*90e502c7SAndroid Build Coastguard Worker     }
2595*90e502c7SAndroid Build Coastguard Worker 
2596*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(session);
2597*90e502c7SAndroid Build Coastguard Worker     if (status != srtp_err_status_ok) {
2598*90e502c7SAndroid Build Coastguard Worker         return status;
2599*90e502c7SAndroid Build Coastguard Worker     }
2600*90e502c7SAndroid Build Coastguard Worker 
2601*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
2602*90e502c7SAndroid Build Coastguard Worker }
2603*90e502c7SAndroid Build Coastguard Worker 
2604*90e502c7SAndroid Build Coastguard Worker // clang-format off
2605*90e502c7SAndroid Build Coastguard Worker unsigned char test_alt_key[46] = {
2606*90e502c7SAndroid Build Coastguard Worker   0xe5, 0x19, 0x6f, 0x01, 0x5e, 0xf1, 0x9b, 0xe1,
2607*90e502c7SAndroid Build Coastguard Worker   0xd7, 0x47, 0xa7, 0x27, 0x07, 0xd7, 0x47, 0x33,
2608*90e502c7SAndroid Build Coastguard Worker   0x01, 0xc2, 0x35, 0x4d, 0x59, 0x6a, 0xf7, 0x84,
2609*90e502c7SAndroid Build Coastguard Worker   0x96, 0x98, 0xeb, 0xaa, 0xac, 0xf6, 0xa1, 0x45,
2610*90e502c7SAndroid Build Coastguard Worker   0xc7, 0x15, 0xe2, 0xea, 0xfe, 0x55, 0x67, 0x96,
2611*90e502c7SAndroid Build Coastguard Worker   0xb6, 0x96, 0x0b, 0x3a, 0xab, 0xe6
2612*90e502c7SAndroid Build Coastguard Worker };
2613*90e502c7SAndroid Build Coastguard Worker // clang-format on
2614*90e502c7SAndroid Build Coastguard Worker 
2615*90e502c7SAndroid Build Coastguard Worker /*
2616*90e502c7SAndroid Build Coastguard Worker  * srtp_test_update() verifies updating/rekeying exsisting streams.
2617*90e502c7SAndroid Build Coastguard Worker  * As stated in https://tools.ietf.org/html/rfc3711#section-3.3.1
2618*90e502c7SAndroid Build Coastguard Worker  * the value of the ROC must not be reset after a rekey, this test
2619*90e502c7SAndroid Build Coastguard Worker  * atempts to prove that srtp_update does not reset the ROC.
2620*90e502c7SAndroid Build Coastguard Worker  */
2621*90e502c7SAndroid Build Coastguard Worker 
srtp_test_update()2622*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_update()
2623*90e502c7SAndroid Build Coastguard Worker {
2624*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
2625*90e502c7SAndroid Build Coastguard Worker     uint32_t ssrc = 0x12121212;
2626*90e502c7SAndroid Build Coastguard Worker     int msg_len_octets = 32;
2627*90e502c7SAndroid Build Coastguard Worker     int protected_msg_len_octets;
2628*90e502c7SAndroid Build Coastguard Worker     srtp_hdr_t *msg;
2629*90e502c7SAndroid Build Coastguard Worker     srtp_t srtp_snd, srtp_recv;
2630*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t policy;
2631*90e502c7SAndroid Build Coastguard Worker 
2632*90e502c7SAndroid Build Coastguard Worker     memset(&policy, 0, sizeof(policy));
2633*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtp_default(&policy.rtp);
2634*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtcp_default(&policy.rtcp);
2635*90e502c7SAndroid Build Coastguard Worker     policy.ekt = NULL;
2636*90e502c7SAndroid Build Coastguard Worker     policy.window_size = 128;
2637*90e502c7SAndroid Build Coastguard Worker     policy.allow_repeat_tx = 0;
2638*90e502c7SAndroid Build Coastguard Worker     policy.next = NULL;
2639*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.type = ssrc_any_outbound;
2640*90e502c7SAndroid Build Coastguard Worker     policy.key = test_key;
2641*90e502c7SAndroid Build Coastguard Worker 
2642*90e502c7SAndroid Build Coastguard Worker     /* create a send and recive ctx with defualt profile and test_key */
2643*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&srtp_recv, &policy);
2644*90e502c7SAndroid Build Coastguard Worker     if (status)
2645*90e502c7SAndroid Build Coastguard Worker         return status;
2646*90e502c7SAndroid Build Coastguard Worker 
2647*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.type = ssrc_any_inbound;
2648*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&srtp_snd, &policy);
2649*90e502c7SAndroid Build Coastguard Worker     if (status)
2650*90e502c7SAndroid Build Coastguard Worker         return status;
2651*90e502c7SAndroid Build Coastguard Worker 
2652*90e502c7SAndroid Build Coastguard Worker     /* protect and unprotect two msg's that will cause the ROC to be equal to 1
2653*90e502c7SAndroid Build Coastguard Worker      */
2654*90e502c7SAndroid Build Coastguard Worker     msg = srtp_create_test_packet(msg_len_octets, ssrc,
2655*90e502c7SAndroid Build Coastguard Worker                                   &protected_msg_len_octets);
2656*90e502c7SAndroid Build Coastguard Worker     if (msg == NULL)
2657*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_alloc_fail;
2658*90e502c7SAndroid Build Coastguard Worker     msg->seq = htons(65535);
2659*90e502c7SAndroid Build Coastguard Worker 
2660*90e502c7SAndroid Build Coastguard Worker     status = srtp_protect(srtp_snd, msg, &protected_msg_len_octets);
2661*90e502c7SAndroid Build Coastguard Worker     if (status)
2662*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2663*90e502c7SAndroid Build Coastguard Worker 
2664*90e502c7SAndroid Build Coastguard Worker     status = srtp_unprotect(srtp_recv, msg, &protected_msg_len_octets);
2665*90e502c7SAndroid Build Coastguard Worker     if (status)
2666*90e502c7SAndroid Build Coastguard Worker         return status;
2667*90e502c7SAndroid Build Coastguard Worker 
2668*90e502c7SAndroid Build Coastguard Worker     free(msg);
2669*90e502c7SAndroid Build Coastguard Worker 
2670*90e502c7SAndroid Build Coastguard Worker     msg = srtp_create_test_packet(msg_len_octets, ssrc,
2671*90e502c7SAndroid Build Coastguard Worker                                   &protected_msg_len_octets);
2672*90e502c7SAndroid Build Coastguard Worker     if (msg == NULL)
2673*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_alloc_fail;
2674*90e502c7SAndroid Build Coastguard Worker     msg->seq = htons(1);
2675*90e502c7SAndroid Build Coastguard Worker 
2676*90e502c7SAndroid Build Coastguard Worker     status = srtp_protect(srtp_snd, msg, &protected_msg_len_octets);
2677*90e502c7SAndroid Build Coastguard Worker     if (status)
2678*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2679*90e502c7SAndroid Build Coastguard Worker 
2680*90e502c7SAndroid Build Coastguard Worker     status = srtp_unprotect(srtp_recv, msg, &protected_msg_len_octets);
2681*90e502c7SAndroid Build Coastguard Worker     if (status)
2682*90e502c7SAndroid Build Coastguard Worker         return status;
2683*90e502c7SAndroid Build Coastguard Worker 
2684*90e502c7SAndroid Build Coastguard Worker     free(msg);
2685*90e502c7SAndroid Build Coastguard Worker 
2686*90e502c7SAndroid Build Coastguard Worker     /* update send ctx with same test_key t verify update works*/
2687*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.type = ssrc_any_outbound;
2688*90e502c7SAndroid Build Coastguard Worker     policy.key = test_key;
2689*90e502c7SAndroid Build Coastguard Worker     status = srtp_update(srtp_snd, &policy);
2690*90e502c7SAndroid Build Coastguard Worker     if (status)
2691*90e502c7SAndroid Build Coastguard Worker         return status;
2692*90e502c7SAndroid Build Coastguard Worker 
2693*90e502c7SAndroid Build Coastguard Worker     msg = srtp_create_test_packet(msg_len_octets, ssrc,
2694*90e502c7SAndroid Build Coastguard Worker                                   &protected_msg_len_octets);
2695*90e502c7SAndroid Build Coastguard Worker     if (msg == NULL)
2696*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_alloc_fail;
2697*90e502c7SAndroid Build Coastguard Worker     msg->seq = htons(2);
2698*90e502c7SAndroid Build Coastguard Worker 
2699*90e502c7SAndroid Build Coastguard Worker     status = srtp_protect(srtp_snd, msg, &protected_msg_len_octets);
2700*90e502c7SAndroid Build Coastguard Worker     if (status)
2701*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2702*90e502c7SAndroid Build Coastguard Worker 
2703*90e502c7SAndroid Build Coastguard Worker     status = srtp_unprotect(srtp_recv, msg, &protected_msg_len_octets);
2704*90e502c7SAndroid Build Coastguard Worker     if (status)
2705*90e502c7SAndroid Build Coastguard Worker         return status;
2706*90e502c7SAndroid Build Coastguard Worker 
2707*90e502c7SAndroid Build Coastguard Worker     free(msg);
2708*90e502c7SAndroid Build Coastguard Worker 
2709*90e502c7SAndroid Build Coastguard Worker     /* update send ctx to use test_alt_key */
2710*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.type = ssrc_any_outbound;
2711*90e502c7SAndroid Build Coastguard Worker     policy.key = test_alt_key;
2712*90e502c7SAndroid Build Coastguard Worker     status = srtp_update(srtp_snd, &policy);
2713*90e502c7SAndroid Build Coastguard Worker     if (status)
2714*90e502c7SAndroid Build Coastguard Worker         return status;
2715*90e502c7SAndroid Build Coastguard Worker 
2716*90e502c7SAndroid Build Coastguard Worker     /* create and protect msg with new key and ROC still equal to 1 */
2717*90e502c7SAndroid Build Coastguard Worker     msg = srtp_create_test_packet(msg_len_octets, ssrc,
2718*90e502c7SAndroid Build Coastguard Worker                                   &protected_msg_len_octets);
2719*90e502c7SAndroid Build Coastguard Worker     if (msg == NULL)
2720*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_alloc_fail;
2721*90e502c7SAndroid Build Coastguard Worker     msg->seq = htons(3);
2722*90e502c7SAndroid Build Coastguard Worker 
2723*90e502c7SAndroid Build Coastguard Worker     status = srtp_protect(srtp_snd, msg, &protected_msg_len_octets);
2724*90e502c7SAndroid Build Coastguard Worker     if (status)
2725*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2726*90e502c7SAndroid Build Coastguard Worker 
2727*90e502c7SAndroid Build Coastguard Worker     /* verify that recive ctx will fail to unprotect as it still uses test_key
2728*90e502c7SAndroid Build Coastguard Worker      */
2729*90e502c7SAndroid Build Coastguard Worker     status = srtp_unprotect(srtp_recv, msg, &protected_msg_len_octets);
2730*90e502c7SAndroid Build Coastguard Worker     if (status == srtp_err_status_ok)
2731*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2732*90e502c7SAndroid Build Coastguard Worker 
2733*90e502c7SAndroid Build Coastguard Worker     /* create a new recvieve ctx with test_alt_key but since it is new it will
2734*90e502c7SAndroid Build Coastguard Worker      * have ROC equal to 1
2735*90e502c7SAndroid Build Coastguard Worker      * and therefore should fail to unprotected */
2736*90e502c7SAndroid Build Coastguard Worker     {
2737*90e502c7SAndroid Build Coastguard Worker         srtp_t srtp_recv_roc_0;
2738*90e502c7SAndroid Build Coastguard Worker 
2739*90e502c7SAndroid Build Coastguard Worker         policy.ssrc.type = ssrc_any_inbound;
2740*90e502c7SAndroid Build Coastguard Worker         policy.key = test_alt_key;
2741*90e502c7SAndroid Build Coastguard Worker         status = srtp_create(&srtp_recv_roc_0, &policy);
2742*90e502c7SAndroid Build Coastguard Worker         if (status)
2743*90e502c7SAndroid Build Coastguard Worker             return status;
2744*90e502c7SAndroid Build Coastguard Worker 
2745*90e502c7SAndroid Build Coastguard Worker         status =
2746*90e502c7SAndroid Build Coastguard Worker             srtp_unprotect(srtp_recv_roc_0, msg, &protected_msg_len_octets);
2747*90e502c7SAndroid Build Coastguard Worker         if (status == srtp_err_status_ok)
2748*90e502c7SAndroid Build Coastguard Worker             return srtp_err_status_fail;
2749*90e502c7SAndroid Build Coastguard Worker 
2750*90e502c7SAndroid Build Coastguard Worker         status = srtp_dealloc(srtp_recv_roc_0);
2751*90e502c7SAndroid Build Coastguard Worker         if (status)
2752*90e502c7SAndroid Build Coastguard Worker             return status;
2753*90e502c7SAndroid Build Coastguard Worker     }
2754*90e502c7SAndroid Build Coastguard Worker 
2755*90e502c7SAndroid Build Coastguard Worker     /* update recive ctx to use test_alt_key */
2756*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.type = ssrc_any_inbound;
2757*90e502c7SAndroid Build Coastguard Worker     policy.key = test_alt_key;
2758*90e502c7SAndroid Build Coastguard Worker     status = srtp_update(srtp_recv, &policy);
2759*90e502c7SAndroid Build Coastguard Worker     if (status)
2760*90e502c7SAndroid Build Coastguard Worker         return status;
2761*90e502c7SAndroid Build Coastguard Worker 
2762*90e502c7SAndroid Build Coastguard Worker     /* verify that can still unprotect, therfore key is updated and ROC value is
2763*90e502c7SAndroid Build Coastguard Worker      * preserved */
2764*90e502c7SAndroid Build Coastguard Worker     status = srtp_unprotect(srtp_recv, msg, &protected_msg_len_octets);
2765*90e502c7SAndroid Build Coastguard Worker     if (status)
2766*90e502c7SAndroid Build Coastguard Worker         return status;
2767*90e502c7SAndroid Build Coastguard Worker 
2768*90e502c7SAndroid Build Coastguard Worker     free(msg);
2769*90e502c7SAndroid Build Coastguard Worker 
2770*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(srtp_snd);
2771*90e502c7SAndroid Build Coastguard Worker     if (status)
2772*90e502c7SAndroid Build Coastguard Worker         return status;
2773*90e502c7SAndroid Build Coastguard Worker 
2774*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(srtp_recv);
2775*90e502c7SAndroid Build Coastguard Worker     if (status)
2776*90e502c7SAndroid Build Coastguard Worker         return status;
2777*90e502c7SAndroid Build Coastguard Worker 
2778*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
2779*90e502c7SAndroid Build Coastguard Worker }
2780*90e502c7SAndroid Build Coastguard Worker 
srtp_test_setup_protect_trailer_streams(srtp_t * srtp_send,srtp_t * srtp_send_mki,srtp_t * srtp_send_aes_gcm,srtp_t * srtp_send_aes_gcm_mki)2781*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_setup_protect_trailer_streams(
2782*90e502c7SAndroid Build Coastguard Worker     srtp_t *srtp_send,
2783*90e502c7SAndroid Build Coastguard Worker     srtp_t *srtp_send_mki,
2784*90e502c7SAndroid Build Coastguard Worker     srtp_t *srtp_send_aes_gcm,
2785*90e502c7SAndroid Build Coastguard Worker     srtp_t *srtp_send_aes_gcm_mki)
2786*90e502c7SAndroid Build Coastguard Worker {
2787*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
2788*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t policy;
2789*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t policy_mki;
2790*90e502c7SAndroid Build Coastguard Worker 
2791*90e502c7SAndroid Build Coastguard Worker #ifdef GCM
2792*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t policy_aes_gcm;
2793*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t policy_aes_gcm_mki;
2794*90e502c7SAndroid Build Coastguard Worker #endif // GCM
2795*90e502c7SAndroid Build Coastguard Worker 
2796*90e502c7SAndroid Build Coastguard Worker     memset(&policy, 0, sizeof(policy));
2797*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtp_default(&policy.rtp);
2798*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtcp_default(&policy.rtcp);
2799*90e502c7SAndroid Build Coastguard Worker     policy.ekt = NULL;
2800*90e502c7SAndroid Build Coastguard Worker     policy.window_size = 128;
2801*90e502c7SAndroid Build Coastguard Worker     policy.allow_repeat_tx = 0;
2802*90e502c7SAndroid Build Coastguard Worker     policy.next = NULL;
2803*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.type = ssrc_any_outbound;
2804*90e502c7SAndroid Build Coastguard Worker     policy.key = test_key;
2805*90e502c7SAndroid Build Coastguard Worker 
2806*90e502c7SAndroid Build Coastguard Worker     memset(&policy_mki, 0, sizeof(policy_mki));
2807*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtp_default(&policy_mki.rtp);
2808*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtcp_default(&policy_mki.rtcp);
2809*90e502c7SAndroid Build Coastguard Worker     policy_mki.ekt = NULL;
2810*90e502c7SAndroid Build Coastguard Worker     policy_mki.window_size = 128;
2811*90e502c7SAndroid Build Coastguard Worker     policy_mki.allow_repeat_tx = 0;
2812*90e502c7SAndroid Build Coastguard Worker     policy_mki.next = NULL;
2813*90e502c7SAndroid Build Coastguard Worker     policy_mki.ssrc.type = ssrc_any_outbound;
2814*90e502c7SAndroid Build Coastguard Worker     policy_mki.key = NULL;
2815*90e502c7SAndroid Build Coastguard Worker     policy_mki.keys = test_keys;
2816*90e502c7SAndroid Build Coastguard Worker     policy_mki.num_master_keys = 2;
2817*90e502c7SAndroid Build Coastguard Worker 
2818*90e502c7SAndroid Build Coastguard Worker #ifdef GCM
2819*90e502c7SAndroid Build Coastguard Worker     memset(&policy_aes_gcm, 0, sizeof(policy_aes_gcm));
2820*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_aes_gcm_128_16_auth(&policy_aes_gcm.rtp);
2821*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_aes_gcm_128_16_auth(&policy_aes_gcm.rtcp);
2822*90e502c7SAndroid Build Coastguard Worker     policy_aes_gcm.ekt = NULL;
2823*90e502c7SAndroid Build Coastguard Worker     policy_aes_gcm.window_size = 128;
2824*90e502c7SAndroid Build Coastguard Worker     policy_aes_gcm.allow_repeat_tx = 0;
2825*90e502c7SAndroid Build Coastguard Worker     policy_aes_gcm.next = NULL;
2826*90e502c7SAndroid Build Coastguard Worker     policy_aes_gcm.ssrc.type = ssrc_any_outbound;
2827*90e502c7SAndroid Build Coastguard Worker     policy_aes_gcm.key = test_key;
2828*90e502c7SAndroid Build Coastguard Worker 
2829*90e502c7SAndroid Build Coastguard Worker     memset(&policy_aes_gcm_mki, 0, sizeof(policy_aes_gcm_mki));
2830*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_aes_gcm_128_16_auth(&policy_aes_gcm_mki.rtp);
2831*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_aes_gcm_128_16_auth(&policy_aes_gcm_mki.rtcp);
2832*90e502c7SAndroid Build Coastguard Worker     policy_aes_gcm_mki.ekt = NULL;
2833*90e502c7SAndroid Build Coastguard Worker     policy_aes_gcm_mki.window_size = 128;
2834*90e502c7SAndroid Build Coastguard Worker     policy_aes_gcm_mki.allow_repeat_tx = 0;
2835*90e502c7SAndroid Build Coastguard Worker     policy_aes_gcm_mki.next = NULL;
2836*90e502c7SAndroid Build Coastguard Worker     policy_aes_gcm_mki.ssrc.type = ssrc_any_outbound;
2837*90e502c7SAndroid Build Coastguard Worker     policy_aes_gcm_mki.key = NULL;
2838*90e502c7SAndroid Build Coastguard Worker     policy_aes_gcm_mki.keys = test_keys;
2839*90e502c7SAndroid Build Coastguard Worker     policy_aes_gcm_mki.num_master_keys = 2;
2840*90e502c7SAndroid Build Coastguard Worker #endif // GCM
2841*90e502c7SAndroid Build Coastguard Worker 
2842*90e502c7SAndroid Build Coastguard Worker     /* create a send ctx with defualt profile and test_key */
2843*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(srtp_send, &policy);
2844*90e502c7SAndroid Build Coastguard Worker     if (status)
2845*90e502c7SAndroid Build Coastguard Worker         return status;
2846*90e502c7SAndroid Build Coastguard Worker 
2847*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(srtp_send_mki, &policy_mki);
2848*90e502c7SAndroid Build Coastguard Worker     if (status)
2849*90e502c7SAndroid Build Coastguard Worker         return status;
2850*90e502c7SAndroid Build Coastguard Worker 
2851*90e502c7SAndroid Build Coastguard Worker #ifdef GCM
2852*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(srtp_send_aes_gcm, &policy_aes_gcm);
2853*90e502c7SAndroid Build Coastguard Worker     if (status)
2854*90e502c7SAndroid Build Coastguard Worker         return status;
2855*90e502c7SAndroid Build Coastguard Worker 
2856*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(srtp_send_aes_gcm_mki, &policy_aes_gcm_mki);
2857*90e502c7SAndroid Build Coastguard Worker     if (status)
2858*90e502c7SAndroid Build Coastguard Worker         return status;
2859*90e502c7SAndroid Build Coastguard Worker #endif // GCM
2860*90e502c7SAndroid Build Coastguard Worker 
2861*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
2862*90e502c7SAndroid Build Coastguard Worker }
2863*90e502c7SAndroid Build Coastguard Worker 
srtp_test_protect_trailer_length()2864*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_protect_trailer_length()
2865*90e502c7SAndroid Build Coastguard Worker {
2866*90e502c7SAndroid Build Coastguard Worker     srtp_t srtp_send;
2867*90e502c7SAndroid Build Coastguard Worker     srtp_t srtp_send_mki;
2868*90e502c7SAndroid Build Coastguard Worker     srtp_t srtp_send_aes_gcm;
2869*90e502c7SAndroid Build Coastguard Worker     srtp_t srtp_send_aes_gcm_mki;
2870*90e502c7SAndroid Build Coastguard Worker     uint32_t length = 0;
2871*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
2872*90e502c7SAndroid Build Coastguard Worker 
2873*90e502c7SAndroid Build Coastguard Worker     srtp_test_setup_protect_trailer_streams(
2874*90e502c7SAndroid Build Coastguard Worker         &srtp_send, &srtp_send_mki, &srtp_send_aes_gcm, &srtp_send_aes_gcm_mki);
2875*90e502c7SAndroid Build Coastguard Worker 
2876*90e502c7SAndroid Build Coastguard Worker     status = srtp_get_protect_trailer_length(srtp_send, 0, 0, &length);
2877*90e502c7SAndroid Build Coastguard Worker     if (status)
2878*90e502c7SAndroid Build Coastguard Worker         return status;
2879*90e502c7SAndroid Build Coastguard Worker 
2880*90e502c7SAndroid Build Coastguard Worker     /*  TAG Length: 10 bytes */
2881*90e502c7SAndroid Build Coastguard Worker     if (length != 10)
2882*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2883*90e502c7SAndroid Build Coastguard Worker 
2884*90e502c7SAndroid Build Coastguard Worker     status = srtp_get_protect_trailer_length(srtp_send_mki, 1, 1, &length);
2885*90e502c7SAndroid Build Coastguard Worker     if (status)
2886*90e502c7SAndroid Build Coastguard Worker         return status;
2887*90e502c7SAndroid Build Coastguard Worker 
2888*90e502c7SAndroid Build Coastguard Worker     /*  TAG Length: 10 bytes + MKI length: 4 bytes*/
2889*90e502c7SAndroid Build Coastguard Worker     if (length != 14)
2890*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2891*90e502c7SAndroid Build Coastguard Worker 
2892*90e502c7SAndroid Build Coastguard Worker #ifdef GCM
2893*90e502c7SAndroid Build Coastguard Worker     status = srtp_get_protect_trailer_length(srtp_send_aes_gcm, 0, 0, &length);
2894*90e502c7SAndroid Build Coastguard Worker     if (status)
2895*90e502c7SAndroid Build Coastguard Worker         return status;
2896*90e502c7SAndroid Build Coastguard Worker 
2897*90e502c7SAndroid Build Coastguard Worker     /*  TAG Length: 16 bytes */
2898*90e502c7SAndroid Build Coastguard Worker     if (length != 16)
2899*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2900*90e502c7SAndroid Build Coastguard Worker 
2901*90e502c7SAndroid Build Coastguard Worker     status =
2902*90e502c7SAndroid Build Coastguard Worker         srtp_get_protect_trailer_length(srtp_send_aes_gcm_mki, 1, 1, &length);
2903*90e502c7SAndroid Build Coastguard Worker     if (status)
2904*90e502c7SAndroid Build Coastguard Worker         return status;
2905*90e502c7SAndroid Build Coastguard Worker 
2906*90e502c7SAndroid Build Coastguard Worker     /*  TAG Length: 16 bytes + MKI length: 4 bytes*/
2907*90e502c7SAndroid Build Coastguard Worker     if (length != 20)
2908*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2909*90e502c7SAndroid Build Coastguard Worker #endif // GCM
2910*90e502c7SAndroid Build Coastguard Worker 
2911*90e502c7SAndroid Build Coastguard Worker     srtp_dealloc(srtp_send);
2912*90e502c7SAndroid Build Coastguard Worker     srtp_dealloc(srtp_send_mki);
2913*90e502c7SAndroid Build Coastguard Worker #ifdef GCM
2914*90e502c7SAndroid Build Coastguard Worker     srtp_dealloc(srtp_send_aes_gcm);
2915*90e502c7SAndroid Build Coastguard Worker     srtp_dealloc(srtp_send_aes_gcm_mki);
2916*90e502c7SAndroid Build Coastguard Worker #endif
2917*90e502c7SAndroid Build Coastguard Worker 
2918*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
2919*90e502c7SAndroid Build Coastguard Worker }
2920*90e502c7SAndroid Build Coastguard Worker 
srtp_test_protect_rtcp_trailer_length()2921*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_protect_rtcp_trailer_length()
2922*90e502c7SAndroid Build Coastguard Worker {
2923*90e502c7SAndroid Build Coastguard Worker     srtp_t srtp_send;
2924*90e502c7SAndroid Build Coastguard Worker     srtp_t srtp_send_mki;
2925*90e502c7SAndroid Build Coastguard Worker     srtp_t srtp_send_aes_gcm;
2926*90e502c7SAndroid Build Coastguard Worker     srtp_t srtp_send_aes_gcm_mki;
2927*90e502c7SAndroid Build Coastguard Worker     uint32_t length = 0;
2928*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
2929*90e502c7SAndroid Build Coastguard Worker 
2930*90e502c7SAndroid Build Coastguard Worker     srtp_test_setup_protect_trailer_streams(
2931*90e502c7SAndroid Build Coastguard Worker         &srtp_send, &srtp_send_mki, &srtp_send_aes_gcm, &srtp_send_aes_gcm_mki);
2932*90e502c7SAndroid Build Coastguard Worker 
2933*90e502c7SAndroid Build Coastguard Worker     status = srtp_get_protect_rtcp_trailer_length(srtp_send, 0, 0, &length);
2934*90e502c7SAndroid Build Coastguard Worker     if (status)
2935*90e502c7SAndroid Build Coastguard Worker         return status;
2936*90e502c7SAndroid Build Coastguard Worker 
2937*90e502c7SAndroid Build Coastguard Worker     /*  TAG Length: 10 bytes + SRTCP Trailer 4 bytes*/
2938*90e502c7SAndroid Build Coastguard Worker     if (length != 14)
2939*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2940*90e502c7SAndroid Build Coastguard Worker 
2941*90e502c7SAndroid Build Coastguard Worker     status = srtp_get_protect_rtcp_trailer_length(srtp_send_mki, 1, 1, &length);
2942*90e502c7SAndroid Build Coastguard Worker     if (status)
2943*90e502c7SAndroid Build Coastguard Worker         return status;
2944*90e502c7SAndroid Build Coastguard Worker 
2945*90e502c7SAndroid Build Coastguard Worker     /*  TAG Length: 10 bytes + SRTCP Trailer 4 bytes + MKI 4 bytes*/
2946*90e502c7SAndroid Build Coastguard Worker     if (length != 18)
2947*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2948*90e502c7SAndroid Build Coastguard Worker 
2949*90e502c7SAndroid Build Coastguard Worker #ifdef GCM
2950*90e502c7SAndroid Build Coastguard Worker     status =
2951*90e502c7SAndroid Build Coastguard Worker         srtp_get_protect_rtcp_trailer_length(srtp_send_aes_gcm, 0, 0, &length);
2952*90e502c7SAndroid Build Coastguard Worker     if (status)
2953*90e502c7SAndroid Build Coastguard Worker         return status;
2954*90e502c7SAndroid Build Coastguard Worker 
2955*90e502c7SAndroid Build Coastguard Worker     /*  TAG Length: 16 bytes + SRTCP Trailer 4 bytes*/
2956*90e502c7SAndroid Build Coastguard Worker     if (length != 20)
2957*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2958*90e502c7SAndroid Build Coastguard Worker 
2959*90e502c7SAndroid Build Coastguard Worker     status = srtp_get_protect_rtcp_trailer_length(srtp_send_aes_gcm_mki, 1, 1,
2960*90e502c7SAndroid Build Coastguard Worker                                                   &length);
2961*90e502c7SAndroid Build Coastguard Worker     if (status)
2962*90e502c7SAndroid Build Coastguard Worker         return status;
2963*90e502c7SAndroid Build Coastguard Worker 
2964*90e502c7SAndroid Build Coastguard Worker     /*  TAG Length: 16 bytes + SRTCP Trailer 4 bytes + MKI 4 bytes*/
2965*90e502c7SAndroid Build Coastguard Worker     if (length != 24)
2966*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
2967*90e502c7SAndroid Build Coastguard Worker #endif // GCM
2968*90e502c7SAndroid Build Coastguard Worker 
2969*90e502c7SAndroid Build Coastguard Worker     srtp_dealloc(srtp_send);
2970*90e502c7SAndroid Build Coastguard Worker     srtp_dealloc(srtp_send_mki);
2971*90e502c7SAndroid Build Coastguard Worker #ifdef GCM
2972*90e502c7SAndroid Build Coastguard Worker     srtp_dealloc(srtp_send_aes_gcm);
2973*90e502c7SAndroid Build Coastguard Worker     srtp_dealloc(srtp_send_aes_gcm_mki);
2974*90e502c7SAndroid Build Coastguard Worker #endif
2975*90e502c7SAndroid Build Coastguard Worker 
2976*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
2977*90e502c7SAndroid Build Coastguard Worker }
2978*90e502c7SAndroid Build Coastguard Worker 
srtp_test_get_roc()2979*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_get_roc()
2980*90e502c7SAndroid Build Coastguard Worker {
2981*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
2982*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t policy;
2983*90e502c7SAndroid Build Coastguard Worker     srtp_t session;
2984*90e502c7SAndroid Build Coastguard Worker     srtp_hdr_t *pkt;
2985*90e502c7SAndroid Build Coastguard Worker     uint32_t i;
2986*90e502c7SAndroid Build Coastguard Worker     uint32_t roc;
2987*90e502c7SAndroid Build Coastguard Worker     uint32_t ts;
2988*90e502c7SAndroid Build Coastguard Worker     uint16_t seq;
2989*90e502c7SAndroid Build Coastguard Worker 
2990*90e502c7SAndroid Build Coastguard Worker     int msg_len_octets = 32;
2991*90e502c7SAndroid Build Coastguard Worker     int protected_msg_len_octets;
2992*90e502c7SAndroid Build Coastguard Worker 
2993*90e502c7SAndroid Build Coastguard Worker     memset(&policy, 0, sizeof(policy));
2994*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtp_default(&policy.rtp);
2995*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtcp_default(&policy.rtcp);
2996*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.type = ssrc_specific;
2997*90e502c7SAndroid Build Coastguard Worker     policy.ssrc.value = 0xcafebabe;
2998*90e502c7SAndroid Build Coastguard Worker     policy.key = test_key;
2999*90e502c7SAndroid Build Coastguard Worker     policy.window_size = 128;
3000*90e502c7SAndroid Build Coastguard Worker 
3001*90e502c7SAndroid Build Coastguard Worker     /* Create a sender session */
3002*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&session, &policy);
3003*90e502c7SAndroid Build Coastguard Worker     if (status) {
3004*90e502c7SAndroid Build Coastguard Worker         return status;
3005*90e502c7SAndroid Build Coastguard Worker     }
3006*90e502c7SAndroid Build Coastguard Worker 
3007*90e502c7SAndroid Build Coastguard Worker     /* Set start sequence so we roll over */
3008*90e502c7SAndroid Build Coastguard Worker     seq = 65535;
3009*90e502c7SAndroid Build Coastguard Worker     ts = 0;
3010*90e502c7SAndroid Build Coastguard Worker 
3011*90e502c7SAndroid Build Coastguard Worker     for (i = 0; i < 2; i++) {
3012*90e502c7SAndroid Build Coastguard Worker         pkt = srtp_create_test_packet_extended(msg_len_octets,
3013*90e502c7SAndroid Build Coastguard Worker                                                policy.ssrc.value, seq, ts,
3014*90e502c7SAndroid Build Coastguard Worker                                                &protected_msg_len_octets);
3015*90e502c7SAndroid Build Coastguard Worker         status = srtp_protect(session, pkt, &protected_msg_len_octets);
3016*90e502c7SAndroid Build Coastguard Worker         free(pkt);
3017*90e502c7SAndroid Build Coastguard Worker         if (status) {
3018*90e502c7SAndroid Build Coastguard Worker             return status;
3019*90e502c7SAndroid Build Coastguard Worker         }
3020*90e502c7SAndroid Build Coastguard Worker 
3021*90e502c7SAndroid Build Coastguard Worker         status = srtp_get_stream_roc(session, policy.ssrc.value, &roc);
3022*90e502c7SAndroid Build Coastguard Worker         if (status) {
3023*90e502c7SAndroid Build Coastguard Worker             return status;
3024*90e502c7SAndroid Build Coastguard Worker         }
3025*90e502c7SAndroid Build Coastguard Worker 
3026*90e502c7SAndroid Build Coastguard Worker         if (roc != i) {
3027*90e502c7SAndroid Build Coastguard Worker             return srtp_err_status_fail;
3028*90e502c7SAndroid Build Coastguard Worker         }
3029*90e502c7SAndroid Build Coastguard Worker 
3030*90e502c7SAndroid Build Coastguard Worker         seq++;
3031*90e502c7SAndroid Build Coastguard Worker         ts++;
3032*90e502c7SAndroid Build Coastguard Worker     }
3033*90e502c7SAndroid Build Coastguard Worker 
3034*90e502c7SAndroid Build Coastguard Worker     /* Cleanup */
3035*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(session);
3036*90e502c7SAndroid Build Coastguard Worker     if (status) {
3037*90e502c7SAndroid Build Coastguard Worker         return status;
3038*90e502c7SAndroid Build Coastguard Worker     }
3039*90e502c7SAndroid Build Coastguard Worker 
3040*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
3041*90e502c7SAndroid Build Coastguard Worker }
3042*90e502c7SAndroid Build Coastguard Worker 
test_set_receiver_roc(uint32_t packets,uint32_t roc_to_set)3043*90e502c7SAndroid Build Coastguard Worker static srtp_err_status_t test_set_receiver_roc(uint32_t packets,
3044*90e502c7SAndroid Build Coastguard Worker                                                uint32_t roc_to_set)
3045*90e502c7SAndroid Build Coastguard Worker {
3046*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
3047*90e502c7SAndroid Build Coastguard Worker 
3048*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t sender_policy;
3049*90e502c7SAndroid Build Coastguard Worker     srtp_t sender_session;
3050*90e502c7SAndroid Build Coastguard Worker 
3051*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t receiver_policy;
3052*90e502c7SAndroid Build Coastguard Worker     srtp_t receiver_session;
3053*90e502c7SAndroid Build Coastguard Worker 
3054*90e502c7SAndroid Build Coastguard Worker     srtp_hdr_t *pkt_1;
3055*90e502c7SAndroid Build Coastguard Worker     unsigned char *recv_pkt_1;
3056*90e502c7SAndroid Build Coastguard Worker 
3057*90e502c7SAndroid Build Coastguard Worker     srtp_hdr_t *pkt_2;
3058*90e502c7SAndroid Build Coastguard Worker     unsigned char *recv_pkt_2;
3059*90e502c7SAndroid Build Coastguard Worker 
3060*90e502c7SAndroid Build Coastguard Worker     uint32_t i;
3061*90e502c7SAndroid Build Coastguard Worker     uint32_t ts;
3062*90e502c7SAndroid Build Coastguard Worker     uint16_t seq;
3063*90e502c7SAndroid Build Coastguard Worker 
3064*90e502c7SAndroid Build Coastguard Worker     int msg_len_octets = 32;
3065*90e502c7SAndroid Build Coastguard Worker     int protected_msg_len_octets_1;
3066*90e502c7SAndroid Build Coastguard Worker     int protected_msg_len_octets_2;
3067*90e502c7SAndroid Build Coastguard Worker 
3068*90e502c7SAndroid Build Coastguard Worker     /* Create sender */
3069*90e502c7SAndroid Build Coastguard Worker     memset(&sender_policy, 0, sizeof(sender_policy));
3070*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtp_default(&sender_policy.rtp);
3071*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtcp_default(&sender_policy.rtcp);
3072*90e502c7SAndroid Build Coastguard Worker     sender_policy.ssrc.type = ssrc_specific;
3073*90e502c7SAndroid Build Coastguard Worker     sender_policy.ssrc.value = 0xcafebabe;
3074*90e502c7SAndroid Build Coastguard Worker     sender_policy.key = test_key;
3075*90e502c7SAndroid Build Coastguard Worker     sender_policy.window_size = 128;
3076*90e502c7SAndroid Build Coastguard Worker 
3077*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&sender_session, &sender_policy);
3078*90e502c7SAndroid Build Coastguard Worker     if (status) {
3079*90e502c7SAndroid Build Coastguard Worker         return status;
3080*90e502c7SAndroid Build Coastguard Worker     }
3081*90e502c7SAndroid Build Coastguard Worker 
3082*90e502c7SAndroid Build Coastguard Worker     /* Create and protect packets */
3083*90e502c7SAndroid Build Coastguard Worker     seq = 0;
3084*90e502c7SAndroid Build Coastguard Worker     ts = 0;
3085*90e502c7SAndroid Build Coastguard Worker     for (i = 0; i < packets; i++) {
3086*90e502c7SAndroid Build Coastguard Worker         srtp_hdr_t *tmp_pkt;
3087*90e502c7SAndroid Build Coastguard Worker         int tmp_len;
3088*90e502c7SAndroid Build Coastguard Worker 
3089*90e502c7SAndroid Build Coastguard Worker         tmp_pkt = srtp_create_test_packet_extended(
3090*90e502c7SAndroid Build Coastguard Worker             msg_len_octets, sender_policy.ssrc.value, seq, ts, &tmp_len);
3091*90e502c7SAndroid Build Coastguard Worker         status = srtp_protect(sender_session, tmp_pkt, &tmp_len);
3092*90e502c7SAndroid Build Coastguard Worker         free(tmp_pkt);
3093*90e502c7SAndroid Build Coastguard Worker         if (status) {
3094*90e502c7SAndroid Build Coastguard Worker             return status;
3095*90e502c7SAndroid Build Coastguard Worker         }
3096*90e502c7SAndroid Build Coastguard Worker 
3097*90e502c7SAndroid Build Coastguard Worker         seq++;
3098*90e502c7SAndroid Build Coastguard Worker         ts++;
3099*90e502c7SAndroid Build Coastguard Worker     }
3100*90e502c7SAndroid Build Coastguard Worker 
3101*90e502c7SAndroid Build Coastguard Worker     /* Create the first packet to decrypt and test for ROC change */
3102*90e502c7SAndroid Build Coastguard Worker     pkt_1 = srtp_create_test_packet_extended(msg_len_octets,
3103*90e502c7SAndroid Build Coastguard Worker                                              sender_policy.ssrc.value, seq, ts,
3104*90e502c7SAndroid Build Coastguard Worker                                              &protected_msg_len_octets_1);
3105*90e502c7SAndroid Build Coastguard Worker     status = srtp_protect(sender_session, pkt_1, &protected_msg_len_octets_1);
3106*90e502c7SAndroid Build Coastguard Worker     if (status) {
3107*90e502c7SAndroid Build Coastguard Worker         return status;
3108*90e502c7SAndroid Build Coastguard Worker     }
3109*90e502c7SAndroid Build Coastguard Worker 
3110*90e502c7SAndroid Build Coastguard Worker     /* Create the second packet to decrypt and test for ROC change */
3111*90e502c7SAndroid Build Coastguard Worker     seq++;
3112*90e502c7SAndroid Build Coastguard Worker     ts++;
3113*90e502c7SAndroid Build Coastguard Worker     pkt_2 = srtp_create_test_packet_extended(msg_len_octets,
3114*90e502c7SAndroid Build Coastguard Worker                                              sender_policy.ssrc.value, seq, ts,
3115*90e502c7SAndroid Build Coastguard Worker                                              &protected_msg_len_octets_2);
3116*90e502c7SAndroid Build Coastguard Worker     status = srtp_protect(sender_session, pkt_2, &protected_msg_len_octets_2);
3117*90e502c7SAndroid Build Coastguard Worker     if (status) {
3118*90e502c7SAndroid Build Coastguard Worker         return status;
3119*90e502c7SAndroid Build Coastguard Worker     }
3120*90e502c7SAndroid Build Coastguard Worker 
3121*90e502c7SAndroid Build Coastguard Worker     /* Create the receiver */
3122*90e502c7SAndroid Build Coastguard Worker     memset(&receiver_policy, 0, sizeof(receiver_policy));
3123*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtp_default(&receiver_policy.rtp);
3124*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtcp_default(&receiver_policy.rtcp);
3125*90e502c7SAndroid Build Coastguard Worker     receiver_policy.ssrc.type = ssrc_specific;
3126*90e502c7SAndroid Build Coastguard Worker     receiver_policy.ssrc.value = sender_policy.ssrc.value;
3127*90e502c7SAndroid Build Coastguard Worker     receiver_policy.key = test_key;
3128*90e502c7SAndroid Build Coastguard Worker     receiver_policy.window_size = 128;
3129*90e502c7SAndroid Build Coastguard Worker 
3130*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&receiver_session, &receiver_policy);
3131*90e502c7SAndroid Build Coastguard Worker     if (status) {
3132*90e502c7SAndroid Build Coastguard Worker         return status;
3133*90e502c7SAndroid Build Coastguard Worker     }
3134*90e502c7SAndroid Build Coastguard Worker 
3135*90e502c7SAndroid Build Coastguard Worker     /* Make a copy of the first sent protected packet */
3136*90e502c7SAndroid Build Coastguard Worker     recv_pkt_1 = malloc(protected_msg_len_octets_1);
3137*90e502c7SAndroid Build Coastguard Worker     if (recv_pkt_1 == NULL) {
3138*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
3139*90e502c7SAndroid Build Coastguard Worker     }
3140*90e502c7SAndroid Build Coastguard Worker     memcpy(recv_pkt_1, pkt_1, protected_msg_len_octets_1);
3141*90e502c7SAndroid Build Coastguard Worker 
3142*90e502c7SAndroid Build Coastguard Worker     /* Make a copy of the second sent protected packet */
3143*90e502c7SAndroid Build Coastguard Worker     recv_pkt_2 = malloc(protected_msg_len_octets_2);
3144*90e502c7SAndroid Build Coastguard Worker     if (recv_pkt_2 == NULL) {
3145*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
3146*90e502c7SAndroid Build Coastguard Worker     }
3147*90e502c7SAndroid Build Coastguard Worker     memcpy(recv_pkt_2, pkt_2, protected_msg_len_octets_2);
3148*90e502c7SAndroid Build Coastguard Worker 
3149*90e502c7SAndroid Build Coastguard Worker     /* Set the ROC to the wanted value */
3150*90e502c7SAndroid Build Coastguard Worker     status = srtp_set_stream_roc(receiver_session, receiver_policy.ssrc.value,
3151*90e502c7SAndroid Build Coastguard Worker                                  roc_to_set);
3152*90e502c7SAndroid Build Coastguard Worker     if (status) {
3153*90e502c7SAndroid Build Coastguard Worker         return status;
3154*90e502c7SAndroid Build Coastguard Worker     }
3155*90e502c7SAndroid Build Coastguard Worker 
3156*90e502c7SAndroid Build Coastguard Worker     /* Unprotect the first packet */
3157*90e502c7SAndroid Build Coastguard Worker     status = srtp_unprotect(receiver_session, recv_pkt_1,
3158*90e502c7SAndroid Build Coastguard Worker                             &protected_msg_len_octets_1);
3159*90e502c7SAndroid Build Coastguard Worker     if (status) {
3160*90e502c7SAndroid Build Coastguard Worker         return status;
3161*90e502c7SAndroid Build Coastguard Worker     }
3162*90e502c7SAndroid Build Coastguard Worker 
3163*90e502c7SAndroid Build Coastguard Worker     /* Unprotect the second packet */
3164*90e502c7SAndroid Build Coastguard Worker     status = srtp_unprotect(receiver_session, recv_pkt_2,
3165*90e502c7SAndroid Build Coastguard Worker                             &protected_msg_len_octets_2);
3166*90e502c7SAndroid Build Coastguard Worker     if (status) {
3167*90e502c7SAndroid Build Coastguard Worker         return status;
3168*90e502c7SAndroid Build Coastguard Worker     }
3169*90e502c7SAndroid Build Coastguard Worker 
3170*90e502c7SAndroid Build Coastguard Worker     /* Cleanup */
3171*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(sender_session);
3172*90e502c7SAndroid Build Coastguard Worker     if (status) {
3173*90e502c7SAndroid Build Coastguard Worker         return status;
3174*90e502c7SAndroid Build Coastguard Worker     }
3175*90e502c7SAndroid Build Coastguard Worker 
3176*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(receiver_session);
3177*90e502c7SAndroid Build Coastguard Worker     if (status) {
3178*90e502c7SAndroid Build Coastguard Worker         return status;
3179*90e502c7SAndroid Build Coastguard Worker     }
3180*90e502c7SAndroid Build Coastguard Worker 
3181*90e502c7SAndroid Build Coastguard Worker     free(pkt_1);
3182*90e502c7SAndroid Build Coastguard Worker     free(recv_pkt_1);
3183*90e502c7SAndroid Build Coastguard Worker     free(pkt_2);
3184*90e502c7SAndroid Build Coastguard Worker     free(recv_pkt_2);
3185*90e502c7SAndroid Build Coastguard Worker 
3186*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
3187*90e502c7SAndroid Build Coastguard Worker }
3188*90e502c7SAndroid Build Coastguard Worker 
test_set_sender_roc(uint16_t seq,uint32_t roc_to_set)3189*90e502c7SAndroid Build Coastguard Worker static srtp_err_status_t test_set_sender_roc(uint16_t seq, uint32_t roc_to_set)
3190*90e502c7SAndroid Build Coastguard Worker {
3191*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
3192*90e502c7SAndroid Build Coastguard Worker 
3193*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t sender_policy;
3194*90e502c7SAndroid Build Coastguard Worker     srtp_t sender_session;
3195*90e502c7SAndroid Build Coastguard Worker 
3196*90e502c7SAndroid Build Coastguard Worker     srtp_policy_t receiver_policy;
3197*90e502c7SAndroid Build Coastguard Worker     srtp_t receiver_session;
3198*90e502c7SAndroid Build Coastguard Worker 
3199*90e502c7SAndroid Build Coastguard Worker     srtp_hdr_t *pkt;
3200*90e502c7SAndroid Build Coastguard Worker     unsigned char *recv_pkt;
3201*90e502c7SAndroid Build Coastguard Worker 
3202*90e502c7SAndroid Build Coastguard Worker     uint32_t ts;
3203*90e502c7SAndroid Build Coastguard Worker 
3204*90e502c7SAndroid Build Coastguard Worker     int msg_len_octets = 32;
3205*90e502c7SAndroid Build Coastguard Worker     int protected_msg_len_octets;
3206*90e502c7SAndroid Build Coastguard Worker 
3207*90e502c7SAndroid Build Coastguard Worker     /* Create sender */
3208*90e502c7SAndroid Build Coastguard Worker     memset(&sender_policy, 0, sizeof(sender_policy));
3209*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtp_default(&sender_policy.rtp);
3210*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtcp_default(&sender_policy.rtcp);
3211*90e502c7SAndroid Build Coastguard Worker     sender_policy.ssrc.type = ssrc_specific;
3212*90e502c7SAndroid Build Coastguard Worker     sender_policy.ssrc.value = 0xcafebabe;
3213*90e502c7SAndroid Build Coastguard Worker     sender_policy.key = test_key;
3214*90e502c7SAndroid Build Coastguard Worker     sender_policy.window_size = 128;
3215*90e502c7SAndroid Build Coastguard Worker 
3216*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&sender_session, &sender_policy);
3217*90e502c7SAndroid Build Coastguard Worker     if (status) {
3218*90e502c7SAndroid Build Coastguard Worker         return status;
3219*90e502c7SAndroid Build Coastguard Worker     }
3220*90e502c7SAndroid Build Coastguard Worker 
3221*90e502c7SAndroid Build Coastguard Worker     /* Set the ROC before encrypting the first packet */
3222*90e502c7SAndroid Build Coastguard Worker     status = srtp_set_stream_roc(sender_session, sender_policy.ssrc.value,
3223*90e502c7SAndroid Build Coastguard Worker                                  roc_to_set);
3224*90e502c7SAndroid Build Coastguard Worker     if (status != srtp_err_status_ok) {
3225*90e502c7SAndroid Build Coastguard Worker         return status;
3226*90e502c7SAndroid Build Coastguard Worker     }
3227*90e502c7SAndroid Build Coastguard Worker 
3228*90e502c7SAndroid Build Coastguard Worker     /* Create the packet to decrypt */
3229*90e502c7SAndroid Build Coastguard Worker     ts = 0;
3230*90e502c7SAndroid Build Coastguard Worker     pkt = srtp_create_test_packet_extended(msg_len_octets,
3231*90e502c7SAndroid Build Coastguard Worker                                            sender_policy.ssrc.value, seq, ts,
3232*90e502c7SAndroid Build Coastguard Worker                                            &protected_msg_len_octets);
3233*90e502c7SAndroid Build Coastguard Worker     status = srtp_protect(sender_session, pkt, &protected_msg_len_octets);
3234*90e502c7SAndroid Build Coastguard Worker     if (status) {
3235*90e502c7SAndroid Build Coastguard Worker         return status;
3236*90e502c7SAndroid Build Coastguard Worker     }
3237*90e502c7SAndroid Build Coastguard Worker 
3238*90e502c7SAndroid Build Coastguard Worker     /* Create the receiver */
3239*90e502c7SAndroid Build Coastguard Worker     memset(&receiver_policy, 0, sizeof(receiver_policy));
3240*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtp_default(&receiver_policy.rtp);
3241*90e502c7SAndroid Build Coastguard Worker     srtp_crypto_policy_set_rtcp_default(&receiver_policy.rtcp);
3242*90e502c7SAndroid Build Coastguard Worker     receiver_policy.ssrc.type = ssrc_specific;
3243*90e502c7SAndroid Build Coastguard Worker     receiver_policy.ssrc.value = sender_policy.ssrc.value;
3244*90e502c7SAndroid Build Coastguard Worker     receiver_policy.key = test_key;
3245*90e502c7SAndroid Build Coastguard Worker     receiver_policy.window_size = 128;
3246*90e502c7SAndroid Build Coastguard Worker 
3247*90e502c7SAndroid Build Coastguard Worker     status = srtp_create(&receiver_session, &receiver_policy);
3248*90e502c7SAndroid Build Coastguard Worker     if (status) {
3249*90e502c7SAndroid Build Coastguard Worker         return status;
3250*90e502c7SAndroid Build Coastguard Worker     }
3251*90e502c7SAndroid Build Coastguard Worker 
3252*90e502c7SAndroid Build Coastguard Worker     /* Make a copy of the sent protected packet */
3253*90e502c7SAndroid Build Coastguard Worker     recv_pkt = malloc(protected_msg_len_octets);
3254*90e502c7SAndroid Build Coastguard Worker     if (recv_pkt == NULL) {
3255*90e502c7SAndroid Build Coastguard Worker         return srtp_err_status_fail;
3256*90e502c7SAndroid Build Coastguard Worker     }
3257*90e502c7SAndroid Build Coastguard Worker     memcpy(recv_pkt, pkt, protected_msg_len_octets);
3258*90e502c7SAndroid Build Coastguard Worker 
3259*90e502c7SAndroid Build Coastguard Worker     /* Set the ROC to the wanted value */
3260*90e502c7SAndroid Build Coastguard Worker     status = srtp_set_stream_roc(receiver_session, receiver_policy.ssrc.value,
3261*90e502c7SAndroid Build Coastguard Worker                                  roc_to_set);
3262*90e502c7SAndroid Build Coastguard Worker     if (status) {
3263*90e502c7SAndroid Build Coastguard Worker         return status;
3264*90e502c7SAndroid Build Coastguard Worker     }
3265*90e502c7SAndroid Build Coastguard Worker 
3266*90e502c7SAndroid Build Coastguard Worker     status =
3267*90e502c7SAndroid Build Coastguard Worker         srtp_unprotect(receiver_session, recv_pkt, &protected_msg_len_octets);
3268*90e502c7SAndroid Build Coastguard Worker     if (status) {
3269*90e502c7SAndroid Build Coastguard Worker         return status;
3270*90e502c7SAndroid Build Coastguard Worker     }
3271*90e502c7SAndroid Build Coastguard Worker 
3272*90e502c7SAndroid Build Coastguard Worker     /* Cleanup */
3273*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(sender_session);
3274*90e502c7SAndroid Build Coastguard Worker     if (status) {
3275*90e502c7SAndroid Build Coastguard Worker         return status;
3276*90e502c7SAndroid Build Coastguard Worker     }
3277*90e502c7SAndroid Build Coastguard Worker 
3278*90e502c7SAndroid Build Coastguard Worker     status = srtp_dealloc(receiver_session);
3279*90e502c7SAndroid Build Coastguard Worker     if (status) {
3280*90e502c7SAndroid Build Coastguard Worker         return status;
3281*90e502c7SAndroid Build Coastguard Worker     }
3282*90e502c7SAndroid Build Coastguard Worker 
3283*90e502c7SAndroid Build Coastguard Worker     free(pkt);
3284*90e502c7SAndroid Build Coastguard Worker     free(recv_pkt);
3285*90e502c7SAndroid Build Coastguard Worker 
3286*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
3287*90e502c7SAndroid Build Coastguard Worker }
3288*90e502c7SAndroid Build Coastguard Worker 
srtp_test_set_receiver_roc()3289*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_set_receiver_roc()
3290*90e502c7SAndroid Build Coastguard Worker {
3291*90e502c7SAndroid Build Coastguard Worker     int packets;
3292*90e502c7SAndroid Build Coastguard Worker     uint32_t roc;
3293*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
3294*90e502c7SAndroid Build Coastguard Worker 
3295*90e502c7SAndroid Build Coastguard Worker     /* First test does not rollover */
3296*90e502c7SAndroid Build Coastguard Worker     packets = 1;
3297*90e502c7SAndroid Build Coastguard Worker     roc = 0;
3298*90e502c7SAndroid Build Coastguard Worker 
3299*90e502c7SAndroid Build Coastguard Worker     status = test_set_receiver_roc(packets - 1, roc);
3300*90e502c7SAndroid Build Coastguard Worker     if (status) {
3301*90e502c7SAndroid Build Coastguard Worker         return status;
3302*90e502c7SAndroid Build Coastguard Worker     }
3303*90e502c7SAndroid Build Coastguard Worker 
3304*90e502c7SAndroid Build Coastguard Worker     status = test_set_receiver_roc(packets, roc);
3305*90e502c7SAndroid Build Coastguard Worker     if (status) {
3306*90e502c7SAndroid Build Coastguard Worker         return status;
3307*90e502c7SAndroid Build Coastguard Worker     }
3308*90e502c7SAndroid Build Coastguard Worker 
3309*90e502c7SAndroid Build Coastguard Worker     status = test_set_receiver_roc(packets + 1, roc);
3310*90e502c7SAndroid Build Coastguard Worker     if (status) {
3311*90e502c7SAndroid Build Coastguard Worker         return status;
3312*90e502c7SAndroid Build Coastguard Worker     }
3313*90e502c7SAndroid Build Coastguard Worker 
3314*90e502c7SAndroid Build Coastguard Worker     status = test_set_receiver_roc(packets + 60000, roc);
3315*90e502c7SAndroid Build Coastguard Worker     if (status) {
3316*90e502c7SAndroid Build Coastguard Worker         return status;
3317*90e502c7SAndroid Build Coastguard Worker     }
3318*90e502c7SAndroid Build Coastguard Worker 
3319*90e502c7SAndroid Build Coastguard Worker     /* Second test should rollover */
3320*90e502c7SAndroid Build Coastguard Worker     packets = 65535;
3321*90e502c7SAndroid Build Coastguard Worker     roc = 0;
3322*90e502c7SAndroid Build Coastguard Worker 
3323*90e502c7SAndroid Build Coastguard Worker     status = test_set_receiver_roc(packets - 1, roc);
3324*90e502c7SAndroid Build Coastguard Worker     if (status) {
3325*90e502c7SAndroid Build Coastguard Worker         return status;
3326*90e502c7SAndroid Build Coastguard Worker     }
3327*90e502c7SAndroid Build Coastguard Worker 
3328*90e502c7SAndroid Build Coastguard Worker     status = test_set_receiver_roc(packets, roc);
3329*90e502c7SAndroid Build Coastguard Worker     if (status) {
3330*90e502c7SAndroid Build Coastguard Worker         return status;
3331*90e502c7SAndroid Build Coastguard Worker     }
3332*90e502c7SAndroid Build Coastguard Worker 
3333*90e502c7SAndroid Build Coastguard Worker     /* Now the rollover counter should be 1 */
3334*90e502c7SAndroid Build Coastguard Worker     roc = 1;
3335*90e502c7SAndroid Build Coastguard Worker     status = test_set_receiver_roc(packets + 1, roc);
3336*90e502c7SAndroid Build Coastguard Worker     if (status) {
3337*90e502c7SAndroid Build Coastguard Worker         return status;
3338*90e502c7SAndroid Build Coastguard Worker     }
3339*90e502c7SAndroid Build Coastguard Worker 
3340*90e502c7SAndroid Build Coastguard Worker     status = test_set_receiver_roc(packets + 60000, roc);
3341*90e502c7SAndroid Build Coastguard Worker     if (status) {
3342*90e502c7SAndroid Build Coastguard Worker         return status;
3343*90e502c7SAndroid Build Coastguard Worker     }
3344*90e502c7SAndroid Build Coastguard Worker 
3345*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
3346*90e502c7SAndroid Build Coastguard Worker }
3347*90e502c7SAndroid Build Coastguard Worker 
srtp_test_set_sender_roc()3348*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_test_set_sender_roc()
3349*90e502c7SAndroid Build Coastguard Worker {
3350*90e502c7SAndroid Build Coastguard Worker     uint32_t roc;
3351*90e502c7SAndroid Build Coastguard Worker     uint16_t seq;
3352*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
3353*90e502c7SAndroid Build Coastguard Worker 
3354*90e502c7SAndroid Build Coastguard Worker     seq = 43210;
3355*90e502c7SAndroid Build Coastguard Worker     roc = 0;
3356*90e502c7SAndroid Build Coastguard Worker     status = test_set_sender_roc(seq, roc);
3357*90e502c7SAndroid Build Coastguard Worker     if (status) {
3358*90e502c7SAndroid Build Coastguard Worker         return status;
3359*90e502c7SAndroid Build Coastguard Worker     }
3360*90e502c7SAndroid Build Coastguard Worker 
3361*90e502c7SAndroid Build Coastguard Worker     roc = 65535;
3362*90e502c7SAndroid Build Coastguard Worker     status = test_set_sender_roc(seq, roc);
3363*90e502c7SAndroid Build Coastguard Worker     if (status) {
3364*90e502c7SAndroid Build Coastguard Worker         return status;
3365*90e502c7SAndroid Build Coastguard Worker     }
3366*90e502c7SAndroid Build Coastguard Worker 
3367*90e502c7SAndroid Build Coastguard Worker     roc = 0xffff;
3368*90e502c7SAndroid Build Coastguard Worker     status = test_set_sender_roc(seq, roc);
3369*90e502c7SAndroid Build Coastguard Worker     if (status) {
3370*90e502c7SAndroid Build Coastguard Worker         return status;
3371*90e502c7SAndroid Build Coastguard Worker     }
3372*90e502c7SAndroid Build Coastguard Worker 
3373*90e502c7SAndroid Build Coastguard Worker     roc = 0xffff00;
3374*90e502c7SAndroid Build Coastguard Worker     status = test_set_sender_roc(seq, roc);
3375*90e502c7SAndroid Build Coastguard Worker     if (status) {
3376*90e502c7SAndroid Build Coastguard Worker         return status;
3377*90e502c7SAndroid Build Coastguard Worker     }
3378*90e502c7SAndroid Build Coastguard Worker 
3379*90e502c7SAndroid Build Coastguard Worker     roc = 0xfffffff0;
3380*90e502c7SAndroid Build Coastguard Worker     status = test_set_sender_roc(seq, roc);
3381*90e502c7SAndroid Build Coastguard Worker     if (status) {
3382*90e502c7SAndroid Build Coastguard Worker         return status;
3383*90e502c7SAndroid Build Coastguard Worker     }
3384*90e502c7SAndroid Build Coastguard Worker 
3385*90e502c7SAndroid Build Coastguard Worker     return srtp_err_status_ok;
3386*90e502c7SAndroid Build Coastguard Worker }
3387*90e502c7SAndroid Build Coastguard Worker 
3388*90e502c7SAndroid Build Coastguard Worker /*
3389*90e502c7SAndroid Build Coastguard Worker  * srtp policy definitions - these definitions are used above
3390*90e502c7SAndroid Build Coastguard Worker  */
3391*90e502c7SAndroid Build Coastguard Worker 
3392*90e502c7SAndroid Build Coastguard Worker // clang-format off
3393*90e502c7SAndroid Build Coastguard Worker unsigned char test_key[46] = {
3394*90e502c7SAndroid Build Coastguard Worker     0xe1, 0xf9, 0x7a, 0x0d, 0x3e, 0x01, 0x8b, 0xe0,
3395*90e502c7SAndroid Build Coastguard Worker     0xd6, 0x4f, 0xa3, 0x2c, 0x06, 0xde, 0x41, 0x39,
3396*90e502c7SAndroid Build Coastguard Worker     0x0e, 0xc6, 0x75, 0xad, 0x49, 0x8a, 0xfe, 0xeb,
3397*90e502c7SAndroid Build Coastguard Worker     0xb6, 0x96, 0x0b, 0x3a, 0xab, 0xe6, 0xc1, 0x73,
3398*90e502c7SAndroid Build Coastguard Worker     0xc3, 0x17, 0xf2, 0xda, 0xbe, 0x35, 0x77, 0x93,
3399*90e502c7SAndroid Build Coastguard Worker     0xb6, 0x96, 0x0b, 0x3a, 0xab, 0xe6
3400*90e502c7SAndroid Build Coastguard Worker };
3401*90e502c7SAndroid Build Coastguard Worker 
3402*90e502c7SAndroid Build Coastguard Worker unsigned char test_key_2[46] = {
3403*90e502c7SAndroid Build Coastguard Worker     0xf0, 0xf0, 0x49, 0x14, 0xb5, 0x13, 0xf2, 0x76,
3404*90e502c7SAndroid Build Coastguard Worker     0x3a, 0x1b, 0x1f, 0xa1, 0x30, 0xf1, 0x0e, 0x29,
3405*90e502c7SAndroid Build Coastguard Worker     0x98, 0xf6, 0xf6, 0xe4, 0x3e, 0x43, 0x09, 0xd1,
3406*90e502c7SAndroid Build Coastguard Worker     0xe6, 0x22, 0xa0, 0xe3, 0x32, 0xb9, 0xf1, 0xb6,
3407*90e502c7SAndroid Build Coastguard Worker     0xc3, 0x17, 0xf2, 0xda, 0xbe, 0x35, 0x77, 0x93,
3408*90e502c7SAndroid Build Coastguard Worker     0xb6, 0x96, 0x0b, 0x3a, 0xab, 0xe6
3409*90e502c7SAndroid Build Coastguard Worker };
3410*90e502c7SAndroid Build Coastguard Worker 
3411*90e502c7SAndroid Build Coastguard Worker unsigned char test_mki_id[TEST_MKI_ID_SIZE] = {
3412*90e502c7SAndroid Build Coastguard Worker     0xe1, 0xf9, 0x7a, 0x0d
3413*90e502c7SAndroid Build Coastguard Worker };
3414*90e502c7SAndroid Build Coastguard Worker 
3415*90e502c7SAndroid Build Coastguard Worker unsigned char test_mki_id_2[TEST_MKI_ID_SIZE] = {
3416*90e502c7SAndroid Build Coastguard Worker     0xf3, 0xa1, 0x46, 0x71
3417*90e502c7SAndroid Build Coastguard Worker };
3418*90e502c7SAndroid Build Coastguard Worker // clang-format on
3419*90e502c7SAndroid Build Coastguard Worker 
3420*90e502c7SAndroid Build Coastguard Worker const srtp_policy_t default_policy = {
3421*90e502c7SAndroid Build Coastguard Worker     { ssrc_any_outbound, 0 }, /* SSRC */
3422*90e502c7SAndroid Build Coastguard Worker     {
3423*90e502c7SAndroid Build Coastguard Worker         /* SRTP policy */
3424*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_ICM_128,               /* cipher type                 */
3425*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_ICM_128_KEY_LEN_WSALT, /* cipher key length in octets */
3426*90e502c7SAndroid Build Coastguard Worker         SRTP_HMAC_SHA1,                 /* authentication func type    */
3427*90e502c7SAndroid Build Coastguard Worker         16,                             /* auth key length in octets   */
3428*90e502c7SAndroid Build Coastguard Worker         10,                             /* auth tag length in octets   */
3429*90e502c7SAndroid Build Coastguard Worker         sec_serv_conf_and_auth          /* security services flag      */
3430*90e502c7SAndroid Build Coastguard Worker     },
3431*90e502c7SAndroid Build Coastguard Worker     {
3432*90e502c7SAndroid Build Coastguard Worker         /* SRTCP policy */
3433*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_ICM_128,               /* cipher type                 */
3434*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_ICM_128_KEY_LEN_WSALT, /* cipher key length in octets */
3435*90e502c7SAndroid Build Coastguard Worker         SRTP_HMAC_SHA1,                 /* authentication func type    */
3436*90e502c7SAndroid Build Coastguard Worker         16,                             /* auth key length in octets   */
3437*90e502c7SAndroid Build Coastguard Worker         10,                             /* auth tag length in octets   */
3438*90e502c7SAndroid Build Coastguard Worker         sec_serv_conf_and_auth          /* security services flag      */
3439*90e502c7SAndroid Build Coastguard Worker     },
3440*90e502c7SAndroid Build Coastguard Worker     NULL,
3441*90e502c7SAndroid Build Coastguard Worker     (srtp_master_key_t **)test_keys,
3442*90e502c7SAndroid Build Coastguard Worker     2,    /* indicates the number of Master keys          */
3443*90e502c7SAndroid Build Coastguard Worker     NULL, /* indicates that EKT is not in use             */
3444*90e502c7SAndroid Build Coastguard Worker     128,  /* replay window size                           */
3445*90e502c7SAndroid Build Coastguard Worker     0,    /* retransmission not allowed                   */
3446*90e502c7SAndroid Build Coastguard Worker     NULL, /* no encrypted extension headers               */
3447*90e502c7SAndroid Build Coastguard Worker     0,    /* list of encrypted extension headers is empty */
3448*90e502c7SAndroid Build Coastguard Worker     NULL
3449*90e502c7SAndroid Build Coastguard Worker };
3450*90e502c7SAndroid Build Coastguard Worker 
3451*90e502c7SAndroid Build Coastguard Worker const srtp_policy_t aes_only_policy = {
3452*90e502c7SAndroid Build Coastguard Worker     { ssrc_any_outbound, 0 }, /* SSRC                        */
3453*90e502c7SAndroid Build Coastguard Worker     {
3454*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_ICM_128,               /* cipher type                 */
3455*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_ICM_128_KEY_LEN_WSALT, /* cipher key length in octets */
3456*90e502c7SAndroid Build Coastguard Worker         SRTP_NULL_AUTH,                 /* authentication func type    */
3457*90e502c7SAndroid Build Coastguard Worker         0,                              /* auth key length in octets   */
3458*90e502c7SAndroid Build Coastguard Worker         0,                              /* auth tag length in octets   */
3459*90e502c7SAndroid Build Coastguard Worker         sec_serv_conf                   /* security services flag      */
3460*90e502c7SAndroid Build Coastguard Worker     },
3461*90e502c7SAndroid Build Coastguard Worker     {
3462*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_ICM_128,               /* cipher type                 */
3463*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_ICM_128_KEY_LEN_WSALT, /* cipher key length in octets */
3464*90e502c7SAndroid Build Coastguard Worker         SRTP_NULL_AUTH,                 /* authentication func type    */
3465*90e502c7SAndroid Build Coastguard Worker         0,                              /* auth key length in octets   */
3466*90e502c7SAndroid Build Coastguard Worker         0,                              /* auth tag length in octets   */
3467*90e502c7SAndroid Build Coastguard Worker         sec_serv_conf                   /* security services flag      */
3468*90e502c7SAndroid Build Coastguard Worker     },
3469*90e502c7SAndroid Build Coastguard Worker     NULL,
3470*90e502c7SAndroid Build Coastguard Worker     (srtp_master_key_t **)test_keys,
3471*90e502c7SAndroid Build Coastguard Worker     2,    /* indicates the number of Master keys          */
3472*90e502c7SAndroid Build Coastguard Worker     NULL, /* indicates that EKT is not in use             */
3473*90e502c7SAndroid Build Coastguard Worker     128,  /* replay window size                           */
3474*90e502c7SAndroid Build Coastguard Worker     0,    /* retransmission not allowed                   */
3475*90e502c7SAndroid Build Coastguard Worker     NULL, /* no encrypted extension headers               */
3476*90e502c7SAndroid Build Coastguard Worker     0,    /* list of encrypted extension headers is empty */
3477*90e502c7SAndroid Build Coastguard Worker     NULL
3478*90e502c7SAndroid Build Coastguard Worker };
3479*90e502c7SAndroid Build Coastguard Worker 
3480*90e502c7SAndroid Build Coastguard Worker const srtp_policy_t hmac_only_policy = {
3481*90e502c7SAndroid Build Coastguard Worker     { ssrc_any_outbound, 0 }, /* SSRC */
3482*90e502c7SAndroid Build Coastguard Worker     {
3483*90e502c7SAndroid Build Coastguard Worker         SRTP_NULL_CIPHER, /* cipher type                 */
3484*90e502c7SAndroid Build Coastguard Worker         0,                /* cipher key length in octets */
3485*90e502c7SAndroid Build Coastguard Worker         SRTP_HMAC_SHA1,   /* authentication func type    */
3486*90e502c7SAndroid Build Coastguard Worker         20,               /* auth key length in octets   */
3487*90e502c7SAndroid Build Coastguard Worker         4,                /* auth tag length in octets   */
3488*90e502c7SAndroid Build Coastguard Worker         sec_serv_auth     /* security services flag      */
3489*90e502c7SAndroid Build Coastguard Worker     },
3490*90e502c7SAndroid Build Coastguard Worker     {
3491*90e502c7SAndroid Build Coastguard Worker         SRTP_NULL_CIPHER, /* cipher type                 */
3492*90e502c7SAndroid Build Coastguard Worker         0,                /* cipher key length in octets */
3493*90e502c7SAndroid Build Coastguard Worker         SRTP_HMAC_SHA1,   /* authentication func type    */
3494*90e502c7SAndroid Build Coastguard Worker         20,               /* auth key length in octets   */
3495*90e502c7SAndroid Build Coastguard Worker         4,                /* auth tag length in octets   */
3496*90e502c7SAndroid Build Coastguard Worker         sec_serv_auth     /* security services flag      */
3497*90e502c7SAndroid Build Coastguard Worker     },
3498*90e502c7SAndroid Build Coastguard Worker     NULL,
3499*90e502c7SAndroid Build Coastguard Worker     (srtp_master_key_t **)test_keys,
3500*90e502c7SAndroid Build Coastguard Worker     2,    /* Number of Master keys associated with the policy */
3501*90e502c7SAndroid Build Coastguard Worker     NULL, /* indicates that EKT is not in use                 */
3502*90e502c7SAndroid Build Coastguard Worker     128,  /* replay window size                               */
3503*90e502c7SAndroid Build Coastguard Worker     0,    /* retransmission not allowed                       */
3504*90e502c7SAndroid Build Coastguard Worker     NULL, /* no encrypted extension headers                   */
3505*90e502c7SAndroid Build Coastguard Worker     0,    /* list of encrypted extension headers is empty     */
3506*90e502c7SAndroid Build Coastguard Worker     NULL
3507*90e502c7SAndroid Build Coastguard Worker };
3508*90e502c7SAndroid Build Coastguard Worker 
3509*90e502c7SAndroid Build Coastguard Worker #ifdef GCM
3510*90e502c7SAndroid Build Coastguard Worker const srtp_policy_t aes128_gcm_8_policy = {
3511*90e502c7SAndroid Build Coastguard Worker     { ssrc_any_outbound, 0 }, /* SSRC */
3512*90e502c7SAndroid Build Coastguard Worker     {
3513*90e502c7SAndroid Build Coastguard Worker         /* SRTP policy */
3514*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_GCM_128,               /* cipher type                 */
3515*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_GCM_128_KEY_LEN_WSALT, /* cipher key length in octets */
3516*90e502c7SAndroid Build Coastguard Worker         SRTP_NULL_AUTH,                 /* authentication func type    */
3517*90e502c7SAndroid Build Coastguard Worker         0,                              /* auth key length in octets   */
3518*90e502c7SAndroid Build Coastguard Worker         8,                              /* auth tag length in octets   */
3519*90e502c7SAndroid Build Coastguard Worker         sec_serv_conf_and_auth          /* security services flag      */
3520*90e502c7SAndroid Build Coastguard Worker     },
3521*90e502c7SAndroid Build Coastguard Worker     {
3522*90e502c7SAndroid Build Coastguard Worker         /* SRTCP policy */
3523*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_GCM_128,               /* cipher type                 */
3524*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_GCM_128_KEY_LEN_WSALT, /* cipher key length in octets */
3525*90e502c7SAndroid Build Coastguard Worker         SRTP_NULL_AUTH,                 /* authentication func type    */
3526*90e502c7SAndroid Build Coastguard Worker         0,                              /* auth key length in octets   */
3527*90e502c7SAndroid Build Coastguard Worker         8,                              /* auth tag length in octets   */
3528*90e502c7SAndroid Build Coastguard Worker         sec_serv_conf_and_auth          /* security services flag      */
3529*90e502c7SAndroid Build Coastguard Worker     },
3530*90e502c7SAndroid Build Coastguard Worker     NULL,
3531*90e502c7SAndroid Build Coastguard Worker     (srtp_master_key_t **)test_keys,
3532*90e502c7SAndroid Build Coastguard Worker     2,    /* indicates the number of Master keys          */
3533*90e502c7SAndroid Build Coastguard Worker     NULL, /* indicates that EKT is not in use             */
3534*90e502c7SAndroid Build Coastguard Worker     128,  /* replay window size                           */
3535*90e502c7SAndroid Build Coastguard Worker     0,    /* retransmission not allowed                   */
3536*90e502c7SAndroid Build Coastguard Worker     NULL, /* no encrypted extension headers               */
3537*90e502c7SAndroid Build Coastguard Worker     0,    /* list of encrypted extension headers is empty */
3538*90e502c7SAndroid Build Coastguard Worker     NULL
3539*90e502c7SAndroid Build Coastguard Worker };
3540*90e502c7SAndroid Build Coastguard Worker 
3541*90e502c7SAndroid Build Coastguard Worker const srtp_policy_t aes128_gcm_8_cauth_policy = {
3542*90e502c7SAndroid Build Coastguard Worker     { ssrc_any_outbound, 0 }, /* SSRC */
3543*90e502c7SAndroid Build Coastguard Worker     {
3544*90e502c7SAndroid Build Coastguard Worker         /* SRTP policy */
3545*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_GCM_128,               /* cipher type                 */
3546*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_GCM_128_KEY_LEN_WSALT, /* cipher key length in octets */
3547*90e502c7SAndroid Build Coastguard Worker         SRTP_NULL_AUTH,                 /* authentication func type    */
3548*90e502c7SAndroid Build Coastguard Worker         0,                              /* auth key length in octets   */
3549*90e502c7SAndroid Build Coastguard Worker         8,                              /* auth tag length in octets   */
3550*90e502c7SAndroid Build Coastguard Worker         sec_serv_conf_and_auth          /* security services flag      */
3551*90e502c7SAndroid Build Coastguard Worker     },
3552*90e502c7SAndroid Build Coastguard Worker     {
3553*90e502c7SAndroid Build Coastguard Worker         /* SRTCP policy */
3554*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_GCM_128,               /* cipher type                 */
3555*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_GCM_128_KEY_LEN_WSALT, /* cipher key length in octets */
3556*90e502c7SAndroid Build Coastguard Worker         SRTP_NULL_AUTH,                 /* authentication func type    */
3557*90e502c7SAndroid Build Coastguard Worker         0,                              /* auth key length in octets   */
3558*90e502c7SAndroid Build Coastguard Worker         8,                              /* auth tag length in octets   */
3559*90e502c7SAndroid Build Coastguard Worker         sec_serv_auth                   /* security services flag      */
3560*90e502c7SAndroid Build Coastguard Worker     },
3561*90e502c7SAndroid Build Coastguard Worker     NULL,
3562*90e502c7SAndroid Build Coastguard Worker     (srtp_master_key_t **)test_keys,
3563*90e502c7SAndroid Build Coastguard Worker     2,    /* indicates the number of Master keys          */
3564*90e502c7SAndroid Build Coastguard Worker     NULL, /* indicates that EKT is not in use             */
3565*90e502c7SAndroid Build Coastguard Worker     128,  /* replay window size                           */
3566*90e502c7SAndroid Build Coastguard Worker     0,    /* retransmission not allowed                   */
3567*90e502c7SAndroid Build Coastguard Worker     NULL, /* no encrypted extension headers               */
3568*90e502c7SAndroid Build Coastguard Worker     0,    /* list of encrypted extension headers is empty */
3569*90e502c7SAndroid Build Coastguard Worker     NULL
3570*90e502c7SAndroid Build Coastguard Worker };
3571*90e502c7SAndroid Build Coastguard Worker 
3572*90e502c7SAndroid Build Coastguard Worker const srtp_policy_t aes256_gcm_8_policy = {
3573*90e502c7SAndroid Build Coastguard Worker     { ssrc_any_outbound, 0 }, /* SSRC */
3574*90e502c7SAndroid Build Coastguard Worker     {
3575*90e502c7SAndroid Build Coastguard Worker         /* SRTP policy */
3576*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_GCM_256,               /* cipher type                 */
3577*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_GCM_256_KEY_LEN_WSALT, /* cipher key length in octets */
3578*90e502c7SAndroid Build Coastguard Worker         SRTP_NULL_AUTH,                 /* authentication func type    */
3579*90e502c7SAndroid Build Coastguard Worker         0,                              /* auth key length in octets   */
3580*90e502c7SAndroid Build Coastguard Worker         8,                              /* auth tag length in octets   */
3581*90e502c7SAndroid Build Coastguard Worker         sec_serv_conf_and_auth          /* security services flag      */
3582*90e502c7SAndroid Build Coastguard Worker     },
3583*90e502c7SAndroid Build Coastguard Worker     {
3584*90e502c7SAndroid Build Coastguard Worker         /* SRTCP policy */
3585*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_GCM_256,               /* cipher type                 */
3586*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_GCM_256_KEY_LEN_WSALT, /* cipher key length in octets */
3587*90e502c7SAndroid Build Coastguard Worker         SRTP_NULL_AUTH,                 /* authentication func type    */
3588*90e502c7SAndroid Build Coastguard Worker         0,                              /* auth key length in octets   */
3589*90e502c7SAndroid Build Coastguard Worker         8,                              /* auth tag length in octets   */
3590*90e502c7SAndroid Build Coastguard Worker         sec_serv_conf_and_auth          /* security services flag      */
3591*90e502c7SAndroid Build Coastguard Worker     },
3592*90e502c7SAndroid Build Coastguard Worker     NULL,
3593*90e502c7SAndroid Build Coastguard Worker     (srtp_master_key_t **)test_keys,
3594*90e502c7SAndroid Build Coastguard Worker     2,    /* indicates the number of Master keys          */
3595*90e502c7SAndroid Build Coastguard Worker     NULL, /* indicates that EKT is not in use             */
3596*90e502c7SAndroid Build Coastguard Worker     128,  /* replay window size                           */
3597*90e502c7SAndroid Build Coastguard Worker     0,    /* retransmission not allowed                   */
3598*90e502c7SAndroid Build Coastguard Worker     NULL, /* no encrypted extension headers               */
3599*90e502c7SAndroid Build Coastguard Worker     0,    /* list of encrypted extension headers is empty */
3600*90e502c7SAndroid Build Coastguard Worker     NULL
3601*90e502c7SAndroid Build Coastguard Worker };
3602*90e502c7SAndroid Build Coastguard Worker 
3603*90e502c7SAndroid Build Coastguard Worker const srtp_policy_t aes256_gcm_8_cauth_policy = {
3604*90e502c7SAndroid Build Coastguard Worker     { ssrc_any_outbound, 0 }, /* SSRC */
3605*90e502c7SAndroid Build Coastguard Worker     {
3606*90e502c7SAndroid Build Coastguard Worker         /* SRTP policy */
3607*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_GCM_256,               /* cipher type                 */
3608*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_GCM_256_KEY_LEN_WSALT, /* cipher key length in octets */
3609*90e502c7SAndroid Build Coastguard Worker         SRTP_NULL_AUTH,                 /* authentication func type    */
3610*90e502c7SAndroid Build Coastguard Worker         0,                              /* auth key length in octets   */
3611*90e502c7SAndroid Build Coastguard Worker         8,                              /* auth tag length in octets   */
3612*90e502c7SAndroid Build Coastguard Worker         sec_serv_conf_and_auth          /* security services flag      */
3613*90e502c7SAndroid Build Coastguard Worker     },
3614*90e502c7SAndroid Build Coastguard Worker     {
3615*90e502c7SAndroid Build Coastguard Worker         /* SRTCP policy */
3616*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_GCM_256,               /* cipher type                 */
3617*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_GCM_256_KEY_LEN_WSALT, /* cipher key length in octets */
3618*90e502c7SAndroid Build Coastguard Worker         SRTP_NULL_AUTH,                 /* authentication func type    */
3619*90e502c7SAndroid Build Coastguard Worker         0,                              /* auth key length in octets   */
3620*90e502c7SAndroid Build Coastguard Worker         8,                              /* auth tag length in octets   */
3621*90e502c7SAndroid Build Coastguard Worker         sec_serv_auth                   /* security services flag      */
3622*90e502c7SAndroid Build Coastguard Worker     },
3623*90e502c7SAndroid Build Coastguard Worker     NULL,
3624*90e502c7SAndroid Build Coastguard Worker     (srtp_master_key_t **)test_keys,
3625*90e502c7SAndroid Build Coastguard Worker     2,    /* indicates the number of Master keys          */
3626*90e502c7SAndroid Build Coastguard Worker     NULL, /* indicates that EKT is not in use             */
3627*90e502c7SAndroid Build Coastguard Worker     128,  /* replay window size                           */
3628*90e502c7SAndroid Build Coastguard Worker     0,    /* retransmission not allowed                   */
3629*90e502c7SAndroid Build Coastguard Worker     NULL, /* no encrypted extension headers               */
3630*90e502c7SAndroid Build Coastguard Worker     0,    /* list of encrypted extension headers is empty */
3631*90e502c7SAndroid Build Coastguard Worker     NULL
3632*90e502c7SAndroid Build Coastguard Worker };
3633*90e502c7SAndroid Build Coastguard Worker #endif
3634*90e502c7SAndroid Build Coastguard Worker 
3635*90e502c7SAndroid Build Coastguard Worker const srtp_policy_t null_policy = {
3636*90e502c7SAndroid Build Coastguard Worker     { ssrc_any_outbound, 0 }, /* SSRC */
3637*90e502c7SAndroid Build Coastguard Worker     {
3638*90e502c7SAndroid Build Coastguard Worker         SRTP_NULL_CIPHER, /* cipher type                 */
3639*90e502c7SAndroid Build Coastguard Worker         0,                /* cipher key length in octets */
3640*90e502c7SAndroid Build Coastguard Worker         SRTP_NULL_AUTH,   /* authentication func type    */
3641*90e502c7SAndroid Build Coastguard Worker         0,                /* auth key length in octets   */
3642*90e502c7SAndroid Build Coastguard Worker         0,                /* auth tag length in octets   */
3643*90e502c7SAndroid Build Coastguard Worker         sec_serv_none     /* security services flag      */
3644*90e502c7SAndroid Build Coastguard Worker     },
3645*90e502c7SAndroid Build Coastguard Worker     {
3646*90e502c7SAndroid Build Coastguard Worker         SRTP_NULL_CIPHER, /* cipher type                 */
3647*90e502c7SAndroid Build Coastguard Worker         0,                /* cipher key length in octets */
3648*90e502c7SAndroid Build Coastguard Worker         SRTP_NULL_AUTH,   /* authentication func type    */
3649*90e502c7SAndroid Build Coastguard Worker         0,                /* auth key length in octets   */
3650*90e502c7SAndroid Build Coastguard Worker         0,                /* auth tag length in octets   */
3651*90e502c7SAndroid Build Coastguard Worker         sec_serv_none     /* security services flag      */
3652*90e502c7SAndroid Build Coastguard Worker     },
3653*90e502c7SAndroid Build Coastguard Worker     NULL,
3654*90e502c7SAndroid Build Coastguard Worker     (srtp_master_key_t **)test_keys,
3655*90e502c7SAndroid Build Coastguard Worker     2,    /* indicates the number of Master keys          */
3656*90e502c7SAndroid Build Coastguard Worker     NULL, /* indicates that EKT is not in use             */
3657*90e502c7SAndroid Build Coastguard Worker     128,  /* replay window size                           */
3658*90e502c7SAndroid Build Coastguard Worker     0,    /* retransmission not allowed                   */
3659*90e502c7SAndroid Build Coastguard Worker     NULL, /* no encrypted extension headers               */
3660*90e502c7SAndroid Build Coastguard Worker     0,    /* list of encrypted extension headers is empty */
3661*90e502c7SAndroid Build Coastguard Worker     NULL
3662*90e502c7SAndroid Build Coastguard Worker };
3663*90e502c7SAndroid Build Coastguard Worker 
3664*90e502c7SAndroid Build Coastguard Worker // clang-format off
3665*90e502c7SAndroid Build Coastguard Worker unsigned char test_256_key[46] = {
3666*90e502c7SAndroid Build Coastguard Worker     0xf0, 0xf0, 0x49, 0x14, 0xb5, 0x13, 0xf2, 0x76,
3667*90e502c7SAndroid Build Coastguard Worker     0x3a, 0x1b, 0x1f, 0xa1, 0x30, 0xf1, 0x0e, 0x29,
3668*90e502c7SAndroid Build Coastguard Worker     0x98, 0xf6, 0xf6, 0xe4, 0x3e, 0x43, 0x09, 0xd1,
3669*90e502c7SAndroid Build Coastguard Worker     0xe6, 0x22, 0xa0, 0xe3, 0x32, 0xb9, 0xf1, 0xb6,
3670*90e502c7SAndroid Build Coastguard Worker 
3671*90e502c7SAndroid Build Coastguard Worker     0x3b, 0x04, 0x80, 0x3d, 0xe5, 0x1e, 0xe7, 0xc9,
3672*90e502c7SAndroid Build Coastguard Worker     0x64, 0x23, 0xab, 0x5b, 0x78, 0xd2
3673*90e502c7SAndroid Build Coastguard Worker };
3674*90e502c7SAndroid Build Coastguard Worker 
3675*90e502c7SAndroid Build Coastguard Worker unsigned char test_256_key_2[46] = {
3676*90e502c7SAndroid Build Coastguard Worker     0xe1, 0xf9, 0x7a, 0x0d, 0x3e, 0x01, 0x8b, 0xe0,
3677*90e502c7SAndroid Build Coastguard Worker     0xd6, 0x4f, 0xa3, 0x2c, 0x06, 0xde, 0x41, 0x39,
3678*90e502c7SAndroid Build Coastguard Worker     0x0e, 0xc6, 0x75, 0xad, 0x49, 0x8a, 0xfe, 0xeb,
3679*90e502c7SAndroid Build Coastguard Worker     0xb6, 0x96, 0x0b, 0x3a, 0xab, 0xe6, 0xc1, 0x73,
3680*90e502c7SAndroid Build Coastguard Worker     0x3b, 0x04, 0x80, 0x3d, 0xe5, 0x1e, 0xe7, 0xc9,
3681*90e502c7SAndroid Build Coastguard Worker     0x64, 0x23, 0xab, 0x5b, 0x78, 0xd2
3682*90e502c7SAndroid Build Coastguard Worker };
3683*90e502c7SAndroid Build Coastguard Worker 
3684*90e502c7SAndroid Build Coastguard Worker srtp_master_key_t master_256_key_1 = {
3685*90e502c7SAndroid Build Coastguard Worker     test_256_key,
3686*90e502c7SAndroid Build Coastguard Worker     test_mki_id,
3687*90e502c7SAndroid Build Coastguard Worker     TEST_MKI_ID_SIZE
3688*90e502c7SAndroid Build Coastguard Worker };
3689*90e502c7SAndroid Build Coastguard Worker 
3690*90e502c7SAndroid Build Coastguard Worker srtp_master_key_t master_256_key_2 = {
3691*90e502c7SAndroid Build Coastguard Worker     test_256_key_2,
3692*90e502c7SAndroid Build Coastguard Worker     test_mki_id_2,
3693*90e502c7SAndroid Build Coastguard Worker     TEST_MKI_ID_SIZE
3694*90e502c7SAndroid Build Coastguard Worker };
3695*90e502c7SAndroid Build Coastguard Worker 
3696*90e502c7SAndroid Build Coastguard Worker srtp_master_key_t *test_256_keys[2] = {
3697*90e502c7SAndroid Build Coastguard Worker     &master_key_1,
3698*90e502c7SAndroid Build Coastguard Worker     &master_key_2
3699*90e502c7SAndroid Build Coastguard Worker };
3700*90e502c7SAndroid Build Coastguard Worker // clang-format on
3701*90e502c7SAndroid Build Coastguard Worker 
3702*90e502c7SAndroid Build Coastguard Worker const srtp_policy_t aes_256_hmac_policy = {
3703*90e502c7SAndroid Build Coastguard Worker     { ssrc_any_outbound, 0 }, /* SSRC */
3704*90e502c7SAndroid Build Coastguard Worker     {
3705*90e502c7SAndroid Build Coastguard Worker         /* SRTP policy */
3706*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_ICM_256,               /* cipher type                 */
3707*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_ICM_256_KEY_LEN_WSALT, /* cipher key length in octets */
3708*90e502c7SAndroid Build Coastguard Worker         SRTP_HMAC_SHA1,                 /* authentication func type    */
3709*90e502c7SAndroid Build Coastguard Worker         20,                             /* auth key length in octets   */
3710*90e502c7SAndroid Build Coastguard Worker         10,                             /* auth tag length in octets   */
3711*90e502c7SAndroid Build Coastguard Worker         sec_serv_conf_and_auth          /* security services flag      */
3712*90e502c7SAndroid Build Coastguard Worker     },
3713*90e502c7SAndroid Build Coastguard Worker     {
3714*90e502c7SAndroid Build Coastguard Worker         /* SRTCP policy */
3715*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_ICM_256,               /* cipher type                 */
3716*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_ICM_256_KEY_LEN_WSALT, /* cipher key length in octets */
3717*90e502c7SAndroid Build Coastguard Worker         SRTP_HMAC_SHA1,                 /* authentication func type    */
3718*90e502c7SAndroid Build Coastguard Worker         20,                             /* auth key length in octets   */
3719*90e502c7SAndroid Build Coastguard Worker         10,                             /* auth tag length in octets   */
3720*90e502c7SAndroid Build Coastguard Worker         sec_serv_conf_and_auth          /* security services flag      */
3721*90e502c7SAndroid Build Coastguard Worker     },
3722*90e502c7SAndroid Build Coastguard Worker     NULL,
3723*90e502c7SAndroid Build Coastguard Worker     (srtp_master_key_t **)test_256_keys,
3724*90e502c7SAndroid Build Coastguard Worker     2,    /* indicates the number of Master keys          */
3725*90e502c7SAndroid Build Coastguard Worker     NULL, /* indicates that EKT is not in use             */
3726*90e502c7SAndroid Build Coastguard Worker     128,  /* replay window size                           */
3727*90e502c7SAndroid Build Coastguard Worker     0,    /* retransmission not allowed                   */
3728*90e502c7SAndroid Build Coastguard Worker     NULL, /* no encrypted extension headers               */
3729*90e502c7SAndroid Build Coastguard Worker     0,    /* list of encrypted extension headers is empty */
3730*90e502c7SAndroid Build Coastguard Worker     NULL
3731*90e502c7SAndroid Build Coastguard Worker };
3732*90e502c7SAndroid Build Coastguard Worker 
3733*90e502c7SAndroid Build Coastguard Worker // clang-format off
3734*90e502c7SAndroid Build Coastguard Worker uint8_t ekt_test_key[16] = {
3735*90e502c7SAndroid Build Coastguard Worker     0x77, 0x26, 0x9d, 0xac, 0x16, 0xa3, 0x28, 0xca,
3736*90e502c7SAndroid Build Coastguard Worker     0x8e, 0xc9, 0x68, 0x4b, 0xcc, 0xc4, 0xd2, 0x1b
3737*90e502c7SAndroid Build Coastguard Worker };
3738*90e502c7SAndroid Build Coastguard Worker // clang-format on
3739*90e502c7SAndroid Build Coastguard Worker 
3740*90e502c7SAndroid Build Coastguard Worker #include "ekt.h"
3741*90e502c7SAndroid Build Coastguard Worker 
3742*90e502c7SAndroid Build Coastguard Worker // clang-format off
3743*90e502c7SAndroid Build Coastguard Worker srtp_ekt_policy_ctx_t ekt_test_policy = {
3744*90e502c7SAndroid Build Coastguard Worker     0xa5a5,                     /* SPI */
3745*90e502c7SAndroid Build Coastguard Worker     SRTP_EKT_CIPHER_AES_128_ECB,
3746*90e502c7SAndroid Build Coastguard Worker     ekt_test_key,
3747*90e502c7SAndroid Build Coastguard Worker     NULL
3748*90e502c7SAndroid Build Coastguard Worker };
3749*90e502c7SAndroid Build Coastguard Worker // clang-format on
3750*90e502c7SAndroid Build Coastguard Worker 
3751*90e502c7SAndroid Build Coastguard Worker const srtp_policy_t hmac_only_with_ekt_policy = {
3752*90e502c7SAndroid Build Coastguard Worker     { ssrc_any_outbound, 0 }, /* SSRC */
3753*90e502c7SAndroid Build Coastguard Worker     {
3754*90e502c7SAndroid Build Coastguard Worker         SRTP_NULL_CIPHER, /* cipher type                 */
3755*90e502c7SAndroid Build Coastguard Worker         0,                /* cipher key length in octets */
3756*90e502c7SAndroid Build Coastguard Worker         SRTP_HMAC_SHA1,   /* authentication func type    */
3757*90e502c7SAndroid Build Coastguard Worker         20,               /* auth key length in octets   */
3758*90e502c7SAndroid Build Coastguard Worker         4,                /* auth tag length in octets   */
3759*90e502c7SAndroid Build Coastguard Worker         sec_serv_auth     /* security services flag      */
3760*90e502c7SAndroid Build Coastguard Worker     },
3761*90e502c7SAndroid Build Coastguard Worker     {
3762*90e502c7SAndroid Build Coastguard Worker         SRTP_NULL_CIPHER, /* cipher type                 */
3763*90e502c7SAndroid Build Coastguard Worker         0,                /* cipher key length in octets */
3764*90e502c7SAndroid Build Coastguard Worker         SRTP_HMAC_SHA1,   /* authentication func type    */
3765*90e502c7SAndroid Build Coastguard Worker         20,               /* auth key length in octets   */
3766*90e502c7SAndroid Build Coastguard Worker         4,                /* auth tag length in octets   */
3767*90e502c7SAndroid Build Coastguard Worker         sec_serv_auth     /* security services flag      */
3768*90e502c7SAndroid Build Coastguard Worker     },
3769*90e502c7SAndroid Build Coastguard Worker     NULL,
3770*90e502c7SAndroid Build Coastguard Worker     (srtp_master_key_t **)test_keys,
3771*90e502c7SAndroid Build Coastguard Worker     2,                /* indicates the number of Master keys          */
3772*90e502c7SAndroid Build Coastguard Worker     &ekt_test_policy, /* indicates that EKT is not in use             */
3773*90e502c7SAndroid Build Coastguard Worker     128,              /* replay window size                           */
3774*90e502c7SAndroid Build Coastguard Worker     0,                /* retransmission not allowed                   */
3775*90e502c7SAndroid Build Coastguard Worker     NULL,             /* no encrypted extension headers               */
3776*90e502c7SAndroid Build Coastguard Worker     0,                /* list of encrypted extension headers is empty */
3777*90e502c7SAndroid Build Coastguard Worker     NULL
3778*90e502c7SAndroid Build Coastguard Worker };
3779*90e502c7SAndroid Build Coastguard Worker 
3780*90e502c7SAndroid Build Coastguard Worker /*
3781*90e502c7SAndroid Build Coastguard Worker  * an array of pointers to the policies listed above
3782*90e502c7SAndroid Build Coastguard Worker  *
3783*90e502c7SAndroid Build Coastguard Worker  * This array is used to test various aspects of libSRTP for
3784*90e502c7SAndroid Build Coastguard Worker  * different cryptographic policies.  The order of the elements
3785*90e502c7SAndroid Build Coastguard Worker  * matters - the timing test generates output that can be used
3786*90e502c7SAndroid Build Coastguard Worker  * in a plot (see the gnuplot script file 'timing').  If you
3787*90e502c7SAndroid Build Coastguard Worker  * add to this list, you should do it at the end.
3788*90e502c7SAndroid Build Coastguard Worker  */
3789*90e502c7SAndroid Build Coastguard Worker 
3790*90e502c7SAndroid Build Coastguard Worker // clang-format off
3791*90e502c7SAndroid Build Coastguard Worker const srtp_policy_t *policy_array[] = {
3792*90e502c7SAndroid Build Coastguard Worker     &hmac_only_policy,
3793*90e502c7SAndroid Build Coastguard Worker     &aes_only_policy,
3794*90e502c7SAndroid Build Coastguard Worker     &default_policy,
3795*90e502c7SAndroid Build Coastguard Worker #ifdef GCM
3796*90e502c7SAndroid Build Coastguard Worker     &aes128_gcm_8_policy,
3797*90e502c7SAndroid Build Coastguard Worker     &aes128_gcm_8_cauth_policy,
3798*90e502c7SAndroid Build Coastguard Worker     &aes256_gcm_8_policy,
3799*90e502c7SAndroid Build Coastguard Worker     &aes256_gcm_8_cauth_policy,
3800*90e502c7SAndroid Build Coastguard Worker #endif
3801*90e502c7SAndroid Build Coastguard Worker     &null_policy,
3802*90e502c7SAndroid Build Coastguard Worker     &aes_256_hmac_policy,
3803*90e502c7SAndroid Build Coastguard Worker     &hmac_only_with_ekt_policy,
3804*90e502c7SAndroid Build Coastguard Worker     NULL
3805*90e502c7SAndroid Build Coastguard Worker };
3806*90e502c7SAndroid Build Coastguard Worker // clang-format on
3807*90e502c7SAndroid Build Coastguard Worker 
3808*90e502c7SAndroid Build Coastguard Worker const srtp_policy_t wildcard_policy = {
3809*90e502c7SAndroid Build Coastguard Worker     { ssrc_any_outbound, 0 }, /* SSRC */
3810*90e502c7SAndroid Build Coastguard Worker     {
3811*90e502c7SAndroid Build Coastguard Worker         /* SRTP policy */
3812*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_ICM_128,               /* cipher type                 */
3813*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_ICM_128_KEY_LEN_WSALT, /* cipher key length in octets */
3814*90e502c7SAndroid Build Coastguard Worker         SRTP_HMAC_SHA1,                 /* authentication func type    */
3815*90e502c7SAndroid Build Coastguard Worker         16,                             /* auth key length in octets   */
3816*90e502c7SAndroid Build Coastguard Worker         10,                             /* auth tag length in octets   */
3817*90e502c7SAndroid Build Coastguard Worker         sec_serv_conf_and_auth          /* security services flag      */
3818*90e502c7SAndroid Build Coastguard Worker     },
3819*90e502c7SAndroid Build Coastguard Worker     {
3820*90e502c7SAndroid Build Coastguard Worker         /* SRTCP policy */
3821*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_ICM_128,               /* cipher type                 */
3822*90e502c7SAndroid Build Coastguard Worker         SRTP_AES_ICM_128_KEY_LEN_WSALT, /* cipher key length in octets */
3823*90e502c7SAndroid Build Coastguard Worker         SRTP_HMAC_SHA1,                 /* authentication func type    */
3824*90e502c7SAndroid Build Coastguard Worker         16,                             /* auth key length in octets   */
3825*90e502c7SAndroid Build Coastguard Worker         10,                             /* auth tag length in octets   */
3826*90e502c7SAndroid Build Coastguard Worker         sec_serv_conf_and_auth          /* security services flag      */
3827*90e502c7SAndroid Build Coastguard Worker     },
3828*90e502c7SAndroid Build Coastguard Worker     test_key,
3829*90e502c7SAndroid Build Coastguard Worker     NULL,
3830*90e502c7SAndroid Build Coastguard Worker     0,
3831*90e502c7SAndroid Build Coastguard Worker     NULL,
3832*90e502c7SAndroid Build Coastguard Worker     128,  /* replay window size                           */
3833*90e502c7SAndroid Build Coastguard Worker     0,    /* retransmission not allowed                   */
3834*90e502c7SAndroid Build Coastguard Worker     NULL, /* no encrypted extension headers               */
3835*90e502c7SAndroid Build Coastguard Worker     0,    /* list of encrypted extension headers is empty */
3836*90e502c7SAndroid Build Coastguard Worker     NULL
3837*90e502c7SAndroid Build Coastguard Worker };
3838