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§
Sourcepub fn new(
domain_id: u32,
governance: Governance,
crypto: Box<dyn CryptographicPlugin>,
) -> Self
pub fn new( domain_id: u32, governance: Governance, crypto: Box<dyn CryptographicPlugin>, ) -> Self
Konstruktor. Der Plugin wird vom Gate geownt (Box).
Sourcepub fn domain_id(&self) -> Result<u32, SecurityGateError>
pub fn domain_id(&self) -> Result<u32, SecurityGateError>
Gibt die Domain-Id zurueck, fuer die der Gate laeuft.
Sourcepub fn message_protection(&self) -> Result<ProtectionKind, SecurityGateError>
pub fn message_protection(&self) -> Result<ProtectionKind, SecurityGateError>
ProtectionKind fuer Message-Level — abgeleitet aus dem ersten
matchenden <domain_rule>.
Sourcepub fn ensure_local(&self) -> Result<CryptoHandle, SecurityGateError>
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.
Sourcepub fn local_token(&self) -> Result<Vec<u8>, SecurityGateError>
pub fn local_token(&self) -> Result<Vec<u8>, SecurityGateError>
Sourcepub fn register_remote_with_token(
&self,
remote_identity: IdentityHandle,
shared_secret: SharedSecretHandle,
token: &[u8],
) -> Result<CryptoHandle, SecurityGateError>
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.
Sourcepub fn register_remote_by_guid(
&self,
peer_key: PeerKey,
remote_identity: IdentityHandle,
shared_secret: SharedSecretHandle,
token: &[u8],
) -> Result<CryptoHandle, SecurityGateError>
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.
Sourcepub fn forget_remote(&self, peer_key: &PeerKey) -> Result<(), SecurityGateError>
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).
Sourcepub fn slot_for(
&self,
peer_key: &PeerKey,
) -> Result<Option<CryptoHandle>, SecurityGateError>
pub fn slot_for( &self, peer_key: &PeerKey, ) -> Result<Option<CryptoHandle>, SecurityGateError>
Liefert den Slot fuer einen Peer-Key, falls registriert.
Sourcepub fn transform_inbound_from(
&self,
peer_key: &PeerKey,
wire: &[u8],
) -> Result<Vec<u8>, SecurityGateError>
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.
Sourcepub fn transform_outbound(
&self,
message: &[u8],
) -> Result<Vec<u8>, SecurityGateError>
pub fn transform_outbound( &self, message: &[u8], ) -> Result<Vec<u8>, SecurityGateError>
Sourcepub fn transform_outbound_group(
&self,
peer_keys: &[PeerKey],
plaintext: &[u8],
) -> Result<Vec<u8>, SecurityGateError>
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
Cryptodurchgereicht.PolicyViolationwenn ein Peer-Key nicht registriert ist.
Sourcepub fn transform_inbound_group(
&self,
sender_peer_key: &PeerKey,
own_peer_key: &PeerKey,
wire: &[u8],
) -> Result<Vec<u8>, SecurityGateError>
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
PolicyViolationwennsender_peer_keynicht registriert ist.Crypto/Wrapperbei Tag-/MAC-Mismatch.
Sourcepub fn transform_outbound_for(
&self,
_peer_key: &PeerKey,
message: &[u8],
level: ProtectionLevel,
) -> Result<Vec<u8>, SecurityGateError>
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 passthroughProtectionLevel::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.
Sourcepub fn allow_unauthenticated(&self) -> Result<bool, SecurityGateError>
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.
Sourcepub fn classify_inbound(
&self,
bytes: &[u8],
iface: &NetInterface,
) -> InboundVerdict
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:
bytes.len() < 20→Malformed.- Extrahiere
peer_keyausbytes[8..20]. - Wenn Paket SRTPS-gewrappt ist → Standard-Unwrap-Pfad
(
transform_inbound_from). Bei Crypto-FehlerCryptoError, bei unbekannter PeerPolicyViolation. - Wenn Paket plain ist UND Domain ProtectionKind::None verlangt
→
Accept. - Wenn Paket plain ist UND Domain Protection verlangt:
- Interface ist
LoopbackoderLocalHost→Accept(Bytes verlassen den Host-Kernel nicht — spec-konform plaintext auf Host-local Transport) allow_unauthenticated_participants = true→Accept- sonst →
LegacyBlocked
- Interface ist
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>).
Sourcepub fn transform_inbound(
&self,
remote_slot: CryptoHandle,
wire: &[u8],
) -> Result<Vec<u8>, SecurityGateError>
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§fn clone(&self) -> SharedSecurityGate
fn clone(&self) -> SharedSecurityGate
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more