11use anyhow:: { Context , Result } ;
2- use k256:: ecdsa:: { RecoveryId , Signature , SigningKey } ;
2+ use k256:: ecdsa:: SigningKey ;
33use sha3:: { Digest , Keccak256 } ;
44
55use ra_tls:: kdf;
66
77pub ( crate ) fn derive_k256_key (
88 parent_key : & SigningKey ,
99 app_id : & [ u8 ] ,
10- ) -> Result < ( SigningKey , Signature , RecoveryId ) > {
10+ ) -> Result < ( SigningKey , Vec < u8 > ) > {
1111 let context_data = [ app_id, b"app-key" ] ;
1212 let derived_key_bytes: [ u8 ; 32 ] =
1313 kdf:: derive_ecdsa_key ( & parent_key. to_bytes ( ) , & context_data, 32 ) ?
@@ -16,10 +16,25 @@ pub(crate) fn derive_k256_key(
1616 . context ( "Invalid derived key len" ) ?;
1717 let derived_signing_key = SigningKey :: from_bytes ( & derived_key_bytes. into ( ) ) ?;
1818 let pubkey = derived_signing_key. verifying_key ( ) ;
19- let digest = Keccak256 :: new_with_prefix (
20- [ b"dstack-kms-issued:" , app_id, & pubkey. to_sec1_bytes ( ) ] . concat ( ) ,
21- ) ;
22- let ( signature, recid) = parent_key. sign_digest_recoverable ( digest) ?;
2319
24- Ok ( ( derived_signing_key, signature, recid) )
20+ let signature = sign_message (
21+ parent_key,
22+ b"dstack-kms-issued" ,
23+ app_id,
24+ & pubkey. to_sec1_bytes ( ) ,
25+ ) ?;
26+ Ok ( ( derived_signing_key, signature) )
27+ }
28+
29+ pub ( crate ) fn sign_message (
30+ key : & SigningKey ,
31+ prefix : & [ u8 ] ,
32+ appid : & [ u8 ] ,
33+ message : & [ u8 ] ,
34+ ) -> Result < Vec < u8 > > {
35+ let digest = Keccak256 :: new_with_prefix ( [ prefix, b":" , appid, message] . concat ( ) ) ;
36+ let ( signature, recid) = key. sign_digest_recoverable ( digest) ?;
37+ let mut signature_bytes = signature. to_vec ( ) ;
38+ signature_bytes. push ( recid. to_byte ( ) ) ;
39+ Ok ( signature_bytes)
2540}
0 commit comments