diff --git a/src/ironforce.rs b/src/ironforce.rs index 2f7ed9c..f5f4ad8 100644 --- a/src/ironforce.rs +++ b/src/ironforce.rs @@ -1,3 +1,5 @@ -pub struct IronForce { +use crate::transport::Transport; +pub struct IronForce { + transport: Transport } diff --git a/src/lib.rs b/src/lib.rs index 2cafc3d..56859e4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,6 +13,7 @@ mod transport; mod interface; mod interfaces; mod res; +mod tunnel; #[cfg(test)] mod tests { diff --git a/src/message.rs b/src/message.rs index ffd4ef2..359a961 100644 --- a/src/message.rs +++ b/src/message.rs @@ -1,5 +1,79 @@ use alloc::vec::Vec; +use crate::crypto::{Keys, PublicKey}; +use crate::res::IFResult; +use crate::tunnel::TunnelPublic; /// A serialized message pub(crate) type MessageBytes = Vec; + + +pub enum Signature { + /// The message is signed. Author is unknown + NotSigned, + /// The message is signed with the sender's key visible to everyone + Signed { + sender: PublicKey, + signature: Vec, + }, + /// Sender's key is encrypted for the recipient + SignedPrivately { + sender_encrypted: Vec, + signature: Vec, + } +} + +pub enum MessageType { + SingleCast, + Broadcast, + Service(ServiceMessageType), +} + +pub enum ServiceMessageType { + TunnelBuilding(TunnelPublic) +} + +pub enum MessageContent { + /// Just plaintext message content + Plain(Vec), + /// Message content bytes encrypted for the recipient + Encrypted(Vec), +} + +pub struct Message { + /// Content of the message (not to be confused with the bytes that we are sending through interfaces) + content: MessageContent, + /// The type of this message + message_type: MessageType, + /// Sender's signature + signature: Signature, + /// A random number that is used in hash together with the content + salt: u64, + /// Hash of message content and the salt + hash: Vec, + /// Optional: hash of the message encrypted for the recipient, so that the recipient can know that this message is for them, but nobody else + recipient_verification: Option>, + /// ID of the tunnel that is used + tunnel_id: u64, +} + +impl Message { + /// Verify message's hash + pub fn verify(&self) -> bool { + todo!() + } + + /// Check if this message is for this set of keys + pub fn check_recipient(&self, _keys: Keys) -> bool { + todo!() + } + + /// Get decrypted content of the message + pub fn get_decrypted(&self, _keys: Keys) -> IFResult> { + todo!() + } + + pub fn calculate_hash(_content: MessageContent, _message_type: MessageType, _sender: Option) -> Vec { + todo!() + } +} diff --git a/src/tunnel.rs b/src/tunnel.rs new file mode 100644 index 0000000..ac44110 --- /dev/null +++ b/src/tunnel.rs @@ -0,0 +1,30 @@ +use alloc::vec::Vec; +use crate::crypto::PublicKey; + +/// A tunnel that is used for communication +pub struct Tunnel { + /// Tunnel's id + id: Option, + /// Ids that are + local_ids: Vec, + /// Ids of peers (in transport) by which we can send a message - one for backward direction, another for forward + peer_ids: (u64, u64), + /// Time at which this tunnel should be destroyed (UNIX epoch) + ttd: u64, + /// Public keys of nodes + nodes_in_tunnel: Option>, + /// Is this tunnel used for multicast? + is_multicast: bool, +} + +/// Tunnel, but only the fields that are ok to share +pub struct TunnelPublic { + /// Tunnel's id + id: Option, + /// Ids that are + local_ids: Vec, + /// Time at which this tunnel should be destroyed (UNIX epoch) + ttd: u64, + /// Public keys of nodes + nodes_in_tunnel: Option>, +}