@@ -10,7 +10,7 @@ use std::{
1010
1111use catalyst_signed_doc:: { CatalystSignedDocument , Decode , Decoder , KidUri , Metadata } ;
1212use clap:: Parser ;
13- use coset:: { iana :: CoapContentFormat , CborSerializable } ;
13+ use coset:: { CborSerializable , Header } ;
1414use ed25519_dalek:: { ed25519:: signature:: Signer , pkcs8:: DecodePrivateKey } ;
1515
1616fn main ( ) {
@@ -55,16 +55,6 @@ enum Cli {
5555 } ,
5656}
5757
58- const CONTENT_ENCODING_KEY : & str = "Content-Encoding" ;
59- const UUID_CBOR_TAG : u64 = 37 ;
60-
61- fn encode_cbor_uuid ( uuid : & uuid:: Uuid ) -> coset:: cbor:: Value {
62- coset:: cbor:: Value :: Tag (
63- UUID_CBOR_TAG ,
64- coset:: cbor:: Value :: Bytes ( uuid. as_bytes ( ) . to_vec ( ) ) . into ( ) ,
65- )
66- }
67-
6858impl Cli {
6959 fn exec ( self ) -> anyhow:: Result < ( ) > {
7060 match self {
@@ -76,12 +66,12 @@ impl Cli {
7666 } => {
7767 let doc_schema = load_schema_from_file ( & schema) ?;
7868 let json_doc = load_json_from_file ( & doc) ?;
79- let json_meta = load_json_from_file ( & meta)
69+ let json_meta = & load_json_from_file ( & meta)
8070 . map_err ( |e| anyhow:: anyhow!( "Failed to load metadata from file: {e}" ) ) ?;
8171 println ! ( "{json_meta}" ) ;
8272 validate_json ( & json_doc, & doc_schema) ?;
8373 let compressed_doc = brotli_compress_json ( & json_doc) ?;
84- let empty_cose_sign = build_empty_cose_doc ( compressed_doc, & json_meta) ;
74+ let empty_cose_sign = build_empty_cose_doc ( compressed_doc, json_meta) ? ;
8575 store_cose_file ( empty_cose_sign, & output) ?;
8676 } ,
8777 Self :: Sign { sk, doc, kid } => {
@@ -159,39 +149,12 @@ fn brotli_compress_json(doc: &serde_json::Value) -> anyhow::Result<Vec<u8>> {
159149 Ok ( buf)
160150}
161151
162- fn build_empty_cose_doc ( doc_bytes : Vec < u8 > , meta : & Metadata ) -> coset:: CoseSign {
163- let mut builder =
164- coset:: HeaderBuilder :: new ( ) . content_format ( CoapContentFormat :: from ( meta. content_type ( ) ) ) ;
165-
166- if let Some ( content_encoding) = meta. content_encoding ( ) {
167- builder = builder. text_value (
168- CONTENT_ENCODING_KEY . to_string ( ) ,
169- format ! ( "{content_encoding}" ) . into ( ) ,
170- ) ;
171- }
172- let mut protected_header = builder. build ( ) ;
173-
174- protected_header. rest . push ( (
175- coset:: Label :: Text ( "type" . to_string ( ) ) ,
176- encode_cbor_uuid ( & meta. doc_type ( ) ) ,
177- ) ) ;
178- protected_header. rest . push ( (
179- coset:: Label :: Text ( "id" . to_string ( ) ) ,
180- encode_cbor_uuid ( & meta. doc_id ( ) ) ,
181- ) ) ;
182- protected_header. rest . push ( (
183- coset:: Label :: Text ( "ver" . to_string ( ) ) ,
184- encode_cbor_uuid ( & meta. doc_ver ( ) ) ,
185- ) ) ;
186- let meta_rest = meta. extra ( ) . header_rest ( ) . unwrap_or_default ( ) ;
187-
188- if !meta_rest. is_empty ( ) {
189- protected_header. rest . extend ( meta_rest) ;
190- }
191- coset:: CoseSignBuilder :: new ( )
152+ fn build_empty_cose_doc ( doc_bytes : Vec < u8 > , meta : & Metadata ) -> anyhow:: Result < coset:: CoseSign > {
153+ let protected_header = Header :: try_from ( meta) ?;
154+ Ok ( coset:: CoseSignBuilder :: new ( )
192155 . protected ( protected_header)
193156 . payload ( doc_bytes)
194- . build ( )
157+ . build ( ) )
195158}
196159
197160fn load_cose_from_file ( cose_path : & PathBuf ) -> anyhow:: Result < coset:: CoseSign > {
0 commit comments