/// <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); }
/// <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); }
/// <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); }