@@ -91,7 +91,7 @@ impl Shred {
91
91
dispatch ! ( fn erasure_shard_index( & self ) -> Result <usize , Error >) ;
92
92
dispatch ! ( fn merkle_tree_node( & self ) -> Result <Hash , Error >) ;
93
93
dispatch ! ( fn payload( & self ) -> & Vec <u8 >) ;
94
- dispatch ! ( fn sanitize( & self ) -> Result <( ) , Error >) ;
94
+ dispatch ! ( fn sanitize( & self , verify_merkle_proof : bool ) -> Result <( ) , Error >) ;
95
95
dispatch ! ( fn set_merkle_branch( & mut self , merkle_branch: MerkleBranch ) -> Result <( ) , Error >) ;
96
96
dispatch ! ( fn set_signature( & mut self , signature: Signature ) ) ;
97
97
dispatch ! ( fn signed_message( & self ) -> & [ u8 ] ) ;
@@ -219,6 +219,23 @@ impl ShredData {
219
219
self . merkle_branch = merkle_branch;
220
220
Ok ( ( ) )
221
221
}
222
+
223
+ fn sanitize ( & self , verify_merkle_proof : bool ) -> Result < ( ) , Error > {
224
+ match self . common_header . shred_variant {
225
+ ShredVariant :: MerkleData ( proof_size) => {
226
+ if self . merkle_branch . proof . len ( ) != usize:: from ( proof_size) {
227
+ return Err ( Error :: InvalidProofSize ( proof_size) ) ;
228
+ }
229
+ }
230
+ _ => return Err ( Error :: InvalidShredVariant ) ,
231
+ }
232
+ if !verify_merkle_proof {
233
+ debug_assert_matches ! ( self . verify_merkle_proof( ) , Ok ( true ) ) ;
234
+ } else if !self . verify_merkle_proof ( ) ? {
235
+ return Err ( Error :: InvalidMerkleProof ) ;
236
+ }
237
+ shred_data:: sanitize ( self )
238
+ }
222
239
}
223
240
224
241
impl ShredCode {
@@ -317,6 +334,23 @@ impl ShredCode {
317
334
self . merkle_branch = merkle_branch;
318
335
Ok ( ( ) )
319
336
}
337
+
338
+ fn sanitize ( & self , verify_merkle_proof : bool ) -> Result < ( ) , Error > {
339
+ match self . common_header . shred_variant {
340
+ ShredVariant :: MerkleCode ( proof_size) => {
341
+ if self . merkle_branch . proof . len ( ) != usize:: from ( proof_size) {
342
+ return Err ( Error :: InvalidProofSize ( proof_size) ) ;
343
+ }
344
+ }
345
+ _ => return Err ( Error :: InvalidShredVariant ) ,
346
+ }
347
+ if !verify_merkle_proof {
348
+ debug_assert_matches ! ( self . verify_merkle_proof( ) , Ok ( true ) ) ;
349
+ } else if !self . verify_merkle_proof ( ) ? {
350
+ return Err ( Error :: InvalidMerkleProof ) ;
351
+ }
352
+ shred_code:: sanitize ( self )
353
+ }
320
354
}
321
355
322
356
impl MerkleBranch {
@@ -368,7 +402,8 @@ impl ShredTrait for ShredData {
368
402
merkle_branch,
369
403
payload,
370
404
} ;
371
- shred. sanitize ( ) . map ( |_| shred)
405
+ shred. sanitize ( /*verify_merkle_proof:*/ true ) ?;
406
+ Ok ( shred)
372
407
}
373
408
374
409
fn erasure_shard_index ( & self ) -> Result < usize , Error > {
@@ -402,18 +437,7 @@ impl ShredTrait for ShredData {
402
437
}
403
438
404
439
fn sanitize ( & self ) -> Result < ( ) , Error > {
405
- match self . common_header . shred_variant {
406
- ShredVariant :: MerkleData ( proof_size) => {
407
- if self . merkle_branch . proof . len ( ) != usize:: from ( proof_size) {
408
- return Err ( Error :: InvalidProofSize ( proof_size) ) ;
409
- }
410
- }
411
- _ => return Err ( Error :: InvalidShredVariant ) ,
412
- }
413
- if !self . verify_merkle_proof ( ) ? {
414
- return Err ( Error :: InvalidMerkleProof ) ;
415
- }
416
- shred_data:: sanitize ( self )
440
+ self . sanitize ( /*verify_merkle_proof:*/ true )
417
441
}
418
442
419
443
fn signed_message ( & self ) -> & [ u8 ] {
@@ -452,7 +476,8 @@ impl ShredTrait for ShredCode {
452
476
merkle_branch,
453
477
payload,
454
478
} ;
455
- shred. sanitize ( ) . map ( |_| shred)
479
+ shred. sanitize ( /*verify_merkle_proof:*/ true ) ?;
480
+ Ok ( shred)
456
481
}
457
482
458
483
fn erasure_shard_index ( & self ) -> Result < usize , Error > {
@@ -486,18 +511,7 @@ impl ShredTrait for ShredCode {
486
511
}
487
512
488
513
fn sanitize ( & self ) -> Result < ( ) , Error > {
489
- match self . common_header . shred_variant {
490
- ShredVariant :: MerkleCode ( proof_size) => {
491
- if self . merkle_branch . proof . len ( ) != usize:: from ( proof_size) {
492
- return Err ( Error :: InvalidProofSize ( proof_size) ) ;
493
- }
494
- }
495
- _ => return Err ( Error :: InvalidShredVariant ) ,
496
- }
497
- if !self . verify_merkle_proof ( ) ? {
498
- return Err ( Error :: InvalidMerkleProof ) ;
499
- }
500
- shred_code:: sanitize ( self )
514
+ self . sanitize ( /*verify_merkle_proof:*/ true )
501
515
}
502
516
503
517
fn signed_message ( & self ) -> & [ u8 ] {
@@ -619,10 +633,7 @@ pub(super) fn recover(
619
633
Some ( ( common_header, coding_header) )
620
634
} ) ;
621
635
let ( common_header, coding_header) = headers. ok_or ( TooFewParityShards ) ?;
622
- debug_assert ! ( matches!(
623
- common_header. shred_variant,
624
- ShredVariant :: MerkleCode ( _)
625
- ) ) ;
636
+ debug_assert_matches ! ( common_header. shred_variant, ShredVariant :: MerkleCode ( _) ) ;
626
637
let proof_size = match common_header. shred_variant {
627
638
ShredVariant :: MerkleCode ( proof_size) => proof_size,
628
639
ShredVariant :: MerkleData ( _) | ShredVariant :: LegacyCode | ShredVariant :: LegacyData => {
@@ -751,12 +762,14 @@ pub(super) fn recover(
751
762
} ) ;
752
763
}
753
764
}
754
- // TODO: No need to verify merkle proof in sanitize here.
755
765
shreds
756
766
. into_iter ( )
757
767
. zip ( mask)
758
768
. filter ( |( _, mask) | !mask)
759
- . map ( |( shred, _) | shred. sanitize ( ) . map ( |_| shred) )
769
+ . map ( |( shred, _) | {
770
+ shred. sanitize ( /*verify_merkle_proof:*/ false ) ?;
771
+ Ok ( shred)
772
+ } )
760
773
. collect ( )
761
774
}
762
775
@@ -1018,7 +1031,7 @@ fn make_erasure_batch(
1018
1031
shred. set_merkle_branch ( merkle_branch) ?;
1019
1032
shred. set_signature ( signature) ;
1020
1033
debug_assert ! ( shred. verify( & keypair. pubkey( ) ) ) ;
1021
- debug_assert_matches ! ( shred. sanitize( ) , Ok ( ( ) ) ) ;
1034
+ debug_assert_matches ! ( shred. sanitize( /*verify_merkle_proof:*/ true ) , Ok ( ( ) ) ) ;
1022
1035
// Assert that shred payload is fully populated.
1023
1036
debug_assert_eq ! ( shred, {
1024
1037
let shred = shred. payload( ) . clone( ) ;
@@ -1247,7 +1260,7 @@ mod test {
1247
1260
let signature = keypair. sign_message ( shred. signed_message ( ) ) ;
1248
1261
shred. set_signature ( signature) ;
1249
1262
assert ! ( shred. verify( & keypair. pubkey( ) ) ) ;
1250
- assert_matches ! ( shred. sanitize( ) , Ok ( ( ) ) ) ;
1263
+ assert_matches ! ( shred. sanitize( /*verify_merkle_proof:*/ true ) , Ok ( ( ) ) ) ;
1251
1264
}
1252
1265
assert_eq ! ( shreds. iter( ) . map( Shred :: signature) . dedup( ) . count( ) , 1 ) ;
1253
1266
for size in num_data_shreds..num_shreds {
@@ -1382,7 +1395,7 @@ mod test {
1382
1395
// Assert that shreds sanitize and verify.
1383
1396
for shred in & shreds {
1384
1397
assert ! ( shred. verify( & keypair. pubkey( ) ) ) ;
1385
- assert_matches ! ( shred. sanitize( ) , Ok ( ( ) ) ) ;
1398
+ assert_matches ! ( shred. sanitize( /*verify_merkle_proof:*/ true ) , Ok ( ( ) ) ) ;
1386
1399
let ShredCommonHeader {
1387
1400
signature,
1388
1401
shred_variant,
0 commit comments