Skip to main content

SharedSecurityGate

Struct SharedSecurityGate 

Source
pub struct SharedSecurityGate { /* private fields */ }
Expand description

Thread-sicherer Security-Gate. Clone gibt eine zweite Referenz auf die gleiche Plugin-Instance — alle Clones operieren auf gleichem Key-Store.

Implementations§

Source§

impl SharedSecurityGate

Source

pub fn new( domain_id: u32, governance: Governance, crypto: Box<dyn CryptographicPlugin>, ) -> Self

Konstruktor. Der Plugin wird vom Gate geownt (Box).

Source

pub fn domain_id(&self) -> Result<u32, SecurityGateError>

Gibt die Domain-Id zurueck, fuer die der Gate laeuft.

Source

pub fn message_protection(&self) -> Result<ProtectionKind, SecurityGateError>

ProtectionKind fuer Message-Level — abgeleitet aus dem ersten matchenden <domain_rule>.

Source

pub fn ensure_local(&self) -> Result<CryptoHandle, SecurityGateError>

Registriert den lokalen Participant beim Crypto-Plugin (idempotent).

§Errors

CryptoSetup wenn das Plugin den Identity-Handle nicht akzeptiert.

Source

pub fn local_token(&self) -> Result<Vec<u8>, SecurityGateError>

Token des lokalen Participants (zu senden an Remote via SEDP).

§Errors

Siehe SecurityGateError.

Source

pub fn register_remote_with_token( &self, remote_identity: IdentityHandle, shared_secret: SharedSecretHandle, token: &[u8], ) -> Result<CryptoHandle, SecurityGateError>

Registriert einen Remote-Peer und installiert seinen Token. Der zurueckgegebene CryptoHandle identifiziert den Slot, in dem der Remote-Key abgelegt ist — wird bei decode_inbound_message wieder gebraucht.

§Errors

Siehe SecurityGateError.

Source

pub fn register_remote_by_guid( &self, peer_key: PeerKey, remote_identity: IdentityHandle, shared_secret: SharedSecretHandle, token: &[u8], ) -> Result<CryptoHandle, SecurityGateError>

Registriert einen Remote-Peer mit Peer-Key-Mapping. Nach diesem Call kann Self::transform_inbound_from den Peer anhand seines PeerKey (GuidPrefix) wiederfinden.

Idempotent: wiederholter Call mit gleichem Key ueberschreibt den alten Slot nicht — der Caller muss explizit Self::forget_remote aufrufen, um rotieren zu koennen.

§Errors

Siehe SecurityGateError.

Source

pub fn forget_remote(&self, peer_key: &PeerKey) -> Result<(), SecurityGateError>

Entfernt die Peer-Key → Slot-Zuordnung. Der Slot selbst bleibt im Plugin (Key-Cleanup ist Aufgabe des Plugins bei Re-Register).

Source

pub fn slot_for( &self, peer_key: &PeerKey, ) -> Result<Option<CryptoHandle>, SecurityGateError>

Liefert den Slot fuer einen Peer-Key, falls registriert.

Source

pub fn transform_inbound_from( &self, peer_key: &PeerKey, wire: &[u8], ) -> Result<Vec<u8>, SecurityGateError>

Inbound-Transform mit Peer-Key-Lookup. Der RTPS-Header enthaelt den GuidPrefix des Senders auf den Bytes 8..20 — der Caller muss diesen hier als peer_key uebergeben.

Wenn der Peer nicht registriert ist und die Message verschluesselt aussieht: PolicyViolation (unbekannter Sender schickt SRTPS).

§Errors

Siehe SecurityGateError.

Source

pub fn transform_outbound( &self, message: &[u8], ) -> Result<Vec<u8>, SecurityGateError>

Outbound-Message: wrap wenn Governance Message-Schutz verlangt.

§Errors

Siehe SecurityGateError.

Source

pub fn transform_outbound_group( &self, peer_keys: &[PeerKey], plaintext: &[u8], ) -> Result<Vec<u8>, SecurityGateError>

Group-Outbound mit Receiver-Specific-MACs.

Nutzt encode_secured_submessage_multi, wenn alle Empfaenger bereits ueber Peer-Keys im Gate registriert sind. Liefert einen einzigen Wire-Datagram mit Multi-MAC-SEC_POSTFIX; der Caller kann dasselbe Datagram an alle matched Readers unicasten.

Der resultierende Wire ist KEIN RTPS-Message-Level-Wrapper — es ist eine Submessage-Sequenz (SEC_PREFIX/BODY/POSTFIX). Der Caller muss den RTPS-Header selber davor setzen oder die transform_outbound_multi_wrapped-Variante nutzen (folgt bei Bedarf — fuer Stufe 7 reicht die Submessage-Sequenz).

§Errors
  • Crypto durchgereicht.
  • PolicyViolation wenn ein Peer-Key nicht registriert ist.
Source

pub fn transform_inbound_group( &self, sender_peer_key: &PeerKey, own_peer_key: &PeerKey, wire: &[u8], ) -> Result<Vec<u8>, SecurityGateError>

Group-Inbound: dekodiert eine Multi-MAC-Submessage-Sequenz und validiert den eigenen MAC.

sender_peer_key ist der GuidPrefix des Senders (wie in Self::register_remote_by_guid registriert). Der Empfaenger- MAC-Key kommt aus ensure_local() — der Sender hat beim Encoding genau diesen Slot-Handle als remote_list-Eintrag gesetzt (via register_remote_by_guid(our_prefix, our_local_token)).

§Errors
  • PolicyViolation wenn sender_peer_key nicht registriert ist.
  • Crypto / Wrapper bei Tag-/MAC-Mismatch.
Source

pub fn transform_outbound_for( &self, _peer_key: &PeerKey, message: &[u8], level: ProtectionLevel, ) -> Result<Vec<u8>, SecurityGateError>

Peer-spezifische Outbound-Transform.

Im Gegensatz zu Self::transform_outbound ignoriert diese Methode die Domain-Rule und wendet stattdessen das Caller-gegebene ProtectionLevel an. Das ist die API, die der heterogeneous-Security-Writer-Tick (Per-Reader-Serializer) pro matched Reader aufruft.

  • ProtectionLevel::None → plaintext passthrough
  • ProtectionLevel::Sign → RTPS-Message-wrap (HMAC/GCM-Tag)
  • ProtectionLevel::Encrypt → RTPS-Message-wrap (AEAD-Ciphertext)

Die Sign/Encrypt-Unterscheidung nutzt heute denselben Encoder wie Self::transform_outbound — das aktuelle AesGcmCryptoPlugin differenziert nicht. Receiver-Specific-MACs und weitere Erweiterungen rüsten die Unterscheidung nach. Der peer_key wird mitgefuehrt (fuer zukuenftige pro-Peer-Crypto- Handles), aber noch nicht an den Plugin weitergereicht.

§Errors

Siehe SecurityGateError. Im None-Pfad nie ein Fehler.

Source

pub fn allow_unauthenticated(&self) -> Result<bool, SecurityGateError>

Liefert das allow_unauthenticated_participants-Flag aus der Domain-Rule. Default false wenn keine Rule fuer die Domain existiert — konservativ-sichere Haltung.

Source

pub fn classify_inbound( &self, bytes: &[u8], iface: &NetInterface, ) -> InboundVerdict

Klassifiziert ein eingehendes RTPS-Datagram gegen Domain-Rule, Peer-Registrierung, Wire-Format und Netzwerk-Interface .

Entscheidungs-Matrix:

  1. bytes.len() < 20Malformed.
  2. Extrahiere peer_key aus bytes[8..20].
  3. Wenn Paket SRTPS-gewrappt ist → Standard-Unwrap-Pfad (transform_inbound_from). Bei Crypto-Fehler CryptoError, bei unbekannter Peer PolicyViolation.
  4. Wenn Paket plain ist UND Domain ProtectionKind::None verlangt → Accept.
  5. Wenn Paket plain ist UND Domain Protection verlangt:
    • Interface ist Loopback oder LocalHostAccept (Bytes verlassen den Host-Kernel nicht — spec-konform plaintext auf Host-local Transport)
    • allow_unauthenticated_participants = trueAccept
    • sonst → LegacyBlocked

Der iface-Kontext wird derzeit in den Regeln nur fuer den Loopback-Fast-Path konsultiert; die feinere Peer-/Topic- Klassifizierung pro Interface uebernimmt die PolicyEngine ab Stufe 8 (Governance-XML <interface_bindings>).

Source

pub fn transform_inbound( &self, remote_slot: CryptoHandle, wire: &[u8], ) -> Result<Vec<u8>, SecurityGateError>

Inbound-Message: unwrap wenn SRTPS_PREFIX erkannt, sonst passthrough oder PolicyViolation.

remote_slot zeigt auf den Slot, in dem der Sender-Key abgelegt ist (aus Self::register_remote_with_token).

§Errors

Siehe SecurityGateError.

Trait Implementations§

Source§

impl Clone for SharedSecurityGate

Source§

fn clone(&self) -> SharedSecurityGate

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SharedSecurityGate

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.