Skip to content

Commit e26b74d

Browse files
authored
Merge pull request #119 from Dstack-TEE/sign-pubkey
kms: Sign env encrypt pubkey
2 parents 32c3d5d + 6112c74 commit e26b74d

File tree

5 files changed

+42
-13
lines changed

5 files changed

+42
-13
lines changed

kms/rpc/proto/kms_rpc.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ message AppId {
1515

1616
message PublicKeyResponse {
1717
bytes public_key = 1;
18+
bytes signature = 2;
1819
}
1920

2021
message AppKeyResponse {

kms/src/crypto.rs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use anyhow::{Context, Result};
2-
use k256::ecdsa::{RecoveryId, Signature, SigningKey};
2+
use k256::ecdsa::SigningKey;
33
use sha3::{Digest, Keccak256};
44

55
use ra_tls::kdf;
66

77
pub(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
}

kms/src/main_service.rs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ use ra_tls::{
1717
use scale::Decode;
1818
use upgrade_authority::BootInfo;
1919

20-
use crate::{config::KmsConfig, crypto::derive_k256_key};
20+
use crate::{
21+
config::KmsConfig,
22+
crypto::{derive_k256_key, sign_message},
23+
};
2124

2225
mod upgrade_authority;
2326

@@ -184,11 +187,8 @@ impl KmsRpc for RpcHandler {
184187
};
185188

186189
let (k256_key, k256_signature) = {
187-
let (k256_app_key, signature, recid) = derive_k256_key(&self.state.k256_key, &app_id)
190+
let (k256_app_key, signature) = derive_k256_key(&self.state.k256_key, &app_id)
188191
.context("Failed to derive app ecdsa key")?;
189-
190-
let mut signature = signature.to_vec();
191-
signature.push(recid.to_byte());
192192
(k256_app_key.to_bytes().to_vec(), signature)
193193
};
194194

@@ -210,8 +210,19 @@ impl KmsRpc for RpcHandler {
210210
.context("Failed to derive env encrypt key")?;
211211
let secret = x25519_dalek::StaticSecret::from(secret);
212212
let pubkey = x25519_dalek::PublicKey::from(&secret);
213+
214+
let public_key = pubkey.to_bytes().to_vec();
215+
let signature = sign_message(
216+
&self.state.k256_key,
217+
b"dstack-env-encrypt-pubkey",
218+
&request.app_id,
219+
&public_key,
220+
)
221+
.context("Failed to sign the public key")?;
222+
213223
Ok(PublicKeyResponse {
214-
public_key: pubkey.to_bytes().to_vec(),
224+
public_key,
225+
signature,
215226
})
216227
}
217228

teepod/rpc/proto/teepod_rpc.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ message AppId {
114114

115115
message PublicKeyResponse {
116116
bytes public_key = 1;
117+
bytes signature = 2;
117118
}
118119

119120
message GetInfoResponse {

teepod/src/main_service.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ impl TeepodRpc for RpcHandler {
217217
.await?;
218218
Ok(PublicKeyResponse {
219219
public_key: response.public_key,
220+
signature: response.signature,
220221
})
221222
}
222223

0 commit comments

Comments
 (0)