blob: e6701d3345aee5a007073c8ec40f53d4c62edf2b [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#ifndef ZIRCON_KERNEL_LIB_CRYPTO_INCLUDE_LIB_CRYPTO_ENTROPY_COLLECTOR_H_
#define ZIRCON_KERNEL_LIB_CRYPTO_INCLUDE_LIB_CRYPTO_ENTROPY_COLLECTOR_H_
#include <stddef.h>
#include <stdint.h>
#include <fbl/name.h>
namespace crypto {
namespace entropy {
class Collector {
public:
virtual ~Collector();
// Returns a null-terminated name, in the buffer of size |len| at |buf|.
void get_name(char* name, size_t len) const { name_.get(len, name); }
// Fills |len| bytes of memory at |buf| with random data from this entropy
// collector's entropy source. The bytes that are returned may not be
// perfectly random, i.e. they may be statistically dependent or biased. Use
// the BytesNeeded() method to determine how may random bytes are needed to
// collect a certain amount of entropy.
virtual size_t DrawEntropy(uint8_t* buf, size_t len) = 0;
// Returns the number of bytes of random data that should be drawn via
// DrawEntropy() to get approximately |bits| bits of entropy. Note: |bits|
// must be no larger than 2^20 (= 1048576).
size_t BytesNeeded(size_t bits) const;
protected:
// Initialize this entropy collector. |name| is used for debugging and
// testing, and it may be truncated if it is too long.
// |entropy_per_1000_bytes| is the (approximate) amount of min-entropy in
// each 1000 bytes of data returned by the entropy source. The amount of
// entropy in a byte from the entropy source is generally not an integer.
// Quoting the entropy per 1000 bytes supports non-integer values, without
// requiring floating-point or fixed-point arithmetic. It is an error if
// |entropy_per_1000_bytes| is 0 or is greater than 8000.
//
// TODO(andrewkrieger): document entropy source quality tests, and reference
// that document here, to explain how to find a good value for
// entropy_per_1000_bytes.
Collector(const char* name, size_t entropy_per_1000_bytes);
private:
DISALLOW_COPY_ASSIGN_AND_MOVE(Collector);
fbl::Name<ZX_MAX_NAME_LEN> name_;
size_t entropy_per_1000_bytes_;
};
} // namespace entropy
} // namespace crypto
#endif // ZIRCON_KERNEL_LIB_CRYPTO_INCLUDE_LIB_CRYPTO_ENTROPY_COLLECTOR_H_