private static async Task RunSecureComputationPartyAsync(int localPartyId, BitArray localInput) { Console.WriteLine($"Starting party {localPartyId}..."); using IMultiPartyNetworkSession session = await TcpMultiPartyNetworkSession.EstablishLoopbackAsync( new Party (localPartyId), StartPort, NumberOfParties ); using CryptoContext cryptoContext = CryptoContext.CreateDefault(); IObliviousTransfer obliviousTransfer = new NaorPinkasObliviousTransfer( SecurityParameters.CreateDefault768Bit(), cryptoContext ); IMultiplicativeSharing multiplicativeSharing = new ObliviousTransferMultiplicativeSharing( obliviousTransfer, cryptoContext ); SecretSharingSecureComputation computation = new SecretSharingSecureComputation( session, multiplicativeSharing, cryptoContext ); Stopwatch stopwatch = Stopwatch.StartNew(); SetIntersectionSecureProgram secureProgram = new SetIntersectionSecureProgram(NumberOfParties, NumberOfElements); object[] outputPrimitives = await secureProgram.EvaluateAsync(computation, new object[] { localInput }); BitArray intersection = (BitArray)outputPrimitives[0]; BigInteger count = (BigInteger)outputPrimitives[1]; stopwatch.Stop(); Console.WriteLine(); Console.WriteLine($"Completed protocol as {session.LocalParty.Name} in {stopwatch.ElapsedMilliseconds} ms."); Console.WriteLine($" Local input: {localInput.ToBinaryString()}"); Console.WriteLine($" Computed intersection: {intersection.ToBinaryString()}"); Console.WriteLine($" Computed number of matches: {count}"); Console.WriteLine(); Console.WriteLine("Press any key to exit."); Console.ReadKey(true); }
private static void PerformSecureComputation(IMultiPartyNetworkSession session, BitArray expectedOutput) { BitArray localInput = Inputs[session.LocalParty.Id]; using CryptoContext cryptoContext = CryptoContext.CreateDefault(); IObliviousTransfer obliviousTransfer = new NaorPinkasObliviousTransfer( new SecurityParameters(47, 23, 4, 1, 1), cryptoContext ); IMultiplicativeSharing multiplicativeSharing = new ObliviousTransferMultiplicativeSharing( obliviousTransfer, cryptoContext ); SecretSharingSecureComputation computation = new SecretSharingSecureComputation( session, multiplicativeSharing, cryptoContext ); SetIntersectionCircuitRecorder circuitRecorder = new SetIntersectionCircuitRecorder( session.NumberOfParties, localInput.Length ); CircuitBuilder circuitBuilder = new CircuitBuilder(); circuitRecorder.Record(circuitBuilder); ForwardCircuit circuit = new ForwardCircuit(circuitBuilder.CreateCircuit()); BitArray actualOutput = computation .EvaluateAsync(circuit, circuitRecorder.InputMapping, circuitRecorder.OutputMapping, localInput) .Result; EnumerableAssert.AreEqual( expectedOutput, actualOutput ); }