/// <summary> /// get the security token,using the token from server /// </summary> /// <param name="serverToken">the token from server challenge</param> /// <returns>the security token</returns> private byte[] GetSecurityToken( byte[] serverToken ) { if (this.client == null) { throw new InvalidOperationException("The client is null! You must initialize this field first!"); } // the challenge packet from server NlmpChallengePacket challenge = new NlmpChallengePacket(serverToken); NegotiateTypes flags = InitializeNegotiateFlags(challenge.Payload.NegotiateFlags); // the target info ICollection <AV_PAIR> targetInfo = InitializeTargetInfo(challenge.Payload.TargetInfo); // responseKeyLM byte[] responseKeyLM; // lmChallengeResponse byte[] lmChallengeResponse; // ntChallengeResponse byte[] ntChallengeResponse; // initialize the challenge response InitializeChallengeResponse( flags, challenge, targetInfo, out responseKeyLM, out lmChallengeResponse, out ntChallengeResponse); // encryptedRandomSessionKey byte[] encryptedRandomSessionKey = null; // exportedSessionKey byte[] exportedSessionKey = null; // initialize keys InitializeKeys( flags, challenge, responseKeyLM, lmChallengeResponse, out encryptedRandomSessionKey, out exportedSessionKey); // save the exported sessionkey this.client.Context.ExportedSessionKey = exportedSessionKey; // create challenge packet NlmpAuthenticatePacket packet = this.client.CreateAuthenticatePacket( flags, NlmpUtility.GetVersion(), lmChallengeResponse, ntChallengeResponse, this.currentActiveCredential.DomainName, this.currentActiveCredential.AccountName, Environment.MachineName, encryptedRandomSessionKey); // initialize the mic of challenge packet InitializeChallengeMIC(exportedSessionKey, targetInfo, packet, challenge); return(packet.ToBytes()); }
/// <summary> /// get the security token /// </summary> /// <returns>the security token</returns> private byte[] GetSecurityToken(string workstationName) { if (this.client == null) { throw new InvalidOperationException("The client is null! You must initialize this field first!"); } // get current version VERSION version = NlmpUtility.GetVersion(); NlmpNegotiatePacket packet = this.client.CreateNegotiatePacket( this.Context.ClientConfigFlags, version, this.currentActiveCredential.DomainName, workstationName); this.negotiate = packet; return(packet.ToBytes()); }
/// <summary> /// Update ServerChallenge to this context /// </summary> /// <param name="serverChallenge">the serverChallenge to update</param> public void UpdateServerChallenge(ulong serverChallenge) { #region Prepare the Nlmp Negotiate Flags // the flags for negotiage NegotiateTypes nlmpFlags = NegotiateTypes.NTLMSSP_NEGOTIATE_NTLM | NegotiateTypes.NTLM_NEGOTIATE_OEM; #endregion #region Prepare the ServerName List <AV_PAIR> pairs = new List <AV_PAIR>(); NlmpUtility.AddAVPair(pairs, AV_PAIR_IDs.MsvAvEOL, 0x00, null); #endregion this.challenge = this.nlmpServer.CreateChallengePacket(nlmpFlags, NlmpUtility.GetVersion(), serverChallenge, GenerateTargetName(), pairs); this.token = this.challenge.ToBytes(); }
/// <summary> /// accept the negotiate packet, generated the challenge packet. /// </summary> /// <param name="negotiatePacket">the negotiate packet</param> private void AcceptNegotiatePacket(NlmpNegotiatePacket negotiatePacket) { // save the negotiate, to valid the mic when authenticate. this.negotiate = negotiatePacket; // generated negotiate flags for challenge packet NegotiateTypes negotiateFlags = GeneratedNegotiateFlags(negotiatePacket); // initialize target name string targetName = GenerateTargetName(); // initialize av pairs. ICollection <AV_PAIR> targetInfo = GenerateTargetInfo(); VERSION sspiVersion = NlmpUtility.GetVersion(); // the serverChallenge is 8 bytes. ulong serverChallenge = BitConverter.ToUInt64(NlmpUtility.Nonce(8), 0); NlmpChallengePacket challengePacket = this.nlmpServer.CreateChallengePacket( negotiateFlags, sspiVersion, serverChallenge, targetName, targetInfo); this.challenge = challengePacket; this.token = challengePacket.ToBytes(); }