utils.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /**
  2. \file utils.cpp
  3. \author
  4. \copyright ABY - A Framework for Efficient Mixed-protocol Secure Two-party Computation
  5. Copyright (C) 2019 ENCRYPTO Group, TU Darmstadt
  6. This program is free software: you can redistribute it and/or modify
  7. it under the terms of the GNU Lesser General Public License as published
  8. by the Free Software Foundation, either version 3 of the License, or
  9. (at your option) any later version.
  10. ABY is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU Lesser General Public License for more details.
  14. You should have received a copy of the GNU Lesser General Public License
  15. along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. \brief utils
  17. */
  18. #include "utils.h"
  19. #include <cstdint>
  20. #include <fcntl.h>
  21. #include <gmp.h>
  22. #include <iostream>
  23. #include <unistd.h>
  24. //TODO: this is bad, fix occurrences of ceil_log2 and replace by ceil_log2_min1 where log(1) = 1 is necessary. For all else use ceil_log2_real
  25. uint32_t ceil_log2(int bits) {
  26. if (bits == 1)
  27. return 1;
  28. int targetlevel = 0, bitstemp = bits;
  29. while (bitstemp >>= 1)
  30. ++targetlevel;
  31. return targetlevel + ((1 << targetlevel) < bits);
  32. }
  33. uint32_t ceil_log2_min1(int bits) {
  34. if (bits <= 1)
  35. return 1;
  36. int targetlevel = 0, bitstemp = bits;
  37. while (bitstemp >>= 1)
  38. ++targetlevel;
  39. return targetlevel + ((1 << targetlevel) < bits);
  40. }
  41. uint32_t ceil_log2_real(int bits) {
  42. if (bits == 1)
  43. return 0;
  44. int targetlevel = 0, bitstemp = bits;
  45. while (bitstemp >>= 1)
  46. ++targetlevel;
  47. return targetlevel + ((1 << targetlevel) < bits);
  48. }
  49. uint32_t floor_log2(int bits) {
  50. if (bits == 1)
  51. return 1;
  52. int targetlevel = 0;
  53. while (bits >>= 1)
  54. ++targetlevel;
  55. return targetlevel;
  56. }
  57. /**
  58. * returns a 4-byte value from dev/random
  59. */
  60. uint32_t aby_rand() {
  61. int frandom = open("/dev/random", O_RDONLY);
  62. if (frandom < 0) {
  63. std::cerr << "Error in opening /dev/random: utils.h:aby_rand()" << std::endl;
  64. exit(1);
  65. } else {
  66. char data[4];
  67. size_t len = 0;
  68. while (len < sizeof data) {
  69. ssize_t result = read(frandom, data + len, (sizeof data) - len);
  70. if (result < 0) {
  71. std::cerr << "Error in generating random number: utils.h:aby_rand()" << std::endl;
  72. exit(1);
  73. }
  74. len += result;
  75. }
  76. close(frandom);
  77. return *((uint32_t*) data);
  78. }
  79. return 0;
  80. }
  81. /**
  82. * returns a random mpz_t with bitlen len generated from dev/urandom
  83. */
  84. void aby_prng(mpz_t rnd, mp_bitcnt_t bitlen) {
  85. size_t byte_count = ceil_divide(bitlen, 8);
  86. char * data;
  87. int furandom = open("/dev/urandom", O_RDONLY);
  88. if (furandom < 0) {
  89. std::cerr << "Error in opening /dev/urandom: utils.cpp:aby_prng()" << std::endl;
  90. exit(1);
  91. } else {
  92. data = (char*) malloc(sizeof(*data) * byte_count);
  93. size_t len = 0;
  94. while (len < byte_count) {
  95. ssize_t result = read(furandom, data + len, byte_count - len);
  96. if (result < 0) {
  97. std::cerr << "Error in generating random number: utils.cpp:aby_prng()" << std::endl;
  98. exit(1);
  99. }
  100. len += result;
  101. }
  102. close(furandom);
  103. }
  104. mpz_import(rnd, byte_count, 1, sizeof(*data), 0, 0, data);
  105. //set MSBs to zero, if we are not working on full bytes
  106. if (bitlen % 8) {
  107. for (uint8_t i = 0; i < 8 - bitlen % 8; ++i) {
  108. mpz_clrbit(rnd, byte_count * 8 - i - 1);
  109. }
  110. }
  111. free(data);
  112. }