@Override public DRes<Void> buildComputation(ProtocolBuilderNumeric builder) { return builder.seq(seq -> { output.println(message); return null; }); } }
@Override public DRes<Matrix<DRes<SInt>>> leakyAggregateSum(DRes<Matrix<DRes<SInt>>> values, int groupColIdx, int aggColIdx) { return builder.seq(new MiMCAggregation(values, groupColIdx, aggColIdx)); }
@Override public DRes<SInt> div(DRes<SInt> dividend, BigInteger divisor) { return builder.seq(new KnownDivisor(dividend, divisor)); }
@Override public DRes<List<SInt>> toBits(DRes<SInt> in, int maxInputLength) { return builder.seq(new IntegerToBitsByShift(in, maxInputLength)); }
@Override public DRes<RandomAdditiveMask> additiveMask(int noOfBits) { return builder.seq(new dk.alexandra.fresco.lib.compare.RandomAdditiveMask(noOfBits)); }
@Override public DRes<SInt> input(BigInteger value, int inputParty) { return builder.seq( new Spdz2kInputComputation<>(factory.createElement(value), inputParty) ); }
@Override public DRes<RightShiftResult> rightShiftWithRemainder(DRes<SInt> input) { return builder.seq( new RightShift( factoryNumeric.getBasicNumericContext().getMaxBitLength(), input, true)); }
@Override public DRes<byte[]> buildComputation(ProtocolBuilderNumeric builder) { return builder.seq(new Spdz2kCommitmentComputation(serializer, ownSeed, noOfParties, localDrbg)) .seq((seq, seeds) -> { byte[] jointSeed = new byte[ownSeed.length]; for (byte[] seed : seeds) { ByteArrayHelper.xor(jointSeed, seed); } return () -> jointSeed; }); }
@Override public DRes<RightShiftResult> rightShiftWithRemainder(DRes<SInt> input, int shifts) { return builder.seq(new RightShift(factoryNumeric.getBasicNumericContext().getMaxBitLength(), input, shifts, true)); }
@Override public DRes<SReal> random(int bits) { return builder.seq(seq -> { DRes<RandomAdditiveMask> random = seq.advancedNumeric().additiveMask(bits); return random; }).seq((seq, random) -> { return () -> new SFixed(random.random, bits); }); } }
@Override public DRes<SInt> buildComputation(ProtocolBuilderNumeric builder) { return builder.seq((seq) -> () -> this.data ).seq((seq, list) -> seq.advancedNumeric().sum(list) ).seq((seq, sum) -> { BigInteger n = BigInteger.valueOf(this.degreesOfFreedom); return seq.advancedNumeric().div(() -> sum, n); }); }
@Override public DRes<SInt> rightShift(DRes<SInt> input) { DRes<RightShiftResult> rightShiftResult = builder.seq( new RightShift( factoryNumeric.getBasicNumericContext().getMaxBitLength(), input, false)); return () -> rightShiftResult.out().getResult(); }
@Override public DRes<SInt> rightShift(DRes<SInt> input, int shifts) { DRes<RightShiftResult> rightShiftResult = builder.seq(new RightShift(factoryNumeric.getBasicNumericContext().getMaxBitLength(), input, shifts, false)); return () -> rightShiftResult.out().getResult(); }
@Override public DRes<SReal> add(BigDecimal a, DRes<SReal> b) { return builder.seq(seq -> { SFixed floatB = (SFixed) b.out(); int precision = Math.max(defaultPrecision, floatB.getPrecision()); BigInteger intA = unscaled(a, precision); DRes<SInt> unscaledB = unscaled(seq, (SFixed) b.out(), precision); return new SFixed(seq.numeric().add(intA, unscaledB), precision); }); }
@Override public DRes<Matrix<DRes<SReal>>> mult(DRes<Matrix<DRes<SReal>>> a, Matrix<BigDecimal> b) { return builder.seq(seq -> { return mult(seq, a.out(), b, (scope, x) -> scope.realAdvanced() .innerProductWithPublicPart(x.getSecond(), x.getFirst())); }); }
@Override public DRes<SReal> sub(DRes<SReal> a, DRes<SReal> b) { return builder.seq(seq -> { SFixed floatA = (SFixed) a.out(); SFixed floatB = (SFixed) b.out(); int precision = Math.max(floatA.getPrecision(), floatB.getPrecision()); DRes<SInt> unscaledA = unscaled(seq, floatA, precision); DRes<SInt> unscaledB = unscaled(seq, floatB, precision); return new SFixed(seq.numeric().sub(unscaledA, unscaledB), precision); }); }
@Override public DRes<SInt> buildComputation(ProtocolBuilderNumeric builder) { DRes<Pair<DRes<SInt>, byte[]>> shareAndMaskBytes = builder .append(new Spdz2kInputOnlyProtocol<>(input, inputPartyId)); return builder.seq(seq -> { Pair<DRes<SInt>, byte[]> unwrapped = shareAndMaskBytes.out(); seq.append(new BroadcastValidationProtocol<>(unwrapped.getSecond())); return unwrapped.getFirst(); }); }
@Override public void test() throws Exception { Application<SInt, ProtocolBuilderNumeric> app = (builder) -> { int maxLength = builder.getBasicNumericContext().getMaxBitLength(); BigInteger divisor = BigInteger.valueOf(2).pow(maxLength); DRes<SInt> dividend = builder.numeric().known(BigInteger.TEN); return builder.seq(new KnownDivisor(dividend, divisor)); }; runApplication(app); }
@Override public DRes<BigDecimal> open(DRes<SReal> x) { return builder.seq(seq -> { SFixed floatX = (SFixed) x.out(); DRes<SInt> unscaled = floatX.getSInt(); DRes<BigInteger> unscaledOpen = seq.numeric().open(unscaled); int precision = floatX.getPrecision(); return () -> scaled(builder.getBasicNumericContext().getFieldDefinition(), unscaledOpen.out(), precision); }); }
@Override public DRes<List<byte[]>> buildComputation(ProtocolBuilderNumeric builder) { HashBasedCommitment ownCommitment = new HashBasedCommitment(); byte[] ownOpening = ownCommitment.commit(localDrbg, value); return builder.seq(new BroadcastComputation<>(commitmentSerializer.serialize(ownCommitment))) .seq((seq, rawCommitments) -> { DRes<List<byte[]>> openingsDRes = seq.append(new InsecureBroadcastProtocol<>(ownOpening)); List<HashBasedCommitment> commitments = commitmentSerializer .deserializeList(rawCommitments); return () -> open(commitments, openingsDRes.out(), noOfParties); }); }