@@ -6,15 +6,17 @@ use std::{
66} ;
77
88use anyhow:: anyhow;
9- use coset:: CborSerializable ;
9+ use coset:: { CborSerializable , CoseSignature } ;
1010
11+ mod error;
1112mod metadata;
1213mod payload;
1314mod signature;
1415
1516pub use metadata:: { DocumentRef , Metadata , UuidV7 } ;
1617use payload:: JsonContent ;
1718pub use signature:: KidUri ;
19+ use signature:: Signatures ;
1820
1921/// Inner type that holds the Catalyst Signed Document with parsing errors.
2022#[ derive( Default ) ]
@@ -23,6 +25,8 @@ struct InnerCatalystSignedDocument {
2325 metadata : Metadata ,
2426 /// Document Payload viewed as JSON Content
2527 payload : JsonContent ,
28+ /// Signatures
29+ signatures : Signatures ,
2630 /// Raw COSE Sign data
2731 cose_sign : coset:: CoseSign ,
2832}
@@ -54,7 +58,7 @@ impl Display for CatalystSignedDocument {
5458}
5559
5660impl TryFrom < & [ u8 ] > for CatalystSignedDocument {
57- type Error = Vec < anyhow :: Error > ;
61+ type Error = error :: Error ;
5862
5963 fn try_from ( cose_bytes : & [ u8 ] ) -> Result < Self , Self :: Error > {
6064 // Try reading as a tagged COSE SIGN, otherwise try reading as untagged.
@@ -67,7 +71,7 @@ impl TryFrom<&[u8]> for CatalystSignedDocument {
6771 let mut payload = JsonContent :: default ( ) ;
6872
6973 if let Some ( bytes) = & cose_sign. payload {
70- match JsonContent :: try_from ( ( bytes, metadata. content_encoding ( ) ) ) {
74+ match JsonContent :: try_from ( ( bytes. as_ref ( ) , metadata. content_encoding ( ) ) ) {
7175 Ok ( c) => payload = c,
7276 Err ( e) => {
7377 content_errors. push ( anyhow ! ( "Invalid Payload: {e}" ) ) ;
@@ -77,11 +81,27 @@ impl TryFrom<&[u8]> for CatalystSignedDocument {
7781 content_errors. push ( anyhow ! ( "COSE payload is empty" ) ) ;
7882 } ;
7983
84+ let mut signatures = Signatures :: default ( ) ;
85+ match Signatures :: try_from ( & cose_sign. signatures ) {
86+ Ok ( s) => signatures = s,
87+ Err ( errors) => {
88+ for e in errors {
89+ content_errors. push ( anyhow ! ( "{e}" ) ) ;
90+ }
91+ } ,
92+ }
93+
8094 let inner = InnerCatalystSignedDocument {
8195 metadata,
8296 payload,
97+ signatures,
8398 cose_sign,
8499 } ;
100+
101+ if !content_errors. is_empty ( ) {
102+ return Err ( error:: Error ( content_errors) ) ;
103+ }
104+
85105 Ok ( CatalystSignedDocument {
86106 inner : Arc :: new ( inner) ,
87107 } )
@@ -132,4 +152,22 @@ impl CatalystSignedDocument {
132152 pub fn doc_section ( & self ) -> Option < String > {
133153 self . inner . metadata . doc_section ( )
134154 }
155+
156+ /// Return Raw COSE SIGN bytes.
157+ #[ must_use]
158+ pub fn cose_sign_bytes ( & self ) -> Vec < u8 > {
159+ self . inner . cose_sign . clone ( ) . to_vec ( ) . unwrap_or_default ( )
160+ }
161+
162+ /// Return a list of signature KIDs.
163+ #[ must_use]
164+ pub fn signature_kids ( & self ) -> Vec < KidUri > {
165+ self . inner . signatures . kids ( )
166+ }
167+
168+ /// Return a list of signatures.
169+ #[ must_use]
170+ pub fn signatures ( & self ) -> Vec < CoseSignature > {
171+ self . inner . signatures . signatures ( )
172+ }
135173}
0 commit comments