pub struct SecureMessageChannel {
encryption_key: LessSafeKey,
hmac_key: Vec<u8>,
}Expand description
Secure message channel with encryption and authentication
This structure provides AES-256-GCM encryption with HMAC authentication for secure IPC communication. It ensures message confidentiality and integrity.
§Encryption Flow
TauriIPCMessage
|
| 1. Serialize to JSON
v
Serialized bytes
|
| 2. Encrypt with AES-256-GCM
v
Encrypted bytes + auth tag
|
| 3. Generate HMAC
v
EncryptedMessage (nonce, ciphertext, hmac_tag)§Decryption Flow
EncryptedMessage
|
| 1. Verify HMAC
v
HMAC valid
|
| 2. Decrypt with AES-256-GCM
v
Serialized bytes
|
| 3. Deserialize to TauriIPCMessage
v
TauriIPCMessage§Security Features
- AES-256-GCM: Industry-standard authenticated encryption
- Unique Nonces: Each encryption uses a unique nonce
- HMAC Authentication: Additional layer of message authentication
- Secure Random Generation: Cryptographically secure random keys
§Example Usage
let secure_channel = SecureMessageChannel::new()?;
// Encrypt a message
let encrypted = secure_channel.encrypt_message(&message)?;
// Decrypt a message
let decrypted = secure_channel.decrypt_message(&encrypted)?;
// Rotate keys
secure_channel.rotate_keys()?;Fields§
§encryption_key: LessSafeKeyAES-256-GCM encryption key
hmac_key: Vec<u8>HMAC key for message authentication
Implementations§
Source§impl SecureMessageChannel
impl SecureMessageChannel
Sourcepub fn new() -> Result<Self, String>
pub fn new() -> Result<Self, String>
Create a new secure channel with randomly generated keys
This method generates cryptographically secure random keys for encryption and HMAC authentication.
§Returns
Ok(SecureMessageChannel): New secure channelErr(String): Error message if key generation fails
§Example
let secure_channel = SecureMessageChannel::new()?;Sourcepub fn encrypt_message(
&self,
message: &TauriIPCMessage,
) -> Result<EncryptedMessage, String>
pub fn encrypt_message( &self, message: &TauriIPCMessage, ) -> Result<EncryptedMessage, String>
Encrypt and authenticate a message
This method serializes the message, encrypts it with AES-256-GCM, and adds an HMAC tag for authentication.
§Parameters
message: The message to encrypt
§Returns
Ok(EncryptedMessage): Encrypted message with nonce and HMAC tagErr(String): Error message if encryption fails
§Example
let encrypted = secure_channel.encrypt_message(&message)?;Sourcepub fn decrypt_message(
&self,
encrypted: &EncryptedMessage,
) -> Result<TauriIPCMessage, String>
pub fn decrypt_message( &self, encrypted: &EncryptedMessage, ) -> Result<TauriIPCMessage, String>
Decrypt and verify a message
This method verifies the HMAC tag, decrypts the message with AES-256-GCM, and deserializes it back to the original format.
§Parameters
encrypted: The encrypted message to decrypt
§Returns
Ok(TauriIPCMessage): Decrypted messageErr(String): Error message if decryption or verification fails
§Example
let decrypted = secure_channel.decrypt_message(&encrypted)?;Sourcepub fn rotate_keys(&mut self) -> Result<(), String>
pub fn rotate_keys(&mut self) -> Result<(), String>
Sourcepub fn hmac_tag_length(&self) -> usize
pub fn hmac_tag_length(&self) -> usize
Get the HMAC tag length (in bytes)
Sourcepub fn nonce_length(&self) -> usize
pub fn nonce_length(&self) -> usize
Get the nonce length (in bytes)
Sourcepub fn auth_tag_length(&self) -> usize
pub fn auth_tag_length(&self) -> usize
Get the authentication tag length (in bytes)
Sourcepub fn key_length(&self) -> usize
pub fn key_length(&self) -> usize
Get the key length (in bytes)
Auto Trait Implementations§
impl Freeze for SecureMessageChannel
impl RefUnwindSafe for SecureMessageChannel
impl Send for SecureMessageChannel
impl Sync for SecureMessageChannel
impl Unpin for SecureMessageChannel
impl UnwindSafe for SecureMessageChannel
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request§impl<L> LayerExt<L> for L
impl<L> LayerExt<L> for L
§fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
Layered].