OTPreprocessSender.java 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // Copyright (C) by Xiao Shaun Wang <wangxiao@cs.umd.edu>
  2. package com.oblivm.backend.ot;
  3. import java.io.IOException;
  4. import java.util.Arrays;
  5. import com.oblivm.backend.flexsc.Flag;
  6. import com.oblivm.backend.gc.GCGenComp;
  7. import com.oblivm.backend.gc.GCSignal;
  8. import com.oblivm.backend.network.Network;
  9. public class OTPreprocessSender extends OTSender {
  10. OTExtSender sender;
  11. public OTPreprocessSender(int msgBitLength, Network channel) {
  12. super(msgBitLength, channel);
  13. sender = new OTExtSender(msgBitLength, channel);
  14. fillup();
  15. }
  16. final static public int bufferSize = 1024 * 1024 * 1;
  17. final static public int fillLength = 300000;
  18. GCSignal[][] buffer = new GCSignal[bufferSize][2];
  19. int bufferusage = 0;
  20. public void fillup() {
  21. channel.flush();
  22. while (bufferusage < bufferSize) {
  23. int l = Math.min(fillLength, bufferSize - bufferusage);
  24. for (int i = bufferusage; i < bufferusage + l; ++i)
  25. buffer[i] = GCGenComp.genPair();
  26. try {
  27. sender.send(Arrays.copyOfRange(buffer, bufferusage, bufferusage + l));
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. }
  31. bufferusage += l;
  32. System.out.println("preprocessing OT" + bufferusage / (double) bufferSize);
  33. }
  34. channel.flush();
  35. }
  36. public void send(GCSignal[] m) throws IOException {
  37. Flag.sw.startOTIO();
  38. byte z = channel.readBytes(1)[0];
  39. Flag.sw.stopOTIO();
  40. bufferusage--;
  41. if (z == 0) {
  42. m[0].xor(buffer[bufferusage][0]).send(channel);
  43. m[1].xor(buffer[bufferusage][1]).send(channel);
  44. } else {
  45. m[0].xor(buffer[bufferusage][1]).send(channel);
  46. m[1].xor(buffer[bufferusage][0]).send(channel);
  47. }
  48. if (bufferusage == 0)
  49. fillup();
  50. }
  51. public void send(GCSignal[][] m) throws IOException {
  52. if (bufferusage < m.length)
  53. fillup();
  54. Flag.sw.startOTIO();
  55. byte[] z = channel.readBytes(m.length);
  56. Flag.sw.stopOTIO();
  57. for (int i = 0; i < m.length; ++i) {
  58. bufferusage--;
  59. if (z[i] == 0) {
  60. m[i][0].xor(buffer[bufferusage][0]).send(channel);
  61. m[i][1].xor(buffer[bufferusage][1]).send(channel);
  62. } else {
  63. m[i][0].xor(buffer[bufferusage][1]).send(channel);
  64. m[i][1].xor(buffer[bufferusage][0]).send(channel);
  65. }
  66. }
  67. }
  68. }