Ejemplo n.º 1
0
        private void AddFinished(OutgoingMessageBag outgoingMessages)
        {
            m_localHash.TransformFinalBlock(new byte[0], 0, 0);

              byte[] seed = m_localHash.Hash;
              m_localHash.Dispose();
              m_localHash = null;

              string label;

              if (SecurityParameters.Entity == ConnectionEnd.Server)
              {
            label = ServerFinishedLabel;
              }
              else
              {
            label = ClientFinshedLabel;
              }

              FinishedMessage finishedMessage = new FinishedMessage();

              finishedMessage.VerifyData =
            PRF.Get(SecurityParameters.MasterSecret, label, seed, FinishedMessage.VerifyDataLength);

              NetMQMessage outgoingMessage = finishedMessage.ToNetMQMessage();
              outgoingMessages.AddHandshakeMessage(outgoingMessage);
            m_lastSentMessage = HandshakeType.Finished;

              if (SecurityParameters.Entity == ConnectionEnd.Client)
              {
            HashRemote(outgoingMessage);
              }
        }
Ejemplo n.º 2
0
        private void OnFinished(NetMQMessage incomingMessage, OutgoingMessageBag outgoingMessages)
        {
            if (
                (SecurityParameters.Entity == ConnectionEnd.Client &&
                (!m_secureChannel.ChangeSuiteChangeArrived ||
                    m_lastReceivedMessage != HandshakeType.ServerHelloDone || m_lastSentMessage != HandshakeType.Finished)) ||
                (SecurityParameters.Entity == ConnectionEnd.Server &&
                (!m_secureChannel.ChangeSuiteChangeArrived ||
                m_lastReceivedMessage != HandshakeType.ClientKeyExchange || m_lastSentMessage != HandshakeType.ServerHelloDone)))
            {
                throw new NetMQSecurityException(NetMQSecurityErrorCode.HandshakeUnexpectedMessage, "Finished received when expecting another message");
            }

              if (SecurityParameters.Entity == ConnectionEnd.Server)
              {
            HashLocal(incomingMessage);
              }

              FinishedMessage finishedMessage = new FinishedMessage();
              finishedMessage.SetFromNetMQMessage(incomingMessage);

              m_remoteHash.TransformFinalBlock(new byte[0], 0, 0);

              byte[] seed = m_remoteHash.Hash;
              m_remoteHash.Dispose();
              m_remoteHash = null;

              string label;

              if (SecurityParameters.Entity == ConnectionEnd.Client)
              {
            label = ServerFinishedLabel;
              }
              else
              {
            label = ClientFinshedLabel;
              }

              byte[] verifyData =
            PRF.Get(SecurityParameters.MasterSecret, label, seed, FinishedMessage.VerifyDataLength);

              if (!verifyData.SequenceEqual(finishedMessage.VerifyData))
              {
            throw  new NetMQSecurityException(NetMQSecurityErrorCode.HandshakeVerifyData, "peer verify data wrong");
              }

              if (SecurityParameters.Entity == ConnectionEnd.Server)
              {
            AddFinished(outgoingMessages);
              }

              m_done = true;
        }
Ejemplo n.º 3
0
        private void AddFinished(OutgoingMessageBag outgoingMessages)
        {
            m_localHash.TransformFinalBlock(EmptyArray<byte>.Instance, 0, 0);

            byte[] seed = m_localHash.Hash;
            m_localHash.Dispose();
            m_localHash = null;

            var label = SecurityParameters.Entity == ConnectionEnd.Server ? ServerFinishedLabel : ClientFinshedLabel;

            var finishedMessage = new FinishedMessage
            {
                VerifyData = PRF.Get(SecurityParameters.MasterSecret, label, seed, FinishedMessage.VerifyDataLength)
            };

            NetMQMessage outgoingMessage = finishedMessage.ToNetMQMessage();
            outgoingMessages.AddHandshakeMessage(outgoingMessage);
            m_lastSentMessage = HandshakeType.Finished;

            if (SecurityParameters.Entity == ConnectionEnd.Client)
            {
                HashRemote(outgoingMessage);
            }
        }