1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2014 Soul Trace <S-trace@list.ru>
14 u_int32_t crc_tab
[256];
16 u_int32_t
chksum_crc32 (FILE *f
)
18 register unsigned long crc
;
20 char *buffer
= malloc(szbuf
);
26 j
= fread(buffer
, 1, szbuf
, f
);
28 for (i
= 0; i
< j
; i
++)
29 crc
= ((crc
>> 8) & 0x00FFFFFF) ^ crc_tab
[(crc
^ *buf
++) & 0xFF];
35 void chksum_crc32gentab ()
37 unsigned long crc
, poly
;
41 for (i
= 0; i
< 256; i
++)
44 for (j
= 8; j
> 0; j
--)
47 crc
= (crc
>> 1) ^ poly
;
55 void usage(char *progname
)
57 printf("Usage: %s [ -v Version ] [ -d Device_ID ] <input file>\n", progname
);
61 int main(int argc
, char *argv
[]) {
65 unsigned int device_id
;
66 char firmware_version
[48];
71 { 'Z', 'N', 'B', 'G' },
77 struct signature oldsign
;
79 static const char *optString
;
86 opt
= getopt( argc
, argv
, optString
);
92 strncpy(sign
.firmware_version
, optarg
, sizeof(sign
.firmware_version
)-1);
93 sign
.firmware_version
[sizeof(sign
.firmware_version
)-1]='\0'; /* Make sure that string is terminated correctly */
97 sign
.device_id
= atoi(optarg
);
98 if (sign
.device_id
== 0)
99 sign
.device_id
= (int)strtol(optarg
, NULL
, 16);
111 opt
= getopt( argc
, argv
, optString
);
114 chksum_crc32gentab();
116 filename
=argv
[optind
];
117 if (access(filename
, W_OK
) || access(filename
, R_OK
))
119 printf("Not open input file %s\n", filename
);
122 f
= fopen(argv
[optind
], "r+");
125 fseek(f
, sizeof(sign
)*-1, SEEK_END
);
126 fread(&oldsign
, sizeof(oldsign
), 1, f
);
128 if (strncmp(oldsign
.magic
,"ZNBG", sizeof(oldsign
.magic
)) == 0 )
130 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
);
134 fseek(f
, 0, SEEK_SET
);
135 sign
.crc32
= chksum_crc32(f
);
136 fwrite(&sign
, sizeof(sign
), 1, f
);
139 printf("Image signed as:\nDevice ID: 0x%08x\nFirmware version: %s\nImage CRC32: 0x%x\n", sign
.device_id
, sign
.firmware_version
, sign
.crc32
);