1386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 2386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * dtls_srtp_driver.c 3386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 4386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * test driver for DTLS-SRTP functions 5386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 6386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * David 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#include <stdio.h> /* for printf() */ 46386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "getopt_s.h" /* for local getopt() */ 47386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "srtp_priv.h" 48386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 49386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 50386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaritest_dtls_srtp(); 51386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 52386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_hdr_t * 53386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_create_test_packet(int pkt_octet_len, uint32_t ssrc); 54386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 55386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid 56386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariusage(char *prog_name) { 57386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("usage: %s [ -t ][ -c ][ -v ][-d <debug_module> ]* [ -l ]\n" 58386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari " -d <mod> turn on debugging module <mod>\n" 59386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari " -l list debugging modules\n", prog_name); 60386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 61386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 62386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 63386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint 64386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarimain(int argc, char *argv[]) { 65386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari unsigned do_list_mods = 0; 66386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari char q; 67386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_status_t err; 68386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 69386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("dtls_srtp_driver\n"); 70386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 71386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* initialize srtp library */ 72386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err = srtp_init(); 73386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (err) { 74386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("error: srtp init failed with error code %d\n", err); 75386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 76386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 77386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 78386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* process input arguments */ 79386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari while (1) { 80386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari q = getopt_s(argc, argv, "ld:"); 81386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (q == -1) 82386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari break; 83386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari switch (q) { 84386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari case 'l': 85386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari do_list_mods = 1; 86386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari break; 87386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari case 'd': 88386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err = crypto_kernel_set_debug_module(optarg_s, 1); 89386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (err) { 90386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("error: set debug module (%s) failed\n", optarg_s); 91386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 92386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 93386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari break; 94386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari default: 95386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari usage(argv[0]); 96386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 97386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 98386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 99386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (do_list_mods) { 100386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err = crypto_kernel_list_debug_modules(); 101386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (err) { 102386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("error: list of debug modules failed\n"); 103386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 104386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 105386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 106386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 107386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("testing dtls_srtp..."); 108386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err = test_dtls_srtp(); 109386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (err) { 110386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("\nerror (code %d)\n", err); 111386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 112386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 113386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("passed\n"); 114386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 115386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return 0; 116386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 117386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 118386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 119386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 120386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaritest_dtls_srtp() { 121386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_hdr_t *test_packet; 122386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int test_packet_len = 80; 123386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_t s; 124386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_policy_t policy; 125386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint8_t key[SRTP_MAX_KEY_LEN]; 126386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint8_t salt[SRTP_MAX_KEY_LEN]; 127386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari unsigned int key_len, salt_len; 128386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_profile_t profile; 129386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_status_t err; 130386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 131386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* create a 'null' SRTP session */ 132386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err = srtp_create(&s, NULL); 133386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (err) 134386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err; 135386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 136386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 137386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * verify that packet-processing functions behave properly - we 138386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * expect that these functions will return err_status_no_ctx 139386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 140386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari test_packet = srtp_create_test_packet(80, 0xa5a5a5a5); 141386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (test_packet == NULL) 142386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_alloc_fail; 143386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err = srtp_protect(s, test_packet, &test_packet_len); 144386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (err != err_status_no_ctx) { 145386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("wrong return value from srtp_protect() (got code %d)\n", 146386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err); 147386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_fail; 148386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 149386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err = srtp_unprotect(s, test_packet, &test_packet_len); 150386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (err != err_status_no_ctx) { 151386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("wrong return value from srtp_unprotect() (got code %d)\n", 152386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err); 153386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_fail; 154386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 155386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err = srtp_protect_rtcp(s, test_packet, &test_packet_len); 156386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (err != err_status_no_ctx) { 157386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("wrong return value from srtp_protect_rtcp() (got code %d)\n", 158386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err); 159386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_fail; 160386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 161386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err = srtp_unprotect_rtcp(s, test_packet, &test_packet_len); 162386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (err != err_status_no_ctx) { 163386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("wrong return value from srtp_unprotect_rtcp() (got code %d)\n", 164386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err); 165386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_fail; 166386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 167386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 168386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 169386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 170386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * set keys to known values for testing 171386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 172386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari profile = srtp_profile_aes128_cm_sha1_80; 173386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari key_len = srtp_profile_get_master_key_length(profile); 174386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari salt_len = srtp_profile_get_master_salt_length(profile); 175386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari memset(key, 0xff, key_len); 176386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari memset(salt, 0xee, salt_len); 177386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari append_salt_to_key(key, key_len, salt, salt_len); 178386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy.key = key; 179386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 180386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* initialize SRTP policy from profile */ 181386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err = crypto_policy_set_from_profile_for_rtp(&policy.rtp, profile); 182386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (err) return err; 183386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err = crypto_policy_set_from_profile_for_rtcp(&policy.rtcp, profile); 184386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (err) return err; 185386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy.ssrc.type = ssrc_any_inbound; 186386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy.ekt = NULL; 187386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy.window_size = 128; 188386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy.allow_repeat_tx = 0; 189386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari policy.next = NULL; 190386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 191386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err = srtp_add_stream(s, &policy); 192386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (err) 193386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err; 194386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 195386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_ok; 196386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 197386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 198386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 199386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 200386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 201386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * srtp_create_test_packet(len, ssrc) returns a pointer to a 202386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * (malloced) example RTP packet whose data field has the length given 203386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * by pkt_octet_len and the SSRC value ssrc. The total length of the 204386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * packet is twelve octets longer, since the header is at the 205386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * beginning. There is room at the end of the packet for a trailer, 206386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * and the four octets following the packet are filled with 0xff 207386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * values to enable testing for overwrites. 208386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 209386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * note that the location of the test packet can (and should) be 210386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * deallocated with the free() call once it is no longer needed. 211386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 212386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 213386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_hdr_t * 214386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisrtp_create_test_packet(int pkt_octet_len, uint32_t ssrc) { 215386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int i; 216386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint8_t *buffer; 217386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari srtp_hdr_t *hdr; 218386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int bytes_in_hdr = 12; 219386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 220386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* allocate memory for test packet */ 221386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr = malloc(pkt_octet_len + bytes_in_hdr 222386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari + SRTP_MAX_TRAILER_LEN + 4); 223386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (!hdr) 224386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return NULL; 225386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 226386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->version = 2; /* RTP version two */ 227386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->p = 0; /* no padding needed */ 228386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->x = 0; /* no header extension */ 229386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->cc = 0; /* no CSRCs */ 230386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->m = 0; /* marker bit */ 231386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->pt = 0xf; /* payload type */ 232386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->seq = htons(0x1234); /* sequence number */ 233386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->ts = htonl(0xdecafbad); /* timestamp */ 234386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hdr->ssrc = htonl(ssrc); /* synch. source */ 235386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 236386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari buffer = (uint8_t *)hdr; 237386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari buffer += bytes_in_hdr; 238386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 239386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* set RTP data to 0xab */ 240386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (i=0; i < pkt_octet_len; i++) 241386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *buffer++ = 0xab; 242386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 243386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* set post-data value to 0xffff to enable overrun checking */ 244386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (i=0; i < SRTP_MAX_TRAILER_LEN+4; i++) 245386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *buffer++ = 0xff; 246386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 247386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return hdr; 248386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 249