diff --git a/libhac/Calibration.cs b/libhac/Calibration.cs new file mode 100644 index 00000000..bae854cb --- /dev/null +++ b/libhac/Calibration.cs @@ -0,0 +1,194 @@ +using System.IO; +using System.Text; + +namespace libhac +{ + public class Calibration + { + public string Magic; + public uint Field4; + public int CalibDataSize; + public short Version; + public short Revision; + public byte[] CalibDataSha256; + public string ConfigId1; + public int WlanCountryCodesNum; + public int WlanCountryCodesLastIdx; + public string[] WlanCountryCodes; + public byte[] WlanMacAddr; + public byte[] BdAddr; + public byte[] AccelerometerOffset; + public byte[] AccelerometerScale; + public byte[] GyroscopeOffset; + public byte[] GyroscopeScale; + public string SerialNumber; + public byte[] DeviceKeyEccP256; + public byte[] DeviceCertEccP256; + public byte[] DeviceKeyEccB233; + public byte[] DeviceCertEccB233; + public byte[] EticketKeyEccP256; + public byte[] EticketCertEccP256; + public byte[] EticketKeyEccB233; + public byte[] EticketCertEccB233; + public byte[] SslKey; + public int SslCertSize; + public byte[] SslCert; + public byte[] SslCertSha256; + public byte[] RandomNumber; + public byte[] RandomNumberSha256; + public byte[] GamecardKey; + public byte[] GamecardCert; + public byte[] GamecardCertSha256; + public byte[] EticketKeyRsa; + public byte[] EticketCertRsa; + public string BatteryLot; + public byte[] SpeakerCalibValue; + public int RegionCode; + public byte[] AmiiboKey; + public byte[] AmiiboCertEcqv; + public byte[] AmiiboCertEcdsa; + public byte[] AmiiboKeyEcqvBls; + public byte[] AmiiboCertEcqvBls; + public byte[] AmiiboRootCertEcqvBls; + public int ProductModel; + public byte[] ColorVariation; + public byte[] LcdBacklightBrightnessMapping; + public byte[] DeviceExtKeyEccB233; + public byte[] EticketExtKeyEccP256; + public byte[] EticketExtKeyEccB233; + public byte[] EticketExtKeyRsa; + public byte[] SslExtKey; + public byte[] GamecardExtKey; + public int LcdVendorId; + + public Calibration(Stream stream) + { + var reader = new BinaryReader(stream, Encoding.Default, true); + + stream.Position = 0; + Magic = reader.ReadUtf8(4); + Field4 = reader.ReadUInt32(); + CalibDataSize = reader.ReadInt32(); + Version = reader.ReadInt16(); + Revision = reader.ReadInt16(); + + stream.Position = 0x20; + CalibDataSha256 = reader.ReadBytes(0x20); + ConfigId1 = reader.ReadUtf8Z(); + + stream.Position = 0x80; + WlanCountryCodesNum = reader.ReadInt32(); + WlanCountryCodesLastIdx = reader.ReadInt32(); + WlanCountryCodes = new string[WlanCountryCodesNum]; + for (int i = 0; i < WlanCountryCodesNum; i++) + { + stream.Position = 0x88 + i * 4; + WlanCountryCodes[i] = reader.ReadUtf8Z(); + } + + stream.Position = 0x210; + WlanMacAddr = reader.ReadBytes(6); + stream.Position = 0x220; + BdAddr = reader.ReadBytes(6); + stream.Position = 0x230; + AccelerometerOffset = reader.ReadBytes(6); + stream.Position = 0x238; + AccelerometerScale = reader.ReadBytes(6); + stream.Position = 0x240; + GyroscopeOffset = reader.ReadBytes(6); + stream.Position = 0x248; + GyroscopeScale = reader.ReadBytes(6); + + stream.Position = 0x250; + SerialNumber = reader.ReadUtf8Z(); + + stream.Position = 0x270; + DeviceKeyEccP256 = reader.ReadBytes(0x30); + stream.Position = 0x2B0; + DeviceCertEccP256 = reader.ReadBytes(0x180); + stream.Position = 0x440; + DeviceKeyEccB233 = reader.ReadBytes(0x30); + stream.Position = 0x480; + DeviceCertEccB233 = reader.ReadBytes(0x180); + stream.Position = 0x610; + EticketKeyEccP256 = reader.ReadBytes(0x30); + stream.Position = 0x650; + EticketCertEccP256 = reader.ReadBytes(0x180); + stream.Position = 0x7E0; + EticketKeyEccB233 = reader.ReadBytes(0x30); + stream.Position = 0x820; + EticketCertEccB233 = reader.ReadBytes(0x180); + + stream.Position = 0x9B0; + SslKey = reader.ReadBytes(0x110); + stream.Position = 0xAD0; + SslCertSize = reader.ReadInt32(); + stream.Position = 0x0AE0; + SslCert = reader.ReadBytes(SslCertSize); + stream.Position = 0x12E0; + SslCertSha256 = reader.ReadBytes(0x20); + + stream.Position = 0x1300; + RandomNumber = reader.ReadBytes(0x1000); + stream.Position = 0x2300; + RandomNumberSha256 = reader.ReadBytes(0x20); + + stream.Position = 0x2320; + GamecardKey = reader.ReadBytes(0x110); + stream.Position = 0x2440; + GamecardCert = reader.ReadBytes(0x400); + stream.Position = 0x2840; + GamecardCertSha256 = reader.ReadBytes(0x20); + + stream.Position = 0x2860; + EticketKeyRsa = reader.ReadBytes(0x220); + stream.Position = 0x2A90; + EticketCertRsa = reader.ReadBytes(0x240); + + stream.Position = 0x2CE0; + BatteryLot = reader.ReadUtf8Z(); + + stream.Position = 0x2D00; + SpeakerCalibValue = reader.ReadBytes(0x800); + + stream.Position = 0x3510; + RegionCode = reader.ReadInt32(); + + stream.Position = 0x3520; + AmiiboKey = reader.ReadBytes(0x50); + stream.Position = 0x3580; + AmiiboCertEcqv = reader.ReadBytes(0x14); + stream.Position = 0x35A0; + AmiiboCertEcdsa = reader.ReadBytes(0x70); + stream.Position = 0x3620; + AmiiboKeyEcqvBls = reader.ReadBytes(0x40); + stream.Position = 0x3670; + AmiiboCertEcqvBls = reader.ReadBytes(0x20); + stream.Position = 0x36A0; + AmiiboRootCertEcqvBls = reader.ReadBytes(0x90); + + stream.Position = 0x3740; + ProductModel = reader.ReadInt32(); + stream.Position = 0x3750; + ColorVariation = reader.ReadBytes(0x06); + stream.Position = 0x3760; + LcdBacklightBrightnessMapping = reader.ReadBytes(0x0C); + + stream.Position = 0x3770; + DeviceExtKeyEccB233 = reader.ReadBytes(0x50); + stream.Position = 0x37D0; + EticketExtKeyEccP256 = reader.ReadBytes(0x50); + stream.Position = 0x3830; + EticketExtKeyEccB233 = reader.ReadBytes(0x50); + stream.Position = 0x3890; + EticketExtKeyRsa = reader.ReadBytes(0x240); + stream.Position = 0x3AE0; + SslExtKey = reader.ReadBytes(0x130); + stream.Position = 0x3C20; + GamecardExtKey = reader.ReadBytes(0x130); + + stream.Position = 0x3D60; + LcdVendorId = reader.ReadInt32(); + } + } +}