use crate::{SecurityError, SecurityResult, AUTH_PARAMS_PLACEHOLDER};
#[derive(Debug, Clone, Default, Eq, PartialEq, Hash)]
pub struct SecurityParams {
engine_id: Vec<u8>,
engine_boots: u32,
engine_time: u32,
username: Vec<u8>,
auth_params: Vec<u8>,
priv_params: Vec<u8>,
}
impl SecurityParams {
pub const ENGINE_BOOTS_MAX: u32 = 2_147_483_647;
pub const ENGINE_TIME_MAX: u32 = 2_147_483_647;
pub fn new() -> Self {
Self::default()
}
pub fn for_discovery() -> Self {
Self::default()
}
pub fn engine_id(&self) -> &[u8] {
&self.engine_id
}
pub fn set_engine_id(&mut self, engine_id: &[u8]) -> &mut Self {
self.engine_id.clear();
self.engine_id.extend_from_slice(engine_id);
self
}
pub fn engine_boots(&self) -> u32 {
self.engine_boots
}
pub fn set_engine_boots(&mut self, engine_boots: u32) -> &mut Self {
self.engine_boots = engine_boots;
self
}
pub fn engine_time(&self) -> u32 {
self.engine_time
}
pub fn set_engine_time(&mut self, engine_time: u32) -> &mut Self {
self.engine_time = engine_time;
self
}
pub fn username(&self) -> &[u8] {
&self.username
}
pub fn set_username(&mut self, username: &[u8]) -> &mut Self {
self.username.clear();
self.username.extend_from_slice(username);
self
}
pub fn auth_params(&self) -> &[u8] {
&self.auth_params
}
pub fn set_auth_params(&mut self, auth_params: &[u8]) -> &mut Self {
self.auth_params.clear();
self.auth_params.extend_from_slice(auth_params);
self
}
pub fn set_auth_params_placeholder(&mut self) -> &mut Self {
self.set_auth_params(&AUTH_PARAMS_PLACEHOLDER);
self
}
pub fn priv_params(&self) -> &[u8] {
&self.priv_params
}
pub fn set_priv_params(&mut self, priv_params: &[u8]) -> &mut Self {
self.priv_params.clear();
self.priv_params.extend_from_slice(priv_params);
self
}
pub fn encode(&self) -> Vec<u8> {
yasna::construct_der(|writer| {
writer.write_sequence(|writer| {
writer.next().write_bytes(&self.engine_id);
writer.next().write_u32(self.engine_boots);
writer.next().write_u32(self.engine_time);
writer.next().write_bytes(&self.username);
writer.next().write_bytes(&self.auth_params);
writer.next().write_bytes(&self.priv_params);
})
})
}
pub fn decode(buf: &[u8]) -> SecurityResult<Self> {
let result = yasna::parse_ber(buf, |reader| {
reader.read_sequence(|reader| {
let engine_id = reader.next().read_bytes()?;
let engine_boots = reader.next().read_u32()?;
let engine_time = reader.next().read_u32()?;
let username = reader.next().read_bytes()?;
let auth_params = reader.next().read_bytes()?;
let priv_params = reader.next().read_bytes()?;
Ok(Self {
engine_id,
engine_boots,
engine_time,
username,
auth_params,
priv_params,
})
})
});
result.map_err(|_| SecurityError::MalformedSecurityParams)
}
}