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
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

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
zcmeHI={FP(7oM>jBobN5*cw|SJ7aAyuk10l7BhAVBa%U4hOsAOUm9y<Efp<8C2O{9
zBQf?RYnEghO!@V`_3`&7y!V{vKIc65ocr8!?}v+Y^}%?8{X=fKy7_s6-7x{TTzvyP
zgTS{{KyCICc`~X#rYl0dCC`QH_R}|539%VAFlzPO>2VCQe<qsC$6`Q^%@smpdzn5Y
zmtQ?daIu)xumb!qIC%ar=iF}wdc<_Uz>RI<B~!;@!%2O|MPiT89m|0Z>(OxH{AROq
zjz)79B$k%*<yRzlnf)|XY*FIA<rNsrnbwhJpvqqfY<!~hZ?pXI_<#Pl4FD6zm{fCs
z=gf^CpA>pmwG>!~)6r4LEO}~$FY*%@*OVm_(l`;bBk~`Aa$BZ)V~EV4ziqVtvexg*
z5di?E-(VL0jlVjx#h*F{&v`sh@;nb4r+l1g+z%cg5XcH(#shf)zjY839tZ>s(JCD_
zh;5#)*IBW<v$%y~gu~u`G1O1e5NE|Yz)I^gKj>P2Rs-iX0QHkZ)bEOqYMU+1O0c8_
z<Bg5ctl0OI`sby4pHq%409)_!<}Y79_Hn36wQO#x<@-f|Ln*cnW=oZkIhU8abSYD?
zj$S-iB(A)_IODo-TpN}UH$_s57@xl3n>y95;typkk9KOi?+CZ^uQr$+Dm2KN9cEwo
z61Rux(r&=*8aZ0ZaFD1R7{5M|)28M-bma#>7j9SOKea_84n-Mmm;FB5ptFn0p6^A4
znnQAn=nY51IUEz7_|J;-#rWQ@*fXm-h@1LVA`@*#$w2BeA@Ni%D2a&~2mod^?4xV0
zOkiCg)ML*=#Xz!RU0h9E5}jfQ`kvY+O5>+uS<$Ttop|I3yP%QQ{IisYTO&L5`FTn>
zjp%gRU{8$RFOaYD=h`>ZNgl-JLn8EynrI|LGs3Jb)dixy_OP@sK1Ut&qwe02eAAtT
z;l8l*NVja_wiLEM?Br+<i^W)J!f2F<-H_E)_BP5rU8xUnEln-fje;wBiv|}=l7?v)
zMw$^kZ_h#QO?>(hm}Bl{bVAnxcY8J5Awy!%k#(g5e>T5HbaE42n1$WH_jw=J5{cas
zTqa)@8hpX`GM~YTY|Tm>6%kkj7cXkf<WbWH#-wFU`d3h}Z(v2Uy;J~``wUF0zkHZ%
zkqdre4>ZM{c~8H}Tu80v4BPH})Sl7>V0k_J^s1{tQB0xTQauqQu_;|2Y%r}@nWDbZ
z@3W)kI0;~nwfICVPD>ZHcmxSY6kSX!^^_~3e8E^N2!!-F-2KD^;BRKX`1k>ou)^_^
zW8&u^wgqk+?@l@pY<4&hy3w+PY~J?B{<?TZ^rrKY7qiQ+?Cv?WCx+)!@)tCBmTJBx
z?7TxEjN|geg2e-NTkB0pV{M0cz)qENA!@$Prjf>S@#!<o`J*%ZVW<_R&|ZCyXjMY)
zoN0VG!BHXRc42#KV452DNX&U2>LY3xLouXl>7a6;HH%4VeY|B5XX5{Qj$%xyJKN$>
zWt+_)X{By(t5*V2?SJyQ39*AzIGohGaFs{<y;}VefW+!#`-sA<D!DZS-!;2#zU7&W
z02yd*<1qoTt<#gfs#mHf*7@y>bYrKIgGXZ`pyVKz>{mfxy|a7F)DJDT<q==a+^Z2e
zBb#p>4|LV;wX_Pa2Jvg5Y7UqZzdiJW`KpP9`baF4X}p`WrgBEG_yw+++Kk63%dFn9
zFN;dj+mS?*LguZ)$}3+tU9vvw1a1uRC9;O2CZ>m+v}y?w6-DgHGlE;&dSyYZ5cY7E
z06Z5cIY+uSwu3Xh>F|V$hqyvtU|ZUWj!()_on<{RE(#wrUxj=D$#vridc!?n${IKP
zn7QZ1N^dDNA*y0AK@U5bx4iy~)5GRM!eO?Vw+_+p__8FHu0px0&%F&FAoId|HC}gc
z!qKiJa)}>56qv~0K&3l89a)U_+l~J|pTM6M7cyJj?6V*Ji;;q`(Ro@cOGC_RQ(k}<
zRw|p*E9icGTj{1sJ0RL#GNYW4Wn(+8n6j$j@3n_Jb~0V9qYL+ldg0y8m2huIB*tmr
zFtkzsj_#&IRPMO_RZtIFsUGVA8it=W>ar*lxh3V_si<H8(c2gwx|uosUWt_X(n#_4
zZhfo_JKGV}#g+e@h<q*OT*EmLcs#eTeO5W>l&}z;;NIt~o`eV%@=$#6p7$9FUSC($
z8<Q(|Yztp1?<Ex6O3;rasV2N@*<gs?mzF+$VUvoV<i1e>o<W`ju`HOgpx>THHoVEp
zBr6VNXL9MFI(0MTX<wc=hq_6b%<x9QW{uax_aSs0AyK}2=qrO$1ai4orvJ(UYLT5(
z@K7`H0?l|^Y^>Xms~!8|6njs`q&N0X4$Q6xY1B+!y{SG}26|0LDt$~hln4=D+Gx*R
z4-;^9h?lx<>Ks|_?R`|A!Da5pH{r~k1cm7sfG5Q3#lHoc*<2q#VP8$RIC!j^Xi+9$
z9V(~|92sJ?<50daC4A2b*UA=m)2>T;=)&Qa1t8y4?a_Yyg;#EtRw<?s;?StToR!nj
zJc}4KfxnPnYkIVmB~h>E1Dl;ft##t)cg(e<%Fr9v9x3>pN>a-2d+>_cYO>7TUd1{i
zdQk&cT+PtUTD~;^c1%>1JL|TinLk8+yWKtCR2<aQ+D&1SiX;0=-m%P6Ig#3clp;vy
zj~<+Izn|RGX(JN|Q|G;ZRMl%Nw`~5)M7oAGNt3?LA)hTyVzjYE7B_s@*T?B`oi@jL
z3G=b8TUJ3Mmgk*DUXYqg(sU1kN?;Mpxwk^fDazdgkxBWduxo=p0-FfTHd+=JZC;Ae
z);x}Z!kyAHyNO=HzRm2D*I~}p6$%c>*)D8B?u_6oR3qeCf7qL^6?I8UtJ3@*YuT(T
zu8s4ebSDf~yEHn~Bu(uNPZ$zHDMmvj^#06H4B2^D<*jEgH+kA_cjtT4itlH(g8$5X
t5p#ytw$eluFYTmA3X}1MKYMzAT(WJYJAGigFHsI@N!-Z$?)~3S{SOZaH1Yrd

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
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

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
zcmeHI`8N~{7oIT&Gq%W*rHrkSWn^b8**~wnj4fd>ks?wu$eS7a8e^xCC9;-;YDlsT
zGh{D}vX(VVG7YA@eP8|f{t4eb=ef^0&pqcp_uTu#MR{Ebx(o{pz2)T{a2e(kbp4i>
z|Mkluu-mH8E=S1%S+y$`E5g*$XCn3cgbi?9Y?eKeRx^KcDhM?=8_jvedgu(B7o5)a
zoG@~xux2>U!+K8B7Vy8|;Qq~!`Ckmg#Pqk|-f!Zi(%;8M5C@Kl#vY-2mV=$vqm45c
zHrrJ4G~06EvGlypKcisF>?djBOOp3&+>l6DdQZkVHU27K^AqKNo8`C1|MS0X0GRZi
zMJ*4gWM%qTQ22HAr{H>=uC79M=~G+$g8+dkEjdzL2E=@BO#bZ;E}L|}piB_-PaB;-
zto`e9nE(LGFMvdT;g1fo{$1zbK8puRo#keO$j4j6f9D1QfnWd#599^>(xEJPAP_J@
zuX5VR?7IAN9gN+b!!4GWJMHb4AOfTeakk(gFnz%4fV|#VYs`BNI!F}N_*-H^$MVyh
zBx}Y^ys0S~jD0iS@T_caGL>f$*!eea;qpbEw<FbR<?|mpzWoJoD#O+zFVJLVl?w7d
zozE7kXOs*-kWkrQn)O;drh`n3|3FlaocegpKm9|uY9NBSJkhJ;vm?^YzuIJZsL&*5
zd6?_=IessQtkZ<sHF36)<si~Hf&vCaPg+>*FjVgUSiD_b`1AtW{7{VPeKBCt9-aH3
z{Mp{!Fe`Ze14h%)XdcJ(W&EV#LJ6Mw1$$~$*ZhV-wdi!$Q3{aOC@higiy*RqfB;}l
z(>}V^Z5rzVr|~p~i9_YY$(*g6lD*>Qj6L;t<IV3%<ixh7brVoy>_R5m3yrA{x5joF
z3Ja8Rn$ZOMFeOI+C)8hMvhLN#WK3q;VJ6~~x>yubE7Gzn-2<+%_ONUqAx{JPy*_P3
zzV%Mx=s@^cly`3CwlsDyTyTQIYW=<}apJC-!-(xA_O9_XJ?TDUZ7pr^Mv<HT(m5lu
z<WaiOSerR_yAnKY`rY^7JS%UL<9gP(+p7^yS(1Cs;FTWy>B3sEnN4(Y4t76nav#?b
zh20WbCS4RBZsB`g$b_IebCM=R1(skXOWLyqG{Vq(89B4T6;I?>n4;xgI)KGz7O6d0
zF-o$|hdprwTHsE-VO#<g(`q2$+r5vvQ^^3(u}Haj2qu|m>ylu2(7ZE5>m%_Dq6FC_
z2H56nA6g0nAY7BwD9k56iu$AIM=#Q%lZl2SOW}k|?WP5d&FDppH$YIT2Liv!@tmwx
z!=B&xw~{JoHFs?VD%i64td<)rTF`|k+D~oWLpmINagfKS)G4sK>%k1KO=3UW%n&#?
zDMkS?kOgv>JkAL8L^7XG#Fu)rVW(Q9*mI%YzM0PY*V9I=g`-pa;hrljVN?T5v|3#L
zyhTDpoU=mA?c(mv;0$%Hv6!>mv`4gXreY}h(?QixXAX<>`c%g-&Mffd{J80O{pk)&
z^@Us}Q9FHuOQQ;q?)ZbxTbLcH%Hg6x##J5dQ?&;r0ZBC}j*-PV)o0eu`L8+j^DWP2
zU6)1VH}eRHZ=Ia+S97bGUgvi((Tn|%a&sak5<v>_$bAt4(?7ijqV;uLsEGVx=~H8#
zH@4aCe4wYE*3l`l8p5ybS$n{e^z~r?(qCOX?26=Kx#sJ6I~pXCH6VD+!hR}VMRxU$
zWBJ`={T(SZF?7K;yrSx5>v_A=F0kfM|4eX%=k&)B7wx(@$;t=pDYHUb+xq1pU^sgO
z>vcRQG$l`_F180kXgxgcfss%c2=2-_-t$i7Zf`jS$vMsk;;WP|B6@8+L2vk6|6qq3
zeGH;pTcMUA67N<nCF)~m3YOP@LNNA5iHEtCe!7{4$CjnA4At>V23*_5LnK~fs^-fc
zh%wr$^i0y*z9KXEYn}wBr(;Xe0lNv`783b0;zQ?Z+OF(J|750`+v`59lcSr@>5R9)
z7FVj;2$hV0fh~fC@(z@~m%^-I=Gb4DQcPXd4D{W@@dy&sd&sy)G^5uyRwDeIQ9&+4
zhhfbIcl0)$?&eQ9UV>84$_-cybkz8?3E8?>^p<pBucE>^xc<h}$c^leZ<LAI&rK9>
z?>5BBva=o0JiPdoMCI$om70`9jT5*;9CIq5Cq#r9aXtgC8p-B2g)xfv-|#ki8aLEe
zQ)BXlc((9m^1i}1JL3$Zh-!(iJ2seN_he*_8Ew+=GhEjyVY4VfDC?pXE4uwGs_9ih
zHc4?PH=9$}vsW)mp8olXYnZpR*(`4)a?W&3Vjs@X6&B-5L%R)sh$B__W(Te;dM>dO
ziymqv8PQF*#ozZEa&}`|POww5X8f>s@{kS`lt~+D^@hf9IrJq1rTms)C>bj8X`?%T
zJzT)mDM9+Gg=<uWpWjhK7N=DJ-?S@NG6Jc44mK^(Ao2C4rTx{Z<Bl~9>x0L7N!H~8
zc40y~z_Af#H_p>Prj+kloO}7wZpKw9jGnQvO%c>TU1ws@VDW{wjcuw0Jac41VBXf{
zXn|E6k;q@nul;eNlQl`7(#PhYP-mAk@h!+bxhm|M`y+*b6UoYj1NUEmY-h@S998YI
zqL(yrB{fXFoaI|XFy|!2GpD_Gv<gQ^?c4nettBC?o&Do1(($A~sXI0Ws>jotP||TS
zg%bxSeD0-CdhKO{ks7@Bj;g7qXO^vgn#t6HleHM@9P+smL}nLTR7q3cz5!03^Q0Bd
zSA-9|Zc~kjTwZV)YazCkX6PM+lp-TR`L{wV##Q=<qLK?wVAqDP2yB`MZKLII(N<+a
zI$Fnq5XLTq?EXw&5&t&!nX5?Gno0#H)EpUGls_x<!m}CfJ{bP$OJ#ks@~RB~+d4M8
zO7|&VPrYfwRkCJ}x|D^Z;c>&buyK=-QpR9*SP;o|RJHvwm5cPzVRz?S>x%y*ThV`J
uKa0B}>N@FSisyGyr9?=0!ygpt_wyGz87_Tn_arOe9Z4Gn-~9gjss91JX)eeB

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