pub struct DeRecMessage {
pub protocol_version_major: u32,
pub protocol_version_minor: u32,
pub sequence: u32,
pub channel_id: u64,
pub timestamp: Option<Timestamp>,
pub message: Vec<u8>,
}Expand description
DeRecMessage is the top-level protocol envelope for all DeRec messages, except ContactMessage which is exchanged out-of-band during pairing.
This message represents the unit of communication between an Owner and a Helper once a secure channel has been established. Every protocol exchange (pairing, sharing, verification, recovery, etc.) is carried inside this envelope.
§Security Model
The DeRecMessage envelope itself is not responsible for confidentiality or authenticity. Instead:
- The
messagefield contains encrypted bytes representing the inner message - Encryption and signing are applied at the payload level prior to transport
Implementations MUST ensure that:
- The inner message is encrypted using the agreed channel keys
- The envelope metadata is treated as untrusted until the payload is verified
§Semantics
A DeRecMessage provides:
- protocol versioning information for compatibility handling
- ordering guarantees via a monotonically increasing sequence number
- channel identification for routing and key selection
- a timestamp for replay protection and observability
- an encrypted payload containing exactly one protocol message
The envelope is transport-agnostic and can be delivered over any supported transport (e.g., HTTPS, message queues), as defined by TransportProtocol.
§Ordering and Idempotency
Communication follows a request/response pattern:
- The Owner sends a request message
- The Helper replies with a corresponding response
The sequence field is used to:
- enforce message ordering
- detect duplicates or out-of-order delivery
- support replay protection
Implementations SHOULD treat messages as idempotent and be resilient to retries and duplicate deliveries.
§Key Rotation
The sequence number may also be used as a trigger for automatic key rotation. When a configured threshold is reached, implementations MAY initiate a key rotation flow to maintain forward secrecy.
§Versioning
The protocolVersionMajor and protocolVersionMinor fields allow peers to:
- detect incompatible protocol versions
- apply backward-compatible parsing logic when possible
Implementations MUST define behavior for handling version mismatches.
§Payload Encoding
The message field contains encrypted raw bytes. When decrypted, these bytes
MUST deserialize into a MessageBody, which contains exactly one concrete
protocol message.
The oneof structure ensures that each DeRecMessage carries a single logical operation.
Fields§
§protocol_version_major: u32DeRec protocol major version.
Incremented for breaking changes that are not backward compatible.
protocol_version_minor: u32DeRec protocol minor version.
Incremented for backward-compatible changes such as adding new fields or message types.
sequence: u32Monotonically increasing message sequence number.
This value increments by 1 for each message sent on a given channel. It is used to:
- enforce ordering
- detect duplicates or missing messages
- support replay protection
Implementations MAY also use this value to trigger automatic key rotation once a predefined threshold is reached.
channel_id: u64Channel identifier associated with this communication session.
This value uniquely identifies the logical channel between an Owner and a Helper for a given secret. It is established during pairing and used thereafter to:
- route messages to the correct channel state
- select the appropriate cryptographic keys
This MUST match the channelId exchanged during the ContactMessage phase.
timestamp: Option<Timestamp>Timestamp indicating when the sender created this message.
This value is expressed in UTC and can be used for:
- replay detection
- timeout handling
- logging and observability
Implementations SHOULD NOT rely solely on this value for security-critical decisions without additional protections.
message: Vec<u8>Encrypted message payload.
This field contains the encrypted bytes of a serialized MessageBody. The encryption scheme and key material are defined by the pairing process and subsequent key management flows.
Upon decryption, this field MUST deserialize into a valid MessageBody containing exactly one protocol message.
Trait Implementations§
Source§impl Clone for DeRecMessage
impl Clone for DeRecMessage
Source§fn clone(&self) -> DeRecMessage
fn clone(&self) -> DeRecMessage
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for DeRecMessage
impl Debug for DeRecMessage
Source§impl Default for DeRecMessage
impl Default for DeRecMessage
Source§impl Hash for DeRecMessage
impl Hash for DeRecMessage
Source§impl Message for DeRecMessage
impl Message for DeRecMessage
Source§fn encoded_len(&self) -> usize
fn encoded_len(&self) -> usize
Source§fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>where
Self: Sized,
fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>where
Self: Sized,
Source§fn encode_to_vec(&self) -> Vec<u8> ⓘwhere
Self: Sized,
fn encode_to_vec(&self) -> Vec<u8> ⓘwhere
Self: Sized,
Source§fn encode_length_delimited(
&self,
buf: &mut impl BufMut,
) -> Result<(), EncodeError>where
Self: Sized,
fn encode_length_delimited(
&self,
buf: &mut impl BufMut,
) -> Result<(), EncodeError>where
Self: Sized,
Source§fn encode_length_delimited_to_vec(&self) -> Vec<u8> ⓘwhere
Self: Sized,
fn encode_length_delimited_to_vec(&self) -> Vec<u8> ⓘwhere
Self: Sized,
Source§fn decode(buf: impl Buf) -> Result<Self, DecodeError>where
Self: Default,
fn decode(buf: impl Buf) -> Result<Self, DecodeError>where
Self: Default,
Source§fn decode_length_delimited(buf: impl Buf) -> Result<Self, DecodeError>where
Self: Default,
fn decode_length_delimited(buf: impl Buf) -> Result<Self, DecodeError>where
Self: Default,
Source§fn merge(&mut self, buf: impl Buf) -> Result<(), DecodeError>where
Self: Sized,
fn merge(&mut self, buf: impl Buf) -> Result<(), DecodeError>where
Self: Sized,
self. Read moreSource§fn merge_length_delimited(&mut self, buf: impl Buf) -> Result<(), DecodeError>where
Self: Sized,
fn merge_length_delimited(&mut self, buf: impl Buf) -> Result<(), DecodeError>where
Self: Sized,
self.