Skip to content

Commit ed0106b

Browse files
committed
feat: add method to verify consistent precomputed data
1 parent bf59d17 commit ed0106b

File tree

3 files changed

+54
-9
lines changed

3 files changed

+54
-9
lines changed

vid/src/advz.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1022,7 +1022,7 @@ mod tests {
10221022

10231023
#[test]
10241024
fn sad_path_verify_share_corrupt_share() {
1025-
let (mut advz, bytes_random) = advz_init();
1025+
let (mut advz, bytes_random, _) = advz_init();
10261026
let disperse = advz.disperse(bytes_random).unwrap();
10271027
let (shares, common, commit) = (disperse.shares, disperse.common, disperse.commit);
10281028

@@ -1088,7 +1088,7 @@ mod tests {
10881088

10891089
#[test]
10901090
fn sad_path_verify_share_corrupt_commit() {
1091-
let (mut advz, bytes_random) = advz_init();
1091+
let (mut advz, bytes_random, _) = advz_init();
10921092
let disperse = advz.disperse(bytes_random).unwrap();
10931093
let (shares, common, commit) = (disperse.shares, disperse.common, disperse.commit);
10941094

@@ -1134,7 +1134,7 @@ mod tests {
11341134

11351135
#[test]
11361136
fn sad_path_verify_share_corrupt_share_and_commit() {
1137-
let (mut advz, bytes_random) = advz_init();
1137+
let (mut advz, bytes_random, _) = advz_init();
11381138
let disperse = advz.disperse(bytes_random).unwrap();
11391139
let (mut shares, mut common, commit) = (disperse.shares, disperse.common, disperse.commit);
11401140

@@ -1159,8 +1159,8 @@ mod tests {
11591159

11601160
#[test]
11611161
fn sad_path_recover_payload_corrupt_shares() {
1162-
let (mut advz, bytes_random) = advz_init();
1163-
let disperse = advz.disperse(&bytes_random).unwrap();
1162+
let (mut advz, bytes_random, _) = advz_init();
1163+
let disperse = advz.disperse(bytes_random.clone()).unwrap();
11641164
let (shares, common) = (disperse.shares, disperse.common);
11651165

11661166
{
@@ -1219,13 +1219,13 @@ mod tests {
12191219
/// Returns the following tuple:
12201220
/// 1. An initialized [`Advz`] instance.
12211221
/// 2. A `Vec<u8>` filled with random bytes.
1222-
pub(super) fn advz_init() -> (Advz<Bls12_381, Sha256>, Vec<u8>) {
1222+
pub(super) fn advz_init() -> (Advz<Bls12_381, Sha256>, Vec<u8>, u32) {
12231223
let (recovery_threshold, num_storage_nodes) = (4, 6);
12241224
let mut rng = jf_utils::test_rng();
12251225
let srs = init_srs(recovery_threshold as usize, &mut rng);
12261226
let advz = Advz::new(num_storage_nodes, recovery_threshold, srs).unwrap();
12271227
let bytes_random = init_random_payload(4000, &mut rng);
1228-
(advz, bytes_random)
1228+
(advz, bytes_random, num_storage_nodes)
12291229
}
12301230

12311231
/// Convenience wrapper to assert [`VidError::Argument`] return value.

vid/src/advz/precomputable.rs

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
//! Implementations of [`Precomputable`] for `Advz`.
88
9+
use crate::VidError;
910
use crate::{
1011
advz::{
1112
polynomial_eval, AdvzInternal, Common, HasherDigest, KzgCommit, KzgEvalsMerkleTree,
@@ -14,14 +15,16 @@ use crate::{
1415
precomputable::Precomputable,
1516
vid, VidDisperse, VidResult,
1617
};
18+
use alloc::string::ToString;
1719
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
1820
use ark_std::{end_timer, start_timer, vec::Vec};
1921
use jf_merkle_tree::{MerkleCommitment, MerkleTreeScheme};
2022
use jf_pcs::{prelude::Commitment, PolynomialCommitmentScheme, UnivariatePCS};
21-
2223
use jf_utils::canonical;
2324
use serde::{Deserialize, Serialize};
2425

26+
use super::Advz;
27+
2528
impl<E, H, T> Precomputable for AdvzInternal<E, H, T>
2629
where
2730
E: Pairing,
@@ -139,6 +142,26 @@ where
139142
commit,
140143
})
141144
}
145+
146+
fn is_consistent_precompute(
147+
commit: &Self::Commit,
148+
precompute_data: &Self::PrecomputeData,
149+
payload_byte_len: u32,
150+
num_storage_nodes: u32,
151+
) -> VidResult<()> {
152+
if *commit
153+
!= Advz::<E, H>::derive_commit(
154+
&precompute_data.poly_commits,
155+
payload_byte_len,
156+
num_storage_nodes,
157+
)?
158+
{
159+
return Err(VidError::Argument(
160+
"precompute data inconsistent with commit".to_string(),
161+
));
162+
}
163+
Ok(())
164+
}
142165
}
143166

144167
#[derive(
@@ -217,7 +240,7 @@ mod tests {
217240

218241
#[test]
219242
fn commit_disperse_recover_with_precomputed_data() {
220-
let (advz, bytes_random) = advz_init();
243+
let (advz, bytes_random, _) = advz_init();
221244
let (commit, data) = advz.commit_only_precompute(&bytes_random).unwrap();
222245
let disperse = advz.disperse_precompute(&bytes_random, &data).unwrap();
223246
let (shares, common) = (disperse.shares, disperse.common);
@@ -231,4 +254,17 @@ mod tests {
231254
.expect("recover_payload should succeed");
232255
assert_eq!(bytes_recovered, bytes_random);
233256
}
257+
258+
#[test]
259+
fn commit_and_verify_consistent_precomputed_data() {
260+
let (advz, bytes_random, num_storage_nodes) = advz_init();
261+
let (commit, data) = advz.commit_only_precompute(&bytes_random).unwrap();
262+
assert!(Advz::is_consistent_precompute(
263+
&commit,
264+
&data,
265+
bytes_random.len() as u32,
266+
num_storage_nodes
267+
)
268+
.is_ok())
269+
}
234270
}

vid/src/precomputable.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,13 @@ pub trait Precomputable: VidScheme {
3636
) -> VidResult<VidDisperse<Self>>
3737
where
3838
B: AsRef<[u8]>;
39+
40+
/// Check that a [`Precomputable::PrecomputeData`] is consistent with a
41+
/// [`VidScheme::Commit`].
42+
fn is_consistent_precompute(
43+
commit: &Self::Commit,
44+
precompute_data: &Self::PrecomputeData,
45+
payload_byte_len: u32,
46+
num_storage_nodes: u32,
47+
) -> VidResult<()>;
3948
}

0 commit comments

Comments
 (0)