use std::{fmt, mem};
use crate::image::WIN_CERTIFICATE;
use crate::util::AlignTo;
#[derive(Copy, Clone)]
pub struct Security<'a> {
image: &'a [u8], }
impl<'a> Security<'a> {
pub(crate) unsafe fn new(image: &'a [u8]) -> Security<'a> {
debug_assert!(image.as_ptr().aligned_to(mem::align_of::<WIN_CERTIFICATE>()));
debug_assert!(image.len() >= 8);
Security { image }
}
pub fn image(&self) -> &'a WIN_CERTIFICATE {
unsafe {
&*(self.image.as_ptr() as *const _)
}
}
pub fn certificate_type(&self) -> u16 {
self.image().wCertificateType
}
pub fn certificate_data(&self) -> &'a [u8] {
unsafe {
self.image.get_unchecked(8..)
}
}
}
impl<'a> fmt::Debug for Security<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("Security")
.field("certificate_type", &self.certificate_type())
.field("certificate_data.len", &self.certificate_data().len())
.finish()
}
}
#[cfg(feature = "serde")]
mod serde {
use crate::util::serde_helper::*;
use super::Security;
impl<'a> Serialize for Security<'a> {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let is_human_readable = serializer.is_human_readable();
let mut state = serializer.serialize_struct("Security", 2)?;
state.serialize_field("certificate_type", &self.certificate_type())?;
if cfg!(feature = "data-encoding") && is_human_readable {
#[cfg(feature = "data-encoding")]
state.serialize_field("certificate_data",
&data_encoding::BASE64.encode(self.certificate_data()))?;
}
else {
state.serialize_field("certificate_data", &self.certificate_data())?;
}
state.end()
}
}
}