private DRes<SInt> exp2(ProtocolBuilderNumeric builder, DRes<SInt> exponent, int maxExponentLength) { return builder.advancedNumeric().exp( BigInteger.valueOf(2), exponent, maxExponentLength ); }
private DRes<SInt> getBitLength(ProtocolBuilderNumeric builder, DRes<SInt> input, int maximumBitLength) { return builder.advancedNumeric() .bitLength(input, maximumBitLength); }
private DRes<SInt> shiftRight(ProtocolBuilderNumeric builder, DRes<SInt> input, int numberOfPositions) { return builder.advancedNumeric() .rightShift(input, numberOfPositions); } }
@Override public DRes<List<DRes<SInt>>> buildComputation(ProtocolBuilderNumeric builder) { List<DRes<SInt>> selected = new ArrayList<>(); List<? extends DRes<SInt>> leftOut = left.out(); List<? extends DRes<SInt>> rightOut = right.out(); AdvancedNumeric advancedNumeric = builder.advancedNumeric(); for (int i = 0; i < leftOut.size(); i++) { selected.add(advancedNumeric.condSelect(condition, leftOut.get(i), rightOut.get(i))); } return () -> selected; } }
@Override public DRes<Pair<DRes<SInt>, DRes<SInt>>> buildComputation(ProtocolBuilderNumeric builder) { DRes<SInt> updatedA = builder.advancedNumeric().condSelect(swapper, right, left); DRes<SInt> updatedB = builder.advancedNumeric().condSelect(swapper, left, right); return () -> new Pair<>(updatedA, updatedB); } }
@Override public DRes<SInt> buildComputation(ProtocolBuilderNumeric builder) { return builder.par(parallel -> { List<DRes<SInt>> result = new ArrayList<>(vectorA.size()); Numeric numericBuilder = parallel.numeric(); for (int i = 0; i < vectorA.size(); i++) { BigInteger nextA = vectorA.get(i); DRes<SInt> nextB = vectorB.get(i); result.add(numericBuilder.mult(nextA, nextB)); } return () -> result; }).seq((seq, list) -> seq.advancedNumeric().sum(list)); } }
@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> 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> 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<BigInteger> buildComputation( ProtocolBuilderNumeric producer) { List<DRes<SInt>> input = Arrays.stream(inputAsArray) .map((integer) -> convertToSInt(integer, producer)) .collect(Collectors.toList()); DRes<SInt> result = producer.advancedNumeric().sum(input); return producer.numeric().open(result); }
@Override public DRes<BigInteger> buildComputation( ProtocolBuilderNumeric producer) { DRes<SInt> result = producer.advancedNumeric().product( Arrays.stream(inputAsArray) .map((integer) -> convertToSInt(integer, producer)) .collect(Collectors.toList())); return producer.numeric().open(result); } }
@Override public DRes<Result> buildComputation(ProtocolBuilderNumeric builder) { ArrayList<DRes<SInt>> row = updateMatrix.getRow(updateMatrix.getHeight() - 1); ArrayList<DRes<SInt>> column = new ArrayList<>(row.size()); column.addAll(tableau.getB()); column.add(tableau.getZ()); AdvancedNumeric advanced = builder.advancedNumeric(); DRes<SInt> numerator = advanced.innerProduct(row, column); DRes<SInt> invDenominator = advanced.invert(pivot); DRes<SInt> mult = builder.numeric().mult(numerator, invDenominator); return () -> new Result(mult.out(), numerator.out(), pivot.out()); }
@Override public DRes<SReal> div(DRes<SReal> a, BigDecimal b) { return builder.seq(seq -> { SFixed floatA = (SFixed) a.out(); DRes<SInt> intA = unscaled(seq, floatA, 2 * defaultPrecision); BigInteger unscaledB = unscaled(b, defaultPrecision); DRes<SInt> scaledResult = seq.advancedNumeric().div(intA, unscaledB); return new SFixed(scaledResult, defaultPrecision); }); }
@Override public DRes<SReal> div(DRes<SReal> a, DRes<SReal> b) { return builder.seq(seq -> { SFixed floatA = (SFixed) a.out(); SFixed floatB = (SFixed) b.out(); DRes<SInt> intA = unscaled(seq, floatA, 2 * defaultPrecision); DRes<SInt> intB = unscaled(seq, floatB, defaultPrecision); DRes<SInt> scaled = seq.advancedNumeric().div(intA, intB); return new SFixed(scaled, defaultPrecision); }); }
@Override public void test() { Application<BigInteger, ProtocolBuilderNumeric> app = producer -> { Numeric numeric = producer.numeric(); DRes<SInt> exponent = numeric.known(BigInteger.valueOf(exp)); DRes<SInt> result = producer.advancedNumeric().exp(input, exponent, 5); return numeric.open(result); }; BigInteger result = runApplication(app); Assert.assertEquals(BigInteger.valueOf(input).pow(exp), result); } };
@Override public DRes<List<SInt>> buildComputation(ProtocolBuilderNumeric builder) { return builder .seq((ignored) -> () -> new State(input, maxInputLength)) .whileLoop( (state) -> state.shifts > 0, (seq, state) -> { DRes<RightShiftResult> remainder = seq.advancedNumeric().rightShiftWithRemainder(state.currentInput); return () -> state.createNext(remainder.out()); }) .seq((seq, state) -> () -> state.remainders); }
@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 void test() { Application<BigInteger, ProtocolBuilderNumeric> app = builder -> { DRes<SInt> p = builder.numeric().known(BigInteger.valueOf(numerator)); DRes<SInt> result = builder.advancedNumeric().mod(p, denominator); return builder.numeric().open(result); }; BigInteger result = runApplication(app); Assert.assertEquals(BigInteger.valueOf(numerator % denominator), result); } };
@Override public void test() throws Exception { Application<BigInteger, ProtocolBuilderNumeric> app = producer -> { Numeric numeric = producer.numeric(); DRes<SInt> base = numeric.input(input, 1); DRes<SInt> exponent = numeric.input(BigInteger.valueOf(exp), 1); DRes<SInt> result = producer.advancedNumeric().exp(base, exponent, 5); return numeric.open(result); }; BigInteger result = runApplication(app); Assert.assertEquals(input.pow(exp), result); } };
@Override public DRes<SInt> buildComputation(ProtocolBuilderNumeric builder) { return builder.seq((seq) -> seq.advancedNumeric() .additiveMask(bitLength + securityParameter) ).seq((seq, mask) -> { DRes<SInt> mS = seq.numeric().add(input, () -> mask.random); DRes<BigInteger> mO = seq.numeric().open(mS); return () -> new Pair<>(mask.bits.subList(0, bitLength), mO.out()); }).seq((seq, pair) -> new HammingDistance(pair.getFirst(), pair.getSecond()).buildComputation(seq) ); } }