roc_driver.c (4990B)
1 /* 2 * roc_driver.c 3 * 4 * test driver for rollover counter replay implementation 5 * 6 * David A. McGrew 7 * Cisco Systems, Inc. 8 */ 9 10 /* 11 * 12 * Copyright (c) 2001-2017, Cisco Systems, Inc. 13 * All rights reserved. 14 * 15 * Redistribution and use in source and binary forms, with or without 16 * modification, are permitted provided that the following conditions 17 * are met: 18 * 19 * Redistributions of source code must retain the above copyright 20 * notice, this list of conditions and the following disclaimer. 21 * 22 * Redistributions in binary form must reproduce the above 23 * copyright notice, this list of conditions and the following 24 * disclaimer in the documentation and/or other materials provided 25 * with the distribution. 26 * 27 * Neither the name of the Cisco Systems, Inc. nor the names of its 28 * contributors may be used to endorse or promote products derived 29 * from this software without specific prior written permission. 30 * 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 34 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 35 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 36 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 37 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 38 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 41 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 42 * OF THE POSSIBILITY OF SUCH DAMAGE. 43 * 44 */ 45 46 #ifdef HAVE_CONFIG_H 47 #include <config.h> 48 #endif 49 50 #include <stdio.h> 51 52 /* 53 * defining ROC_TEST causes small datatypes to be used in 54 * srtp_xtd_seq_num_t - this allows the functions to be exhaustively tested. 55 */ 56 #if ROC_NEEDS_TO_BE_TESTED 57 #define ROC_TEST 58 #endif 59 60 #include "rdbx.h" 61 #include "ut_sim.h" 62 63 srtp_err_status_t roc_test(int num_trials); 64 65 int main(void) 66 { 67 srtp_err_status_t status; 68 69 printf("rollover counter test driver\n" 70 "David A. McGrew\n" 71 "Cisco Systems, Inc.\n"); 72 73 printf("testing index functions..."); 74 status = roc_test(1 << 18); 75 if (status) { 76 printf("failed\n"); 77 exit(status); 78 } 79 printf("passed\n"); 80 return 0; 81 } 82 83 #define ROC_VERBOSE 0 84 85 srtp_err_status_t roc_test(int num_trials) 86 { 87 srtp_xtd_seq_num_t local, est, ref; 88 ut_connection utc; 89 int i, num_bad_est = 0; 90 int delta; 91 uint32_t ircvd; 92 double failure_rate; 93 94 srtp_index_init(&local); 95 srtp_index_init(&ref); 96 srtp_index_init(&est); 97 98 printf("\n\ttesting sequential insertion..."); 99 for (i = 0; i < 2048; i++) { 100 srtp_index_guess(&local, &est, (uint16_t)ref); 101 #if ROC_VERBOSE 102 printf("%lld, %lld, %d\n", ref, est, i); 103 #endif 104 if (ref != est) { 105 #if ROC_VERBOSE 106 printf(" *bad estimate*\n"); 107 #endif 108 ++num_bad_est; 109 } 110 srtp_index_advance(&ref, 1); 111 } 112 failure_rate = (double)num_bad_est / num_trials; 113 if (failure_rate > 0.01) { 114 printf("error: failure rate too high (%d bad estimates in %d trials)\n", 115 num_bad_est, num_trials); 116 return srtp_err_status_algo_fail; 117 } 118 printf("done\n"); 119 120 printf("\ttesting non-sequential insertion..."); 121 srtp_index_init(&local); 122 srtp_index_init(&ref); 123 srtp_index_init(&est); 124 ut_init(&utc); 125 126 for (i = 0; i < num_trials; i++) { 127 /* get next seq num from unreliable transport simulator */ 128 ircvd = ut_next_index(&utc); 129 130 /* set ref to value of ircvd */ 131 ref = ircvd; 132 133 /* estimate index based on low bits of ircvd */ 134 delta = srtp_index_guess(&local, &est, (uint16_t)ref); 135 #if ROC_VERBOSE 136 printf("ref: %lld, local: %lld, est: %lld, ircvd: %d, delta: %d\n", ref, 137 local, est, ircvd, delta); 138 #endif 139 140 if (local + delta != est) { 141 printf(" *bad delta*: local %llu + delta %d != est %llu\n", 142 (unsigned long long)local, delta, (unsigned long long)est); 143 return srtp_err_status_algo_fail; 144 } 145 146 /* now update local srtp_xtd_seq_num_t as necessary */ 147 if (delta > 0) 148 srtp_index_advance(&local, (srtp_sequence_number_t)delta); 149 150 if (ref != est) { 151 #if ROC_VERBOSE 152 printf(" *bad estimate*\n"); 153 #endif 154 /* record failure event */ 155 ++num_bad_est; 156 157 /* reset local value to correct value */ 158 local = ref; 159 } 160 } 161 failure_rate = (double)num_bad_est / num_trials; 162 if (failure_rate > 0.01) { 163 printf("error: failure rate too high (%d bad estimates in %d trials)\n", 164 num_bad_est, num_trials); 165 return srtp_err_status_algo_fail; 166 } 167 printf("done\n"); 168 169 return srtp_err_status_ok; 170 }