public override byte[] Encode () { var target = EncodeString (domain); var user = EncodeString (Username); var hostName = EncodeString (host); byte[] lm, ntlm; if (type2 == null) { if (Level != NtlmAuthLevel.LM_and_NTLM) throw new InvalidOperationException ("Refusing to use legacy-mode LM/NTLM authentication unless explicitly enabled using NtlmSettings.DefaultAuthLevel."); using (var legacy = new ChallengeResponse (Password, challenge)) { lm = legacy.LM; ntlm = legacy.NT; } } else { ChallengeResponse2.Compute (type2, Level, Username, Password, domain, out lm, out ntlm); } var lmResponseLength = lm != null ? lm.Length : 0; var ntResponseLength = ntlm != null ? ntlm.Length : 0; var data = PrepareMessage (64 + target.Length + user.Length + hostName.Length + lmResponseLength + ntResponseLength); // LM response short lmResponseOffset = (short) (64 + target.Length + user.Length + hostName.Length); data[12] = (byte) lmResponseLength; data[13] = (byte) 0x00; data[14] = data[12]; data[15] = data[13]; data[16] = (byte) lmResponseOffset; data[17] = (byte) (lmResponseOffset >> 8); // NT response short ntResponseOffset = (short) (lmResponseOffset + lmResponseLength); data[20] = (byte) ntResponseLength; data[21] = (byte) (ntResponseLength >> 8); data[22] = data[20]; data[23] = data[21]; data[24] = (byte) ntResponseOffset; data[25] = (byte) (ntResponseOffset >> 8); // target short domainLength = (short) target.Length; const short domainOffset = 64; data[28] = (byte) domainLength; data[29] = (byte) (domainLength >> 8); data[30] = data[28]; data[31] = data[29]; data[32] = (byte) domainOffset; data[33] = (byte) (domainOffset >> 8); // username short userLength = (short) user.Length; short userOffset = (short) (domainOffset + domainLength); data[36] = (byte) userLength; data[37] = (byte) (userLength >> 8); data[38] = data[36]; data[39] = data[37]; data[40] = (byte) userOffset; data[41] = (byte) (userOffset >> 8); // host short hostLength = (short) hostName.Length; short hostOffset = (short) (userOffset + userLength); data[44] = (byte) hostLength; data[45] = (byte) (hostLength >> 8); data[46] = data[44]; data[47] = data[45]; data[48] = (byte) hostOffset; data[49] = (byte) (hostOffset >> 8); // message length short messageLength = (short) data.Length; data[56] = (byte) messageLength; data[57] = (byte) (messageLength >> 8); // options flags data [60] = (byte) Flags; data [61] = (byte)((uint) Flags >> 8); data [62] = (byte)((uint) Flags >> 16); data [63] = (byte)((uint) Flags >> 24); Buffer.BlockCopy (target, 0, data, domainOffset, target.Length); Buffer.BlockCopy (user, 0, data, userOffset, user.Length); Buffer.BlockCopy (hostName, 0, data, hostOffset, hostName.Length); if (lm != null) { Buffer.BlockCopy (lm, 0, data, lmResponseOffset, lm.Length); Array.Clear (lm, 0, lm.Length); } if (ntlm != null) { Buffer.BlockCopy (ntlm, 0, data, ntResponseOffset, ntlm.Length); Array.Clear (ntlm, 0, ntlm.Length); } return data; }
public override byte[] Encode() { var target = EncodeString(domain); var user = EncodeString(Username); var hostName = EncodeString(host); byte[] lm, ntlm; if (type2 == null) { if (Level != NtlmAuthLevel.LM_and_NTLM) { throw new InvalidOperationException("Refusing to use legacy-mode LM/NTLM authentication unless explicitly enabled using NtlmSettings.DefaultAuthLevel."); } using (var legacy = new ChallengeResponse(Password, challenge)) { lm = legacy.LM; ntlm = legacy.NT; } } else { ChallengeResponse2.Compute(type2, Level, Username, Password, domain, out lm, out ntlm); } var lmResponseLength = lm != null ? lm.Length : 0; var ntResponseLength = ntlm != null ? ntlm.Length : 0; var data = PrepareMessage(64 + target.Length + user.Length + hostName.Length + lmResponseLength + ntResponseLength); // LM response short lmResponseOffset = (short)(64 + target.Length + user.Length + hostName.Length); data[12] = (byte)lmResponseLength; data[13] = (byte)0x00; data[14] = data[12]; data[15] = data[13]; data[16] = (byte)lmResponseOffset; data[17] = (byte)(lmResponseOffset >> 8); // NT response short ntResponseOffset = (short)(lmResponseOffset + lmResponseLength); data[20] = (byte)ntResponseLength; data[21] = (byte)(ntResponseLength >> 8); data[22] = data[20]; data[23] = data[21]; data[24] = (byte)ntResponseOffset; data[25] = (byte)(ntResponseOffset >> 8); // target short domainLength = (short)target.Length; const short domainOffset = 64; data[28] = (byte)domainLength; data[29] = (byte)(domainLength >> 8); data[30] = data[28]; data[31] = data[29]; data[32] = (byte)domainOffset; data[33] = (byte)(domainOffset >> 8); // username short userLength = (short)user.Length; short userOffset = (short)(domainOffset + domainLength); data[36] = (byte)userLength; data[37] = (byte)(userLength >> 8); data[38] = data[36]; data[39] = data[37]; data[40] = (byte)userOffset; data[41] = (byte)(userOffset >> 8); // host short hostLength = (short)hostName.Length; short hostOffset = (short)(userOffset + userLength); data[44] = (byte)hostLength; data[45] = (byte)(hostLength >> 8); data[46] = data[44]; data[47] = data[45]; data[48] = (byte)hostOffset; data[49] = (byte)(hostOffset >> 8); // message length short messageLength = (short)data.Length; data[56] = (byte)messageLength; data[57] = (byte)(messageLength >> 8); // options flags data [60] = (byte)Flags; data [61] = (byte)((uint)Flags >> 8); data [62] = (byte)((uint)Flags >> 16); data [63] = (byte)((uint)Flags >> 24); Buffer.BlockCopy(target, 0, data, domainOffset, target.Length); Buffer.BlockCopy(user, 0, data, userOffset, user.Length); Buffer.BlockCopy(hostName, 0, data, hostOffset, hostName.Length); if (lm != null) { Buffer.BlockCopy(lm, 0, data, lmResponseOffset, lm.Length); Array.Clear(lm, 0, lm.Length); } if (ntlm != null) { Buffer.BlockCopy(ntlm, 0, data, ntResponseOffset, ntlm.Length); Array.Clear(ntlm, 0, ntlm.Length); } return(data); }
public override byte[] Encode() { var target = EncodeString(domain); var user = EncodeString(Username); var hostName = EncodeString(host); var payloadOffset = 64; bool reqVersion; byte[] lm, ntlm; if (type2 == null) { if (Level != NtlmAuthLevel.LM_and_NTLM) { throw new InvalidOperationException("Refusing to use legacy-mode LM/NTLM authentication unless explicitly enabled using NtlmSettings.DefaultAuthLevel."); } using (var legacy = new ChallengeResponse(Password, challenge)) { lm = legacy.LM; ntlm = legacy.NT; } reqVersion = false; } else { ChallengeResponse2.Compute(type2, Level, Username, Password, domain, out lm, out ntlm); if ((reqVersion = (type2.Flags & NtlmFlags.NegotiateVersion) != 0)) { payloadOffset += 8; } } var lmResponseLength = lm != null ? lm.Length : 0; var ntResponseLength = ntlm != null ? ntlm.Length : 0; var data = PrepareMessage(payloadOffset + target.Length + user.Length + hostName.Length + lmResponseLength + ntResponseLength); // LM response short lmResponseOffset = (short)(payloadOffset + target.Length + user.Length + hostName.Length); data[12] = (byte)lmResponseLength; data[13] = (byte)0x00; data[14] = data[12]; data[15] = data[13]; data[16] = (byte)lmResponseOffset; data[17] = (byte)(lmResponseOffset >> 8); // NT response short ntResponseOffset = (short)(lmResponseOffset + lmResponseLength); data[20] = (byte)ntResponseLength; data[21] = (byte)(ntResponseLength >> 8); data[22] = data[20]; data[23] = data[21]; data[24] = (byte)ntResponseOffset; data[25] = (byte)(ntResponseOffset >> 8); // target short domainLength = (short)target.Length; short domainOffset = (short)payloadOffset; data[28] = (byte)domainLength; data[29] = (byte)(domainLength >> 8); data[30] = data[28]; data[31] = data[29]; data[32] = (byte)domainOffset; data[33] = (byte)(domainOffset >> 8); // username short userLength = (short)user.Length; short userOffset = (short)(domainOffset + domainLength); data[36] = (byte)userLength; data[37] = (byte)(userLength >> 8); data[38] = data[36]; data[39] = data[37]; data[40] = (byte)userOffset; data[41] = (byte)(userOffset >> 8); // host short hostLength = (short)hostName.Length; short hostOffset = (short)(userOffset + userLength); data[44] = (byte)hostLength; data[45] = (byte)(hostLength >> 8); data[46] = data[44]; data[47] = data[45]; data[48] = (byte)hostOffset; data[49] = (byte)(hostOffset >> 8); // message length short messageLength = (short)data.Length; data[56] = (byte)messageLength; data[57] = (byte)(messageLength >> 8); // options flags data[60] = (byte)Flags; data[61] = (byte)((uint)Flags >> 8); data[62] = (byte)((uint)Flags >> 16); data[63] = (byte)((uint)Flags >> 24); if (reqVersion) { // encode the Windows version as Windows 10.0 data[64] = 0x0A; data[65] = 0x0; // encode the ProductBuild version data[66] = (byte)(10586 & 0xff); data[67] = (byte)(10586 >> 8); // next 3 bytes are reserved and should remain 0 // encode the NTLMRevisionCurrent version data[71] = 0x0F; } Buffer.BlockCopy(target, 0, data, domainOffset, target.Length); Buffer.BlockCopy(user, 0, data, userOffset, user.Length); Buffer.BlockCopy(hostName, 0, data, hostOffset, hostName.Length); if (lm != null) { Buffer.BlockCopy(lm, 0, data, lmResponseOffset, lm.Length); Array.Clear(lm, 0, lm.Length); } if (ntlm != null) { Buffer.BlockCopy(ntlm, 0, data, ntResponseOffset, ntlm.Length); Array.Clear(ntlm, 0, ntlm.Length); } return(data); }
public override byte[] Encode () { var target = EncodeString (domain); var user = EncodeString (Username); var hostName = EncodeString (host); var payloadOffset = 64; bool reqVersion; byte[] lm, ntlm; if (type2 == null) { if (Level != NtlmAuthLevel.LM_and_NTLM) throw new InvalidOperationException ("Refusing to use legacy-mode LM/NTLM authentication unless explicitly enabled using NtlmSettings.DefaultAuthLevel."); using (var legacy = new ChallengeResponse (Password, challenge)) { lm = legacy.LM; ntlm = legacy.NT; } reqVersion = false; } else { ChallengeResponse2.Compute (type2, Level, Username, Password, domain, out lm, out ntlm); if ((reqVersion = (type2.Flags & NtlmFlags.NegotiateVersion) != 0)) payloadOffset += 8; } var lmResponseLength = lm != null ? lm.Length : 0; var ntResponseLength = ntlm != null ? ntlm.Length : 0; var data = PrepareMessage (payloadOffset + target.Length + user.Length + hostName.Length + lmResponseLength + ntResponseLength); // LM response short lmResponseOffset = (short) (payloadOffset + target.Length + user.Length + hostName.Length); data[12] = (byte) lmResponseLength; data[13] = (byte) 0x00; data[14] = data[12]; data[15] = data[13]; data[16] = (byte) lmResponseOffset; data[17] = (byte) (lmResponseOffset >> 8); // NT response short ntResponseOffset = (short) (lmResponseOffset + lmResponseLength); data[20] = (byte) ntResponseLength; data[21] = (byte) (ntResponseLength >> 8); data[22] = data[20]; data[23] = data[21]; data[24] = (byte) ntResponseOffset; data[25] = (byte) (ntResponseOffset >> 8); // target short domainLength = (short) target.Length; short domainOffset = (short) payloadOffset; data[28] = (byte) domainLength; data[29] = (byte) (domainLength >> 8); data[30] = data[28]; data[31] = data[29]; data[32] = (byte) domainOffset; data[33] = (byte) (domainOffset >> 8); // username short userLength = (short) user.Length; short userOffset = (short) (domainOffset + domainLength); data[36] = (byte) userLength; data[37] = (byte) (userLength >> 8); data[38] = data[36]; data[39] = data[37]; data[40] = (byte) userOffset; data[41] = (byte) (userOffset >> 8); // host short hostLength = (short) hostName.Length; short hostOffset = (short) (userOffset + userLength); data[44] = (byte) hostLength; data[45] = (byte) (hostLength >> 8); data[46] = data[44]; data[47] = data[45]; data[48] = (byte) hostOffset; data[49] = (byte) (hostOffset >> 8); // message length short messageLength = (short) data.Length; data[56] = (byte) messageLength; data[57] = (byte) (messageLength >> 8); // options flags data[60] = (byte) Flags; data[61] = (byte)((uint) Flags >> 8); data[62] = (byte)((uint) Flags >> 16); data[63] = (byte)((uint) Flags >> 24); if (reqVersion) { // encode the Windows version as Windows 10.0 data[64] = 0x0A; data[65] = 0x0; // encode the ProductBuild version data[66] = (byte) (10586 & 0xff); data[67] = (byte) (10586 >> 8); // next 3 bytes are reserved and should remain 0 // encode the NTLMRevisionCurrent version data[71] = 0x0F; } Buffer.BlockCopy (target, 0, data, domainOffset, target.Length); Buffer.BlockCopy (user, 0, data, userOffset, user.Length); Buffer.BlockCopy (hostName, 0, data, hostOffset, hostName.Length); if (lm != null) { Buffer.BlockCopy (lm, 0, data, lmResponseOffset, lm.Length); Array.Clear (lm, 0, lm.Length); } if (ntlm != null) { Buffer.BlockCopy (ntlm, 0, data, ntResponseOffset, ntlm.Length); Array.Clear (ntlm, 0, ntlm.Length); } return data; }