@@ -164,21 +164,23 @@ impl PrecompForCommitmentReconstitution {
164
164
}
165
165
}
166
166
167
- // TODO: Convert asserts in non-test code to errors
168
-
169
167
macro_rules! check_blindings_count {
170
168
( $self: ident, $i: ident, $link: ident, $unrevealed_attr_count: ident ) => { {
171
-
172
169
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
+ } )
174
173
} 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
+ } )
176
177
} 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
+ } )
178
181
} else {
179
182
Ok ( ( ) )
180
183
}
181
-
182
184
} } ;
183
185
}
184
186
@@ -225,18 +227,7 @@ impl<'a> AttributeToken<'a> {
225
227
even_level_vks : Vec < & EvenLevelVerkey > ,
226
228
odd_level_vks : Vec < & OddLevelVerkey > ,
227
229
) -> 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 ) ?;
240
231
241
232
let mut resp_csk = FieldElement :: zero ( ) ;
242
233
let mut odd_level_resp_vk = G1Vector :: new ( 0 ) ;
@@ -397,19 +388,8 @@ impl<'a> AttributeToken<'a> {
397
388
setup_params_1 : & Groth1SetupParams ,
398
389
setup_params_2 : & Groth2SetupParams ,
399
390
) -> 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 ) ?;
413
393
414
394
let mut comms_s = Vec :: < GT > :: with_capacity ( L ) ;
415
395
let mut comms_t = Vec :: < Vec < GT > > :: with_capacity ( L ) ;
@@ -444,7 +424,7 @@ impl<'a> AttributeToken<'a> {
444
424
let unrevealed_attr_count = attr_count - revealed[ i - 1 ] . len ( ) ;
445
425
if attr_count > setup_params_1. y . len ( ) {
446
426
return Err ( DelgError :: MoreAttributesThanExpected {
447
- expected : setup_params_1. y . len ( ) + 1 ,
427
+ expected : setup_params_1. y . len ( ) + 1 ,
448
428
given : attr_count,
449
429
} ) ;
450
430
}
@@ -590,7 +570,7 @@ impl<'a> AttributeToken<'a> {
590
570
let unrevealed_attr_count = attr_count - revealed[ i - 1 ] . len ( ) ;
591
571
if attr_count > setup_params_2. y . len ( ) {
592
572
return Err ( DelgError :: MoreAttributesThanExpected {
593
- expected : setup_params_2. y . len ( ) + 1 ,
573
+ expected : setup_params_2. y . len ( ) + 1 ,
594
574
given : attr_count,
595
575
} ) ;
596
576
}
@@ -611,7 +591,6 @@ impl<'a> AttributeToken<'a> {
611
591
let com_i_s = GT :: mul ( & e_1, & g1_y0_c) ;
612
592
comms_s. push ( com_i_s) ;
613
593
614
-
615
594
let mut com_t = Vec :: < GT > :: with_capacity ( comm. comms_t [ i - 1 ] . len ( ) ) ;
616
595
let mut k = 0 ;
617
596
@@ -923,19 +902,8 @@ impl<'a> AttributeToken<'a> {
923
902
setup_params_2 : & Groth2SetupParams ,
924
903
precomputed : & PrecompForCommitmentReconstitution ,
925
904
) -> 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 ) ?;
939
907
940
908
let mut comms_s = Vec :: < GT > :: with_capacity ( L ) ;
941
909
let mut comms_t = Vec :: < Vec < GT > > :: with_capacity ( L ) ;
@@ -966,7 +934,7 @@ impl<'a> AttributeToken<'a> {
966
934
let unrevealed_attr_count = attr_count - revealed[ i - 1 ] . len ( ) ;
967
935
if attr_count > setup_params_1. y . len ( ) {
968
936
return Err ( DelgError :: MoreAttributesThanExpected {
969
- expected : setup_params_1. y . len ( ) + 1 ,
937
+ expected : setup_params_1. y . len ( ) + 1 ,
970
938
given : attr_count,
971
939
} ) ;
972
940
}
@@ -1113,7 +1081,7 @@ impl<'a> AttributeToken<'a> {
1113
1081
let unrevealed_attr_count = attr_count - revealed[ i - 1 ] . len ( ) ;
1114
1082
if attr_count > setup_params_2. y . len ( ) {
1115
1083
return Err ( DelgError :: MoreAttributesThanExpected {
1116
- expected : setup_params_2. y . len ( ) + 1 ,
1084
+ expected : setup_params_2. y . len ( ) + 1 ,
1117
1085
given : attr_count,
1118
1086
} ) ;
1119
1087
}
@@ -1209,7 +1177,91 @@ impl<'a> AttributeToken<'a> {
1209
1177
}
1210
1178
}
1211
1179
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
+
1212
1220
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
+
1213
1265
pub fn to_bytes ( & self ) -> Vec < u8 > {
1214
1266
let mut bytes = Vec :: < u8 > :: new ( ) ;
1215
1267
for c in self . comms_s . iter ( ) {
@@ -1242,6 +1294,27 @@ impl AttributeTokenComm {
1242
1294
}
1243
1295
}
1244
1296
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
+
1245
1318
// XXX: Temporary until binary_scalar_mul is added to G2
1246
1319
fn binary_scalar_mul_g2 ( g2 : & G2 , h2 : & G2 , r1 : & FieldElement , r2 : & FieldElement ) -> G2 {
1247
1320
let mut g2_vec = G2Vector :: with_capacity ( 2 ) ;
@@ -2213,4 +2286,108 @@ mod tests {
2213
2286
println ! ( "Commitment reconstitution with precomputation on setup paprams and root issuer key takes {:?}" , recon_precomp_duration) ;
2214
2287
}
2215
2288
}
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
+ }
2216
2393
}
0 commit comments