Skip to content

Commit

Permalink
Fix checksums for devices that care about that.
Browse files Browse the repository at this point in the history
  • Loading branch information
AdmiralCurtiss committed Jun 7, 2014
1 parent 49b55ff commit 6c48af3
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 0 deletions.
51 changes: 51 additions & 0 deletions Crc16.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// modified from http://www.sanity-free.org/134/standard_crc_16_in_csharp.html

using System;
using System.IO;

namespace WfcPatcher {
public class Crc16 {
private ushort[] table = new ushort[256];

public ushort ComputeChecksum( byte[] bytes ) {
ushort crc = 0;
for ( int i = 0; i < bytes.Length; ++i ) {
byte index = (byte)( crc ^ bytes[i] );
crc = (ushort)( ( crc >> 8 ) ^ table[index] );
}
return crc;
}

public ushort ComputeChecksum( Stream stream, int length, ushort init = 0 ) {
ushort crc = init;
for ( int i = 0; i < length; ++i ) {
byte index = (byte)( ( crc ^ stream.ReadByte() ) & 0xFF );
crc = (ushort)( ( crc >> 8 ) ^ table[index] );
}
return crc;
}

public byte[] ComputeChecksumBytes( byte[] bytes ) {
ushort crc = ComputeChecksum( bytes );
return BitConverter.GetBytes( crc );
}

public Crc16( ushort polynomial = 0xA001 ) {
ushort value;
ushort temp;
for ( ushort i = 0; i < table.Length; ++i ) {
value = 0;
temp = i;
for ( byte j = 0; j < 8; ++j ) {
if ( ( ( value ^ temp ) & 0x0001 ) != 0 ) {
value = (ushort)( ( value >> 1 ) ^ polynomial );
} else {
value >>= 1;
}
temp >>= 1;
}
table[i] = value;
}
}
}
}
10 changes: 10 additions & 0 deletions Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,16 @@ static void PatchArm9( System.IO.FileStream nds, uint pos, uint len ) {
byte[] newSizeBytes = BitConverter.GetBytes( newSize );
nds.Position = 0x2C;
nds.Write( newSizeBytes, 0, 4 );

// recalculate checksums
nds.Position = pos;
ushort secureChecksum = new Crc16().ComputeChecksum( nds, 0x4000, 0xFFFF );
nds.Position = 0x6C;
nds.Write( BitConverter.GetBytes( secureChecksum ), 0, 2 );

nds.Position = 0;
ushort headerChecksum = new Crc16().ComputeChecksum( nds, 0x15E, 0xFFFF );
nds.Write( BitConverter.GetBytes( headerChecksum ), 0, 2 );
}
}

Expand Down
1 change: 1 addition & 0 deletions WfcPatcher.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
<ItemGroup>
<Compile Include="blz.cs" />
<Compile Include="ByteArrayRocks.cs" />
<Compile Include="Crc16.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Util.cs" />
Expand Down

0 comments on commit 6c48af3

Please sign in to comment.