9090 }},
9191 }
9292
93+ subtreeConsistencyProofs = []struct {
94+ start uint64
95+ end uint64
96+ size uint64
97+ proof [][]byte
98+ root1 []byte
99+ root2 []byte
100+ }{
101+ {0 , 1 , 1 , nil , roots [0 ], roots [0 ]},
102+ {0 , 1 , 8 , [][]byte {
103+ dh ("96a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7" , 32 ),
104+ dh ("5f083f0a1a33ca076a95279832580db3e0ef4584bdff1f54c8a360f50de3031e" , 32 ),
105+ dh ("6b47aaf29ee3c2af9af889bc1fb9254dabd31177f16232dd6aab035ca39bf6e4" , 32 ),
106+ }, roots [0 ], roots [7 ]},
107+ {0 , 6 , 8 , [][]byte {
108+ dh ("0ebc5d3437fbe2db158b9f126a1d118e308181031d0a949f8dededebc558ef6a" , 32 ),
109+ dh ("ca854ea128ed050b41b35ffc1b87b8eb2bde461e9e3b5596ece6b9d5975a0ae0" , 32 ),
110+ dh ("d37ee418976dd95753c1c73862b9398fa2a2cf9b4ff0fdfe8b30cd95209614b7" , 32 ),
111+ }, roots [5 ], roots [7 ]},
112+ {0 , 2 , 5 , [][]byte {
113+ dh ("5f083f0a1a33ca076a95279832580db3e0ef4584bdff1f54c8a360f50de3031e" , 32 ),
114+ dh ("bc1a0643b12e4d2d7c77918f44e0f4f79a838b6cf9ec5b5c283e1f4d88599e6b" , 32 ),
115+ }, roots [1 ], roots [4 ]},
116+ {0 , 6 , 7 , [][]byte {
117+ dh ("0ebc5d3437fbe2db158b9f126a1d118e308181031d0a949f8dededebc558ef6a" , 32 ),
118+ dh ("b08693ec2e721597130641e8211e7eedccb4c26413963eee6c1e2ed16ffb1a5f" , 32 ),
119+ dh ("d37ee418976dd95753c1c73862b9398fa2a2cf9b4ff0fdfe8b30cd95209614b7" , 32 ),
120+ }, roots [5 ], roots [6 ]},
121+ // Non-zero starting subtree consistency proofs:
122+ // 1. Subtree that doesn't start at 0 and ends at size ([4, 8) in size 8):
123+ {4 , 8 , 8 , [][]byte {
124+ roots [3 ], // left sibling [0, 4)
125+ }, dh ("6b47aaf29ee3c2af9af889bc1fb9254dabd31177f16232dd6aab035ca39bf6e4" , 32 ), roots [7 ]},
126+ // 2. Subtree of size 1 that doesn't start at 0 ([4, 5) in size 8):
127+ {4 , 5 , 8 , [][]byte {
128+ dh ("40414243" , 4 ),
129+ dh ("a0b4abfc48ab2bb56227fad12cc063da06069d2bd5b3727cf419a2a4e7fdba4f" , 32 ),
130+ dh ("100403353ab9b59c8f2f00584368ffb8513e25fed96d19db1627de86d5cb737c" , 32 ),
131+ }, dh ("3031" , 2 ), dh ("240be06ec4904347ed5f7a636abadb9efb92f3126d2f03bab3e792c9611d2a54" , 32 )},
132+ // 3. Another subtree that doesn't start at 0 and ends at size ([6, 8) in size 8):
133+ {6 , 8 , 8 , [][]byte {
134+ dh ("ee1d9a518610f7c614fc2041969a0f2991533df04bbd74aa9bd33f6747ba3e19" , 32 ),
135+ dh ("100403353ab9b59c8f2f00584368ffb8513e25fed96d19db1627de86d5cb737c" , 32 ),
136+ }, dh ("a0b4abfc48ab2bb56227fad12cc063da06069d2bd5b3727cf419a2a4e7fdba4f" , 32 ), dh ("240be06ec4904347ed5f7a636abadb9efb92f3126d2f03bab3e792c9611d2a54" , 32 )},
137+ // 4. Subtree that doesn't start at 0, doesn't end at size, perfect subtree ([2, 4) in size 8):
138+ {2 , 4 , 8 , [][]byte {
139+ dh ("47dc540c94ceb704a23875c11273e16bb0b8a87aed84de911f2133568115f254" , 32 ),
140+ dh ("bf318a3f7fabd6aac31e69d6fe083b0c398994cd8e057b339d24dda3f401aa1e" , 32 ),
141+ }, dh ("d6f02bf8143fe3daeab2126ae2a41827aad31618a257166d6516a81f52fb8d4f" , 32 ), dh ("240be06ec4904347ed5f7a636abadb9efb92f3126d2f03bab3e792c9611d2a54" , 32 )},
142+ // 5. Subtree that doesn't start at 0, doesn't end at size, not perfect subtree ([4, 7) in size 8):
143+ {4 , 7 , 8 , [][]byte {
144+ dh ("5051525354555657" , 8 ),
145+ dh ("606162636465666768696a6b6c6d6e6f" , 16 ),
146+ dh ("ee1d9a518610f7c614fc2041969a0f2991533df04bbd74aa9bd33f6747ba3e19" , 32 ),
147+ dh ("100403353ab9b59c8f2f00584368ffb8513e25fed96d19db1627de86d5cb737c" , 32 ),
148+ }, dh ("4de1f41f0cd02d69e21935a005bb6cc3753d803eb78332dd7722680bc7d54977" , 32 ), dh ("240be06ec4904347ed5f7a636abadb9efb92f3126d2f03bab3e792c9611d2a54" , 32 )},
149+ }
150+
93151 roots = [][]byte {
94152 dh ("6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d" , 32 ),
95153 dh ("fac54203e7cc696cf0dfcb42c92a1d9dbaf70ad9e621f4bd8d98662f00e3c125" , 32 ),
@@ -671,14 +729,14 @@ type subtreeConsistencyProbe struct {
671729}
672730
673731func subtreeConsistencyProbes (rootDir string ) error {
674- for i , p := range consistencyProofs {
732+ for i , p := range subtreeConsistencyProofs {
675733 dir := filepath .Join (rootDir , strconv .Itoa (i ))
676734 if err := os .MkdirAll (dir , 0755 ); err != nil {
677735 return err
678736 }
679737
680- if err := corruptedSubtreeConsistencyProbes (dir , p .size1 , p .size2 , p .proof ,
681- roots [ p . size1 - 1 ], roots [ p . size2 - 1 ] ); err != nil {
738+ if err := corruptedSubtreeConsistencyProbes (dir , p .start , p .end , p . size , p .proof ,
739+ p . root1 , p . root2 ); err != nil {
682740 return fmt .Errorf ("write subtree consistency test data: %s" , err )
683741 }
684742 }
@@ -695,8 +753,8 @@ func subtreeConsistencyProbes(rootDir string) error {
695753 return nil
696754}
697755
698- func corruptedSubtreeConsistencyProbes (dir string , size1 , size2 uint64 , proof [][]byte , root1 , root2 []byte ) error {
699- happyPath := subtreeConsistencyProbe {0 , size1 , size2 , root1 , root2 , proof , "happy path" , false }
756+ func corruptedSubtreeConsistencyProbes (dir string , start , end , size uint64 , proof [][]byte , root1 , root2 []byte ) error {
757+ happyPath := subtreeConsistencyProbe {start , end , size , root1 , root2 , proof , "happy path" , false }
700758 if err := writeSubtreeConsistencyProbe (dir , happyPath ); err != nil {
701759 return err
702760 }
@@ -705,7 +763,7 @@ func corruptedSubtreeConsistencyProbes(dir string, size1, size2 uint64, proof []
705763 return nil
706764 }
707765
708- probes := invalidSubtreeConsistencyProof (size1 , size2 , root1 , root2 , proof )
766+ probes := invalidSubtreeConsistencyProof (start , end , size , root1 , root2 , proof )
709767 for _ , p := range probes {
710768 if err := writeSubtreeConsistencyProbe (dir , p ); err != nil {
711769 return err
@@ -715,31 +773,31 @@ func corruptedSubtreeConsistencyProbes(dir string, size1, size2 uint64, proof []
715773 return nil
716774}
717775
718- func invalidSubtreeConsistencyProof (end , size uint64 , root1 , root2 []byte , proof [][]byte ) []subtreeConsistencyProbe {
776+ func invalidSubtreeConsistencyProof (start , end , size uint64 , root1 , root2 []byte , proof [][]byte ) []subtreeConsistencyProbe {
719777 ln := len (proof )
720778 ret := []subtreeConsistencyProbe {
721779 // Wrong end (size1).
722- {0 , end - 1 , size , root1 , root2 , proof , "size1 sub @1" , true },
723- {0 , end + 1 , size , root1 , root2 , proof , "size1 plus @1" , true },
724- {0 , end ^ 2 , size , root1 , root2 , proof , "size1 XOR @2" , true },
780+ {start , end - 1 , size , root1 , root2 , proof , "size1 sub @1" , true },
781+ {start , end + 1 , size , root1 , root2 , proof , "size1 plus @1" , true },
782+ {start , end ^ 2 , size , root1 , root2 , proof , "size1 XOR @2" , true },
725783 // Wrong tree size (size2).
726- {0 , end , size * 2 , root1 , root2 , proof , "size2 mul @2" , true },
727- {0 , end , size / 2 , root1 , root2 , proof , "size2 div @2" , true },
784+ {start , end , size * 2 , root1 , root2 , proof , "size2 mul @2" , true },
785+ {start , end , size / 2 , root1 , root2 , proof , "size2 div @2" , true },
728786 // Wrong root.
729- {0 , end , size , []byte ("WrongRoot" ), root2 , proof , "wrong root1" , true },
730- {0 , end , size , root1 , []byte ("WrongRoot" ), proof , "wrong root2" , true },
731- {0 , end , size , root2 , root1 , proof , "swapped roots" , true },
787+ {start , end , size , []byte ("WrongRoot" ), root2 , proof , "wrong root1" , true },
788+ {start , end , size , root1 , []byte ("WrongRoot" ), proof , "wrong root2" , true },
789+ {start , end , size , root2 , root1 , proof , "swapped roots" , true },
732790 // Empty proof.
733- {0 , end , size , root1 , root2 , [][]byte {}, "empty proof" , true },
791+ {start , end , size , root1 , root2 , [][]byte {}, "empty proof" , true },
734792 // Add garbage at the end.
735- {0 , end , size , root1 , root2 , extend (proof , []byte {}), "trailing garbage" , true },
736- {0 , end , size , root1 , root2 , extend (proof , root1 ), "trailing root1" , true },
737- {0 , end , size , root1 , root2 , extend (proof , root2 ), "trailing root2" , true },
793+ {start , end , size , root1 , root2 , extend (proof , []byte {}), "trailing garbage" , true },
794+ {start , end , size , root1 , root2 , extend (proof , root1 ), "trailing root1" , true },
795+ {start , end , size , root1 , root2 , extend (proof , root2 ), "trailing root2" , true },
738796 // Add garbage at the front.
739- {0 , end , size , root1 , root2 , prepend (proof , []byte {}), "preceding garbage" , true },
740- {0 , end , size , root1 , root2 , prepend (proof , root1 ), "preceding root1" , true },
741- {0 , end , size , root1 , root2 , prepend (proof , root2 ), "preceding root2" , true },
742- {0 , end , size , root1 , root2 , prepend (proof , proof [0 ]), "preceding proof @0" , true },
797+ {start , end , size , root1 , root2 , prepend (proof , []byte {}), "preceding garbage" , true },
798+ {start , end , size , root1 , root2 , prepend (proof , root1 ), "preceding root1" , true },
799+ {start , end , size , root1 , root2 , prepend (proof , root2 ), "preceding root2" , true },
800+ {start , end , size , root1 , root2 , prepend (proof , proof [0 ]), "preceding proof @0" , true },
743801 }
744802
745803 // Remove a node from the end.
@@ -785,6 +843,7 @@ func staticSubtreeConsistencyProbes(dir string) error {
785843 {1 , 1 , 2 , sha256EmptyTreeHash , sha256EmptyTreeHash , proof2 , "subtree is empty roots valid but proof is not empty" , true },
786844 {1 , 1 , 2 , root1 , root1 , proof1 , "subtree is empty roots match but not valid" , true },
787845 // Invalid subtree boundaries (not a multiple of power of 2 >= end - start).
846+ // Invalid subtree boundaries (not a multiple of power of 2 >= end - start):
788847 {1 , 15 , 15 , root1 , root2 , proof1 , "invalid subtree start 1 end 15 size 15" , true },
789848 {1 , 3 , 8 , root1 , root2 , proof1 , "invalid subtree start 1 end 3 size 8" , true },
790849 {2 , 5 , 8 , root1 , root2 , proof1 , "invalid subtree start 2 end 5 size 8" , true },
0 commit comments