private uint Bootloader_CRC() { byte[] buff = new byte[Firmware.BOOTLOADER_SIZE]; //6 Kbytes byte[] rd = new byte[64]; for (uint i = 0; i < buff.Length; i += 64) { usbdevice.Write(new byte[] { Firmware.DUMPER_READ_FLASH, 64, (byte)(i & 0xFF), (byte)((i >> 8) & 0xFF), (byte)((i >> 16) & 0xFF) }); if (usbdevice.Read(rd) != 64) { MessageBox.Show("Read error!", "TL866", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return(0); } Array.Copy(rd, 0, buff, i, rd.Length); } CRC32 crc = new CRC32(); return(~crc.GetCRC32(buff, 0xFFFFFFFF)); }
public static bool Calc_CRC(string DevCode, string Serial) { byte[] k = new byte[DEVCODE_LENGHT + SERIALCODE_LENGHT]; Array.Copy(Encoding.ASCII.GetBytes(DevCode + new string(' ', DEVCODE_LENGHT - DevCode.Length)), 0, k, 0, DEVCODE_LENGHT); Array.Copy(Encoding.ASCII.GetBytes(Serial + new string(' ', SERIALCODE_LENGHT - Serial.Length)), 0, k, DEVCODE_LENGHT, SERIALCODE_LENGHT); CRC32 crc = new CRC32(); return(crc.GetCRC32(k, 0xFFFFFFFF) == BAD_CRC); }
public void Open(string UpdateDat_Path) { IsValid = false; FileStream fsin = null; try { fsin = File.OpenRead(UpdateDat_Path); } catch { if (fsin != null) { fsin.Close(); } throw new Exception("Error opening file " + UpdateDat_Path); } if (fsin.Length != UPDATE_DAT_SIZE) { fsin.Close(); throw new Exception(UpdateDat_Path + "\nFile size error!"); } byte[] inbuffer = new byte[fsin.Length + 1]; fsin.Read(inbuffer, 0, (int)fsin.Length); fsin.Close(); m_eraseA = inbuffer[9]; m_eraseCS = inbuffer[17]; Version = inbuffer[0]; //Decrypt firmwares (stage 1) m_firmwareA = new byte[ENCRYPTED_FIRMWARE_SIZE]; m_firmwareCS = new byte[ENCRYPTED_FIRMWARE_SIZE]; for (uint i = 0; i < ENCRYPTED_FIRMWARE_SIZE; i++) { m_firmwareA[i] = (byte)(inbuffer[0xA1C + i] ^ inbuffer[ 0x118 + ((BitConverter.ToInt32(inbuffer, 0x14) + i) & 0x3FF)] ^ inbuffer[0x18 + ((i / 80) & 0xFF)]); m_firmwareCS[i] = (byte)(inbuffer[0x2671C + i] ^ inbuffer[ 0x61C + ((BitConverter.ToInt32(inbuffer, 0x518) + i) & 0x3FF)] ^ inbuffer[0x51C + ((i / 80) & 0xFF)]); } //Check if decryption was O.K. CRC32 crc32 = new CRC32(); uint crca = ~crc32.GetCRC32(m_firmwareA, 0xFFFFFFFF); uint crccs = ~crc32.GetCRC32(m_firmwareCS, 0xFFFFFFFF); if (crca != BitConverter.ToUInt32(inbuffer, 4) || crccs != BitConverter.ToUInt32(inbuffer, 12)) { throw new Exception(UpdateDat_Path + "\nData CRC error!"); } //Check if decrypted firmware signatures are O.K. if (BitConverter.ToUInt32(GetUnencryptedFirmware((int)FIRMWARE_TYPE.FIRMWARE_A), FIRMWARE_SIGNATURE_OFFSET) != FIRMWARE_SIGNATURE || BitConverter.ToUInt32(GetUnencryptedFirmware((int)FIRMWARE_TYPE.FIRMWARE_CS), FIRMWARE_SIGNATURE_OFFSET) != FIRMWARE_SIGNATURE) { throw new Exception("Firmware decryption error!"); } IsValid = true; }