Ejemplo n.º 1
0
        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++;
        }
Ejemplo n.º 2
0
        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;
            }
        }
Ejemplo n.º 3
0
        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;
        }
Ejemplo n.º 4
0
        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;
        }
Ejemplo n.º 5
0
        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++;
        }
Ejemplo n.º 6
0
        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();
        }
Ejemplo n.º 7
0
        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;
            }
        }
Ejemplo n.º 8
0
        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++;
        }
Ejemplo n.º 9
0
 private void CollectGateEvaluation(SubProtocolCompletedMsg msg)
 {
     OutputShares = (T[])msg.SingleResult;
     Debug.Assert(OutputShares.Length == EvalGate.OutputCount);
 }