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