1use std::str::FromStr;
2
3use wire_e2e_identity::legacy::{device_status::DeviceStatus, id::WireQualifiedClientId};
4use x509_cert::der::pem::LineEnding;
5
6use super::{Error, Result};
7use crate::CredentialType;
8
9#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd)]
12pub struct WireIdentity {
13 pub client_id: String,
15 pub thumbprint: String,
17 pub status: DeviceStatus,
19 pub credential_type: CredentialType,
21 pub x509_identity: Option<X509Identity>,
23}
24
25#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd)]
30pub struct X509Identity {
31 pub handle: String,
33 pub display_name: String,
35 pub domain: String,
37 pub certificate: String,
39 pub serial_number: String,
41 pub not_before: u64,
43 pub not_after: u64,
45}
46
47impl<'a> TryFrom<(wire_e2e_identity::WireIdentity, &'a [u8])> for WireIdentity {
48 type Error = Error;
49
50 fn try_from((i, cert): (wire_e2e_identity::WireIdentity, &'a [u8])) -> Result<Self> {
51 use x509_cert::der::Decode as _;
52 let document =
53 x509_cert::der::Document::from_der(cert).map_err(wire_e2e_identity::E2eIdentityError::X509CertDerError)?;
54 let certificate = document
55 .to_pem("CERTIFICATE", LineEnding::LF)
56 .map_err(wire_e2e_identity::E2eIdentityError::X509CertDerError)?;
57
58 let client_id = WireQualifiedClientId::from_str(&i.client_id)?;
59
60 Ok(Self {
61 client_id: client_id.try_into()?,
62 status: i.status.into(),
63 thumbprint: i.thumbprint,
64 credential_type: CredentialType::X509,
65 x509_identity: Some(X509Identity {
66 handle: i.handle.to_string(),
67 display_name: i.display_name,
68 domain: i.domain,
69 certificate,
70 serial_number: i.serial_number,
71 not_before: i.not_before,
72 not_after: i.not_after,
73 }),
74 })
75 }
76}