Skip to content

Commit 7fe4da3

Browse files
feature: unwrapkey operation for keyvault (#1309)
1 parent 5e4490a commit 7fe4da3

File tree

4 files changed

+117
-0
lines changed

4 files changed

+117
-0
lines changed

sdk/security_keyvault/src/clients/key_client.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,15 @@ impl KeyClient {
100100
{
101101
GetRandomBytesBuilder::new(self.clone(), hsm_name.into(), count)
102102
}
103+
104+
pub fn unwrap_key<N>(
105+
&self,
106+
name: N,
107+
unwrap_key_parameters: UnwrapKeyParameters,
108+
) -> UnwrapKeyBuilder
109+
where
110+
N: Into<String>,
111+
{
112+
UnwrapKeyBuilder::new(self.clone(), name.into(), unwrap_key_parameters)
113+
}
103114
}

sdk/security_keyvault/src/keys/models.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,3 +410,24 @@ pub struct GetRandomBytesResult {
410410
#[serde(rename = "value", deserialize_with = "deser_base64")]
411411
pub result: Vec<u8>,
412412
}
413+
414+
#[derive(Debug, Serialize, Deserialize, Clone)]
415+
pub struct UnwrapKeyParameters {
416+
pub decrypt_parameters_encryption: CryptographParamtersEncryption,
417+
#[serde(serialize_with = "ser_base64", deserialize_with = "deser_base64")]
418+
pub ciphertext: Vec<u8>,
419+
}
420+
421+
#[derive(Debug, Deserialize)]
422+
pub struct UnwrapKeyResult {
423+
#[serde(skip)]
424+
pub algorithm: EncryptionAlgorithm,
425+
#[serde(rename = "kid")]
426+
pub key_id: String,
427+
#[serde(
428+
rename = "value",
429+
serialize_with = "ser_base64",
430+
deserialize_with = "deser_base64"
431+
)]
432+
pub result: Vec<u8>,
433+
}

sdk/security_keyvault/src/keys/operations/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ mod encrypt;
33
mod get_key;
44
mod get_random_bytes;
55
mod sign;
6+
mod unwrap_key;
67
pub use decrypt::*;
78
pub use encrypt::*;
89
pub use get_key::*;
910
pub use get_random_bytes::*;
1011
pub use sign::*;
12+
pub use unwrap_key::*;
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
use crate::prelude::*;
2+
use azure_core::{headers::Headers, CollectedResponse, Method};
3+
use serde_json::{Map, Value};
4+
5+
operation! {
6+
UnwrapKey,
7+
client: KeyClient,
8+
name: String,
9+
unwrap_key_parameters: UnwrapKeyParameters,
10+
?version: String
11+
}
12+
13+
impl UnwrapKeyBuilder {
14+
pub fn into_future(mut self) -> UnwrapKey {
15+
Box::pin(async move {
16+
// POST {vaultBaseUrl}/keys/{key-name}/{key-version}/decrypt?api-version=7.2
17+
let version = self.version.unwrap_or_default();
18+
let mut uri = self.client.keyvault_client.vault_url.clone();
19+
let path = format!("keys/{}/{}/unwrapkey", self.name, version);
20+
21+
uri.set_path(&path);
22+
23+
let mut request_body = Map::new();
24+
request_body.insert(
25+
"value".to_owned(),
26+
Value::String(String::from_utf8(self.unwrap_key_parameters.ciphertext)?),
27+
);
28+
29+
let algorithm = match self.unwrap_key_parameters.decrypt_parameters_encryption {
30+
CryptographParamtersEncryption::Rsa(RsaEncryptionParameters { algorithm }) => {
31+
request_body.insert("alg".to_owned(), serde_json::to_value(&algorithm)?);
32+
algorithm
33+
}
34+
CryptographParamtersEncryption::AesGcm(AesGcmEncryptionParameters {
35+
algorithm,
36+
iv,
37+
authentication_tag,
38+
additional_authenticated_data,
39+
}) => {
40+
request_body.insert("alg".to_owned(), serde_json::to_value(&algorithm)?);
41+
request_body.insert("iv".to_owned(), serde_json::to_value(iv)?);
42+
request_body
43+
.insert("tag".to_owned(), serde_json::to_value(authentication_tag)?);
44+
if let Some(aad) = additional_authenticated_data {
45+
request_body.insert("aad".to_owned(), serde_json::to_value(aad)?);
46+
};
47+
algorithm
48+
}
49+
CryptographParamtersEncryption::AesCbc(AesCbcEncryptionParameters {
50+
algorithm,
51+
iv,
52+
}) => {
53+
request_body.insert("alg".to_owned(), serde_json::to_value(&algorithm)?);
54+
request_body.insert("iv".to_owned(), serde_json::to_value(iv)?);
55+
algorithm
56+
}
57+
};
58+
59+
let headers = Headers::new();
60+
let mut request = self.client.keyvault_client.finalize_request(
61+
uri,
62+
Method::Post,
63+
headers,
64+
Some(Value::Object(request_body).to_string().into()),
65+
)?;
66+
67+
let response = self
68+
.client
69+
.keyvault_client
70+
.send(&mut self.context, &mut request)
71+
.await?;
72+
73+
let response = CollectedResponse::from_response(response).await?;
74+
let body = response.body();
75+
76+
let mut result = serde_json::from_slice::<UnwrapKeyResult>(body)?;
77+
result.algorithm = algorithm;
78+
Ok(result)
79+
})
80+
}
81+
}
82+
83+
type UnwrapKeyResponse = UnwrapKeyResult;

0 commit comments

Comments
 (0)