public ISaslStep Transition(SaslConversation conversation, byte[] bytesReceivedFromServer) { // Even though RFC says that clients should specifically check this and raise an error // if it isn't true, this breaks on Windows XP, so we are skipping the check for windows // XP, identified as Win32NT 5.1: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724832(v=vs.85).aspx if (Environment.OSVersion.Platform != PlatformID.Win32NT || Environment.OSVersion.Version.Major != 5) { if (bytesReceivedFromServer == null || bytesReceivedFromServer.Length != 32) //RFC specifies this must be 4 octets { throw new MongoAuthenticationException(conversation.ConnectionId, message: "Invalid server response."); } } byte[] decryptedBytes; try { _context.DecryptMessage(0, bytesReceivedFromServer, out decryptedBytes); } catch (Win32Exception ex) { throw new MongoAuthenticationException(conversation.ConnectionId, "Unabled to decrypt message.", ex); } int length = 4; if (_authorizationId != null) { length += _authorizationId.Length; } bytesReceivedFromServer = new byte[length]; bytesReceivedFromServer[0] = 0x1; // NO_PROTECTION bytesReceivedFromServer[1] = 0x0; // NO_PROTECTION bytesReceivedFromServer[2] = 0x0; // NO_PROTECTION bytesReceivedFromServer[3] = 0x0; // NO_PROTECTION if (_authorizationId != null) { var authorizationIdBytes = Encoding.UTF8.GetBytes(_authorizationId); authorizationIdBytes.CopyTo(bytesReceivedFromServer, 4); } byte[] bytesToSendToServer; try { _context.EncryptMessage(bytesReceivedFromServer, out bytesToSendToServer); } catch (Win32Exception ex) { throw new MongoAuthenticationException(conversation.ConnectionId, "Unabled to encrypt message.", ex); } return(new CompletedStep(bytesToSendToServer)); }
public ISaslStep Transition(SaslConversation conversation, byte[] bytesReceivedFromServer) { byte[] decryptedBytes; try { _context.DecryptMessage(0, bytesReceivedFromServer, out decryptedBytes); } catch (Win32Exception ex) { throw new MongoAuthenticationException(conversation.ConnectionId, "Unabled to decrypt message.", ex); } int length = 4; if (_authorizationId != null) { length += _authorizationId.Length; } bytesReceivedFromServer = new byte[length]; bytesReceivedFromServer[0] = 0x1; // NO_PROTECTION bytesReceivedFromServer[1] = 0x0; // NO_PROTECTION bytesReceivedFromServer[2] = 0x0; // NO_PROTECTION bytesReceivedFromServer[3] = 0x0; // NO_PROTECTION if (_authorizationId != null) { var authorizationIdBytes = Encoding.UTF8.GetBytes(_authorizationId); authorizationIdBytes.CopyTo(bytesReceivedFromServer, 4); } byte[] bytesToSendToServer; try { _context.EncryptMessage(bytesReceivedFromServer, out bytesToSendToServer); } catch (Win32Exception ex) { throw new MongoAuthenticationException(conversation.ConnectionId, "Unabled to encrypt message.", ex); } return(new CompletedStep(bytesToSendToServer)); }