1use wire_e2e_identity::IdentityStatus;
2use x509_cert::der::pem::LineEnding;
3
4use super::Result;
5use crate::{ClientId, CredentialType, RecursiveError};
6
7#[derive(Debug, Clone, PartialEq, Eq)]
10pub struct WireIdentity {
11 pub client_id: Option<ClientId>,
13 pub thumbprint: String,
15 pub status: IdentityStatus,
17 pub credential_type: CredentialType,
19 pub x509_identity: Option<X509Identity>,
21}
22
23#[derive(Debug, Clone, Eq, PartialEq)]
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 = super::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).map_err(super::error::identity::Error::from)?;
51 let certificate = document
52 .to_pem("CERTIFICATE", LineEnding::LF)
53 .map_err(super::error::identity::Error::from)?;
54
55 let client_id = ClientId::try_from_str_with_base64_user_id(&e2ei_wire_identity.client_id)
56 .map(Some)
57 .map_err(RecursiveError::context("client id from qualified string"))?;
58
59 Ok(Self {
60 client_id,
61 status: e2ei_wire_identity.status,
62 thumbprint: e2ei_wire_identity.thumbprint,
63 credential_type: CredentialType::X509,
64 x509_identity: Some(X509Identity {
65 handle: e2ei_wire_identity.handle.to_string(),
66 display_name: e2ei_wire_identity.display_name,
67 domain: e2ei_wire_identity.domain,
68 certificate,
69 serial_number: e2ei_wire_identity.serial_number,
70 not_before: e2ei_wire_identity.not_before,
71 not_after: e2ei_wire_identity.not_after,
72 }),
73 })
74 }
75}