Skip to content

Commit 98a8b79

Browse files
committed
Working.
1 parent 21b658d commit 98a8b79

File tree

2 files changed

+51
-7
lines changed

2 files changed

+51
-7
lines changed

src/encoding.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,14 +112,10 @@ pub fn sskr_generate_using(
112112
random_generator: &mut impl RandomNumberGenerator
113113
) -> Result<Vec<Vec<Vec<u8>>>, Error> {
114114
let groups_shares = generate_shares(spec, master_secret, random_generator)?;
115-
let mut result = vec![vec![vec![0u8; 0]; spec.share_count()]; spec.group_count()];
116115

117-
for (group_index, group) in groups_shares.iter().enumerate() {
118-
for share in group {
119-
let share_bytes = serialize_share(share);
120-
result[group_index][share.member_index()].extend_from_slice(&share_bytes);
121-
}
122-
}
116+
let result: Vec<Vec<Vec<u8>>> = groups_shares.iter().map (|group| {
117+
group.iter().map(serialize_share).collect()
118+
}).collect();
123119

124120
Ok(result)
125121
}

src/lib.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,52 @@ mod tests {
7070
let recovered_secret = sskr_combine(&recovered_shares).unwrap();
7171
assert_eq!(recovered_secret, secret);
7272
}
73+
74+
#[test]
75+
fn test_split_2_7() {
76+
let mut rng = FakeRandomNumberGenerator;
77+
let secret = Secret::new(hex!("204188bfa6b440a1bdfd6753ff55a8241e07af5c5be943db917e3efabc184b1a")).unwrap();
78+
let group = GroupSpec::new(2, 7).unwrap();
79+
let spec = Spec::new(1, vec![group]).unwrap();
80+
let shares = sskr_generate_using(&spec, &secret, &mut rng).unwrap();
81+
// println!("shares: {:?}", shares);
82+
assert_eq!(shares.len(), 1);
83+
assert_eq!(shares[0].len(), 7);
84+
let flattened_shares = shares.into_iter().flatten().collect::<Vec<_>>();
85+
assert_eq!(flattened_shares.len(), 7);
86+
for share in &flattened_shares {
87+
assert_eq!(share.len(), METADATA_LENGTH_BYTES + secret.len());
88+
// println!("share: {}", hex::encode(share));
89+
}
90+
91+
let recovered_share_indexes = vec![3, 4];
92+
let recovered_shares = recovered_share_indexes.iter().map(|index| flattened_shares[*index].clone()).collect::<Vec<_>>();
93+
let recovered_secret = sskr_combine(&recovered_shares).unwrap();
94+
assert_eq!(recovered_secret, secret);
95+
}
96+
97+
#[test]
98+
fn test_split_2_3_2_3() {
99+
let mut rng = FakeRandomNumberGenerator;
100+
let secret = Secret::new(hex!("204188bfa6b440a1bdfd6753ff55a8241e07af5c5be943db917e3efabc184b1a")).unwrap();
101+
let group1 = GroupSpec::new(2, 3).unwrap();
102+
let group2 = GroupSpec::new(2, 3).unwrap();
103+
let spec = Spec::new(2, vec![group1, group2]).unwrap();
104+
let shares = sskr_generate_using(&spec, &secret, &mut rng).unwrap();
105+
println!("shares: {:?}", shares);
106+
assert_eq!(shares.len(), 2);
107+
assert_eq!(shares[0].len(), 3);
108+
assert_eq!(shares[1].len(), 3);
109+
let flattened_shares = shares.into_iter().flatten().collect::<Vec<_>>();
110+
assert_eq!(flattened_shares.len(), 6);
111+
for share in &flattened_shares {
112+
assert_eq!(share.len(), METADATA_LENGTH_BYTES + secret.len());
113+
println!("share: {}", hex::encode(share));
114+
}
115+
116+
let recovered_share_indexes = vec![0, 1, 3, 5];
117+
let recovered_shares = recovered_share_indexes.iter().map(|index| flattened_shares[*index].clone()).collect::<Vec<_>>();
118+
let recovered_secret = sskr_combine(&recovered_shares).unwrap();
119+
assert_eq!(recovered_secret, secret);
120+
}
73121
}

0 commit comments

Comments
 (0)