/// <summary> /// Verify the authenticate packet locally /// </summary> /// <param name="authenticatePacket">actual authenticate packet</param> /// <param name="authenticateInformation">expected authenticate information</param> /// <param name="exportedSessionKey">exported session key</param> /// <returns></returns> private ClientAuthenticateInfomation VerifyAuthenticatePacketLocally( NlmpAuthenticatePacket authenticatePacket, ClientAuthenticateInfomation authenticateInformation, out byte[] exportedSessionKey) { // valid user name if (authenticateInformation.UserName.ToUpper() != this.nlmpServer.Context.ClientCredential.AccountName.ToUpper()) { throw new InvalidOperationException( "the user name is invalid!" + " the user name retrieved form authenticate packet is not equal to the context."); } // calc the basekeys byte[] responseKeyLm; byte[] expectedNtChallengeResponse; byte[] expectedLmChallengeResponse; byte[] sessionBaseKey; byte[] keyExchangeKey; CalculateBaseKeys( authenticateInformation.ClientChallenge, this.systemTime, authenticateInformation.ServerName, authenticateInformation.DomainName, authenticateInformation.UserName, this.nlmpServer.Context.ClientCredential.Password, out responseKeyLm, out expectedNtChallengeResponse, out expectedLmChallengeResponse, out sessionBaseKey, out keyExchangeKey); // valid message ValidAuthenticateMessage(authenticatePacket, expectedNtChallengeResponse, expectedLmChallengeResponse); // generate keys. if (NlmpUtility.IsKeyExch(this.nlmpServer.Context.NegFlg)) { exportedSessionKey = NlmpUtility.RC4( keyExchangeKey, authenticatePacket.Payload.EncryptedRandomSessionKey); } else { exportedSessionKey = keyExchangeKey; } // validate mic byte[] messageMic = authenticatePacket.Payload.MIC; byte[] zeroMic = new byte[16]; if (messageMic != null && !ArrayUtility.CompareArrays <byte>(messageMic, zeroMic)) { AUTHENTICATE_MESSAGE payload = authenticatePacket.Payload; payload.MIC = zeroMic; authenticatePacket.Payload = payload; byte[] mic = NlmpUtility.GetMic(exportedSessionKey, this.negotiate, this.challenge, this.authenticate); if (!ArrayUtility.CompareArrays <byte>(messageMic, mic)) { throw new InvalidOperationException("mic of authenticate packet is invalid"); } } return(authenticateInformation); }