add protocol message protobuf
This commit is contained in:
parent
2832e0f8f6
commit
341cd4714a
|
@ -0,0 +1,88 @@
|
|||
syntax = "proto3";
|
||||
|
||||
message SignedPreKey {
|
||||
bytes signed_pre_key = 1;
|
||||
uint32 version = 2;
|
||||
uint32 protocol_version = 3;
|
||||
}
|
||||
|
||||
// X3DH prekey bundle
|
||||
message Bundle {
|
||||
// Identity key
|
||||
bytes identity = 1;
|
||||
// Installation id
|
||||
map<string,SignedPreKey> 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;
|
||||
}
|
||||
|
||||
// Hash Ratchet Header
|
||||
message HRHeader {
|
||||
// community key ID
|
||||
uint32 key_id = 1;
|
||||
// Community message number for this key_id
|
||||
uint32 seq_no = 2;
|
||||
// Community ID
|
||||
string group_id = 3;
|
||||
}
|
||||
|
||||
// Direct message value
|
||||
message EncryptedMessageProtocol {
|
||||
X3DHHeader X3DH_header = 1;
|
||||
DRHeader DR_header = 2;
|
||||
DHHeader DH_header = 101;
|
||||
HRHeader HR_header = 102;
|
||||
// Encrypted payload
|
||||
bytes payload = 3;
|
||||
}
|
||||
|
||||
// Top-level protocol message
|
||||
message ProtocolMessage {
|
||||
// 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
|
||||
// TODO map here is redundant in case of community messages
|
||||
map<string,EncryptedMessageProtocol> encrypted_message = 101;
|
||||
|
||||
// Public chats, not encrypted
|
||||
bytes public_message = 102;
|
||||
}
|
|
@ -0,0 +1,223 @@
|
|||
/* eslint-disable import/export */
|
||||
/* eslint-disable @typescript-eslint/no-namespace */
|
||||
|
||||
import { encodeMessage, decodeMessage, message, bytes, uint32, int64, string } from 'protons-runtime'
|
||||
import type { Codec } from 'protons-runtime'
|
||||
|
||||
export interface SignedPreKey {
|
||||
signedPreKey: Uint8Array
|
||||
version: number
|
||||
protocolVersion: number
|
||||
}
|
||||
|
||||
export namespace SignedPreKey {
|
||||
export const codec = (): Codec<SignedPreKey> => {
|
||||
return message<SignedPreKey>({
|
||||
1: { name: 'signedPreKey', codec: bytes },
|
||||
2: { name: 'version', codec: uint32 },
|
||||
3: { name: 'protocolVersion', codec: uint32 }
|
||||
})
|
||||
}
|
||||
|
||||
export const encode = (obj: SignedPreKey): Uint8Array => {
|
||||
return encodeMessage(obj, SignedPreKey.codec())
|
||||
}
|
||||
|
||||
export const decode = (buf: Uint8Array): SignedPreKey => {
|
||||
return decodeMessage(buf, SignedPreKey.codec())
|
||||
}
|
||||
}
|
||||
|
||||
export interface Bundle {
|
||||
identity: Uint8Array
|
||||
signedPreKeys: SignedPreKey
|
||||
signature: Uint8Array
|
||||
timestamp: bigint
|
||||
}
|
||||
|
||||
export namespace Bundle {
|
||||
export const codec = (): Codec<Bundle> => {
|
||||
return message<Bundle>({
|
||||
1: { name: 'identity', codec: bytes },
|
||||
2: { name: 'signedPreKeys', codec: SignedPreKey.codec() },
|
||||
4: { name: 'signature', codec: bytes },
|
||||
5: { name: 'timestamp', codec: int64 }
|
||||
})
|
||||
}
|
||||
|
||||
export const encode = (obj: Bundle): Uint8Array => {
|
||||
return encodeMessage(obj, Bundle.codec())
|
||||
}
|
||||
|
||||
export const decode = (buf: Uint8Array): Bundle => {
|
||||
return decodeMessage(buf, Bundle.codec())
|
||||
}
|
||||
}
|
||||
|
||||
export interface BundleContainer {
|
||||
bundle: Bundle
|
||||
privateSignedPreKey: Uint8Array
|
||||
}
|
||||
|
||||
export namespace BundleContainer {
|
||||
export const codec = (): Codec<BundleContainer> => {
|
||||
return message<BundleContainer>({
|
||||
1: { name: 'bundle', codec: Bundle.codec() },
|
||||
2: { name: 'privateSignedPreKey', codec: bytes }
|
||||
})
|
||||
}
|
||||
|
||||
export const encode = (obj: BundleContainer): Uint8Array => {
|
||||
return encodeMessage(obj, BundleContainer.codec())
|
||||
}
|
||||
|
||||
export const decode = (buf: Uint8Array): BundleContainer => {
|
||||
return decodeMessage(buf, BundleContainer.codec())
|
||||
}
|
||||
}
|
||||
|
||||
export interface DRHeader {
|
||||
key: Uint8Array
|
||||
n: number
|
||||
pn: number
|
||||
id: Uint8Array
|
||||
}
|
||||
|
||||
export namespace DRHeader {
|
||||
export const codec = (): Codec<DRHeader> => {
|
||||
return message<DRHeader>({
|
||||
1: { name: 'key', codec: bytes },
|
||||
2: { name: 'n', codec: uint32 },
|
||||
3: { name: 'pn', codec: uint32 },
|
||||
4: { name: 'id', codec: bytes }
|
||||
})
|
||||
}
|
||||
|
||||
export const encode = (obj: DRHeader): Uint8Array => {
|
||||
return encodeMessage(obj, DRHeader.codec())
|
||||
}
|
||||
|
||||
export const decode = (buf: Uint8Array): DRHeader => {
|
||||
return decodeMessage(buf, DRHeader.codec())
|
||||
}
|
||||
}
|
||||
|
||||
export interface DHHeader {
|
||||
key: Uint8Array
|
||||
}
|
||||
|
||||
export namespace DHHeader {
|
||||
export const codec = (): Codec<DHHeader> => {
|
||||
return message<DHHeader>({
|
||||
1: { name: 'key', codec: bytes }
|
||||
})
|
||||
}
|
||||
|
||||
export const encode = (obj: DHHeader): Uint8Array => {
|
||||
return encodeMessage(obj, DHHeader.codec())
|
||||
}
|
||||
|
||||
export const decode = (buf: Uint8Array): DHHeader => {
|
||||
return decodeMessage(buf, DHHeader.codec())
|
||||
}
|
||||
}
|
||||
|
||||
export interface X3DHHeader {
|
||||
key: Uint8Array
|
||||
id: Uint8Array
|
||||
}
|
||||
|
||||
export namespace X3DHHeader {
|
||||
export const codec = (): Codec<X3DHHeader> => {
|
||||
return message<X3DHHeader>({
|
||||
1: { name: 'key', codec: bytes },
|
||||
4: { name: 'id', codec: bytes }
|
||||
})
|
||||
}
|
||||
|
||||
export const encode = (obj: X3DHHeader): Uint8Array => {
|
||||
return encodeMessage(obj, X3DHHeader.codec())
|
||||
}
|
||||
|
||||
export const decode = (buf: Uint8Array): X3DHHeader => {
|
||||
return decodeMessage(buf, X3DHHeader.codec())
|
||||
}
|
||||
}
|
||||
|
||||
export interface HRHeader {
|
||||
keyId: number
|
||||
seqNo: number
|
||||
groupId: string
|
||||
}
|
||||
|
||||
export namespace HRHeader {
|
||||
export const codec = (): Codec<HRHeader> => {
|
||||
return message<HRHeader>({
|
||||
1: { name: 'keyId', codec: uint32 },
|
||||
2: { name: 'seqNo', codec: uint32 },
|
||||
3: { name: 'groupId', codec: string }
|
||||
})
|
||||
}
|
||||
|
||||
export const encode = (obj: HRHeader): Uint8Array => {
|
||||
return encodeMessage(obj, HRHeader.codec())
|
||||
}
|
||||
|
||||
export const decode = (buf: Uint8Array): HRHeader => {
|
||||
return decodeMessage(buf, HRHeader.codec())
|
||||
}
|
||||
}
|
||||
|
||||
export interface EncryptedMessageProtocol {
|
||||
X3DHHeader: X3DHHeader
|
||||
DRHeader: DRHeader
|
||||
DHHeader: DHHeader
|
||||
HRHeader: HRHeader
|
||||
payload: Uint8Array
|
||||
}
|
||||
|
||||
export namespace EncryptedMessageProtocol {
|
||||
export const codec = (): Codec<EncryptedMessageProtocol> => {
|
||||
return message<EncryptedMessageProtocol>({
|
||||
1: { name: 'X3DHHeader', codec: X3DHHeader.codec() },
|
||||
2: { name: 'DRHeader', codec: DRHeader.codec() },
|
||||
101: { name: 'DHHeader', codec: DHHeader.codec() },
|
||||
102: { name: 'HRHeader', codec: HRHeader.codec() },
|
||||
3: { name: 'payload', codec: bytes }
|
||||
})
|
||||
}
|
||||
|
||||
export const encode = (obj: EncryptedMessageProtocol): Uint8Array => {
|
||||
return encodeMessage(obj, EncryptedMessageProtocol.codec())
|
||||
}
|
||||
|
||||
export const decode = (buf: Uint8Array): EncryptedMessageProtocol => {
|
||||
return decodeMessage(buf, EncryptedMessageProtocol.codec())
|
||||
}
|
||||
}
|
||||
|
||||
export interface ProtocolMessage {
|
||||
installationId: string
|
||||
bundles: Bundle[]
|
||||
encryptedMessage: EncryptedMessageProtocol
|
||||
publicMessage: Uint8Array
|
||||
}
|
||||
|
||||
export namespace ProtocolMessage {
|
||||
export const codec = (): Codec<ProtocolMessage> => {
|
||||
return message<ProtocolMessage>({
|
||||
2: { name: 'installationId', codec: string },
|
||||
3: { name: 'bundles', codec: Bundle.codec(), repeats: true },
|
||||
101: { name: 'encryptedMessage', codec: EncryptedMessageProtocol.codec() },
|
||||
102: { name: 'publicMessage', codec: bytes }
|
||||
})
|
||||
}
|
||||
|
||||
export const encode = (obj: ProtocolMessage): Uint8Array => {
|
||||
return encodeMessage(obj, ProtocolMessage.codec())
|
||||
}
|
||||
|
||||
export const decode = (buf: Uint8Array): ProtocolMessage => {
|
||||
return decodeMessage(buf, ProtocolMessage.codec())
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue