4f7cfd6f4337dfe0b2d6249feed6c816b4f3a6ee
2 * Copyright (C) 2014 Soul Trace <S-trace@list.ru>
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License version 2 as published
6 * by the Free Software Foundation.
12 #include <sys/types.h>
18 u_int32_t crc_tab
[256];
20 u_int32_t
chksum_crc32 (FILE *f
)
22 register unsigned long crc
;
24 char *buffer
= malloc(szbuf
);
30 j
= fread(buffer
, 1, szbuf
, f
);
32 for (i
= 0; i
< j
; i
++)
33 crc
= ((crc
>> 8) & 0x00FFFFFF) ^ crc_tab
[(crc
^ *buf
++) & 0xFF];
39 void chksum_crc32gentab ()
41 unsigned long crc
, poly
;
45 for (i
= 0; i
< 256; i
++)
48 for (j
= 8; j
> 0; j
--)
51 crc
= (crc
>> 1) ^ poly
;
59 void usage(char *progname
)
61 printf("Usage: %s [ -v Version ] [ -d Device_ID ] <input file>\n", progname
);
65 int main(int argc
, char *argv
[]) {
69 unsigned int device_id
;
70 char firmware_version
[48];
75 { 'Z', 'N', 'B', 'G' },
81 struct signature oldsign
;
83 static const char *optString
;
90 opt
= getopt( argc
, argv
, optString
);
96 strncpy(sign
.firmware_version
, optarg
, sizeof(sign
.firmware_version
)-1);
97 sign
.firmware_version
[sizeof(sign
.firmware_version
)-1]='\0'; /* Make sure that string is terminated correctly */
101 sign
.device_id
= atoi(optarg
);
102 if (sign
.device_id
== 0)
103 sign
.device_id
= (int)strtol(optarg
, NULL
, 16);
115 opt
= getopt( argc
, argv
, optString
);
118 chksum_crc32gentab();
120 filename
=argv
[optind
];
121 if (access(filename
, W_OK
) || access(filename
, R_OK
))
123 printf("Not open input file %s\n", filename
);
126 f
= fopen(argv
[optind
], "r+");
129 fseek(f
, sizeof(sign
)*-1, SEEK_END
);
130 fread(&oldsign
, sizeof(oldsign
), 1, f
);
132 if (strncmp(oldsign
.magic
,"ZNBG", sizeof(oldsign
.magic
)) == 0 )
134 printf("Image is already signed as:\nDevice ID: 0x%08x\nFirmware version: %s\nImage CRC32: 0x%x\n", oldsign
.device_id
, oldsign
.firmware_version
, oldsign
.crc32
);
138 fseek(f
, 0, SEEK_SET
);
139 sign
.crc32
= chksum_crc32(f
);
140 fwrite(&sign
, sizeof(sign
), 1, f
);
143 printf("Image signed as:\nDevice ID: 0x%08x\nFirmware version: %s\nImage CRC32: 0x%x\n", sign
.device_id
, sign
.firmware_version
, sign
.crc32
);