Example #1
0
double
rdbx_check_adds_per_second(int num_trials, unsigned long ws) {
  uint32_t i;
  int delta;
  srtp_rdbx_t rdbx;
  srtp_xtd_seq_num_t est;
  clock_t timer;
  int failures;                    /* count number of failures        */
  
  if (srtp_rdbx_init(&rdbx, ws) != srtp_err_status_ok) {
    printf("replay_init failed\n");
    exit(1);
  }  

  failures = 0;
  timer = clock();
  for(i=0; (int) i < num_trials; i++) {
    
    delta = srtp_index_guess(&rdbx.index, &est, i);
    
    if (srtp_rdbx_check(&rdbx, delta) != srtp_err_status_ok) 
      ++failures;
    else
      if (srtp_rdbx_add_index(&rdbx, delta) != srtp_err_status_ok)
	++failures;
  }
  timer = clock() - timer;

  printf("number of failures: %d \n", failures);

  srtp_rdbx_dealloc(&rdbx);

  return (double) CLOCKS_PER_SEC * num_trials / timer;
}
Example #2
0
srtp_err_status_t
rdbx_check_expect_failure(srtp_rdbx_t *rdbx, uint32_t idx) {
  int delta;
  srtp_xtd_seq_num_t est;
  srtp_err_status_t status;

  delta = srtp_index_guess(&rdbx->index, &est, idx);

  status = srtp_rdbx_check(rdbx, delta);
  if (status == srtp_err_status_ok) {
    printf("delta: %d ", delta);
    printf("replay_check failed at index %u (false positive)\n", idx);
    return srtp_err_status_algo_fail; 
  }

  return srtp_err_status_ok;
}
Example #3
0
srtp_err_status_t
rdbx_check_add_unordered(srtp_rdbx_t *rdbx, uint32_t idx) {
  int delta;
  srtp_xtd_seq_num_t est;
  srtp_err_status_t rstat;

  delta = srtp_index_guess(&rdbx->index, &est, idx);

  rstat = srtp_rdbx_check(rdbx, delta);
  if ((rstat != srtp_err_status_ok) && (rstat != srtp_err_status_replay_old)) {
    printf("replay_check_add_unordered failed at index %u\n", idx);
    return srtp_err_status_algo_fail;
  }
  if (rstat == srtp_err_status_replay_old) {
	return srtp_err_status_ok;
  }
  if (srtp_rdbx_add_index(rdbx, delta) != srtp_err_status_ok) {
    printf("rdbx_add_index failed at index %u\n", idx);
    return srtp_err_status_algo_fail;
  }  

  return srtp_err_status_ok;
}
Example #4
0
srtp_err_status_t
rdbx_check_add(srtp_rdbx_t *rdbx, uint32_t idx) {
  int delta;
  srtp_xtd_seq_num_t est;
  
  delta = srtp_index_guess(&rdbx->index, &est, idx);
  
  if (srtp_rdbx_check(rdbx, delta) != srtp_err_status_ok) {
    printf("replay_check failed at index %u\n", idx);
    return srtp_err_status_algo_fail;
  }

  /*
   * in practice, we'd authenticate the packet containing idx, using
   * the estimated value est, at this point
   */
  
  if (srtp_rdbx_add_index(rdbx, delta) != srtp_err_status_ok) {
    printf("rdbx_add_index failed at index %u\n", idx);
    return srtp_err_status_algo_fail;
  }  

  return srtp_err_status_ok;
}
Example #5
0
srtp_err_status_t
roc_test(int num_trials) {
  srtp_xtd_seq_num_t local, est, ref;
  ut_connection utc;
  int i, num_bad_est = 0;
  int delta;
  uint32_t ircvd;
  double failure_rate;

  srtp_index_init(&local);
  srtp_index_init(&ref);
  srtp_index_init(&est);

  printf("\n\ttesting sequential insertion...");
  for (i=0; i < 2048; i++) {
    delta = srtp_index_guess(&local, &est, (uint16_t) ref);
#if ROC_VERBOSE
    printf("%lld, %lld, %d\n", ref, est,  i);
#endif
    if (ref != est) {
#if ROC_VERBOSE
      printf(" *bad estimate*\n");
#endif
      ++num_bad_est;
    }
    srtp_index_advance(&ref, 1);
  }
  failure_rate = (double) num_bad_est / num_trials;
  if (failure_rate > 0.01) {
    printf("error: failure rate too high (%d bad estimates in %d trials)\n", 
	   num_bad_est, num_trials);
    return srtp_err_status_algo_fail;
  }
  printf("done\n");


  printf("\ttesting non-sequential insertion...");
  srtp_index_init(&local);
  srtp_index_init(&ref);
  srtp_index_init(&est);
  ut_init(&utc);
  
  for (i=0; i < num_trials; i++) {
    
    /* get next seq num from unreliable transport simulator */
    ircvd = ut_next_index(&utc);
    
    /* set ref to value of ircvd */
    ref = ircvd; 

    /* estimate index based on low bits of ircvd */
    delta = srtp_index_guess(&local, &est, (uint16_t) ref);
#if ROC_VERBOSE
    printf("ref: %lld, local: %lld, est: %lld, ircvd: %d, delta: %d\n", 
	   ref, local, est, ircvd, delta);
#endif
    
    if (local + delta != est) {
      printf(" *bad delta*: local %llu + delta %d != est %llu\n",
	     (unsigned long long)local, delta, (unsigned long long)est);
      return srtp_err_status_algo_fail;
    }

    /* now update local srtp_xtd_seq_num_t as necessary */
    if (delta > 0) 
      srtp_index_advance(&local, delta);

    if (ref != est) {
#if ROC_VERBOSE
      printf(" *bad estimate*\n");
#endif
      /* record failure event */
      ++num_bad_est;
      
      /* reset local value to correct value */
      local = ref;
    }
  }
  failure_rate = (double) num_bad_est / num_trials;
  if (failure_rate > 0.01) {
    printf("error: failure rate too high (%d bad estimates in %d trials)\n", 
	   num_bad_est, num_trials);
    return srtp_err_status_algo_fail;
  }
  printf("done\n");

  return srtp_err_status_ok;
}