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