Exemplo n.º 1
0
        /// <summary>
        /// Implementation of the test itself.
        /// </summary>
        /// <returns>true if the test passes, false otherwise.</returns>
        public override async Task <bool> RunAsync()
        {
            IPAddress NodeIp            = (IPAddress)ArgumentValues["Node IP"];
            int       ClNonCustomerPort = (int)ArgumentValues["clNonCustomer Port"];

            log.Trace("(NodeIp:'{0}',ClNonCustomerPort:{1})", NodeIp, ClNonCustomerPort);

            bool res = false;

            Passed = false;

            ProtocolClient client = new ProtocolClient();

            try
            {
                MessageBuilder mb = client.MessageBuilder;

                // Step 1
                await client.ConnectAsync(NodeIp, ClNonCustomerPort, true);

                VerifyIdentityRequest verifyIdentityRequest = new VerifyIdentityRequest();

                Message requestMessage = mb.CreateConversationRequest();
                requestMessage.Request.ConversationRequest.VerifyIdentity = verifyIdentityRequest;

                mb.SignConversationRequestBody(requestMessage, verifyIdentityRequest);

                await client.SendMessageAsync(requestMessage);

                Message responseMessage = await client.ReceiveMessageAsync();

                bool idOk     = responseMessage.Id == requestMessage.Id;
                bool statusOk = responseMessage.Response.Status == Status.ErrorBadConversationStatus;

                // Step 1 Acceptance
                Passed = idOk && statusOk;

                res = true;
            }
            catch (Exception e)
            {
                log.Error("Exception occurred: {0}", e.ToString());
            }
            client.Dispose();

            log.Trace("(-):{0}", res);
            return(res);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Processes VerifyIdentityRequest message from client.
        /// <para>It verifies the identity's public key against the signature of the challenge provided during the start of the conversation.
        /// If everything is OK, the status of the conversation is upgraded to Verified.</para>
        /// </summary>
        /// <param name="Client">Client that sent the request.</param>
        /// <param name="RequestMessage">Full request message.</param>
        /// <returns>Response message to be sent to the client.</returns>
        public ProxProtocolMessage ProcessMessageVerifyIdentityRequest(IncomingClient Client, ProxProtocolMessage RequestMessage)
        {
            log.Trace("()");

            ProxProtocolMessage res = null;

            if (!CheckSessionConditions(Client, RequestMessage, ServerRole.Client | ServerRole.Neighbor, ClientConversationStatus.ConversationStarted, out res))
            {
                log.Trace("(-):*.Response.Status={0}", res.Response.Status);
                return(res);
            }


            ProxMessageBuilder    messageBuilder        = Client.MessageBuilder;
            VerifyIdentityRequest verifyIdentityRequest = RequestMessage.Request.ConversationRequest.VerifyIdentity;

            byte[] challenge = verifyIdentityRequest.Challenge.ToByteArray();
            if (StructuralEqualityComparer <byte[]> .Default.Equals(challenge, Client.AuthenticationChallenge))
            {
                if (messageBuilder.VerifySignedConversationRequestBody(RequestMessage, verifyIdentityRequest, Client.PublicKey))
                {
                    log.Debug("Identity '{0}' successfully verified its public key.", Client.IdentityId.ToHex());
                    Client.ConversationStatus = ClientConversationStatus.Verified;
                    res = messageBuilder.CreateVerifyIdentityResponse(RequestMessage);
                }
                else
                {
                    log.Warn("Client's challenge signature is invalid.");
                    res = messageBuilder.CreateErrorInvalidSignatureResponse(RequestMessage);
                }
            }
            else
            {
                log.Warn("Challenge provided in the request does not match the challenge created by the proximity server.");
                res = messageBuilder.CreateErrorInvalidValueResponse(RequestMessage, "challenge");
            }

            log.Trace("(-):*.Response.Status={0}", res.Response.Status);
            return(res);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Processes VerifyIdentityRequest message from client.
        /// <para>It verifies the identity's public key against the signature of the challenge provided during the start of the conversation.
        /// If everything is OK, the status of the conversation is upgraded to Verified.</para>
        /// </summary>
        /// <param name="Client">Client that sent the request.</param>
        /// <param name="RequestMessage">Full request message.</param>
        /// <returns>Response message to be sent to the client.</returns>
        public Message ProcessMessageVerifyIdentityRequest(IncomingClient Client, Message RequestMessage)
        {
            log.Trace("()");

            MessageBuilder messageBuilder = Client.MessageBuilder;
            Message        res            = messageBuilder.CreateErrorBadRoleResponse(RequestMessage);

            if ((Client.ServerRole != ServerRole.ServerNeighbor) && (Client.ServerRole != ServerRole.ClientNonCustomer))
            {
                log.Trace("(-):*.Response.Status={0}", res.Response.Status);
                return(res);
            }

            VerifyIdentityRequest verifyIdentityRequest = RequestMessage.Request.ConversationRequest.VerifyIdentity;

            byte[] challenge = verifyIdentityRequest.Challenge.ToByteArray();
            log.Debug("Identity '{0}' successfully verified its public key.", Crypto.ToHex(Client.IdentityId));
            Client.ConversationStatus = ClientConversationStatus.Verified;
            res = messageBuilder.CreateVerifyIdentityResponse(RequestMessage);

            log.Trace("(-):*.Response.Status={0}", res.Response.Status);
            return(res);
        }