package Ġcom . hip oom . scaffold . security . java . zip Ċ Ċ import Ġcom . hip oom . scaffold . core . java . k tx . insert As New File Ċ import Ġcom . hip oom . scaffold . core . java . k tx . little Endian Long Ċ import Ġcom . hip oom . scaffold . core . java . k tx . overwrite Ċ import Ġcom . hip oom . scaffold . core . java . k tx . to LittleEndian Bytes Ċ import Ġcom . hip oom . scaffold . security . java . KeyStore Reader Ċ import Ġcom . hip oom . scaffold . security . java . SHA 2 5 6 Utils Ċ import Ġcom . hip oom . scaffold . zip . read Eo CDR Ċ import Ġcom . hip oom . scaffold . core . java . k tx .* Ċ import Ġcom . hip oom . scaffold . zip . Eo CDR Ċ import Ġcom . hip oom . scaffold . zip . Offset And Size Ċ import Ġjava . io . File Ċ import Ġjava . security . PrivateKey Ċ import Ġjava . security . PublicKey Ċ import Ġjavax . crypto . Cipher Ċ Ċ /** Ċ Ġ* Ġå¯¹ ä¸Ģä¸ª Ġzip Ġæĸĩä»¶ ï¼Į æĮīçħ§ ĠV 2 Ġ çŃ¾åĲį çļĦæĸ¹å¼ı ï¼Į å¯¹ åħ¶ çŃ¾åĲį ãĢĤ Ċ Ġ* Ġ@ author ĠZ h eng H ai Peng Ċ Ġ* Ġ@ since Ġ 2 0 2 1 / 1 2 / 1 1 Ġ 1 : 5 7 Ġä¸Ĭ åįĪ Ċ Ġ*/ Ċ class ĠZip Signature Utils Ġ{ ĊĊĠĠĠ Ġ/* Ġ================================================= ====== Ġ*/ ĊĠĠĠ Ġ/* ĠFields ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/* Ġ================================================= ====== Ġ*/ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çŃ¾åĲį åĿĹ æľ« å°¾ çļĦ éŃ Ķ æķ° ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġmagic Ġ= Ġ" H ip oom ĠZip ĠSign !" ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çŃ¾åĲį åĿĹ ä¸Ń ï¼Į æĺİ æĸĩ æĳ ĺ è¦ģ çļĦ ĠID ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġdigest ID Ġ= Ġ 0 x 4 2 8 7 FF ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çŃ¾åĲį åĿĹ ä¸Ń ï¼Į çĶ¨ ç§ģ éĴ¥ å¯¹ æĳ ĺ è¦ģ åĬłå¯Ĩ åĲİçļĦ å¯Ĩ æĸĩ çļĦ ĠID ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġencrypt ID Ġ= Ġ 0 x CE 7 B 6 6 ĊĊĊĊĠĠĠ Ġ/* Ġ================================================= ====== Ġ*/ ĊĠĠĠ Ġ/* ĠPublic ĠMethods ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/* Ġ================================================= ====== Ġ*/ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå¯¹ æĸĩä»¶ è¿Ľè¡Į çŃ¾åĲį ãĢĤ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġzip ĠĠĠĠĠĠĠ ĠéľĢè¦ģ çŃ¾åĲį çļĦ åİĭç¼© æĸĩä»¶ ĊĠĠĠĠ Ġ* Ġ@ param ĠprivateKey Ġ ç§ģ éĴ¥ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsignature ( zip : ĠFile , ĠprivateKey : ĠPrivate Key ): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ è®¡ç®Ĺ åİŁå§ĭ æĸĩä»¶çļĦ ĠSHA 2 5 6 Ġæ ĳ ĺ è¦ģ ĊĠĠĠĠĠĠĠ Ġval Ġutils Ġ= ĠSHA 2 5 6 Utils () ĊĠĠĠĠĠĠĠ Ġval Ġdigest Ġ= Ġutils . digest ( zip ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġå¯¹ æĳ ĺ è¦ģ è¿Ľè¡Į åĬłå¯Ĩ ĊĠĠĠĠĠĠĠ Ġval Ġencrypt Cipher Ġ= ĠCipher . getInstance (" RSA / E CB / PKCS 1 Padding ") ĊĠĠĠĠĠĠĠ Ġencrypt Cipher . init ( Cipher . ENCRYPT _ MODE , ĠprivateKey ) ĊĠĠĠĠĠĠĠ Ġval Ġencrypt Digest Ġ= Ġencrypt Cipher . do Final ( digest ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ æŀĦå»º çŃ¾åĲį åĿĹ ĊĠĠĠĠĠĠĠ Ġval Ġsign Block Ġ= ĠSignature Block ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmagic Ġ= Ġmagic , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpairs Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠID And Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġdigest ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġdigest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠID And Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġencrypt ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġencrypt Digest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġsign Block Bytes Ġ= Ġsign Block . build () ĊĊĠĠĠĠĠĠĠ Ġ// Ġæı Ĵ åħ¥ åĪ° Ġzip Ġæĸĩä»¶ ä¸Ń ĊĠĠĠĠĠĠĠ Ġreturn Ġinsert Sign Block AndUpdate Eo CDR ( zip , Ġsign Block Bytes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¯»åıĸ çŃ¾åĲį åĿĹ ä¿¡æģ¯ ãĢĤ ĊĠĠĠĠ Ġ* Ġ åħ¼ å®¹ ä¸İ ĠV 2 Ġ çŃ¾åĲį æł¼å¼ı çĽ¸åĲĮ çļĦæīĢæľī çŃ¾åĲį æĸ¹å¼ı ï¼Ī Ġmagic Ġ éķ¿åº¦ å¿ħé¡» ä¸º Ġ 1 6 Ġ åŃĹèĬĤ ãĢĤ ï¼ī ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġread Sign Blocks ( file : ĠFile , Ġe o CDR : ĠE o CDR ? Ġ= Ġnull ): ĠSignature Block ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġe oc dr Ġ= Ġe o CDR Ġ?: Ġfile . read Eo CDR () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ// Ġ çŃ¾åĲį åĿĹ èµ· å§ĭ ä½įç½® çļĦ åģı ç§» éĩı ï¼Į åĮħåĲ« ĠHead ĠSize ĠBlock ĊĠĠĠĠĠĠĠ Ġval Ġ( sb Offset , Ġsb Total Size ) Ġ= Ġread Sign Block Offset And Size ( file , Ġe oc dr ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ// Ġ çŃ¾åĲį åĿĹ çļĦæķ°æį® ĊĠĠĠĠĠĠĠ Ġval Ġsign Block Bytes Ġ= Ġfile . read Bytes ( sb Offset , Ġsb Total Size . toInt ()) ĊĠĠĠĠĠĠĠ Ġ// Ġ è§£æŀĲ å¹¶ è¿ĶåĽŀ ĊĠĠĠĠĠĠĠ Ġreturn ĠSignature Block . parse ( sign Block Bytes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æł¡éªĮ æĸĩä»¶çļĦ çŃ¾åĲį ãĢĤ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġverify ( zip : ĠFile , ĠpublicKey : ĠPublicKey ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġe oc dr Ġ= Ġzip . read Eo CDR () Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// Ġ çŃ¾åĲį åĿĹ èµ· å§ĭ ä½įç½® çļĦ åģı ç§» éĩı ï¼Į åĮħåĲ« ĠHead ĠSize ĠBlock ĊĠĠĠĠĠĠĠ Ġval Ġ( sb Offset , Ġsb Total Size ) Ġ= Ġread Sign Block Offset And Size ( zip , Ġe oc dr ) Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// Ġ çŃ¾åĲį åĿĹ çļĦæķ°æį® ĊĠĠĠĠĠĠĠ Ġval Ġsign Block Bytes Ġ= Ġzip . read Bytes ( sb Offset , Ġsb Total Size . toInt ()) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ å¾ĹåĪ° çŃ¾åĲį åĿĹ çļĦä¿¡æģ¯ ĊĠĠĠĠĠĠĠ Ġval Ġsign Block Ġ= ĠSignature Block . parse ( sign Block Bytes ) Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// Ġ å¾ĹåĪ° çŃ¾åĲį åĿĹ çļĦåĨħå®¹ ĊĠĠĠĠĠĠĠ Ġval Ġdigest Ġ= Ġsign Block . id Values . find Ġ{ Ġit . id Ġ== Ġdigest ID Ġ} ?. value Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġencrypt Ġ= Ġsign Block . id Values . find Ġ{ Ġit . id Ġ== Ġencrypt ID Ġ} ?. value Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// Ġ è§£ å¯Ĩ Ġencrypt ĊĠĠĠĠĠĠĠ Ġval Ġdecrypt Cipher Ġ= ĠCipher . getInstance (" RSA / E CB / PKCS 1 Padding ") ĊĠĠĠĠĠĠĠ Ġdecrypt Cipher . init ( Cipher . DE CRYPT _ MODE , ĠpublicKey ) ĊĠĠĠĠĠĠĠ Ġval Ġdecrypt Ġ= Ġdecrypt Cipher . do Final ( encrypt ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ æł¡ éªĮè¯ģ ä¹¦ æĺ¯åĲ¦ æŃ£ç¡® ĊĠĠĠĠĠĠĠ Ġval Ġis Cert ification Valid Ġ= Ġdigest Ġcontent Equals Ġdecrypt ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Cert ification Valid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ åİ» æİī çŃ¾åĲį åĿĹ ĊĠĠĠĠĠĠĠ Ġval Ġtemp File Ġ= ĠFile ( zip . absolute Path Ġ+ Ġ". delete Sign Block ") ĊĠĠĠĠĠĠĠ Ġzip . delete Segment ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġsb Offset . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlength Ġ= Ġsb Total Size . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest Ġ= Ġtemp File ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ éĩį åĨĻ Ġc dr ĠçļĦ åģı ç§» éĩı ĊĠĠĠĠĠĠĠ Ġval Ġc dr Offset Ġ= Ġe oc dr . cdr Offset Ġ- Ġsb Total Size ĊĠĠĠĠĠĠĠ Ġval Ġe oc dr Offset Ġ= Ġe oc dr . offset Ġ- Ġsb Total Size ĊĠĠĠĠĠĠĠ Ġtemp File . overwrite ( e oc dr Offset Ġ+ Ġ 1 6 , Ġc dr Offset . toInt (). to LittleEndian Bytes ()) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ è®¡ç®Ĺ æĳ ĺ è¦ģ åĢ¼ ĊĠĠĠĠĠĠĠ Ġval Ġsha 2 5 6 Ġ= ĠSHA 2 5 6 Utils (). digest ( temp File ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsha 2 5 6 Ġcontent Equals Ġdigest ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġ/* Ġ================================================= ====== Ġ*/ ĊĠĠĠ Ġ/* ĠPrivate ĠMethods ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/* Ġ================================================= ====== Ġ*/ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¯»åıĸ çŃ¾åĲį åĿĹ èµ· å§ĭ ä½įç½® çļĦ åģı ç§» éĩı åĴĮ å¤§å°ı ï¼Į åĮħåĲ« ĠHead ĠSize ĠBlock ãĢĤ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġread Sign Block Offset And Size ( file : ĠFile , Ġe o CDR : ĠE o CDR ? Ġ= Ġnull ): ĠOffset And Size ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġe oc dr Ġ= Ġe o CDR Ġ?: Ġfile . read Eo CDR () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ// Ġ çŃ¾åĲį åĿĹ å¤§å°ı çļĦ åģı ç§» éĩı ĊĠĠĠĠĠĠĠ Ġval Ġmagic Size Ġ= Ġ 1 6 ĊĠĠĠĠĠĠĠ Ġ// Ġ è®°å½ķ ãĢĮ çŃ¾åĲį åĿĹ å¤§å°ı ( ä¸į åĲ« ĠHead ĠSize ) ãĢį çļĦæķ°æį® åĿĹ çļĦ å¤§å°ı ĊĠĠĠĠĠĠĠ Ġval Ġsize Size Ġ= Ġ 8 ĊĠĠĠĠĠĠĠ Ġ// Ġ è®°å½ķ ãĢĮ çŃ¾åĲį åĿĹ å¤§å°ı ( ä¸į åĲ« ĠHead ĠSize ) ãĢį çļĦæķ°æį® åĿĹ çļĦ åģı ç§» éĩı ĊĠĠĠĠĠĠĠ Ġval Ġsb Size Offset Ġ= Ġ( e oc dr . cdr Offset Ġ- Ġmagic Size Ġ- Ġsize Size ). to Long () ĊĠĠĠĠĠĠĠ Ġ// Ġ è¯»åıĸ ãĢĮ çŃ¾åĲį åĿĹ å¤§å°ı ( ä¸į åĲ« ĠHead ĠSize ) ãĢį ĊĠĠĠĠĠĠĠ Ġval Ġsb Size Ġ= Ġfile . read Bytes ( sb Size Offset , Ġsize Size ). little Endian Long () ĊĠĠĠĠĠĠĠ Ġ// Ġ çŃ¾åĲį åĿĹ å¤§å°ı ï¼Į åĮħåĲ« ĠHead ĠSize ĊĠĠĠĠĠĠĠ Ġval Ġsb Total Size Ġ= Ġ( sb Size Ġ+ Ġsize Size ) ĊĠĠĠĠĠĠĠ Ġ// Ġ çŃ¾åĲį åĿĹ èµ· å§ĭ ä½įç½® çļĦ åģı ç§» éĩı ï¼Į åĮħåĲ« ĠHead ĠSize ĠBlock ĊĠĠĠĠĠĠĠ Ġreturn ĠOffset And Size ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġe oc dr . cdr Offset Ġ- Ġsb Total Size , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġsb Total Size ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¾Ģ ä¸Ģä¸ª Ġzip Ġæĸĩä»¶ ä¸Ń æıĴåħ¥ ä¸Ģä¸ª çŃ¾åĲį åĿĹ ï¼Į å¹¶ä¸Ķ æĽ´æĸ° å®ĥçļĦ ĠE o CDR Ġä¸Ń è®°å½ķ çļĦ åģı ç§» ä¿¡æģ¯ ãĢĤ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinsert Sign Block AndUpdate Eo CDR ( zip : ĠFile , Ġsign Block Bytes : ĠByteArray ): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠ ĠFile ( zip . absolute Path Ġ+ Ġ" signature . hex "). write Bytes ( sign Block Bytes ) ĊĊĠĠĠĠĠĠĠ Ġprintln (" çŃ¾åĲį åĿĹ å¤§å°ı : Ġ${ sign Block Bytes . size }") ĊĠĠĠĠĠĠĠ Ġval Ġe oc dr Ġ= Ġzip . read Eo CDR () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġprintln (" åİŁå§ĭ Ġzip Ġæĸĩä»¶ çļĦ Ġe oc dr Ġ åģı ç§» éĩı ï¼ļ ${ e oc dr . offset }") ĊĠĠĠĠĠĠĠ Ġprintln (" åİŁå§ĭ Ġzip Ġæĸĩä»¶ çļĦ Ġc dr Ġ åģı ç§» éĩı ï¼ļ ${ e oc dr . cdr Offset }") ĊĊĠĠĠĠĠĠĠ Ġval Ġsigned File Ġ= ĠFile ( zip . absolute Path Ġ+ Ġ". signed ") ĊĠĠĠĠĠĠĠ Ġzip . insert As New File ( e oc dr . cdr Offset , Ġsign Block Bytes , Ġsigned File ) ĊĠĠĠĠĠĠĠ Ġval Ġc dr Offset Ġ= Ġe oc dr . cdr Offset Ġ+ Ġsign Block Bytes . size ĊĠĠĠĠĠĠĠ Ġprintln (" æĸ° Ġzip Ġæĸĩä»¶ çļĦ Ġc dr Ġ åģı ç§» éĩı ï¼ļ ${ cdr Offset }") ĊĊĠĠĠĠĠĠĠ Ġval Ġc dr Offset Bytes Ġ= Ġc dr Offset . to LittleEndian Bytes () ĊĠĠĠĠĠĠĠ Ġsigned File . overwrite ( e oc dr . offset Ġ+ Ġsign Block Bytes . size Ġ+ Ġ 1 6 , Ġc dr Offset Bytes ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsigned File ĊĠĠĠ Ġ} Ċ Ċ }