use super::{UDSCommand, UdsDiagnosticServer};
use crate::{DiagServerResult, DiagnosticServer};
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub enum SecurityOperation {
RequestSeed,
SendKey,
}
impl From<SecurityOperation> for u8 {
fn from(from: SecurityOperation) -> Self {
match from {
SecurityOperation::RequestSeed => 0x01,
SecurityOperation::SendKey => 0x02,
}
}
}
impl UdsDiagnosticServer {
pub fn request_seed(&mut self) -> DiagServerResult<Vec<u8>> {
let mut resp = self.execute_command_with_response(
UDSCommand::SecurityAccess,
&[SecurityOperation::RequestSeed.into()],
)?;
resp.drain(0..2); Ok(resp)
}
pub fn send_key(&mut self, key: &[u8]) -> DiagServerResult<()> {
let mut payload = Vec::with_capacity(key.len() + 1);
payload.push(SecurityOperation::SendKey.into());
payload.extend_from_slice(key);
self.execute_command_with_response(UDSCommand::SecurityAccess, &payload)
.map(|_| ())
}
}