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.
11 #define _POSIX_C_SOURCE 199309L /* getopt */
14 #include <sys/types.h>
20 u_int32_t crc_tab
[256];
22 u_int32_t
chksum_crc32 (FILE *f
)
24 register unsigned long crc
;
26 char *buffer
= malloc(szbuf
);
32 j
= fread(buffer
, 1, szbuf
, f
);
34 for (i
= 0; i
< j
; i
++)
35 crc
= ((crc
>> 8) & 0x00FFFFFF) ^ crc_tab
[(crc
^ *buf
++) & 0xFF];
41 void chksum_crc32gentab ()
43 unsigned long crc
, poly
;
47 for (i
= 0; i
< 256; i
++)
50 for (j
= 8; j
> 0; j
--)
53 crc
= (crc
>> 1) ^ poly
;
61 void usage(char *progname
)
63 printf("Usage: %s [ -v Version ] [ -d Device_ID ] <input file>\n", progname
);
67 int main(int argc
, char *argv
[]) {
71 unsigned int device_id
;
72 char firmware_version
[48];
77 { 'Z', 'N', 'B', 'G' },
83 struct signature oldsign
;
85 static const char *optString
;
92 opt
= getopt( argc
, argv
, optString
);
98 strncpy(sign
.firmware_version
, optarg
, sizeof(sign
.firmware_version
)-1);
99 sign
.firmware_version
[sizeof(sign
.firmware_version
)-1]='\0'; /* Make sure that string is terminated correctly */
103 sign
.device_id
= atoi(optarg
);
104 if (sign
.device_id
== 0)
105 sign
.device_id
= (int)strtol(optarg
, NULL
, 16);
117 opt
= getopt( argc
, argv
, optString
);
120 chksum_crc32gentab();
122 filename
=argv
[optind
];
123 if (access(filename
, W_OK
) || access(filename
, R_OK
))
125 printf("Not open input file %s\n", filename
);
128 f
= fopen(argv
[optind
], "r+");
131 fseek(f
, sizeof(sign
)*-1, SEEK_END
);
132 fread(&oldsign
, sizeof(oldsign
), 1, f
);
134 if (strncmp(oldsign
.magic
,"ZNBG", sizeof(oldsign
.magic
)) == 0 )
136 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
);
140 fseek(f
, 0, SEEK_SET
);
141 sign
.crc32
= chksum_crc32(f
);
142 fwrite(&sign
, sizeof(sign
), 1, f
);
145 printf("Image signed as:\nDevice ID: 0x%08x\nFirmware version: %s\nImage CRC32: 0x%x\n", sign
.device_id
, sign
.firmware_version
, sign
.crc32
);