@@ -13,6 +13,35 @@ pub struct Signature {
1313 signature : CoseSignature ,
1414}
1515
16+ impl Signature {
17+ /// Convert COSE Signature to `Signature`.
18+ pub ( crate ) fn from_cose_sig ( signature : CoseSignature , report : & ProblemReport ) -> Option < Self > {
19+ match IdUri :: try_from ( signature. protected . header . key_id . as_ref ( ) ) {
20+ Ok ( kid) if kid. is_uri ( ) => Some ( Self { kid, signature } ) ,
21+ Ok ( kid) => {
22+ report. invalid_value (
23+ "COSE signature protected header key ID" ,
24+ & kid. to_string ( ) ,
25+ & format ! (
26+ "COSE signature protected header key ID must be a Catalyst Id URI, missing URI schema {}" , IdUri :: SCHEME
27+ ) ,
28+ "Converting COSE signature header key ID to IdUri" ,
29+ ) ;
30+ None
31+ } ,
32+ Err ( e) => {
33+ report. conversion_error (
34+ "COSE signature protected header key ID" ,
35+ & format ! ( "{:?}" , & signature. protected. header. key_id) ,
36+ & format ! ( "{e:?}" ) ,
37+ "Converting COSE signature header key ID to IdUri" ,
38+ ) ;
39+ None
40+ } ,
41+ }
42+ }
43+ }
44+
1645/// List of Signatures.
1746#[ derive( Debug , Clone , Default ) ]
1847pub struct Signatures ( Vec < Signature > ) ;
@@ -42,9 +71,9 @@ impl Signatures {
4271 self . 0 . iter ( ) . map ( |sig| sig. signature . clone ( ) )
4372 }
4473
45- /// Add a new signature
46- pub ( crate ) fn push ( & mut self , kid : IdUri , signature : CoseSignature ) {
47- self . 0 . push ( Signature { kid , signature } ) ;
74+ /// Add a `Signature` object into the list
75+ pub ( crate ) fn push ( & mut self , sign : Signature ) {
76+ self . 0 . push ( sign ) ;
4877 }
4978
5079 /// Number of signatures.
@@ -60,27 +89,19 @@ impl Signatures {
6089 }
6190
6291 /// Convert list of COSE Signature to `Signatures`.
63- pub ( crate ) fn from_cose_sig ( cose_sigs : & [ CoseSignature ] , error_report : & ProblemReport ) -> Self {
64- let mut signatures = Vec :: new ( ) ;
65-
66- cose_sigs
92+ pub ( crate ) fn from_cose_sig_list ( cose_sigs : & [ CoseSignature ] , report : & ProblemReport ) -> Self {
93+ let res = cose_sigs
6794 . iter ( )
6895 . cloned ( )
6996 . enumerate ( )
70- . for_each ( |( idx, signature) | {
71- match IdUri :: try_from ( signature. protected . header . key_id . as_ref ( ) ) {
72- Ok ( kid) => signatures. push ( Signature { kid, signature } ) ,
73- Err ( e) => {
74- error_report. conversion_error (
75- & format ! ( "COSE signature protected header key ID at id {idx}" ) ,
76- & format ! ( "{:?}" , & signature. protected. header. key_id) ,
77- & format ! ( "{e:?}" ) ,
78- "Converting COSE signature header key ID to IdUri" ,
79- ) ;
80- } ,
97+ . filter_map ( |( idx, signature) | {
98+ let sign = Signature :: from_cose_sig ( signature, report) ;
99+ if sign. is_none ( ) {
100+ report. other ( & format ! ( "COSE signature protected header key ID at id {idx}" ) , "Converting COSE signatures list to Catalyst Signed Documents signatures list" , ) ;
81101 }
82- } ) ;
102+ sign
103+ } ) . collect ( ) ;
83104
84- Self ( signatures )
105+ Self ( res )
85106 }
86107}
0 commit comments