1386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 2386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * srtp_driver.c 3386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 4386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * a test driver for libSRTP 5386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 6386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * David A. McGrew 7386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Cisco Systems, Inc. 8386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 9386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 10386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 11386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Copyright (c) 2001-2006, Cisco Systems, Inc. 12386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * All rights reserved. 13386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 14386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Redistribution and use in source and binary forms, with or without 15386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * modification, are permitted provided that the following conditions 16386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * are met: 17386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 18386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Redistributions of source code must retain the above copyright 19386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * notice, this list of conditions and the following disclaimer. 20386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 21386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Redistributions in binary form must reproduce the above 22386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * copyright notice, this list of conditions and the following 23386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * disclaimer in the documentation and/or other materials provided 24386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * with the distribution. 25386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 26386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Neither the name of the Cisco Systems, Inc. nor the names of its 27386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * contributors may be used to endorse or promote products derived 28386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * from this software without specific prior written permission. 29386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 30386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 31386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 32386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 33386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 34386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 35386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 36386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 37386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 40386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 41386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * OF THE POSSIBILITY OF SUCH DAMAGE. 42386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 43386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 44386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 45386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 46386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include <string.h> /* for memcpy() */ 47386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include <time.h> /* for clock() */ 48386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include <stdlib.h> /* for malloc(), free() */ 49386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include <stdio.h> /* for print(), fflush() */ 50386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "getopt_s.h" /* for local getopt() */ 51386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 52386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "srtp_priv.h" 53386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 54386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifdef HAVE_NETINET_IN_H 55386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# include <netinet/in.h> 56386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#elif defined HAVE_WINSOCK2_H 57386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# include <winsock2.h> 58386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif 59386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 60386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define PRINT_REFERENCE_PACKET 1 61386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 62386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 63386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_validate(void); 64386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 65386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 66386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_create_big_policy(srtp_policy_t **list); 67386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 68386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 69386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_test_remove_stream(void); 70386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 71386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaridouble 72386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_bits_per_second(int msg_len_octets, const srtp_policy_t *policy); 73386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 74386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaridouble 75386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_rejections_per_second(int msg_len_octets, const srtp_policy_t *policy); 76386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 77386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid 78386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_do_timing(const srtp_policy_t *policy); 79386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 80386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid 81386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_do_rejection_timing(const srtp_policy_t *policy); 82386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 83386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 84386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_test(const srtp_policy_t *policy); 85386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 86386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 87386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtcp_test(const srtp_policy_t *policy); 88386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 89386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 90386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_session_print_policy(srtp_t srtp); 91386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 92386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 93386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_print_policy(const srtp_policy_t *policy); 94386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 95386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar * 96386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_packet_to_string(srtp_hdr_t *hdr, int packet_len); 97386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 98386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaridouble 99386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarimips_estimate(int num_trials, int *ignore); 100386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 101386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariextern uint8_t test_key[30]; 102386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 103386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid 104386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariusage(char *prog_name) { 105386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("usage: %s [ -t ][ -c ][ -v ][-d <debug_module> ]* [ -l ]\n" 106386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari " -t run timing test\n" 107386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari " -r run rejection timing test\n" 108386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari " -c run codec timing test\n" 109386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari " -v run validation tests\n" 110386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari " -d <mod> turn on debugging module <mod>\n" 111386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari " -l list debugging modules\n", prog_name); 112386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 113386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 114386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 115386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 116386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * The policy_array is a null-terminated array of policy structs. it 117386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * is declared at the end of this file 118386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 119386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 120386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariextern const srtp_policy_t *policy_array[]; 121386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 122386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 123386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* the wildcard_policy is declared below; it has a wildcard ssrc */ 124386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 125386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariextern const srtp_policy_t wildcard_policy; 126386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 127386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 128386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * mod_driver debug module - debugging module for this test driver 129386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 130386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * we use the crypto_kernel debugging system in this driver, which 131386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * makes the interface uniform and increases portability 132386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 133386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 134386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaridebug_module_t mod_driver = { 135386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* debugging is off by default */ 136386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "driver" /* printable name for module */ 137386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}; 138386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 139386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint 140386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarimain (int argc, char *argv[]) { 141386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int q; 142386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari unsigned do_timing_test = 0; 143386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari unsigned do_rejection_test = 0; 144386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari unsigned do_codec_timing = 0; 145386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari unsigned do_validation = 0; 146386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari unsigned do_list_mods = 0; 147386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_status_t status; 148386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 149386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 150386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * verify that the compiler has interpreted the header data 151386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * structure srtp_hdr_t correctly 152386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 153386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (sizeof(srtp_hdr_t) != 12) { 154386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("error: srtp_hdr_t has incorrect size" 155386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "(size is %ld bytes, expected 12)\n", 156386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari (long)sizeof(srtp_hdr_t)); 157386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 158386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 159386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 160386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* initialize srtp library */ 161386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = srtp_init(); 162386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) { 163386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("error: srtp init failed with error code %d\n", status); 164386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 165386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 166386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 167386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* load srtp_driver debug module */ 168386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = crypto_kernel_load_debug_module(&mod_driver); 169386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) { 170386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("error: load of srtp_driver debug module failed " 171386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "with error code %d\n", status); 172386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 173386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 174386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 175386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* process input arguments */ 176386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari while (1) { 177386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari q = getopt_s(argc, argv, "trcvld:"); 178386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (q == -1) 179386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari break; 180386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari switch (q) { 181386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari case 't': 182386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari do_timing_test = 1; 183386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari break; 184386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari case 'r': 185386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari do_rejection_test = 1; 186386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari break; 187386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari case 'c': 188386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari do_codec_timing = 1; 189386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari break; 190386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari case 'v': 191386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari do_validation = 1; 192386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari break; 193386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari case 'l': 194386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari do_list_mods = 1; 195386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari break; 196386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari case 'd': 197386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = crypto_kernel_set_debug_module(optarg_s, 1); 198386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) { 199386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("error: set debug module (%s) failed\n", optarg_s); 200386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 201386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 202386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari break; 203386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari default: 204386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari usage(argv[0]); 205386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 206386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 207386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 208386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (!do_validation && !do_timing_test && !do_codec_timing 209386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari && !do_list_mods && !do_rejection_test) 210386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari usage(argv[0]); 211386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 212386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (do_list_mods) { 213386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = crypto_kernel_list_debug_modules(); 214386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) { 215386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("error: list of debug modules failed\n"); 216386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 217386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 218386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 219386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 220386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (do_validation) { 221386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari const srtp_policy_t **policy = policy_array; 222386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_policy_t *big_policy; 223386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 224386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* loop over policy array, testing srtp and srtcp for each policy */ 225386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari while (*policy != NULL) { 226386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("testing srtp_protect and srtp_unprotect\n"); 227386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (srtp_test(*policy) == err_status_ok) 228386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("passed\n\n"); 229386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari else { 230386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("failed\n"); 231386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 232386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 233386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("testing srtp_protect_rtcp and srtp_unprotect_rtcp\n"); 234386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (srtcp_test(*policy) == err_status_ok) 235386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("passed\n\n"); 236386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari else { 237386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("failed\n"); 238386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 239386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 240386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy++; 241386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 242386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 243386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* create a big policy list and run tests on it */ 244386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = srtp_create_big_policy(&big_policy); 245386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) { 246386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("unexpected failure with error code %d\n", status); 247386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 248386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 249386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("testing srtp_protect and srtp_unprotect with big policy\n"); 250386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (srtp_test(big_policy) == err_status_ok) 251386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("passed\n\n"); 252386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari else { 253386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("failed\n"); 254386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 255386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 256386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 257386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* run test on wildcard policy */ 258386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("testing srtp_protect and srtp_unprotect on " 259386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "wildcard ssrc policy\n"); 260386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (srtp_test(&wildcard_policy) == err_status_ok) 261386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("passed\n\n"); 262386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari else { 263386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("failed\n"); 264386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 265386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 266386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 267386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 268386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * run validation test against the reference packets - note 269386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * that this test only covers the default policy 270386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 271386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("testing srtp_protect and srtp_unprotect against " 272386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "reference packets\n"); 273386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (srtp_validate() == err_status_ok) 274386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("passed\n\n"); 275386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari else { 276386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("failed\n"); 277386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 278386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 279386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 280386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 281386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * test the function srtp_remove_stream() 282386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 283386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("testing srtp_remove_stream()..."); 284386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (srtp_test_remove_stream() == err_status_ok) 285386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("passed\n"); 286386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari else { 287386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("failed\n"); 288386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 289386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 290386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 291386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 292386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (do_timing_test) { 293386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari const srtp_policy_t **policy = policy_array; 294386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 295386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* loop over policies, run timing test for each */ 296386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari while (*policy != NULL) { 297386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_print_policy(*policy); 298386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_do_timing(*policy); 299386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy++; 300386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 301386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 302386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 303386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (do_rejection_test) { 304386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari const srtp_policy_t **policy = policy_array; 305386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 306386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* loop over policies, run rejection timing test for each */ 307386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari while (*policy != NULL) { 308386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_print_policy(*policy); 309386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_do_rejection_timing(*policy); 310386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy++; 311386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 312386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 313386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 314386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (do_codec_timing) { 315386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_policy_t policy; 316386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int ignore; 317386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari double mips = mips_estimate(1000000000, &ignore); 318386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 319386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari crypto_policy_set_rtp_default(&policy.rtp); 320386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari crypto_policy_set_rtcp_default(&policy.rtcp); 321386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy.ssrc.type = ssrc_specific; 322386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy.ssrc.value = 0xdecafbad; 323386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy.key = test_key; 324386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy.ekt = NULL; 325386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy.window_size = 128; 326386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy.allow_repeat_tx = 0; 327386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy.next = NULL; 328386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 329386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("mips estimate: %e\n", mips); 330386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 331386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("testing srtp processing time for voice codecs:\n"); 332386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("codec\t\tlength (octets)\t\tsrtp instructions/second\n"); 333386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("G.711\t\t%d\t\t\t%e\n", 80, 334386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari (double) mips * (80 * 8) / 335386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_bits_per_second(80, &policy) / .01 ); 336386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("G.711\t\t%d\t\t\t%e\n", 160, 337386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari (double) mips * (160 * 8) / 338386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_bits_per_second(160, &policy) / .02); 339386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("G.726-32\t%d\t\t\t%e\n", 40, 340386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari (double) mips * (40 * 8) / 341386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_bits_per_second(40, &policy) / .01 ); 342386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("G.726-32\t%d\t\t\t%e\n", 80, 343386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari (double) mips * (80 * 8) / 344386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_bits_per_second(80, &policy) / .02); 345386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("G.729\t\t%d\t\t\t%e\n", 10, 346386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari (double) mips * (10 * 8) / 347386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_bits_per_second(10, &policy) / .01 ); 348386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("G.729\t\t%d\t\t\t%e\n", 20, 349386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari (double) mips * (20 * 8) / 350386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_bits_per_second(20, &policy) / .02 ); 351386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("Wideband\t%d\t\t\t%e\n", 320, 352386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari (double) mips * (320 * 8) / 353386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_bits_per_second(320, &policy) / .01 ); 354386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("Wideband\t%d\t\t\t%e\n", 640, 355386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari (double) mips * (640 * 8) / 356386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_bits_per_second(640, &policy) / .02 ); 357386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 358386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 359386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return 0; 360386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 361386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 362386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 363386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 364386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 365386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * srtp_create_test_packet(len, ssrc) returns a pointer to a 366386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * (malloced) example RTP packet whose data field has the length given 367386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * by pkt_octet_len and the SSRC value ssrc. The total length of the 368386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * packet is twelve octets longer, since the header is at the 369386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * beginning. There is room at the end of the packet for a trailer, 370386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * and the four octets following the packet are filled with 0xff 371386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * values to enable testing for overwrites. 372386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 373386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * note that the location of the test packet can (and should) be 374386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * deallocated with the free() call once it is no longer needed. 375386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 376386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 377386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_hdr_t * 378386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_create_test_packet(int pkt_octet_len, uint32_t ssrc) { 379386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int i; 380386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint8_t *buffer; 381386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_hdr_t *hdr; 382386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int bytes_in_hdr = 12; 383386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 384386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* allocate memory for test packet */ 385386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr = (srtp_hdr_t*) malloc(pkt_octet_len + bytes_in_hdr 386386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari + SRTP_MAX_TRAILER_LEN + 4); 387386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (!hdr) 388386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return NULL; 389386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 390386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->version = 2; /* RTP version two */ 391386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->p = 0; /* no padding needed */ 392386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->x = 0; /* no header extension */ 393386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->cc = 0; /* no CSRCs */ 394386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->m = 0; /* marker bit */ 395386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->pt = 0xf; /* payload type */ 396386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->seq = htons(0x1234); /* sequence number */ 397386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->ts = htonl(0xdecafbad); /* timestamp */ 398386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->ssrc = htonl(ssrc); /* synch. source */ 399386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 400386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari buffer = (uint8_t *)hdr; 401386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari buffer += bytes_in_hdr; 402386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 403386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* set RTP data to 0xab */ 404386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (i=0; i < pkt_octet_len; i++) 405386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *buffer++ = 0xab; 406386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 407386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* set post-data value to 0xffff to enable overrun checking */ 408386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (i=0; i < SRTP_MAX_TRAILER_LEN+4; i++) 409386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *buffer++ = 0xff; 410386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 411386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return hdr; 412386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 413386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 414386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid 415386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_do_timing(const srtp_policy_t *policy) { 416386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int len; 417386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 418386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 419386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * note: the output of this function is formatted so that it 420386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * can be used in gnuplot. '#' indicates a comment, and "\r\n" 421386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * terminates a record 422386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 423386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 424386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("# testing srtp throughput:\r\n"); 425386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("# mesg length (octets)\tthroughput (megabits per second)\r\n"); 426386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 427386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (len=16; len <= 2048; len *= 2) 428386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("%d\t\t\t%f\r\n", len, 429386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_bits_per_second(len, policy) / 1.0E6); 430386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 431386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* these extra linefeeds let gnuplot know that a dataset is done */ 432386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("\r\n\r\n"); 433386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 434386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 435386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 436386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid 437386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_do_rejection_timing(const srtp_policy_t *policy) { 438386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int len; 439386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 440386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 441386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * note: the output of this function is formatted so that it 442386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * can be used in gnuplot. '#' indicates a comment, and "\r\n" 443386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * terminates a record 444386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 445386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 446386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("# testing srtp rejection throughput:\r\n"); 447386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("# mesg length (octets)\trejections per second\r\n"); 448386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 449386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (len=8; len <= 2048; len *= 2) 450386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("%d\t\t\t%e\r\n", len, srtp_rejections_per_second(len, policy)); 451386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 452386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* these extra linefeeds let gnuplot know that a dataset is done */ 453386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("\r\n\r\n"); 454386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 455386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 456386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 457386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 458386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define MAX_MSG_LEN 1024 459386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 460386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaridouble 461386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_bits_per_second(int msg_len_octets, const srtp_policy_t *policy) { 462386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_t srtp; 463386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_hdr_t *mesg; 464386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int i; 465386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari clock_t timer; 466386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int num_trials = 100000; 467386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int len; 468386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint32_t ssrc; 469386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_status_t status; 470386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 471386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 472386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * allocate and initialize an srtp session 473386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 474386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = srtp_create(&srtp, policy); 475386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) { 476386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("error: srtp_create() failed with error code %d\n", status); 477386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 478386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 479386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 480386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 481386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * if the ssrc is unspecified, use a predetermined one 482386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 483386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (policy->ssrc.type != ssrc_specific) { 484386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ssrc = 0xdeadbeef; 485386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } else { 486386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ssrc = policy->ssrc.value; 487386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 488386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 489386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 490386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * create a test packet 491386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 492386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari mesg = srtp_create_test_packet(msg_len_octets, ssrc); 493386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (mesg == NULL) 494386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return 0.0; /* indicate failure by returning zero */ 495386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 496386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari timer = clock(); 497386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (i=0; i < num_trials; i++) { 498386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_status_t status; 499386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari len = msg_len_octets + 12; /* add in rtp header length */ 500386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 501386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* srtp protect message */ 502386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = srtp_protect(srtp, mesg, &len); 503386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) { 504386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("error: srtp_protect() failed with error code %d\n", status); 505386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 506386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 507386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 508386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* increment message number */ 509386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari mesg->seq = htons(ntohs(mesg->seq) + 1); 510386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 511386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 512386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari timer = clock() - timer; 513386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 514386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(mesg); 515386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 516386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return (double) (msg_len_octets) * 8 * 517386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari num_trials * CLOCKS_PER_SEC / timer; 518386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 519386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 520386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaridouble 521386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_rejections_per_second(int msg_len_octets, const srtp_policy_t *policy) { 522386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_ctx_t *srtp; 523386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_hdr_t *mesg; 524386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int i; 525386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int len; 526386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari clock_t timer; 527386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int num_trials = 1000000; 528386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint32_t ssrc = policy->ssrc.value; 529386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_status_t status; 530386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 531386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 532386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * allocate and initialize an srtp session 533386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 534386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = srtp_create(&srtp, policy); 535386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) { 536386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("error: srtp_create() failed with error code %d\n", status); 537386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 538386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 539386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 540386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari mesg = srtp_create_test_packet(msg_len_octets, ssrc); 541386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (mesg == NULL) 542386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return 0.0; /* indicate failure by returning zero */ 543386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 544386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari len = msg_len_octets; 545386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_protect(srtp, (srtp_hdr_t *)mesg, &len); 546386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 547386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari timer = clock(); 548386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (i=0; i < num_trials; i++) { 549386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari len = msg_len_octets; 550386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_unprotect(srtp, (srtp_hdr_t *)mesg, &len); 551386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 552386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari timer = clock() - timer; 553386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 554386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(mesg); 555386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 556386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return (double) num_trials * CLOCKS_PER_SEC / timer; 557386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 558386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 559386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 560386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid 561386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_check(err_status_t s) { 562386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (s == err_status_ok) 563386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return; 564386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari else 565386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari fprintf(stderr, "error: unexpected srtp failure (code %d)\n", s); 566386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit (1); 567386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 568386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 569386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 570386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_test(const srtp_policy_t *policy) { 571386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int i; 572386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_t srtp_sender; 573386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_t srtp_rcvr; 574386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_status_t status = err_status_ok; 575386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_hdr_t *hdr, *hdr2; 576386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint8_t hdr_enc[64]; 577386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint8_t *pkt_end; 578386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int msg_len_octets, msg_len_enc; 579386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int len; 580386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int tag_length = policy->rtp.auth_tag_len; 581386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint32_t ssrc; 582386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_policy_t *rcvr_policy; 583386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 584386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_check(srtp_create(&srtp_sender, policy)); 585386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 586386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* print out policy */ 587386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_check(srtp_session_print_policy(srtp_sender)); 588386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 589386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 590386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * initialize data buffer, using the ssrc in the policy unless that 591386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * value is a wildcard, in which case we'll just use an arbitrary 592386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * one 593386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 594386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (policy->ssrc.type != ssrc_specific) 595386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ssrc = 0xdecafbad; 596386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari else 597386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ssrc = policy->ssrc.value; 598386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari msg_len_octets = 28; 599386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr = srtp_create_test_packet(msg_len_octets, ssrc); 600386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 601386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (hdr == NULL) 602386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_alloc_fail; 603386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr2 = srtp_create_test_packet(msg_len_octets, ssrc); 604386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (hdr2 == NULL) { 605386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr); 606386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_alloc_fail; 607386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 608386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 609386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* set message length */ 610386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari len = msg_len_octets; 611386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 612386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari debug_print(mod_driver, "before protection:\n%s", 613386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_packet_to_string(hdr, len)); 614386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 615386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#if PRINT_REFERENCE_PACKET 616386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari debug_print(mod_driver, "reference packet before protection:\n%s", 617386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari octet_string_hex_string((uint8_t *)hdr, len)); 618386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif 619386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_check(srtp_protect(srtp_sender, hdr, &len)); 620386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 621386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari debug_print(mod_driver, "after protection:\n%s", 622386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_packet_to_string(hdr, len)); 623386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#if PRINT_REFERENCE_PACKET 624386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari debug_print(mod_driver, "after protection:\n%s", 625386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari octet_string_hex_string((uint8_t *)hdr, len)); 626386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif 627386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 628386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* save protected message and length */ 629386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari memcpy(hdr_enc, hdr, len); 630386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari msg_len_enc = len; 631386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 632386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 633386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * check for overrun of the srtp_protect() function 634386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 635386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * The packet is followed by a value of 0xfffff; if the value of the 636386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * data following the packet is different, then we know that the 637386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * protect function is overwriting the end of the packet. 638386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 639386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari pkt_end = (uint8_t *)hdr + sizeof(srtp_hdr_t) 640386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari + msg_len_octets + tag_length; 641386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (i = 0; i < 4; i++) 642386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (pkt_end[i] != 0xff) { 643386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari fprintf(stdout, "overwrite in srtp_protect() function " 644386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "(expected %x, found %x in trailing octet %d)\n", 645386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0xff, ((uint8_t *)hdr)[i], i); 646386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr); 647386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr2); 648386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_algo_fail; 649386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 650386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 651386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 652386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * if the policy includes confidentiality, check that ciphertext is 653386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * different than plaintext 654386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 655386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Note that this check will give false negatives, with some small 656386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * probability, especially if the packets are short. For that 657386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * reason, we skip this check if the plaintext is less than four 658386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * octets long. 659386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 660386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if ((policy->rtp.sec_serv & sec_serv_conf) && (msg_len_octets >= 4)) { 661386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("testing that ciphertext is distinct from plaintext..."); 662386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = err_status_algo_fail; 663386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (i=12; i < msg_len_octets+12; i++) 664386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (((uint8_t *)hdr)[i] != ((uint8_t *)hdr2)[i]) { 665386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = err_status_ok; 666386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 667386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) { 668386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("failed\n"); 669386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr); 670386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr2); 671386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 672386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 673386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("passed\n"); 674386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 675386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 676386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 677386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * if the policy uses a 'wildcard' ssrc, then we need to make a copy 678386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * of the policy that changes the direction to inbound 679386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 680386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * we always copy the policy into the rcvr_policy, since otherwise 681386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * the compiler would fret about the constness of the policy 682386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 683386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari rcvr_policy = (srtp_policy_t*) malloc(sizeof(srtp_policy_t)); 684386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (rcvr_policy == NULL) 685386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_alloc_fail; 686386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari memcpy(rcvr_policy, policy, sizeof(srtp_policy_t)); 687386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (policy->ssrc.type == ssrc_any_outbound) { 688386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari rcvr_policy->ssrc.type = ssrc_any_inbound; 689386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 690386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 691386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_check(srtp_create(&srtp_rcvr, rcvr_policy)); 692386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 693386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_check(srtp_unprotect(srtp_rcvr, hdr, &len)); 694386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 695386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari debug_print(mod_driver, "after unprotection:\n%s", 696386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_packet_to_string(hdr, len)); 697386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 698386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* verify that the unprotected packet matches the origial one */ 699386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (i=0; i < msg_len_octets; i++) 700386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (((uint8_t *)hdr)[i] != ((uint8_t *)hdr2)[i]) { 701386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari fprintf(stdout, "mismatch at octet %d\n", i); 702386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = err_status_algo_fail; 703386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 704386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) { 705386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr); 706386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr2); 707386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 708386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 709386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 710386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 711386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * if the policy includes authentication, then test for false positives 712386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 713386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (policy->rtp.sec_serv & sec_serv_auth) { 714386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari char *data = ((char *)hdr) + 12; 715386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 716386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("testing for false positives in replay check..."); 717386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 718386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* set message length */ 719386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari len = msg_len_enc; 720386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 721386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* unprotect a second time - should fail with a replay error */ 722386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = srtp_unprotect(srtp_rcvr, hdr_enc, &len); 723386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status != err_status_replay_fail) { 724386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("failed with error code %d\n", status); 725386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr); 726386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr2); 727386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 728386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } else { 729386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("passed\n"); 730386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 731386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 732386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("testing for false positives in auth check..."); 733386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 734386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* increment sequence number in header */ 735386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->seq++; 736386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 737386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* set message length */ 738386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari len = msg_len_octets; 739386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 740386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* apply protection */ 741386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_check(srtp_protect(srtp_sender, hdr, &len)); 742386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 743386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* flip bits in packet */ 744386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari data[0] ^= 0xff; 745386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 746386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* unprotect, and check for authentication failure */ 747386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = srtp_unprotect(srtp_rcvr, hdr, &len); 748386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status != err_status_auth_fail) { 749386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("failed\n"); 750386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr); 751386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr2); 752386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 753386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } else { 754386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("passed\n"); 755386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 756386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 757386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 758386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 759386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_check(srtp_dealloc(srtp_sender)); 760386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_check(srtp_dealloc(srtp_rcvr)); 761386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 762386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr); 763386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr2); 764386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_ok; 765386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 766386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 767386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 768386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 769386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtcp_test(const srtp_policy_t *policy) { 770386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int i; 771386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_t srtcp_sender; 772386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_t srtcp_rcvr; 773386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_status_t status = err_status_ok; 774386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_hdr_t *hdr, *hdr2; 775386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint8_t hdr_enc[64]; 776386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint8_t *pkt_end; 777386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int msg_len_octets, msg_len_enc; 778386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int len; 779386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int tag_length = policy->rtp.auth_tag_len; 780386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint32_t ssrc; 781386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_policy_t *rcvr_policy; 782386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 783386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_check(srtp_create(&srtcp_sender, policy)); 784386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 785386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* print out policy */ 786386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_check(srtp_session_print_policy(srtcp_sender)); 787386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 788386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 789386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * initialize data buffer, using the ssrc in the policy unless that 790386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * value is a wildcard, in which case we'll just use an arbitrary 791386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * one 792386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 793386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (policy->ssrc.type != ssrc_specific) 794386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ssrc = 0xdecafbad; 795386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari else 796386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ssrc = policy->ssrc.value; 797386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari msg_len_octets = 28; 798386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr = srtp_create_test_packet(msg_len_octets, ssrc); 799386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 800386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (hdr == NULL) 801386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_alloc_fail; 802386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr2 = srtp_create_test_packet(msg_len_octets, ssrc); 803386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (hdr2 == NULL) { 804386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr); 805386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_alloc_fail; 806386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 807386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 808386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* set message length */ 809386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari len = msg_len_octets; 810386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 811386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari debug_print(mod_driver, "before protection:\n%s", 812386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_packet_to_string(hdr, len)); 813386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 814386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#if PRINT_REFERENCE_PACKET 815386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari debug_print(mod_driver, "reference packet before protection:\n%s", 816386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari octet_string_hex_string((uint8_t *)hdr, len)); 817386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif 818386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_check(srtp_protect_rtcp(srtcp_sender, hdr, &len)); 819386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 820386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari debug_print(mod_driver, "after protection:\n%s", 821386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_packet_to_string(hdr, len)); 822386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#if PRINT_REFERENCE_PACKET 823386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari debug_print(mod_driver, "after protection:\n%s", 824386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari octet_string_hex_string((uint8_t *)hdr, len)); 825386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif 826386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 827386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* save protected message and length */ 828386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari memcpy(hdr_enc, hdr, len); 829386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari msg_len_enc = len; 830386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 831386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 832386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * check for overrun of the srtp_protect() function 833386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 834386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * The packet is followed by a value of 0xfffff; if the value of the 835386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * data following the packet is different, then we know that the 836386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * protect function is overwriting the end of the packet. 837386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 838386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari pkt_end = (uint8_t *)hdr + sizeof(srtp_hdr_t) 839386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari + msg_len_octets + tag_length; 840386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (i = 0; i < 4; i++) 841386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (pkt_end[i] != 0xff) { 842386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari fprintf(stdout, "overwrite in srtp_protect_rtcp() function " 843386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "(expected %x, found %x in trailing octet %d)\n", 844386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0xff, ((uint8_t *)hdr)[i], i); 845386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr); 846386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr2); 847386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_algo_fail; 848386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 849386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 850386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 851386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * if the policy includes confidentiality, check that ciphertext is 852386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * different than plaintext 853386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 854386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Note that this check will give false negatives, with some small 855386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * probability, especially if the packets are short. For that 856386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * reason, we skip this check if the plaintext is less than four 857386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * octets long. 858386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 859386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if ((policy->rtp.sec_serv & sec_serv_conf) && (msg_len_octets >= 4)) { 860386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("testing that ciphertext is distinct from plaintext..."); 861386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = err_status_algo_fail; 862386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (i=12; i < msg_len_octets+12; i++) 863386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (((uint8_t *)hdr)[i] != ((uint8_t *)hdr2)[i]) { 864386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = err_status_ok; 865386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 866386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) { 867386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("failed\n"); 868386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr); 869386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr2); 870386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 871386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 872386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("passed\n"); 873386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 874386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 875386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 876386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * if the policy uses a 'wildcard' ssrc, then we need to make a copy 877386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * of the policy that changes the direction to inbound 878386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 879386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * we always copy the policy into the rcvr_policy, since otherwise 880386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * the compiler would fret about the constness of the policy 881386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 882386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari rcvr_policy = (srtp_policy_t*) malloc(sizeof(srtp_policy_t)); 883386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (rcvr_policy == NULL) 884386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_alloc_fail; 885386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari memcpy(rcvr_policy, policy, sizeof(srtp_policy_t)); 886386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (policy->ssrc.type == ssrc_any_outbound) { 887386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari rcvr_policy->ssrc.type = ssrc_any_inbound; 888386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 889386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 890386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_check(srtp_create(&srtcp_rcvr, rcvr_policy)); 891386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 892386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_check(srtp_unprotect_rtcp(srtcp_rcvr, hdr, &len)); 893386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 894386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari debug_print(mod_driver, "after unprotection:\n%s", 895386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_packet_to_string(hdr, len)); 896386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 897386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* verify that the unprotected packet matches the origial one */ 898386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (i=0; i < msg_len_octets; i++) 899386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (((uint8_t *)hdr)[i] != ((uint8_t *)hdr2)[i]) { 900386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari fprintf(stdout, "mismatch at octet %d\n", i); 901386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = err_status_algo_fail; 902386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 903386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) { 904386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr); 905386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr2); 906386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 907386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 908386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 909386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 910386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * if the policy includes authentication, then test for false positives 911386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 912386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (policy->rtp.sec_serv & sec_serv_auth) { 913386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari char *data = ((char *)hdr) + 12; 914386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 915386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("testing for false positives in replay check..."); 916386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 917386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* set message length */ 918386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari len = msg_len_enc; 919386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 920386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* unprotect a second time - should fail with a replay error */ 921386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = srtp_unprotect_rtcp(srtcp_rcvr, hdr_enc, &len); 922386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status != err_status_replay_fail) { 923386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("failed with error code %d\n", status); 924386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr); 925386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr2); 926386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 927386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } else { 928386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("passed\n"); 929386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 930386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 931386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("testing for false positives in auth check..."); 932386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 933386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* increment sequence number in header */ 934386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->seq++; 935386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 936386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* set message length */ 937386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari len = msg_len_octets; 938386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 939386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* apply protection */ 940386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_check(srtp_protect_rtcp(srtcp_sender, hdr, &len)); 941386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 942386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* flip bits in packet */ 943386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari data[0] ^= 0xff; 944386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 945386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* unprotect, and check for authentication failure */ 946386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = srtp_unprotect_rtcp(srtcp_rcvr, hdr, &len); 947386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status != err_status_auth_fail) { 948386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("failed\n"); 949386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr); 950386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr2); 951386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 952386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } else { 953386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("passed\n"); 954386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 955386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 956386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 957386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 958386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_check(srtp_dealloc(srtcp_sender)); 959386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_check(srtp_dealloc(srtcp_rcvr)); 960386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 961386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr); 962386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari free(hdr2); 963386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_ok; 964386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 965386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 966386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 967386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 968386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_session_print_policy(srtp_t srtp) { 969386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari char *serv_descr[4] = { 970386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "none", 971386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "confidentiality", 972386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "authentication", 973386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "confidentiality and authentication" 974386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }; 975386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari char *direction[3] = { 976386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "unknown", 977386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "outbound", 978386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "inbound" 979386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }; 980386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_stream_t stream; 981386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 982386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* sanity checking */ 983386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (srtp == NULL) 984386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_fail; 985386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 986386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* if there's a template stream, print it out */ 987386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (srtp->stream_template != NULL) { 988386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari stream = srtp->stream_template; 989386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("# SSRC: any %s\r\n" 990386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "# rtp cipher: %s\r\n" 991386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "# rtp auth: %s\r\n" 992386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "# rtp services: %s\r\n" 993386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "# rtcp cipher: %s\r\n" 994386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "# rtcp auth: %s\r\n" 995386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "# rtcp services: %s\r\n" 996386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "# window size: %lu\r\n" 997386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "# tx rtx allowed:%s\r\n", 998386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari direction[stream->direction], 999386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari stream->rtp_cipher->type->description, 1000386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari stream->rtp_auth->type->description, 1001386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari serv_descr[stream->rtp_services], 1002386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari stream->rtcp_cipher->type->description, 1003386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari stream->rtcp_auth->type->description, 1004386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari serv_descr[stream->rtcp_services], 1005386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari rdbx_get_window_size(&stream->rtp_rdbx), 1006386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari stream->allow_repeat_tx ? "true" : "false"); 1007386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 1008386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1009386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* loop over streams in session, printing the policy of each */ 1010386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari stream = srtp->stream_list; 1011386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari while (stream != NULL) { 1012386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (stream->rtp_services > sec_serv_conf_and_auth) 1013386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_bad_param; 1014386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1015386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("# SSRC: 0x%08x\r\n" 1016386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "# rtp cipher: %s\r\n" 1017386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "# rtp auth: %s\r\n" 1018386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "# rtp services: %s\r\n" 1019386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "# rtcp cipher: %s\r\n" 1020386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "# rtcp auth: %s\r\n" 1021386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "# rtcp services: %s\r\n" 1022386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "# window size: %lu\r\n" 1023386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "# tx rtx allowed:%s\r\n", 1024386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari stream->ssrc, 1025386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari stream->rtp_cipher->type->description, 1026386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari stream->rtp_auth->type->description, 1027386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari serv_descr[stream->rtp_services], 1028386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari stream->rtcp_cipher->type->description, 1029386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari stream->rtcp_auth->type->description, 1030386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari serv_descr[stream->rtcp_services], 1031386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari rdbx_get_window_size(&stream->rtp_rdbx), 1032386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari stream->allow_repeat_tx ? "true" : "false"); 1033386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1034386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* advance to next stream in the list */ 1035386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari stream = stream->next; 1036386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 1037386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_ok; 1038386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 1039386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1040386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 1041386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_print_policy(const srtp_policy_t *policy) { 1042386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_status_t status; 1043386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_t session; 1044386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1045386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = srtp_create(&session, policy); 1046386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) 1047386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 1048386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = srtp_session_print_policy(session); 1049386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) 1050386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 1051386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = srtp_dealloc(session); 1052386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) 1053386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 1054386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_ok; 1055386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 1056386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1057386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 1058386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * srtp_print_packet(...) is for debugging only 1059386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * it prints an RTP packet to the stdout 1060386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 1061386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * note that this function is *not* threadsafe 1062386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 1063386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1064386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include <stdio.h> 1065386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1066386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define MTU 2048 1067386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1068386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar packet_string[MTU]; 1069386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1070386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar * 1071386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_packet_to_string(srtp_hdr_t *hdr, int pkt_octet_len) { 1072386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int octets_in_rtp_header = 12; 1073386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint8_t *data = ((uint8_t *)hdr)+octets_in_rtp_header; 1074386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int hex_len = pkt_octet_len-octets_in_rtp_header; 1075386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1076386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* sanity checking */ 1077386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if ((hdr == NULL) || (pkt_octet_len > MTU)) 1078386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return NULL; 1079386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1080386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* write packet into string */ 1081386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sprintf(packet_string, 1082386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "(s)rtp packet: {\n" 1083386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari " version:\t%d\n" 1084386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari " p:\t\t%d\n" 1085386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari " x:\t\t%d\n" 1086386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari " cc:\t\t%d\n" 1087386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari " m:\t\t%d\n" 1088386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari " pt:\t\t%x\n" 1089386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari " seq:\t\t%x\n" 1090386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari " ts:\t\t%x\n" 1091386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari " ssrc:\t%x\n" 1092386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari " data:\t%s\n" 1093386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "} (%d octets in total)\n", 1094386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->version, 1095386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->p, 1096386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->x, 1097386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->cc, 1098386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->m, 1099386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->pt, 1100386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->seq, 1101386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->ts, 1102386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->ssrc, 1103386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari octet_string_hex_string(data, hex_len), 1104386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari pkt_octet_len); 1105386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1106386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return packet_string; 1107386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 1108386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1109386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 1110386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * mips_estimate() is a simple function to estimate the number of 1111386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * instructions per second that the host can perform. note that this 1112386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * function can be grossly wrong; you may want to have a manual sanity 1113386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * check of its output! 1114386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 1115386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * the 'ignore' pointer is there to convince the compiler to not just 1116386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * optimize away the function 1117386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 1118386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1119386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaridouble 1120386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarimips_estimate(int num_trials, int *ignore) { 1121386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari clock_t t; 1122386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int i, sum; 1123386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1124386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sum = 0; 1125386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari t = clock(); 1126386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (i=0; i<num_trials; i++) 1127386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sum += i; 1128386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari t = clock() - t; 1129386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1130386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* printf("%d\n", sum); */ 1131386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *ignore = sum; 1132386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1133386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return (double) num_trials * CLOCKS_PER_SEC / t; 1134386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 1135386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1136386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1137386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 1138386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * srtp_validate() verifies the correctness of libsrtp by comparing 1139386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * some computed packets against some pre-computed reference values. 1140386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * These packets were made with the default SRTP policy. 1141386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 1142386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1143386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1144386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 1145386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_validate() { 1146386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari unsigned char test_key[30] = { 1147386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0xe1, 0xf9, 0x7a, 0x0d, 0x3e, 0x01, 0x8b, 0xe0, 1148386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0xd6, 0x4f, 0xa3, 0x2c, 0x06, 0xde, 0x41, 0x39, 1149386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0x0e, 0xc6, 0x75, 0xad, 0x49, 0x8a, 0xfe, 0xeb, 1150386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0xb6, 0x96, 0x0b, 0x3a, 0xab, 0xe6 1151386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }; 1152386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint8_t srtp_plaintext_ref[28] = { 1153386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0x80, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad, 1154386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0xca, 0xfe, 0xba, 0xbe, 0xab, 0xab, 0xab, 0xab, 1155386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 1156386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0xab, 0xab, 0xab, 0xab 1157386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }; 1158386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint8_t srtp_plaintext[38] = { 1159386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0x80, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad, 1160386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0xca, 0xfe, 0xba, 0xbe, 0xab, 0xab, 0xab, 0xab, 1161386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 1162386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0xab, 0xab, 0xab, 0xab, 0x00, 0x00, 0x00, 0x00, 1163386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 1164386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }; 1165386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint8_t srtp_ciphertext[38] = { 1166386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0x80, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad, 1167386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0xca, 0xfe, 0xba, 0xbe, 0x4e, 0x55, 0xdc, 0x4c, 1168386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0xe7, 0x99, 0x78, 0xd8, 0x8c, 0xa4, 0xd2, 0x15, 1169386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0x94, 0x9d, 0x24, 0x02, 0xb7, 0x8d, 0x6a, 0xcc, 1170386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0x99, 0xea, 0x17, 0x9b, 0x8d, 0xbb 1171386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }; 1172386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_t srtp_snd, srtp_recv; 1173386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_status_t status; 1174386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int len; 1175386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_policy_t policy; 1176386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1177386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 1178386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * create a session with a single stream using the default srtp 1179386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * policy and with the SSRC value 0xcafebabe 1180386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 1181386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari crypto_policy_set_rtp_default(&policy.rtp); 1182386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari crypto_policy_set_rtcp_default(&policy.rtcp); 1183386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy.ssrc.type = ssrc_specific; 1184386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy.ssrc.value = 0xcafebabe; 1185386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy.key = test_key; 1186386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy.ekt = NULL; 1187386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy.window_size = 128; 1188386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy.allow_repeat_tx = 0; 1189386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy.next = NULL; 1190386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1191386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = srtp_create(&srtp_snd, &policy); 1192386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) 1193386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 1194386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1195386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 1196386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * protect plaintext, then compare with ciphertext 1197386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 1198386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari len = 28; 1199386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = srtp_protect(srtp_snd, srtp_plaintext, &len); 1200386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status || (len != 38)) 1201386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_fail; 1202386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1203386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari debug_print(mod_driver, "ciphertext:\n %s", 1204386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari octet_string_hex_string(srtp_plaintext, len)); 1205386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari debug_print(mod_driver, "ciphertext reference:\n %s", 1206386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari octet_string_hex_string(srtp_ciphertext, len)); 1207386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1208386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (octet_string_is_eq(srtp_plaintext, srtp_ciphertext, len)) 1209386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_fail; 1210386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1211386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 1212386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * create a receiver session context comparable to the one created 1213386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * above - we need to do this so that the replay checking doesn't 1214386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * complain 1215386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 1216386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = srtp_create(&srtp_recv, &policy); 1217386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) 1218386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 1219386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1220386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 1221386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * unprotect ciphertext, then compare with plaintext 1222386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 1223386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = srtp_unprotect(srtp_recv, srtp_ciphertext, &len); 1224386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status || (len != 28)) 1225386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 1226386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1227386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (octet_string_is_eq(srtp_ciphertext, srtp_plaintext_ref, len)) 1228386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_fail; 1229386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1230386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_ok; 1231386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 1232386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1233386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1234386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 1235386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_create_big_policy(srtp_policy_t **list) { 1236386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari extern const srtp_policy_t *policy_array[]; 1237386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_policy_t *p, *tmp; 1238386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int i = 0; 1239386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint32_t ssrc = 0; 1240386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1241386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* sanity checking */ 1242386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if ((list == NULL) || (policy_array[0] == NULL)) 1243386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_bad_param; 1244386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1245386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 1246386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * loop over policy list, mallocing a new list and copying values 1247386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * into it (and incrementing the SSRC value as we go along) 1248386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 1249386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari tmp = p = NULL; 1250386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari while (policy_array[i] != NULL) { 1251386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari p = (srtp_policy_t*) malloc(sizeof(srtp_policy_t)); 1252386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (p == NULL) 1253386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_bad_param; 1254386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari memcpy(p, policy_array[i], sizeof(srtp_policy_t)); 1255386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari p->ssrc.type = ssrc_specific; 1256386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari p->ssrc.value = ssrc++; 1257386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari p->next = tmp; 1258386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari tmp = p; 1259386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari i++; 1260386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 1261386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *list = p; 1262386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1263386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_ok; 1264386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 1265386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1266386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 1267386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_test_remove_stream() { 1268386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_status_t status; 1269386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_policy_t *policy_list; 1270386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_t session; 1271386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_stream_t stream; 1272386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 1273386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * srtp_get_stream() is a libSRTP internal function that we declare 1274386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * here so that we can use it to verify the correct operation of the 1275386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * library 1276386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 1277386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari extern srtp_stream_t srtp_get_stream(srtp_t srtp, uint32_t ssrc); 1278386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1279386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1280386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = srtp_create_big_policy(&policy_list); 1281386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) 1282386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 1283386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1284386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = srtp_create(&session, policy_list); 1285386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) 1286386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 1287386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1288386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 1289386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * check for false positives by trying to remove a stream that's not 1290386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * in the session 1291386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 1292386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = srtp_remove_stream(session, htonl(0xaaaaaaaa)); 1293386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status != err_status_no_ctx) 1294386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_fail; 1295386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1296386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 1297386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * check for false negatives by removing stream 0x1, then 1298386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * searching for streams 0x0 and 0x2 1299386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 1300386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = srtp_remove_stream(session, htonl(0x1)); 1301386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status != err_status_ok) 1302386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_fail; 1303386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari stream = srtp_get_stream(session, htonl(0x0)); 1304386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (stream == NULL) 1305386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_fail; 1306386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari stream = srtp_get_stream(session, htonl(0x2)); 1307386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (stream == NULL) 1308386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_fail; 1309386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1310386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_ok; 1311386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 1312386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1313386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 1314386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * srtp policy definitions - these definitions are used above 1315386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 1316386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1317386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariunsigned char test_key[30] = { 1318386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0xe1, 0xf9, 0x7a, 0x0d, 0x3e, 0x01, 0x8b, 0xe0, 1319386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0xd6, 0x4f, 0xa3, 0x2c, 0x06, 0xde, 0x41, 0x39, 1320386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0x0e, 0xc6, 0x75, 0xad, 0x49, 0x8a, 0xfe, 0xeb, 1321386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0xb6, 0x96, 0x0b, 0x3a, 0xab, 0xe6 1322386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}; 1323386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1324386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1325386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariconst srtp_policy_t default_policy = { 1326386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { ssrc_any_outbound, 0 }, /* SSRC */ 1327386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { /* SRTP policy */ 1328386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari AES_128_ICM, /* cipher type */ 1329386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 30, /* cipher key length in octets */ 1330386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari HMAC_SHA1, /* authentication func type */ 1331386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 16, /* auth key length in octets */ 1332386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 10, /* auth tag length in octets */ 1333386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sec_serv_conf_and_auth /* security services flag */ 1334386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }, 1335386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { /* SRTCP policy */ 1336386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari AES_128_ICM, /* cipher type */ 1337386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 30, /* cipher key length in octets */ 1338386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari HMAC_SHA1, /* authentication func type */ 1339386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 16, /* auth key length in octets */ 1340386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 10, /* auth tag length in octets */ 1341386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sec_serv_conf_and_auth /* security services flag */ 1342386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }, 1343386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari test_key, 1344386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL, /* indicates that EKT is not in use */ 1345386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 128, /* replay window size */ 1346386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* retransmission not allowed */ 1347386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL 1348386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}; 1349386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1350386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariconst srtp_policy_t aes_tmmh_policy = { 1351386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { ssrc_any_outbound, 0 }, /* SSRC */ 1352386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { 1353386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari AES_128_ICM, /* cipher type */ 1354386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 30, /* cipher key length in octets */ 1355386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari UST_TMMHv2, /* authentication func type */ 1356386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 94, /* auth key length in octets */ 1357386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 4, /* auth tag length in octets */ 1358386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sec_serv_conf_and_auth /* security services flag */ 1359386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }, 1360386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { 1361386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari AES_128_ICM, /* cipher type */ 1362386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 30, /* cipher key length in octets */ 1363386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari UST_TMMHv2, /* authentication func type */ 1364386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 94, /* auth key length in octets */ 1365386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 4, /* auth tag length in octets */ 1366386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sec_serv_conf_and_auth /* security services flag */ 1367386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }, 1368386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari test_key, 1369386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL, /* indicates that EKT is not in use */ 1370386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 128, /* replay window size */ 1371386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* retransmission not allowed */ 1372386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL 1373386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}; 1374386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1375386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariconst srtp_policy_t tmmh_only_policy = { 1376386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { ssrc_any_outbound, 0 }, /* SSRC */ 1377386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { 1378386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari AES_128_ICM, /* cipher type */ 1379386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 30, /* cipher key length in octets */ 1380386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari UST_TMMHv2, /* authentication func type */ 1381386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 94, /* auth key length in octets */ 1382386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 4, /* auth tag length in octets */ 1383386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sec_serv_auth /* security services flag */ 1384386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }, 1385386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { 1386386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari AES_128_ICM, /* cipher type */ 1387386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 30, /* cipher key length in octets */ 1388386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari UST_TMMHv2, /* authentication func type */ 1389386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 94, /* auth key length in octets */ 1390386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 4, /* auth tag length in octets */ 1391386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sec_serv_auth /* security services flag */ 1392386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }, 1393386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari test_key, 1394386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL, /* indicates that EKT is not in use */ 1395386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 128, /* replay window size */ 1396386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* retransmission not allowed */ 1397386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL 1398386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}; 1399386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1400386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariconst srtp_policy_t aes_only_policy = { 1401386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { ssrc_any_outbound, 0 }, /* SSRC */ 1402386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { 1403386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari AES_128_ICM, /* cipher type */ 1404386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 30, /* cipher key length in octets */ 1405386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL_AUTH, /* authentication func type */ 1406386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* auth key length in octets */ 1407386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* auth tag length in octets */ 1408386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sec_serv_conf /* security services flag */ 1409386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }, 1410386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { 1411386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari AES_128_ICM, /* cipher type */ 1412386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 30, /* cipher key length in octets */ 1413386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL_AUTH, /* authentication func type */ 1414386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* auth key length in octets */ 1415386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* auth tag length in octets */ 1416386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sec_serv_conf /* security services flag */ 1417386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }, 1418386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari test_key, 1419386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL, /* indicates that EKT is not in use */ 1420386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 128, /* replay window size */ 1421386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* retransmission not allowed */ 1422386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL 1423386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}; 1424386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1425386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariconst srtp_policy_t hmac_only_policy = { 1426386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { ssrc_any_outbound, 0 }, /* SSRC */ 1427386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { 1428386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL_CIPHER, /* cipher type */ 1429386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* cipher key length in octets */ 1430386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari HMAC_SHA1, /* authentication func type */ 1431386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 20, /* auth key length in octets */ 1432386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 4, /* auth tag length in octets */ 1433386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sec_serv_auth /* security services flag */ 1434386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }, 1435386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { 1436386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL_CIPHER, /* cipher type */ 1437386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* cipher key length in octets */ 1438386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari HMAC_SHA1, /* authentication func type */ 1439386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 20, /* auth key length in octets */ 1440386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 4, /* auth tag length in octets */ 1441386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sec_serv_auth /* security services flag */ 1442386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }, 1443386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari test_key, 1444386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL, /* indicates that EKT is not in use */ 1445386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 128, /* replay window size */ 1446386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* retransmission not allowed */ 1447386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL 1448386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}; 1449386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1450386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariconst srtp_policy_t null_policy = { 1451386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { ssrc_any_outbound, 0 }, /* SSRC */ 1452386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { 1453386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL_CIPHER, /* cipher type */ 1454386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* cipher key length in octets */ 1455386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL_AUTH, /* authentication func type */ 1456386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* auth key length in octets */ 1457386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* auth tag length in octets */ 1458386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sec_serv_none /* security services flag */ 1459386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }, 1460386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { 1461386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL_CIPHER, /* cipher type */ 1462386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* cipher key length in octets */ 1463386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL_AUTH, /* authentication func type */ 1464386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* auth key length in octets */ 1465386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* auth tag length in octets */ 1466386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sec_serv_none /* security services flag */ 1467386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }, 1468386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari test_key, 1469386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL, /* indicates that EKT is not in use */ 1470386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 128, /* replay window size */ 1471386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* retransmission not allowed */ 1472386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL 1473386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}; 1474386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1475386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariuint8_t ekt_test_key[16] = { 1476386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0x77, 0x26, 0x9d, 0xac, 0x16, 0xa3, 0x28, 0xca, 1477386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0x8e, 0xc9, 0x68, 0x4b, 0xcc, 0xc4, 0xd2, 0x1b 1478386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}; 1479386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1480386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "ekt.h" 1481386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1482386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariekt_policy_ctx_t ekt_test_policy = { 1483386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0xa5a5, /* SPI */ 1484386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari EKT_CIPHER_AES_128_ECB, 1485386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ekt_test_key, 1486386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL 1487386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}; 1488386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1489386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariconst srtp_policy_t hmac_only_with_ekt_policy = { 1490386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { ssrc_any_outbound, 0 }, /* SSRC */ 1491386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { 1492386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL_CIPHER, /* cipher type */ 1493386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* cipher key length in octets */ 1494386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari HMAC_SHA1, /* authentication func type */ 1495386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 20, /* auth key length in octets */ 1496386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 4, /* auth tag length in octets */ 1497386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sec_serv_auth /* security services flag */ 1498386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }, 1499386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { 1500386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL_CIPHER, /* cipher type */ 1501386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* cipher key length in octets */ 1502386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari HMAC_SHA1, /* authentication func type */ 1503386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 20, /* auth key length in octets */ 1504386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 4, /* auth tag length in octets */ 1505386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sec_serv_auth /* security services flag */ 1506386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }, 1507386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari test_key, 1508386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari &ekt_test_policy, /* indicates that EKT is not in use */ 1509386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 128, /* replay window size */ 1510386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* retransmission not allowed */ 1511386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL 1512386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}; 1513386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1514386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1515386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 1516386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * an array of pointers to the policies listed above 1517386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 1518386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * This array is used to test various aspects of libSRTP for 1519386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * different cryptographic policies. The order of the elements 1520386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * matters - the timing test generates output that can be used 1521386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * in a plot (see the gnuplot script file 'timing'). If you 1522386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * add to this list, you should do it at the end. 1523386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 1524386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1525386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define USE_TMMH 0 1526386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1527386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariconst srtp_policy_t * 1528386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaripolicy_array[] = { 1529386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari &hmac_only_policy, 1530386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#if USE_TMMH 1531386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari &tmmh_only_policy, 1532386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif 1533386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari &aes_only_policy, 1534386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#if USE_TMMH 1535386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari &aes_tmmh_policy, 1536386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif 1537386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari &default_policy, 1538386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari &null_policy, 1539386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari &hmac_only_with_ekt_policy, 1540386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL 1541386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}; 1542386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 1543386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariconst srtp_policy_t wildcard_policy = { 1544386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { ssrc_any_outbound, 0 }, /* SSRC */ 1545386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { /* SRTP policy */ 1546386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari AES_128_ICM, /* cipher type */ 1547386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 30, /* cipher key length in octets */ 1548386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari HMAC_SHA1, /* authentication func type */ 1549386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 16, /* auth key length in octets */ 1550386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 10, /* auth tag length in octets */ 1551386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sec_serv_conf_and_auth /* security services flag */ 1552386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }, 1553386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { /* SRTCP policy */ 1554386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari AES_128_ICM, /* cipher type */ 1555386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 30, /* cipher key length in octets */ 1556386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari HMAC_SHA1, /* authentication func type */ 1557386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 16, /* auth key length in octets */ 1558386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 10, /* auth tag length in octets */ 1559386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sec_serv_conf_and_auth /* security services flag */ 1560386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }, 1561386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari test_key, 1562386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL, 1563386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 128, /* replay window size */ 1564386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* retransmission not allowed */ 1565386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NULL 1566386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}; 1567