Skip to content

Commit 091b9b4

Browse files
Fix ManagedNTLM faiures on Big endian architectures
- Fixed several endian bugs in ManagedNTLM implementation. - This is a follow-up to PR dotnet#124598
1 parent 9766d74 commit 091b9b4

1 file changed

Lines changed: 19 additions & 9 deletions

File tree

src/libraries/System.Net.Security/src/System/Net/NegotiateAuthenticationPal.ManagedNtlm.cs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,8 @@ private unsafe struct MessageField
131131
private int _payloadOffset;
132132
public int PayloadOffset
133133
{
134-
readonly get =>BitConverter.IsLittleEndian? _payloadOffset: BinaryPrimitives.ReverseEndianness(_payloadOffset);
135-
set =>_payloadOffset = BitConverter.IsLittleEndian? value: BinaryPrimitives.ReverseEndianness(value);
134+
readonly get => BitConverter.IsLittleEndian? _payloadOffset: BinaryPrimitives.ReverseEndianness(_payloadOffset);
135+
set => _payloadOffset = BitConverter.IsLittleEndian? value: BinaryPrimitives.ReverseEndianness(value);
136136
}
137137
}
138138

@@ -158,8 +158,8 @@ private unsafe struct Version
158158
public byte CurrentRevision;
159159
public ushort ProductBuild
160160
{
161-
readonly get =>BitConverter.IsLittleEndian? _productBuild: BinaryPrimitives.ReverseEndianness(_productBuild);
162-
set =>_productBuild = BitConverter.IsLittleEndian? value: BinaryPrimitives.ReverseEndianness(value);
161+
readonly get => BitConverter.IsLittleEndian? _productBuild: BinaryPrimitives.ReverseEndianness(_productBuild);
162+
set => _productBuild = BitConverter.IsLittleEndian? value: BinaryPrimitives.ReverseEndianness(value);
163163
}
164164
}
165165

@@ -174,8 +174,8 @@ private unsafe struct NegotiateMessage
174174
public Version Version;
175175
public Flags Flags
176176
{
177-
readonly get =>BitConverter.IsLittleEndian? _flags: (Flags)BinaryPrimitives.ReverseEndianness((uint)_flags);
178-
set =>_flags = BitConverter.IsLittleEndian? value: (Flags)BinaryPrimitives.ReverseEndianness((uint)value);
177+
readonly get => BitConverter.IsLittleEndian? _flags: (Flags)BinaryPrimitives.ReverseEndianness((uint)_flags);
178+
set => _flags = BitConverter.IsLittleEndian? value: (Flags)BinaryPrimitives.ReverseEndianness((uint)value);
179179
}
180180
}
181181

@@ -185,8 +185,13 @@ private unsafe struct ChallengeMessage
185185
{
186186
public MessageHeader Header;
187187
public MessageField TargetName;
188-
public Flags Flags;
189188
public fixed byte ServerChallenge[ChallengeLength];
189+
private Flags _flags;
190+
public Flags Flags
191+
{
192+
readonly get => BitConverter.IsLittleEndian? _flags: (Flags)BinaryPrimitives.ReverseEndianness((uint)_flags);
193+
set => _flags = BitConverter.IsLittleEndian? value: (Flags)BinaryPrimitives.ReverseEndianness((uint)value);
194+
}
190195
private ulong _unused;
191196
public MessageField TargetInfo;
192197
public Version Version;
@@ -203,7 +208,12 @@ private unsafe struct AuthenticateMessage
203208
public MessageField UserName;
204209
public MessageField Workstation;
205210
public MessageField EncryptedRandomSessionKey;
206-
public Flags Flags;
211+
private Flags _flags;
212+
public Flags Flags
213+
{
214+
readonly get => BitConverter.IsLittleEndian? _flags: (Flags)BinaryPrimitives.ReverseEndianness((uint)_flags);
215+
set => _flags = BitConverter.IsLittleEndian? value: (Flags)BinaryPrimitives.ReverseEndianness((uint)value);
216+
}
207217
public Version Version;
208218
public fixed byte Mic[16];
209219
}
@@ -589,7 +599,7 @@ private static byte[] DeriveKey(ReadOnlySpan<byte> exportedSessionKey, ReadOnlyS
589599
return null;
590600
}
591601

592-
Flags flags = BitConverter.IsLittleEndian ? challengeMessage.Flags : (Flags)BinaryPrimitives.ReverseEndianness((uint)challengeMessage.Flags);
602+
Flags flags = challengeMessage.Flags;
593603
ReadOnlySpan<byte> targetName = GetField(challengeMessage.TargetName, blob);
594604

595605
// Only NTLMv2 with MIC is supported

0 commit comments

Comments
 (0)