feat: v0.1.0
This commit is contained in:
49
src/serve.rs
49
src/serve.rs
@@ -7,10 +7,10 @@ use hyper::client::HttpConnector;
|
||||
use hyper::service::{make_service_fn, service_fn};
|
||||
use josekit::jwk::alg::rsa::RsaKeyPair;
|
||||
use josekit::jwk::KeyPair;
|
||||
use rust_util::{debugging, failure_and_exit, information, opt_result, opt_value_result, simple_error, success, XResult};
|
||||
use rust_util::{debugging, failure_and_exit, information, opt_result, simple_error, success, XResult};
|
||||
use rust_util::util_clap::{Command, CommandError};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde_json::{json, Value};
|
||||
use serde_json::{json, Map, Value};
|
||||
use zeroize::Zeroize;
|
||||
|
||||
use crate::{db, jose};
|
||||
@@ -165,10 +165,42 @@ impl MultipleViewValue {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
struct DecryptRequest {
|
||||
encrypted_value: String,
|
||||
}
|
||||
|
||||
async fn decrypt(req: Request<Body>) -> Result<Response<Body>> {
|
||||
do_response!(inner_decrypt(req).await)
|
||||
}
|
||||
|
||||
async fn inner_decrypt(req: Request<Body>) -> XResult<(StatusCode, Value)> {
|
||||
let whole_body = hyper::body::aggregate(req).await?;
|
||||
let data: serde_json::Value = serde_json::from_reader(whole_body.reader())?;
|
||||
Ok(Response::builder().body(format!("{}", data).into())?)
|
||||
let data: DecryptRequest = serde_json::from_reader(whole_body.reader())?;
|
||||
|
||||
debugging!("To be decrypted value: {}", &data.encrypted_value);
|
||||
let mut key = match get_master_key() {
|
||||
None => return Ok((StatusCode::BAD_REQUEST, json!({ "error": "status_not_ready" }))),
|
||||
Some(key) => key,
|
||||
};
|
||||
let decrypted_value = jose::deserialize_jwe_aes(&data.encrypted_value, &key);
|
||||
key.zeroize();
|
||||
|
||||
decrypted_value.map(|v| {
|
||||
let v = MultipleViewValue::from(&v.0);
|
||||
let mut map = Map::new();
|
||||
if let Some(v) = &v.value {
|
||||
map.insert("value".to_string(), Value::String(v.to_string()));
|
||||
}
|
||||
if let Some(v) = &v.value_hex {
|
||||
map.insert("value_hex".to_string(), Value::String(v.to_string()));
|
||||
}
|
||||
if let Some(v) = &v.value_base64 {
|
||||
map.insert("value_base64".to_string(), Value::String(v.to_string()));
|
||||
}
|
||||
(StatusCode::OK, Value::Object(map))
|
||||
})
|
||||
}
|
||||
|
||||
async fn encrypt(req: Request<Body>) -> Result<Response<Body>> {
|
||||
@@ -179,7 +211,10 @@ async fn inner_encrypt(req: Request<Body>) -> XResult<(StatusCode, Value)> {
|
||||
let whole_body = hyper::body::aggregate(req).await?;
|
||||
let data: MultipleViewValue = serde_json::from_reader(whole_body.reader())?;
|
||||
let value = data.to_bytes()?;
|
||||
let mut key = opt_value_result!( get_master_key(), "Server is not init");
|
||||
let mut key = match get_master_key() {
|
||||
None => return Ok((StatusCode::BAD_REQUEST, json!({ "error": "status_not_ready" }))),
|
||||
Some(key) => key,
|
||||
};
|
||||
let encrypt_result = jose::serialize_jwe_aes(&value, &key);
|
||||
key.zeroize();
|
||||
|
||||
@@ -230,6 +265,7 @@ async fn inner_init(req: Request<Body>) -> XResult<(StatusCode, Value)> {
|
||||
} else if let Some(clear_master_key_hex) = init_request.clear_master_key_hex {
|
||||
hex::decode(clear_master_key_hex)?
|
||||
} else if let Some(encrypted_master_key) = init_request.encrypted_master_key {
|
||||
debugging!("Received encrypted master key: {}", encrypted_master_key);
|
||||
if let Some(k) = &*startup_rw_lock {
|
||||
let (clear_master_key, _) = jose::deserialize_jwe_rsa(&encrypted_master_key, &k.instance_rsa_key_pair.to_jwk_private_key())?;
|
||||
clear_master_key
|
||||
@@ -262,6 +298,7 @@ async fn inner_init(req: Request<Body>) -> XResult<(StatusCode, Value)> {
|
||||
}
|
||||
information!("Set master key success");
|
||||
k.master_key = Some(clear_master_key);
|
||||
k.instance_rsa_key_pair = jose::generate_rsa_key(4096)?;
|
||||
}
|
||||
Ok((StatusCode::OK, json!({})))
|
||||
}
|
||||
@@ -278,10 +315,10 @@ async fn inner_status() -> XResult<(StatusCode, Value)> {
|
||||
None => json!({
|
||||
"status": "not-ready",
|
||||
"instance_public_key_jwk": memory_key.instance_rsa_key_pair.to_jwk_key_pair().to_public_key()?,
|
||||
"instance_public_key_pem": String::from_utf8_lossy(&memory_key.instance_rsa_key_pair.to_pem_public_key()).to_string(),
|
||||
}),
|
||||
Some(_) => json!({
|
||||
"status": "ready",
|
||||
"instance_public_key_jwk": memory_key.instance_rsa_key_pair.to_jwk_key_pair().to_public_key()?,
|
||||
}),
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user