From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by mx.groups.io with SMTP id smtpd.web09.9244.1662015460600899185 for ; Wed, 31 Aug 2022 23:57:40 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=jjDzWOHd; spf=permerror, err=too many SPF records (domain: intel.com, ip: 134.134.136.24, mailfrom: wenzhao1.li@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1662015460; x=1693551460; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=5yY8kuVSCEGB1Xda3W3FvOERhiFmOca/NK8+LBcnu00=; b=jjDzWOHdvcXpB4X6wwGqSzqKIEoqhI+a0547TUXRnmilZfM6beMALMMc oFUlf4Ifm7murQxJ/g0n563cYwBse/warhXtiYAws1r7jFjfETsNnVw4+ L2GxUyUJFE2jf5fPsJDUkne3gGP8any3uyBj3A2NV9kWSpPAx/FnLborl IzGHqpUDeBzsOK5UK7+kpAX/iNIJy3CWSpoWgp7ztqrQ9MuvgZ2oEnSr2 krDK3FE4yqT/CrLdMjVTESYxPVW0fDzO/I0nOFQcRHtyg1J61JHYss8sm NFw1t0R57M4FT61Xe/vw5eqwd6clN/dtkgMgsijQigiK7M0Wo6PCPY1wS Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10456"; a="296417986" X-IronPort-AV: E=Sophos;i="5.93,280,1654585200"; d="scan'208";a="296417986" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Aug 2022 23:57:15 -0700 X-IronPort-AV: E=Sophos;i="5.93,280,1654585200"; d="scan'208";a="563335968" Received: from liwenzha-mobl.ccr.corp.intel.com ([10.238.1.245]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Aug 2022 23:57:14 -0700 From: liwenzha To: devel@edk2.groups.io Cc: Bob Feng , Liming Gao , Yuwei Chen Subject: [PATCH] [edk2-basetools]GenCrc32:Convert the C tool of calculating the crc32 into a python tool Date: Thu, 1 Sep 2022 14:57:02 +0800 Message-Id: <20220901065702.2412-1-wenzhao1.li@intel.com> X-Mailer: git-send-email 2.37.0.windows.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit description This patch converts the C tool of calculating the crc32 value of file into a python file. To realize this,after reading the data into the file in binary form from an original file,a lookup table is listed to do XOR and shifting calculation for each bit in the file.The 32-bit result is placed at the beginning of the file as the header.The verification part will recalculate the crc32 value of the data behind the header again.When header is equal to the recalculating result,which means the crc32 value of this file is correct and the file is valid.In the unit testing part,some files which have been preprocessed by C tool are placed in a folder.The file after processing by python tool will be compared with these files to check whether the result is correct. Cc: Bob Feng Cc: Liming Gao Signed-off-by: Yuwei Chen --- edk2basetools/GenCrc32/GenCrc32.py | 373 ++++++++++++++++++ edk2basetools/GenCrc32/__init__.py | 10 + edk2basetools/tests/GenCrc32/decode/PcdPeim | Bin 0 -> 18912 bytes .../tests/GenCrc32/decode/PcdPeim_crc32 | Bin 0 -> 18916 bytes .../tests/GenCrc32/decode/S3Resume2Pei | Bin 0 -> 18272 bytes .../tests/GenCrc32/decode/S3Resume2Pei_crc32 | Bin 0 -> 18276 bytes edk2basetools/tests/GenCrc32/decode/demo | 1 + edk2basetools/tests/GenCrc32/decode/demo_crc | 1 + .../tests/GenCrc32/encode/PcdPeim.efi | Bin 0 -> 18912 bytes .../tests/GenCrc32/encode/PcdPeim_crc32 | Bin 0 -> 18916 bytes .../tests/GenCrc32/encode/S3Resume2Pei.efi | Bin 0 -> 18272 bytes .../tests/GenCrc32/encode/S3Resume2Pei_crc32 | Bin 0 -> 18276 bytes edk2basetools/tests/GenCrc32/encode/demo.bin | 1 + edk2basetools/tests/GenCrc32/encode/demo_crc | 1 + edk2basetools/tests/GenCrc32/test_gencrc32.py | 124 ++++++ 15 files changed, 511 insertions(+) create mode 100644 edk2basetools/GenCrc32/GenCrc32.py create mode 100644 edk2basetools/GenCrc32/__init__.py create mode 100644 edk2basetools/tests/GenCrc32/decode/PcdPeim create mode 100644 edk2basetools/tests/GenCrc32/decode/PcdPeim_crc32 create mode 100644 edk2basetools/tests/GenCrc32/decode/S3Resume2Pei create mode 100644 edk2basetools/tests/GenCrc32/decode/S3Resume2Pei_crc32 create mode 100644 edk2basetools/tests/GenCrc32/decode/demo create mode 100644 edk2basetools/tests/GenCrc32/decode/demo_crc create mode 100644 edk2basetools/tests/GenCrc32/encode/PcdPeim.efi create mode 100644 edk2basetools/tests/GenCrc32/encode/PcdPeim_crc32 create mode 100644 edk2basetools/tests/GenCrc32/encode/S3Resume2Pei.efi create mode 100644 edk2basetools/tests/GenCrc32/encode/S3Resume2Pei_crc32 create mode 100644 edk2basetools/tests/GenCrc32/encode/demo.bin create mode 100644 edk2basetools/tests/GenCrc32/encode/demo_crc create mode 100644 edk2basetools/tests/GenCrc32/test_gencrc32.py diff --git a/edk2basetools/GenCrc32/GenCrc32.py b/edk2basetools/GenCrc32/GenCrc32.py new file mode 100644 index 0000000..e27e4b0 --- /dev/null +++ b/edk2basetools/GenCrc32/GenCrc32.py @@ -0,0 +1,373 @@ +#@file +#Calculate Crc32 value and Verify Crc32 value for input data. +# +#Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
+#SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +# +#Import Modules +# +import io +import logging +import argparse +import os +import sys + +mCrcTable=[0x00000000, + 0x77073096, + 0xEE0E612C, + 0x990951BA, + 0x076DC419, + 0x706AF48F, + 0xE963A535, + 0x9E6495A3, + 0x0EDB8832, + 0x79DCB8A4, + 0xE0D5E91E, + 0x97D2D988, + 0x09B64C2B, + 0x7EB17CBD, + 0xE7B82D07, + 0x90BF1D91, + 0x1DB71064, + 0x6AB020F2, + 0xF3B97148, + 0x84BE41DE, + 0x1ADAD47D, + 0x6DDDE4EB, + 0xF4D4B551, + 0x83D385C7, + 0x136C9856, + 0x646BA8C0, + 0xFD62F97A, + 0x8A65C9EC, + 0x14015C4F, + 0x63066CD9, + 0xFA0F3D63, + 0x8D080DF5, + 0x3B6E20C8, + 0x4C69105E, + 0xD56041E4, + 0xA2677172, + 0x3C03E4D1, + 0x4B04D447, + 0xD20D85FD, + 0xA50AB56B, + 0x35B5A8FA, + 0x42B2986C, + 0xDBBBC9D6, + 0xACBCF940, + 0x32D86CE3, + 0x45DF5C75, + 0xDCD60DCF, + 0xABD13D59, + 0x26D930AC, + 0x51DE003A, + 0xC8D75180, + 0xBFD06116, + 0x21B4F4B5, + 0x56B3C423, + 0xCFBA9599, + 0xB8BDA50F, + 0x2802B89E, + 0x5F058808, + 0xC60CD9B2, + 0xB10BE924, + 0x2F6F7C87, + 0x58684C11, + 0xC1611DAB, + 0xB6662D3D, + 0x76DC4190, + 0x01DB7106, + 0x98D220BC, + 0xEFD5102A, + 0x71B18589, + 0x06B6B51F, + 0x9FBFE4A5, + 0xE8B8D433, + 0x7807C9A2, + 0x0F00F934, + 0x9609A88E, + 0xE10E9818, + 0x7F6A0DBB, + 0x086D3D2D, + 0x91646C97, + 0xE6635C01, + 0x6B6B51F4, + 0x1C6C6162, + 0x856530D8, + 0xF262004E, + 0x6C0695ED, + 0x1B01A57B, + 0x8208F4C1, + 0xF50FC457, + 0x65B0D9C6, + 0x12B7E950, + 0x8BBEB8EA, + 0xFCB9887C, + 0x62DD1DDF, + 0x15DA2D49, + 0x8CD37CF3, + 0xFBD44C65, + 0x4DB26158, + 0x3AB551CE, + 0xA3BC0074, + 0xD4BB30E2, + 0x4ADFA541, + 0x3DD895D7, + 0xA4D1C46D, + 0xD3D6F4FB, + 0x4369E96A, + 0x346ED9FC, + 0xAD678846, + 0xDA60B8D0, + 0x44042D73, + 0x33031DE5, + 0xAA0A4C5F, + 0xDD0D7CC9, + 0x5005713C, + 0x270241AA, + 0xBE0B1010, + 0xC90C2086, + 0x5768B525, + 0x206F85B3, + 0xB966D409, + 0xCE61E49F, + 0x5EDEF90E, + 0x29D9C998, + 0xB0D09822, + 0xC7D7A8B4, + 0x59B33D17, + 0x2EB40D81, + 0xB7BD5C3B, + 0xC0BA6CAD, + 0xEDB88320, + 0x9ABFB3B6, + 0x03B6E20C, + 0x74B1D29A, + 0xEAD54739, + 0x9DD277AF, + 0x04DB2615, + 0x73DC1683, + 0xE3630B12, + 0x94643B84, + 0x0D6D6A3E, + 0x7A6A5AA8, + 0xE40ECF0B, + 0x9309FF9D, + 0x0A00AE27, + 0x7D079EB1, + 0xF00F9344, + 0x8708A3D2, + 0x1E01F268, + 0x6906C2FE, + 0xF762575D, + 0x806567CB, + 0x196C3671, + 0x6E6B06E7, + 0xFED41B76, + 0x89D32BE0, + 0x10DA7A5A, + 0x67DD4ACC, + 0xF9B9DF6F, + 0x8EBEEFF9, + 0x17B7BE43, + 0x60B08ED5, + 0xD6D6A3E8, + 0xA1D1937E, + 0x38D8C2C4, + 0x4FDFF252, + 0xD1BB67F1, + 0xA6BC5767, + 0x3FB506DD, + 0x48B2364B, + 0xD80D2BDA, + 0xAF0A1B4C, + 0x36034AF6, + 0x41047A60, + 0xDF60EFC3, + 0xA867DF55, + 0x316E8EEF, + 0x4669BE79, + 0xCB61B38C, + 0xBC66831A, + 0x256FD2A0, + 0x5268E236, + 0xCC0C7795, + 0xBB0B4703, + 0x220216B9, + 0x5505262F, + 0xC5BA3BBE, + 0xB2BD0B28, + 0x2BB45A92, + 0x5CB36A04, + 0xC2D7FFA7, + 0xB5D0CF31, + 0x2CD99E8B, + 0x5BDEAE1D, + 0x9B64C2B0, + 0xEC63F226, + 0x756AA39C, + 0x026D930A, + 0x9C0906A9, + 0xEB0E363F, + 0x72076785, + 0x05005713, + 0x95BF4A82, + 0xE2B87A14, + 0x7BB12BAE, + 0x0CB61B38, + 0x92D28E9B, + 0xE5D5BE0D, + 0x7CDCEFB7, + 0x0BDBDF21, + 0x86D3D2D4, + 0xF1D4E242, + 0x68DDB3F8, + 0x1FDA836E, + 0x81BE16CD, + 0xF6B9265B, + 0x6FB077E1, + 0x18B74777, + 0x88085AE6, + 0xFF0F6A70, + 0x66063BCA, + 0x11010B5C, + 0x8F659EFF, + 0xF862AE69, + 0x616BFFD3, + 0x166CCF45, + 0xA00AE278, + 0xD70DD2EE, + 0x4E048354, + 0x3903B3C2, + 0xA7672661, + 0xD06016F7, + 0x4969474D, + 0x3E6E77DB, + 0xAED16A4A, + 0xD9D65ADC, + 0x40DF0B66, + 0x37D83BF0, + 0xA9BCAE53, + 0xDEBB9EC5, + 0x47B2CF7F, + 0x30B5FFE9, + 0xBDBDF21C, + 0xCABAC28A, + 0x53B39330, + 0x24B4A3A6, + 0xBAD03605, + 0xCDD70693, + 0x54DE5729, + 0x23D967BF, + 0xB3667A2E, + 0xC4614AB8, + 0x5D681B02, + 0x2A6F2B94, + 0xB40BBE37, + 0xC30C8EA1, + 0x5A05DF1B, + 0x2D02EF8D] + + +parser=argparse.ArgumentParser(description=''' +Calculate Crc32 value and Verify Crc32 value for input data. +''') +parser.add_argument("-e","--encode",dest="inputfilename1", + help="Calculate andverify CRC32 value for the input file.") +parser.add_argument("-d","--decode",dest="inputfilename2", + help="Verify CRC32 value for the input file.") +parser.add_argument("-o","--output",dest="outputfilename", + help="Output file name.") +parser.add_argument("-s","--silent",help="Returns only the exit code;informational and error messages are not displayed.") +parser.add_argument("--version", action="version", version='%(prog)s Version 2.0', + help="Show program's version number and exit.") + +group=parser.add_mutually_exclusive_group() +group.add_argument("-v","--verbose",action="store_true", + help="Print information statements") +group.add_argument("-q","--quiet",action="store_true", + help="Disable all messages except fatal errors") + + + +#Calculate the Crc32 and store it in the file +def CalculateCrc32(inputfile:str, outputfile:str, filebytes=b''): + logger=logging.getLogger('GenCrC32') + status=0 + try: + Crc=0xffffffff + if filebytes != b'': + temp = filebytes + status=1 + else: + with open(inputfile,'rb') as fin: + temp=fin.read() + + DataSize = len(temp) + for Index in range(DataSize): + Crc=(Crc>>8)^mCrcTable[(Crc&0xff)^temp[Index]] + CrcOut=Crc^0xffffffff + CrcOut=CrcOut.to_bytes(4,byteorder="little") + with open(outputfile,'wb') as fout: + if status==0: + fout.write(CrcOut) + fout.write(temp) + except Exception as e: + logger.error("Calculation failed!") + raise(e) + return CrcOut + + +#Verify the CRC and checkout if the file is correct +def VerifyCrc32(inputfile1:str,outputfile1:str): + logger=logging.getLogger('GenCrC32') + try: + with open(inputfile1,'rb') as fin3: + head=fin3.read() + header=head[0:4] + calres=CalculateCrc32('', outputfile1, head[4:]) + + if calres==header: + return calres + else: + logger.error("Invalid file!") + raise(e) + + except Exception as e: + logger.error("Verification failed!") + raise(e) + + +def main(): + args=parser.parse_args() + + logger=logging.getLogger('GenCrc32') + if args.quiet: + logger.setLevel(logging.CRITICAL) + if args.verbose: + logger.setLevel(logging.DEBUG) + lh = logging.StreamHandler(sys.stdout) + lf = logging.Formatter("%(levelname)-8s: %(message)s") + lh.setFormatter(lf) + logger.addHandler(lh) + + try: + if len(sys.argv)==1: + parser.print_help() + logger.error("Missing options") + raise(e) + if args.inputfilename1: + CalculateCrc32(args.inputfilename1,args.outputfilename) + elif args.inputfilename2: + VerifyCrc32(args.inputfilename2,args.outputfilename) + except Exception as e: + return 1 + return 0 + + +if __name__=="__main__": + exit(main()) \ No newline at end of file diff --git a/edk2basetools/GenCrc32/__init__.py b/edk2basetools/GenCrc32/__init__.py new file mode 100644 index 0000000..b35de32 --- /dev/null +++ b/edk2basetools/GenCrc32/__init__.py @@ -0,0 +1,10 @@ +# @file +# Calculate the crc32 value of file. +# +# Copyright (c) 2021, Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +# Import Modules diff --git a/edk2basetools/tests/GenCrc32/decode/PcdPeim b/edk2basetools/tests/GenCrc32/decode/PcdPeim new file mode 100644 index 0000000000000000000000000000000000000000..db03070a222507e0d035754fb46973ac92b32931 GIT binary patch literal 18912 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

?Ub5;NY7Z0S5YO)Je8p0 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 NT#2E7r*z}b{{lGaaHjwO literal 0 HcmV?d00001 diff --git a/edk2basetools/tests/GenCrc32/decode/S3Resume2Pei_crc32 b/edk2basetools/tests/GenCrc32/decode/S3Resume2Pei_crc32 new file mode 100644 index 0000000000000000000000000000000000000000..d18f172842a5579fe15b9ac8c9bb90ba06b96644 GIT binary patch literal 18276 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 RoR7H}b0voUozjgz{|nl9a@7C; literal 0 HcmV?d00001 diff --git a/edk2basetools/tests/GenCrc32/decode/demo b/edk2basetools/tests/GenCrc32/decode/demo new file mode 100644 index 0000000..9f9601c --- /dev/null +++ b/edk2basetools/tests/GenCrc32/decode/demo @@ -0,0 +1 @@ +This is a test file for the GenCrc32 python tool~ \ No newline at end of file diff --git a/edk2basetools/tests/GenCrc32/decode/demo_crc b/edk2basetools/tests/GenCrc32/decode/demo_crc new file mode 100644 index 0000000..546f91f --- /dev/null +++ b/edk2basetools/tests/GenCrc32/decode/demo_crc @@ -0,0 +1 @@ +U@"€This is a test file for the GenCrc32 python tool~ \ No newline at end of file diff --git a/edk2basetools/tests/GenCrc32/encode/PcdPeim.efi b/edk2basetools/tests/GenCrc32/encode/PcdPeim.efi new file mode 100644 index 0000000000000000000000000000000000000000..db03070a222507e0d035754fb46973ac92b32931 GIT binary patch literal 18912 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

?Ub5;NY7Z0S5YO)Je8p0 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 NT#2E7r*z}b{{lGaaHjwO literal 0 HcmV?d00001 diff --git a/edk2basetools/tests/GenCrc32/encode/S3Resume2Pei_crc32 b/edk2basetools/tests/GenCrc32/encode/S3Resume2Pei_crc32 new file mode 100644 index 0000000000000000000000000000000000000000..d18f172842a5579fe15b9ac8c9bb90ba06b96644 GIT binary patch literal 18276 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 RoR7H}b0voUozjgz{|nl9a@7C; literal 0 HcmV?d00001 diff --git a/edk2basetools/tests/GenCrc32/encode/demo.bin b/edk2basetools/tests/GenCrc32/encode/demo.bin new file mode 100644 index 0000000..9f9601c --- /dev/null +++ b/edk2basetools/tests/GenCrc32/encode/demo.bin @@ -0,0 +1 @@ +This is a test file for the GenCrc32 python tool~ \ No newline at end of file diff --git a/edk2basetools/tests/GenCrc32/encode/demo_crc b/edk2basetools/tests/GenCrc32/encode/demo_crc new file mode 100644 index 0000000..546f91f --- /dev/null +++ b/edk2basetools/tests/GenCrc32/encode/demo_crc @@ -0,0 +1 @@ +U@"€This is a test file for the GenCrc32 python tool~ \ No newline at end of file diff --git a/edk2basetools/tests/GenCrc32/test_gencrc32.py b/edk2basetools/tests/GenCrc32/test_gencrc32.py new file mode 100644 index 0000000..4d8e3b8 --- /dev/null +++ b/edk2basetools/tests/GenCrc32/test_gencrc32.py @@ -0,0 +1,124 @@ +#@file +#Calculate Crc32 value and Verify Crc32 value for input data. +# +#Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
+#SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +#Import Modules +import shutil +import unittest +import tempfile +import os +import GenCrc32.GenCrc32 as Gen +import filecmp +import struct as st + + + +class TestGenCrc32(unittest.TestCase): + def setUp(self): + self.tmpdir=tempfile.mkdtemp() + self.binary_file=os.path.join(self.tmpdir,"Binary.bin") + self.create_inputfile() + + + def tearDown(self): + if os.path.exists(self.tmpdir): + shutil.rmtree(self.tmpdir) + + + def create_inputfile(self): + with open(self.binary_file,"wb") as fout: + for i in range(512): + fout.write(st.pack("