Skip to content

Commit 58493c2

Browse files
carlbennettclaude
andcommitted
Fix encoding bug: replace Encoding.ASCII with Encoding.Latin1 throughout
Battle.net protocol specifies ISO 8859-1 (Latin1) for string fields. Using ASCII silently corrupts any byte above 0x7F to '?' before hashing or transmission, causing auth failures for users with extended characters. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
1 parent 1b32634 commit 58493c2

9 files changed

Lines changed: 19 additions & 19 deletions

File tree

src/Data/BniFileParser.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ private unsafe void Parse(Stream str)
143143
throw new InvalidDataException("Only 24-bit TGA is supported.");
144144
StartDescriptor descriptor = (StartDescriptor)br.ReadByte();
145145
byte[] info_bytes = br.ReadBytes(infoLength);
146-
Trace.WriteLine(Encoding.ASCII.GetString(info_bytes), "BNI header: information");
146+
Trace.WriteLine(Encoding.Latin1.GetString(info_bytes), "BNI header: information");
147147

148148
int numberOfPixels = width * height;
149149

src/Data/BniIcon.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ internal BniIcon(Image img, int flags, uint[] softwareList)
5353
temp = code[1];
5454
code[1] = code[2];
5555
code[2] = temp;
56-
m_softwareList[i] = Encoding.ASCII.GetString(code);
56+
m_softwareList[i] = Encoding.Latin1.GetString(code);
5757
}
5858
}
5959

src/Data/MpqArchive.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ public string GetListFile()
200200
string list = string.Empty;
201201
using (MpqFileStream mfs = OpenFile("(listfile)"))
202202
{
203-
StreamReader sr = new StreamReader(mfs, Encoding.ASCII);
203+
StreamReader sr = new StreamReader(mfs, Encoding.Latin1);
204204
list = sr.ReadToEnd();
205205
sr.Close();
206206
}

src/DataBuffer.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,7 @@ public void InsertUInt64Array(ulong[] l)
583583
/// <exception cref="ArgumentNullException">Either <c>str</c> or <c>enc</c> were <b>null</b> (<b>Nothing</b> in Visual Basic).</exception>
584584
public void InsertCString(string str)
585585
{
586-
InsertCString(str, Encoding.ASCII);
586+
InsertCString(str, Encoding.Latin1);
587587
}
588588

589589
/// <summary>
@@ -625,7 +625,7 @@ public void InsertCString(string str, Encoding enc)
625625
/// <exception cref="ArgumentException">The length of <c>str</c> was too great; maximum string length is 255 characters.</exception>
626626
public void InsertPascalString(string str)
627627
{
628-
InsertPascalString(str, Encoding.ASCII);
628+
InsertPascalString(str, Encoding.Latin1);
629629
}
630630

631631
/// <summary>
@@ -662,7 +662,7 @@ public void InsertPascalString(string str, Encoding enc)
662662
/// <exception cref="ArgumentException">The length of <c>str</c> was too great; maximum string length is 65,535 characters.</exception>
663663
public void InsertWidePascalString(string str)
664664
{
665-
InsertWidePascalString(str, Encoding.ASCII);
665+
InsertWidePascalString(str, Encoding.Latin1);
666666
}
667667

668668
/// <summary>
@@ -732,7 +732,7 @@ public void InsertDwordString(string str, byte padding)
732732
for (int i = 0; i < numNulls; i++)
733733
Insert(padding);
734734
}
735-
byte[] bar = Encoding.ASCII.GetBytes(str);
735+
byte[] bar = Encoding.Latin1.GetBytes(str);
736736
for (int i = bar.Length - 1; i >= 0; i--)
737737
Insert(bar[i]);
738738
}

src/DataFormatter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ namespace MBNCSUtil
3232
/// <example>
3333
/// <para>This example demonstrates how the formatter prints out binary data.</para>
3434
/// <code language="c#">
35-
/// DataFormatter.WriteToConsole(XSha1.CalculateHash(Encoding.ASCII.GetBytes("password")));
35+
/// DataFormatter.WriteToConsole(XSha1.CalculateHash(Encoding.Latin1.GetBytes("password")));
3636
/// </code>
3737
/// <para><b>Output:</b></para>
3838
/// <code>

src/DataReader.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ public string PeekDwordString(byte padding)
358358
if (idx0 == -1)
359359
idx0 = length;
360360

361-
string result = Encoding.ASCII.GetString(b, 0, idx0);
361+
string result = Encoding.Latin1.GetString(b, 0, idx0);
362362
return result;
363363
}
364364

@@ -380,7 +380,7 @@ public string ReadDwordString(byte padding)
380380
/// <returns>The next C-style string.</returns>
381381
public string ReadCString()
382382
{
383-
return ReadCString(Encoding.ASCII);
383+
return ReadCString(Encoding.Latin1);
384384
}
385385

386386
/// <summary>
@@ -399,7 +399,7 @@ public string ReadCString(Encoding enc)
399399
/// <returns>The next pascal-style string.</returns>
400400
public string ReadPascalString()
401401
{
402-
return ReadPascalString(Encoding.ASCII);
402+
return ReadPascalString(Encoding.Latin1);
403403
}
404404

405405
/// <summary>
@@ -421,7 +421,7 @@ public string ReadPascalString(Encoding enc)
421421
/// <returns>The next wide-pascal-style string.</returns>
422422
public string ReadWidePascalString()
423423
{
424-
return ReadWidePascalString(Encoding.ASCII);
424+
return ReadWidePascalString(Encoding.Latin1);
425425
}
426426

427427
/// <summary>

src/NLS.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public sealed class NLS
8787
public NLS(string Username, string Password)
8888
{
8989
userName = Username;
90-
userNameAscii = Encoding.ASCII.GetBytes(userName);
90+
userNameAscii = Encoding.Latin1.GetBytes(userName);
9191
password = Password;
9292

9393
byte[] rand_a = new byte[32];
@@ -435,7 +435,7 @@ private void CalculateVerifier(byte[] serverSalt)
435435
userName.ToUpper(CultureInfo.InvariantCulture), ":", password.ToUpper(CultureInfo.InvariantCulture)
436436
);
437437

438-
byte[] unpw_bytes = Encoding.ASCII.GetBytes(unpwexpr);
438+
byte[] unpw_bytes = Encoding.Latin1.GetBytes(unpwexpr);
439439
byte[] hash1 = s_sha.ComputeHash(unpw_bytes);
440440

441441
byte[] unpw_salt_bytes = new byte[serverSalt.Length + hash1.Length]; // should be 52
@@ -503,7 +503,7 @@ private void CalculateM1(byte[] saltFromServer, byte[] issuedServerKey)
503503
MemoryStream ms = new MemoryStream(40 + saltFromServer.Length + A.GetBytes().Length + issuedServerKey.Length + local_k.Length);
504504
BinaryWriter bw = new BinaryWriter(ms);
505505
bw.Write(g_xor_n.GetBytes());
506-
bw.Write(s_sha.ComputeHash(Encoding.ASCII.GetBytes(userName.ToUpper(CultureInfo.InvariantCulture))));
506+
bw.Write(s_sha.ComputeHash(Encoding.Latin1.GetBytes(userName.ToUpper(CultureInfo.InvariantCulture))));
507507
bw.Write(saltFromServer);
508508
bw.Write(EnsureArrayLength(A.GetBytes(), 32));
509509
#if DEBUG

src/OldAuth.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public static byte[] HashData(byte[] data)
6363
/// <returns>A 20-byte buffer containing the hash value.</returns>
6464
public static byte[] HashPassword(string data)
6565
{
66-
return HashData(Encoding.ASCII.GetBytes(data));
66+
return HashData(Encoding.Latin1.GetBytes(data));
6767
}
6868

6969
/// <summary>
@@ -96,7 +96,7 @@ public static byte[] DoubleHashData(byte[] data,
9696
public static byte[] DoubleHashPassword(string data,
9797
int clientToken, int serverToken)
9898
{
99-
return DoubleHashData(Encoding.ASCII.GetBytes(data),
99+
return DoubleHashData(Encoding.Latin1.GetBytes(data),
100100
unchecked((uint)clientToken),
101101
unchecked((uint)serverToken));
102102
}
@@ -116,7 +116,7 @@ public static byte[] DoubleHashPassword(string data,
116116
public static byte[] DoubleHashPassword(string data,
117117
uint clientToken, uint serverToken)
118118
{
119-
return DoubleHashData(Encoding.ASCII.GetBytes(data),
119+
return DoubleHashData(Encoding.Latin1.GetBytes(data),
120120
clientToken, serverToken);
121121
}
122122

src/Util/LockdownCrev.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ public static unsafe bool CheckRevision(string file1, string file2, string file3
170170
internal unsafe static int GetDigit(string filename)
171171
{
172172
int digit_1, digit_2;
173-
byte[] filenameBytes = Encoding.ASCII.GetBytes(filename);
173+
byte[] filenameBytes = Encoding.Latin1.GetBytes(filename);
174174
fixed (byte* pdigit_ptr = filenameBytes)
175175
{
176176
byte* digit_ptr = (byte*)(pdigit_ptr + filename.Length - 4);

0 commit comments

Comments
 (0)