15 static PRG * rnd =
nullptr;
19 PRG(
const void * seed =
nullptr,
int id = 0) {
23 fp = fopen(
"/dev/urandom",
"r");
25 while (r_bytes < 16) {
26 int r = fread(&data, 1, 16, fp);
34 if (seed ==
nullptr) {
41 void reseed(
const void * key, uint64_t
id = 0) {
42 const char * k = (
const char *)key;
43 __m128i v = _mm_load_si128((__m128i*)&k[0]);
45 AES_set_encrypt_key(v, &aes);
51 if (nbytes % 16 != 0) {
54 memcpy((nbytes/16*16)+(
char *) data, &extra, nbytes%16);
58 uint8_t * uint_data = (uint8_t*)data;
60 for(
int i = 0; i < length; ++i)
61 data[i] = uint_data[i] & 1;
67 memcpy((16*i*
AES_BATCH_SIZE)+(uint8_t*)data, tmp, 16*AES_BATCH_SIZE);
76 for (
int i = 0; i < nblocks; ++i) {
81 AES_ecb_encrypt_blks(data+i, AES_BATCH_SIZE, &aes);
83 AES_ecb_encrypt_blks(data+i, (AES_BATCH_SIZE > nblocks-i) ? nblocks-i:AES_BATCH_SIZE, &aes);
86 template<
typename T,
typename ... L>
94 SPLIT(bits, digits, bits, BN_DIG_LOG);
95 digits += (bits > 0 ? 1 : 0);
97 random_data((uint8_t*)a->dp, digits *
sizeof(dig_t));
101 dig_t mask = ((dig_t)1 << (dig_t)bits) - 1;
102 a->dp[a->used - 1] &= mask;
108 for(
int i = 0; i < length; ++i)
112 template<
typename T,
typename ... L>
133 for(
int i = 0; i < length; ++i) {
141 int nbytes = (nbits+1)/8;
142 uint8_t * data =
new uint8_t[nbytes+16];
145 for(
int i = 3; i >= 0; i--) {
146 data[i] = (
unsigned char) (n % (1 << 8));
149 FILE *fp = fmemopen(data, nbytes+16,
"rb");
150 int res = mpz_inp_raw(out, fp);
154 unsigned long size = mpz_sizeinbase(n, 2);
157 if(mpz_cmp(rop, n) < 0) {
void random_eb(eb_t *p, int length=1)
Definition: prg.h:128
#define AES_BATCH_SIZE
Definition: config.h:4
void random_bool(bool *data, int length)
Definition: prg.h:57
PRG(const void *seed=nullptr, int id=0)
Definition: prg.h:19
AES_KEY aes
Definition: prg.h:18
__m128i block
Definition: block.h:8
block xorBlocks(block x, block y)
Definition: block.h:35
#define makeBlock(X, Y)
Definition: block.h:69
void random_eb(eb_t p)
Definition: prg.h:118
#define BIT_LEN
Definition: utils_ec.h:10
void random_block(block *data, int nblocks=1)
Definition: prg.h:75
void random_mpz(mpz_t out, int nbits)
Definition: prg.h:140
void reseed(const void *key, uint64_t id=0)
Definition: prg.h:41
void random_mpz(mpz_t rop, const mpz_t n)
Definition: prg.h:153
void random_bn(bn_t *a, int length=1, int sign=BN_POS, int bits=BIT_LEN)
Definition: prg.h:107
uint64_t counter
Definition: prg.h:17
void random_bn(T t, L... l)
Definition: prg.h:87
void random_bn(bn_t a, int sign=BN_POS, int bits=BIT_LEN)
Definition: prg.h:92
void random_data(void *data, int nbytes)
Definition: prg.h:49
void random_eb(T t, L... l)
Definition: prg.h:113
void random_data_unaligned(void *data, int nbytes)
Definition: prg.h:63