From aebe0b735e6339a2f86cd8897dda4458b8ed8139 Mon Sep 17 00:00:00 2001 From: Jean-Paul Calderone <exarkun@twistedmatrix.com> Date: Wed, 10 May 2023 12:37:21 -0400 Subject: [PATCH] Successfully round-trip one real Tahoe-LAFS SDMF share Read Tahoe-LAFS-generated bytes, decode into a Share, re-encoded to the same bytes. --- src/Tahoe/SDMF/Internal/Share.hs | 26 +++++++++++++++++--------- tahoe-ssk.cabal | 14 +++++++++----- test/Generators.hs | 10 ++++++---- test/Spec.hs | 19 +++++++++++++++++++ test/data/3of10.0 | Bin 0 -> 2533 bytes test/data/3of10.1 | Bin 0 -> 2533 bytes test/data/3of10.2 | Bin 0 -> 2533 bytes test/data/3of10.3 | Bin 0 -> 2533 bytes test/data/3of10.4 | Bin 0 -> 2533 bytes test/data/3of10.5 | Bin 0 -> 2533 bytes test/data/3of10.6 | Bin 0 -> 2533 bytes test/data/3of10.7 | Bin 0 -> 2533 bytes test/data/3of10.8 | Bin 0 -> 2533 bytes test/data/3of10.9 | Bin 0 -> 2533 bytes 14 files changed, 51 insertions(+), 18 deletions(-) create mode 100644 test/data/3of10.0 create mode 100644 test/data/3of10.1 create mode 100644 test/data/3of10.2 create mode 100644 test/data/3of10.3 create mode 100644 test/data/3of10.4 create mode 100644 test/data/3of10.5 create mode 100644 test/data/3of10.6 create mode 100644 test/data/3of10.7 create mode 100644 test/data/3of10.8 create mode 100644 test/data/3of10.9 diff --git a/src/Tahoe/SDMF/Internal/Share.hs b/src/Tahoe/SDMF/Internal/Share.hs index c33b4d8..f458795 100644 --- a/src/Tahoe/SDMF/Internal/Share.hs +++ b/src/Tahoe/SDMF/Internal/Share.hs @@ -1,21 +1,20 @@ -- | Deal with details related to the structural layout of an SDMF share. module Tahoe.SDMF.Internal.Share where -import Control.Monad (unless, when) -import Control.Monad.IO.Class (MonadIO (liftIO)) +import Control.Monad (unless) import Crypto.Cipher.AES (AES128) +import qualified Crypto.PubKey.RSA.Types as RSA import Crypto.Types (IV (IV, initializationVector)) -import qualified Crypto.Types.PubKey.RSA as RSA import Data.ASN1.BinaryEncoding (DER (DER)) import Data.ASN1.Encoding (ASN1Encoding (encodeASN1), decodeASN1') import Data.ASN1.Types (ASN1Object (fromASN1, toASN1)) -import Data.Binary (Binary (..), getWord8) -import Data.Binary.Get (bytesRead, getByteString, getLazyByteString, getWord16be, getWord32be, getWord64be, isEmpty, isolate) +import Data.Binary (Binary (..), Get, getWord8) +import Data.Binary.Get (bytesRead, getByteString, getLazyByteString, getRemainingLazyByteString, getWord16be, getWord32be, getWord64be, isEmpty, isolate) import Data.Binary.Put (putByteString, putLazyByteString, putWord16be, putWord32be, putWord64be, putWord8) import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as LB import Data.Word (Word16, Word64, Word8) -import Debug.Trace (trace) +import Data.X509 (PubKey (PubKeyRSA)) import Tahoe.CHK.Merkle (MerkleTree, leafHashes) hashSize :: Int @@ -110,7 +109,7 @@ instance Binary Share where putLazyByteString shareData putByteString shareEncryptedPrivateKey where - verificationKeyBytes = LB.toStrict . encodeASN1 DER . flip toASN1 [] $ shareVerificationKey + verificationKeyBytes = LB.toStrict . encodeASN1 DER . flip toASN1 [] . PubKeyRSA $ shareVerificationKey blockHashTreeBytes = B.concat . leafHashes $ shareBlockHashTree -- TODO Compute these from all the putting. @@ -139,8 +138,7 @@ instance Binary Share where eofOffset <- getWord64be pos <- bytesRead - verificationKeyBytes <- getByteString (fromIntegral signatureOffset - fromIntegral pos) - let Right (Right (shareVerificationKey, _)) = fmap fromASN1 . decodeASN1' DER $ verificationKeyBytes + shareVerificationKey <- isolate (fromIntegral signatureOffset - fromIntegral pos) getSubjectPublicKeyInfo pos <- bytesRead shareSignature <- getByteString (fromIntegral hashChainOffset - fromIntegral pos) @@ -161,3 +159,13 @@ instance Binary Share where unless empty (fail "Expected end of input but there are more bytes") pure Share{..} + +{- | Read an X.509v3-encoded SubjectPublicKeyInfo structure carrying an ASN.1 + DER encoded RSA public key. +-} +getSubjectPublicKeyInfo :: Get RSA.PublicKey +getSubjectPublicKeyInfo = do + verificationKeyBytes <- getRemainingLazyByteString + let (Right asn1s) = decodeASN1' DER . LB.toStrict $ verificationKeyBytes + let (Right (PubKeyRSA pubKey, [])) = fromASN1 asn1s + pure pubKey diff --git a/tahoe-ssk.cabal b/tahoe-ssk.cabal index 2e446c3..e8e7920 100644 --- a/tahoe-ssk.cabal +++ b/tahoe-ssk.cabal @@ -75,6 +75,7 @@ library , crypto-pubkey-types , cryptonite , RSA + , x509 -- This dependency isn't ideal. Move common bits out to -- another library. @@ -90,10 +91,11 @@ library test-suite tahoe-ssk-test -- Import common warning flags. - import: warnings + import: warnings -- Base language which the package is written in. - default-language: Haskell2010 + default-language: Haskell2010 + default-extensions: OverloadedStrings -- Modules included in this executable, other than Main. -- other-modules: @@ -102,13 +104,13 @@ test-suite tahoe-ssk-test -- other-extensions: -- The interface type and version of the test suite. - type: exitcode-stdio-1.0 + type: exitcode-stdio-1.0 -- Directories containing source files. - hs-source-dirs: test + hs-source-dirs: test -- The entrypoint to the test suite. - main-is: Main.hs + main-is: Main.hs other-modules: Generators Spec @@ -129,6 +131,8 @@ test-suite tahoe-ssk-test , tahoe-ssk , tasty , tasty-hedgehog + , tasty-hunit + , x509 -- A helper for generating RSA key pairs for use by the test suite. executable make-keypairs diff --git a/test/Generators.hs b/test/Generators.hs index ec6c92e..9161054 100644 --- a/test/Generators.hs +++ b/test/Generators.hs @@ -2,15 +2,15 @@ module Generators where import Crypto.Hash (HashAlgorithm (hashDigestSize)) import Crypto.Hash.Algorithms (SHA256 (SHA256)) +import qualified Crypto.PubKey.RSA.Types as RSA import Crypto.Types (IV (..)) -import qualified Crypto.Types.PubKey.RSA as RSA import Data.ASN1.BinaryEncoding (DER (DER)) import Data.ASN1.Encoding (ASN1Decoding (decodeASN1), ASN1Encoding (encodeASN1)) import Data.ASN1.Types (ASN1Object (fromASN1, toASN1)) import Data.Bifunctor (Bifunctor (first)) import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as LB -import Data.Word (Word16) +import Data.X509 (PrivKey (PrivKeyRSA)) import GHC.IO.Unsafe (unsafePerformIO) import Hedgehog (MonadGen) import qualified Hedgehog.Gen as Gen @@ -47,7 +47,7 @@ shares = <*> shareHashChains -- shareHashChain <*> merkleTrees (Range.singleton 1) -- shareBlockHashTree <*> (LB.fromStrict <$> Gen.bytes (Range.exponential 0 1024)) -- shareData - <*> (pure . LB.toStrict . toDER . RSA.toPrivateKey) keypair -- shareEncryptedPrivateKey + <*> (pure . LB.toStrict . toDER . PrivKeyRSA . RSA.toPrivateKey) keypair -- shareEncryptedPrivateKey where toDER = encodeASN1 DER . flip toASN1 [] @@ -73,7 +73,9 @@ rsaKeyPair bs = do let (Right kp) = do asn1s <- first show (decodeASN1 DER bs) (r, _) <- fromASN1 asn1s - pure r + case r of + PrivKeyRSA pk -> pure $ RSA.KeyPair pk + _ -> error "Expected RSA Private Key" kp merkleTrees :: MonadGen m => Range.Range Int -> m MerkleTree diff --git a/test/Spec.hs b/test/Spec.hs index e4b0f45..42290c2 100644 --- a/test/Spec.hs +++ b/test/Spec.hs @@ -11,7 +11,9 @@ import Data.Binary.Get (ByteOffset) import qualified Data.ByteString.Lazy as LB import Generators (shareHashChains, shares) import System.IO (hSetEncoding, stderr, stdout, utf8) +import Tahoe.SDMF (Share) import Test.Tasty (TestTree, defaultMain, testGroup) +import Test.Tasty.HUnit (assertEqual, testCase) import Test.Tasty.Hedgehog (testProperty) tests :: TestTree @@ -26,6 +28,23 @@ tests = property $ do share <- forAll shares tripping share Binary.encode decode' + , testCase "known-correct serialized shares round-trip though Share" $ do + -- The files are in "bucket" format. We need to extract the + -- "slot". We do so by stripping a prefix and suffix. To avoid + -- having to parse the prefix, we assert that the suffix is a + -- predictable size. + bucket <- LB.readFile "test/data/3of10.0" + let withoutPrefix = LB.drop (32 + 20 + 32 + 8 + 8 + 368) bucket + dataSize = LB.length withoutPrefix - 4 + shareData = LB.take dataSize withoutPrefix + suffix = LB.drop dataSize withoutPrefix + + -- Our assumption about the data we're working on... + assertEqual "Cannot account for extra leases" suffix "\0\0\0\0" + + let decoded = decode' shareData + let encoded = (Binary.encode :: Share -> LB.ByteString) <$> decoded + assertEqual "original /= encoded" (Right shareData) encoded ] where decode' :: Binary.Binary b => LB.ByteString -> Either (LB.ByteString, ByteOffset, String) b diff --git a/test/data/3of10.0 b/test/data/3of10.0 new file mode 100644 index 0000000000000000000000000000000000000000..5c79c79c0bdb7d9c5eef847ee1c3ac7483554df5 GIT binary patch literal 2533 zcmeHIS5p&=5>4oYUIZyZsG;{7dc8;&LKB71L1}_W01*-h9i&%76$AtY1eJh_^eSCS z=tZg&kr*J#=e_#){e-(SXV1*pnLRtZ4-0eg4)6f`h1_>>_4NR|1^C~0@$vTv0zZ%g zb=mM02+4aJZL<%Rz2c}p%iJeN$7WeVakZ=0<^o_N%h5F6rlX=1E)YD$o6K?1!rC#k zlj(|*IpBXmMfZoPSAR3mJ!arFa^?WVpEeU4ju~d;jJ<^SYz5lxMeAm)9kk2lDYfT7 zV)1!jeno<}D6iqTH~1c#IYOZh_?~nvdFE<h%S-8ho8^zk|MS0X0GK#KBA*A8G|_)? zh5bX#W?(&1O-($ztkE1*;>$XxEP_R+QyZ>KihcS?YnJ8}kU<Li+eY;-tNgxP1^__v z8>Ae+@mD7`{Zpr+lR*LbW#}lV#o~<Oe$WAdKym;n3djKXt%FEVKp<coUv0ae(dE&) zM~*mIL9Uk?+Mb@3O8N3@BhAT2$??M`=Y4xk&vhBJKqDAV#Yeo;s>Yiud}QgtD1Ci6 zIpX6~!>jVs*%bP9VCN%-!mXS1pT=wCD^?dfzF!B}mLuw+RyZLc$%6dN8`*62gwnAR zUfHvaWtVkERcJ!oB1R!%Zt1R1+G4kypA>Oxx>wchn4_C{r`h;IyjjHfBG>Ut+-X3c zYBTag&(2JU3WK8x@Ezv7W@K_qkbUxV{XtD(qZQonf{W;S(|6Vqo?BA!>NG0U1d?Au zXuh1tqnh_X%}T75qK3XAcy`nb?`hU>&UalV19464ylI|N7!pz-0GQK!27m52k8pzE z=$k^hK_c9JG;K6|z1)U`Q-#k{EuTw8xDMyl;$f4NY<endO({<gCyyHn3#5@s(V6(M z!5EESARpP;x_3)S?iuYD8B#n7T#-cO2;;6aCy3(i)AHf?JVnrt`qXi;wucE5!(lQo z*W8RF0mMkymFYn;)0y&w=_mv1ar0Z0T~n#*0{yxw$|~ghMUEO9S~><v6L_7;c0;=N zl91H-&p!h5OkDL?)J>5OcEWA5_)hJ}w|h{+h0nPb4&cQ(h_lq$Gh|03;*f0%dy{?a zHPf3yA~mctCvlpSbpu?wp|V_n%N(5%6fqdtc7}cfOBkP~0Z81Ip(-Pl6Ij!H@Jkz@ z5t8R4;TCBzu9iCNsP|cSN*{o%b*1r^i&jZYvGry{28i!KupwA$NuoMMaeKu3Six=q zKm|by2|6(d%B1c;d6enYey_RU8O+;~#Bs=BCoP86LJz>0&DDV@oOO>zxHOemPBQqH zNy^gL3#`_kukeJ>;BY%9r+80;w67Sdb4YvmFA;&aHhO_<wV&&naCvG35jFec8bxlN zXoBC174^|Fob7d1;M{SIY_aoNy=4oY?0RF9^4cX2bC~lsN$8NKd$c?{f7K{H9Bn5a z^Psr9Gca9&b}~kW4)+WfMwAHY+dQux?aUz&*qiGZLmK$Cu1@Js)eCpH*I4BeF)C^M zw2IY$G@GAHuI!W`IVyX_K4kUf*^tTzA0V+d*(Rbmr$%&F%V*bmfN5(v%U?(;zlENa z`|#R=kGx~;{2sHlo_g$Ja`1FagcLT&Dfev<SVQ=f6xZKjRT=Ts*sazuZ}Q;1-MP9# zYDXu>P7t$-^Ye3(#BWc1p*{-Sq27G!6-pmgEpXHkWWIsBMwWANvO+r#Z7QOYG>-Y< zn2<H|u*&Mzwi_10_TZKfpA7PF=lP{^dzCsgUsVZZ@-o}ukw!%jIfOEt%pXMqO3o9k zi|wJ#Y`b7_a_1Ev4(v*2>G>=h)mt$LrI}(PWvUV@!no|egzvlgFIpfcUXTvn-5x5J zN{Fi3NYFqm6m0GNqIS2`Nw~;0_EO8xX58XO5agzAY0@6)j$#>fhm=}-sCD5kWul3n z`il(2?mB1MHcoCt`<}#qUrS(4j|*9;ZTCKl{zXhNv{Y-X6Tus<s7}2GuWwhkXI2q> zhYvH2q>n-P(_~^LF~`zsP9kMT$<Ol?Nq;3%p{Eb|45#zq-gdZ`9W20p^dhuH^P&2I zZB+i8%`MO%T)F|_4w}#v*6TAZ=DaW9*DE2e1<}}_8^4#m^idj<{YFpX!AV1`5GBPW z&dG&Yl2fd1O0rp!Q#YQL!zQN^bd`ghfOZ>pP)srmW_Oo(@{ys*S+}9SW+*0~js6f- zF6PM|+=<qV#K<Rn=-4N6Jr)#X)H%SR7HIEQftO)dKxFGCWbpSgu;zCK*;t9u+-w>( z=U(+JG5nX84xz3B2FnZ)&=vh%-ZKb6jh%}r74A5;h{jfWX8UcgJ8w{8ik>Pb>frT{ zxMv2mX}S@wuTl<XEqEaw=0U9oVS4S@oqLL76`)oEO!`x%HeU$u=6-knUKp!`ZM?u8 zBZtUJFR#mnEE*GErg;b2Bq^wx7I>bwf%jXmvE`jP7Mogv>G=!wMAHgZi%>RI;N&>5 z8|my5Q^xcPeY;}gB>fJ*ySlEfSrN!5O?7%ibN#KWnR$v4Bx8J<b=BPda*d2zDuKC} zS!HRulPpnVu%E(Oyv`zV`g_3br0USSx1WjoUQLoN9Deea)O?}B%|^~5D|$l-Sz1d} z&)K>^3bsp>5EXVkRxTXJzCRjRYby<E>l~OO5s1V3@jo;xkYh<}h6$hr3#ZSox;;)F z?6njMgeo#TzN{J27u_=XWgz&RJV}|bM<tfaiy?MVM3y%9pJ^gBXs($cJvo@j_snXf zBDU7-CtqXQ%hJ`)gUX;0r1|$lDyL)zMkA97uOfEGyjc$n1CHP#$Y_)D099qi04ZJj z%<O>-PY$1U%7r^nhuSJ}Ti8k;q9}iv?X7bQ<n~C|yRTLCNzyxl%%AEgEUIqLF*vKw zYwz?a^(gQg*=Vz9qeG|k#>)sJ*`WbghY7j&9z(R)CF_&p?`_*YvlK=DS^mQ9AXV3i n=aRT_oWjq6MQQ&W9Qtv?s*_;fPw|+q64H^lU+~@Qzn}Ua<UlbT literal 0 HcmV?d00001 diff --git a/test/data/3of10.1 b/test/data/3of10.1 new file mode 100644 index 0000000000000000000000000000000000000000..c90a0cd7ef73fee85d6322af0d8b35e4f27c5de8 GIT binary patch literal 2533 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 literal 0 HcmV?d00001 diff --git a/test/data/3of10.2 b/test/data/3of10.2 new file mode 100644 index 0000000000000000000000000000000000000000..dfa291410b8b50ca12be8fbe6f81a0bbc5397224 GIT binary patch literal 2533 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 literal 0 HcmV?d00001 diff --git a/test/data/3of10.3 b/test/data/3of10.3 new file mode 100644 index 0000000000000000000000000000000000000000..a859d241f7a674e8b37a96c27eead10f9979475e GIT binary patch literal 2533 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 literal 0 HcmV?d00001 diff --git a/test/data/3of10.4 b/test/data/3of10.4 new file mode 100644 index 0000000000000000000000000000000000000000..9e5bd0bab2de7ba7bc12b27eba5e916305b0ffc0 GIT binary patch literal 2533 zcmeHIXHyf35={u9geHg}MG3uwbO=@2<<gbVL`{Gopur%D1P~#C&_Q}NNSCUJfEo~y z7J3aT1nEk>6qOht%JV(_cz?p%nX_l+?985>-46@*^uzc-1A^~(dZB%w-k6(rJpFI_ z1VQhrL%N*B^QATXtkwhvOP&kWA7pHS2{D<DFlx=>nQ07scs`25&vsOv#Z#8X@*-ng zzMy7|aMgA}+aB=0VB`AD?2Eq`h>GrS!M)$cOQgP!2_p`j5RN%U_N)fFY(|-;FKxG} z<!ZNO%f`@hKmUw?uCkt?imr%1u=9Yy+-W^&#u|K8z~-l_|2E5SkN@X?+W;`(J(ET* zP}#=($tl4%)t>_Ear*j-StZZx@sH5_(>ih_LK?f}!lc5;4^F#OUrag(@~4g7AJ+YK zxpV-4=@&pkzwk!~+5WDxah<~hCC+iNuq(t`#eU}k0)b!v2oK}|{L&#zcpwlkPOEa+ zO7HS{wF$<4UBE3DTe|EY6sw>mOmOz#Q7~=D=8(MESZm5-3>hX0Yuy){(zE`wAkLh2 z8*gro1Y_S)8lIQ#e@NzD26o=(DOkP4Ju+UcQMUN8<J;c=mr`s!>>^cKS~)-O(}gU7 zdV2BLBQdpum3hzQ6MC@t*pEcb@aef5{;40k)dN%*t5dyt-g`pbeCtitM~Y2y)<-!W zpJVqiWW6TbS2I^TX*MF24TByMK4WFGM^}6JWBG1%!Ly4<%Oeqn*Cq4^M`X^UvgiAe zAvUskkLXRu6S-_NKKKtxOU3xXf3RoQ^(}81RSVB_9VY>)je=sS*Hnm1ARqvk-E@Gg z^_an4m8EhwhKNGsM9Cbj9OAvAmh^qica-LL#d0D$Gx~AxNmc<f-KECl@}0@OhJt)m zoOV<OZEPUg@F&Dy?L*z`xkOZY+flm8Sxu1$hEBM3SL#(+t&Q^1p}1Tv$oKk`afQ}< z@e@O#=ipvB>ARBH;m}i41I)JXOXH^^Eu6;fFSB-0QVb;fOm%g1!CQqMhAYPBEfOba z=O^1Nx!RRwQ)b?M56rdkGCOHti@UoX=8`GC?+RY)!OIlXip*{!i?Xo?DIX4S9TC_a zfmPBa!Lb(J7X=J<cxQIPlraAaw0K2#KA)N~`d&)TVt5S!`vO(6-cJQEdC$XihbtyX zwt3K}&Oj^N*|+q|pdxAwd+2WO<L+cK0CXZ;Zjl|8NVIp0GdXPD8>RM<xQF4VSj2`{ z7Hi9`1p$!1=2jSl0t>4YV)J5(hAvshFF7ANf-=Nx6bF1qRlfu9-)G=MjloSGN#gT~ z;f3*ay8-2gg_i7cgVwhNt2*DzwuKtY-A6-|xX8>A+V|qU2EOz&OLKtEGPwtEUl2Y{ zX;H1d6vkxd%G7=wu{-i~Rp1qBuUf4Lu~hHaOk@80S)<O<@mao5#2Qn`pb;ucgOImq z6&FTuRgAt{)ZH1FrpY-OeU6Lzm>SAZ3MPL#tQzgiW|G{T?ij;a1iV_Lm{aOyI#AUY za~MS3)Gbb}DnP394_+@pR){*An-&>Yb$l?WJ1h=Js7Z1TFUqc#-!S&yaO&q>ozJ`} zt&-Qw%`duhX4YTBqh@B4&&kXn=3~<BspxPOQqa|$mqAcNnSBtouj67x_&?U(HI})P z+wHE02AU}yokHtDe7cC*L#Bi;<!G3{rf7(t_;Q){n?(mIdpI*XaKp-RI#x}3{ho7K zWTN4o1d<rMWFJ~l^{VxPgNz%rIoLlP9EO;g8+X&KBZyZ%VojPC*x5BK3j)ishB4p7 zb3l@ErRrjO*fUy>PF_WcDGmj8rJd|~rxw{;HUQ(G@Pc?N6$*)-TThW&-Zwuw;3l4c z25zhkma4=@R<6VwVrTPLH-ECD9M8ue<yiabr<<HumB7-~DVL2ncTGo0Jf?%%uX@-` zk)9>;2_t=l778~I87|KzSEA5g<GwA$^QFZGFVwX89Yp<PBwIS_KdY0YSuW^NTA<5o zRc#rSbo9_phL!3bgtni=s9<C}UYu4+Ue^w|wvXdJm7&=~#yzH<e{*Xs%-0o;aT`4f zX*RlNu<a6=H|=~GGJsTVz@i`%rZQ$^+alpRk^#L+ipH{rThrsWvgY2Z60=^IDc$|r z5F^dXa!kGI$)_x=P)AX2QWiFi;}mkvu7I2t5~LHnhupOiEpH2=lpen2X+)Sd)K?Ei z=LvA{;7b**3Eu7`7)1~@;@@;^F+?6nNu4;qO~uc0-l&Am!%snμAl?dRZ4uk*7= zN~1Yh9Que}gG>e5=cn!=UXm8`JmIhf^9`{BS-QTU2yY6~W9%b=RB<gUU~L((!b&VG z*GV`}Gv5_`-*3Xvjcqy2I*>W*i@lc%a~gn~wUO3uX^oXZUeV#IBN-;*!D64by7M+e z`Q2UOB(Gb!M^yOw9yeri*r0i5+&L3fVEV?;8L<YjFSo57uTP(JuA$o=J~2qJE#r3x z5zqrpjx)M(2><93-sglXWh-CPu1lZ{Oik?yA^xd)Q^Q8fFTL#SldWXa$EWxg?cI)- zm_=3M`HJ{-=cYQD6ATCXSez8=91^C!VXh=rh1|IESP^|XQMF*`;Y*PHY?-&Sx<h8v ziZ-sehGCGsdS?{snxG^v<F%(#FivXU?O$pw4r=Y}r!Yyzk^&^|+2yOBOl^Wo5~K>I z4o`bONE+yMln#Vx@jN)L9yFI<wfSiwRSQnkp>MJ&<cJX&T`UpBO??MOI75yzHn?j- zyx>i{YL)QSCAY~IVp~a?!C_DdEF6?~C%A&5);}7NSa2G<G3Lj=ZHd`M%Hg7HN-=sm zCon3eZW&qq>DPq(+gN9>!`y2s6<y#9WNcyHyueFDv+R}O(AWP|)+eg2OYx1=u{cy- zndU(l%$Tf`wR<!rtej0wnh-)LX5%IF;j9o0$$dh--Di-KH0Shn?_2Ad{|A=Bzve%S sx~tT6(nORl>?KPGk?<xz1_r-hxY$W|>tlH!ULo6&u$BMK_rIU|Kgm=sT>t<8 literal 0 HcmV?d00001 diff --git a/test/data/3of10.5 b/test/data/3of10.5 new file mode 100644 index 0000000000000000000000000000000000000000..c3b19a46d15cef77585f5cee446e0162d3812bc2 GIT binary patch literal 2533 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 literal 0 HcmV?d00001 diff --git a/test/data/3of10.6 b/test/data/3of10.6 new file mode 100644 index 0000000000000000000000000000000000000000..49236cdb012d8755108e9b86657c33a0eb26f4e7 GIT binary patch literal 2533 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 literal 0 HcmV?d00001 diff --git a/test/data/3of10.7 b/test/data/3of10.7 new file mode 100644 index 0000000000000000000000000000000000000000..5df7362382c60ec4191d84a31f20569d54e3cc63 GIT binary patch literal 2533 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 literal 0 HcmV?d00001 diff --git a/test/data/3of10.8 b/test/data/3of10.8 new file mode 100644 index 0000000000000000000000000000000000000000..32baa3014dc7fe9cc073fd459dce4f2418881016 GIT binary patch literal 2533 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 literal 0 HcmV?d00001 diff --git a/test/data/3of10.9 b/test/data/3of10.9 new file mode 100644 index 0000000000000000000000000000000000000000..fe23f068432473ce9706b970ca707157dfe3ae0f GIT binary patch literal 2533 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 literal 0 HcmV?d00001 -- GitLab