From 5ab9a280bc5170724fe94be2d58e39cd2a564854 Mon Sep 17 00:00:00 2001 From: Yuwei Chen Date: Mon, 5 Jun 2023 21:42:48 +0800 Subject: [PATCH] Add Python version GenCrc32 code and unit test cases Cc: Rebecca Cran Cc: Liming Gao Cc: Bob Feng Signed-off-by: Wenzhao Li Signed-off-by: Yuwei Chen --- edk2basetools/GenCrc32/GenCrc32.py | 103 +++++++++++++++ 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 | 117 ++++++++++++++++++ 15 files changed, 234 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 00000000..c407a50b --- /dev/null +++ b/edk2basetools/GenCrc32/GenCrc32.py @@ -0,0 +1,103 @@ +## @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 logging +import argparse +import sys +from binascii import crc32 + + +parser = argparse.ArgumentParser(description=''' +Calculate Crc32 value and Verify Crc32 value for input data. +''') +parser.add_argument("-e", "--encode", dest="EncodeInputFile", + help="Calculate andverify CRC32 value for the input file.") +parser.add_argument("-d", "--decode", dest="DecodeInputFile", + help="Verify CRC32 value for the input file.") +parser.add_argument("-o", "--output", dest="OutputFile", + 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') + try: + if filebytes != b'': + InputData = filebytes + CrcCheckSum = crc32(InputData).to_bytes(4, byteorder="little") + else: + with open(inputfile, 'rb') as fin: + InputData = fin.read() + CrcCheckSum = crc32(InputData).to_bytes(4, byteorder="little") + with open(outputfile, 'wb') as fout: + fout.write(CrcCheckSum) + fout.write(InputData) + except Exception as err: + logger.error("Calculation failed!") + raise (err) + return CrcCheckSum + + +## Verify the CRC and checkout if the file is correct +def VerifyCrc32(inputfile: str, outputfile=""): + logger = logging.getLogger('GenCrC32') + try: + with open(inputfile, 'rb') as fin: + InputData = fin.read() + CurCrcCheckSum = InputData[0:4] + CalCrcCheckSum = CalculateCrc32('', '', InputData[4:]) + if CurCrcCheckSum != CalCrcCheckSum: + logger.error("Invalid file!") + elif outputfile != "": + with open(outputfile, 'wb') as fout: + fout.write(InputData[4:]) + except Exception as err: + logger.error("Verification failed!") + raise (err) + + +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 not args.OutputFile: + parser.print_help() + logger.error("Missing options - outputfile!") + assert () + if args.EncodeInputFile: + CalculateCrc32(args.EncodeInputFile, args.OutputFile) + elif args.DecodeInputFile: + VerifyCrc32(args.DecodeInputFile, args.OutputFile) + except Exception: + return 1 + return 0 + + +if __name__ == "__main__": + exit(main()) diff --git a/edk2basetools/GenCrc32/__init__.py b/edk2basetools/GenCrc32/__init__.py new file mode 100644 index 00000000..b35de32b --- /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 zAxsVlJEgY$;>|Lh2>{hNmdV&QOW3qH1W-p}&+bUWRp^rvK}*JM3$egIWk(0mJ+&jf zr+Wkq#bD$7YZq?19+tj|i&NTA{^w3)1_VDJqha~y*oKRe+#5*lo0sq2L2^@<4ef$; zw5b}>92BR<`7<4*LfW5$Ao2_e=Cq!Jo2U6TTaBz-Yd_R9IdG>g=H79FhVAVXHTP!6 zsETz3cE4uJ$tu>lN`Ci!N{2WBCs-NG?+e~}u{(}(&jio!Dc#OkzB>%fi!Z`cX!FhT zwbs{r&p7bjruPgh?mHP99Jibme_jyG*Nom9EZ1%i?gae3WBt!kc8uyfa7rje7Q{)l zlVS<0*-;SOc9JtvrW0mR^VoL4|1Hmls7@V=5zxDjlk~+zcfc=^xF+E69e}*2G82HM z0F1nap*>VRAI}n|*e`9=dYWmjlIC{r!y8T9a1nzvW1yMUH1kWEfwj5clFfxI@iA;t z?A;qDdcp+L2pE}#m#|BK=vuK&0^sji4~t;2fzaZLtq#x?c2IL6J|ZJAcpM9W#6N(f zO+g|1RrdFCP_!MDh zVn!pQ3oYyiXc7O%Zq;7s*n;zULkzo9>qi$GiRbq$jp_VA!|#dbp9zodoCdZ5l*+eC zXOh^7Vgt^OpeY)KU%^=TKmqn$)&tga+fHUp#cSarQ(i%Er3NmaaBq=m3_fG=;W2K) zCq2+Nif{cT`maFW7@YP?H`CEo38vI-2RTFn9hhN#&(oMf{xYy$6kQy9sg-_G5fF`n zHz1C}4{^j8zKxE!0taJzUL+`F-QF$^`v!j^n1MyW27>LPotqG94H zumO_bB!ajk!zA`842)NFC7AMv_+k(z>-Xdk7d55?4u>{(YT1!U0#0<#*YNkeAnQ7T z^n)3`H5;l9^uRIhh6CU{J#oLVGSFk-TmOMr2=vV1TP=nw{K!j2hLL?80$@pz2`>|u+^Cr>}>`0@mYdX0UWtXYs%Ts~%N@SOD4K?2;Aw018 zdiL736Y!b4LOK0`KI5jD>-J6z?K}y7BVz;SM{JtB?#$$E-M8Zz+)In>r}?($q0eQW zqNr3gBvmSHNlPM&!?MsD2?r zzZH}tR)d(Ph}BRev*wFzL*Mo{T283LCsg;AnZ}&!iWNq5=b6SNvaY~!4gWx%X)I{w z*N<9`ee~$S$-g5NC%~R4On2S11s!YCWCR76@sC4Np_Q|H-wzz&djB3VLzz0vWJuFf zB9kyXmaEq-hn*=XT zru8a}nxSq(Rb*Pd%KAFAU&%UEXR3O8$q2~u=}7n*wl9$qeR|6lkQBxtcaI5W_oF)Z zs^}*zCXA2agpt{JO-R4QG(n+weF6sg7}f<}m_8LbKEnv@^KCakT&Oyag11LU4`1(H z@T^gLK7>#8{1|#-aiOi0HnXI@fm-f?UtfgIL14Z;KD3ou?ZPVo8YF;c3V3*a!C3kl zLtk3@8ckoL=xZc>X%HpxbT-|9$fx$l6KXY4A@H0AC-rDn9O6khbKr&asKZ7UQc{3^ z4Lu(t4Cq0MdpS*zGXHI=7$d0A)=O$ntz(~J%HlY z9US0+iV>6Fh67E524`V9x!y>j7aNbT45c z@(QM@z;pvZEwE50(C8iYG2(`ym$5*K%2?H$BLy=7UX^4f3`jp5vC zhtiOJ{gxh@$Jut$cVEa1T+6Y7+TZY^Gqf_Kv^C|I%|6z ztTi50ng3oFhEfZV?mKY9KeL38>4unyh@xRBB=v%@bgCpNgtTgaHdYU%3243QY?c(X zL{?YjKGuM1+h;SnQqrcjw4Oe%lsP8950&XqMlK$-G3^hV0TkoOx%|DISgDlWnl?q;;yU@Ej5C5RTI5op)HgELS)fjJ{ zNdRl+SGsG~B~=#JxQo3t{sy;W-P+3X#=4DeUsH8Mr6V`5(&4VFbgZeFvj*+$6Zy6At>FjeE{j;Wt%-id!HeGEdbFK6iD^=2^x%K|$8&6%-zaKs9bQu7?We zkZfji&eEkt`PopsB_m_*OsIH}mMkx1srC9BYm9Y`iUx%0)eUZvVkj&aiHfSo6XokN zc^5TqtZsn0>KZrr1sUHgqW~q;xNEEZ4H%M@v8k@1L1JB?8-J6#Mj}||UFU9G;$Oeo z?K37C=fW$@Mcy^l4bpfn*c51ZCb!TJ8pEA~W`&v-^M!FS@Ovxe_i5k z9yUR?H4h)VrUtK}D@(H?ZmKLT{=L&xb!ur=v@{4uHbLB8!GA$rgS)W0v8LfFQbQ1k zowqutuCdy;`HH2Sd7)bsaK!xsv0<6}TdI<66N3r>a^DyHyp`HM?uFg&cofLroP1imRLJ*8A6I zH?66wlhMcv{+%49)wS+HKJwg60{nrrJX{*`ar&EHZJu5;(>T3)zOgjBARpzVWYLm^ zRk=%-;4T|_tjaCS&s}VuUOm%TTMY-SnPW7TxCOtj5qWneQU08NC~}}=tC08 zTQFkI^={YAlk_b z<%^Wuq}wK8xY;<2qtg4XoB)2zT>($UKk94II7vl}G$9vwYmH{A=Y>misuq?n%Bw1K zIr5<;v$9||3WV`m(KW=kWOH5CQw)zWIlv)fiF*V5vywakV->#Y4IA7(ikWXhQ&xPG z+(4Wu?t%gpm5P$m>`am!5|9`JarZSbJe)^7gJD7i{)X#N$~M=?HBniHFmyAaaR|Q4 zxcLuwS?>0EFVk0n*SEg(bn!8S^xl+=hw?;|Cvgb(22MR;i>}$kO zDY_}jCv$B`C^B7Sn6KsfYFMSrBgN={yi^j4Ge?t_!qhioCAtV@QW5VPGIHfYu#w*A zN9)=oRb9NIP@dN!Vluhumel6i(=EvZUrEi=ElKnw-weN!Ps;d&y7g{apHy>;@|9d; zG}7&S`T`tq-$w9b(4pf8hSFcDf6W>+ILgzIOGUM>k-CEN#&wO}O^wEd4VyR6YiKSy zk>_r33vOcpilpD?9x_qktGjG`V1<&m%Di4<>H6x1hJguWc=ULbz6Ka5@>bUv^L;+A zZ(s-~%E}(WQSC!3jQFCt^2R3rh7AaAH_52{DO6ij4 zrmlM!eOWGt&nvjs3=mt2%?j#DiMvVa3uHw)y$yb}>bYK@&%Z%X5G#WPu>ByZC0=8( zyQXeXZkm!tqMN-aEb&=D+pXvTU9%D-@JnIY^rHuJJZp2EC|p zjd%S9v~WnGMkhAs=;gRlH+GP9!e*nh&WpTGLmZb|l6%=oiTiwPM`4c3bqZ}@8-;zd zIVnxf0)QPHv{Jt>|0&C9;}IPi^tvK!zWvo}<(XV?>GQ6y!~XL!$FpN^dy4F#P3DzEil(6+E=#+draT zgbmaysdKNSs%uTMC0FL<=aet3a+W4p=B8CH%C>%!gBE!a9l4-BuAj4^W;O8t|MoY% z_-xFH;y+AVaMm_&!P#kNzG&Qa^V6r2v!8aRmc4Y-2T!@yX&-ZaxH9L#y3sE`_~$#f zt(eG)UE%K+1!u&4l{@#?_C=@v_^ZfQH|PDuIN^6i?TODh9$R&LW%ma;9W6h2^yX&_ z-9KDE^PhF2({t`KTc0}q+wq?C$#+G!_fTnvPE)UGZ;SHi7nb=`@Jr zh>x$M^-Xb-@6x}DFT!syaNiQf{c{Bzok+Hv#{H)wWdEjr&Yy)3!90xd{kX3M4?}s1 z`q~cM+>!jt7*PJVRW6Z69Jj?DYpJgqI!X0b8b4%?q>U)V0#G%0l{{*=2?T2tCn zE~TWV-j%vLl}pP^yF2X%X+KYUIPE}MUz%zD%=!Ok{%iA3%>Qb>#y;M@+Wr@NxBZ|! zVmGCyq^GCvOy8IORr-hwb4F4|S;nf2pJeC_9Uo6@$WWzH|0zh{2e ze8Ile{-FIa`#JlU_V)Ax>2IXZ%&=w%8Lb)L%NUb6Dbtdp;SAoHWlPcv69Si9gm z3pOrzXu)q5gcrQH;Qa+B7o1;kX#pw!5%7Gy#c0X5+-fPaxGWD@p0Mn(ylMH|a?$eO z+{fnbnY(Z92Xkj9%}XjwawN4RZBKeA>G7oJllCROpCl$}tO-`Tb%oVu-D2&szGD5@ zdeQ1iUY-0u$uB0ql5CyVJde%0f8PH>?ic6f+7{dHuW*-qFl*$gS^DFrFpQdr6~ z`)vC!?0>cE(!J?-r9Y5flX*vGAoIb@N5J{@3pfkM!R5K%B|V+QW#NY{xX-fX*$Qn% zHixaucAKrzcDt>{=CL){HrNDPvuz7B+iJVlb{{<8e%nuN5858KJz{&@_Iuk-+f%k( zw&!eN+kV^2w!^kJZAYQ~ECr6ngC|dV-!(TGztQj}$S3=8oGP8;3T_1OFODr2P1{7^ z7D7kTi*%*?_>aJG=H=F^3bBIYmfo)Dp6b1ihfC$S?Bxm=R|Z+R4AAo4C&3+AZZ*|e zDixhbH;#DIecUIN@@@%MBc z-I6VZYjMfZs&FmPYH+R6hGjbrpYfc$GEUzAY+1%}?OozL5ac`0+-{o#=s+ny>@t7% zk;R9cC%R?-%lxn8^`+~jxso+d`nF1{RZE*Sp3R{|rWoRpI!xos|BW{l)6>VIm@L6y zpf15VGu{|>7Q8WXcF;Kt$cgyBybj-(mw$j<$p4h@{BWM_KFZM+{--JPaN7}nfNnH( z#?QugMEUu_6pk|ij$uF1KdP&=#y~`dna=Ff}IydFQ?x|U4 zua!@RdQ5?uGIF`P-mN}2z50`C=Tt|Z|JlLoK+8r6*1M;lQ++~kfoGvv(HLVmT#gxq zYaqsZrhJ-t_S(kDP$6TCEsU`=rTQ~RFBo43dhRQqCKh5WO#vJjZ|o_QE;!B)7ZuAr zw{hG-GS?r^qgb?eZJ%c_Q`snze~rv9?)(yS9U8b_o)1XJVa)+v8>yrG-mSiT+NNq*t3SAh`^Z%99sXQlik-E+^WBjP{d(pq-5Y`A>KU z?Q&h$M(LvsOu7pZ$bzfI<~H!IO_diAgy{n3%KeMObP>R6=~SP7Bn;xoccXT>^uva{ zj#TiIUkl+l#%{L3{2Z{&q@H}1Cl+dVl1o2gaOwYIkbvRQNEb2KKDd2Wk@@ve*!>D@ zQL#A?(t-O6Y(P`KvEOSs$At_dXM?jc-end9RC9A4Vdg1h`VP)ZP~>K|R> z{lcD=viyUyriim07u1~rnt*@~l#*20GK&c%YXEFch55!AE5cwVV=2;W6^T0g5a!He zW^$M8VodZZDYAW#Z@U+htt&IrRvY>DJMpZ0KVhTVu9h;xf-}SUHWh~CpTjujGZWo1 zfm0^{V3N*{CUROpoXl;CIlc>+j=f~-d<0mYuD^2%R7#Vdo5^wD26Ql#9-b@is!c5~ zc4cS_4CWsJ)%+qZ#d0yw9fw0(b_xFW6@!_f{$kW%rq)kf;%N#qpJpI23`7l7gVA8b z$I}#!S$Q*D?KmvBR}pB~{X}ir7$_hK=xqk1anJQMsm&Pxf(OsdU}|Ar?KxFaLT(83 zx}imuS!k=}9cqp%-}oSfpyR?)V_}i>?(PCDUo3s$+@Xz;pPLR+K^}vqgx{Z|owX2g z)s<&#J?ruC9D*Ri+{k!23$zikjq%e+ms@){gsz+i(zR2h6D9J`@ud3%)ih{Ns>&T* zm{;g3&d0VIwdBu+%hIo+8aNK2k{ zOgcmZ!AD#B8HudG)<01XV!E4JEXEFL*-ls&%@5wABawcxN_uISpw!c9S z-CG@8x|)+egRSL9c-ZI!2Jrk>3?Nc9C_vOr$ZOy$#6u_*p>0Lx6AH}=MpOENmiFQz z`7XQ~JVk+UC>4+_l*f-)RrliQcUeQ9Y zh}M@mJ$VXjw=u-IaZasfeYJB6?5cL08F6OLbY)Vd4V_SF4OD4&6DcOFp9;KDjfi`i zJX7IpZd7=Dh&+(8gn+CtBWgdqZ7lXQ26`gpkf~&s2zeJ0&zt?q^60oApavA14=@6{ z_sfeBwGsF(#Wxb)82ND!g@{5QzCh;;$mOLS0vYo*g+0l9kP7*$w9>)L^9@BxO*a6S z{P8+0BOOx;`YRYKF(T3oMB+FC3;1EQc8;Rm;YB++4y~Qg5Lg22Kht~!@^-$%rsb_P z0|~<*Vc3|28X|8QM}Fb>)n-2cNwU9=V{wm9vPMFUxf$wryr>_IL;V$Q%|$g*+86(iHIZG^))@+0ZhDnx`qy6K76kLvt}iMZ8I6u3`hz*g&YK zNn_s428Q8JPt#IQQ-t|$CmE2|(HP<5qI08#@p!M*}S^*+BikOqOl#?Fs@{0kbFNPSqf?I7h_rzXic^+b!=C2c9oPC z7MvC?-tE25Y1xitP&1f@WpMgn8kWJp=(pVdzwwjSYUHM?9*^8bgk-9wBUqE+%Wz+z zIfI-lDbab{vx_}&zT6K;12Q4Pqk$Q-lyupCPTGkwTmASEPjjGS%Sz6(!m%Zjb8K0Q zZxLtS0d=dLS@9IcwW-LpzO2LOq>fR=iiBg`3WAeRlqc$y>4b!>pr zpMNL(23tr<>2SfvId@t*7|`vl{iOP#%O`Jk3R( z=6rJu8~6wVOqh+H=2CMR8+(%q7XPX-H`gd-p$u!1j`8h3L=LCu%5~B9xl&eGK$gZ( z%YlwcZY4MKfC6mNF}oc=aWVFWam6ugTygy3lE;G;IGig{sv|aCh#$>DEISWVLc>R4 z*nvq|5o2$srFCHe>p(wzR#vDXPuFEI7{HoLDsROC={PJHi{!P4h>{X&lsB+G1(hl< zPd*Wdz$hHauZ@sY22WlNybpeXx~~2nNk7uxlSg$-x+Yy}_tB(b@ZG)_J$HArOnGZ+Z+lcof;SOEpG)4FB&Ct;9J`>UCNIX~``? zYZXeZ)ulg>9Ip~7hz8anM(J%uqWy#;O<}gl48%dV6W|B??eIo8o&@`hq~-Q$NgD(0f&2X2{?T1ZixAplBxz4T z+TuT=2jN(eCE;uDFO`nUDx&6ANxeg-llpAP5SodknNJZkC0Og#7n##GKGnLC0I<$szdq&yJ_i>7Kl26^C9kH<`% zOs$?M1}X*}YajBUm*Z-xb(T4sXv{C|C?FbtA$RP_9np13g{r}B!5$fmhdZk_Pq2;K>&pheO#eKCeioT%+V?d&kIw zBjCe4zF@q^&jAQ=A{|%Uy|h%$BT-;i)=)*nL&#<1$3zTcv;9Xa%?SB-tr7)e=v~a5DSjO;bW%* z3M*G2l0j9=<>#5h6Od;_#vuO%1rxy15gEr)#AGJm40#Hr3!kuTmM?z^OJEn;l9Hnb zlzr~rPU3W7Z}LEI5Doe9Pj&q?7Y{wpu`4U^aziMso?R)$=vnx-?*lVs#Y~P9^HRDN zK$JD9$MD5HTz#K}*Ee0c3NF`@w^$Ej)+LQNv-0ef43O;I}QV zU4ib~52o(Ji4RTS{^}~4@N?}-MJDuvVOx*=cEqbjdK&@tB7`d0a}rZ=vk+RxKs;g52zd;@{X&4;xxzAAQ2_Gzb6_C8c@*X7s=g_ z6!A0l0LPvA%DuefPN<86J<|xbA*d_AM$aP^4v*&82+Oh7zj3I=0Te2XwLBe8!AYQ< zm!AhcSGFKOavR6>_uy>FpZd|<5kA_>Gn7tzu1W98?|>6<`1XItLo4L~*EHLF1?KDg z4#;)vBSU@;7nY2+2l^{=2Ixx{U5{#DTImR4S`Gszr+&D#m!qNMvI_72MW+S!&$~Yk zlTJxHM_{#C7?n<9dOAHEm(K#g3kCfE@Hqxrc3$DA)kwJJj-$%z+<8$kz{ODmTww;# z^#`90e$BbzqBHl3RCqp_7~NT;Q(=}67l!S?FhhH z&b%)J#etJlMMm^f>!l-(!(puhVEWw9yLa|4=*Ci>S0u&KDJaT`dyZq5z@epo2ky8F z8)L-fZI0fhNwIV!YCTKQUP5(nm<1g>IaEoX<9Nwv7GP9!BwcVIi2MV4RdwF zJz~fKux(-P!Q1C(D;}XpI??`?SRp+iV1rQ#$i-5+)^Wx!xEBclZ?(9OyB_lBx&o}4 zS?Qq&Hv659uRP6jB&!BQ?vSQB`J^LFAqRp8^k<6hKLRzJ>E|KF3Tbn%>vB5}U=!Qo zek4ztL7E``Q%L2ctF|gfpGGRyK!{Q)D-@g^M>tWh>vBEd3E*ep@TaRe%Npdk>S<1u zR!GP5rDB!r83ffLSJp*?IeVhkdOCPuETFriZz*7sx~)G^?50Tf50>|#x-MiUPAt$n z=r20;SCBsl3-k`GgYdQtYHtT|QRyH;$2tgjf3U|7D|;0LsNGfCu^V?e6YNW1azWQG zbyp_@i+7}?rt_R_T55HIdbR!Y2YU{r;r+oLT^D^}^00V6F;oFkrM4uikg^I)5B-ur z3lP?yz*-#Jh}uvr8jX+`u}uM6q#HyTNwBMS30V1)-mu-_*s1Z`eVeF~4t2|_-D!RS zxth!*yK2X|a;aPCm(YzVJtHuBr*QcOSD_lAHXn7qq(sV9XYO(COXaxTA<~iH*X(D? z5$j5yb$-}!K{TSLz;8T7O0T1mPJ@5zIZi4ki zvzcaoLNiEBlrdbzRJj`2o79UM+C?x8fKf#F)i6W=3t7(q_{ZuI`9KaMvbf{-5|CTT zN*3_L%!Xv(+eh&meE8X3{AFHzV$Se!hh{V3G!2^V(|2|)IDykcja%LB;oCe^RA@%j zF4et1A7?)J=Fk}s!d~Ob@&Gi4f2lX%5G)%>8-G9iB47{H_2aPh;5xtV4^{j@9J_V} zcQ1gj0E*|^OxRjW8|cR-jdTi;G(9Ot8_7E|F|6y?4Yr<3osU%^N1Ku9+@PY<%H28I z8Tf|a%VS)NZ?a=}I^XsatjUhy8GM_QJuDRGxI}Gy>roB`8Hl04ANW0{XtOB|1q?fP zqSE<6ythcaV!!UQig*Z_1vwBeM;q_B8qGg81J>c&ehbq$t}f*tdlCi+KybSO5j+avp6VT!Qb#Ci2jU6zXrOzG>jt5^ z)^RnGf8<#brc4`#1MjN|{9}*db!+eRfG=DRod~$-_`=U#21}HCMeTDO6(FbkI7CMM zB- zTE$bDI2=0gpJeNE{RsHhqb)FU+xy$5InI3vMN^gRm5w?-)YyfaX5udK_m|{L>lQ5b)I3PA^5T z7wkCq0ZMT={E6l0;dwi73T3+kNdaNdL>=`f%wSHau<5z(IhYOM zYBiRS zQv=_Hounz)gaI`b$6~YCaULB~u*1CX;N%fo^Qo>~bbOY5JwPb~*q_NG@-su|GJ`H^ zx&+f@I$fsGMTIPxO6SRS$b9N#%&s;qEd=I^kffHQpgMVMD`kR=`L(5Dh8W;PcY~y%GRBqiPm|SC(u}~jj@HyIS zaT-==ZCb!J_isRv{wPI@RvQ13P9ly&=0PJ9H?t}u%`kcW65i*Vd&;xq80}y z@!%q0@?Hec0$6Y*orM zmh&J8Vsi;vUiT~5w_xkx(ud)AmUcDlY*+pv1JSTeHJ!1}HV>zw0iT6>*3pG0`I8Hv zy|-FA`N>{vn6df7zIz;C>L}o0AE4Cx+1`yf7-AbWqL`cpiqw*JsPH5|Lx57iBx(#O zc@(ILfSfw)f_z6z%0V+0iCN|o*xb}ED(x^3xg180j-b^r(k1*btQxwcoJ8MN>igZ~ z>QEoYa~H8|Yy(cM73aZ(t07$Fgy+>^{85M2PdbJW(#W6EzTuSgM)%(XTR$8@5VxMi z0U3^^g5Q*mwZ4Xd7Wp&4>~(w`;QHPOP%rE`y%&cE$K=x(MyP7oVUFK59Fpznfev)M zCtccetr*8GB*|yCj;94Z(i_28{G}7}c|wKrA=JC{2(pu;!bxcfRYl)t zdYaLw&o3y?*B2D#uPxW-=da5bB8*~%XtxO|!b0of>D>H?h=?_73)U`<@Io02(h3TV zi@jir7YoTkBu<6tQ<+$1s@fV|mTs@9t14U9R9~%&j*BVF(5Dw>l@}SKBcl?^)}-m8 z%L+}^HLDx#hOJx53L9#gOjcV(U0GUXV@;V+mv6G!>rK%H)1((hr7X=ZTCz+H%PSR* zIKQdc(oj(+EZl;Pq<|k`g=K=iK{Q#>BXK#F$_mjW80+hW)t35tdqWL-H#F7=)fF{$ zrYa!9|wuRf4dPj^k z-}a6$TNGF;8f?`jE15JdW;3)|XB3(%w$?Ok5t>YuqQwd;FWg4I?sE|l>Fd_z=+h7& zktr!rizyVw>M%~&bo1tQhsi0zWohhxV%4)LNm?$v!HUuj^2J?0s z++63KO|KDcLUM`_8;v=iP4wGLm3GlYrZHApYZ}D}1$T9w#by#J>go_k`DwXu`4&Wi zP1tOzw!q~khDJu%3{1hsP>CtxZ0o;(=8IjU4#Bskp+?NGG|;gQhuHUtO37&QSzF&g zdJF60VuXr@DnazQsnXIQS}k=f14PVJ)Payd>IsT|f}*j-%3Q{=1QCon!JuE0iy_K9 zqi!{*;P2yw`6)s~M3beaO1N*alG^&}nlW4XNEKCBYnV9K!%w7#Lb7c-SFD6jkrF=2 z*aWy`E9o_}qSD5^OZ5k66J=Yra!r+JHCQdx$X*}Bbuc#$lN-}B>M~55?OW3A)rfar zM0r6c^B%JS%Ogsoo60Z=mJ)0X_LlZswsH*DXKOgjy1mg-(;$u#p;8AAvh+t`G6|DD zJ{^2;qnZEDz%g+r0#2f*RB0-;*6o6UNv6P0f?J&*IgyUu^~sxKYS<#0sRTwuZp-w3P*5TY*{beETOvfEaQoJw+$s|-%{eujtrgbo zWfbVSrh1EYJ4W(NjYiR0R%)_ZFjj1>XlyiDu@Xgi87%{)n{vxA*~FTL3K3ORVZ8X8 z@LX+a-2TmZ8ZCBfrOC(cX8cfc4V6{UuWa;5=`mPjC;^T_7kM*$vJqjgkB?KTG?po> z6mc;`Wv!`MaWtcVgGm&z>pgW#`+I5Un<}aZTaoP+{_?^XTWdtqD8fWtCKmaxp=E5Y z5i8A13x)T1ohDMEoe zN%W?PLSe(!21|2;kZpmX(ycXBTTDWRiS!rNWUy{EGKTtro5@7YgO4_=SmOs2w~peD z>$4%rXpLK+)>u=yKANr=W<(|q5gD3YQ$-ana$9w^^3DpR&AObL&E@*FPi+N7XEfe3FvPl`phgUhICs+d8rpOr;mAf_ z9;}O?g{OQAYHN9B%{Eh2n#eYXBCDN6|3LU0i`4oW8HH=>UX zW~HUdYk=__ASc*1V91DucXf7JepDPQt))Z!w1w(tt| z&xztgLU?%9`zHmt9uZHdsDp>+GUnsRjib>wy$Q7Fp_WzJdc0tJU5pdI@_6 zGvWI&R%^H9VaYQ{s7IE^U&UcHGp z7}cYXgh$7*qGB#s>^=#V88V2Cmdr7VU{q%%8%>-@+dRqYL}1P8T*GyaE66Okevm9_ zsl=XoyqVWDR9fmA(Z13yya=aO=wmq}&JxgNZ5N7aELaz52pvuS>Is-kdYsXaJ0{u` z*1$4PM^VuUN)-U?*r3jLw#H%C&d@Wl^=0JP#TRus@P{2IBWw`IR*hCmeT@xd#|Lg? zRJ1N8Hf}|HLR$Lj41MM;>iZfCiaTmL$~=x!%GhhJtx{P?BWStDQl#^)K;MuKBNE}; zY>$x{U7v5Vj$wI1>dB*uTZUMFgE}JimfFe*Ncu zjK6w)0pH)u!7(zv4G0<=zTd<5$N17;=zfInWA|~~Q~1tW!f}i6U5xKCe4Frn7+?P& zj{EJs2sLAd@rP%QeM@-utIXg3;rS)E72mtoAAEfF`hR$q>pSD3v)<*6Rhz-}|F6$~ z>7HD4?Dd1$yKjFqD6wbxJCC<+kNk6{?SWriK6k$E(x>ll`SK?(X)f%^es-kpj~mY} zT|VVx|88#D@7F%EY2~tm@6B_Dul$c+WxXE1_Q{a5gLf?o`XJGDHAJ`a+iRZpYd*O0 z<#q83v!8u(=k}58wujmb3%4&HJiPws_PiJG&v@z7_s{QK{sWca=NmVb^?sP%+465M z+_yihw|? z`*`e&vG2zIJ$6pqeR0Kc<#FGQ`$gOz;||AhD`u`(ykhx^gcbS~;)?Anezc-*#f25? z<9p(d#m`MFO>9W~LE_=Ww-YZU1|+GHW+f#iZBN>jv?uAAr0%5tq)(IXPu`ULP;yi9 z)5$+eem(hvWdD>oDfg$Oq~xX4rtD1FoAR@i{V9DZr&9(}zDx;OdH2f1mBy7lD`%{l zzbbiE?y8Netg9TWo?7+%sspR~SG~8&y~?u+3P90)xD`iwBBw>&6?Jb^a#Uv2hNvx3 zk3~Hb)fx3()TO8|qGF>nqBll=H~PoXzmD#R{#*1=^fXTPz^TdU$n6siV zzC3 zPk1xo{e&+Qf)W!F(-M0Uk0t(3(#uJa$%*(A4=xh_$pdbW#^935aVTHhiI~$d=VLC$ 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 00000000..9f9601c8 --- /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 00000000..546f91f4 --- /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 00000000..9f9601c8 --- /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 00000000..546f91f4 --- /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 00000000..e8cfd248 --- /dev/null +++ b/edk2basetools/tests/GenCrc32/test_gencrc32.py @@ -0,0 +1,117 @@ +## @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 edk2basetools.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() + self.decode_output_folder = os.path.join(os.path.dirname(__file__), r"decode\decode_result") + if not os.path.exists(self.decode_output_folder): + os.mkdir(self.decode_output_folder) + self.encode_output_folder = os.path.join(os.path.dirname(__file__), r"encode\encode_result") + if not os.path.exists(self.encode_output_folder): + os.mkdir(self.encode_output_folder) + + def tearDown(self): + if os.path.exists(self.tmpdir): + shutil.rmtree(self.tmpdir) + # if os.path.exists(self.decode_output_folder): + # shutil.rmtree(self.decode_output_folder) + # if os.path.exists(self.encode_output_folder): + # shutil.rmtree(self.encode_output_folder) + + def create_inputfile(self): + with open(self.binary_file, "wb") as fout: + for i in range(512): + fout.write(st.pack("