syntax = "proto3"; package chat; message SignedPreKey { bytes signed_pre_key = 1; uint32 version = 2; } // X3DH prekey bundle message Bundle { // Identity key bytes identity = 1; // Installation id map signed_pre_keys = 2; // Prekey signature bytes signature = 4; // When the bundle was created locally int64 timestamp = 5; } message BundleContainer { reserved 3; // X3DH prekey bundle Bundle bundle = 1; // Private signed prekey bytes private_signed_pre_key = 2; } message DRHeader { // Current ratchet public key bytes key = 1; // Number of the message in the sending chain uint32 n = 2; // Length of the previous sending chain uint32 pn = 3; // Bundle ID bytes id = 4; } message DHHeader { // Compressed ephemeral public key bytes key = 1; } message X3DHHeader { reserved 3; // Ephemeral key used bytes key = 1; // Used bundle's signed prekey bytes id = 4; } // Direct message value message DirectMessageProtocol { X3DHHeader X3DH_header = 1; DRHeader DR_header = 2; DHHeader DH_header = 101; // Encrypted payload bytes payload = 3; } // Top-level protocol message message ProtocolMessage { // An optional bundle is exchanged with each message Bundle bundle = 1; // The device id of the sender string installation_id = 2; // List of bundles repeated Bundle bundles = 3; // One to one message, encrypted, indexed by installation_id map direct_message = 101; // Public chats, not encrypted bytes public_message = 102; }