]>
git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/C/GenCrc32/GenCrc32.c
e1e11c641368154e14d6fd782a8ceb4026af53a9
2 Calculate Crc32 value and Verify Crc32 value for input data.
4 Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
20 #include "EfiUtilityMsgs.h"
21 #include "CommonLib.h"
24 #define UTILITY_NAME "GenCrc32"
25 #define UTILITY_MAJOR_VERSION 0
26 #define UTILITY_MINOR_VERSION 2
29 #define CRC32_ENCODE 1
30 #define CRC32_DECODE 2
40 Displays the standard utility information to SDTOUT
52 fprintf (stdout
, "%s Version %d.%d %s \n", UTILITY_NAME
, UTILITY_MAJOR_VERSION
, UTILITY_MINOR_VERSION
, __BUILD_VERSION
);
63 Displays the utility usage syntax to STDOUT
78 fprintf (stdout
, "Usage: GenCrc32 -e|-d [options] <input_file>\n\n");
81 // Copyright declaration
83 fprintf (stdout
, "Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.\n\n");
88 fprintf (stdout
, "optional arguments:\n");
89 fprintf (stdout
, " -h, --help Show this help message and exit\n");
90 fprintf (stdout
, " --version Show program's version number and exit\n");
91 fprintf (stdout
, " --debug [DEBUG] Output DEBUG statements, where DEBUG_LEVEL is 0 (min)\n\
93 fprintf (stdout
, " -v, --verbose Print informational statements\n");
94 fprintf (stdout
, " -q, --quiet Returns the exit code, error messages will be\n\
96 fprintf (stdout
, " -s, --silent Returns only the exit code; informational and error\n\
97 messages are not displayed\n");
98 fprintf (stdout
, " -e, --encode Calculate CRC32 value for the input file\n");
99 fprintf (stdout
, " -d, --decode Verify CRC32 value for the input file\n");
100 fprintf (stdout
, " -o OUTPUT_FILENAME, --output OUTPUT_FILENAME\n\
101 Output file name\n");
102 fprintf (stdout
, " --sfo Reserved for future use\n");
119 argc - Number of command line parameters.
120 argv - Array of pointers to parameter strings.
123 STATUS_SUCCESS - Utility exits successfully.
124 STATUS_ERROR - Some error occurred during execution.
129 CHAR8
*OutputFileName
;
130 CHAR8
*InputFileName
;
140 // Init local variables
143 Status
= EFI_SUCCESS
;
144 InputFileName
= NULL
;
145 OutputFileName
= NULL
;
146 FileAction
= CRC32_NULL
;
152 SetUtilityName (UTILITY_NAME
);
155 Error (NULL
, 0, 1001, "Missing options", "no options input");
161 // Parse command line
166 if ((stricmp (argv
[0], "-h") == 0) || (stricmp (argv
[0], "--help") == 0)) {
168 return STATUS_SUCCESS
;
171 if (stricmp (argv
[0], "--version") == 0) {
173 return STATUS_SUCCESS
;
177 if ((stricmp (argv
[0], "-o") == 0) || (stricmp (argv
[0], "--output") == 0)) {
178 if (argv
[1] == NULL
|| argv
[1][0] == '-') {
179 Error (NULL
, 0, 1003, "Invalid option value", "Output File name is missing for -o option");
182 OutputFileName
= argv
[1];
188 if ((stricmp (argv
[0], "-e") == 0) || (stricmp (argv
[0], "--encode") == 0)) {
189 FileAction
= CRC32_ENCODE
;
195 if ((stricmp (argv
[0], "-d") == 0) || (stricmp (argv
[0], "--decode") == 0)) {
196 FileAction
= CRC32_DECODE
;
202 if ((stricmp (argv
[0], "-v") == 0) || (stricmp (argv
[0], "--verbose") == 0)) {
203 SetPrintLevel (VERBOSE_LOG_LEVEL
);
204 VerboseMsg ("Verbose output Mode Set!");
210 if ((stricmp (argv
[0], "-q") == 0) || (stricmp (argv
[0], "--quiet") == 0)) {
211 SetPrintLevel (KEY_LOG_LEVEL
);
212 KeyMsg ("Quiet output Mode Set!");
218 if (stricmp (argv
[0], "--debug") == 0) {
219 Status
= AsciiStringToUint64 (argv
[1], FALSE
, &LogLevel
);
220 if (EFI_ERROR (Status
)) {
221 Error (NULL
, 0, 1003, "Invalid option value", "%s = %s", argv
[0], argv
[1]);
225 Error (NULL
, 0, 1003, "Invalid option value", "Debug Level range is 0-9, current input level is %d", (int) LogLevel
);
228 SetPrintLevel (LogLevel
);
229 DebugMsg (NULL
, 0, 9, "Debug Mode Set", "Debug Output Mode Level %s is set!", argv
[1]);
235 if (argv
[0][0] == '-') {
236 Error (NULL
, 0, 1000, "Unknown option", argv
[0]);
241 // Get Input file file name.
243 InputFileName
= argv
[0];
248 VerboseMsg ("%s tool start.", UTILITY_NAME
);
251 // Check Input parameters
253 if (FileAction
== CRC32_NULL
) {
254 Error (NULL
, 0, 1001, "Missing option", "either the encode or the decode option must be specified!");
256 } else if (FileAction
== CRC32_ENCODE
) {
257 VerboseMsg ("File will be encoded by Crc32");
258 } else if (FileAction
== CRC32_DECODE
) {
259 VerboseMsg ("File will be decoded by Crc32");
262 if (InputFileName
== NULL
) {
263 Error (NULL
, 0, 1001, "Missing option", "Input files are not specified");
266 VerboseMsg ("Input file name is %s", InputFileName
);
269 if (OutputFileName
== NULL
) {
270 Error (NULL
, 0, 1001, "Missing option", "Output file are not specified");
273 VerboseMsg ("Output file name is %s", OutputFileName
);
277 // Open Input file and read file data.
279 InFile
= fopen (LongFilePath (InputFileName
), "rb");
280 if (InFile
== NULL
) {
281 Error (NULL
, 0, 0001, "Error opening file", InputFileName
);
285 fseek (InFile
, 0, SEEK_END
);
286 FileSize
= ftell (InFile
);
287 fseek (InFile
, 0, SEEK_SET
);
289 FileBuffer
= (UINT8
*) malloc (FileSize
);
290 if (FileBuffer
== NULL
) {
291 Error (NULL
, 0, 4001, "Resource", "memory cannot be allcoated!");
296 fread (FileBuffer
, 1, FileSize
, InFile
);
298 VerboseMsg ("the size of the input file is %u bytes", (unsigned) FileSize
);
303 OutFile
= fopen (LongFilePath (OutputFileName
), "wb");
304 if (OutFile
== NULL
) {
305 Error (NULL
, 0, 0001, "Error opening file", OutputFileName
);
310 // Calculate Crc32 value
312 if (FileAction
== CRC32_ENCODE
) {
313 Status
= CalculateCrc32 (FileBuffer
, FileSize
, &Crc32Value
);
314 if (Status
!= EFI_SUCCESS
) {
315 Error (NULL
, 0, 3000, "Invalid", "Calculate CRC32 value failed!");
319 // Done, write output file.
321 fwrite (&Crc32Value
, 1, sizeof (Crc32Value
), OutFile
);
322 VerboseMsg ("The calculated CRC32 value is 0x%08x", (unsigned) Crc32Value
);
323 fwrite (FileBuffer
, 1, FileSize
, OutFile
);
324 VerboseMsg ("the size of the encoded file is %u bytes", (unsigned) FileSize
+ sizeof (UINT32
));
327 // Verify Crc32 Value
329 Status
= CalculateCrc32 (FileBuffer
+ sizeof (UINT32
), FileSize
- sizeof (UINT32
), &Crc32Value
);
330 if (Status
!= EFI_SUCCESS
) {
331 Error (NULL
, 0, 3000, "Invalid", "Calculate CRC32 value failed!");
334 VerboseMsg ("The calculated CRC32 value is 0x%08x and File Crc32 value is 0x%08x", (unsigned) Crc32Value
, (unsigned) (*(UINT32
*)FileBuffer
));
335 if (Crc32Value
!= *(UINT32
*)FileBuffer
) {
336 Error (NULL
, 0, 3000, "Invalid", "CRC32 value of input file is not correct!");
337 Status
= STATUS_ERROR
;
341 // Done, write output file.
343 fwrite (FileBuffer
+ sizeof (UINT32
), 1, FileSize
- sizeof (UINT32
), OutFile
);
344 VerboseMsg ("the size of the decoded file is %u bytes", (unsigned) FileSize
- sizeof (UINT32
));
348 if (FileBuffer
!= NULL
) {
352 if (OutFile
!= NULL
) {
356 VerboseMsg ("%s tool done with return code is 0x%x.", UTILITY_NAME
, GetUtilityStatus ());
358 return GetUtilityStatus ();