From c62dc4063e162cb5d05cad2a1359ebce7c4432fe Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Thu, 15 Jun 2017 11:19:50 +0200 Subject: [PATCH] Add unittest for Linux random generator --- source/tanya/math/random.d | 52 +++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/source/tanya/math/random.d b/source/tanya/math/random.d index 76295f7..2f181e6 100644 --- a/source/tanya/math/random.d +++ b/source/tanya/math/random.d @@ -37,7 +37,7 @@ class EntropyException : Exception this(string msg, string file = __FILE__, size_t line = __LINE__, - Throwable next = null) pure @safe nothrow const @nogc + Throwable next = null) const pure nothrow @safe @nogc { super(msg, file, line, next); } @@ -54,17 +54,17 @@ abstract class EntropySource /** * Returns: Minimum bytes required from the entropy source. */ - @property immutable(ubyte) threshold() const @safe pure nothrow; + @property ubyte threshold() const pure nothrow @safe @nogc; /** * Returns: Whether this entropy source is strong. */ - @property immutable(bool) strong() const @safe pure nothrow; + @property bool strong() const pure nothrow @safe @nogc; /** * Returns: Amount of already generated entropy. */ - @property ushort size() const @safe pure nothrow + @property ushort size() const pure nothrow @safe @nogc { return size_; } @@ -74,7 +74,7 @@ abstract class EntropySource * size = Amount of already generated entropy. Cannot be smaller than the * already set value. */ - @property void size(ushort size) @safe pure nothrow + @property void size(const ushort size) pure nothrow @nogc @safe { size_ = size; } @@ -89,12 +89,12 @@ abstract class EntropySource * Returns: Number of bytes that were copied to the $(D_PARAM output) * or $(D_PSYMBOL Nullable!ubyte.init) on error. */ - Nullable!ubyte poll(out ubyte[maxGather] output); + Nullable!ubyte poll(out ubyte[maxGather] output) @nogc; } version (linux) { - extern (C) long syscall(long number, ...) nothrow; + extern (C) long syscall(long number, ...) nothrow @nogc; /** * Uses getrandom system call. @@ -104,7 +104,7 @@ version (linux) /** * Returns: Minimum bytes required from the entropy source. */ - override @property immutable(ubyte) threshold() const @safe pure nothrow + override @property ubyte threshold() const pure nothrow @safe @nogc { return 32; } @@ -112,7 +112,7 @@ version (linux) /** * Returns: Whether this entropy source is strong. */ - override @property immutable(bool) strong() const @safe pure nothrow + override @property bool strong() const pure nothrow @safe @nogc { return true; } @@ -127,7 +127,7 @@ version (linux) * Returns: Number of bytes that were copied to the $(D_PARAM output) * or $(D_PSYMBOL Nullable!ubyte.init) on error. */ - override Nullable!ubyte poll(out ubyte[maxGather] output) nothrow + override Nullable!ubyte poll(out ubyte[maxGather] output) nothrow @nogc out (length) { assert(length <= maxGather); @@ -145,6 +145,20 @@ version (linux) return ret; } } + + private @nogc unittest + { + auto entropy = defaultAllocator.make!Entropy(); + + assert(entropy.sourceCount == 1); + assert(entropy.sources[0].strong); + assert(entropy.sources[0].threshold == 32); + assert(entropy.sources[0].size == 0); + + auto random = entropy.random; + + defaultAllocator.dispose(entropy); + } } /** @@ -177,7 +191,8 @@ class Entropy * allocator = Allocator to allocate entropy sources available on the * system. */ - this(size_t maxSources = 20, shared Allocator allocator = defaultAllocator) + this(const size_t maxSources = 20, + shared Allocator allocator = defaultAllocator) nothrow @nogc in { assert(maxSources > 0 && maxSources <= ubyte.max); @@ -196,7 +211,7 @@ class Entropy /** * Returns: Amount of the registered entropy sources. */ - @property ubyte sourceCount() const @safe pure nothrow + @property ubyte sourceCount() const pure nothrow @safe @nogc { return sourceCount_; } @@ -212,7 +227,8 @@ class Entropy * See_Also: * $(D_PSYMBOL EntropySource) */ - Entropy opOpAssign(string Op)(EntropySource source) @safe pure nothrow + Entropy opOpAssign(string Op)(EntropySource source) + pure nothrow @safe @nogc if (Op == "~") in { @@ -230,7 +246,7 @@ class Entropy * Throws: $(D_PSYMBOL EntropyException) if no strong entropy source was * registered or it failed. */ - @property ubyte[blockSize] random() + @property ubyte[blockSize] random() @nogc in { assert(sourceCount_ > 0, "No entropy sources defined."); @@ -299,15 +315,15 @@ class Entropy * data = Data got from the entropy source. * length = Length of the received data. */ - protected void update(in ubyte sourceId, + protected void update(const ubyte sourceId, ref ubyte[maxGather] data, - ubyte length) @safe pure nothrow + ubyte length) pure nothrow @safe @nogc { ubyte[2] header; if (length > blockSize) { - data[0..64] = sha512Of(data); + data[0 .. 64] = sha512Of(data); length = blockSize; } @@ -315,6 +331,6 @@ class Entropy header[1] = length; accumulator.put(header); - accumulator.put(data[0..length]); + accumulator.put(data[0 .. length]); } }