feat: decrypt ecdh works
This commit is contained in:
44
src/wrap_key.rs
Normal file
44
src/wrap_key.rs
Normal 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,
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user