feat: decrypt ecdh works

This commit is contained in:
2023-09-07 23:12:04 +08:00
parent 3a4af50e27
commit 3d40730cb5
6 changed files with 799 additions and 52 deletions

44
src/wrap_key.rs Normal file
View File

@@ -0,0 +1,44 @@
use rust_util::{opt_result, simple_error, XResult};
use serde::{Deserialize, Serialize};
use crate::util::decode_base64_url_no_pad;
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct WrapKey {
pub header: WrapKeyHeader,
pub nonce: Vec<u8>,
pub encrypted_data: Vec<u8>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct WrapKeyHeader {
pub kid: Option<String>,
pub enc: String,
pub e_pub_key: String,
}
impl WrapKey {
pub fn parse(wk: &str) -> XResult<WrapKey> {
if !wk.starts_with("WK:") {
return simple_error!("Wrap key string must starts with WK:");
}
let wks = wk.split(".").collect::<Vec<_>>();
if wks.len() != 3 {
return simple_error!("Invalid wrap key.");
}
let header = wks[0].chars().skip(3).collect::<String>();
let header_bytes = opt_result!(decode_base64_url_no_pad(&header), "Invalid wrap key header: {}");
let nonce = wks[1];
let encrypted_data = wks[2];
let header_str = opt_result!(String::from_utf8(header_bytes), "Invalid wrap key header: {}");
let header: WrapKeyHeader = opt_result!(serde_json::from_str(&header_str), "Invalid wrap key header: {}");
let nonce = opt_result!(decode_base64_url_no_pad(nonce), "Invalid wrap key: {}");
let encrypted_data = opt_result!(decode_base64_url_no_pad(encrypted_data), "Invalid wrap key: {}");
Ok(WrapKey {
header,
nonce,
encrypted_data,
})
}
}