Skip to content

Commit 6a0f6c3

Browse files
committed
Add signature_chain and public_key to SignResponse
1 parent 2fd3445 commit 6a0f6c3

2 files changed

Lines changed: 24 additions & 5 deletions

File tree

guest-agent/rpc/proto/agent_rpc.proto

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,15 @@ message SignRequest {
234234
}
235235

236236
message SignResponse {
237+
// the signature of the data
237238
bytes signature = 1;
239+
// The signature chain consists of the following signatures:
240+
// [0] - the signature of the data
241+
// [1] - the k256 signature of the message signing pubkey signed by the app root key
242+
// [2] - the k256 signature of the app root pubkey signed by the KMS root key
243+
repeated bytes signature_chain = 2;
244+
// The public key signing the data
245+
bytes public_key = 3;
238246
}
239247

240248
message VerifyRequest {

guest-agent/src/rpc_service.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)