clanka 0.2.47 → 0.2.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ScriptPreprocessing.d.ts.map +1 -1
- package/dist/ScriptPreprocessing.js +48 -0
- package/dist/ScriptPreprocessing.js.map +1 -1
- package/dist/ScriptPreprocessing.test.js +1 -0
- package/dist/ScriptPreprocessing.test.js.map +1 -1
- package/package.json +1 -1
- package/src/ScriptPreprocessing.test.ts +1 -0
- package/src/ScriptPreprocessing.ts +71 -0
- package/src/fixtures/patch20-broken.txt +493 -0
- package/src/fixtures/patch20-fixed.txt +493 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScriptPreprocessing.d.ts","sourceRoot":"","sources":["../src/ScriptPreprocessing.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ScriptPreprocessing.d.ts","sourceRoot":"","sources":["../src/ScriptPreprocessing.ts"],"names":[],"mappings":"AAutCA,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,KAAG,MACM,CAAA"}
|
|
@@ -642,6 +642,39 @@ const collectObjectPropertyIdentifiers = (script, target) => {
|
|
|
642
642
|
}
|
|
643
643
|
return identifiers;
|
|
644
644
|
};
|
|
645
|
+
const collectAssignedValueRootIdentifiers = (script, variableName) => {
|
|
646
|
+
const identifiers = new Set();
|
|
647
|
+
let cursor = 0;
|
|
648
|
+
while (cursor < script.length) {
|
|
649
|
+
const variableStart = findNextIdentifier(script, variableName, cursor);
|
|
650
|
+
if (variableStart === -1) {
|
|
651
|
+
break;
|
|
652
|
+
}
|
|
653
|
+
let assignmentStart = skipWhitespace(script, variableStart + variableName.length);
|
|
654
|
+
if (script[assignmentStart] === ":") {
|
|
655
|
+
assignmentStart = findTypeAnnotationAssignment(script, assignmentStart + 1);
|
|
656
|
+
if (assignmentStart === -1) {
|
|
657
|
+
cursor = variableStart + variableName.length;
|
|
658
|
+
continue;
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
if (script[assignmentStart] !== "=" ||
|
|
662
|
+
script[assignmentStart + 1] === "=" ||
|
|
663
|
+
script[assignmentStart + 1] === ">") {
|
|
664
|
+
cursor = variableStart + variableName.length;
|
|
665
|
+
continue;
|
|
666
|
+
}
|
|
667
|
+
const valueStart = skipWhitespace(script, assignmentStart + 1);
|
|
668
|
+
const rootIdentifier = parseIdentifier(script, valueStart);
|
|
669
|
+
if (rootIdentifier !== undefined) {
|
|
670
|
+
identifiers.add(rootIdentifier.name);
|
|
671
|
+
cursor = rootIdentifier.end;
|
|
672
|
+
continue;
|
|
673
|
+
}
|
|
674
|
+
cursor = valueStart + 1;
|
|
675
|
+
}
|
|
676
|
+
return identifiers;
|
|
677
|
+
};
|
|
645
678
|
const rewriteAssignedTemplate = (script, variableName) => rewriteTemplateContents(script, (text, from) => {
|
|
646
679
|
let cursor = from;
|
|
647
680
|
while (cursor < text.length) {
|
|
@@ -768,6 +801,21 @@ const collectReferencedTemplateIdentifiers = (script) => {
|
|
|
768
801
|
if (script.includes("*** Begin Patch")) {
|
|
769
802
|
templateIdentifiers.add("patch");
|
|
770
803
|
}
|
|
804
|
+
const pendingIdentifiers = Array.from(templateIdentifiers);
|
|
805
|
+
const visitedIdentifiers = new Set();
|
|
806
|
+
while (pendingIdentifiers.length > 0) {
|
|
807
|
+
const identifier = pendingIdentifiers.pop();
|
|
808
|
+
if (visitedIdentifiers.has(identifier)) {
|
|
809
|
+
continue;
|
|
810
|
+
}
|
|
811
|
+
visitedIdentifiers.add(identifier);
|
|
812
|
+
for (const source of collectAssignedValueRootIdentifiers(script, identifier)) {
|
|
813
|
+
if (!templateIdentifiers.has(source)) {
|
|
814
|
+
templateIdentifiers.add(source);
|
|
815
|
+
pendingIdentifiers.push(source);
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
}
|
|
771
819
|
const objectIdentifiers = new Set();
|
|
772
820
|
for (const identifier of templateIdentifiers) {
|
|
773
821
|
for (const source of collectObjectEntryMapSources(script, identifier)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScriptPreprocessing.js","sourceRoot":"","sources":["../src/ScriptPreprocessing.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ScriptPreprocessing.js","sourceRoot":"","sources":["../src/ScriptPreprocessing.ts"],"names":[],"mappings":"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"}
|
|
@@ -119,6 +119,7 @@ describe("preprocessScript", () => {
|
|
|
119
119
|
"patch17",
|
|
120
120
|
"patch18",
|
|
121
121
|
"patch19",
|
|
122
|
+
"patch20",
|
|
122
123
|
])("fixes broken %s", (fixture) => {
|
|
123
124
|
const content = readFileSync(join(__dirname, "fixtures", `${fixture}-broken.txt`), "utf-8");
|
|
124
125
|
const fixed = readFileSync(join(__dirname, "fixtures", `${fixture}-fixed.txt`), "utf-8");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScriptPreprocessing.test.js","sourceRoot":"","sources":["../src/ScriptPreprocessing.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ScriptPreprocessing.test.js","sourceRoot":"","sources":["../src/ScriptPreprocessing.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -926,6 +926,57 @@ const collectObjectPropertyIdentifiers = (
|
|
|
926
926
|
return identifiers
|
|
927
927
|
}
|
|
928
928
|
|
|
929
|
+
const collectAssignedValueRootIdentifiers = (
|
|
930
|
+
script: string,
|
|
931
|
+
variableName: string,
|
|
932
|
+
): ReadonlySet<string> => {
|
|
933
|
+
const identifiers = new Set<string>()
|
|
934
|
+
let cursor = 0
|
|
935
|
+
|
|
936
|
+
while (cursor < script.length) {
|
|
937
|
+
const variableStart = findNextIdentifier(script, variableName, cursor)
|
|
938
|
+
if (variableStart === -1) {
|
|
939
|
+
break
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
let assignmentStart = skipWhitespace(
|
|
943
|
+
script,
|
|
944
|
+
variableStart + variableName.length,
|
|
945
|
+
)
|
|
946
|
+
if (script[assignmentStart] === ":") {
|
|
947
|
+
assignmentStart = findTypeAnnotationAssignment(
|
|
948
|
+
script,
|
|
949
|
+
assignmentStart + 1,
|
|
950
|
+
)
|
|
951
|
+
if (assignmentStart === -1) {
|
|
952
|
+
cursor = variableStart + variableName.length
|
|
953
|
+
continue
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
if (
|
|
958
|
+
script[assignmentStart] !== "=" ||
|
|
959
|
+
script[assignmentStart + 1] === "=" ||
|
|
960
|
+
script[assignmentStart + 1] === ">"
|
|
961
|
+
) {
|
|
962
|
+
cursor = variableStart + variableName.length
|
|
963
|
+
continue
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
const valueStart = skipWhitespace(script, assignmentStart + 1)
|
|
967
|
+
const rootIdentifier = parseIdentifier(script, valueStart)
|
|
968
|
+
if (rootIdentifier !== undefined) {
|
|
969
|
+
identifiers.add(rootIdentifier.name)
|
|
970
|
+
cursor = rootIdentifier.end
|
|
971
|
+
continue
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
cursor = valueStart + 1
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
return identifiers
|
|
978
|
+
}
|
|
979
|
+
|
|
929
980
|
const rewriteAssignedTemplate = (
|
|
930
981
|
script: string,
|
|
931
982
|
variableName: string,
|
|
@@ -1138,6 +1189,26 @@ const collectReferencedTemplateIdentifiers = (
|
|
|
1138
1189
|
templateIdentifiers.add("patch")
|
|
1139
1190
|
}
|
|
1140
1191
|
|
|
1192
|
+
const pendingIdentifiers = Array.from(templateIdentifiers)
|
|
1193
|
+
const visitedIdentifiers = new Set<string>()
|
|
1194
|
+
while (pendingIdentifiers.length > 0) {
|
|
1195
|
+
const identifier = pendingIdentifiers.pop()!
|
|
1196
|
+
if (visitedIdentifiers.has(identifier)) {
|
|
1197
|
+
continue
|
|
1198
|
+
}
|
|
1199
|
+
|
|
1200
|
+
visitedIdentifiers.add(identifier)
|
|
1201
|
+
for (const source of collectAssignedValueRootIdentifiers(
|
|
1202
|
+
script,
|
|
1203
|
+
identifier,
|
|
1204
|
+
)) {
|
|
1205
|
+
if (!templateIdentifiers.has(source)) {
|
|
1206
|
+
templateIdentifiers.add(source)
|
|
1207
|
+
pendingIdentifiers.push(source)
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1141
1212
|
const objectIdentifiers = new Set<string>()
|
|
1142
1213
|
for (const identifier of templateIdentifiers) {
|
|
1143
1214
|
for (const source of collectObjectEntryMapSources(script, identifier)) {
|
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
const spec = `# EventLog Rotating Session Identity Proof
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
Add a session-scoped rotating challenge proof to §EventLogRemote§ and §EventLogServerUnencrypted§ so a client must prove continuity of possession of its identity secret, not just knowledge of the public key.
|
|
6
|
+
|
|
7
|
+
The protocol becomes a breaking change:
|
|
8
|
+
|
|
9
|
+
- §Hello§ includes a fresh server challenge.
|
|
10
|
+
- the client must complete a dedicated §Authenticate§ handshake once per socket session before normal reads or writes are allowed.
|
|
11
|
+
- the server stores the proof generated from the current session's challenge and requires the previously stored proof on the next session.
|
|
12
|
+
- proof failures introduced by this feature use §Forbidden§.
|
|
13
|
+
- there is no legacy public-key-only fallback.
|
|
14
|
+
|
|
15
|
+
This design deliberately follows the existing identity model in the repository: the so-called private key is currently a 32-byte symmetric secret, not an asymmetric signing key. Because the server does not know that secret, the proof is based on deterministic keyed challenge proofs and trust-on-first-use (TOFU) for the first session of a given public key.
|
|
16
|
+
|
|
17
|
+
## Scope clarification
|
|
18
|
+
|
|
19
|
+
This repository currently exposes:
|
|
20
|
+
|
|
21
|
+
- two client transport constructors:
|
|
22
|
+
- §EventLogRemote.fromSocket§
|
|
23
|
+
- §EventLogRemote.fromSocketUnencrypted§
|
|
24
|
+
- one server-side handler/runtime path:
|
|
25
|
+
- §EventLogServerUnencrypted.make§ / §EventLogServerUnencrypted.makeHandler§
|
|
26
|
+
|
|
27
|
+
For this change:
|
|
28
|
+
|
|
29
|
+
- the wire protocol additions must be shared across both client transport variants.
|
|
30
|
+
- concrete server-side enforcement lands in §EventLogServerUnencrypted.makeHandler§ and the shared runtime created by §EventLogServerUnencrypted.make§.
|
|
31
|
+
- storage implementations, including SQL-backed storage, inherit the same runtime auth behavior automatically and must not reimplement protocol authentication separately.
|
|
32
|
+
- if a dedicated encrypted server handler is added later, it must reuse the same handshake semantics and protocol message shapes defined here.
|
|
33
|
+
|
|
34
|
+
## Background
|
|
35
|
+
|
|
36
|
+
Current behavior:
|
|
37
|
+
|
|
38
|
+
- §EventLogRemote.fromSocket§ and §EventLogRemote.fromSocketUnencrypted§ send the caller's §publicKey§ on each request.
|
|
39
|
+
- §EventLogServerUnencrypted.makeHandler§ accepts requests based on the §publicKey§ in the message and delegates read / write authorization to §EventLogServerAuth§.
|
|
40
|
+
- there is no proof that the caller also possesses the matching secret key material.
|
|
41
|
+
- §EventLog.Identity.privateKey§ is already a raw 32-byte secret used by §EventLogEncryption§ as an AES key.
|
|
42
|
+
|
|
43
|
+
Relevant code today:
|
|
44
|
+
|
|
45
|
+
- §packages/effect/src/unstable/eventlog/EventLog.ts§ defines §Identity§.
|
|
46
|
+
- §packages/effect/src/unstable/eventlog/EventLogEncryption.ts§ shows the current symmetric-key model.
|
|
47
|
+
- §packages/effect/src/unstable/eventlog/EventLogRemote.ts§ defines both encrypted and unencrypted wire protocols and client transports.
|
|
48
|
+
- §packages/effect/src/unstable/eventlog/EventLogServerUnencrypted.ts§ defines the current server handler and authorization hooks.
|
|
49
|
+
|
|
50
|
+
## Goals
|
|
51
|
+
|
|
52
|
+
1. Require a session-level proof of identity beyond §publicKey§.
|
|
53
|
+
2. Apply the protocol/authentication design to both remote transport variants:
|
|
54
|
+
- §EventLogRemote.fromSocket§
|
|
55
|
+
- §EventLogRemote.fromSocketUnencrypted§
|
|
56
|
+
3. Enforce the handshake in §EventLogServerUnencrypted.makeHandler§.
|
|
57
|
+
4. Keep read/write authorization semantics separate from identity proof.
|
|
58
|
+
5. Reuse the existing symmetric identity secret instead of introducing a new asymmetric key system.
|
|
59
|
+
6. Rotate the proof material from a fresh server-issued challenge for each new socket session.
|
|
60
|
+
7. Keep first-session bootstrap intentionally TOFU, per user direction.
|
|
61
|
+
8. Use §Forbidden§ for new proof-related failures.
|
|
62
|
+
|
|
63
|
+
## Non-goals
|
|
64
|
+
|
|
65
|
+
- Replacing the identity model with asymmetric signatures in this change.
|
|
66
|
+
- Preserving backward compatibility with legacy clients or servers.
|
|
67
|
+
- Changing store mapping rules or eventlog persistence semantics.
|
|
68
|
+
- Changing the public shape of §EventLogServerAuth.authorizeRead§ / §authorizeWrite§.
|
|
69
|
+
- Adding proof fields to normal read/write requests after the session is authenticated.
|
|
70
|
+
- Solving distributed proof persistence across multiple server instances or durable client storage across application restarts.
|
|
71
|
+
- Cryptographically verifying the very first session for a previously unseen public key.
|
|
72
|
+
|
|
73
|
+
## User-confirmed decisions
|
|
74
|
+
|
|
75
|
+
- Scope: apply the design across both protocol variants.
|
|
76
|
+
- Compatibility: breaking change, no legacy fallback.
|
|
77
|
+
- Auth frequency: once per socket session.
|
|
78
|
+
- First auth attempt: the server does not verify it; it stores the first proof and begins the rotation cycle.
|
|
79
|
+
- Reads/writes: unchanged at the message level; proof is only for establishing identity.
|
|
80
|
+
- New proof failures: use §Forbidden§.
|
|
81
|
+
|
|
82
|
+
## Design overview
|
|
83
|
+
|
|
84
|
+
### Session model
|
|
85
|
+
|
|
86
|
+
Authentication becomes a separate handshake step that happens once per socket session:
|
|
87
|
+
|
|
88
|
+
1. server sends §Hello§ with §remoteId§ and a fresh §challenge§.
|
|
89
|
+
2. client computes a deterministic proof from that challenge and its identity secret.
|
|
90
|
+
3. client sends §Authenticate§ before any application-level request.
|
|
91
|
+
4. server either:
|
|
92
|
+
- bootstraps trust for a previously unseen public key by storing the proof, or
|
|
93
|
+
- compares the caller's §previousProof§ with the stored proof for that public key.
|
|
94
|
+
5. on success, server marks the socket session as authenticated for exactly one public key and stores the new proof for the next session.
|
|
95
|
+
6. after that, existing §WriteEntries§ / §RequestChanges§ flows continue unchanged.
|
|
96
|
+
|
|
97
|
+
A socket session is bound to one identity:
|
|
98
|
+
|
|
99
|
+
- once authenticated, every request on that socket must use the same §publicKey§.
|
|
100
|
+
- attempting to use a different §publicKey§ on the same authenticated socket is §Forbidden§.
|
|
101
|
+
- if multiple first operations race on the same unauthenticated socket, the first identity that begins authentication binds the socket; concurrent or later operations for a different public key fail.
|
|
102
|
+
|
|
103
|
+
### Challenge-proof algorithm
|
|
104
|
+
|
|
105
|
+
Use a deterministic keyed proof derived from the existing secret key material:
|
|
106
|
+
|
|
107
|
+
- algorithm: §HMAC-SHA-256§
|
|
108
|
+
- HMAC key: raw bytes from §Redacted.value(identity.privateKey)§
|
|
109
|
+
- input: the raw §Hello.challenge§ bytes
|
|
110
|
+
- output: 32-byte proof (§Uint8Array§)
|
|
111
|
+
|
|
112
|
+
Rationale:
|
|
113
|
+
|
|
114
|
+
- the repository's current identity model is symmetric, not asymmetric.
|
|
115
|
+
- the server cannot independently compute the proof because it does not know the secret.
|
|
116
|
+
- deterministic output is required because the server verifies the next session by exact proof comparison.
|
|
117
|
+
- §AES-GCM§ is intentionally not used for this proof because its randomized IV makes the output unsuitable for stable equality comparison across sessions.
|
|
118
|
+
|
|
119
|
+
Implementation details:
|
|
120
|
+
|
|
121
|
+
- proof comparison on the server must use a constant-time byte loop.
|
|
122
|
+
- store and compare raw bytes, not encoded strings.
|
|
123
|
+
- cloned copies of proof arrays must be stored so later mutation of request buffers cannot affect server state.
|
|
124
|
+
- the server challenge should be 32 random bytes from §globalThis.crypto.getRandomValues§.
|
|
125
|
+
|
|
126
|
+
### Proof rotation semantics
|
|
127
|
+
|
|
128
|
+
For each public key, the server maintains the most recent accepted proof and one fallback proof for robustness:
|
|
129
|
+
|
|
130
|
+
- §currentProof§: the proof most recently stored for that public key.
|
|
131
|
+
- §fallbackProof§: the immediately previous proof, accepted for one extra session to reduce client/server desynchronization risk.
|
|
132
|
+
|
|
133
|
+
Rotation rules:
|
|
134
|
+
|
|
135
|
+
1. first successful bootstrap session for §publicKey§:
|
|
136
|
+
- no stored proof exists
|
|
137
|
+
- server does not verify §previousProof§
|
|
138
|
+
- server stores §currentProof = Authenticate.currentProof§
|
|
139
|
+
- §fallbackProof§ remains empty
|
|
140
|
+
2. later sessions:
|
|
141
|
+
- the client sends §previousProof§ whenever it has one cached locally
|
|
142
|
+
- server accepts it if it matches either stored §currentProof§ or stored §fallbackProof§
|
|
143
|
+
- on success, server rotates to:
|
|
144
|
+
- new §fallbackProof = old currentProof§
|
|
145
|
+
- new §currentProof = Authenticate.currentProof§
|
|
146
|
+
3. if stored proof state exists and neither stored proof matches §previousProof§, authentication fails with §Forbidden§.
|
|
147
|
+
|
|
148
|
+
This fallback window is intentionally limited to one prior proof. It improves recovery from lost auth acknowledgements or one-step client cache lag without permanently accepting stale proofs.
|
|
149
|
+
|
|
150
|
+
### Proof-state ownership and atomicity
|
|
151
|
+
|
|
152
|
+
Server proof state is shared across all sockets created from the same eventlog runtime.
|
|
153
|
+
|
|
154
|
+
Requirements:
|
|
155
|
+
|
|
156
|
+
- proof-state updates for a given public key must be atomic.
|
|
157
|
+
- concurrent bootstrap or rotation attempts for the same public key must not corrupt the stored proof chain.
|
|
158
|
+
- the implementation may use a single in-memory map plus a synchronization primitive, or a per-public-key synchronized structure, as long as reads and writes observe consistent state.
|
|
159
|
+
|
|
160
|
+
## Protocol changes
|
|
161
|
+
|
|
162
|
+
### §Hello§
|
|
163
|
+
|
|
164
|
+
Extend §Hello§ with:
|
|
165
|
+
|
|
166
|
+
- §challenge: Schema.Uint8Array§
|
|
167
|
+
|
|
168
|
+
§Hello.remoteId§ remains unchanged.
|
|
169
|
+
|
|
170
|
+
### New request: §Authenticate§
|
|
171
|
+
|
|
172
|
+
Add a new protocol request class shared by encrypted and unencrypted transports:
|
|
173
|
+
|
|
174
|
+
- §_tag: "Authenticate"§
|
|
175
|
+
- §publicKey: Schema.String§
|
|
176
|
+
- §currentProof: Schema.Uint8Array§
|
|
177
|
+
- §previousProof: Schema.optional(Schema.Uint8Array)§
|
|
178
|
+
|
|
179
|
+
Semantics:
|
|
180
|
+
|
|
181
|
+
- §currentProof§ is the HMAC of the current session's §Hello.challenge§.
|
|
182
|
+
- §previousProof§ is the proof last accepted for this public key, if the client has one.
|
|
183
|
+
- because the client cannot know whether the server already has proof state, the client should send §previousProof§ whenever it has a cached value.
|
|
184
|
+
- when the server is bootstrapping a public key with no stored proof state, any provided §previousProof§ is ignored.
|
|
185
|
+
|
|
186
|
+
### New response: §Authenticated§
|
|
187
|
+
|
|
188
|
+
Add a new protocol response class shared by encrypted and unencrypted transports:
|
|
189
|
+
|
|
190
|
+
- §_tag: "Authenticated"§
|
|
191
|
+
- §publicKey: Schema.String§
|
|
192
|
+
|
|
193
|
+
Semantics:
|
|
194
|
+
|
|
195
|
+
- emitted once the session has been authenticated successfully.
|
|
196
|
+
- indicates the socket is now bound to that public key for the rest of the session.
|
|
197
|
+
|
|
198
|
+
### Shared error response: §ProtocolError§
|
|
199
|
+
|
|
200
|
+
Introduce a shared protocol error response usable by both protocol variants:
|
|
201
|
+
|
|
202
|
+
- §_tag: "Error"§
|
|
203
|
+
- §requestTag: Schema.String§
|
|
204
|
+
- §id: Schema.optional(Schema.Number)§
|
|
205
|
+
- §publicKey: Schema.optional(Schema.String)§
|
|
206
|
+
- §code: Schema.Literals(["Unauthorized", "Forbidden", "NotFound", "InvalidRequest", "InternalServerError"])§
|
|
207
|
+
- §message: Schema.String§
|
|
208
|
+
|
|
209
|
+
Requirements:
|
|
210
|
+
|
|
211
|
+
- replace the unencrypted-only error shape with a shared response class used in both unions.
|
|
212
|
+
- §Authenticate§ failures produced by this feature must use:
|
|
213
|
+
- §requestTag: "Authenticate"§
|
|
214
|
+
- §code: "Forbidden"§
|
|
215
|
+
- if an unauthenticated client sends §WriteEntries§ / §RequestChanges§ / §StopChanges§ before completing auth, the server returns §Forbidden§ for the attempted request tag.
|
|
216
|
+
- server-side error emission must explicitly support §Authenticate§ and §StopChanges§ in addition to the existing request tags.
|
|
217
|
+
|
|
218
|
+
### Union updates
|
|
219
|
+
|
|
220
|
+
Update both protocol unions in §EventLogRemote.ts§:
|
|
221
|
+
|
|
222
|
+
- §ProtocolRequest§ includes §Authenticate§.
|
|
223
|
+
- §ProtocolRequestUnencrypted§ includes §Authenticate§.
|
|
224
|
+
- §ProtocolResponse§ includes §Authenticated§ and §ProtocolError§.
|
|
225
|
+
- §ProtocolResponseUnencrypted§ includes §Authenticated§ and §ProtocolError§.
|
|
226
|
+
|
|
227
|
+
No proof fields are added to §WriteEntries§, §WriteEntriesUnencrypted§, or §RequestChanges§.
|
|
228
|
+
|
|
229
|
+
## Client behavior specification
|
|
230
|
+
|
|
231
|
+
### Shared client rules
|
|
232
|
+
|
|
233
|
+
Both remote transport constructors must implement the same session-auth model:
|
|
234
|
+
|
|
235
|
+
- keep per-socket session auth state separate from long-lived proof cache state.
|
|
236
|
+
- cache the last locally accepted proof by §remoteId + publicKey§ for the lifetime of the remote instance.
|
|
237
|
+
- serialize auth attempts per socket.
|
|
238
|
+
- once auth begins for one public key, concurrent attempts using a different public key fail instead of piggybacking on the in-flight auth effect.
|
|
239
|
+
|
|
240
|
+
Receiving a new §Hello§ must:
|
|
241
|
+
|
|
242
|
+
- update §remoteId§.
|
|
243
|
+
- replace the current session challenge.
|
|
244
|
+
- clear any per-socket authenticated identity marker.
|
|
245
|
+
- clear any in-flight auth state associated with the previous socket session.
|
|
246
|
+
|
|
247
|
+
After an auth failure with §Forbidden§:
|
|
248
|
+
|
|
249
|
+
- the current socket session is treated as terminal for identity-bound operations.
|
|
250
|
+
- the client does not auto-retry auth on that same socket.
|
|
251
|
+
- the cached local proof remains unchanged.
|
|
252
|
+
|
|
253
|
+
### §EventLogRemote.fromSocketUnencrypted§
|
|
254
|
+
|
|
255
|
+
Add session-auth state to the remote instance:
|
|
256
|
+
|
|
257
|
+
- §helloChallenge§ from the latest §Hello§
|
|
258
|
+
- §authenticatedPublicKey§ for the current socket session, initially empty
|
|
259
|
+
- per-remote proof cache keyed by §remoteId + publicKey§ holding the last locally accepted proof
|
|
260
|
+
- a serialized in-flight auth effect so concurrent first operations do not send duplicate §Authenticate§ requests
|
|
261
|
+
|
|
262
|
+
Required behavior:
|
|
263
|
+
|
|
264
|
+
1. receiving §Hello§ stores §remoteId§ and §challenge§.
|
|
265
|
+
2. the first §write(identity, entries)§ or §changes(identity, startSequence)§ on an unauthenticated session must:
|
|
266
|
+
- compute §currentProof§ from the §Hello.challenge§
|
|
267
|
+
- load cached §previousProof§ for `(remoteId, identity.publicKey)` if present
|
|
268
|
+
- send §Authenticate§ and wait for §Authenticated§
|
|
269
|
+
- on success, cache §currentProof§ as the latest local proof for `(remoteId, publicKey)` and bind the session to that §publicKey§
|
|
270
|
+
3. once authenticated, normal write/change requests proceed exactly as today.
|
|
271
|
+
4. if the caller uses a different §publicKey§ after the session is authenticated, fail without silently switching identities.
|
|
272
|
+
5. auth failure must surface as §EventLogRemoteError§ with §method: "authenticate"§.
|
|
273
|
+
6. a failed auth attempt must not replace the cached local proof.
|
|
274
|
+
7. §StopChanges§ should only be sent for authenticated sessions that actually created a subscription.
|
|
275
|
+
8. the remote must decode §ProtocolError§ and fail pending auth, write, or change operations appropriately.
|
|
276
|
+
|
|
277
|
+
### §EventLogRemote.fromSocket§
|
|
278
|
+
|
|
279
|
+
Apply the same session-auth flow as above before encrypted read/write traffic:
|
|
280
|
+
|
|
281
|
+
- same §Hello.challenge§ handling
|
|
282
|
+
- same §Authenticate§ request/§Authenticated§ response flow
|
|
283
|
+
- same single-public-key-per-socket rule
|
|
284
|
+
- same local proof cache semantics
|
|
285
|
+
- same §ProtocolError§ handling and §EventLogRemoteError§ mapping for auth failures
|
|
286
|
+
|
|
287
|
+
This change must not alter the existing event payload encryption behavior.
|
|
288
|
+
|
|
289
|
+
### Concurrency and retry rules
|
|
290
|
+
|
|
291
|
+
- session auth must be serialized per socket.
|
|
292
|
+
- concurrent first write/read calls for the same identity wait on the same auth effect.
|
|
293
|
+
- concurrent first write/read calls for different identities on the same socket fail for the loser of the race.
|
|
294
|
+
- if auth fails with §Forbidden§, pending callers fail; the remote does not retry automatically.
|
|
295
|
+
- after a successful auth, reconnecting or recreating the socket starts a new auth session using the latest locally cached proof.
|
|
296
|
+
|
|
297
|
+
## Server behavior specification
|
|
298
|
+
|
|
299
|
+
### Runtime state
|
|
300
|
+
|
|
301
|
+
Add proof state to §EventLogServerUnencrypted.make§ so it is shared across handler instances created from the same runtime:
|
|
302
|
+
|
|
303
|
+
- §Map<publicKey, { currentProof: Uint8Array; fallbackProof?: Uint8Array }>§
|
|
304
|
+
|
|
305
|
+
Add per-socket session state inside §makeHandler§:
|
|
306
|
+
|
|
307
|
+
- §sessionChallenge: Uint8Array§ generated when the socket opens
|
|
308
|
+
- §authenticatedPublicKey: string | undefined§
|
|
309
|
+
- optional session marker that auth has completed
|
|
310
|
+
|
|
311
|
+
### Socket startup and reset
|
|
312
|
+
|
|
313
|
+
On each accepted socket:
|
|
314
|
+
|
|
315
|
+
1. generate a fresh random challenge.
|
|
316
|
+
2. send §Hello({ remoteId, challenge })§.
|
|
317
|
+
3. do not process application requests until the session authenticates.
|
|
318
|
+
|
|
319
|
+
If the underlying socket reconnects and a new §Hello§ is emitted, that begins a new session and any previous authenticated identity binding no longer applies.
|
|
320
|
+
|
|
321
|
+
### §Authenticate§ handling
|
|
322
|
+
|
|
323
|
+
Required behavior:
|
|
324
|
+
|
|
325
|
+
1. if the socket is already authenticated:
|
|
326
|
+
- if §request.publicKey§ matches the bound session public key, return §Authenticated§ again without rotating anything.
|
|
327
|
+
- otherwise return §Forbidden§.
|
|
328
|
+
2. if this is the first auth message on the socket:
|
|
329
|
+
- look up stored proof state for §request.publicKey§.
|
|
330
|
+
3. if no proof state exists for that public key:
|
|
331
|
+
- accept this as bootstrap / TOFU
|
|
332
|
+
- ignore §previousProof§ if it was provided
|
|
333
|
+
- store a cloned copy of `{ currentProof: request.currentProof }`
|
|
334
|
+
- mark the socket authenticated for §request.publicKey§
|
|
335
|
+
- respond §Authenticated§
|
|
336
|
+
4. if proof state exists:
|
|
337
|
+
- compare the provided §previousProof§, if any, against both stored §currentProof§ and stored §fallbackProof§
|
|
338
|
+
- if neither matches, return §Forbidden§
|
|
339
|
+
- if it matches, rotate stored proofs to cloned copies of:
|
|
340
|
+
- §fallbackProof = old currentProof§
|
|
341
|
+
- §currentProof = request.currentProof§
|
|
342
|
+
- mark the socket authenticated for §request.publicKey§
|
|
343
|
+
- respond §Authenticated§
|
|
344
|
+
|
|
345
|
+
### Request gating and ordering
|
|
346
|
+
|
|
347
|
+
Before session auth completes:
|
|
348
|
+
|
|
349
|
+
- §Ping§ remains allowed.
|
|
350
|
+
- §Authenticate§ is allowed.
|
|
351
|
+
- §WriteEntries§, §RequestChanges§, and §StopChanges§ must fail with §Forbidden§.
|
|
352
|
+
- if a chunked message resolves to one of those gated request tags, it must also fail with §Forbidden§.
|
|
353
|
+
|
|
354
|
+
After session auth completes, the handler must enforce this order for read/write requests:
|
|
355
|
+
|
|
356
|
+
1. verify the session is authenticated
|
|
357
|
+
2. verify the request §publicKey§ matches the session-bound §authenticatedPublicKey§
|
|
358
|
+
3. only then resolve the store and call §authorizeRead§ / §authorizeWrite§
|
|
359
|
+
|
|
360
|
+
This ordering ensures the new feature remains strictly an identity-proof gate and does not leak store-resolution or authorization behavior before identity has been established.
|
|
361
|
+
|
|
362
|
+
### Interaction with §EventLogServerAuth§
|
|
363
|
+
|
|
364
|
+
Keep the auth service focused on authorization:
|
|
365
|
+
|
|
366
|
+
- do not add proof fields to §authorizeWrite§ or §authorizeRead§.
|
|
367
|
+
- run session-proof checks before invoking authorization.
|
|
368
|
+
- after a session is authenticated, authorization behavior is unchanged.
|
|
369
|
+
- existing authorization failures keep their current semantics; only the new proof handshake failures introduced here are mandated to use §Forbidden§.
|
|
370
|
+
|
|
371
|
+
## Behavioral edge cases
|
|
372
|
+
|
|
373
|
+
1. **First ever session for a public key**
|
|
374
|
+
- succeeds without verification
|
|
375
|
+
- stores the first proof
|
|
376
|
+
2. **Bootstrap request that includes a stale or spurious §previousProof§**
|
|
377
|
+
- still succeeds when the server has no proof state for that public key
|
|
378
|
+
- the provided §previousProof§ is ignored
|
|
379
|
+
3. **Second session with matching previous proof**
|
|
380
|
+
- succeeds
|
|
381
|
+
- rotates the stored proof
|
|
382
|
+
4. **Second session without previous proof**
|
|
383
|
+
- §Forbidden§ when the server already has stored proof state
|
|
384
|
+
5. **Session with stale proof older than the single fallback window**
|
|
385
|
+
- §Forbidden§
|
|
386
|
+
6. **Session authenticated as one public key but request uses another**
|
|
387
|
+
- §Forbidden§
|
|
388
|
+
7. **Write/read attempted before auth**
|
|
389
|
+
- §Forbidden§
|
|
390
|
+
8. **Unauthenticated §StopChanges§**
|
|
391
|
+
- §Forbidden§
|
|
392
|
+
9. **Auth ack lost but client still only has the previous local proof**
|
|
393
|
+
- next session still succeeds once because the server accepts the single fallback proof
|
|
394
|
+
10. **Server restart or new runtime instance**
|
|
395
|
+
- stored proof map resets
|
|
396
|
+
- the next session for any public key bootstraps again
|
|
397
|
+
11. **Client-side proof cache loss while the server still retains a newer proof**
|
|
398
|
+
- auth fails with §Forbidden§ after the one-proof fallback window
|
|
399
|
+
- durable client proof persistence is out of scope for this change
|
|
400
|
+
|
|
401
|
+
## Acceptance criteria
|
|
402
|
+
|
|
403
|
+
The feature is complete when:
|
|
404
|
+
|
|
405
|
+
1. §Hello§ includes a challenge in both protocol variants.
|
|
406
|
+
2. a new §Authenticate§ / §Authenticated§ handshake exists in both protocol variants.
|
|
407
|
+
3. a shared §ProtocolError§ response exists in both protocol variants.
|
|
408
|
+
4. §EventLogRemote.fromSocket§ authenticates once per socket session before encrypted requests and handles auth failures through §ProtocolError§.
|
|
409
|
+
5. §EventLogRemote.fromSocketUnencrypted§ authenticates once per socket session before unencrypted requests and handles auth failures through §ProtocolError§.
|
|
410
|
+
6. §EventLogServerUnencrypted.makeHandler§ forbids reads/writes before auth.
|
|
411
|
+
7. the first session for a public key bootstraps by storing proof without verification.
|
|
412
|
+
8. bootstrap ignores any provided §previousProof§ when no server-side proof state exists.
|
|
413
|
+
9. the next session for the same public key must supply a previous proof acceptable under the current/fallback rotation rule and a new current proof.
|
|
414
|
+
10. the server rotates stored proofs and accepts the immediately previous proof as a one-step fallback.
|
|
415
|
+
11. a socket session is bound to a single public key.
|
|
416
|
+
12. proof-state updates per public key are atomic.
|
|
417
|
+
13. read/write authorization remains separate from session identity proof.
|
|
418
|
+
14. proof-related failures introduced by this feature use §Forbidden§.
|
|
419
|
+
15. existing request payload schemas for writes/reads are otherwise unchanged.
|
|
420
|
+
|
|
421
|
+
## Testing strategy
|
|
422
|
+
|
|
423
|
+
### Existing test files to extend
|
|
424
|
+
|
|
425
|
+
- §packages/effect/test/unstable/eventlog/EventLogRemote.test.ts§
|
|
426
|
+
- §packages/effect/test/unstable/eventlog/EventLogServerUnencrypted.test.ts§
|
|
427
|
+
|
|
428
|
+
### Required new test coverage
|
|
429
|
+
|
|
430
|
+
#### Remote client tests
|
|
431
|
+
|
|
432
|
+
1. §Hello§ decoding captures the challenge.
|
|
433
|
+
2. first §write§ on an unauthenticated unencrypted socket sends §Authenticate§ before §WriteEntries§.
|
|
434
|
+
3. first §changes§ on an unauthenticated unencrypted socket sends §Authenticate§ before §RequestChanges§.
|
|
435
|
+
4. encrypted §fromSocket§ performs the same handshake before §WriteEntries§ / §RequestChanges§.
|
|
436
|
+
5. concurrent first operations for the same identity share one auth handshake.
|
|
437
|
+
6. concurrent first operations for different identities on the same socket do not both succeed.
|
|
438
|
+
7. auth §Forbidden§ surfaces as §EventLogRemoteError§ with §method: "authenticate"§.
|
|
439
|
+
8. once authenticated, subsequent operations on the same socket do not send another §Authenticate§.
|
|
440
|
+
9. a failed auth does not update the local proof cache.
|
|
441
|
+
10. receiving a new §Hello§ resets per-session auth state.
|
|
442
|
+
11. encrypted §fromSocket§ also handles §ProtocolError§ auth failures.
|
|
443
|
+
|
|
444
|
+
#### Server handler tests
|
|
445
|
+
|
|
446
|
+
1. §Hello§ includes a challenge.
|
|
447
|
+
2. non-auth requests sent before §Authenticate§ receive §Forbidden§.
|
|
448
|
+
3. unauthenticated §StopChanges§ receives §Forbidden§.
|
|
449
|
+
4. first-session §Authenticate§ bootstraps proof state and allows later requests on that socket.
|
|
450
|
+
5. bootstrap ignores a provided §previousProof§ when no proof state exists.
|
|
451
|
+
6. second session for the same public key requires a matching §previousProof§.
|
|
452
|
+
7. missing or mismatched §previousProof§ is §Forbidden§.
|
|
453
|
+
8. successful re-auth rotates the stored proof.
|
|
454
|
+
9. the immediate prior proof is accepted once as fallback.
|
|
455
|
+
10. a socket authenticated for one public key rejects read/write requests using another public key.
|
|
456
|
+
11. §authorizeWrite§ / §authorizeRead§ are not called before session auth succeeds.
|
|
457
|
+
12. once session auth succeeds, existing read/write authorization behavior still works.
|
|
458
|
+
13. concurrent proof-state updates for the same public key do not corrupt rotation state.
|
|
459
|
+
|
|
460
|
+
### Test helper guidance
|
|
461
|
+
|
|
462
|
+
- follow the existing socket harness style already used in both eventlog test files.
|
|
463
|
+
- add a small deterministic helper for producing test proofs from a known identity and challenge.
|
|
464
|
+
- keep tests in the §it.effect§ style used by this repository.
|
|
465
|
+
|
|
466
|
+
## Implementation plan
|
|
467
|
+
|
|
468
|
+
1. **Implement the end-to-end rotating session auth protocol in one atomic change**
|
|
469
|
+
- add §Hello.challenge§, §Authenticate§, §Authenticated§, and shared §ProtocolError§ protocol types and codec updates
|
|
470
|
+
- add the shared deterministic HMAC proof helper and proof-comparison utilities
|
|
471
|
+
- update both §EventLogRemote.fromSocket§ and §EventLogRemote.fromSocketUnencrypted§ to perform session authentication, bind one public key per socket, cache local proofs, and surface auth failures
|
|
472
|
+
- update §EventLogServerUnencrypted.make§ / §makeHandler§ to maintain shared proof state, gate unauthenticated requests, enforce identity binding, and rotate proofs atomically
|
|
473
|
+
- update/add the affected tests in §EventLogRemote.test.ts§ and §EventLogServerUnencrypted.test.ts§ so the new wire protocol passes end-to-end
|
|
474
|
+
|
|
475
|
+
2. **Run validation and cleanup**
|
|
476
|
+
- run §pnpm lint-fix§
|
|
477
|
+
- run §pnpm test packages/effect/test/unstable/eventlog/EventLogRemote.test.ts§
|
|
478
|
+
- run §pnpm test packages/effect/test/unstable/eventlog/EventLogServerUnencrypted.test.ts§
|
|
479
|
+
- run §pnpm check:tsgo§
|
|
480
|
+
- run §pnpm docgen§
|
|
481
|
+
- update any affected protocol documentation or inline comments discovered during implementation
|
|
482
|
+
|
|
483
|
+
## Validation checklist for implementation
|
|
484
|
+
|
|
485
|
+
- §pnpm lint-fix§
|
|
486
|
+
- §pnpm test packages/effect/test/unstable/eventlog/EventLogRemote.test.ts§
|
|
487
|
+
- §pnpm test packages/effect/test/unstable/eventlog/EventLogServerUnencrypted.test.ts§
|
|
488
|
+
- §pnpm check:tsgo§
|
|
489
|
+
- §pnpm docgen§
|
|
490
|
+
`;
|
|
491
|
+
const content = spec.replaceAll('§', '`');
|
|
492
|
+
await writeFile({ path: '.specs/eventlog-rotating-session-auth.md', content });
|
|
493
|
+
console.log(content);
|
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
const spec = `# EventLog Rotating Session Identity Proof
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
Add a session-scoped rotating challenge proof to §EventLogRemote§ and §EventLogServerUnencrypted§ so a client must prove continuity of possession of its identity secret, not just knowledge of the public key.
|
|
6
|
+
|
|
7
|
+
The protocol becomes a breaking change:
|
|
8
|
+
|
|
9
|
+
- §Hello§ includes a fresh server challenge.
|
|
10
|
+
- the client must complete a dedicated §Authenticate§ handshake once per socket session before normal reads or writes are allowed.
|
|
11
|
+
- the server stores the proof generated from the current session's challenge and requires the previously stored proof on the next session.
|
|
12
|
+
- proof failures introduced by this feature use §Forbidden§.
|
|
13
|
+
- there is no legacy public-key-only fallback.
|
|
14
|
+
|
|
15
|
+
This design deliberately follows the existing identity model in the repository: the so-called private key is currently a 32-byte symmetric secret, not an asymmetric signing key. Because the server does not know that secret, the proof is based on deterministic keyed challenge proofs and trust-on-first-use (TOFU) for the first session of a given public key.
|
|
16
|
+
|
|
17
|
+
## Scope clarification
|
|
18
|
+
|
|
19
|
+
This repository currently exposes:
|
|
20
|
+
|
|
21
|
+
- two client transport constructors:
|
|
22
|
+
- §EventLogRemote.fromSocket§
|
|
23
|
+
- §EventLogRemote.fromSocketUnencrypted§
|
|
24
|
+
- one server-side handler/runtime path:
|
|
25
|
+
- §EventLogServerUnencrypted.make§ / §EventLogServerUnencrypted.makeHandler§
|
|
26
|
+
|
|
27
|
+
For this change:
|
|
28
|
+
|
|
29
|
+
- the wire protocol additions must be shared across both client transport variants.
|
|
30
|
+
- concrete server-side enforcement lands in §EventLogServerUnencrypted.makeHandler§ and the shared runtime created by §EventLogServerUnencrypted.make§.
|
|
31
|
+
- storage implementations, including SQL-backed storage, inherit the same runtime auth behavior automatically and must not reimplement protocol authentication separately.
|
|
32
|
+
- if a dedicated encrypted server handler is added later, it must reuse the same handshake semantics and protocol message shapes defined here.
|
|
33
|
+
|
|
34
|
+
## Background
|
|
35
|
+
|
|
36
|
+
Current behavior:
|
|
37
|
+
|
|
38
|
+
- §EventLogRemote.fromSocket§ and §EventLogRemote.fromSocketUnencrypted§ send the caller's §publicKey§ on each request.
|
|
39
|
+
- §EventLogServerUnencrypted.makeHandler§ accepts requests based on the §publicKey§ in the message and delegates read / write authorization to §EventLogServerAuth§.
|
|
40
|
+
- there is no proof that the caller also possesses the matching secret key material.
|
|
41
|
+
- §EventLog.Identity.privateKey§ is already a raw 32-byte secret used by §EventLogEncryption§ as an AES key.
|
|
42
|
+
|
|
43
|
+
Relevant code today:
|
|
44
|
+
|
|
45
|
+
- §packages/effect/src/unstable/eventlog/EventLog.ts§ defines §Identity§.
|
|
46
|
+
- §packages/effect/src/unstable/eventlog/EventLogEncryption.ts§ shows the current symmetric-key model.
|
|
47
|
+
- §packages/effect/src/unstable/eventlog/EventLogRemote.ts§ defines both encrypted and unencrypted wire protocols and client transports.
|
|
48
|
+
- §packages/effect/src/unstable/eventlog/EventLogServerUnencrypted.ts§ defines the current server handler and authorization hooks.
|
|
49
|
+
|
|
50
|
+
## Goals
|
|
51
|
+
|
|
52
|
+
1. Require a session-level proof of identity beyond §publicKey§.
|
|
53
|
+
2. Apply the protocol/authentication design to both remote transport variants:
|
|
54
|
+
- §EventLogRemote.fromSocket§
|
|
55
|
+
- §EventLogRemote.fromSocketUnencrypted§
|
|
56
|
+
3. Enforce the handshake in §EventLogServerUnencrypted.makeHandler§.
|
|
57
|
+
4. Keep read/write authorization semantics separate from identity proof.
|
|
58
|
+
5. Reuse the existing symmetric identity secret instead of introducing a new asymmetric key system.
|
|
59
|
+
6. Rotate the proof material from a fresh server-issued challenge for each new socket session.
|
|
60
|
+
7. Keep first-session bootstrap intentionally TOFU, per user direction.
|
|
61
|
+
8. Use §Forbidden§ for new proof-related failures.
|
|
62
|
+
|
|
63
|
+
## Non-goals
|
|
64
|
+
|
|
65
|
+
- Replacing the identity model with asymmetric signatures in this change.
|
|
66
|
+
- Preserving backward compatibility with legacy clients or servers.
|
|
67
|
+
- Changing store mapping rules or eventlog persistence semantics.
|
|
68
|
+
- Changing the public shape of §EventLogServerAuth.authorizeRead§ / §authorizeWrite§.
|
|
69
|
+
- Adding proof fields to normal read/write requests after the session is authenticated.
|
|
70
|
+
- Solving distributed proof persistence across multiple server instances or durable client storage across application restarts.
|
|
71
|
+
- Cryptographically verifying the very first session for a previously unseen public key.
|
|
72
|
+
|
|
73
|
+
## User-confirmed decisions
|
|
74
|
+
|
|
75
|
+
- Scope: apply the design across both protocol variants.
|
|
76
|
+
- Compatibility: breaking change, no legacy fallback.
|
|
77
|
+
- Auth frequency: once per socket session.
|
|
78
|
+
- First auth attempt: the server does not verify it; it stores the first proof and begins the rotation cycle.
|
|
79
|
+
- Reads/writes: unchanged at the message level; proof is only for establishing identity.
|
|
80
|
+
- New proof failures: use §Forbidden§.
|
|
81
|
+
|
|
82
|
+
## Design overview
|
|
83
|
+
|
|
84
|
+
### Session model
|
|
85
|
+
|
|
86
|
+
Authentication becomes a separate handshake step that happens once per socket session:
|
|
87
|
+
|
|
88
|
+
1. server sends §Hello§ with §remoteId§ and a fresh §challenge§.
|
|
89
|
+
2. client computes a deterministic proof from that challenge and its identity secret.
|
|
90
|
+
3. client sends §Authenticate§ before any application-level request.
|
|
91
|
+
4. server either:
|
|
92
|
+
- bootstraps trust for a previously unseen public key by storing the proof, or
|
|
93
|
+
- compares the caller's §previousProof§ with the stored proof for that public key.
|
|
94
|
+
5. on success, server marks the socket session as authenticated for exactly one public key and stores the new proof for the next session.
|
|
95
|
+
6. after that, existing §WriteEntries§ / §RequestChanges§ flows continue unchanged.
|
|
96
|
+
|
|
97
|
+
A socket session is bound to one identity:
|
|
98
|
+
|
|
99
|
+
- once authenticated, every request on that socket must use the same §publicKey§.
|
|
100
|
+
- attempting to use a different §publicKey§ on the same authenticated socket is §Forbidden§.
|
|
101
|
+
- if multiple first operations race on the same unauthenticated socket, the first identity that begins authentication binds the socket; concurrent or later operations for a different public key fail.
|
|
102
|
+
|
|
103
|
+
### Challenge-proof algorithm
|
|
104
|
+
|
|
105
|
+
Use a deterministic keyed proof derived from the existing secret key material:
|
|
106
|
+
|
|
107
|
+
- algorithm: §HMAC-SHA-256§
|
|
108
|
+
- HMAC key: raw bytes from §Redacted.value(identity.privateKey)§
|
|
109
|
+
- input: the raw §Hello.challenge§ bytes
|
|
110
|
+
- output: 32-byte proof (§Uint8Array§)
|
|
111
|
+
|
|
112
|
+
Rationale:
|
|
113
|
+
|
|
114
|
+
- the repository's current identity model is symmetric, not asymmetric.
|
|
115
|
+
- the server cannot independently compute the proof because it does not know the secret.
|
|
116
|
+
- deterministic output is required because the server verifies the next session by exact proof comparison.
|
|
117
|
+
- §AES-GCM§ is intentionally not used for this proof because its randomized IV makes the output unsuitable for stable equality comparison across sessions.
|
|
118
|
+
|
|
119
|
+
Implementation details:
|
|
120
|
+
|
|
121
|
+
- proof comparison on the server must use a constant-time byte loop.
|
|
122
|
+
- store and compare raw bytes, not encoded strings.
|
|
123
|
+
- cloned copies of proof arrays must be stored so later mutation of request buffers cannot affect server state.
|
|
124
|
+
- the server challenge should be 32 random bytes from §globalThis.crypto.getRandomValues§.
|
|
125
|
+
|
|
126
|
+
### Proof rotation semantics
|
|
127
|
+
|
|
128
|
+
For each public key, the server maintains the most recent accepted proof and one fallback proof for robustness:
|
|
129
|
+
|
|
130
|
+
- §currentProof§: the proof most recently stored for that public key.
|
|
131
|
+
- §fallbackProof§: the immediately previous proof, accepted for one extra session to reduce client/server desynchronization risk.
|
|
132
|
+
|
|
133
|
+
Rotation rules:
|
|
134
|
+
|
|
135
|
+
1. first successful bootstrap session for §publicKey§:
|
|
136
|
+
- no stored proof exists
|
|
137
|
+
- server does not verify §previousProof§
|
|
138
|
+
- server stores §currentProof = Authenticate.currentProof§
|
|
139
|
+
- §fallbackProof§ remains empty
|
|
140
|
+
2. later sessions:
|
|
141
|
+
- the client sends §previousProof§ whenever it has one cached locally
|
|
142
|
+
- server accepts it if it matches either stored §currentProof§ or stored §fallbackProof§
|
|
143
|
+
- on success, server rotates to:
|
|
144
|
+
- new §fallbackProof = old currentProof§
|
|
145
|
+
- new §currentProof = Authenticate.currentProof§
|
|
146
|
+
3. if stored proof state exists and neither stored proof matches §previousProof§, authentication fails with §Forbidden§.
|
|
147
|
+
|
|
148
|
+
This fallback window is intentionally limited to one prior proof. It improves recovery from lost auth acknowledgements or one-step client cache lag without permanently accepting stale proofs.
|
|
149
|
+
|
|
150
|
+
### Proof-state ownership and atomicity
|
|
151
|
+
|
|
152
|
+
Server proof state is shared across all sockets created from the same eventlog runtime.
|
|
153
|
+
|
|
154
|
+
Requirements:
|
|
155
|
+
|
|
156
|
+
- proof-state updates for a given public key must be atomic.
|
|
157
|
+
- concurrent bootstrap or rotation attempts for the same public key must not corrupt the stored proof chain.
|
|
158
|
+
- the implementation may use a single in-memory map plus a synchronization primitive, or a per-public-key synchronized structure, as long as reads and writes observe consistent state.
|
|
159
|
+
|
|
160
|
+
## Protocol changes
|
|
161
|
+
|
|
162
|
+
### §Hello§
|
|
163
|
+
|
|
164
|
+
Extend §Hello§ with:
|
|
165
|
+
|
|
166
|
+
- §challenge: Schema.Uint8Array§
|
|
167
|
+
|
|
168
|
+
§Hello.remoteId§ remains unchanged.
|
|
169
|
+
|
|
170
|
+
### New request: §Authenticate§
|
|
171
|
+
|
|
172
|
+
Add a new protocol request class shared by encrypted and unencrypted transports:
|
|
173
|
+
|
|
174
|
+
- §_tag: "Authenticate"§
|
|
175
|
+
- §publicKey: Schema.String§
|
|
176
|
+
- §currentProof: Schema.Uint8Array§
|
|
177
|
+
- §previousProof: Schema.optional(Schema.Uint8Array)§
|
|
178
|
+
|
|
179
|
+
Semantics:
|
|
180
|
+
|
|
181
|
+
- §currentProof§ is the HMAC of the current session's §Hello.challenge§.
|
|
182
|
+
- §previousProof§ is the proof last accepted for this public key, if the client has one.
|
|
183
|
+
- because the client cannot know whether the server already has proof state, the client should send §previousProof§ whenever it has a cached value.
|
|
184
|
+
- when the server is bootstrapping a public key with no stored proof state, any provided §previousProof§ is ignored.
|
|
185
|
+
|
|
186
|
+
### New response: §Authenticated§
|
|
187
|
+
|
|
188
|
+
Add a new protocol response class shared by encrypted and unencrypted transports:
|
|
189
|
+
|
|
190
|
+
- §_tag: "Authenticated"§
|
|
191
|
+
- §publicKey: Schema.String§
|
|
192
|
+
|
|
193
|
+
Semantics:
|
|
194
|
+
|
|
195
|
+
- emitted once the session has been authenticated successfully.
|
|
196
|
+
- indicates the socket is now bound to that public key for the rest of the session.
|
|
197
|
+
|
|
198
|
+
### Shared error response: §ProtocolError§
|
|
199
|
+
|
|
200
|
+
Introduce a shared protocol error response usable by both protocol variants:
|
|
201
|
+
|
|
202
|
+
- §_tag: "Error"§
|
|
203
|
+
- §requestTag: Schema.String§
|
|
204
|
+
- §id: Schema.optional(Schema.Number)§
|
|
205
|
+
- §publicKey: Schema.optional(Schema.String)§
|
|
206
|
+
- §code: Schema.Literals(["Unauthorized", "Forbidden", "NotFound", "InvalidRequest", "InternalServerError"])§
|
|
207
|
+
- §message: Schema.String§
|
|
208
|
+
|
|
209
|
+
Requirements:
|
|
210
|
+
|
|
211
|
+
- replace the unencrypted-only error shape with a shared response class used in both unions.
|
|
212
|
+
- §Authenticate§ failures produced by this feature must use:
|
|
213
|
+
- §requestTag: "Authenticate"§
|
|
214
|
+
- §code: "Forbidden"§
|
|
215
|
+
- if an unauthenticated client sends §WriteEntries§ / §RequestChanges§ / §StopChanges§ before completing auth, the server returns §Forbidden§ for the attempted request tag.
|
|
216
|
+
- server-side error emission must explicitly support §Authenticate§ and §StopChanges§ in addition to the existing request tags.
|
|
217
|
+
|
|
218
|
+
### Union updates
|
|
219
|
+
|
|
220
|
+
Update both protocol unions in §EventLogRemote.ts§:
|
|
221
|
+
|
|
222
|
+
- §ProtocolRequest§ includes §Authenticate§.
|
|
223
|
+
- §ProtocolRequestUnencrypted§ includes §Authenticate§.
|
|
224
|
+
- §ProtocolResponse§ includes §Authenticated§ and §ProtocolError§.
|
|
225
|
+
- §ProtocolResponseUnencrypted§ includes §Authenticated§ and §ProtocolError§.
|
|
226
|
+
|
|
227
|
+
No proof fields are added to §WriteEntries§, §WriteEntriesUnencrypted§, or §RequestChanges§.
|
|
228
|
+
|
|
229
|
+
## Client behavior specification
|
|
230
|
+
|
|
231
|
+
### Shared client rules
|
|
232
|
+
|
|
233
|
+
Both remote transport constructors must implement the same session-auth model:
|
|
234
|
+
|
|
235
|
+
- keep per-socket session auth state separate from long-lived proof cache state.
|
|
236
|
+
- cache the last locally accepted proof by §remoteId + publicKey§ for the lifetime of the remote instance.
|
|
237
|
+
- serialize auth attempts per socket.
|
|
238
|
+
- once auth begins for one public key, concurrent attempts using a different public key fail instead of piggybacking on the in-flight auth effect.
|
|
239
|
+
|
|
240
|
+
Receiving a new §Hello§ must:
|
|
241
|
+
|
|
242
|
+
- update §remoteId§.
|
|
243
|
+
- replace the current session challenge.
|
|
244
|
+
- clear any per-socket authenticated identity marker.
|
|
245
|
+
- clear any in-flight auth state associated with the previous socket session.
|
|
246
|
+
|
|
247
|
+
After an auth failure with §Forbidden§:
|
|
248
|
+
|
|
249
|
+
- the current socket session is treated as terminal for identity-bound operations.
|
|
250
|
+
- the client does not auto-retry auth on that same socket.
|
|
251
|
+
- the cached local proof remains unchanged.
|
|
252
|
+
|
|
253
|
+
### §EventLogRemote.fromSocketUnencrypted§
|
|
254
|
+
|
|
255
|
+
Add session-auth state to the remote instance:
|
|
256
|
+
|
|
257
|
+
- §helloChallenge§ from the latest §Hello§
|
|
258
|
+
- §authenticatedPublicKey§ for the current socket session, initially empty
|
|
259
|
+
- per-remote proof cache keyed by §remoteId + publicKey§ holding the last locally accepted proof
|
|
260
|
+
- a serialized in-flight auth effect so concurrent first operations do not send duplicate §Authenticate§ requests
|
|
261
|
+
|
|
262
|
+
Required behavior:
|
|
263
|
+
|
|
264
|
+
1. receiving §Hello§ stores §remoteId§ and §challenge§.
|
|
265
|
+
2. the first §write(identity, entries)§ or §changes(identity, startSequence)§ on an unauthenticated session must:
|
|
266
|
+
- compute §currentProof§ from the §Hello.challenge§
|
|
267
|
+
- load cached §previousProof§ for \`(remoteId, identity.publicKey)\` if present
|
|
268
|
+
- send §Authenticate§ and wait for §Authenticated§
|
|
269
|
+
- on success, cache §currentProof§ as the latest local proof for \`(remoteId, publicKey)\` and bind the session to that §publicKey§
|
|
270
|
+
3. once authenticated, normal write/change requests proceed exactly as today.
|
|
271
|
+
4. if the caller uses a different §publicKey§ after the session is authenticated, fail without silently switching identities.
|
|
272
|
+
5. auth failure must surface as §EventLogRemoteError§ with §method: "authenticate"§.
|
|
273
|
+
6. a failed auth attempt must not replace the cached local proof.
|
|
274
|
+
7. §StopChanges§ should only be sent for authenticated sessions that actually created a subscription.
|
|
275
|
+
8. the remote must decode §ProtocolError§ and fail pending auth, write, or change operations appropriately.
|
|
276
|
+
|
|
277
|
+
### §EventLogRemote.fromSocket§
|
|
278
|
+
|
|
279
|
+
Apply the same session-auth flow as above before encrypted read/write traffic:
|
|
280
|
+
|
|
281
|
+
- same §Hello.challenge§ handling
|
|
282
|
+
- same §Authenticate§ request/§Authenticated§ response flow
|
|
283
|
+
- same single-public-key-per-socket rule
|
|
284
|
+
- same local proof cache semantics
|
|
285
|
+
- same §ProtocolError§ handling and §EventLogRemoteError§ mapping for auth failures
|
|
286
|
+
|
|
287
|
+
This change must not alter the existing event payload encryption behavior.
|
|
288
|
+
|
|
289
|
+
### Concurrency and retry rules
|
|
290
|
+
|
|
291
|
+
- session auth must be serialized per socket.
|
|
292
|
+
- concurrent first write/read calls for the same identity wait on the same auth effect.
|
|
293
|
+
- concurrent first write/read calls for different identities on the same socket fail for the loser of the race.
|
|
294
|
+
- if auth fails with §Forbidden§, pending callers fail; the remote does not retry automatically.
|
|
295
|
+
- after a successful auth, reconnecting or recreating the socket starts a new auth session using the latest locally cached proof.
|
|
296
|
+
|
|
297
|
+
## Server behavior specification
|
|
298
|
+
|
|
299
|
+
### Runtime state
|
|
300
|
+
|
|
301
|
+
Add proof state to §EventLogServerUnencrypted.make§ so it is shared across handler instances created from the same runtime:
|
|
302
|
+
|
|
303
|
+
- §Map<publicKey, { currentProof: Uint8Array; fallbackProof?: Uint8Array }>§
|
|
304
|
+
|
|
305
|
+
Add per-socket session state inside §makeHandler§:
|
|
306
|
+
|
|
307
|
+
- §sessionChallenge: Uint8Array§ generated when the socket opens
|
|
308
|
+
- §authenticatedPublicKey: string | undefined§
|
|
309
|
+
- optional session marker that auth has completed
|
|
310
|
+
|
|
311
|
+
### Socket startup and reset
|
|
312
|
+
|
|
313
|
+
On each accepted socket:
|
|
314
|
+
|
|
315
|
+
1. generate a fresh random challenge.
|
|
316
|
+
2. send §Hello({ remoteId, challenge })§.
|
|
317
|
+
3. do not process application requests until the session authenticates.
|
|
318
|
+
|
|
319
|
+
If the underlying socket reconnects and a new §Hello§ is emitted, that begins a new session and any previous authenticated identity binding no longer applies.
|
|
320
|
+
|
|
321
|
+
### §Authenticate§ handling
|
|
322
|
+
|
|
323
|
+
Required behavior:
|
|
324
|
+
|
|
325
|
+
1. if the socket is already authenticated:
|
|
326
|
+
- if §request.publicKey§ matches the bound session public key, return §Authenticated§ again without rotating anything.
|
|
327
|
+
- otherwise return §Forbidden§.
|
|
328
|
+
2. if this is the first auth message on the socket:
|
|
329
|
+
- look up stored proof state for §request.publicKey§.
|
|
330
|
+
3. if no proof state exists for that public key:
|
|
331
|
+
- accept this as bootstrap / TOFU
|
|
332
|
+
- ignore §previousProof§ if it was provided
|
|
333
|
+
- store a cloned copy of \`{ currentProof: request.currentProof }\`
|
|
334
|
+
- mark the socket authenticated for §request.publicKey§
|
|
335
|
+
- respond §Authenticated§
|
|
336
|
+
4. if proof state exists:
|
|
337
|
+
- compare the provided §previousProof§, if any, against both stored §currentProof§ and stored §fallbackProof§
|
|
338
|
+
- if neither matches, return §Forbidden§
|
|
339
|
+
- if it matches, rotate stored proofs to cloned copies of:
|
|
340
|
+
- §fallbackProof = old currentProof§
|
|
341
|
+
- §currentProof = request.currentProof§
|
|
342
|
+
- mark the socket authenticated for §request.publicKey§
|
|
343
|
+
- respond §Authenticated§
|
|
344
|
+
|
|
345
|
+
### Request gating and ordering
|
|
346
|
+
|
|
347
|
+
Before session auth completes:
|
|
348
|
+
|
|
349
|
+
- §Ping§ remains allowed.
|
|
350
|
+
- §Authenticate§ is allowed.
|
|
351
|
+
- §WriteEntries§, §RequestChanges§, and §StopChanges§ must fail with §Forbidden§.
|
|
352
|
+
- if a chunked message resolves to one of those gated request tags, it must also fail with §Forbidden§.
|
|
353
|
+
|
|
354
|
+
After session auth completes, the handler must enforce this order for read/write requests:
|
|
355
|
+
|
|
356
|
+
1. verify the session is authenticated
|
|
357
|
+
2. verify the request §publicKey§ matches the session-bound §authenticatedPublicKey§
|
|
358
|
+
3. only then resolve the store and call §authorizeRead§ / §authorizeWrite§
|
|
359
|
+
|
|
360
|
+
This ordering ensures the new feature remains strictly an identity-proof gate and does not leak store-resolution or authorization behavior before identity has been established.
|
|
361
|
+
|
|
362
|
+
### Interaction with §EventLogServerAuth§
|
|
363
|
+
|
|
364
|
+
Keep the auth service focused on authorization:
|
|
365
|
+
|
|
366
|
+
- do not add proof fields to §authorizeWrite§ or §authorizeRead§.
|
|
367
|
+
- run session-proof checks before invoking authorization.
|
|
368
|
+
- after a session is authenticated, authorization behavior is unchanged.
|
|
369
|
+
- existing authorization failures keep their current semantics; only the new proof handshake failures introduced here are mandated to use §Forbidden§.
|
|
370
|
+
|
|
371
|
+
## Behavioral edge cases
|
|
372
|
+
|
|
373
|
+
1. **First ever session for a public key**
|
|
374
|
+
- succeeds without verification
|
|
375
|
+
- stores the first proof
|
|
376
|
+
2. **Bootstrap request that includes a stale or spurious §previousProof§**
|
|
377
|
+
- still succeeds when the server has no proof state for that public key
|
|
378
|
+
- the provided §previousProof§ is ignored
|
|
379
|
+
3. **Second session with matching previous proof**
|
|
380
|
+
- succeeds
|
|
381
|
+
- rotates the stored proof
|
|
382
|
+
4. **Second session without previous proof**
|
|
383
|
+
- §Forbidden§ when the server already has stored proof state
|
|
384
|
+
5. **Session with stale proof older than the single fallback window**
|
|
385
|
+
- §Forbidden§
|
|
386
|
+
6. **Session authenticated as one public key but request uses another**
|
|
387
|
+
- §Forbidden§
|
|
388
|
+
7. **Write/read attempted before auth**
|
|
389
|
+
- §Forbidden§
|
|
390
|
+
8. **Unauthenticated §StopChanges§**
|
|
391
|
+
- §Forbidden§
|
|
392
|
+
9. **Auth ack lost but client still only has the previous local proof**
|
|
393
|
+
- next session still succeeds once because the server accepts the single fallback proof
|
|
394
|
+
10. **Server restart or new runtime instance**
|
|
395
|
+
- stored proof map resets
|
|
396
|
+
- the next session for any public key bootstraps again
|
|
397
|
+
11. **Client-side proof cache loss while the server still retains a newer proof**
|
|
398
|
+
- auth fails with §Forbidden§ after the one-proof fallback window
|
|
399
|
+
- durable client proof persistence is out of scope for this change
|
|
400
|
+
|
|
401
|
+
## Acceptance criteria
|
|
402
|
+
|
|
403
|
+
The feature is complete when:
|
|
404
|
+
|
|
405
|
+
1. §Hello§ includes a challenge in both protocol variants.
|
|
406
|
+
2. a new §Authenticate§ / §Authenticated§ handshake exists in both protocol variants.
|
|
407
|
+
3. a shared §ProtocolError§ response exists in both protocol variants.
|
|
408
|
+
4. §EventLogRemote.fromSocket§ authenticates once per socket session before encrypted requests and handles auth failures through §ProtocolError§.
|
|
409
|
+
5. §EventLogRemote.fromSocketUnencrypted§ authenticates once per socket session before unencrypted requests and handles auth failures through §ProtocolError§.
|
|
410
|
+
6. §EventLogServerUnencrypted.makeHandler§ forbids reads/writes before auth.
|
|
411
|
+
7. the first session for a public key bootstraps by storing proof without verification.
|
|
412
|
+
8. bootstrap ignores any provided §previousProof§ when no server-side proof state exists.
|
|
413
|
+
9. the next session for the same public key must supply a previous proof acceptable under the current/fallback rotation rule and a new current proof.
|
|
414
|
+
10. the server rotates stored proofs and accepts the immediately previous proof as a one-step fallback.
|
|
415
|
+
11. a socket session is bound to a single public key.
|
|
416
|
+
12. proof-state updates per public key are atomic.
|
|
417
|
+
13. read/write authorization remains separate from session identity proof.
|
|
418
|
+
14. proof-related failures introduced by this feature use §Forbidden§.
|
|
419
|
+
15. existing request payload schemas for writes/reads are otherwise unchanged.
|
|
420
|
+
|
|
421
|
+
## Testing strategy
|
|
422
|
+
|
|
423
|
+
### Existing test files to extend
|
|
424
|
+
|
|
425
|
+
- §packages/effect/test/unstable/eventlog/EventLogRemote.test.ts§
|
|
426
|
+
- §packages/effect/test/unstable/eventlog/EventLogServerUnencrypted.test.ts§
|
|
427
|
+
|
|
428
|
+
### Required new test coverage
|
|
429
|
+
|
|
430
|
+
#### Remote client tests
|
|
431
|
+
|
|
432
|
+
1. §Hello§ decoding captures the challenge.
|
|
433
|
+
2. first §write§ on an unauthenticated unencrypted socket sends §Authenticate§ before §WriteEntries§.
|
|
434
|
+
3. first §changes§ on an unauthenticated unencrypted socket sends §Authenticate§ before §RequestChanges§.
|
|
435
|
+
4. encrypted §fromSocket§ performs the same handshake before §WriteEntries§ / §RequestChanges§.
|
|
436
|
+
5. concurrent first operations for the same identity share one auth handshake.
|
|
437
|
+
6. concurrent first operations for different identities on the same socket do not both succeed.
|
|
438
|
+
7. auth §Forbidden§ surfaces as §EventLogRemoteError§ with §method: "authenticate"§.
|
|
439
|
+
8. once authenticated, subsequent operations on the same socket do not send another §Authenticate§.
|
|
440
|
+
9. a failed auth does not update the local proof cache.
|
|
441
|
+
10. receiving a new §Hello§ resets per-session auth state.
|
|
442
|
+
11. encrypted §fromSocket§ also handles §ProtocolError§ auth failures.
|
|
443
|
+
|
|
444
|
+
#### Server handler tests
|
|
445
|
+
|
|
446
|
+
1. §Hello§ includes a challenge.
|
|
447
|
+
2. non-auth requests sent before §Authenticate§ receive §Forbidden§.
|
|
448
|
+
3. unauthenticated §StopChanges§ receives §Forbidden§.
|
|
449
|
+
4. first-session §Authenticate§ bootstraps proof state and allows later requests on that socket.
|
|
450
|
+
5. bootstrap ignores a provided §previousProof§ when no proof state exists.
|
|
451
|
+
6. second session for the same public key requires a matching §previousProof§.
|
|
452
|
+
7. missing or mismatched §previousProof§ is §Forbidden§.
|
|
453
|
+
8. successful re-auth rotates the stored proof.
|
|
454
|
+
9. the immediate prior proof is accepted once as fallback.
|
|
455
|
+
10. a socket authenticated for one public key rejects read/write requests using another public key.
|
|
456
|
+
11. §authorizeWrite§ / §authorizeRead§ are not called before session auth succeeds.
|
|
457
|
+
12. once session auth succeeds, existing read/write authorization behavior still works.
|
|
458
|
+
13. concurrent proof-state updates for the same public key do not corrupt rotation state.
|
|
459
|
+
|
|
460
|
+
### Test helper guidance
|
|
461
|
+
|
|
462
|
+
- follow the existing socket harness style already used in both eventlog test files.
|
|
463
|
+
- add a small deterministic helper for producing test proofs from a known identity and challenge.
|
|
464
|
+
- keep tests in the §it.effect§ style used by this repository.
|
|
465
|
+
|
|
466
|
+
## Implementation plan
|
|
467
|
+
|
|
468
|
+
1. **Implement the end-to-end rotating session auth protocol in one atomic change**
|
|
469
|
+
- add §Hello.challenge§, §Authenticate§, §Authenticated§, and shared §ProtocolError§ protocol types and codec updates
|
|
470
|
+
- add the shared deterministic HMAC proof helper and proof-comparison utilities
|
|
471
|
+
- update both §EventLogRemote.fromSocket§ and §EventLogRemote.fromSocketUnencrypted§ to perform session authentication, bind one public key per socket, cache local proofs, and surface auth failures
|
|
472
|
+
- update §EventLogServerUnencrypted.make§ / §makeHandler§ to maintain shared proof state, gate unauthenticated requests, enforce identity binding, and rotate proofs atomically
|
|
473
|
+
- update/add the affected tests in §EventLogRemote.test.ts§ and §EventLogServerUnencrypted.test.ts§ so the new wire protocol passes end-to-end
|
|
474
|
+
|
|
475
|
+
2. **Run validation and cleanup**
|
|
476
|
+
- run §pnpm lint-fix§
|
|
477
|
+
- run §pnpm test packages/effect/test/unstable/eventlog/EventLogRemote.test.ts§
|
|
478
|
+
- run §pnpm test packages/effect/test/unstable/eventlog/EventLogServerUnencrypted.test.ts§
|
|
479
|
+
- run §pnpm check:tsgo§
|
|
480
|
+
- run §pnpm docgen§
|
|
481
|
+
- update any affected protocol documentation or inline comments discovered during implementation
|
|
482
|
+
|
|
483
|
+
## Validation checklist for implementation
|
|
484
|
+
|
|
485
|
+
- §pnpm lint-fix§
|
|
486
|
+
- §pnpm test packages/effect/test/unstable/eventlog/EventLogRemote.test.ts§
|
|
487
|
+
- §pnpm test packages/effect/test/unstable/eventlog/EventLogServerUnencrypted.test.ts§
|
|
488
|
+
- §pnpm check:tsgo§
|
|
489
|
+
- §pnpm docgen§
|
|
490
|
+
`;
|
|
491
|
+
const content = spec.replaceAll('§', '`');
|
|
492
|
+
await writeFile({ path: '.specs/eventlog-rotating-session-auth.md', content });
|
|
493
|
+
console.log(content);
|