11//! Catalyst Signed Document COSE signature `kid` (Catalyst Id) role validation
22
3+ use catalyst_signed_doc_spec:: signers:: roles:: { Role , Roles } ;
34use catalyst_types:: catalyst_id:: role_index:: RoleId ;
45
56use crate :: CatalystSignedDocument ;
@@ -8,10 +9,26 @@ use crate::CatalystSignedDocument;
89#[ derive( Debug ) ]
910pub ( crate ) struct SignatureKidRule {
1011 /// expected `RoleId` values for the `kid` field
11- pub ( crate ) exp : & ' static [ RoleId ] ,
12+ pub ( crate ) allowed_roles : Vec < RoleId > ,
1213}
1314
1415impl SignatureKidRule {
16+ /// Generating `SignatureKidRule` from specs
17+ pub ( crate ) fn new ( spec : & Roles ) -> Self {
18+ let allowed_roles = spec
19+ . user
20+ . iter ( )
21+ . map ( |v| {
22+ match v {
23+ Role :: Registered => RoleId :: Role0 ,
24+ Role :: Proposer => RoleId :: Proposer ,
25+ Role :: Representative => RoleId :: DelegatedRepresentative ,
26+ }
27+ } )
28+ . collect ( ) ;
29+ Self { allowed_roles }
30+ }
31+
1532 /// Field validation rule
1633 #[ allow( clippy:: unused_async) ]
1734 pub ( crate ) async fn check (
@@ -20,12 +37,12 @@ impl SignatureKidRule {
2037 ) -> anyhow:: Result < bool > {
2138 let contains_exp_role = doc. kids ( ) . iter ( ) . enumerate ( ) . all ( |( i, kid) | {
2239 let ( role_index, _) = kid. role_and_rotation ( ) ;
23- let res = self . exp . contains ( & role_index) ;
40+ let res = self . allowed_roles . contains ( & role_index) ;
2441 if !res {
2542 doc. report ( ) . invalid_value (
2643 "kid" ,
2744 role_index. to_string ( ) . as_str ( ) ,
28- format ! ( "{:?}" , self . exp ) . as_str ( ) ,
45+ format ! ( "{:?}" , self . allowed_roles ) . as_str ( ) ,
2946 format ! (
3047 "Invalid Catalyst Signed Document signature at position [{i}] `kid` Catalyst Role value"
3148 )
@@ -56,7 +73,7 @@ mod tests {
5673 #[ tokio:: test]
5774 async fn signature_kid_rule_test ( ) {
5875 let mut rule = SignatureKidRule {
59- exp : & [ RoleId :: Role0 , RoleId :: DelegatedRepresentative ] ,
76+ allowed_roles : vec ! [ RoleId :: Role0 , RoleId :: DelegatedRepresentative ] ,
6077 } ;
6178
6279 let sk = ed25519_dalek:: SigningKey :: generate ( & mut rand:: rngs:: OsRng ) ;
@@ -75,7 +92,7 @@ mod tests {
7592
7693 assert ! ( rule. check( & doc) . await . unwrap( ) ) ;
7794
78- rule. exp = & [ RoleId :: Proposer ] ;
95+ rule. allowed_roles = vec ! [ RoleId :: Proposer ] ;
7996 assert ! ( !rule. check( & doc) . await . unwrap( ) ) ;
8097 }
8198}
0 commit comments