xref: /aosp_15_r20/external/libsrtp2/test/test_srtp.c (revision 90e502c7aef8d77d0622bb67d75435c6190cfc1a)
1*90e502c7SAndroid Build Coastguard Worker /*
2*90e502c7SAndroid Build Coastguard Worker  * test_srtp.c
3*90e502c7SAndroid Build Coastguard Worker  *
4*90e502c7SAndroid Build Coastguard Worker  * Unit tests for internal srtp functions
5*90e502c7SAndroid Build Coastguard Worker  *
6*90e502c7SAndroid Build Coastguard Worker  * Cisco Systems, Inc.
7*90e502c7SAndroid Build Coastguard Worker  *
8*90e502c7SAndroid Build Coastguard Worker  */
9*90e502c7SAndroid Build Coastguard Worker 
10*90e502c7SAndroid Build Coastguard Worker /*
11*90e502c7SAndroid Build Coastguard Worker  *
12*90e502c7SAndroid Build Coastguard Worker  * Copyright (c) 2017, Cisco Systems, Inc.
13*90e502c7SAndroid Build Coastguard Worker  * All rights reserved.
14*90e502c7SAndroid Build Coastguard Worker  *
15*90e502c7SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
16*90e502c7SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
17*90e502c7SAndroid Build Coastguard Worker  * are met:
18*90e502c7SAndroid Build Coastguard Worker  *
19*90e502c7SAndroid Build Coastguard Worker  *   Redistributions of source code must retain the above copyright
20*90e502c7SAndroid Build Coastguard Worker  *   notice, this list of conditions and the following disclaimer.
21*90e502c7SAndroid Build Coastguard Worker  *
22*90e502c7SAndroid Build Coastguard Worker  *   Redistributions in binary form must reproduce the above
23*90e502c7SAndroid Build Coastguard Worker  *   copyright notice, this list of conditions and the following
24*90e502c7SAndroid Build Coastguard Worker  *   disclaimer in the documentation and/or other materials provided
25*90e502c7SAndroid Build Coastguard Worker  *   with the distribution.
26*90e502c7SAndroid Build Coastguard Worker  *
27*90e502c7SAndroid Build Coastguard Worker  *   Neither the name of the Cisco Systems, Inc. nor the names of its
28*90e502c7SAndroid Build Coastguard Worker  *   contributors may be used to endorse or promote products derived
29*90e502c7SAndroid Build Coastguard Worker  *   from this software without specific prior written permission.
30*90e502c7SAndroid Build Coastguard Worker  *
31*90e502c7SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*90e502c7SAndroid Build Coastguard Worker  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*90e502c7SAndroid Build Coastguard Worker  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
34*90e502c7SAndroid Build Coastguard Worker  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
35*90e502c7SAndroid Build Coastguard Worker  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
36*90e502c7SAndroid Build Coastguard Worker  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
37*90e502c7SAndroid Build Coastguard Worker  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
38*90e502c7SAndroid Build Coastguard Worker  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39*90e502c7SAndroid Build Coastguard Worker  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40*90e502c7SAndroid Build Coastguard Worker  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
41*90e502c7SAndroid Build Coastguard Worker  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
42*90e502c7SAndroid Build Coastguard Worker  * OF THE POSSIBILITY OF SUCH DAMAGE.
43*90e502c7SAndroid Build Coastguard Worker  *
44*90e502c7SAndroid Build Coastguard Worker  */
45*90e502c7SAndroid Build Coastguard Worker 
46*90e502c7SAndroid Build Coastguard Worker /*
47*90e502c7SAndroid Build Coastguard Worker  * libSRTP specific.
48*90e502c7SAndroid Build Coastguard Worker  */
49*90e502c7SAndroid Build Coastguard Worker #include "../srtp/srtp.c" // Get access to static functions
50*90e502c7SAndroid Build Coastguard Worker 
51*90e502c7SAndroid Build Coastguard Worker /*
52*90e502c7SAndroid Build Coastguard Worker  * Test specific.
53*90e502c7SAndroid Build Coastguard Worker  */
54*90e502c7SAndroid Build Coastguard Worker #include "cutest.h"
55*90e502c7SAndroid Build Coastguard Worker 
56*90e502c7SAndroid Build Coastguard Worker /*
57*90e502c7SAndroid Build Coastguard Worker  * Standard library.
58*90e502c7SAndroid Build Coastguard Worker  */
59*90e502c7SAndroid Build Coastguard Worker 
60*90e502c7SAndroid Build Coastguard Worker /*
61*90e502c7SAndroid Build Coastguard Worker  * Forward declarations for all tests.
62*90e502c7SAndroid Build Coastguard Worker  */
63*90e502c7SAndroid Build Coastguard Worker 
64*90e502c7SAndroid Build Coastguard Worker void srtp_calc_aead_iv_srtcp_all_zero_input_yield_zero_output(void);
65*90e502c7SAndroid Build Coastguard Worker void srtp_calc_aead_iv_srtcp_seq_num_over_0x7FFFFFFF_bad_param(void);
66*90e502c7SAndroid Build Coastguard Worker void srtp_calc_aead_iv_srtcp_distinct_iv_per_sequence_number(void);
67*90e502c7SAndroid Build Coastguard Worker 
68*90e502c7SAndroid Build Coastguard Worker /*
69*90e502c7SAndroid Build Coastguard Worker  * NULL terminated array of tests.
70*90e502c7SAndroid Build Coastguard Worker  * The first item in the array is a char[] which give some information about
71*90e502c7SAndroid Build Coastguard Worker  * what is being tested and is displayed to the user during runtime, the second
72*90e502c7SAndroid Build Coastguard Worker  * item is the test function.
73*90e502c7SAndroid Build Coastguard Worker  */
74*90e502c7SAndroid Build Coastguard Worker 
75*90e502c7SAndroid Build Coastguard Worker TEST_LIST = { { "srtp_calc_aead_iv_srtcp_all_zero_input_yield_zero_output()",
76*90e502c7SAndroid Build Coastguard Worker                 srtp_calc_aead_iv_srtcp_all_zero_input_yield_zero_output },
77*90e502c7SAndroid Build Coastguard Worker               { "srtp_calc_aead_iv_srtcp_seq_num_over_0x7FFFFFFF_bad_param()",
78*90e502c7SAndroid Build Coastguard Worker                 srtp_calc_aead_iv_srtcp_seq_num_over_0x7FFFFFFF_bad_param },
79*90e502c7SAndroid Build Coastguard Worker               { "srtp_calc_aead_iv_srtcp_distinct_iv_per_sequence_number()",
80*90e502c7SAndroid Build Coastguard Worker                 srtp_calc_aead_iv_srtcp_distinct_iv_per_sequence_number },
81*90e502c7SAndroid Build Coastguard Worker               { NULL } /* End of tests */ };
82*90e502c7SAndroid Build Coastguard Worker 
83*90e502c7SAndroid Build Coastguard Worker /*
84*90e502c7SAndroid Build Coastguard Worker  * Implementation.
85*90e502c7SAndroid Build Coastguard Worker  */
86*90e502c7SAndroid Build Coastguard Worker 
srtp_calc_aead_iv_srtcp_all_zero_input_yield_zero_output()87*90e502c7SAndroid Build Coastguard Worker void srtp_calc_aead_iv_srtcp_all_zero_input_yield_zero_output()
88*90e502c7SAndroid Build Coastguard Worker {
89*90e502c7SAndroid Build Coastguard Worker     // Preconditions
90*90e502c7SAndroid Build Coastguard Worker     srtp_session_keys_t session_keys;
91*90e502c7SAndroid Build Coastguard Worker     v128_t init_vector;
92*90e502c7SAndroid Build Coastguard Worker     srtcp_hdr_t header;
93*90e502c7SAndroid Build Coastguard Worker     uint32_t sequence_num;
94*90e502c7SAndroid Build Coastguard Worker 
95*90e502c7SAndroid Build Coastguard Worker     // Postconditions
96*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
97*90e502c7SAndroid Build Coastguard Worker     const v128_t zero_vector;
98*90e502c7SAndroid Build Coastguard Worker     memset((v128_t *)&zero_vector, 0, sizeof(v128_t));
99*90e502c7SAndroid Build Coastguard Worker 
100*90e502c7SAndroid Build Coastguard Worker     // Given
101*90e502c7SAndroid Build Coastguard Worker     memset(&session_keys, 0, sizeof(srtp_session_keys_t));
102*90e502c7SAndroid Build Coastguard Worker     memset(&init_vector, 0, sizeof(v128_t));
103*90e502c7SAndroid Build Coastguard Worker     memset(&header, 0, sizeof(srtcp_hdr_t));
104*90e502c7SAndroid Build Coastguard Worker     sequence_num = 0x0UL;
105*90e502c7SAndroid Build Coastguard Worker 
106*90e502c7SAndroid Build Coastguard Worker     // When
107*90e502c7SAndroid Build Coastguard Worker     status = srtp_calc_aead_iv_srtcp(&session_keys, &init_vector, sequence_num,
108*90e502c7SAndroid Build Coastguard Worker                                      &header);
109*90e502c7SAndroid Build Coastguard Worker 
110*90e502c7SAndroid Build Coastguard Worker     // Then
111*90e502c7SAndroid Build Coastguard Worker     TEST_CHECK(status == srtp_err_status_ok);
112*90e502c7SAndroid Build Coastguard Worker     TEST_CHECK(memcmp(&zero_vector, &init_vector, sizeof(v128_t)) == 0);
113*90e502c7SAndroid Build Coastguard Worker }
114*90e502c7SAndroid Build Coastguard Worker 
srtp_calc_aead_iv_srtcp_seq_num_over_0x7FFFFFFF_bad_param()115*90e502c7SAndroid Build Coastguard Worker void srtp_calc_aead_iv_srtcp_seq_num_over_0x7FFFFFFF_bad_param()
116*90e502c7SAndroid Build Coastguard Worker {
117*90e502c7SAndroid Build Coastguard Worker     // Preconditions
118*90e502c7SAndroid Build Coastguard Worker     srtp_session_keys_t session_keys;
119*90e502c7SAndroid Build Coastguard Worker     v128_t init_vector;
120*90e502c7SAndroid Build Coastguard Worker     srtcp_hdr_t header;
121*90e502c7SAndroid Build Coastguard Worker     uint32_t sequence_num;
122*90e502c7SAndroid Build Coastguard Worker 
123*90e502c7SAndroid Build Coastguard Worker     // Postconditions
124*90e502c7SAndroid Build Coastguard Worker     srtp_err_status_t status;
125*90e502c7SAndroid Build Coastguard Worker 
126*90e502c7SAndroid Build Coastguard Worker     // Given
127*90e502c7SAndroid Build Coastguard Worker     memset(&session_keys, 0, sizeof(srtp_session_keys_t));
128*90e502c7SAndroid Build Coastguard Worker     memset(&init_vector, 0, sizeof(v128_t));
129*90e502c7SAndroid Build Coastguard Worker     memset(&header, 0, sizeof(srtcp_hdr_t));
130*90e502c7SAndroid Build Coastguard Worker     sequence_num = 0x7FFFFFFFUL + 0x1UL;
131*90e502c7SAndroid Build Coastguard Worker 
132*90e502c7SAndroid Build Coastguard Worker     // When
133*90e502c7SAndroid Build Coastguard Worker     status = srtp_calc_aead_iv_srtcp(&session_keys, &init_vector, sequence_num,
134*90e502c7SAndroid Build Coastguard Worker                                      &header);
135*90e502c7SAndroid Build Coastguard Worker 
136*90e502c7SAndroid Build Coastguard Worker     // Then
137*90e502c7SAndroid Build Coastguard Worker     TEST_CHECK(status == srtp_err_status_bad_param);
138*90e502c7SAndroid Build Coastguard Worker }
139*90e502c7SAndroid Build Coastguard Worker 
140*90e502c7SAndroid Build Coastguard Worker /*
141*90e502c7SAndroid Build Coastguard Worker  * Regression test for issue #256:
142*90e502c7SAndroid Build Coastguard Worker  * Srtcp IV calculation incorrectly masks high bit of sequence number for
143*90e502c7SAndroid Build Coastguard Worker  * little-endian platforms.
144*90e502c7SAndroid Build Coastguard Worker  * Ensure that for each valid sequence number where the most significant bit is
145*90e502c7SAndroid Build Coastguard Worker  * high that we get an expected and unique IV.
146*90e502c7SAndroid Build Coastguard Worker  */
srtp_calc_aead_iv_srtcp_distinct_iv_per_sequence_number()147*90e502c7SAndroid Build Coastguard Worker void srtp_calc_aead_iv_srtcp_distinct_iv_per_sequence_number()
148*90e502c7SAndroid Build Coastguard Worker {
149*90e502c7SAndroid Build Coastguard Worker #define SAMPLE_COUNT (3)
150*90e502c7SAndroid Build Coastguard Worker     // Preconditions
151*90e502c7SAndroid Build Coastguard Worker     // Test each significant bit high in each full byte.
152*90e502c7SAndroid Build Coastguard Worker     srtp_session_keys_t session_keys;
153*90e502c7SAndroid Build Coastguard Worker     srtcp_hdr_t header;
154*90e502c7SAndroid Build Coastguard Worker     v128_t output_iv[SAMPLE_COUNT];
155*90e502c7SAndroid Build Coastguard Worker     uint32_t sequence_num[SAMPLE_COUNT];
156*90e502c7SAndroid Build Coastguard Worker     v128_t final_iv[SAMPLE_COUNT];
157*90e502c7SAndroid Build Coastguard Worker     size_t i = 0;
158*90e502c7SAndroid Build Coastguard Worker     memset(&output_iv, 0, SAMPLE_COUNT * sizeof(v128_t));
159*90e502c7SAndroid Build Coastguard Worker     sequence_num[0] = 0xFF;
160*90e502c7SAndroid Build Coastguard Worker     sequence_num[1] = 0xFF00;
161*90e502c7SAndroid Build Coastguard Worker     sequence_num[2] = 0xFF0000;
162*90e502c7SAndroid Build Coastguard Worker 
163*90e502c7SAndroid Build Coastguard Worker     // Postconditions
164*90e502c7SAndroid Build Coastguard Worker     memset(&final_iv, 0, SAMPLE_COUNT * sizeof(v128_t));
165*90e502c7SAndroid Build Coastguard Worker     final_iv[0].v8[11] = 0xFF;
166*90e502c7SAndroid Build Coastguard Worker     final_iv[1].v8[10] = 0xFF;
167*90e502c7SAndroid Build Coastguard Worker     final_iv[2].v8[9] = 0xFF;
168*90e502c7SAndroid Build Coastguard Worker 
169*90e502c7SAndroid Build Coastguard Worker     // Given
170*90e502c7SAndroid Build Coastguard Worker     memset(&session_keys, 0, sizeof(srtp_session_keys_t));
171*90e502c7SAndroid Build Coastguard Worker     memset(&header, 0, sizeof(srtcp_hdr_t));
172*90e502c7SAndroid Build Coastguard Worker 
173*90e502c7SAndroid Build Coastguard Worker     // When
174*90e502c7SAndroid Build Coastguard Worker     for (i = 0; i < SAMPLE_COUNT; i++) {
175*90e502c7SAndroid Build Coastguard Worker         TEST_CHECK(srtp_calc_aead_iv_srtcp(&session_keys, &output_iv[i],
176*90e502c7SAndroid Build Coastguard Worker                                            sequence_num[i],
177*90e502c7SAndroid Build Coastguard Worker                                            &header) == srtp_err_status_ok);
178*90e502c7SAndroid Build Coastguard Worker     }
179*90e502c7SAndroid Build Coastguard Worker 
180*90e502c7SAndroid Build Coastguard Worker     // Then all IVs are as expected
181*90e502c7SAndroid Build Coastguard Worker     for (i = 0; i < SAMPLE_COUNT; i++) {
182*90e502c7SAndroid Build Coastguard Worker         TEST_CHECK(memcmp(&final_iv[i], &output_iv[i], sizeof(v128_t)) == 0);
183*90e502c7SAndroid Build Coastguard Worker     }
184*90e502c7SAndroid Build Coastguard Worker #undef SAMPLE_COUNT
185*90e502c7SAndroid Build Coastguard Worker }
186