blob: 94bd84f36b4ba63f26ddb548a60ec665bf10440d [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef COBALT_UTIL_CRYPTO_UTIL_RANDOM_TEST_UTILS_H_
#define COBALT_UTIL_CRYPTO_UTIL_RANDOM_TEST_UTILS_H_
#include <openssl/chacha.h>
#include "util/crypto_util/random.h"
namespace cobalt {
namespace crypto {
// DeterministicRandom is a subclass of Random that overrides RandomBytes()
// to use a deterministic PRNG.
class DeterministicRandom : public Random {
public:
DeterministicRandom() : num_calls_(0) {}
virtual ~DeterministicRandom() {}
// Implementes a deterministic PRNG by using chacha20 with a zero key and a
// counter for the nonce. This code was copied from
// crypto/rand/deteriministic.c in Boring SSL. We use this particular
// PRNG becuase it has some properties in common with the non-deterministic
// version of RandomBytes we use in production and so we are testing using
// a source of randomness that is similar to the production source of
// randomness.
void RandomBytes(byte *buf, std::size_t num) override {
static const uint8_t kZeroKey[32] = {};
uint8_t nonce[12];
memset(nonce, 0, sizeof(nonce));
memcpy(nonce, &num_calls_, sizeof(num_calls_));
memset(buf, 0, num);
CRYPTO_chacha_20(buf, buf, num, kZeroKey, nonce, 0);
num_calls_++;
}
private:
uint64_t num_calls_;
};
} // namespace crypto
} // namespace cobalt
#endif // COBALT_UTIL_CRYPTO_UTIL_RANDOM_TEST_UTILS_H_