You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: standards/application/privatev1.md
+28-13Lines changed: 28 additions & 13 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -9,7 +9,7 @@ contributors:
9
9
10
10
# Abstract
11
11
12
-
This specification defines PRIVATE1, a conversation protocol for establishing secure, full-duplex encrypted communication channels between two participants. PRIVATE1 provides end-to-end encryption with forward secrecy and post-compromise security using the DoubleRatchet algorithm, combined with reliable message delivery via Scalable Data Sync (SDS) and efficient segmentation for transport-constrained environments.
12
+
This specification defines PRIVATE1, a conversation protocol for establishing secure, full-duplex encrypted communication channels between two participants. PRIVATE1 provides end-to-end encryption with forward secrecy and post-compromise security using the Double Ratchet algorithm, combined with reliable message delivery via Scalable Data Sync (SDS) and efficient segmentation for transport-constrained environments.
13
13
14
14
The protocol is transport-agnostic and designed to support both direct messaging and as a foundation for group communication systems. PRIVATE1 ensures payload confidentiality, content integrity, sender privacy, and message reliability while remaining resilient to network disruptions and message reordering.
15
15
@@ -24,7 +24,7 @@ However, being encrypted is merely the starting point, not the complete solution
24
24
25
25
# Private V1
26
26
27
-
PrivateV1 is a conversation type specification that establishes a full-duplex secure communication channel between two participants. It combines the Double Ratchet algorithm for encryption with Scalable Data Sync (SDS) for reliable delivery and an efficient segmentation strategy to handle transport constraints.
27
+
PRIVATE1 is a conversation type specification that establishes a full-duplex secure communication channel between two participants. It combines the Double Ratchet algorithm for encryption with Scalable Data Sync (SDS) for reliable delivery and an efficient segmentation strategy to handle transport constraints.
28
28
29
29
PRIVATE1 provides the following properties:
30
30
@@ -56,7 +56,7 @@ It also assumes that some other component is responsible for delivering the gene
56
56
57
57
```mermaid
58
58
flowchart LR
59
-
Content:::plain--> Privatev1 --> Payload:::plain
59
+
Content:::plain--> PrivateV1 --> Payload:::plain
60
60
classDef plain fill:none,stroke:transparent;
61
61
```
62
62
### Content
@@ -68,9 +68,9 @@ Applications provide content as encoded bytes, which is then packaged into paylo
68
68
Content MUST be smaller than `255 * max_seg_size`
69
69
due to segmentation protocol limitations.
70
70
71
-
**Agnostic**
71
+
**Structure**
72
72
73
-
The protocol treats the contents as a arbitrary sequence of bytes and is agnostic to its contents.
73
+
The protocol treats the contents as an arbitrary sequence of bytes and is agnostic to its contents.
74
74
75
75
### Payload Delivery
76
76
How payloads are sent and received by clients is deliberately not specified by this protocol.
@@ -81,7 +81,7 @@ Confidentiality, integrity, and forward secrecy are provided regardless of how p
81
81
However, transport choice may affect other properties and characteristics.
82
82
83
83
**Recipient Privacy:**
84
-
The routing/addressing layer may leak sensitive metadata including the recipients identity. The payloads generated by this protocol do not reveal the participants of a conversation, however the overall privacy properties are determined by the delivery mechanism used to transport payloads.
84
+
The routing/addressing layer may leak sensitive metadata including the recipient's identity. The payloads generated by this protocol do not reveal the participants of a conversation, however the overall privacy properties are determined by the delivery mechanism used to transport payloads.
85
85
86
86
**Reliability Performance**
87
87
While PRIVATE1 handles message losses, more reliable transports reduce retransmission overhead.
@@ -106,7 +106,7 @@ PRIVATE1 requires a unique identifier, however the exact derivation is left to i
106
106
107
107
Additionally implementations MUST determine the following constants:
108
108
-`max_seg_size` - maximum segmentation size to be used.
109
-
-`max_skip` - number of keys which can be skipped per session. Values are determined by
109
+
-`max_skip` - number of keys which can be skipped per session.
110
110
111
111
## Value Derivations
112
112
@@ -196,7 +196,7 @@ The following mappings connect PRIVATE1 concepts to SDS fields:
196
196
-`channel_id`: uses the `conversation_id` parameter.
197
197
198
198
**Sender Validation**
199
-
SDS uses a `sender_id` payload field to determine whether a message was sent by the remote party. This value is sender reported and not validated which can have unknown implications if trusted in other contexts. For security hygiene Clients SHOULD drop SDS messages if `sender_id` != the sender derived from the encryption layer. !TODO: PrivateV1 is not sender aware currently
199
+
SDS uses a `sender_id` payload field to determine whether a message was sent by the remote party. This value is sender reported and not validated which can have unknown implications if trusted in other contexts. For security hygiene Clients SHOULD drop SDS messages if `sender_id` != the sender derived from the encryption layer. !TODO: PRIVATE1 is not sender aware currently
200
200
201
201
**Bloom Filter Configuration**
202
202
@@ -291,7 +291,7 @@ flowchart TD
291
291
292
292
### Encrypted Payload
293
293
```protobuf
294
-
message Doubleratchet {
294
+
message DoubleRatchet {
295
295
bytes dh = 1; // 32 byte publickey
296
296
uint32 msgNum = 2;
297
297
uint32 prevChainLen = 3;
@@ -322,7 +322,7 @@ message Message {
322
322
}
323
323
```
324
324
325
-
**content:** This field is an protobuf encoded `Segment`
325
+
**content:** This field is a protobuf encoded `Segment`
326
326
327
327
### Segmentation
328
328
@@ -345,7 +345,7 @@ message SegmentMessageProto {
345
345
346
346
!TODO: This should be encoded as a FrameType so it can be optional.
347
347
348
-
### Frame
348
+
### PrivateV1Frame
349
349
350
350
```protobuf
351
351
message PrivateV1Frame {
@@ -377,15 +377,15 @@ This means that senders SHOULD generate a new ephemeral key for `ssk` for every
377
377
### Excessive Skipped Message
378
378
379
379
Handling of skipped message keys is not strictly defined in double ratchet.
380
-
Implementations need to choose an strategy which works best for their environment, and delivery mechanism.
380
+
Implementations need to choose a strategy which works best for their environment, and delivery mechanism.
381
381
Halting operation of the channel is the safest, as it bounds resource utilization in the event of a DOS attack but is not always possible.
382
382
383
383
If eventual delivery of messages is not guaranteed, implementors should regularly delete keys that are older than a given time window.
384
384
Unreliable delivery mechanisms will result in increased key storage over time, as more messages are lost with no hope of delivery.
385
385
386
386
## Security/Privacy Considerations
387
387
388
-
### Sender Deniability and Authentication**
388
+
### Sender Deniability and Authentication
389
389
390
390
Encrypted messages do not have a cryptographically provable sender to third parties due to the deniability property of the Double Ratchet algorithm.
391
391
However, participants in a conversation can authenticate each other through the shared cryptographic state.
@@ -400,3 +400,18 @@ Without proper authentication during initialization, an adversary could perform
400
400
Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).
401
401
402
402
403
+
## References
404
+
-**[DOUBLERATCHET]** "The Double Ratchet Algorithm", Signal, 2016.
0 commit comments