core_crypto/e2e_identity/
identity.rs1use crate::{
2 e2e_identity::{device_status::DeviceStatus, id::WireQualifiedClientId},
3 prelude::MlsCredentialType,
4};
5use std::str::FromStr;
6use x509_cert::der::pem::LineEnding;
7
8use super::{Error, Result};
9
10#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd)]
13pub struct WireIdentity {
14 pub client_id: String,
16 pub thumbprint: String,
18 pub status: DeviceStatus,
20 pub credential_type: MlsCredentialType,
22 pub x509_identity: Option<X509Identity>,
24}
25
26#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd)]
31pub struct X509Identity {
32 pub handle: String,
34 pub display_name: String,
36 pub domain: String,
38 pub certificate: String,
40 pub serial_number: String,
42 pub not_before: u64,
44 pub not_after: u64,
46}
47
48impl<'a> TryFrom<(wire_e2e_identity::prelude::WireIdentity, &'a [u8])> for WireIdentity {
49 type Error = Error;
50
51 fn try_from((i, cert): (wire_e2e_identity::prelude::WireIdentity, &'a [u8])) -> Result<Self> {
52 use x509_cert::der::Decode as _;
53 let document = x509_cert::der::Document::from_der(cert)?;
54 let certificate = document.to_pem("CERTIFICATE", LineEnding::LF)?;
55
56 let client_id = WireQualifiedClientId::from_str(&i.client_id)?;
57
58 Ok(Self {
59 client_id: client_id.try_into()?,
60 status: i.status.into(),
61 thumbprint: i.thumbprint,
62 credential_type: MlsCredentialType::X509,
63 x509_identity: Some(X509Identity {
64 handle: i.handle.to_string(),
65 display_name: i.display_name,
66 domain: i.domain,
67 certificate,
68 serial_number: i.serial_number,
69 not_before: i.not_before,
70 not_after: i.not_after,
71 }),
72 })
73 }
74}