#include <stdio.h>

static const char firmware_key[48] = {
  0x94, 0x00, 0x03, 0x02, 0x00, 0x14, 0xE8, 0x15, 0x3F, 0xA6, 0xD8, 0xA2, 0xD8, 0x14, 0x71, 0x46,
  0xFF, 0x80, 0x09, 0x38, 0x76, 0x08, 0xE0, 0xC0, 0x5C, 0x3C, 0x00, 0x14, 0x63, 0x4A, 0xCD, 0xF8,
  0x96, 0xC6, 0xC2, 0x0D, 0xBD, 0xE7, 0xE7, 0xBB, 0x12, 0xCF, 0x3C, 0x21, 0xF7, 0x05, 0xCF, 0x77
};


int main(int argc, char *argv[])
{
  FILE *fi, *fo;
  char c;
  int pos;
  
  if(argc != 3) {
    printf("Incorrect parameters\n");
    return 1;
  }
  fi = fopen(argv[1], "rb");
  if(fi == NULL) {
    printf("Unable to open input file\n");
    return 1;
  }
  fo = fopen(argv[2], "wb");
  if(fo == NULL) {
    printf("Unable to open output file\n");
    fclose(fi);
    return 1;
  }
  
  pos = 0;
  while(!feof(fi)) {
    if(fread(&c, 1, 1, fi) != 1) break;
    c ^= firmware_key[pos];
    if(fwrite(&c, 1, 1, fo) != 1) break;
    pos++;
    if(pos == sizeof(firmware_key)) pos = 0;
  }
  
  if(fclose(fo) != 0) {
    printf("Error closing output file\n");
    fclose(fi);
    return 1;
  }
  fclose(fi);
}
