Skip to content

Commit 9418406

Browse files
committed
more validation
Signed-off-by: lovesh <[email protected]>
1 parent 91e83a7 commit 9418406

File tree

3 files changed

+526
-75
lines changed

3 files changed

+526
-75
lines changed

delg_cred_cdd/src/attribute_token.rs

Lines changed: 227 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -164,21 +164,23 @@ impl PrecompForCommitmentReconstitution {
164164
}
165165
}
166166

167-
// TODO: Convert asserts in non-test code to errors
168-
169167
macro_rules! check_blindings_count {
170168
( $self:ident, $i: ident, $link:ident, $unrevealed_attr_count:ident ) => {{
171-
172169
if $self.blindings_t[$i - 1].len() != $link.signature.T.len() {
173-
Err(DelgError::GeneralError { msg: format!("t blindings count unequal to t count") })
170+
Err(DelgError::GeneralError {
171+
msg: format!("t blindings count unequal to t count"),
172+
})
174173
} else if $link.attribute_count() != $link.signature.T.len() {
175-
Err(DelgError::GeneralError { msg: format!("attribute count unequal to t count") })
174+
Err(DelgError::GeneralError {
175+
msg: format!("attribute count unequal to t count"),
176+
})
176177
} else if $self.blindings_a[$i - 1].len() != $unrevealed_attr_count {
177-
Err(DelgError::GeneralError { msg: format!("attribute blidnding count unequal to unrevealed attribute count") })
178+
Err(DelgError::GeneralError {
179+
msg: format!("attribute blidnding count unequal to unrevealed attribute count"),
180+
})
178181
} else {
179182
Ok(())
180183
}
181-
182184
}};
183185
}
184186

@@ -225,18 +227,7 @@ impl<'a> AttributeToken<'a> {
225227
even_level_vks: Vec<&EvenLevelVerkey>,
226228
odd_level_vks: Vec<&OddLevelVerkey>,
227229
) -> DelgResult<AttributeTokenResp> {
228-
if at.comms_t.len() != self.L {
229-
return Err(DelgError::IncorrectNumberOfTCommitments {
230-
expected: self.L,
231-
given: at.comms_t.len(),
232-
});
233-
}
234-
if (at.odd_level_revealed_attributes.len() + at.even_level_revealed_attributes.len()) != self.L {
235-
return Err(DelgError::IncorrectNumberOfRevealedAttributeSets {
236-
expected: self.L,
237-
given: at.odd_level_revealed_attributes.len() + at.even_level_revealed_attributes.len(),
238-
});
239-
}
230+
at.validate(self.L)?;
240231

241232
let mut resp_csk = FieldElement::zero();
242233
let mut odd_level_resp_vk = G1Vector::new(0);
@@ -397,19 +388,8 @@ impl<'a> AttributeToken<'a> {
397388
setup_params_1: &Groth1SetupParams,
398389
setup_params_2: &Groth2SetupParams,
399390
) -> DelgResult<AttributeTokenComm> {
400-
if comm.comms_t.len() != L {
401-
return Err(DelgError::IncorrectNumberOfTCommitments {
402-
expected: L,
403-
given: comm.comms_t.len(),
404-
});
405-
}
406-
407-
if comm.comms_s.len() != L {
408-
return Err(DelgError::IncorrectNumberOfSCommitments {
409-
expected: L,
410-
given: comm.comms_s.len(),
411-
});
412-
}
391+
comm.validate(L)?;
392+
resp.validate(L)?;
413393

414394
let mut comms_s = Vec::<GT>::with_capacity(L);
415395
let mut comms_t = Vec::<Vec<GT>>::with_capacity(L);
@@ -444,7 +424,7 @@ impl<'a> AttributeToken<'a> {
444424
let unrevealed_attr_count = attr_count - revealed[i - 1].len();
445425
if attr_count > setup_params_1.y.len() {
446426
return Err(DelgError::MoreAttributesThanExpected {
447-
expected: setup_params_1.y.len()+1,
427+
expected: setup_params_1.y.len() + 1,
448428
given: attr_count,
449429
});
450430
}
@@ -590,7 +570,7 @@ impl<'a> AttributeToken<'a> {
590570
let unrevealed_attr_count = attr_count - revealed[i - 1].len();
591571
if attr_count > setup_params_2.y.len() {
592572
return Err(DelgError::MoreAttributesThanExpected {
593-
expected: setup_params_2.y.len()+1,
573+
expected: setup_params_2.y.len() + 1,
594574
given: attr_count,
595575
});
596576
}
@@ -611,7 +591,6 @@ impl<'a> AttributeToken<'a> {
611591
let com_i_s = GT::mul(&e_1, &g1_y0_c);
612592
comms_s.push(com_i_s);
613593

614-
615594
let mut com_t = Vec::<GT>::with_capacity(comm.comms_t[i - 1].len());
616595
let mut k = 0;
617596

@@ -923,19 +902,8 @@ impl<'a> AttributeToken<'a> {
923902
setup_params_2: &Groth2SetupParams,
924903
precomputed: &PrecompForCommitmentReconstitution,
925904
) -> DelgResult<AttributeTokenComm> {
926-
if comm.comms_t.len() != L {
927-
return Err(DelgError::IncorrectNumberOfTCommitments {
928-
expected: L,
929-
given: comm.comms_t.len(),
930-
});
931-
}
932-
933-
if comm.comms_s.len() != L {
934-
return Err(DelgError::IncorrectNumberOfSCommitments {
935-
expected: L,
936-
given: comm.comms_s.len(),
937-
});
938-
}
905+
comm.validate(L)?;
906+
resp.validate(L)?;
939907

940908
let mut comms_s = Vec::<GT>::with_capacity(L);
941909
let mut comms_t = Vec::<Vec<GT>>::with_capacity(L);
@@ -966,7 +934,7 @@ impl<'a> AttributeToken<'a> {
966934
let unrevealed_attr_count = attr_count - revealed[i - 1].len();
967935
if attr_count > setup_params_1.y.len() {
968936
return Err(DelgError::MoreAttributesThanExpected {
969-
expected: setup_params_1.y.len()+1,
937+
expected: setup_params_1.y.len() + 1,
970938
given: attr_count,
971939
});
972940
}
@@ -1113,7 +1081,7 @@ impl<'a> AttributeToken<'a> {
11131081
let unrevealed_attr_count = attr_count - revealed[i - 1].len();
11141082
if attr_count > setup_params_2.y.len() {
11151083
return Err(DelgError::MoreAttributesThanExpected {
1116-
expected: setup_params_2.y.len()+1,
1084+
expected: setup_params_2.y.len() + 1,
11171085
given: attr_count,
11181086
});
11191087
}
@@ -1209,7 +1177,91 @@ impl<'a> AttributeToken<'a> {
12091177
}
12101178
}
12111179

1180+
macro_rules! check_odd_collection_length {
1181+
( $collection:expr, $L: ident, $entity_type:expr ) => {{
1182+
if $L % 2 == 1 {
1183+
if $collection.len() != (($L / 2) + 1) {
1184+
Err(DelgError::IncorrectNumberOfOddValues {
1185+
expected: ($L / 2) + 1,
1186+
given: $collection.len(),
1187+
entity_type: $entity_type,
1188+
})
1189+
} else {
1190+
Ok(())
1191+
}
1192+
} else {
1193+
if $collection.len() != ($L / 2) {
1194+
return Err(DelgError::IncorrectNumberOfOddValues {
1195+
expected: $L / 2,
1196+
given: $collection.len(),
1197+
entity_type: $entity_type,
1198+
});
1199+
} else {
1200+
Ok(())
1201+
}
1202+
}
1203+
}};
1204+
}
1205+
1206+
macro_rules! check_even_collection_length {
1207+
( $collection:expr, $L: ident, $entity_type:expr ) => {{
1208+
if $collection.len() != ($L / 2) {
1209+
Err(DelgError::IncorrectNumberOfEvenValues {
1210+
expected: $L / 2,
1211+
given: $collection.len(),
1212+
entity_type: $entity_type,
1213+
})
1214+
} else {
1215+
Ok(())
1216+
}
1217+
}};
1218+
}
1219+
12121220
impl AttributeTokenComm {
1221+
pub fn validate(&self, L: usize) -> DelgResult<()> {
1222+
if self.comms_t.len() != L {
1223+
return Err(DelgError::IncorrectNumberOfTCommitments {
1224+
expected: L,
1225+
given: self.comms_t.len(),
1226+
});
1227+
}
1228+
if self.comms_s.len() != L {
1229+
return Err(DelgError::IncorrectNumberOfSCommitments {
1230+
expected: L,
1231+
given: self.comms_s.len(),
1232+
});
1233+
}
1234+
if (self.odd_level_revealed_attributes.len() + self.even_level_revealed_attributes.len())
1235+
!= L
1236+
{
1237+
return Err(DelgError::IncorrectNumberOfRevealedAttributeSets {
1238+
expected: L,
1239+
given: self.odd_level_revealed_attributes.len()
1240+
+ self.even_level_revealed_attributes.len(),
1241+
});
1242+
}
1243+
if (self.odd_level_blinded_r.len() + self.even_level_blinded_r.len()) != L {
1244+
return Err(DelgError::IncorrectNumberOfBlindedR {
1245+
expected: L,
1246+
given: self.odd_level_blinded_r.len() + self.even_level_blinded_r.len(),
1247+
});
1248+
}
1249+
1250+
check_odd_collection_length!(
1251+
self.odd_level_revealed_attributes,
1252+
L,
1253+
"revealed attributes".to_string()
1254+
)?;
1255+
check_odd_collection_length!(self.odd_level_blinded_r, L, "blinded r".to_string())?;
1256+
check_even_collection_length!(
1257+
self.even_level_revealed_attributes,
1258+
L,
1259+
"revealed attributes".to_string()
1260+
)?;
1261+
check_even_collection_length!(self.even_level_blinded_r, L, "blinded r".to_string())?;
1262+
Ok(())
1263+
}
1264+
12131265
pub fn to_bytes(&self) -> Vec<u8> {
12141266
let mut bytes = Vec::<u8>::new();
12151267
for c in self.comms_s.iter() {
@@ -1242,6 +1294,27 @@ impl AttributeTokenComm {
12421294
}
12431295
}
12441296

1297+
impl AttributeTokenResp {
1298+
pub fn validate(&self, L: usize) -> DelgResult<()> {
1299+
if (self.odd_level_resp_s.len() + self.even_level_resp_s.len()) != L {
1300+
return Err(DelgError::UnequalNoOfCommitmentAndResponses {
1301+
count_commitments: L,
1302+
count_responses: self.odd_level_resp_s.len() + self.even_level_resp_s.len(),
1303+
entity_type: "s from signature".to_string(),
1304+
});
1305+
}
1306+
1307+
if (self.odd_level_resp_t.len() + self.even_level_resp_t.len()) != L {
1308+
return Err(DelgError::UnequalNoOfCommitmentAndResponses {
1309+
count_commitments: L,
1310+
count_responses: self.odd_level_resp_t.len() + self.even_level_resp_t.len(),
1311+
entity_type: "t from signature".to_string(),
1312+
});
1313+
}
1314+
Ok(())
1315+
}
1316+
}
1317+
12451318
// XXX: Temporary until binary_scalar_mul is added to G2
12461319
fn binary_scalar_mul_g2(g2: &G2, h2: &G2, r1: &FieldElement, r2: &FieldElement) -> G2 {
12471320
let mut g2_vec = G2Vector::with_capacity(2);
@@ -2213,4 +2286,108 @@ mod tests {
22132286
println!("Commitment reconstitution with precomputation on setup paprams and root issuer key takes {:?}", recon_precomp_duration);
22142287
}
22152288
}
2289+
2290+
#[test]
2291+
fn test_attribute_token_validations() {
2292+
let max_attributes = 3;
2293+
let label = "test".as_bytes();
2294+
2295+
println!(
2296+
"Each credential will have {} attributes",
2297+
max_attributes - 1
2298+
);
2299+
2300+
let params1 = GrothS1::setup(max_attributes, label);
2301+
let params2 = GrothS2::setup(max_attributes, label);
2302+
2303+
let l_0_issuer = EvenLevelIssuer::new(0).unwrap();
2304+
let l_1_issuer = OddLevelIssuer::new(1).unwrap();
2305+
let l_2_issuer = EvenLevelIssuer::new(2).unwrap();
2306+
let l_3_issuer = OddLevelIssuer::new(3).unwrap();
2307+
2308+
let (l_0_issuer_sk, l_0_issuer_vk) = EvenLevelIssuer::keygen(&params1);
2309+
let (l_1_issuer_sk, l_1_issuer_vk) = OddLevelIssuer::keygen(&params2);
2310+
let (l_2_issuer_sk, l_2_issuer_vk) = EvenLevelIssuer::keygen(&params1);
2311+
let (l_3_issuer_sk, l_3_issuer_vk) = OddLevelIssuer::keygen(&params2);
2312+
let (l_4_issuer_sk, l_4_issuer_vk) = EvenLevelIssuer::keygen(&params1);
2313+
2314+
let attributes_1: G1Vector = (0..max_attributes - 1)
2315+
.map(|_| G1::random())
2316+
.collect::<Vec<G1>>()
2317+
.into();
2318+
let cred_link_1 = l_0_issuer
2319+
.delegate(
2320+
attributes_1.clone(),
2321+
l_1_issuer_vk.clone(),
2322+
&l_0_issuer_sk,
2323+
&params1,
2324+
)
2325+
.unwrap();
2326+
2327+
assert!(cred_link_1
2328+
.verify(&l_1_issuer_vk, &l_0_issuer_vk, &params1)
2329+
.unwrap());
2330+
2331+
let mut chain_1 = CredChain::new();
2332+
chain_1.extend_with_odd(cred_link_1).unwrap();
2333+
2334+
let mut at_1 = AttributeToken::new(&chain_1, &params1, &params2);
2335+
2336+
// Supplying more or less collections of revealed attributes.
2337+
assert!(at_1.commitment(vec![]).is_err());
2338+
assert!(at_1.commitment(vec![HashSet::<usize>::new(); 2]).is_err());
2339+
2340+
// Supplying same number of collections of revealed attributes as the chain size
2341+
let com_1 = at_1.commitment(vec![HashSet::<usize>::new(); 1]).unwrap();
2342+
2343+
let c_1 = AttributeToken::gen_challenge(&com_1, &l_0_issuer_vk);
2344+
2345+
let mut morphed_commitment = com_1.clone();
2346+
// Adding an element of comms_s to increase its size
2347+
morphed_commitment.comms_s.push(morphed_commitment.comms_s[0].clone());
2348+
assert!(at_1
2349+
.response(&morphed_commitment, &l_1_issuer_sk.0, &c_1, vec![], vec![&l_1_issuer_vk]).is_err());
2350+
// Remove the added element
2351+
morphed_commitment.comms_s.pop().unwrap();
2352+
2353+
// Adding an element of comms_t to increase its size
2354+
morphed_commitment.comms_t.push(vec![]);
2355+
assert!(at_1
2356+
.response(&morphed_commitment, &l_1_issuer_sk.0, &c_1, vec![], vec![&l_1_issuer_vk]).is_err());
2357+
// Remove the added element
2358+
morphed_commitment.comms_t.pop().unwrap();
2359+
2360+
// Decrease size of comms_s
2361+
morphed_commitment.comms_s.pop().unwrap();
2362+
assert!(at_1
2363+
.response(&morphed_commitment, &l_1_issuer_sk.0, &c_1, vec![], vec![&l_1_issuer_vk]).is_err());
2364+
2365+
// Decrease size of comms_t
2366+
morphed_commitment.comms_t.pop().unwrap();
2367+
assert!(at_1
2368+
.response(&morphed_commitment, &l_1_issuer_sk.0, &c_1, vec![], vec![&l_1_issuer_vk]).is_err());
2369+
2370+
let resp_1 = at_1
2371+
.response(&com_1, &l_1_issuer_sk.0, &c_1, vec![], vec![&l_1_issuer_vk])
2372+
.unwrap();
2373+
2374+
let attributes_2: G2Vector = (0..max_attributes - 1)
2375+
.map(|_| G2::random())
2376+
.collect::<Vec<G2>>()
2377+
.into();
2378+
let cred_link_2 = l_1_issuer
2379+
.delegate(
2380+
attributes_2.clone(),
2381+
l_2_issuer_vk.clone(),
2382+
&l_1_issuer_sk,
2383+
&params2,
2384+
)
2385+
.unwrap();
2386+
assert!(cred_link_2
2387+
.verify(&l_2_issuer_vk, &l_1_issuer_vk, &params2)
2388+
.unwrap());
2389+
2390+
let mut chain_2 = chain_1.clone();
2391+
chain_2.extend_with_even(cred_link_2).unwrap();
2392+
}
22162393
}

0 commit comments

Comments
 (0)