use confium_pki::{cert::Certificate as RustCert, cms::SignedData as RustSignedData};
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub struct Certificate {
inner: RustCert,
}
#[wasm_bindgen]
impl Certificate {
#[wasm_bindgen(constructor)]
pub fn from_der(der: &[u8]) -> Result<Certificate, JsValue> {
let inner = RustCert::from_der(der)
.map_err(|e| JsValue::from_str(&format!("DER parse error: {e}")))?;
Ok(Self { inner })
}
pub fn from_pem(pem: &str) -> Result<Certificate, JsValue> {
let inner = RustCert::from_pem(pem)
.map_err(|e| JsValue::from_str(&format!("PEM parse error: {e}")))?;
Ok(Self { inner })
}
#[wasm_bindgen(getter)]
pub fn fingerprint_sha256(&self) -> String {
self.inner.fingerprint_sha256()
}
#[wasm_bindgen(getter)]
pub fn serial_hex(&self) -> String {
let bytes = self.inner.serial_bytes();
let mut out = String::with_capacity(bytes.len() * 2);
for b in bytes {
out.push_str(&format!("{:02x}", b));
}
out
}
#[wasm_bindgen]
pub fn to_der(&self) -> Vec<u8> {
self.inner.to_der()
}
#[wasm_bindgen]
pub fn is_within_validity(&self, epoch_ms: f64) -> bool {
let now = chrono::DateTime::<chrono::Utc>::from_timestamp_millis(epoch_ms as i64)
.unwrap_or_else(chrono::Utc::now);
self.inner.is_within_validity(now)
}
}
#[wasm_bindgen]
pub struct SignedData {
inner: RustSignedData,
}
#[wasm_bindgen]
impl SignedData {
#[wasm_bindgen(constructor)]
pub fn from_json(json: &str) -> Result<SignedData, JsValue> {
let inner: RustSignedData = serde_json::from_str(json)
.map_err(|e| JsValue::from_str(&format!("SignedData JSON parse error: {e}")))?;
Ok(Self { inner })
}
#[wasm_bindgen]
pub fn to_json(&self) -> Result<String, JsValue> {
serde_json::to_string(&self.inner)
.map_err(|e| JsValue::from_str(&format!("serialize: {e}")))
}
#[wasm_bindgen(getter)]
pub fn signer_count(&self) -> usize {
self.inner.signer_infos.len()
}
#[wasm_bindgen(getter)]
pub fn content_type(&self) -> String {
self.inner.encap_content_info.content_type.clone()
}
#[wasm_bindgen(getter)]
pub fn certificate_count(&self) -> usize {
self.inner.certificates.len()
}
#[wasm_bindgen]
pub fn certificate_at(&self, index: usize) -> Option<Vec<u8>> {
self.inner.certificates.get(index).cloned()
}
#[wasm_bindgen]
pub fn content(&self) -> Option<Vec<u8>> {
self.inner.encap_content_info.content.clone()
}
}