feat: datakey decrypt fails when not exportable
This commit is contained in:
@@ -17,9 +17,9 @@ use serde_json::{Map, Value};
|
||||
// type:ec, spec:p256,p384,p521,ed25519,cv25519
|
||||
#[derive(Serialize, Deserialize)]
|
||||
struct DataKeyRequest {
|
||||
key_type: String,
|
||||
key_spec: String,
|
||||
key_name: Option<String>,
|
||||
r#type: String,
|
||||
spec: String,
|
||||
name: Option<String>,
|
||||
exportable: Option<bool>,
|
||||
return_plaintext: Option<bool>,
|
||||
}
|
||||
@@ -32,15 +32,15 @@ async fn inner_generate(req: Request<Body>) -> XResult<(StatusCode, Value)> {
|
||||
let whole_body = hyper::body::aggregate(req).await?;
|
||||
let request: DataKeyRequest = serde_json::from_reader(whole_body.reader())?;
|
||||
|
||||
debugging!("Generate data key: {} {}", &request.key_type, &request.key_spec);
|
||||
debugging!("Generate data key: {} {}", &request.r#type, &request.spec);
|
||||
let key = match get_master_key() {
|
||||
None => return serve_common::error("status_not_ready"),
|
||||
Some(key) => key,
|
||||
};
|
||||
let exportable = request.exportable.unwrap_or(true);
|
||||
let ret_key_plaintext = iff!(exportable, false, request.return_plaintext.unwrap_or(false));
|
||||
let ret_key_plaintext = iff!(!exportable, false, request.return_plaintext.unwrap_or(false));
|
||||
|
||||
let response_result = match (request.key_type.as_str(), request.key_spec.as_str()) {
|
||||
let response_result = match (request.r#type.as_str(), request.spec.as_str()) {
|
||||
("aes", "128") => generate_aes("datakey:aes-128", exportable, key, 16, ret_key_plaintext),
|
||||
("aes", "192") => generate_aes("datakey:aes-192", exportable, key, 24, ret_key_plaintext),
|
||||
("aes", "256") => generate_aes("datakey:aes-256", exportable, key, 32, ret_key_plaintext),
|
||||
@@ -53,16 +53,16 @@ async fn inner_generate(req: Request<Body>) -> XResult<(StatusCode, Value)> {
|
||||
Err(e) => serve_common::error(&format!("internal error: {}", e)),
|
||||
Ok((key_plaintext, key_ciphertext)) => {
|
||||
let mut map = Map::new();
|
||||
map.insert("key_type".to_string(), Value::String(request.key_type));
|
||||
map.insert("key_spec".to_string(), Value::String(request.key_spec));
|
||||
map.insert("key_type".to_string(), Value::String(request.r#type));
|
||||
map.insert("key_spec".to_string(), Value::String(request.spec));
|
||||
if let Some(key_plaintext) = key_plaintext {
|
||||
map.insert("key_plaintext".to_string(), Value::String(STANDARD.encode(&key_plaintext)));
|
||||
}
|
||||
map.insert("key_ciphertext".to_string(), Value::String(key_ciphertext));
|
||||
|
||||
if let Some(_key_name) = &request.key_name {
|
||||
if let Some(_name) = &request.name {
|
||||
// TODO write datakey to db
|
||||
// TODO let data_key_name = format!("datakey:{}", key_name);
|
||||
// TODO let data_key_name = format!("datakey:{}", name);
|
||||
}
|
||||
|
||||
Ok((StatusCode::OK, Value::Object(map)))
|
||||
|
||||
Reference in New Issue
Block a user