/*
 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "video_engine/test/auto_test/helpers/random_encryption.h"

#include <algorithm>
#include <cstdlib>
#include <cmath>

#include "video_engine/vie_defines.h"

static int Saturate(int value, int min, int max) {
  return std::min(std::max(value, min), max);
}

RandomEncryption::RandomEncryption(unsigned int rand_seed) {
  srand(rand_seed);
}

// Generates some completely random data with roughly the right length.
void RandomEncryption::GenerateRandomData(unsigned char* out_data, int bytes_in,
                                          int* bytes_out) {
  int out_length = MakeUpSimilarLength(bytes_in);
  for (int i = 0; i < out_length; i++) {
    // The modulo will skew the random distribution a bit, but I think it
    // will be random enough.
    out_data[i] = static_cast<unsigned char>(rand() % 256);
  }
  *bytes_out = out_length;
}

// Makes up a length within +- 50 of the original length, without
// overstepping the contract for encrypt / decrypt.
int RandomEncryption::MakeUpSimilarLength(int original_length) {
  int sign = rand() - RAND_MAX / 2;
  int length = original_length + sign * rand() % 50;

  return Saturate(length, 0, static_cast<int>(webrtc::kViEMaxMtu));
}
