Commit 261aedce authored by Stefan Westerfeld's avatar Stefan Westerfeld

Provide re-seeding operation for random generator.

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent ca71ac9f
...@@ -78,57 +78,50 @@ print (const string& label, const vector<unsigned char>& data) ...@@ -78,57 +78,50 @@ print (const string& label, const vector<unsigned char>& data)
} }
#endif #endif
Random::Random (uint64_t seed, Stream stream) Random::Random (uint64_t start_seed, Stream stream)
{ {
gcrypt_init(); gcrypt_init();
vector<unsigned char> ctr = get_start_counter (seed, stream);
// print ("CTR", ctr);
gcry_error_t gcry_ret = gcry_cipher_open (&aes_ctr_cipher, GCRY_CIPHER, GCRY_CIPHER_MODE_CTR, 0); gcry_error_t gcry_ret = gcry_cipher_open (&aes_ctr_cipher, GCRY_CIPHER, GCRY_CIPHER_MODE_CTR, 0);
die_on_error ("gcry_cipher_open", gcry_ret); die_on_error ("gcry_cipher_open", gcry_ret);
gcry_ret = gcry_cipher_setkey (aes_ctr_cipher, &aes_key[0], aes_key.size()); gcry_ret = gcry_cipher_setkey (aes_ctr_cipher, &aes_key[0], aes_key.size());
die_on_error ("gcry_cipher_setkey", gcry_ret); die_on_error ("gcry_cipher_setkey", gcry_ret);
gcry_ret = gcry_cipher_setctr (aes_ctr_cipher, &ctr[0], ctr.size()); gcry_ret = gcry_cipher_open (&seed_cipher, GCRY_CIPHER, GCRY_CIPHER_MODE_ECB, 0);
die_on_error ("gcry_cipher_setctr", gcry_ret); die_on_error ("gcry_cipher_open", gcry_ret);
}
Random::~Random() gcry_ret = gcry_cipher_setkey (seed_cipher, &aes_key[0], aes_key.size());
{ die_on_error ("gcry_cipher_setkey", gcry_ret);
gcry_cipher_close (aes_ctr_cipher);
seed (start_seed, stream);
} }
vector<unsigned char> void
Random::get_start_counter (uint64_t seed, Stream stream) Random::seed (uint64_t seed, Stream stream)
{ {
gcry_error_t gcry_ret; buffer_pos = 0;
gcry_cipher_hd_t cipher_hd; buffer.clear();
gcry_ret = gcry_cipher_open (&cipher_hd, GCRY_CIPHER, GCRY_CIPHER_MODE_ECB, 0);
die_on_error ("gcry_cipher_open", gcry_ret);
gcry_ret = gcry_cipher_setkey (cipher_hd, &aes_key[0], aes_key.size());
die_on_error ("gcry_cipher_setkey", gcry_ret);
vector<unsigned char> cipher_text (16); unsigned char plain_text[aes_key.size()] = { 0, };
vector<unsigned char> plain_text (16); unsigned char cipher_text[aes_key.size()];
uint64_to_buffer (seed, &plain_text[0]); uint64_to_buffer (seed, &plain_text[0]);
plain_text[8] = uint8_t (stream); plain_text[8] = uint8_t (stream);
// print ("SEED", plain_text); gcry_error_t gcry_ret = gcry_cipher_encrypt (seed_cipher, &cipher_text[0], aes_key.size(),
&plain_text[0], aes_key.size());
gcry_ret = gcry_cipher_encrypt (cipher_hd, &cipher_text[0], cipher_text.size(),
&plain_text[0], plain_text.size());
die_on_error ("gcry_cipher_encrypt", gcry_ret); die_on_error ("gcry_cipher_encrypt", gcry_ret);
gcry_cipher_close (cipher_hd); gcry_ret = gcry_cipher_setctr (aes_ctr_cipher, &cipher_text[0], aes_key.size());
die_on_error ("gcry_cipher_setctr", gcry_ret);
}
return cipher_text; Random::~Random()
{
gcry_cipher_close (aes_ctr_cipher);
gcry_cipher_close (seed_cipher);
} }
void void
......
...@@ -19,12 +19,11 @@ public: ...@@ -19,12 +19,11 @@ public:
frame_position = 6 frame_position = 6
}; };
private: private:
gcry_cipher_hd_t aes_ctr_cipher; gcry_cipher_hd_t aes_ctr_cipher = nullptr;
gcry_cipher_hd_t seed_cipher = nullptr;
std::vector<uint64_t> buffer; std::vector<uint64_t> buffer;
size_t buffer_pos = 0; size_t buffer_pos = 0;
std::vector<unsigned char> get_start_counter (uint64_t seed, Stream stream);
void die_on_error (const char *func, gcry_error_t error); void die_on_error (const char *func, gcry_error_t error);
public: public:
Random (uint64_t seed, Stream stream); Random (uint64_t seed, Stream stream);
...@@ -39,6 +38,7 @@ public: ...@@ -39,6 +38,7 @@ public:
return buffer[buffer_pos++]; return buffer[buffer_pos++];
} }
void refill_buffer(); void refill_buffer();
void seed (uint64_t seed, Stream stream);
template<class T> void template<class T> void
shuffle (std::vector<T>& result) shuffle (std::vector<T>& result)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment