8195c72017-11-25Martin Nilsson #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;
09ff892017-11-26Martin Nilsson #define SEEDLEN 32 /* keylen + ctrlen */
8195c72017-11-25Martin Nilsson  //! 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; }
09ff892017-11-26Martin Nilsson  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));
8195c72017-11-25Martin Nilsson }