extern crate alloc;
use alloc::boxed::Box;
use alloc::vec::Vec;
use crate::error::SecurityResult;
use crate::properties::PropertyList;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct IdentityHandle(pub u64);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct HandshakeHandle(pub u64);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct SharedSecretHandle(pub u64);
pub trait SharedSecretProvider: Send + Sync {
fn get_shared_secret(&self, handle: SharedSecretHandle) -> Option<alloc::vec::Vec<u8>>;
}
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum HandshakeStepOutcome {
SendMessage {
token: Vec<u8>,
},
Complete {
secret: SharedSecretHandle,
},
WaitingForPeer,
}
pub trait AuthenticationPlugin: Send + Sync {
fn validate_local_identity(
&mut self,
props: &PropertyList,
participant_guid: [u8; 16],
) -> SecurityResult<IdentityHandle>;
fn validate_remote_identity(
&mut self,
local: IdentityHandle,
remote_participant_guid: [u8; 16],
remote_auth_token: &[u8],
) -> SecurityResult<IdentityHandle>;
fn begin_handshake_request(
&mut self,
initiator: IdentityHandle,
replier: IdentityHandle,
) -> SecurityResult<(HandshakeHandle, HandshakeStepOutcome)>;
fn begin_handshake_reply(
&mut self,
replier: IdentityHandle,
initiator: IdentityHandle,
request_token: &[u8],
) -> SecurityResult<(HandshakeHandle, HandshakeStepOutcome)>;
fn process_handshake(
&mut self,
handshake: HandshakeHandle,
token: &[u8],
) -> SecurityResult<HandshakeStepOutcome>;
fn shared_secret(&self, handshake: HandshakeHandle) -> SecurityResult<SharedSecretHandle>;
fn plugin_class_id(&self) -> &str;
fn get_identity_token(&self, _local: IdentityHandle) -> SecurityResult<Vec<u8>> {
Ok(Vec::new())
}
fn get_identity_status_token(&self, _local: IdentityHandle) -> SecurityResult<Vec<u8>> {
Ok(Vec::new())
}
fn set_permissions_credential_and_token(
&mut self,
_local: IdentityHandle,
_permissions_credential: &[u8],
_permissions_token: &[u8],
) -> SecurityResult<()> {
Ok(())
}
fn get_authenticated_peer_credential_token(
&self,
_handshake: HandshakeHandle,
) -> SecurityResult<Vec<u8>> {
Ok(Vec::new())
}
}
pub type AuthPluginBox = Box<dyn AuthenticationPlugin>;
#[cfg(test)]
#[allow(clippy::expect_used)]
mod tests {
use super::*;
struct StubAuth;
impl AuthenticationPlugin for StubAuth {
fn validate_local_identity(
&mut self,
_props: &PropertyList,
_guid: [u8; 16],
) -> SecurityResult<IdentityHandle> {
Ok(IdentityHandle(1))
}
fn validate_remote_identity(
&mut self,
_l: IdentityHandle,
_r: [u8; 16],
_t: &[u8],
) -> SecurityResult<IdentityHandle> {
Ok(IdentityHandle(2))
}
fn begin_handshake_request(
&mut self,
_i: IdentityHandle,
_r: IdentityHandle,
) -> SecurityResult<(HandshakeHandle, HandshakeStepOutcome)> {
Ok((HandshakeHandle(1), HandshakeStepOutcome::WaitingForPeer))
}
fn begin_handshake_reply(
&mut self,
_r: IdentityHandle,
_i: IdentityHandle,
_t: &[u8],
) -> SecurityResult<(HandshakeHandle, HandshakeStepOutcome)> {
Ok((HandshakeHandle(1), HandshakeStepOutcome::WaitingForPeer))
}
fn process_handshake(
&mut self,
_h: HandshakeHandle,
_t: &[u8],
) -> SecurityResult<HandshakeStepOutcome> {
Ok(HandshakeStepOutcome::Complete {
secret: SharedSecretHandle(1),
})
}
fn shared_secret(&self, _h: HandshakeHandle) -> SecurityResult<SharedSecretHandle> {
Ok(SharedSecretHandle(1))
}
fn plugin_class_id(&self) -> &str {
"DDS:Auth:Stub"
}
}
#[test]
fn stub_can_be_boxed() {
let _: AuthPluginBox = Box::new(StubAuth);
}
}