123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- #include "utils.h"
- #include <cstdint>
- #include <fcntl.h>
- #include <gmp.h>
- #include <iostream>
- #include <unistd.h>
- uint32_t ceil_log2(int bits) {
- if (bits == 1)
- return 1;
- int targetlevel = 0, bitstemp = bits;
- while (bitstemp >>= 1)
- ++targetlevel;
- return targetlevel + ((1 << targetlevel) < bits);
- }
- uint32_t ceil_log2_min1(int bits) {
- if (bits <= 1)
- return 1;
- int targetlevel = 0, bitstemp = bits;
- while (bitstemp >>= 1)
- ++targetlevel;
- return targetlevel + ((1 << targetlevel) < bits);
- }
- uint32_t ceil_log2_real(int bits) {
- if (bits == 1)
- return 0;
- int targetlevel = 0, bitstemp = bits;
- while (bitstemp >>= 1)
- ++targetlevel;
- return targetlevel + ((1 << targetlevel) < bits);
- }
- uint32_t floor_log2(int bits) {
- if (bits == 1)
- return 1;
- int targetlevel = 0;
- while (bits >>= 1)
- ++targetlevel;
- return targetlevel;
- }
- uint32_t aby_rand() {
- int frandom = open("/dev/random", O_RDONLY);
- if (frandom < 0) {
- std::cerr << "Error in opening /dev/random: utils.h:aby_rand()" << std::endl;
- exit(1);
- } else {
- char data[4];
- size_t len = 0;
- while (len < sizeof data) {
- ssize_t result = read(frandom, data + len, (sizeof data) - len);
- if (result < 0) {
- std::cerr << "Error in generating random number: utils.h:aby_rand()" << std::endl;
- exit(1);
- }
- len += result;
- }
- close(frandom);
- return *((uint32_t*) data);
- }
- return 0;
- }
- void aby_prng(mpz_t rnd, mp_bitcnt_t bitlen) {
- size_t byte_count = ceil_divide(bitlen, 8);
- char * data;
- int furandom = open("/dev/urandom", O_RDONLY);
- if (furandom < 0) {
- std::cerr << "Error in opening /dev/urandom: utils.cpp:aby_prng()" << std::endl;
- exit(1);
- } else {
- data = (char*) malloc(sizeof(*data) * byte_count);
- size_t len = 0;
- while (len < byte_count) {
- ssize_t result = read(furandom, data + len, byte_count - len);
- if (result < 0) {
- std::cerr << "Error in generating random number: utils.cpp:aby_prng()" << std::endl;
- exit(1);
- }
- len += result;
- }
- close(furandom);
- }
- mpz_import(rnd, byte_count, 1, sizeof(*data), 0, 0, data);
-
- if (bitlen % 8) {
- for (uint8_t i = 0; i < 8 - bitlen % 8; ++i) {
- mpz_clrbit(rnd, byte_count * 8 - i - 1);
- }
- }
- free(data);
- }
|