@@ -279,18 +279,20 @@ impl DstackGuestRpc for InternalRpcHandler {
279279 algorithm : request. algorithm . clone ( ) ,
280280 } )
281281 . await ?;
282- let signature = match request. algorithm . as_str ( ) {
282+ let ( signature, public_key ) = match request. algorithm . as_str ( ) {
283283 "ed25519" => {
284284 let key_bytes: [ u8 ; 32 ] = key_response. key . try_into ( ) . expect ( "Key is incorrect" ) ;
285285 let signing_key = Ed25519SigningKey :: from_bytes ( & key_bytes) ;
286286 let signature = signing_key. sign ( & request. data ) ;
287- signature. to_bytes ( ) . to_vec ( )
287+ let public_key = signing_key. verifying_key ( ) . to_bytes ( ) . to_vec ( ) ;
288+ ( signature. to_bytes ( ) . to_vec ( ) , public_key)
288289 }
289290 "secp256k1" => {
290291 let signing_key = SigningKey :: from_slice ( & key_response. key )
291292 . context ( "Failed to parse secp256k1 key" ) ?;
292293 let signature: k256:: ecdsa:: Signature = signing_key. sign ( & request. data ) ;
293- signature. to_bytes ( ) . to_vec ( )
294+ let public_key = signing_key. verifying_key ( ) . to_sec1_bytes ( ) . to_vec ( ) ;
295+ ( signature. to_bytes ( ) . to_vec ( ) , public_key)
294296 }
295297 "secp256k1_prehashed" => {
296298 if request. data . len ( ) != 32 {
@@ -302,11 +304,20 @@ impl DstackGuestRpc for InternalRpcHandler {
302304 let signing_key = SigningKey :: from_slice ( & key_response. key )
303305 . context ( "Failed to parse secp256k1 key" ) ?;
304306 let signature: k256:: ecdsa:: Signature = signing_key. sign_prehash ( & request. data ) ?;
305- signature. to_bytes ( ) . to_vec ( )
307+ let public_key = signing_key. verifying_key ( ) . to_sec1_bytes ( ) . to_vec ( ) ;
308+ ( signature. to_bytes ( ) . to_vec ( ) , public_key)
306309 }
307310 _ => return Err ( anyhow:: anyhow!( "Unsupported algorithm" ) ) ,
308311 } ;
309- Ok ( SignResponse { signature } )
312+ Ok ( SignResponse {
313+ signature : signature. clone ( ) ,
314+ signature_chain : vec ! [
315+ signature,
316+ key_response. signature_chain[ 0 ] . clone( ) ,
317+ key_response. signature_chain[ 1 ] . clone( ) ,
318+ ] ,
319+ public_key,
320+ } )
310321 }
311322
312323 async fn verify ( self , request : VerifyRequest ) -> Result < VerifyResponse > {
0 commit comments