Exemple #1
0
        public void Authenticate()
        {
            var clientFirstMessage = new ClientFirstMessage(_username, _nonce);

            Send(clientFirstMessage.Message);

            var serverFirstMessage = ServerFirstMessage.ParseResponse(Receive());
            var hashedPassword     = Hash.ComputeHash(Encoding.UTF8.GetBytes(_password), serverFirstMessage.Salt.Value,
                                                      serverFirstMessage.Iterations.Value);
            var clientKey = Hash.ComputeHash(Encoding.UTF8.GetBytes("Client Key"), hashedPassword);
            var serverKey = Hash.ComputeHash(Encoding.UTF8.GetBytes("Server Key"), hashedPassword);
            var storedKey = Hash.ComputeHash(clientKey);

            var clientFinalMessage = new ClientFinalMessage(clientFirstMessage, serverFirstMessage);
            var authMessage        =
                $"{clientFirstMessage.BareMessage},{serverFirstMessage},{clientFinalMessage.MessageWithoutProof}";
            var clientSignature = Hash.ComputeHash(Encoding.UTF8.GetBytes(authMessage), storedKey);
            var serverSignature = Hash.ComputeHash(Encoding.UTF8.GetBytes(authMessage), serverKey);
            var clientProof     = clientKey.ExclusiveOr(clientSignature);

            clientFinalMessage.SetProof(clientProof);

            Send(clientFinalMessage.Message);

            var serverFinalMessage = ServerFinalMessage.ParseResponse(Receive());

            if (!serverFinalMessage.ServerSignature.Equals(serverSignature))
            {
                throw new InvalidOperationException();
            }
        }
Exemple #2
0
 public void When_MessageDoesNotContainASignature_ParseShouldThrowAnException()
 {
     Should.Throw <MessageParseException>(() =>
     {
         var _ = ServerFinalMessage.Parse("r=invalid");
     });
 }
Exemple #3
0
 public void When_MessageAnError_ParseShouldThrowAnException()
 {
     Should.Throw <MessageParseException>(() =>
     {
         var _ = ServerFinalMessage.Parse("e=error");
     });
 }
Exemple #4
0
        public void When_ParsingAMessage_PropertiesShouldBeValid()
        {
            var message = ServerFinalMessage.Parse("v=rmF9pqV8S7suAoZWja4dJRkFsKQ=");

            message.ServerSignature?.Value.ShouldBe(HexToByte("ae617da6a57c4bbb2e0286568dae1d251905b0a4"));
        }