@Override public DRes<List<DRes<BigInteger>>> buildComputation(ProtocolBuilderNumeric builder) { Numeric nb = builder.numeric(); // for each input value, call input List<DRes<BigInteger>> openList = closedList.out().stream().map(nb::open).collect(Collectors.toList()); return () -> openList; }
@Override public DRes<List<DRes<SInt>>> buildComputation(ProtocolBuilderNumeric builder) { Numeric nb = builder.numeric(); // for each input value, call input List<DRes<SInt>> closedInputs = isInputProvider ? buildAsProvider(nb) : buildAsReceiver(nb); return () -> closedInputs; } }
@Override public DRes<SInt> buildComputation(ProtocolBuilderNumeric builder) { Numeric numeric = builder.numeric(); DRes<SInt> sub = numeric.sub(left, right); DRes<SInt> mult = numeric.mult(condition, sub); return numeric.add(mult, right); } }
private DRes<SInt> or(ProtocolBuilderNumeric builder, DRes<SInt> a, DRes<SInt> b) { Numeric numeric = builder.numeric(); DRes<SInt> product = numeric.mult(a, b); DRes<SInt> add = numeric.add(a, b); return numeric.sub(add, product); }
private DRes<SInt> convertToSInt(int integer, ProtocolBuilderNumeric producer) { Numeric numeric = producer.numeric(); BigInteger value = BigInteger.valueOf(integer); return numeric.input(value, 1); } }
@Override public DRes<SInt> buildComputation(ProtocolBuilderNumeric builder) { AdvancedNumeric advancedNumericBuilder = builder.advancedNumeric(); DRes<SInt> divisionResult = advancedNumericBuilder.div(dividend, divisor); Numeric numeric = builder.numeric(); return numeric.sub(dividend, numeric.mult(divisor, divisionResult)); } }
@Override public DRes<SReal> input(BigDecimal value, int inputParty) { return builder.seq(seq -> { DRes<SInt> input = seq.numeric().input(unscaled(value, defaultPrecision), inputParty); return new SFixed(input, defaultPrecision); }); }
@Override public DRes<SReal> sub(DRes<SReal> a, BigDecimal b) { return builder.seq(seq -> { SFixed floatA = (SFixed) a.out(); int precision = Math.max(defaultPrecision, floatA.getPrecision()); DRes<SInt> unscaledA = unscaled(seq, floatA, precision); BigInteger unscaledB = unscaled(b, precision); return new SFixed(seq.numeric().sub(unscaledA, unscaledB), precision); }); }
@Override public void test() throws Exception { Application<BigInteger, ProtocolBuilderNumeric> app = builder -> { DRes<SInt> sharedInput = builder.numeric().known(input); AdvancedNumeric bitLengthBuilder = builder.advancedNumeric(); DRes<SInt> bitLength = bitLengthBuilder.bitLength(sharedInput, input.bitLength() * 2); return builder.numeric().open(bitLength); }; BigInteger result = runApplication(app); Assert.assertEquals(BigInteger.valueOf(input.bitLength()), result); } };
@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<Pair<DRes<BigInteger>, DRes<BigInteger>>> buildComputation( ProtocolBuilderNumeric par) { Pair<DRes<SInt>, DRes<SInt>> closedPairOut = closedPair.out(); Numeric nb = par.numeric(); Pair<DRes<BigInteger>, DRes<BigInteger>> openPair = new Pair<>(nb.open(closedPairOut.getFirst()), nb.open(closedPairOut.getSecond())); return () -> openPair; }
@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 void test() { Application<BigInteger, ProtocolBuilderNumeric> app = producer -> { Numeric numeric = producer.numeric(); DRes<SInt> input = numeric.input(value, 1); DRes<SInt> result = numeric.add(add, input); return numeric.open(result); }; BigInteger output = runApplication(app); Assert.assertEquals(BigInteger.valueOf(14), output); } };
@Override public void test() { Application<BigInteger, ProtocolBuilderNumeric> app = producer -> { Numeric numeric = producer.numeric(); DRes<SInt> input = numeric.input(value, 1); DRes<SInt> result = numeric.mult(constant, input); return numeric.open(result); }; BigInteger output = runApplication(app); Assert.assertEquals(BigInteger.valueOf(40), output); } };
@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 void test() { Application<BigInteger, ProtocolBuilderNumeric> app = producer -> { Numeric numeric = producer.numeric(); DRes<SInt> leftClosed = numeric.input(left, 1); DRes<SInt> result = numeric.sub(leftClosed, right); return numeric.open(result); }; BigInteger actual = runApplication(app); BigInteger subtract = conf.getResourcePool().getModulus().add(BigInteger.valueOf(-6)); Assert.assertEquals(subtract, actual); } };
@Override public DRes<SInt> buildComputation(ProtocolBuilderNumeric builder) { return builder.par(par -> { Numeric numeric = par.numeric(); return Pair.lazy( numeric.mult(d0, n1), numeric.mult(d1, n0) ); }).seq((seq, pair) -> seq.comparison().equals(pair.getFirst(), pair.getSecond()) ); }
@Override public void test() { Application<BigInteger, ProtocolBuilderNumeric> app = producer -> { Numeric numeric = producer.numeric(); DRes<SInt> left = numeric.input(leftValue, 1); DRes<SInt> right = numeric.input(rightValue, 1); DRes<SInt> result = numeric.mult(left, right); return numeric.open(result); }; BigInteger output = runApplication(app); Assert.assertEquals(leftValue.multiply(rightValue), output); } };
@Override public void test() { Application<BigInteger, ProtocolBuilderNumeric> app = producer -> { Numeric numeric = producer.numeric(); DRes<SInt> left = numeric.input(leftValue, 1); DRes<SInt> right = numeric.input(rightValue, 1); DRes<SInt> result = numeric.mult(left, right); return numeric.open(result); }; BigInteger output = runApplication(app); Assert.assertEquals(BigInteger.ZERO, output); } };
void inputTableau(ProtocolBuilderNumeric builder) { builder.par(par -> { Numeric numeric = par.numeric(); secretTableau = new LPTableau( new Matrix<>(constraints.getHeight(), constraints.getWidth(), (i) -> toArrayList(numeric, constraints.getRow(i))), toArrayList(numeric, b), toArrayList(numeric, f), numeric.known(BigInteger.ZERO)); secretUpdateMatrix = new Matrix<>(updateMatrix.getHeight(), updateMatrix.getWidth(), (i) -> toArrayList(numeric, updateMatrix.getRow(i))); return null; }); }