From b80ce3cc573495caeeadb48af33bafef48d06f56 Mon Sep 17 00:00:00 2001 From: Jan-Joost Spanjers Date: Sat, 21 Dec 2019 15:04:43 +0100 Subject: [PATCH] Make decryption generic for all compression methods Now, STORED files can be decrypted, just like DEFLATED files. --- lib/zip/input_stream.rb | 23 +++++++----- test/data/zipWithStoredCompression.zip | Bin 0 -> 42875 bytes .../zipWithStoredCompressionAndEncryption.zip | Bin 0 -> 42931 bytes test/stored_support_test.rb | 34 ++++++++++++++++++ 4 files changed, 48 insertions(+), 9 deletions(-) create mode 100644 test/data/zipWithStoredCompression.zip create mode 100644 test/data/zipWithStoredCompressionAndEncryption.zip create mode 100644 test/stored_support_test.rb diff --git a/lib/zip/input_stream.rb b/lib/zip/input_stream.rb index a901703..e417916 100644 --- a/lib/zip/input_stream.rb +++ b/lib/zip/input_stream.rb @@ -130,25 +130,30 @@ module Zip 'General purpose flag Bit 3 is set so not possible to get proper info from local header.' \ 'Please use ::Zip::File instead of ::Zip::InputStream' end + @decrypted_io = get_decrypted_io @decompressor = get_decompressor flush @current_entry end + def get_decrypted_io + header = @archive_io.read(@decrypter.header_bytesize) + @decrypter.reset!(header) + + ::Zip::DecryptedIo.new(@archive_io, @decrypter) + end + def get_decompressor - if @current_entry.nil? - ::Zip::NullDecompressor - elsif @current_entry.compression_method == ::Zip::Entry::STORED + return ::Zip::NullDecompressor if @current_entry.nil? + + if @current_entry.compression_method == ::Zip::Entry::STORED if @current_entry.incomplete? && @current_entry.crc == 0 && @current_entry.size == 0 && @complete_entry - ::Zip::PassThruDecompressor.new(@archive_io, @complete_entry.size) + ::Zip::PassThruDecompressor.new(@decrypted_io, @complete_entry.size) else - ::Zip::PassThruDecompressor.new(@archive_io, @current_entry.size) + ::Zip::PassThruDecompressor.new(@decrypted_io, @current_entry.size) end elsif @current_entry.compression_method == ::Zip::Entry::DEFLATED - header = @archive_io.read(@decrypter.header_bytesize) - @decrypter.reset!(header) - decrypted_io = ::Zip::DecryptedIo.new(@archive_io, @decrypter) - ::Zip::Inflater.new(decrypted_io) + ::Zip::Inflater.new(@decrypted_io) else raise ::Zip::CompressionMethodError, "Unsupported compression method #{@current_entry.compression_method}" diff --git a/test/data/zipWithStoredCompression.zip b/test/data/zipWithStoredCompression.zip new file mode 100644 index 0000000000000000000000000000000000000000..045ab9d484160e96184802da1462ee6886761560 GIT binary patch literal 42875 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 literal 0 HcmV?d00001 diff --git a/test/data/zipWithStoredCompressionAndEncryption.zip b/test/data/zipWithStoredCompressionAndEncryption.zip new file mode 100644 index 0000000000000000000000000000000000000000..2fd545e977663a1caddcfd851accb3c6baeb5252 GIT binary patch literal 42931 zcmZshLyRyC(4@ztqH4)zD~v3s&us!E!Y|`xE7cJ^LimlzT(+dCs5S49Ls2LNo0Bj+~h7 z+2`tKkT?anjb;1rVTAjjk&`u%#|)|x+rj9>A|{+ij)?JOT8m{>C{j1PD0+ z8|g9CTu|+Dod64NU7U(8?n$SnOLiqV>(~-7%6u740x>*xxvKwp^aL(~g$UOdh)ecNk7M%>HXx z`i1#xb5SAZP)ZfRcjwtN?T6eq22-Bjfh?gG;D6VWyAYMz$yL5+7S6w69{$;)O1;{ z$31fG5{-z+p5IuGAetbW9=?K`=7D*NY9+IU!uDuK`KXVNN_%NT z^mv3bmZfvHP=iFnMuS*jmuZYG30Fp&3=sexd7{TC$abG-kAND-Fx`^a$hz}Bwad2Nb4yMXD!Nr-P;CgCiq;cT` zu1CtHHqk29yCn5W74?$tZx2SMAxMCXCd>~7mO(xfx&(^h0V>R?vB1Y7`Q2F|Csr!W zIbR!#kvPdzsQ@jwSJY%kO6CNydF^yPM7hSE^RxY%sOr!FQdRIG966P08$+TQr>}P+ zx%jAh39Mih+SqU-79=~HTdk9ZLW91I?yv^eVT({f0iuruHJ1l*X-g=s zw5v3X!u&o_Gwt5c+^{WAZxaUdSMZ030p*vsw?ry!y&9kq@NxpQu-X?~bL{%3+bLSw zF3!N(HMX6e$mJpD))uIm69fY~DxN@u#!a0#Pge*yI`*@2aQQsU=?mb-^86|n`=ykU2syEP+&|rVLGk6zi*2x z@4yt~3^l>;cLEgS>690aXSSEa(iUr4M+#GkbH*Imw~tw!?!t5{Niq!mr;f<*L98C-@KK-pww z)>j=geAyAx{_p$z{_5}qBf8@>&Jm9MSAb?xb-^Sm(DP~k?G!MPo`qC0pm=2 zRP8ph?|t!0OTa*75oB6rU_gq6z&G8nm}+^-W{9X)x(UM{)%q8azR(d|eAt(lB2qYp z#}AF=YM!sw>O%6e8!2!p1Fh~yEX+tj*88G1=^_s-E%HoitC-Qr5t@*z^0T)idp0CW zNYYK%)3$xhVAvW>2STqfj|}NyZ1>twq50Vg>5B%SIP zU6SMr6}3GnWr2-%4u>7#X05^l3zj2;87sCz?T{++&EFMbg$E@VqS9TVN#a6#U(wlc zZ57u@gnRQyCa71}KV%KR2y-t=Z2qq%S({?sqM0}0T7k5^6yRUN^QgQOIK=1Z{ zv3-iSoCQr9EN%e+0MdW@zcgn2Um6R8|9@#ryGCzXC*|*WP&64es&HWqYO`j({!3^X zxJN|#$vtr1Sw6!49D|%6`=TLBN%v`5U{KSKXwc2RxA1_vs)IkJXIy*g8r@A(t!DsF zpGCZrsQ=|GH1^!^J)AYV(-g;;p(DYg3w7FRB8p0 zMh#5cj%B-PtP~~`cBgM)AozQLYOUPpZYzaiuSuX!s9Sk$Ummkq;l>V3o@BS$Td!P% z^f#NaQ#UfNs1khfrkmck!Kbbiy?njzW~wBm2^G=porK+rX5>L2p454S8hdTSCABHg zg-;$)kO&rOXLpuj*7;R2ErMSzayHa?Lw8Zwxq9w*gGWr+>M)!dyS2nvQNoR*Pb*3! zc{ccPq5Sg%2QUNNnocccR>**gcqgx4rwVZI2lg1P0iz;`0Ko4fsMhXW-6za^ZoXxo z*4*^#FZ_OFBpKCaF9SZ&M$>*pK8LGtJni}s*zAsc%VWWJ_#YY@eyB}qh6-F!;sk5C zA8$W4VhIse9D#0aK}AEuMNmPL|LB}IIjqpfXGBsYrz-v`%y5&FXt6QGFq8ZcKtEUy z0Z|hy%uI{p$_85K(6a9fOk@SepVz1bw;Su$HFO$|qu+4!9K7rOe4^i3LT-Q#n_DjomD z9z<5f8|TEa=~|+D-4&Gn%&NqOfvS52pBZFh8%r^>FBnYXNlq6-httr|2R)_1Dl+4E z{X_8T#DnaKE}2GQs4ExERA~v&Kk+pe#4S6GD|=PFw$7Oq*;;S_Lp1 zTs06ZoC%HH)q*#ikJUsP?|r-KnwgLz8iJ`PKwJMA6&mj>X8DdmN3halQ)si<`WwiA zPYd%EdjAmg+j2C+7HK|YOoeZ6G;eUreeRI;x!hHT-=&>yy_(0z(sSRN*>?9!V6GX~ z&;1RzU)EpX?;v?20_qtB0gI6h2qn;09IjIxS&D!s=en8AXwyHwDhkpX$>K3;*t6Np zGT6&CenX7;t!lEA-kZv64+9`(qyAQoOZ}8nT+5fkCIG^V3|60V4%l|VT4CA1JXXvi z02q1E{Il^Feh?vL%4c_JAH_$cpdS;x7htxs0p-8l2SHO<94DO)K0L~Ugeq>+gydts z@YH(YOpiEY!Qo)0t>58kIwDbVB@GCz=U9|&2Mn)qy!5Q5qCArgGVvTXVOL_h)~c$8 z!@ALxN=~MG_Jx^{^fl-+XbX-obQrzIECDr9+lE08+hh71KIY$;6I57Q*7WmklI+$# zf~EbPj#;wfE(miy{9GGTA>BS>F->~K2AW9$2|Mjc6I0X z+-4M}mu=)AjfjDQKq#Il0;lK5K0#<4WWDhB@gw2mL5A4-wh7eUo;rFhhlR_v{eH|P zc+#&=<1#H&=h^NZAOcIz@4rlNWt&Jp^ZDuY8TR$Z2t@|kNXYom?a}_835iD2?n30q z0Aoji>Z;{f@iGbRi(jIa=*M>+hvyXfR>rs|qW-y$SEb`u+|M#0KtxfFMWrTps$s(j zyPjg?1uBUvymA4*gsxI&lKhwf3SE*0o=oj(UK>RB?WRw-rXgL%GPO*Pg+_j1D6?zo z9|Fr090D6r3W*kWCe3pt;Xe*XhUO^wj)>yg2HYgZ2S)ls8G~{R4eLdl?ZTV;S1^Vs zzp@nQNjAm>7RoUJ56eqGMtu2=d3>Nz4|%~Zoyl%v5mpfc(XU^t2Y$CNlB`0loi_drLJ=pu%xLYR_Xh&NaPSZf z{}yI2RIoU|aVKhFfr;zixgPxax4?a+>}S^q-SaDY*6XMv>>-dAqD&tk<;baWU<2y@fgCX_O z=PMy>%MUkTojX=@n*I5)A3$ayXnp^CbXLgGciqZ>W0x8i-xDt8%JG_2dte25qhuDwUUMxYL_Z%J0i)3?Z?Xl|_WvJ#{$ zHEBU}zr#0Fqw4jiT{8XAoC;Rb*qkNdrNt@5`lFM^R}jrk5xy9-;c}Z7Cl_i}X}M6k zV9I^w_`EdI#5yw(RJg*-&~YN*dRdajKw&HBGtxcLs@p2Wh*9iYEf1m?Nm|Xs93sgE~N&)2Am z|Mp;6K{(xBNoKr|5*imB!dqZ8YIIOv0Da7jG=`@dPIi#Vh|nUeDhi$y7AGn_=n^`% zeexOl2}7pG^xKvcgYh^4@(5(WDb zU7?`@a6tK z{ii)TDC(6-rTG^exbY?5zlfk}tzv&VguYiNXu>i&;fm+d^|HEZ50|A~7ao;>`be5n z9|x=1;aVFDzt6^Nw@5{B}UU2>?bV;7Jl(^C?rkLWTku=7S+&?#g4cz2c$%xuYqCO1^pi1|?34=pqt4fr zz0YnDQGn4~GSbGd7t<#~v#^qYUrzSa!Zc6HlmgT*%(Fdw`bp^j`S!J@!su)Cn^g5M zA^#XL-H7=sptN_)JD=l7J;V_Q=&3pQPSRM``%h##Y-m|cc(##Ks!jW)3I5=nEKfo^ zW|Eg24JDael)guGAPB~5q?*MgL(w?=T+#zGzye$*kUrh5cUOxUjz;w43GUCRmXM8< z#l1bz(HA!`J_y6hJ8Zdr*{D%9jA#(`Je>u-cvjz2m~Rd4XaNh?>}eXQ4z~L2)6=g> zpS}_#7aBrzq-umg>%D+$YjY*xf+J3Mqe`~d(uV4t4`rb{UcAXQEDdyfjqM@iE02Lc z+NABRD;+BzhD(y!!ndQtH_)t-q2ieA0&yd}ZfxwQFvBD`To1&=1IOACmrqsV^>Sy3 zm#Qc7{A9zlic2aMx!zdn%WwMPhnKFdOp7( zm(JkKY))rmN%lIRM^UVc{%bM)^Vp~Lkl{X~e?(5a!C2;L2!{oBp#KgBq_~=qb~#o- ztCcnAc$Ne)+`one2pCbwjbz@8@{$yOSiM zCjgTrR&?X~73ON5dDs|YiuUS=AztdN!FdTJ&#(UHYbE;MXkLgcM14xKuQ1un$ug~w zBGy_7T#=64iN8ZCn4+bd&?YlP|VqllcwwU`%(T~ zTtQG>vCEG5=H(1igDNBczCrycy_+F}lTH47(>^nNO^FMR<2)J|9?Y=9y2zQ}zwkk? zMm|z(F=Ui%nY-NzFh^Z^QSl0Re#dymxmEmt76jR11SfLDvfL}IFsX@MVy{`nP^>dL z`d`4%6vG?3YoIo*x~`dvd_j1-x6RCwstf#dpIMRlA}|iQO~LFMB33j-oqzmfz2+^# zz5X!mTGYuLEp(tdHe|vf?=J;6Jxsc*Mz6Mkbc%lmX8UV#q#Y%ZY6=XNXQ3!`zcYUdEw?Z z2vvWT{9*5vG%<;A4~pWBlDh{Qe+PG4OdtXm0j+lFJ9Q=Unz&U@Ln~gNr74FNAb&oN z=!=e<8g?#GwV&vt6o$rJM$_ECT|eB^vfFUrORg>c*1B7p_Q0~8q@cQWP&Eb#551qf zwQh?lGXfwFK``#OC>f0vTs@tc%b7_^dksK+_cW{I%7TEJh+zOuY!opwVJ^%KeH_po zo=^|X`wel7rUz%+Ao;fD%|N&9Zi20JOhn4JAZ6#a4kM?nD)LAAmyjkH-}Tv_Iwb<* z)BugeZl%d8)#ja%r=BRuKGdK=mxr*(Bo@<8Ws3;ujnRa;sVg_n;$*L-o9`(O%=n-S zBqdj?CtQ@zNNUuJ6+Gp5=rC;sVsFFjpsns26v+&&jcO$H#0pkqrrx@YJ?8tsI9idj zt(mKFLQf-P(rX9Np+^TRdy@cuMeJIL80;0k?35%FBY(VD$(rdsrK~XWZ|hr@)bB6w zeOY>;8Jw4|p&5U?sc^2rw#z31^}xKB|6gCK})2<7`8`22lmrW;vHRiVG%Xm!i zVun&;6Z}C?x~9oF z8S0>KVH&VkiNz{7i0w(R7xc4y;@xm^tYnMe>o=!FZ*6IB-Hm!%e|@LoG+tDpry!0E zYAKhqAB3B6ra8UZea{71`a%`BL?Cm5x)&YhEx%gPiqDWHwA1@^8WDg}O&|Krkdye- zx+ zOyG5b+ALNcSNRxWP6u%Ofa{(+ms5!rwe;CDCIE?uaBjwOT*Y8|YVoL0%`7C>&&%wA=R~&Uvz~X6r-dIT5(Tp5cG>1_ zvS~2i*6{VShz&~@=iHjs9uJx)fPRs<)Jl3_7d^wehA`8g$y%nI#84=vZOPFx>TEqY zA0Uqc-tE+6{H#He7p|eUYlooR7^9^<;Z*esi*Tn6CFJdxCvh2kF=E-Xxj0XB_+h8| zY7W5~y_3<;I_+HgHLSNvja)-px&zn!7B+dThb$!_OK?c=Uk`Kpk4>VDU7EW|$z*WP zn7jb&vk98(URvxeqQxFpNA`g{4c+Znl>NJD24c^U-T7NHCJ!my?Q!K!3{lw_?;#dv zb-rIzG=98Bkk8nDb2?5X&}pe(jW5{v>v&EwGJA?Zu25F{M67Qmlvpt}Pu~C_72J%B z9eK zqqbIK#v=C6=TY$clStQ~wanhPFt?L>OcfZkQ?lB@dJuj@y6ea$YzI6HW?gHlT$Y)L z)rF!5jcYR_kh0|?`NFo@*!QhA5^mykk4)ID6Grp6TdPxWf4ly%@jUW?Z3k>kK&6FP z!dN87X-TurJ^UP{I`W{QmlP%oOV2Ja%uXS81rd zI^C6;AC^TqW3-oy?hKmnYFP`tWUCbV{O4G~5*nzH|FZbg@j9=eg+O^5a|Me0!CXL) z*F--k9s4P#JC@JVtV6j;7?LmqbLH}+1E_a}nT~xeEvrJh8I#3Tnjr2xS^Vt_|5hNx zTWc?NB2l@M;XLa+?rm<>V`$fKdr+x7BHAb`ve?R(`nUTq=`Ni^A=ET zgblr>p&|IZk%0B6N(~u_&^YJz6{`JV-Mx66K!pFUnUP~GlcbI}Rf7nt^=wwfJaXk* zQ}0ya!8Hn2cPvB>=m4L}N2bhRE+u=Cq86AN*$@>k&5xMvu`d_tq2MJYA>0V?V5y1g@F@wC}#?QyfUo3<$V6CECFDqtyIk zLcqgLEnNpbd9~FQhGjD1Vu8PSaoQG6Iys;*K=U%af3zA#79|>DC=~miHLK#4Uwf(R zFt3xV7zfW{)UI=XR7lu5U`Zwhv7HbUiGSfV(ZY`{db`3$J}$!O1T4t;d(5&5Ut?{9!815McAmb@6?i9Cy42ComZ_Ay*o0BVHJP+vciX{ znryz^B9O_wkocUtx=f#`dq+9V;S6x_h}qLIu6bm{0f|n5;$pD4@C%BnLZf>`2RwI& z$zXoUCOm2uEUHw3vvMcha(`nam80?+0FcN_2Y%NB%CyiVap?O-LuCpJ!jH8Uw53)dKXEd#fc5A*XTrV#VWrhl)u;w&x^=KS_esZ zU47$!P4rgww+lTH4NL;#&&()YQUx>mRJg2X(BiotFO5^&&V-fxV+FeOK-$m((~Gh+`u1J`Il$ow+z0wd8e+s_*%YN9e=fY zNFEqQu3EK`2>(*>aCVP#lIcSC37WDqJ9r5P~&`G)wPxn;T}*U z?0HmSrizUYy=ZorQ`$XYYYu+cc{D7GCTh0=&15r-ZE~%!mk#X;EK%VcfQQRcjxLFp z5gPZf4TgAf;-`;nHA;=A=TC{bNIT`82M`pjC~gRVITHG~6bd^VP|9bB#FWu$O|Q#e z|GwXtHcvoT*npjpZmYGwW9YON!>;x#HX8}tV_bUVOTHt>k?qZx+Mb87bfyG|>P{|Z8!2_8$QCXGno}w6ErM1g^qQO8;hZ-Q z-Jm2E<~UmsI(Y|h=8_zrN$Z{SQ``>_^{sf#!Xc4D{lNhYfxM+s<>E!-XIts6YsBgi z`1dhbQlry2gB2T&NPh*ag3}uYPy=z^xd`dQ((wIo7|u;|F1}W(sGP}gpLpxG^DAvK zdkOK|HoXm8-fQuv&(W(PHhX6aL$Haez#r))H3}ySX(rt6G2x1?8)e7$u8|Om=2%gy z0HNy5zi#%fWmFVssf=vZwoFKuB6x^OO!CR{2_4ay_tDqmV(3Cq6R$tFuLMLFa+4#q zhXd z?tWm+@d^_LssEv?Eimf(X6o?Y_$Z)Vi5Qh|3EZnuS{d&Q|EXXdZPPmq2Z<_}UaD9V zxJyPY=97)Iq{HqQehh@(A({!Bfqli}pZOY^OP`JR;#We!?h)iC|JBLmDtDx}mi#fGLXg9Wy?J zcvDDrPOM{t%DQ_-e(i4gI9p+^-hqlFVt*C^JuxtoEzR9EuicD1I|CJY&SU%k__!=L zA>3&)Yy-(Grz(S@@K)+#uM5v=+*ndAd?-^;T9AeBlZA$*rr4@rM^s-_0}ZONl&#i`lky|eshL=z3Lt8wpGeP+#n0F&+uh`xo6(~%7D74?ahHxpr-Wm zVTaVvMgk8Ef*s3=_jIY$1hj&_4;L{%I>1KeEDbra5uTU3&2~!6EVD84l45T!^>PQt z``r{eEuZWdJUfc^n(9g73!+b$USFwp;A-;*@OgxwO-6fw<;d4;c=345xCW0iyoR|A zCi5N`t2;xI{g(w(q-|Go+G@(S%(qwO@U95ttVO?0h%uTv0RzGt1#=O)|9Db3>^UDK zk{WJX>Rdg7ICbM*aqP`{?)YWFFem&GAe`)((840y0NV>MZI{PwO6M*7X^pK95ns6X zsqBg-CgcvlU=UUFgD78g||QJBS&=E^_KFn3!G1sInbT1KQ$_oigPip?f2RABQss-Nf~ zW)jsp+?IW1dW|;)HTlJPb+2d#F`K?=VPBFmBhMNAg@ZG*EfzX+7vU;@yE;eaNniem z`nykA-)gfuUWZjhTv$_*Lx!;OO@`=F%sZFdzHnLzk%aM<>se!_Lb}yRxkH$OIm#en znT0)CJ5=WqQCm5MdwP=AYCCUG6(Z%99pKwBeUHCef^OYWyB}U^_jkB7j?4&T3J#RZ z+DgYF4Q&O+U6Y`qy^U{Zu^zeh0^tWs0HSP*G4c2^$C`Q^TDP7;G->i%#)S{R!-$O8 zD8#(tH>ap?@HMniuC9fN#;^{6IIrtz|92#B;8T>vp(XbF&qxHq}LSpNL zzf*m^7%zBPH2JkzD`>K0zYpKZ%tw+tNN0uoMW5Hc<3UXsjVdX)cPK9MmB)9}GS85- zVW$ra*L&H~ao6BoPmAgv;C4n%--74SIN|F}Fz`OF@MxYozZbct{wDI2Onv#3n~C4< zWcg@l_j^SRNavD~(ht?&#}!M?oP#Xtznu1#?@g$CD#z^l0ftow0?*zq84NY46v+My z9CMQ4HdyFc�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 z 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 literal 0 HcmV?d00001 diff --git a/test/stored_support_test.rb b/test/stored_support_test.rb new file mode 100644 index 0000000..8260e4a --- /dev/null +++ b/test/stored_support_test.rb @@ -0,0 +1,34 @@ +require 'test_helper' + +class StoredSupportTest < MiniTest::Test + STORED_ZIP_TEST_FILE = 'test/data/zipWithStoredCompression.zip' + ENCRYPTED_STORED_ZIP_TEST_FILE = 'test/data/zipWithStoredCompressionAndEncryption.zip' + INPUT_FILE1 = 'test/data/file1.txt' + INPUT_FILE2 = 'test/data/file2.txt' + + def test_read + Zip::InputStream.open(STORED_ZIP_TEST_FILE) do |zis| + entry = zis.get_next_entry + assert_equal 'file1.txt', entry.name + assert_equal 1327, entry.size + assert_equal open(INPUT_FILE1, 'r').read, zis.read + entry = zis.get_next_entry + assert_equal 'file2.txt', entry.name + assert_equal 41234, entry.size + assert_equal open(INPUT_FILE2, 'r').read, zis.read + end + end + + def test_encrypted_read + Zip::InputStream.open(ENCRYPTED_STORED_ZIP_TEST_FILE, 0, Zip::TraditionalDecrypter.new('password')) do |zis| + entry = zis.get_next_entry + assert_equal 'file1.txt', entry.name + assert_equal 1327, entry.size + assert_equal open(INPUT_FILE1, 'r').read, zis.read + entry = zis.get_next_entry + assert_equal 'file2.txt', entry.name + assert_equal 41234, entry.size + assert_equal open(INPUT_FILE2, 'r').read, zis.read + end + end +end