@Override public void sendToAll(byte[] data) { network.sendToAll(data); }
private byte[] sendAndReset(MessageDigest dig, Network network) { byte[] digest = dig.digest(); dig.reset(); network.sendToAll(digest); return digest; }
/** * Sends own opening info to others and receives others' opening info. * * @param opening own opening info */ private List<byte[]> distributeOpenings(byte[] opening) { // send (over regular network) own opening info network.sendToAll(opening); // receive opening info from others return network.receiveFromAll(); }
/** * Computes digest of received messages and sends digest to other parties. */ public byte[] computeAndSendDigests(List<byte[]> messages) { byte[] digest = computeDigest(messages); network.sendToAll(digest); return digest; }
private byte[] sendAndReset(MessageDigest dig, Network network) { byte[] digest = dig.digest(); dig.reset(); network.sendToAll(digest); return digest; }
@Override public EvaluationStatus evaluate(int round, ResourcePoolT resourcePool, Network network) { if (round == 0) { network.sendToAll(input.clone()); return EvaluationStatus.HAS_MORE_ROUNDS; } else { result = network.receiveFromAll(); return EvaluationStatus.IS_DONE; } } }
private byte[] sendAndReset(MessageDigest dig, Network network) { byte[] digest = dig.digest(); dig.reset(); digest[0] = (byte) 0xFF; network.sendToAll(digest); return digest; }
private byte[] sendAndReset(MessageDigest dig, Network network) { byte[] digest = dig.digest(); dig.reset(); if (corruptNow) { digest[0] = (byte) 0xFF; } network.sendToAll(digest); return digest; }
/** * Opens secret elements (distributes shares among all parties and recombines). Implements Open * sub-protocol of Protocol 3. * * @param closed authenticated elements to open * @return opened value */ public List<FieldElement> open(List<AuthenticatedElement> closed) { // get shares from authenticated elements (step 1) List<FieldElement> ownShares = closed.stream().map(AuthenticatedElement::getShare).collect(Collectors.toList()); // send own shares to others network.sendToAll(resourcePool.getFieldDefinition().serialize(ownShares)); // receive others' shares List<byte[]> rawShares = network.receiveFromAll(); // parse List<List<FieldElement>> shares = rawShares.stream() .map(resourcePool.getFieldDefinition()::deserializeList) .collect(Collectors.toList()); // recombine (step 2) return Addable.sumRows(shares); }
/** * Sends own commitment to others and receives others' commitments. * * @param comm own commitment */ private List<HashBasedCommitment> distributeCommitments(HashBasedCommitment comm) { // broadcast own commitment broadcaster.sendToAll(getResourcePool().getCommitmentSerializer().serialize(comm)); // receive other parties' commitments from broadcast List<byte[]> rawComms = broadcaster.receiveFromAll(); // parse return rawComms.stream() .map(getResourcePool().getCommitmentSerializer()::deserialize) .collect(Collectors.toList()); }
/** * Performs broadcast validation on a list of messages. * * @param messages messages to validate */ public void validate(List<byte[]> messages) { // compute digest byte[] digest = computeDigest(messages); // send it to others network.sendToAll(digest); // receive others' digests List<byte[]> digests = network.receiveFromAll(); // validate digests validateDigests(digest, digests); }
@Override public EvaluationStatus evaluate(int round, SpdzResourcePool spdzResourcePool, Network network) { FieldDefinition definition = spdzResourcePool.getFieldDefinition(); if (round == 0) { SpdzSInt out = (SpdzSInt) in.out(); network.sendToAll((out.serializeShare(definition))); return EvaluationStatus.HAS_MORE_ROUNDS; } else { List<byte[]> shares = network.receiveFromAll(); FieldElement openedVal = definition.deserialize(shares.get(0)); for (int i = 1; i < shares.size(); i++) { byte[] buffer = shares.get(i); openedVal = openedVal.add(definition.deserialize(buffer)); } spdzResourcePool.getOpenedValueStore().pushOpenedValue(((SpdzSInt) in.out()), openedVal); this.out = definition.convertToUnsigned(openedVal); return EvaluationStatus.IS_DONE; } }
@Override public EvaluationStatus evaluate(int round, ResourcePool resourcePool, Network network) { if (round == 0) { if (resourcePool.getMyId() == sender) { network.sendToAll(new byte[]{BooleanSerializer.toBytes(input.out())}); } return EvaluationStatus.HAS_MORE_ROUNDS; } else { boolean r = BooleanSerializer.fromBytes(network.receive(sender)[0]); this.output = new DummyBooleanSBool(r); return EvaluationStatus.IS_DONE; } }
@Override public EvaluationStatus evaluate(int round, DummyArithmeticResourcePool rp, Network network) { if (round == 0) { if (targetId == rp.getMyId()) { network.sendToAll(rp.getFieldDefinition().serialize(open)); } return EvaluationStatus.HAS_MORE_ROUNDS; } else { //if (round == 1) { byte[] bin = network.receive(targetId); closed = new DummyArithmeticSInt(rp.getFieldDefinition().deserialize(bin)); return EvaluationStatus.IS_DONE; } }
@Override public EvaluationStatus evaluate(int round, ResourcePoolImpl resourcePool, Network network) { TinyTablesProtocolSuite ps = TinyTablesProtocolSuite.getInstance(resourcePool.getMyId()); /* * When opening a value, all players send their shares of the masking value r to the other * players, and each player can then calculate the unmasked value as the XOR of the masked value * and all the shares of the mask. */ if (round == 0) { TinyTablesElement myR = ps.getStorage().getMaskShare(id); network.sendToAll(new byte[]{BooleanSerializer.toBytes(myR.getShare())}); return EvaluationStatus.HAS_MORE_ROUNDS; } else { // round > 0 List<byte[]> buffers = network.receiveFromAll(); List<TinyTablesElement> maskShares = new ArrayList<>(); for (byte[] buffer : buffers) { maskShares.add(TinyTablesElement.getInstance(BooleanSerializer.fromBytes(buffer[0]))); } boolean mask = TinyTablesElement.open(maskShares); this.opened = ((TinyTablesSBool) toOpen.out()).getValue().getShare() ^ mask; return EvaluationStatus.IS_DONE; } }
@Override public EvaluationStatus evaluate(int round, ResourcePoolImpl resourcePool, Network network) { TinyTablesProtocolSuite ps = TinyTablesProtocolSuite.getInstance(resourcePool.getMyId()); if (round == 0) { TinyTable tinyTable = Objects.requireNonNull(ps.getStorage().getTinyTable(id), "Unable to find TinyTable for gate with id " + id); TinyTablesElement myShare = tinyTable.getValue(((TinyTablesSBool) inLeft.out()).getValue(), ((TinyTablesSBool) inRight.out()).getValue()); network.sendToAll(new byte[]{BooleanSerializer.toBytes(myShare.getShare())}); return EvaluationStatus.HAS_MORE_ROUNDS; } else { List<byte[]> buffers = network.receiveFromAll(); List<TinyTablesElement> shares = new ArrayList<>(); for (byte[] bytes : buffers) { shares.add(TinyTablesElement.getInstance(BooleanSerializer.fromBytes(bytes[0]))); } boolean open = TinyTablesElement.open(shares); this.out = TinyTablesSBool.getInstance(TinyTablesElement.getInstance(open)); return EvaluationStatus.IS_DONE; } }
@Override public EvaluationStatus evaluate(int round, SpdzResourcePool spdzResourcePool, Network network) { int myId = spdzResourcePool.getMyId(); SpdzDataSupplier dataSupplier = spdzResourcePool.getDataSupplier(); FieldDefinition definition = spdzResourcePool.getFieldDefinition(); if (round == 0) { this.mask = dataSupplier.getNextInputMask(targetPlayer); SpdzSInt closedValue = (SpdzSInt) this.in.out(); inMinusMask = closedValue.subtract(this.mask.getMask()); network.sendToAll(inMinusMask.serializeShare(definition)); return EvaluationStatus.HAS_MORE_ROUNDS; } else { List<byte[]> shares = network.receiveFromAll(); FieldElement openedVal = definition.deserialize(shares.get(0)); for (int i = 1; i < shares.size(); i++) { byte[] buffer = shares.get(i); openedVal = openedVal.add(definition.deserialize(buffer)); } spdzResourcePool.getOpenedValueStore().pushOpenedValue(inMinusMask, openedVal); if (targetPlayer == myId) { openedVal = openedVal.add(this.mask.getRealValue()); this.out = definition.convertToUnsigned(openedVal); } return EvaluationStatus.IS_DONE; } } }
@Override public EvaluationStatus evaluate(int round, ResourcePoolImpl resourcePool, Network network) { TinyTablesProtocolSuite ps = TinyTablesProtocolSuite.getInstance(resourcePool.getMyId()); if (round == 0) { if (resourcePool.getMyId() == this.inputter) { TinyTablesElement r = ps.getStorage().getMaskShare(id); TinyTablesElement e = TinyTablesElement.getInstance(this.in ^ r.getShare()); network.sendToAll(new byte[]{BooleanSerializer.toBytes(e.getShare())}); } return EvaluationStatus.HAS_MORE_ROUNDS; } else { TinyTablesElement share = TinyTablesElement.getInstance(BooleanSerializer.fromBytes(network.receive(this.inputter)[0])); out = TinyTablesSBool.getInstance(share); return EvaluationStatus.IS_DONE; } }
@Override public EvaluationStatus evaluate(int round, Spdz2kResourcePool<PlainT> resourcePool, Network network) { OpenedValueStore<Spdz2kSInt<PlainT>, PlainT> openedValueStore = resourcePool .getOpenedValueStore(); if (round == 0) { authenticatedElement = toSpdz2kSInt(share); network.sendToAll(authenticatedElement .getShare() .getLeastSignificant() .toByteArray()); return EvaluationStatus.HAS_MORE_ROUNDS; } else { ByteSerializer<PlainT> serializer = resourcePool .getFactory() .getSerializer(); List<PlainT> shares = serializer.deserializeList(network.receiveFromAll()); PlainT recombined = UInt.sum(shares); openedValueStore.pushOpenedValue(authenticatedElement, recombined); this.opened = recombined .getLeastSignificant() .toBigInteger(); return EvaluationStatus.IS_DONE; } }
@Override public EvaluationStatus evaluate(int round, Spdz2kResourcePool<PlainT> resourcePool, Network network) { CompUIntFactory<PlainT> factory = resourcePool.getFactory(); int myId = resourcePool.getMyId(); Spdz2kDataSupplier<PlainT> dataSupplier = resourcePool.getDataSupplier(); if (round == 0) { inputMask = dataSupplier.getNextInputMask(inputPartyId); if (myId == inputPartyId) { PlainT bcValue = this.input.subtract(inputMask.getOpenValue()); network.sendToAll(factory.serialize(bcValue)); } return EvaluationStatus.HAS_MORE_ROUNDS; } else { byte[] inputMaskBytes = network.receive(inputPartyId); PlainT macKeyShare = dataSupplier.getSecretSharedKey(); Spdz2kSInt<PlainT> maskShare = inputMask.getMaskShare(); Spdz2kSInt<PlainT> out = maskShare.addConstant( factory.deserialize(inputMaskBytes), macKeyShare, factory.zero(), myId == 1); this.shareAndMaskBytes = new Pair<>(out, inputMaskBytes); return EvaluationStatus.IS_DONE; } }