3
3
#![ allow( missing_docs, clippy:: missing_docs_in_private_items) ]
4
4
5
5
use std:: {
6
- fs:: { read_to_string , File } ,
6
+ fs:: File ,
7
7
io:: { Read , Write } ,
8
8
path:: PathBuf ,
9
9
} ;
10
10
11
11
use anyhow:: Context ;
12
12
use catalyst_signed_doc:: { Builder , CatalystSignedDocument , IdUri } ;
13
13
use clap:: Parser ;
14
- use ed25519_dalek:: pkcs8:: DecodePrivateKey ;
15
14
16
15
fn main ( ) {
17
16
if let Err ( err) = Cli :: parse ( ) . exec ( ) {
@@ -37,8 +36,8 @@ enum Cli {
37
36
/// Path to the formed (could be empty, without any signatures) COSE document
38
37
/// This exact file would be modified and new signature would be added
39
38
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 ,
42
41
/// Signer kid
43
42
kid : IdUri ,
44
43
} ,
@@ -77,13 +76,14 @@ impl Cli {
77
76
) ;
78
77
save_signed_doc ( signed_doc, & output) ?;
79
78
} ,
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 ) ?;
82
81
let cose_bytes = read_bytes_from_file ( & doc) ?;
83
82
let signed_doc = signed_doc_from_bytes ( cose_bytes. as_slice ( ) ) ?;
83
+
84
84
let new_signed_doc = signed_doc
85
85
. into_builder ( )
86
- . add_signature ( sk. to_bytes ( ) , kid) ?
86
+ . add_signature ( |message| sk. sign :: < ( ) > ( & message ) . to_bytes ( ) . to_vec ( ) , kid) ?
87
87
. build ( ) ;
88
88
save_signed_doc ( new_signed_doc, & doc) ?;
89
89
} ,
@@ -144,8 +144,8 @@ fn write_bytes_to_file(bytes: &[u8], output: &PathBuf) -> anyhow::Result<()> {
144
144
. context ( format ! ( "Failed to write to file {output:?}" ) )
145
145
}
146
146
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 ) ?;
150
150
Ok ( sk)
151
151
}
0 commit comments