public override void HandleMessage(int fromId, Msg msg) { Debug.Assert(msg.Type == MsgType.SubProtocolCompleted); SubProtocolCompletedMsg completedMsg = msg as SubProtocolCompletedMsg; switch (Stage) { case 0: BitProd = (Share <BigZp>)completedMsg.SingleResult; ExecuteSubProtocol(new ShareAdditionProtocol(Me, Quorum, BitA, BitB)); break; case 1: BitSum = (Share <BigZp>)completedMsg.SingleResult; var tempShare = new Share <BigZp>(new BigZp(BitProd.Value.Prime, 2) * (BitProd.Value.AdditiveInverse), BitProd.IsPublic); ExecuteSubProtocol(new ShareAdditionProtocol(Me, Quorum, BitSum, tempShare)); break; case 2: Result = (Share <BigZp>)completedMsg.SingleResult; IsCompleted = true; break; } Stage++; }
public override void HandleMessage(int fromId, Msg msg) { if (Stage == 0) { ReceiveShareStage(msg); if (SharesReceived == EvalGate.InputCount) { StartGateEvaluation(); } } else if (Stage == 1) { Debug.Assert(msg.Type == MsgType.SubProtocolCompleted); var completedMsg = (SubProtocolCompletedMsg)msg; CollectGateEvaluation(completedMsg); SendShareStage(); } else if (Stage == 2) { // we loopback any shares that go to me in a different quorum. Debug.Assert(msg is SubProtocolCompletedMsg); SubProtocolCompletedMsg completedMsg = (SubProtocolCompletedMsg)msg; foreach (var loopback in OutputLoopbacksNeeded) { ulong counterpartEvalId = ProtocolIdGenerator.GateEvalIdentifier(loopback.Value.Gate.TopologicalRank); T loopbackVal = (T)completedMsg.Result[loopback.Key]; NetSimulator.Loopback(Me.Id, counterpartEvalId, new LoopbackMsg <T>(loopbackVal, loopback.Value.Port)); } IsCompleted = true; } }
public override void HandleMessage(int fromId, Msg msg) { Debug.Assert(msg.Type == MsgType.SubProtocolCompleted); SubProtocolCompletedMsg completedMsg = msg as SubProtocolCompletedMsg; Result = completedMsg.ResultList.Cast <Share <BigZp> >().ToList(); IsCompleted = true; }
public override void HandleMessage(int fromId, Msg msg) { Debug.Assert(msg.Type == MsgType.SubProtocolCompleted); SubProtocolCompletedMsg completedMsg = msg as SubProtocolCompletedMsg; Result = (Share <BigZp>)completedMsg.SingleResult; IsCompleted = true; }
public override void HandleMessage(int fromId, Msg msg) { Debug.Assert(msg is SubProtocolCompletedMsg); SubProtocolCompletedMsg completedMsg = msg as SubProtocolCompletedMsg; switch (Stage) { case 0: BitwiseRand = (List <Share <BigZp> >)completedMsg.SingleResult; ExecuteSubProtocol(new BitCompositionProtocol(Me, Quorum, BitwiseRand, Prime)); break; case 1: Rand = (Share <BigZp>)completedMsg.SingleResult; ExecuteSubProtocol(new ShareAdditionProtocol(Me, Quorum, Rand, Share)); break; case 2: PaddedShare = (Share <BigZp>)completedMsg.SingleResult; ExecuteSubProtocol(new ReconstructionProtocol(Me, Quorum, PaddedShare)); break; case 3: RevealedPadded = (BigZp)completedMsg.SingleResult; BigZp lowBit = new BigZp(Prime, RevealedPadded.Value.IsEven ? 0 : 1); ExecuteSubProtocol(new SharedBitXor(Me, Quorum, new Share <BigZp>(lowBit, true), BitwiseRand[0])); break; case 4: X = (Share <BigZp>)completedMsg.SingleResult; var bitwiseRevealedPadded = NumTheoryUtils.GetBitDecomposition(RevealedPadded.Value, Prime, BitwiseRand.Count); var bitwiseRevealedPaddedShares = new List <Share <BigZp> >(); foreach (var bit in bitwiseRevealedPadded) { bitwiseRevealedPaddedShares.Add(new Share <BigZp>(bit, true)); } ExecuteSubProtocol(new BitwiseLessThanProtocol(Me, Quorum, bitwiseRevealedPaddedShares, BitwiseRand)); break; case 5: Y = (Share <BigZp>)completedMsg.SingleResult; ExecuteSubProtocol(new SharedBitXor(Me, Quorum, X, Y)); break; case 6: Result = (Share <BigZp>)completedMsg.SingleResult; IsCompleted = true; break; } Stage++; }
public override void HandleMessage(int fromId, Msg msg) { Debug.Assert(msg is SubProtocolCompletedMsg); SubProtocolCompletedMsg completedMsg = msg as SubProtocolCompletedMsg; Result.Add((Share <BigZp>)completedMsg.SingleResult); WhichBit--; ExecuteNextIfNeeded(); }
public override void HandleMessage(int fromId, Msg msg) { Debug.Assert(msg is SubProtocolCompletedMsg); SubProtocolCompletedMsg completedMsg = msg as SubProtocolCompletedMsg; switch (Stage) { case 0: Result = completedMsg.ResultList.Cast <Share <BigZp> >().ToList(); if (Max.IsPowerOfTwo) { // we automatically know the number we generated is in the range IsCompleted = true; } else { var maxBits = NumTheoryUtils.GetBitDecomposition(Max, Prime); var maxBitsShares = new List <Share <BigZp> >(); foreach (var bit in maxBits) { maxBitsShares.Add(new Share <BigZp>(bit, true)); } ExecuteSubProtocol(new BitwiseLessThanProtocol(Me, Quorum, Result, maxBitsShares)); Stage++; } break; case 1: // Reveal (r < p) ExecuteSubProtocol(new ReconstructionProtocol(Me, Quorum, (Share <BigZp>)completedMsg.SingleResult)); Stage++; break; case 2: // If (r < p), then we're done. Otherwise, we should retry since the generated random value is not in the field. if (((BigZp)completedMsg.SingleResult).Value == 1) { IsCompleted = true; } else { // try again :( Result.Clear(); Start(); } break; } }
public override void HandleMessage(int fromId, Msg msg) { Debug.Assert(msg is SubProtocolCompletedMsg); SubProtocolCompletedMsg completedMsg = msg as SubProtocolCompletedMsg; var stageResult = (List <Share <BigZp> >)completedMsg.SingleResult; switch (Stage) { case 0: C = stageResult; ExecuteSubProtocol(new PrefixOperationProtocol(Me, Quorum, C, new SharedBitOr.ProtocolFactory(Me, Quorum))); break; case 1: D = stageResult; ExecuteSubtractionStep(); break; case 2: E = stageResult; E.Add(D[D.Count - 1]); // add the high order bit since it didn't do subtraction ExecuteSubProtocol(new BitwiseOperationProtocol(Me, Quorum, BitSharesB, E, new ShareMultiplicationProtocol.ProtocolFactory(Me, Quorum))); break; case 3: y = stageResult; // use the prefix protocol with addition, to add all shares together, and then grab the lowest order value ExecuteSubProtocol(new PrefixOperationProtocol(Me, Quorum, y, new ShareAdditionProtocol.ProtocolFactory(Me, Quorum))); break; case 4: Result = stageResult[0]; IsCompleted = true; break; } Stage++; }
private void CollectGateEvaluation(SubProtocolCompletedMsg msg) { OutputShares = (T[])msg.SingleResult; Debug.Assert(OutputShares.Length == EvalGate.OutputCount); }