pike.git
/
lib
/
modules
/
Random.pmod
/
AES128_CTR_DRBG.pike
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/lib/modules/Random.pmod/AES128_CTR_DRBG.pike:1:
+
#pike __REAL_VERSION__
+
#pragma strict_types
-
+
//! Implements NIST SP800-90Ar1 pseudo random number generator
+
//! CTR_DRBG using AES-128.
+
//!
+
//! https://csrc.nist.gov/publications/detail/sp/800-90a/rev-1/final
+
+
inherit Builtin.RandomInterface;
+
inherit Nettle.AES128_CTR_DRBG;
+
+
#define SEEDLEN 32 /* keylen + ctrlen */
+
+
//! Instantiate a random generator without derivation function, with
+
//! the given initial entropy and personalization.
+
protected void create(string(8bit) entropy, void|string(8bit) personalization)
+
{
+
if( personalization )
+
{
+
if(sizeof(personalization)>SEEDLEN)
+
error("Personalization longer than seed length (%d)\n", SEEDLEN);
+
personalization = sprintf("%-*'\0's", SEEDLEN, personalization);
+
entropy ^= personalization;
+
}
+
reseed(entropy);
+
}
+
+
protected .Interface rnd;
+
+
//! This method is called when a reseed is forced. By default new
+
//! entropy is gethered from Random.System. Overload to change the
+
//! default behaviour.
+
protected void entropy_underflow()
+
{
+
if(!rnd) rnd = .System();
+
reseed(rnd->random_string(32));
+
}
Newline at end of file added.