OpenTViX crc
From OpenTViX
The firmware checksum was reverse engineerd by bmf.
The algorithm is CRC32 with an init table.
#include <stdio.h>
#include <sys/stat.h>
#include "malloc.h"
/*
* (C) S. Myhre aka BMF
* smyhre.bs at gmail
*
* usage: tvix_crc.exe <srcfile>
*
* thanks to:
* Redangel, Badeip
*
*/
/*
The TVIX CRC algorithm
----------------------
The TVIX firmware is "protected" by a custom CRC-algorithm.
The check_validity function expects this CRC to always be zero.
In order to make the CRC zero one has to calculate the "original"
CRC of the firmware and then append that CRC to the end of the file.
The CRC of the new file will then be zero.
This also means that if you CRC the original firmware files minus
the last four bytes the CRC will equal these last four bytes.
This sourcecode will calculate the CRC of your custom firmware.
You will then need to append the calculated CRC to the end of the file.
If you then run the code on the new file you will get a CRC of zero.
In order for this to work on a firmware file, you will need to add
four to the size-field in the header BEFORE you calculate the CRC.
*/
unsigned char crcbytes[1024] = {
0, 0, 0, 0, 0x96, 0x30, 7, 0x77, 0x2C, 0x61, 0xE,
0xEE, 0xBA, 0x51, 9, 0x99, 0x19, 0xC4, 0x6D, 7, 0x8F,
0xF4, 0x6A, 0x70, 0x35, 0xA5, 0x63, 0xE9, 0xA3, 0x95,
0x64, 0x9E, 0x32, 0x88, 0xDB, 0xE, 0xA4, 0xB8, 0xDC,
0x79, 0x1E, 0xE9, 0xD5, 0xE0, 0x88, 0xD9, 0xD2, 0x97,
0x2B, 0x4C, 0xB6, 9, 0xBD, 0x7C, 0xB1, 0x7E, 7, 0x2D,
0xB8, 0xE7, 0x91, 0x1D, 0xBF, 0x90, 0x64, 0x10, 0xB7,
0x1D, 0xF2, 0x20, 0xB0, 0x6A, 0x48, 0x71, 0xB9, 0xF3,
0xDE, 0x41, 0xBE, 0x84, 0x7D, 0xD4, 0xDA, 0x1A, 0xEB,
0xE4, 0xDD, 0x6D, 0x51, 0xB5, 0xD4, 0xF4, 0xC7, 0x85,
0xD3, 0x83, 0x56, 0x98, 0x6C, 0x13, 0xC0, 0xA8, 0x6B,
0x64, 0x7A, 0xF9, 0x62, 0xFD, 0xEC, 0xC9, 0x65, 0x8A,
0x4F, 0x5C, 1, 0x14, 0xD9, 0x6C, 6, 0x63, 0x63, 0x3D,
0xF, 0xFA, 0xF5, 0xD, 8, 0x8D, 0xC8, 0x20, 0x6E,
0x3B, 0x5E, 0x10, 0x69, 0x4C, 0xE4, 0x41, 0x60, 0xD5,
0x72, 0x71, 0x67, 0xA2, 0xD1, 0xE4, 3, 0x3C, 0x47,
0xD4, 4, 0x4B, 0xFD, 0x85, 0xD, 0xD2, 0x6B, 0xB5,
0xA, 0xA5, 0xFA, 0xA8, 0xB5, 0x35, 0x6C, 0x98, 0xB2,
0x42, 0xD6, 0xC9, 0xBB, 0xDB, 0x40, 0xF9, 0xBC, 0xAC,
0xE3, 0x6C, 0xD8, 0x32, 0x75, 0x5C, 0xDF, 0x45, 0xCF,
0xD, 0xD6, 0xDC, 0x59, 0x3D, 0xD1, 0xAB, 0xAC, 0x30,
0xD9, 0x26, 0x3A, 0, 0xDE, 0x51, 0x80, 0x51, 0xD7,
0xC8, 0x16, 0x61, 0xD0, 0xBF, 0xB5, 0xF4, 0xB4, 0x21,
0x23, 0xC4, 0xB3, 0x56, 0x99, 0x95, 0xBA, 0xCF, 0xF,
0xA5, 0xBD, 0xB8, 0x9E, 0xB8, 2, 0x28, 8, 0x88, 5,
0x5F, 0xB2, 0xD9, 0xC, 0xC6, 0x24, 0xE9, 0xB, 0xB1,
0x87, 0x7C, 0x6F, 0x2F, 0x11, 0x4C, 0x68, 0x58, 0xAB,
0x1D, 0x61, 0xC1, 0x3D, 0x2D, 0x66, 0xB6, 0x90, 0x41,
0xDC, 0x76, 6, 0x71, 0xDB, 1, 0xBC, 0x20, 0xD2, 0x98,
0x2A, 0x10, 0xD5, 0xEF, 0x89, 0x85, 0xB1, 0x71, 0x1F,
0xB5, 0xB6, 6, 0xA5, 0xE4, 0xBF, 0x9F, 0x33, 0xD4,
0xB8, 0xE8, 0xA2, 0xC9, 7, 0x78, 0x34, 0xF9, 0, 0xF,
0x8E, 0xA8, 9, 0x96, 0x18, 0x98, 0xE, 0xE1, 0xBB,
0xD, 0x6A, 0x7F, 0x2D, 0x3D, 0x6D, 8, 0x97, 0x6C,
0x64, 0x91, 1, 0x5C, 0x63, 0xE6, 0xF4, 0x51, 0x6B,
0x6B, 0x62, 0x61, 0x6C, 0x1C, 0xD8, 0x30, 0x65, 0x85,
0x4E, 0, 0x62, 0xF2, 0xED, 0x95, 6, 0x6C, 0x7B, 0xA5,
1, 0x1B, 0xC1, 0xF4, 8, 0x82, 0x57, 0xC4, 0xF, 0xF5,
0xC6, 0xD9, 0xB0, 0x65, 0x50, 0xE9, 0xB7, 0x12, 0xEA,
0xB8, 0xBE, 0x8B, 0x7C, 0x88, 0xB9, 0xFC, 0xDF, 0x1D,
0xDD, 0x62, 0x49, 0x2D, 0xDA, 0x15, 0xF3, 0x7C, 0xD3,
0x8C, 0x65, 0x4C, 0xD4, 0xFB, 0x58, 0x61, 0xB2, 0x4D,
0xCE, 0x51, 0xB5, 0x3A, 0x74, 0, 0xBC, 0xA3, 0xE2,
0x30, 0xBB, 0xD4, 0x41, 0xA5, 0xDF, 0x4A, 0xD7, 0x95,
0xD8, 0x3D, 0x6D, 0xC4, 0xD1, 0xA4, 0xFB, 0xF4, 0xD6,
0xD3, 0x6A, 0xE9, 0x69, 0x43, 0xFC, 0xD9, 0x6E, 0x34,
0x46, 0x88, 0x67, 0xAD, 0xD0, 0xB8, 0x60, 0xDA, 0x73,
0x2D, 4, 0x44, 0xE5, 0x1D, 3, 0x33, 0x5F, 0x4C, 0xA,
0xAA, 0xC9, 0x7C, 0xD, 0xDD, 0x3C, 0x71, 5, 0x50,
0xAA, 0x41, 2, 0x27, 0x10, 0x10, 0xB, 0xBE, 0x86,
0x20, 0xC, 0xC9, 0x25, 0xB5, 0x68, 0x57, 0xB3, 0x85,
0x6F, 0x20, 9, 0xD4, 0x66, 0xB9, 0x9F, 0xE4, 0x61,
0xCE, 0xE, 0xF9, 0xDE, 0x5E, 0x98, 0xC9, 0xD9, 0x29,
0x22, 0x98, 0xD0, 0xB0, 0xB4, 0xA8, 0xD7, 0xC7, 0x17,
0x3D, 0xB3, 0x59, 0x81, 0xD, 0xB4, 0x2E, 0x3B, 0x5C,
0xBD, 0xB7, 0xAD, 0x6C, 0xBA, 0xC0, 0x20, 0x83, 0xB8,
0xED, 0xB6, 0xB3, 0xBF, 0x9A, 0xC, 0xE2, 0xB6, 3,
0x9A, 0xD2, 0xB1, 0x74, 0x39, 0x47, 0xD5, 0xEA, 0xAF,
0x77, 0xD2, 0x9D, 0x15, 0x26, 0xDB, 4, 0x83, 0x16,
0xDC, 0x73, 0x12, 0xB, 0x63, 0xE3, 0x84, 0x3B, 0x64,
0x94, 0x3E, 0x6A, 0x6D, 0xD, 0xA8, 0x5A, 0x6A, 0x7A,
0xB, 0xCF, 0xE, 0xE4, 0x9D, 0xFF, 9, 0x93, 0x27,
0xAE, 0, 0xA, 0xB1, 0x9E, 7, 0x7D, 0x44, 0x93, 0xF,
0xF0, 0xD2, 0xA3, 8, 0x87, 0x68, 0xF2, 1, 0x1E, 0xFE,
0xC2, 6, 0x69, 0x5D, 0x57, 0x62, 0xF7, 0xCB, 0x67,
0x65, 0x80, 0x71, 0x36, 0x6C, 0x19, 0xE7, 6, 0x6B,
0x6E, 0x76, 0x1B, 0xD4, 0xFE, 0xE0, 0x2B, 0xD3, 0x89,
0x5A, 0x7A, 0xDA, 0x10, 0xCC, 0x4A, 0xDD, 0x67, 0x6F,
0xDF, 0xB9, 0xF9, 0xF9, 0xEF, 0xBE, 0x8E, 0x43, 0xBE,
0xB7, 0x17, 0xD5, 0x8E, 0xB0, 0x60, 0xE8, 0xA3, 0xD6,
0xD6, 0x7E, 0x93, 0xD1, 0xA1, 0xC4, 0xC2, 0xD8, 0x38,
0x52, 0xF2, 0xDF, 0x4F, 0xF1, 0x67, 0xBB, 0xD1, 0x67,
0x57, 0xBC, 0xA6, 0xDD, 6, 0xB5, 0x3F, 0x4B, 0x36,
0xB2, 0x48, 0xDA, 0x2B, 0xD, 0xD8, 0x4C, 0x1B, 0xA,
0xAF, 0xF6, 0x4A, 3, 0x36, 0x60, 0x7A, 4, 0x41, 0xC3,
0xEF, 0x60, 0xDF, 0x55, 0xDF, 0x67, 0xA8, 0xEF, 0x8E,
0x6E, 0x31, 0x79, 0xBE, 0x69, 0x46, 0x8C, 0xB3, 0x61,
0xCB, 0x1A, 0x83, 0x66, 0xBC, 0xA0, 0xD2, 0x6F, 0x25,
0x36, 0xE2, 0x68, 0x52, 0x95, 0x77, 0xC, 0xCC, 3,
0x47, 0xB, 0xBB, 0xB9, 0x16, 2, 0x22, 0x2F, 0x26,
5, 0x55, 0xBE, 0x3B, 0xBA, 0xC5, 0x28, 0xB, 0xBD,
0xB2, 0x92, 0x5A, 0xB4, 0x2B, 4, 0x6A, 0xB3, 0x5C,
0xA7, 0xFF, 0xD7, 0xC2, 0x31, 0xCF, 0xD0, 0xB5, 0x8B,
0x9E, 0xD9, 0x2C, 0x1D, 0xAE, 0xDE, 0x5B, 0xB0, 0xC2,
0x64, 0x9B, 0x26, 0xF2, 0x63, 0xEC, 0x9C, 0xA3, 0x6A,
0x75, 0xA, 0x93, 0x6D, 2, 0xA9, 6, 9, 0x9C, 0x3F,
0x36, 0xE, 0xEB, 0x85, 0x67, 7, 0x72, 0x13, 0x57,
0, 5, 0x82, 0x4A, 0xBF, 0x95, 0x14, 0x7A, 0xB8, 0xE2,
0xAE, 0x2B, 0xB1, 0x7B, 0x38, 0x1B, 0xB6, 0xC, 0x9B,
0x8E, 0xD2, 0x92, 0xD, 0xBE, 0xD5, 0xE5, 0xB7, 0xEF,
0xDC, 0x7C, 0x21, 0xDF, 0xDB, 0xB, 0xD4, 0xD2, 0xD3,
0x86, 0x42, 0xE2, 0xD4, 0xF1, 0xF8, 0xB3, 0xDD, 0x68,
0x6E, 0x83, 0xDA, 0x1F, 0xCD, 0x16, 0xBE, 0x81, 0x5B,
0x26, 0xB9, 0xF6, 0xE1, 0x77, 0xB0, 0x6F, 0x77, 0x47,
0xB7, 0x18, 0xE6, 0x5A, 8, 0x88, 0x70, 0x6A, 0xF,
0xFF, 0xCA, 0x3B, 6, 0x66, 0x5C, 0xB, 1, 0x11, 0xFF,
0x9E, 0x65, 0x8F, 0x69, 0xAE, 0x62, 0xF8, 0xD3, 0xFF,
0x6B, 0x61, 0x45, 0xCF, 0x6C, 0x16, 0x78, 0xE2, 0xA,
0xA0, 0xEE, 0xD2, 0xD, 0xD7, 0x54, 0x83, 4, 0x4E,
0xC2, 0xB3, 3, 0x39, 0x61, 0x26, 0x67, 0xA7, 0xF7,
0x16, 0x60, 0xD0, 0x4D, 0x47, 0x69, 0x49, 0xDB, 0x77,
0x6E, 0x3E, 0x4A, 0x6A, 0xD1, 0xAE, 0xDC, 0x5A, 0xD6,
0xD9, 0x66, 0xB, 0xDF, 0x40, 0xF0, 0x3B, 0xD8, 0x37,
0x53, 0xAE, 0xBC, 0xA9, 0xC5, 0x9E, 0xBB, 0xDE, 0x7F,
0xCF, 0xB2, 0x47, 0xE9, 0xFF, 0xB5, 0x30, 0x1C, 0xF2,
0xBD, 0xBD, 0x8A, 0xC2, 0xBA, 0xCA, 0x30, 0x93, 0xB3,
0x53, 0xA6, 0xA3, 0xB4, 0x24, 5, 0x36, 0xD0, 0xBA,
0x93, 6, 0xD7, 0xCD, 0x29, 0x57, 0xDE, 0x54, 0xBF,
0x67, 0xD9, 0x23, 0x2E, 0x7A, 0x66, 0xB3, 0xB8, 0x4A,
0x61, 0xC4, 2, 0x1B, 0x68, 0x5D, 0x94, 0x2B, 0x6F,
0x2A, 0x37, 0xBE, 0xB, 0xB4, 0xA1, 0x8E, 0xC, 0xC3,
0x1B, 0xDF, 5, 0x5A, 0x8D, 0xEF, 2, 0x2D
};
unsigned long *crctable = (unsigned long*) crcbytes;
void calc_crc(unsigned char* buf, int size, unsigned long* dest);
int main(int argc, char **argv)
{
FILE *file;
unsigned char* buffer;
int srcsize;
struct stat statbuf;
unsigned long crc;
if(argc < 2) {
printf( "\nusage: tvix_crc.exe <srcfile>\n " );
return -1;
}
file=fopen(argv[1], "rb");
if( !file ){
printf( "Failed to open file\n" );
return -2;
}
fstat(fileno(file), &statbuf);
srcsize = statbuf.st_size;
buffer = malloc(srcsize);
fread( buffer, 1, srcsize, file );
fclose(file);
crc = 0;
calc_crc( buffer, srcsize, &crc);
printf( "CRC: 0x%X\n", crc);
return 0;
}
void calc_crc(unsigned char* buf, int size, unsigned long* dest){
unsigned long v1;
unsigned long v0;
unsigned char t;
do{
v0 = *dest;
t = *buf;
v1 = t;
v1 = v1 ^ v0;
v1 = v1 & 0xff;
v0 = v0 >> 8;
v1 = crctable[v1];
v0 = v0 ^v1;
*dest = v0;
buf++;
}while(--size);
}

