|
@@ -104,8 +104,9 @@ struct RegBS {
|
|
|
|
|
|
// Set each side's share to a random bit
|
|
|
inline void randomize() {
|
|
|
- arc4random_buf(&bshare, sizeof(bshare));
|
|
|
- bshare &= 1;
|
|
|
+ unsigned char randb;
|
|
|
+ arc4random_buf(&randb, sizeof(randb));
|
|
|
+ bshare = randb & 1;
|
|
|
}
|
|
|
};
|
|
|
|
|
@@ -179,12 +180,44 @@ using address_t = uint64_t;
|
|
|
|
|
|
using MultTriple = std::tuple<value_t, value_t, value_t>;
|
|
|
|
|
|
+// I/O for a MultTriple
|
|
|
+
|
|
|
+template <typename T>
|
|
|
+T& operator>>(T& is, MultTriple &m)
|
|
|
+{
|
|
|
+ is.read((char *)&m, sizeof(m));
|
|
|
+ return is;
|
|
|
+}
|
|
|
+
|
|
|
+template <typename T>
|
|
|
+T& operator<<(T& os, const MultTriple &m)
|
|
|
+{
|
|
|
+ os.write((const char *)&m, sizeof(m));
|
|
|
+ return os;
|
|
|
+}
|
|
|
+
|
|
|
// A half-triple is (X0,Z0) held by P0 (and correspondingly (Y1,Z1) held
|
|
|
// by P1), with all values random, but subject to the relation that
|
|
|
// X0*Y1 = Z0+Z1
|
|
|
|
|
|
using HalfTriple = std::tuple<value_t, value_t>;
|
|
|
|
|
|
+// I/O for a HalfTriple
|
|
|
+
|
|
|
+template <typename T>
|
|
|
+T& operator>>(T& is, HalfTriple &h)
|
|
|
+{
|
|
|
+ is.read((char *)&h, sizeof(h));
|
|
|
+ return is;
|
|
|
+}
|
|
|
+
|
|
|
+template <typename T>
|
|
|
+T& operator<<(T& os, const HalfTriple &h)
|
|
|
+{
|
|
|
+ os.write((const char *)&h, sizeof(h));
|
|
|
+ return os;
|
|
|
+}
|
|
|
+
|
|
|
// The type of nodes in a DPF. This must be at least as many bits as
|
|
|
// the security parameter, and at least twice as many bits as value_t.
|
|
|
|