|
@@ -2,9 +2,25 @@
|
|
|
|
|
|
#include "rdpf.hpp"
|
|
|
#include "bitutils.hpp"
|
|
|
+#include "mpcops.hpp"
|
|
|
#include "aes.hpp"
|
|
|
#include "prg.hpp"
|
|
|
|
|
|
+static void dump_node(DPFnode node, const char *label = NULL)
|
|
|
+{
|
|
|
+ if (label) printf("%s: ", label);
|
|
|
+ for(int i=0;i<16;++i) { printf("%02x", ((unsigned char *)&node)[15-i]); } printf("\n");
|
|
|
+}
|
|
|
+
|
|
|
+static void dump_level(DPFnode *nodes, size_t num, const char *label = NULL)
|
|
|
+{
|
|
|
+ if (label) printf("%s:\n", label);
|
|
|
+ for (size_t i=0;i<num;++i) {
|
|
|
+ dump_node(nodes[i]);
|
|
|
+ }
|
|
|
+ printf("\n");
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
@@ -20,7 +36,52 @@ RDPF::RDPF(MPCTIO &tio, yield_t &yield,
|
|
|
arc4random_buf(&seed, sizeof(seed));
|
|
|
|
|
|
seed = set_lsb(seed, !!player);
|
|
|
- printf("seed: "); for(int i=0;i<16;++i) { printf("%02x", ((unsigned char *)&seed)[15-i]); } printf("\n");
|
|
|
+ cfbits = 0;
|
|
|
+
|
|
|
+
|
|
|
+ nbits_t level = 0;
|
|
|
+ DPFnode *curlevel = NULL;
|
|
|
+ DPFnode *nextlevel = new DPFnode[1];
|
|
|
+ nextlevel[0] = seed;
|
|
|
+
|
|
|
+
|
|
|
+ while(level < depth - 1) {
|
|
|
+ delete[] curlevel;
|
|
|
+ curlevel = nextlevel;
|
|
|
+ nextlevel = new DPFnode[1<<(level+1)];
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ RegBS bs_choice = target.bit(depth-level-1);
|
|
|
+ size_t curlevel_size = (size_t(1)<<level);
|
|
|
+ DPFnode L = _mm_setzero_si128();
|
|
|
+ DPFnode R = _mm_setzero_si128();
|
|
|
+ if (player < 2) {
|
|
|
+ for(size_t i=0;i<curlevel_size;++i) {
|
|
|
+ prgboth(nextlevel[2*i], nextlevel[2*i+1], curlevel[i], aesops);
|
|
|
+ L = _mm_xor_si128(L, nextlevel[2*i]);
|
|
|
+ R = _mm_xor_si128(R, nextlevel[2*i+1]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ DPFnode CW;
|
|
|
+ mpc_reconstruct_choice(tio, yield, CW, bs_choice, R, L);
|
|
|
+ if (player < 2) {
|
|
|
+ for(size_t i=0;i<curlevel_size;++i) {
|
|
|
+ bool flag = get_lsb(curlevel[i]);
|
|
|
+ nextlevel[2*i] = xor_if(nextlevel[2*i], CW, flag);
|
|
|
+ nextlevel[2*i+1] = xor_if(nextlevel[2*i+1], CW, flag);
|
|
|
+ }
|
|
|
+ printf("%d\n", bs_choice.bshare);
|
|
|
+ dump_level(nextlevel, curlevel_size<<1);
|
|
|
+ cw.push_back(CW);
|
|
|
+ }
|
|
|
+
|
|
|
+ ++level;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
|
|
|
AESkey prgkey;
|
|
|
__m128i key = _mm_set_epi64x(314159265, 271828182);
|