📄 x917_rng.cpp
字号:
/************************************************** ANSI X9.17 RNG Source File ** (C) 1999-2002 The Botan Project **************************************************/#include <botan/x917_rng.h>#include <botan/lookup.h>namespace Botan {/************************************************** Generate a random byte **************************************************/byte ANSI_X917_RNG::random() { if(position == MAX_OUT_PER_BUFFER) { generate(system_clock()); if(++iteration == ITERATIONS_BEFORE_RESEED) reseed(); } return buffer[position++]; }/************************************************** Generate a buffer of random bytes **************************************************/void ANSI_X917_RNG::randomize(byte out[], u32bit length) { while(position && length) { out[0] ^= random(); out++; length--; } while(length >= MAX_OUT_PER_BUFFER) { generate(system_clock()); if(++iteration == ITERATIONS_BEFORE_RESEED) reseed(); xor_buf(out, buffer, MAX_OUT_PER_BUFFER); out += MAX_OUT_PER_BUFFER; length -= MAX_OUT_PER_BUFFER; } while(length) { out[0] ^= random(); out++; length--; } }/************************************************** Refill the internal state **************************************************/void ANSI_X917_RNG::generate(u64bit input) { xor_buf(tstamp, (byte*)&input, 8); cipher->encrypt(tstamp); xor_buf(buffer, state, tstamp, cipher->BLOCK_SIZE); cipher->encrypt(buffer); xor_buf(state, buffer, tstamp, cipher->BLOCK_SIZE); cipher->encrypt(state); position = 0; }/************************************************** Add entropy to internal state **************************************************/void ANSI_X917_RNG::add_randomness(const byte data[], u32bit length) throw() { while(length) { u32bit added = std::min(state.size(), length); xor_buf(state, data, added); generate(system_clock()); length -= added; data += added; } reseed(); }/************************************************** Reseed the internal state **************************************************/void ANSI_X917_RNG::reseed() { SecureVector<byte> key(cipher->MAXIMUM_KEYLENGTH); generate(system_clock()); state = buffer; generate(system_clock()); tstamp = buffer; randomize(key, key.size()); cipher->set_key(key, key.size()); generate(system_time()); iteration = 0; }/************************************************** Clear memory of sensitive data **************************************************/void ANSI_X917_RNG::clear() throw() { cipher->clear(); buffer.clear(); tstamp.clear(); state.clear(); position = iteration = 0; }/************************************************** Return the name of this type **************************************************/std::string ANSI_X917_RNG::name() const { return "X9.17(" + cipher->name() + ")"; }/************************************************** ANSI X917 RNG Constructor **************************************************/ANSI_X917_RNG::ANSI_X917_RNG() : ITERATIONS_BEFORE_RESEED(48), MAX_OUT_PER_BUFFER(8) { cipher = get_block_cipher("AES"); buffer.create(cipher->BLOCK_SIZE); state.create(cipher->BLOCK_SIZE); tstamp.create(cipher->BLOCK_SIZE); position = iteration = 0; reseed(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -