Beispiel #1
0
            public ISaslStep Transition(SaslConversation conversation, byte[] bytesReceivedFromServer)
            {
                var encoding        = Utf8Encodings.Strict;
                var map             = NVParser.Parse(encoding.GetString(bytesReceivedFromServer));
                var serverSignature = Convert.FromBase64String(map['v']);

                if (!ConstantTimeEquals(_serverSignature64, serverSignature))
                {
                    throw new MongoAuthenticationException(conversation.ConnectionId, message: "Server signature was invalid.");
                }

                return(new CompletedStep());
            }
Beispiel #2
0
            public ISaslStep Transition(SaslConversation conversation, byte[] bytesReceivedFromServer)
            {
                var encoding = new UTF8Encoding(false, true);
                var map      = NVParser.Parse(encoding.GetString(bytesReceivedFromServer));

                var serverSignature = map['v'];

                if (_serverSignature64 != serverSignature)
                {
                    throw new AuthenticationException("Server signature was invalid.");
                }

                return(new CompletedStep());
            }
Beispiel #3
0
            public ISaslStep Transition(SaslConversation conversation, byte[] bytesReceivedFromServer)
            {
                var encoding           = Utf8Encodings.Strict;
                var serverFirstMessage = encoding.GetString(bytesReceivedFromServer);
                var map = NVParser.Parse(serverFirstMessage);

                var r = map['r'];

                if (!r.StartsWith(_rPrefix))
                {
                    throw new MongoAuthenticationException(conversation.ConnectionId, message: "Server sent an invalid nonce.");
                }
                var s = map['s'];
                var i = map['i'];

                const string gs2Header      = "n,,";
                var          channelBinding = "c=" + Convert.ToBase64String(encoding.GetBytes(gs2Header));
                var          nonce          = "r=" + r;
                var          clientFinalMessageWithoutProof = channelBinding + "," + nonce;

                var saltedPassword = Hi(
                    AuthenticationHelper.MongoPasswordDigest(_credential.Username, _credential.Password),
                    Convert.FromBase64String(s),
                    int.Parse(i));

                var clientKey       = HMAC(encoding, saltedPassword, "Client Key");
                var storedKey       = H(clientKey);
                var authMessage     = _clientFirstMessageBare + "," + serverFirstMessage + "," + clientFinalMessageWithoutProof;
                var clientSignature = HMAC(encoding, storedKey, authMessage);
                var clientProof     = XOR(clientKey, clientSignature);
                var serverKey       = HMAC(encoding, saltedPassword, "Server Key");
                var serverSignature = HMAC(encoding, serverKey, authMessage);

                var proof = "p=" + Convert.ToBase64String(clientProof);
                var clientFinalMessage = clientFinalMessageWithoutProof + "," + proof;

                return(new ClientLast(encoding.GetBytes(clientFinalMessage), serverSignature));
            }