123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- package protocols.precomputation;
- import java.math.BigInteger;
- import com.oblivm.backend.gc.GCSignal;
- import communication.Communication;
- import crypto.Crypto;
- import gc.GCUtil;
- import oram.Forest;
- import oram.Metadata;
- import protocols.Protocol;
- import protocols.struct.Party;
- import protocols.struct.PreData;
- import util.M;
- import util.P;
- import util.Timer;
- import util.Util;
- public class PrePermuteTarget extends Protocol {
- private int pid = P.PT;
- public PrePermuteTarget(Communication con1, Communication con2) {
- super(con1, con2);
- }
- public void runE(PreData predata, int d, Timer timer) {
- timer.start(pid, M.offline_comp);
- // PermuteTargetI
- int logD = (int) Math.ceil(Math.log(d) / Math.log(2));
- predata.pt_keyT = new byte[d][d][];
- predata.pt_targetT = new byte[d][d][];
- predata.pt_maskT = new byte[d][d][];
- for (int i = 0; i < d; i++) {
- for (int j = 0; j < d; j++) {
- GCSignal[] keys = GCUtil.revSelectKeys(predata.evict_targetOutKeyPairs[i],
- BigInteger.valueOf(j).toByteArray());
- predata.pt_keyT[i][j] = GCUtil.hashAll(keys);
- predata.pt_maskT[i][j] = Util.nextBytes((logD + 7) / 8, Crypto.sr);
- predata.pt_targetT[i][j] = Util.xor(
- Util.padArray(BigInteger.valueOf(predata.evict_pi[j]).toByteArray(), (logD + 7) / 8),
- predata.pt_maskT[i][j]);
- }
- int[] randPerm = Util.randomPermutation(d, Crypto.sr);
- predata.pt_keyT[i] = Util.permute(predata.pt_keyT[i], randPerm);
- predata.pt_maskT[i] = Util.permute(predata.pt_maskT[i], randPerm);
- predata.pt_targetT[i] = Util.permute(predata.pt_targetT[i], randPerm);
- }
- timer.start(pid, M.offline_write);
- con1.write(predata.pt_keyT);
- con1.write(predata.pt_targetT);
- con2.write(predata.pt_maskT);
- timer.stop(pid, M.offline_write);
- // PermuteTargetII
- predata.pt_p = new byte[d][];
- predata.pt_r = new byte[d][];
- predata.pt_a = new byte[d][];
- for (int i = 0; i < d; i++) {
- predata.pt_p[i] = Util.nextBytes((logD + 7) / 8, Crypto.sr);
- predata.pt_r[i] = Util.nextBytes((logD + 7) / 8, Crypto.sr);
- predata.pt_a[i] = Util.xor(predata.pt_p[i], predata.pt_r[i]);
- }
- predata.pt_a = Util.permute(predata.pt_a, predata.evict_pi);
- timer.start(pid, M.offline_write);
- con1.write(predata.pt_p);
- con1.write(predata.pt_a);
- con2.write(predata.pt_r);
- timer.stop(pid, M.offline_write);
- timer.stop(pid, M.offline_comp);
- }
- public void runD(PreData predata, int d, Timer timer) {
- timer.start(pid, M.offline_read);
- // PermuteTargetI
- predata.pt_keyT = con1.readTripleByteArray();
- predata.pt_targetT = con1.readTripleByteArray();
- // PermuteTargetII
- predata.pt_p = con1.readDoubleByteArray();
- predata.pt_a = con1.readDoubleByteArray();
- timer.stop(pid, M.offline_read);
- }
- public void runC(PreData predata, Timer timer) {
- timer.start(pid, M.offline_read);
- // PermuteTargetI
- predata.pt_maskT = con1.readTripleByteArray();
- // PermuteTargetII
- predata.pt_r = con1.readDoubleByteArray();
- timer.stop(pid, M.offline_read);
- }
- @Override
- public void run(Party party, Metadata md, Forest forest) {
- }
- }
|