OTExtReceiver.java 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. // Copyright (C) 2013 by Yan Huang <yhuang@cs.umd.edu>
  2. // Improved by Xiao Shaun Wang <wangxiao@cs.umd.edu>
  3. package com.oblivm.backend.ot;
  4. import java.io.IOException;
  5. import java.math.BigInteger;
  6. import java.security.NoSuchAlgorithmException;
  7. import java.security.SecureRandom;
  8. import java.security.Security;
  9. import java.util.Arrays;
  10. import com.oblivm.backend.flexsc.Flag;
  11. import com.oblivm.backend.gc.GCSignal;
  12. import com.oblivm.backend.network.Network;
  13. import com.oblivm.backend.ot.OTExtSender.SecurityParameter;
  14. import com.oblivm.backend.rand.ISAACProvider;
  15. public class OTExtReceiver extends OTReceiver {
  16. static SecureRandom rnd;
  17. static {
  18. Security.addProvider(new ISAACProvider());
  19. try {
  20. rnd = SecureRandom.getInstance("ISAACRandom");
  21. } catch (NoSuchAlgorithmException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. private int msgBitLength;
  26. private OTSender snder;
  27. private GCSignal[][] keyPairs;
  28. Cipher cipher;
  29. public OTExtReceiver(Network channel) {
  30. super(channel);
  31. cipher = new Cipher();
  32. try {
  33. initialize();
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. boolean[] s = new boolean[SecurityParameter.k1];
  39. public GCSignal[] receive(boolean[] choices) throws IOException {
  40. GCSignal[] keys = new GCSignal[SecurityParameter.k1];
  41. boolean[] c = new boolean[SecurityParameter.k1 + choices.length];
  42. for (int i = 0; i < SecurityParameter.k1; i++)
  43. c[i] = rnd.nextBoolean();
  44. for (int i = SecurityParameter.k1; i < c.length; i++)
  45. c[i] = choices[i - SecurityParameter.k1];
  46. GCSignal[] received = reverseAndExtend(keyPairs, c, msgBitLength, channel, cipher);
  47. for (int i = 0; i < OTExtSender.SecurityParameter.k1; i++) {
  48. keys[i] = received[i];
  49. s[i] = c[i];
  50. }
  51. for (int i = 0; i < OTExtSender.SecurityParameter.k1; i++) {
  52. keyPairs[i][0] = GCSignal.freshLabel(rnd);
  53. keyPairs[i][1] = GCSignal.freshLabel(rnd);
  54. }
  55. OTExtSender.reverseAndExtend(s, keys, msgBitLength, keyPairs, channel, cipher);
  56. return Arrays.copyOfRange(received, SecurityParameter.k1, received.length);
  57. }
  58. static GCSignal[] reverseAndExtend(GCSignal[][] keyPairs, boolean[] choices, int msgBitLength, Network channel,
  59. Cipher cipher) throws IOException {
  60. BigInteger[][] msgPairs = new BigInteger[SecurityParameter.k1][2];
  61. BigInteger[][] cphPairs = new BigInteger[SecurityParameter.k1][2];
  62. BitMatrix T = new BitMatrix(choices.length, SecurityParameter.k1);
  63. T.initialize(rnd);
  64. BigInteger biChoices = OTExtSender.fromBoolArray(choices);
  65. for (int i = 0; i < SecurityParameter.k1; i++) {
  66. msgPairs[i][0] = T.data[i];
  67. msgPairs[i][1] = T.data[i].xor(biChoices);
  68. cphPairs[i][0] = cipher.encrypt(keyPairs[i][0].bytes, msgPairs[i][0], choices.length);
  69. cphPairs[i][1] = cipher.encrypt(keyPairs[i][1].bytes, msgPairs[i][1], choices.length);
  70. channel.writeBI(cphPairs[i][0]);
  71. channel.writeBI(cphPairs[i][1]);
  72. }
  73. Flag.sw.startOTIO();
  74. channel.flush();
  75. Flag.sw.stopOTIO();
  76. BitMatrix tT = T.transpose();
  77. GCSignal[] res = new GCSignal[choices.length];
  78. GCSignal[][] y = new GCSignal[choices.length][2];
  79. for (int i = 0; i < choices.length; i++) {
  80. y[i][0] = GCSignal.receive(channel);
  81. y[i][1] = GCSignal.receive(channel);
  82. int sigma = choices[i] ? 1 : 0;
  83. res[i] = cipher.dec(GCSignal.newInstance(tT.data[i].toByteArray()), y[i][sigma], i);
  84. }
  85. return res;
  86. }
  87. private void initialize() throws Exception {
  88. Flag.sw.startOTIO();
  89. msgBitLength = channel.readInt();
  90. Flag.sw.stopOTIO();
  91. snder = new NPOTSender(OTExtSender.SecurityParameter.k1, channel);
  92. keyPairs = new GCSignal[OTExtSender.SecurityParameter.k1][2];
  93. for (int i = 0; i < OTExtSender.SecurityParameter.k1; i++) {
  94. keyPairs[i][0] = GCSignal.freshLabel(rnd);
  95. keyPairs[i][1] = GCSignal.freshLabel(rnd);
  96. }
  97. snder.send(keyPairs);
  98. channel.flush();
  99. }
  100. GCSignal[] pool;
  101. int poolIndex = 0;
  102. @Override
  103. public GCSignal receive(boolean c) {
  104. try {
  105. throw new Exception("It doesn't make sense to do single OT with OT extension!");
  106. } catch (Exception e) {
  107. e.printStackTrace();
  108. }
  109. return null;
  110. }
  111. }