33#![ allow( missing_docs, clippy:: missing_docs_in_private_items) ]
44
55use std:: {
6- fs:: { read_to_string , File } ,
6+ fs:: File ,
77 io:: { Read , Write } ,
88 path:: PathBuf ,
99} ;
1010
1111use anyhow:: Context ;
1212use catalyst_signed_doc:: { Builder , CatalystSignedDocument , IdUri } ;
1313use clap:: Parser ;
14- use ed25519_dalek:: pkcs8:: DecodePrivateKey ;
1514
1615fn main ( ) {
1716 if let Err ( err) = Cli :: parse ( ) . exec ( ) {
@@ -37,8 +36,8 @@ enum Cli {
3736 /// Path to the formed (could be empty, without any signatures) COSE document
3837 /// This exact file would be modified and new signature would be added
3938 doc : PathBuf ,
40- /// Path to the secret key in PEM format
41- sk : PathBuf ,
39+ /// Bip32 extended secret key hex bytes (includes `chain_code`)
40+ sk_hex : String ,
4241 /// Signer kid
4342 kid : IdUri ,
4443 } ,
@@ -77,13 +76,14 @@ impl Cli {
7776 ) ;
7877 save_signed_doc ( signed_doc, & output) ?;
7978 } ,
80- Self :: Sign { sk , doc , kid } => {
81- let sk = load_secret_key_from_file ( & sk ) . context ( "Failed to load SK FILE" ) ?;
79+ Self :: Sign { doc , sk_hex , kid } => {
80+ let sk = load_secret_key ( & sk_hex ) ?;
8281 let cose_bytes = read_bytes_from_file ( & doc) ?;
8382 let signed_doc = signed_doc_from_bytes ( cose_bytes. as_slice ( ) ) ?;
83+
8484 let new_signed_doc = signed_doc
8585 . into_builder ( )
86- . add_signature ( sk. to_bytes ( ) , kid) ?
86+ . add_signature ( |message| sk. sign :: < ( ) > ( & message ) . to_bytes ( ) . to_vec ( ) , kid) ?
8787 . build ( ) ;
8888 save_signed_doc ( new_signed_doc, & doc) ?;
8989 } ,
@@ -144,8 +144,8 @@ fn write_bytes_to_file(bytes: &[u8], output: &PathBuf) -> anyhow::Result<()> {
144144 . context ( format ! ( "Failed to write to file {output:?}" ) )
145145}
146146
147- fn load_secret_key_from_file ( sk_path : & PathBuf ) -> anyhow:: Result < ed25519_dalek :: SigningKey > {
148- let sk_str = read_to_string ( sk_path ) ?;
149- let sk = ed25519_dalek :: SigningKey :: from_pkcs8_pem ( & sk_str ) ?;
147+ fn load_secret_key ( sk_hex : & str ) -> anyhow:: Result < ed25519_bip32 :: XPrv > {
148+ let sk_bytes = hex :: decode ( sk_hex ) ?;
149+ let sk = ed25519_bip32 :: XPrv :: from_slice_verified ( & sk_bytes ) ?;
150150 Ok ( sk)
151151}
0 commit comments