57 lines
2.6 KiB
Markdown
57 lines
2.6 KiB
Markdown
|
# Message Formats
|
||
|
|
||
|
## Peer to Peer Messages
|
||
|
|
||
|
PeerMessage {
|
||
|
ID string // A unique Message ID (primarily used for acknowledgments)
|
||
|
Context string // A unique context identifier i.e. im.cwtch.chat
|
||
|
Data []byte // The context-dependent serialized data packet.
|
||
|
}
|
||
|
|
||
|
### Context Identifiers
|
||
|
|
||
|
* `im.cwtch.raw` - Data contains a plain text chat message (see: [overlays](./overlays.md) for more information)
|
||
|
* `im.cwtch.acknowledgement` - Data is empty and ID references a previously sent message
|
||
|
|
||
|
* `im.cwtch.getVal` and `im.cwtch.retVal` - Used for requesting / returning specific information about a peer. Data
|
||
|
contains a serialized `peerGetVal` structure and `peerRetVal` respectively.
|
||
|
|
||
|
peerGetVal struct {
|
||
|
Scope string
|
||
|
Path string
|
||
|
}
|
||
|
|
||
|
type peerRetVal struct {
|
||
|
Val string // Serialized path-dependent value
|
||
|
Exists bool
|
||
|
}
|
||
|
|
||
|
## Plaintext / Decrypted Group Messages
|
||
|
|
||
|
type DecryptedGroupMessage struct {
|
||
|
Text string // plaintext of the message
|
||
|
Onion string // The cwtch address of the sender
|
||
|
Timestamp uint64 // A user specified timestamp
|
||
|
// NOTE: SignedGroupID is now a misnomer, the only way this is signed is indirectly via the signed encrypted group messages
|
||
|
// We now treat GroupID as binding to a server/key rather than an "owner" - additional validation logic (to e.g.
|
||
|
// respect particular group constitutions) can be built on top of group messages, but the underlying groups are
|
||
|
// now agnostic to those models.
|
||
|
SignedGroupID []byte
|
||
|
PreviousMessageSig []byte // A reference to a previous message
|
||
|
Padding []byte // random bytes of length = 1800 - len(Text)
|
||
|
}
|
||
|
|
||
|
DecryptedGroupMessage contains random padding to a fixed size that is equal to the length of all fixed length fields + 1800.
|
||
|
This ensures that all encrypted group messages are equal length.
|
||
|
|
||
|
## Encrypted Group Messages
|
||
|
|
||
|
// EncryptedGroupMessage provides an encapsulation of the encrypted group message stored on the server
|
||
|
type EncryptedGroupMessage struct {
|
||
|
Ciphertext []byte
|
||
|
Signature []byte // Sign(groupID + group.GroupServer + base64(decrypted group message)) using the senders cwtch key
|
||
|
}
|
||
|
|
||
|
Calculating the signature requires knowing the groupID of the message, the server the group is associated with
|
||
|
and the decrypted group message (and thus, the Group Key). It is (ed25519) signed by the sender of the message, and can be
|
||
|
verified using their public cwtch address key.
|