Skip to content

Commit 90642ae

Browse files
committed
feat: add hex dependency and implement request_sign_digest function for message signing
1 parent 33231e1 commit 90642ae

File tree

3 files changed

+55
-10
lines changed

3 files changed

+55
-10
lines changed

Cargo.lock

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ thiserror = "2.0.11"
1414
tracing = "0.1"
1515
tokio = { version = "1.0", features = ["full"] }
1616
pem = "3.0.4"
17+
hex = "0.4.3"
1718

1819
[dev-dependencies]
1920
tokio = { version = "1.0", features = ["full"] }

src/signer.rs

+47-10
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,22 @@ use std::{cell::OnceCell, sync::Arc};
44

55
use gcloud_sdk::{
66
google::cloud::kms::{
7-
// self,
7+
self,
88
v1::{
9-
key_management_service_client::KeyManagementServiceClient,
10-
// AsymmetricSignRequest,
11-
GetPublicKeyRequest,
12-
PublicKey,
9+
key_management_service_client::KeyManagementServiceClient, AsymmetricSignRequest,
10+
GetPublicKeyRequest, PublicKey,
1311
},
1412
},
1513
tonic::{
1614
self,
15+
Request,
1716
// Request
1817
},
1918
GoogleApi, GoogleAuthMiddleware,
2019
};
2120
use solana_sdk::{
2221
pubkey::{self, Pubkey},
22+
signature::Signature,
2323
signer::{Signer, SignerError},
2424
};
2525
use thiserror::Error;
@@ -119,15 +119,19 @@ impl Signer for GcpSigner {
119119
.ok_or(SignerError::Custom("Cannot get pubkey".to_string()))?)
120120
}
121121

122-
fn try_sign_message(
122+
#[tokio::main]
123+
async fn try_sign_message(
123124
&self,
124-
_message: &[u8],
125+
message: &[u8],
125126
) -> Result<solana_sdk::signature::Signature, SignerError> {
126-
todo!()
127+
request_sign_digest(&self.client, &self.key_name, message)
128+
.await
129+
.and_then(decode_signature)
130+
.map_err(Into::into)
127131
}
128132

129133
fn is_interactive(&self) -> bool {
130-
todo!()
134+
false
131135
}
132136
}
133137

@@ -170,6 +174,30 @@ async fn request_get_pubkey(
170174
.map_err(Into::into)
171175
}
172176

177+
#[instrument(skip(client, digest), fields(digest = %hex::encode(digest)), err)]
178+
async fn request_sign_digest(
179+
client: &Client,
180+
kms_key_name: &str,
181+
digest: &[u8],
182+
) -> Result<Vec<u8>, GcpSignerError> {
183+
let mut request = Request::new(AsymmetricSignRequest {
184+
name: kms_key_name.to_string(),
185+
digest: Some(kms::v1::Digest {
186+
digest: Some(kms::v1::digest::Digest::Sha256(digest.to_vec())),
187+
}),
188+
..Default::default()
189+
});
190+
191+
request.metadata_mut().insert(
192+
"x-goog-request-params",
193+
format!("name={}", kms_key_name).parse().unwrap(),
194+
);
195+
196+
let response = client.get().asymmetric_sign(request).await?;
197+
let signature = response.into_inner().signature;
198+
Ok(signature)
199+
}
200+
173201
#[instrument(err)]
174202
fn from_public_key_pem(key: PublicKey) -> Result<Pubkey, GcpSignerError> {
175203
let pkey = pem::parse(key.pem)?;
@@ -191,6 +219,12 @@ fn from_public_key_pem(key: PublicKey) -> Result<Pubkey, GcpSignerError> {
191219
}
192220
}
193221

222+
fn decode_signature(raw: Vec<u8>) -> Result<Signature, GcpSignerError> {
223+
let mut bytes = [0; 64];
224+
bytes.copy_from_slice(&raw);
225+
Ok(Signature::from(bytes))
226+
}
227+
194228
#[cfg(test)]
195229
mod test {
196230
use solana_sdk::signer::Signer;
@@ -259,6 +293,9 @@ mod test {
259293
let mut array = [0u8; 32];
260294
array.copy_from_slice(&content[12..]);
261295
let pubkey = Pubkey::new_from_array(array);
262-
println!("{:?}", pubkey);
296+
assert_eq!(
297+
pubkey,
298+
Pubkey::from_str_const("2uDMykU9nKeSUg2JLPktsMNYyrUmv7y9EpLHn847H7Zn")
299+
);
263300
}
264301
}

0 commit comments

Comments
 (0)