@forgesworn/fold-kit 0.0.0-seed.0 → 0.1.0
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/README.md +154 -4
- package/dist/access.d.ts +34 -0
- package/dist/access.js +102 -0
- package/dist/channel.d.ts +27 -0
- package/dist/channel.js +38 -0
- package/dist/credential.d.ts +58 -0
- package/dist/credential.js +145 -0
- package/dist/display-name.d.ts +38 -0
- package/dist/display-name.js +78 -0
- package/dist/epoch.d.ts +387 -0
- package/dist/epoch.js +665 -0
- package/dist/hex.d.ts +28 -0
- package/dist/hex.js +32 -0
- package/dist/identity.d.ts +49 -0
- package/dist/identity.js +17 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +17 -0
- package/dist/invitation.d.ts +217 -0
- package/dist/invitation.js +484 -0
- package/dist/kinds.d.ts +64 -0
- package/dist/kinds.js +64 -0
- package/dist/lane.d.ts +41 -0
- package/dist/lane.js +63 -0
- package/dist/link.d.ts +52 -0
- package/dist/link.js +107 -0
- package/dist/network-hints.d.ts +16 -0
- package/dist/network-hints.js +65 -0
- package/dist/persistent-invitation.d.ts +35 -0
- package/dist/persistent-invitation.js +118 -0
- package/dist/room.d.ts +53 -0
- package/dist/room.js +153 -0
- package/dist/transport.d.ts +24 -0
- package/dist/transport.js +1 -0
- package/dist/types.d.ts +62 -0
- package/dist/types.js +1 -0
- package/dist/verify.d.ts +26 -0
- package/dist/verify.js +46 -0
- package/llms.txt +100 -0
- package/package.json +76 -6
- package/vectors/circle-vectors.json +2173 -0
- package/vectors/kithmoot-vectors.json +1550 -0
|
@@ -0,0 +1,1550 @@
|
|
|
1
|
+
{
|
|
2
|
+
"protocolVersion": "kithmoot/v1",
|
|
3
|
+
"generatedBy": "vectors/generate.mjs",
|
|
4
|
+
"nostrToolsVersion": "2.25.0",
|
|
5
|
+
"groups": {
|
|
6
|
+
"roomDerivation": [
|
|
7
|
+
{
|
|
8
|
+
"name": "all-zero-secret",
|
|
9
|
+
"kind": "positive",
|
|
10
|
+
"note": "Edge case: a room secret of all-zero bytes derives normally - HKDF has no weak inputs.",
|
|
11
|
+
"input": {
|
|
12
|
+
"secretHex": "0000000000000000000000000000000000000000000000000000000000000000"
|
|
13
|
+
},
|
|
14
|
+
"output": {
|
|
15
|
+
"roomId": "c04f8e4830858345e00ba7a76b77d08b2cb65fa633621e16219a6ff13155b482",
|
|
16
|
+
"roomKeyHex": "e429576fabbb15d72fb770ec10f749e1ecfe9c4a85c5c05ffbbdb53e5ba08cb3"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "all-0xff-secret",
|
|
21
|
+
"kind": "positive",
|
|
22
|
+
"note": "Edge case: a room secret of all-0xff bytes derives normally.",
|
|
23
|
+
"input": {
|
|
24
|
+
"secretHex": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
|
|
25
|
+
},
|
|
26
|
+
"output": {
|
|
27
|
+
"roomId": "3bdc0722605af28dbf47f0a0fb9fc31da83d69a1337002e650e4197c997dcb40",
|
|
28
|
+
"roomKeyHex": "6b5c98e63f51da7289059b5a276cfe747d9752af458bbd30f7330974524a4c5a"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"name": "typical-secret-1",
|
|
33
|
+
"kind": "positive",
|
|
34
|
+
"note": "A representative room secret, reused across the credential/roster/signal groups below so those vectors trace back to one room.",
|
|
35
|
+
"input": {
|
|
36
|
+
"secretHex": "3235bdb7cf4e08d8eb9f1441bd2158825c0e84150ac0fc123a106455130eeecf"
|
|
37
|
+
},
|
|
38
|
+
"output": {
|
|
39
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
40
|
+
"roomKeyHex": "593a3bdd10ea8589533c31ce5860e1f2698fcbc6dc9a7b64713cc94c0c38713c"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"name": "typical-secret-2",
|
|
45
|
+
"kind": "positive",
|
|
46
|
+
"note": "A second representative secret, used as \"a different room\" in wrong-room negative cases elsewhere.",
|
|
47
|
+
"input": {
|
|
48
|
+
"secretHex": "d65ea38d656270d9eebcb949759dec4599cade320bd53cf2bce301e2c23fd72d"
|
|
49
|
+
},
|
|
50
|
+
"output": {
|
|
51
|
+
"roomId": "fcdc853ddc1be7f7d978367e1a5156b55f11e4c22a49db949f5bb939a303762a",
|
|
52
|
+
"roomKeyHex": "deb56b230478ea80360cf944c2f67e3ff54bbeed6bc177419cc81ac66d0c3cfa"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
],
|
|
56
|
+
"channelDerivation": [
|
|
57
|
+
{
|
|
58
|
+
"name": "agents",
|
|
59
|
+
"kind": "positive",
|
|
60
|
+
"note": "The `agents` channel of ROOM_1: id = HKDF-SHA256(ikm = roomKey, info = \"kithmoot/v1/channel-id/agents\", 32 bytes) as hex, key = HKDF-SHA256(ikm = roomKey, info = \"kithmoot/v1/channel-key/agents\", 32 bytes). No salt. A chat event on this channel carries the id in its `d` tag and is NIP-44-encrypted under the key; the credential inside is still checked against the ROOM id.",
|
|
61
|
+
"input": {
|
|
62
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
63
|
+
"roomKeyHex": "593a3bdd10ea8589533c31ce5860e1f2698fcbc6dc9a7b64713cc94c0c38713c",
|
|
64
|
+
"channel": "agents"
|
|
65
|
+
},
|
|
66
|
+
"output": {
|
|
67
|
+
"id": "f07da1bdc33e83a4d21507bac3a5eaf6b8813b3eaf45dbd9b84c5924198c005b",
|
|
68
|
+
"keyHex": "9d8e52617e4707232e352b0c1cce989c7396f4e9f9abfaf8055fcd4c0a8a6ea9"
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"name": "transcript",
|
|
73
|
+
"kind": "positive",
|
|
74
|
+
"note": "The `transcript` channel of ROOM_1: id = HKDF-SHA256(ikm = roomKey, info = \"kithmoot/v1/channel-id/transcript\", 32 bytes) as hex, key = HKDF-SHA256(ikm = roomKey, info = \"kithmoot/v1/channel-key/transcript\", 32 bytes). No salt. A chat event on this channel carries the id in its `d` tag and is NIP-44-encrypted under the key; the credential inside is still checked against the ROOM id.",
|
|
75
|
+
"input": {
|
|
76
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
77
|
+
"roomKeyHex": "593a3bdd10ea8589533c31ce5860e1f2698fcbc6dc9a7b64713cc94c0c38713c",
|
|
78
|
+
"channel": "transcript"
|
|
79
|
+
},
|
|
80
|
+
"output": {
|
|
81
|
+
"id": "ad25c1ca475a7a5909164e3903bde4fbd72e3e5846029228f739a5b11e44316d",
|
|
82
|
+
"keyHex": "1a013931809e01e964a7d7e70b7f2c160c0145771eba407ace77b5ad260e6251"
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"name": "unnamed-is-the-room",
|
|
87
|
+
"kind": "positive",
|
|
88
|
+
"note": "No channel name means the main chat: the id is the room id and the key is the room key, unchanged, so every chat event ever published decodes exactly as before channels existed.",
|
|
89
|
+
"input": {
|
|
90
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
91
|
+
"roomKeyHex": "593a3bdd10ea8589533c31ce5860e1f2698fcbc6dc9a7b64713cc94c0c38713c"
|
|
92
|
+
},
|
|
93
|
+
"output": {
|
|
94
|
+
"id": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
95
|
+
"keyHex": "593a3bdd10ea8589533c31ce5860e1f2698fcbc6dc9a7b64713cc94c0c38713c"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
],
|
|
99
|
+
"joinUrl": [
|
|
100
|
+
{
|
|
101
|
+
"name": "basic-no-policy",
|
|
102
|
+
"kind": "positive",
|
|
103
|
+
"note": "The common case: a secret and two relay hints, no access policy.",
|
|
104
|
+
"input": {
|
|
105
|
+
"base": "https://kithmoot.com/j",
|
|
106
|
+
"secretHex": "3235bdb7cf4e08d8eb9f1441bd2158825c0e84150ac0fc123a106455130eeecf",
|
|
107
|
+
"relays": [
|
|
108
|
+
"wss://relay.damus.io",
|
|
109
|
+
"wss://nos.lol"
|
|
110
|
+
],
|
|
111
|
+
"policy": null
|
|
112
|
+
},
|
|
113
|
+
"output": {
|
|
114
|
+
"url": "https://kithmoot.com/j#eyJzIjoiTWpXOXQ4OU9DTmpybnhSQnZTRllnbHdPaEJVS3dQd1NPaEJrVlJNTzdzOCIsInIiOlsid3NzOi8vcmVsYXkuZGFtdXMuaW8iLCJ3c3M6Ly9ub3MubG9sIl19",
|
|
115
|
+
"decoded": {
|
|
116
|
+
"secretHex": "3235bdb7cf4e08d8eb9f1441bd2158825c0e84150ac0fc123a106455130eeecf",
|
|
117
|
+
"relays": [
|
|
118
|
+
"wss://relay.damus.io",
|
|
119
|
+
"wss://nos.lol"
|
|
120
|
+
],
|
|
121
|
+
"policy": null
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"name": "kith-policy-with-admitted-issuer",
|
|
127
|
+
"kind": "positive",
|
|
128
|
+
"note": "A kith-gated policy round-trips its admitted-issuer allow-list.",
|
|
129
|
+
"input": {
|
|
130
|
+
"base": "https://kithmoot.com/j",
|
|
131
|
+
"secretHex": "3235bdb7cf4e08d8eb9f1441bd2158825c0e84150ac0fc123a106455130eeecf",
|
|
132
|
+
"relays": [
|
|
133
|
+
"wss://relay.damus.io"
|
|
134
|
+
],
|
|
135
|
+
"policy": {
|
|
136
|
+
"tier": "kith",
|
|
137
|
+
"admitted": [
|
|
138
|
+
"00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8"
|
|
139
|
+
]
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
"output": {
|
|
143
|
+
"url": "https://kithmoot.com/j#eyJzIjoiTWpXOXQ4OU9DTmpybnhSQnZTRllnbHdPaEJVS3dQd1NPaEJrVlJNTzdzOCIsInIiOlsid3NzOi8vcmVsYXkuZGFtdXMuaW8iXSwiYSI6eyJ0aWVyIjoia2l0aCIsImFkbWl0dGVkIjpbIjAwYTBiOGI1NzhkZTM2N2U2NWM0MDBjY2NkYjc3NDNlODI0MDNkNDU3NDY5ZDAyMDIzYjE1NjhhOTJmYWFkZDgiXX19",
|
|
144
|
+
"decoded": {
|
|
145
|
+
"secretHex": "3235bdb7cf4e08d8eb9f1441bd2158825c0e84150ac0fc123a106455130eeecf",
|
|
146
|
+
"relays": [
|
|
147
|
+
"wss://relay.damus.io"
|
|
148
|
+
],
|
|
149
|
+
"policy": {
|
|
150
|
+
"tier": "kith",
|
|
151
|
+
"admitted": [
|
|
152
|
+
"00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8"
|
|
153
|
+
]
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"name": "open-policy-has-no-admitted-list",
|
|
160
|
+
"kind": "positive",
|
|
161
|
+
"note": "An 'open' policy carries no admitted list at all - decodeJoinUrl must not invent one.",
|
|
162
|
+
"input": {
|
|
163
|
+
"base": "https://kithmoot.com/j",
|
|
164
|
+
"secretHex": "d65ea38d656270d9eebcb949759dec4599cade320bd53cf2bce301e2c23fd72d",
|
|
165
|
+
"relays": [
|
|
166
|
+
"wss://relay.damus.io",
|
|
167
|
+
"wss://nos.lol"
|
|
168
|
+
],
|
|
169
|
+
"policy": {
|
|
170
|
+
"tier": "open"
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
"output": {
|
|
174
|
+
"url": "https://kithmoot.com/j#eyJzIjoiMWw2ampXVmljTm51dkxsSmRaM3NSWm5LM2pJTDFUenl2T01CNHNJXzF5MCIsInIiOlsid3NzOi8vcmVsYXkuZGFtdXMuaW8iLCJ3c3M6Ly9ub3MubG9sIl0sImEiOnsidGllciI6Im9wZW4ifX0",
|
|
175
|
+
"decoded": {
|
|
176
|
+
"secretHex": "d65ea38d656270d9eebcb949759dec4599cade320bd53cf2bce301e2c23fd72d",
|
|
177
|
+
"relays": [
|
|
178
|
+
"wss://relay.damus.io",
|
|
179
|
+
"wss://nos.lol"
|
|
180
|
+
],
|
|
181
|
+
"policy": {
|
|
182
|
+
"tier": "open"
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"name": "empty-relay-list",
|
|
189
|
+
"kind": "positive",
|
|
190
|
+
"note": "Edge case: an empty relay list is a valid, if useless, join URL.",
|
|
191
|
+
"input": {
|
|
192
|
+
"base": "https://kithmoot.com/j",
|
|
193
|
+
"secretHex": "3235bdb7cf4e08d8eb9f1441bd2158825c0e84150ac0fc123a106455130eeecf",
|
|
194
|
+
"relays": [],
|
|
195
|
+
"policy": null
|
|
196
|
+
},
|
|
197
|
+
"output": {
|
|
198
|
+
"url": "https://kithmoot.com/j#eyJzIjoiTWpXOXQ4OU9DTmpybnhSQnZTRllnbHdPaEJVS3dQd1NPaEJrVlJNTzdzOCIsInIiOltdfQ",
|
|
199
|
+
"decoded": {
|
|
200
|
+
"secretHex": "3235bdb7cf4e08d8eb9f1441bd2158825c0e84150ac0fc123a106455130eeecf",
|
|
201
|
+
"relays": [],
|
|
202
|
+
"policy": null
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"name": "members-policy-round-trip",
|
|
208
|
+
"kind": "positive",
|
|
209
|
+
"note": "A two-member policy, the shape of a direct message, round-trips with its members list normalised to lower case. A malformed list is refused rather than dropped, because a dropped list is an open room.",
|
|
210
|
+
"input": {
|
|
211
|
+
"base": "https://kithmoot.com/j",
|
|
212
|
+
"secretHex": "d65ea38d656270d9eebcb949759dec4599cade320bd53cf2bce301e2c23fd72d",
|
|
213
|
+
"relays": [
|
|
214
|
+
"wss://relay.damus.io",
|
|
215
|
+
"wss://nos.lol"
|
|
216
|
+
],
|
|
217
|
+
"policy": {
|
|
218
|
+
"tier": "open",
|
|
219
|
+
"members": [
|
|
220
|
+
"b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74",
|
|
221
|
+
"e062bd3bb36508cc94edafc132a9f2edfb690fb369b7ea8dd7f62e38b8f4d8ea"
|
|
222
|
+
]
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
"output": {
|
|
226
|
+
"url": "https://kithmoot.com/j#eyJzIjoiMWw2ampXVmljTm51dkxsSmRaM3NSWm5LM2pJTDFUenl2T01CNHNJXzF5MCIsInIiOlsid3NzOi8vcmVsYXkuZGFtdXMuaW8iLCJ3c3M6Ly9ub3MubG9sIl0sImEiOnsidGllciI6Im9wZW4iLCJtZW1iZXJzIjpbImIwN2ZmNjZmZmNhMmQ1NDQ1Y2ZiNGEzODRlOTRmYmE4ZWNjNTAwMDI4M2I0M2YyZDU0MjVjODVkZjUwMzJlNzQiLCJlMDYyYmQzYmIzNjUwOGNjOTRlZGFmYzEzMmE5ZjJlZGZiNjkwZmIzNjliN2VhOGRkN2Y2MmUzOGI4ZjRkOGVhIl19fQ",
|
|
227
|
+
"decoded": {
|
|
228
|
+
"secretHex": "d65ea38d656270d9eebcb949759dec4599cade320bd53cf2bce301e2c23fd72d",
|
|
229
|
+
"relays": [
|
|
230
|
+
"wss://relay.damus.io",
|
|
231
|
+
"wss://nos.lol"
|
|
232
|
+
],
|
|
233
|
+
"policy": {
|
|
234
|
+
"tier": "open",
|
|
235
|
+
"members": [
|
|
236
|
+
"b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74",
|
|
237
|
+
"e062bd3bb36508cc94edafc132a9f2edfb690fb369b7ea8dd7f62e38b8f4d8ea"
|
|
238
|
+
]
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"name": "decode-malformed-fragment",
|
|
245
|
+
"kind": "negative",
|
|
246
|
+
"note": "A fragment that is not valid base64url must be refused, not silently treated as an open room.",
|
|
247
|
+
"input": {
|
|
248
|
+
"url": "https://kithmoot.com/j#not-valid-base64url!!!"
|
|
249
|
+
},
|
|
250
|
+
"output": {
|
|
251
|
+
"throws": true,
|
|
252
|
+
"error": "join URL fragment is not valid"
|
|
253
|
+
}
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"name": "decode-fragment-not-json",
|
|
257
|
+
"kind": "negative",
|
|
258
|
+
"note": "A fragment made entirely of valid base64url characters that decodes to bytes which are not valid JSON at all - the alphabet check alone is not enough; the decoded payload must actually parse.",
|
|
259
|
+
"input": {
|
|
260
|
+
"url": "https://kithmoot.com/j#dGhpcyBpcyBub3QganNvbg"
|
|
261
|
+
},
|
|
262
|
+
"output": {
|
|
263
|
+
"throws": true,
|
|
264
|
+
"error": "join URL fragment is not valid"
|
|
265
|
+
}
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
"name": "decode-payload-wrong-shape",
|
|
269
|
+
"kind": "negative",
|
|
270
|
+
"note": "A fragment that decodes to valid JSON of the wrong shape - no 's' secret field at all - must be refused, not treated as a room with an empty or undefined secret.",
|
|
271
|
+
"input": {
|
|
272
|
+
"url": "https://kithmoot.com/j#eyJ1bmV4cGVjdGVkIjp0cnVlfQ"
|
|
273
|
+
},
|
|
274
|
+
"output": {
|
|
275
|
+
"throws": true,
|
|
276
|
+
"error": "join URL carries a malformed secret"
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
"name": "decode-secret-wrong-length",
|
|
281
|
+
"kind": "negative",
|
|
282
|
+
"note": "A fragment that decodes to valid JSON but carries a 16-byte secret (not 32) must be refused.",
|
|
283
|
+
"input": {
|
|
284
|
+
"url": "https://kithmoot.com/j#eyJzIjoiUnpianpjZndua2VUV2twclh1ZVYydyIsInIiOlsid3NzOi8vcmVsYXkuZXhhbXBsZSJdfQ"
|
|
285
|
+
},
|
|
286
|
+
"output": {
|
|
287
|
+
"throws": true,
|
|
288
|
+
"error": "join URL carries a malformed secret"
|
|
289
|
+
}
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
"name": "decode-policy-unknown-tier",
|
|
293
|
+
"kind": "negative",
|
|
294
|
+
"note": "A policy naming a tier outside open/ken/kith/kin must be refused, not silently dropped into an open room.",
|
|
295
|
+
"input": {
|
|
296
|
+
"url": "https://kithmoot.com/j#eyJzIjoiTWpXOXQ4OU9DTmpybnhSQnZTRllnbHdPaEJVS3dQd1NPaEJrVlJNTzdzOCIsInIiOlsid3NzOi8vcmVsYXkuZXhhbXBsZSJdLCJhIjp7InRpZXIiOiJhcmNob24ifX0"
|
|
297
|
+
},
|
|
298
|
+
"output": {
|
|
299
|
+
"throws": true,
|
|
300
|
+
"error": "join URL carries an access policy at an unknown tier"
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
],
|
|
304
|
+
"deviceCredential": [
|
|
305
|
+
{
|
|
306
|
+
"name": "valid",
|
|
307
|
+
"kind": "positive",
|
|
308
|
+
"note": "A credential signed by the participant, authorising one device, in one room, until an expiry.",
|
|
309
|
+
"input": {
|
|
310
|
+
"participantSkHex": "826f7335cca1f25633dbc6efc43131a651feb9b7d419c9b1fdc35b2e115d2180",
|
|
311
|
+
"devicePubkey": "b4814eb28f92350f362af5eb7a1dc6b9bdd1d27e789f5d97ad3b8c7653753076",
|
|
312
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
313
|
+
"createdAt": 1799990000,
|
|
314
|
+
"expiresAt": 1800003600,
|
|
315
|
+
"auxRandHex": "be66146a98f6f64b2422cf7736519d490118440eb633c58c1a1132f45cbd0347"
|
|
316
|
+
},
|
|
317
|
+
"output": {
|
|
318
|
+
"event": {
|
|
319
|
+
"kind": 20460,
|
|
320
|
+
"created_at": 1799990000,
|
|
321
|
+
"tags": [
|
|
322
|
+
[
|
|
323
|
+
"d",
|
|
324
|
+
"2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
325
|
+
],
|
|
326
|
+
[
|
|
327
|
+
"device",
|
|
328
|
+
"b4814eb28f92350f362af5eb7a1dc6b9bdd1d27e789f5d97ad3b8c7653753076"
|
|
329
|
+
],
|
|
330
|
+
[
|
|
331
|
+
"expiration",
|
|
332
|
+
"1800003600"
|
|
333
|
+
]
|
|
334
|
+
],
|
|
335
|
+
"content": "",
|
|
336
|
+
"pubkey": "b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74",
|
|
337
|
+
"id": "1a59b31aef19d879d8a650e462334887229ea95d3733d1d864c1c7a60b19b8fe",
|
|
338
|
+
"sig": "1c270e8b17baa783d99bb5e2889fb96db189de07e06f46596e84e8139e88a3a143a02d58407bcfa10a75847db42a9c4f0e696ce53b85e82db8714810c1d66821"
|
|
339
|
+
}
|
|
340
|
+
},
|
|
341
|
+
"expected": {
|
|
342
|
+
"verify": {
|
|
343
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
344
|
+
"now": 1800000000
|
|
345
|
+
},
|
|
346
|
+
"result": {
|
|
347
|
+
"ok": true,
|
|
348
|
+
"participant": "b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74",
|
|
349
|
+
"device": "b4814eb28f92350f362af5eb7a1dc6b9bdd1d27e789f5d97ad3b8c7653753076"
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
"name": "wrong-room",
|
|
355
|
+
"kind": "negative",
|
|
356
|
+
"note": "The same, valid credential, checked against a different room id than the one it names.",
|
|
357
|
+
"input": {
|
|
358
|
+
"event": {
|
|
359
|
+
"kind": 20460,
|
|
360
|
+
"created_at": 1799990000,
|
|
361
|
+
"tags": [
|
|
362
|
+
[
|
|
363
|
+
"d",
|
|
364
|
+
"2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
365
|
+
],
|
|
366
|
+
[
|
|
367
|
+
"device",
|
|
368
|
+
"b4814eb28f92350f362af5eb7a1dc6b9bdd1d27e789f5d97ad3b8c7653753076"
|
|
369
|
+
],
|
|
370
|
+
[
|
|
371
|
+
"expiration",
|
|
372
|
+
"1800003600"
|
|
373
|
+
]
|
|
374
|
+
],
|
|
375
|
+
"content": "",
|
|
376
|
+
"pubkey": "b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74",
|
|
377
|
+
"id": "1a59b31aef19d879d8a650e462334887229ea95d3733d1d864c1c7a60b19b8fe",
|
|
378
|
+
"sig": "1c270e8b17baa783d99bb5e2889fb96db189de07e06f46596e84e8139e88a3a143a02d58407bcfa10a75847db42a9c4f0e696ce53b85e82db8714810c1d66821"
|
|
379
|
+
},
|
|
380
|
+
"verify": {
|
|
381
|
+
"roomId": "fcdc853ddc1be7f7d978367e1a5156b55f11e4c22a49db949f5bb939a303762a",
|
|
382
|
+
"now": 1800000000
|
|
383
|
+
}
|
|
384
|
+
},
|
|
385
|
+
"output": {
|
|
386
|
+
"result": {
|
|
387
|
+
"ok": false,
|
|
388
|
+
"reason": "wrong room"
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
"name": "expired",
|
|
394
|
+
"kind": "negative",
|
|
395
|
+
"note": "A credential whose expiry has already passed at verification time.",
|
|
396
|
+
"input": {
|
|
397
|
+
"participantSkHex": "826f7335cca1f25633dbc6efc43131a651feb9b7d419c9b1fdc35b2e115d2180",
|
|
398
|
+
"devicePubkey": "b4814eb28f92350f362af5eb7a1dc6b9bdd1d27e789f5d97ad3b8c7653753076",
|
|
399
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
400
|
+
"createdAt": 1799990000,
|
|
401
|
+
"expiresAt": 1799996400,
|
|
402
|
+
"auxRandHex": "c3e78bc3968fe111a48d0965db57a081e06ab538d8f43c05daa67ce428725808",
|
|
403
|
+
"verify": {
|
|
404
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
405
|
+
"now": 1800000000
|
|
406
|
+
}
|
|
407
|
+
},
|
|
408
|
+
"output": {
|
|
409
|
+
"event": {
|
|
410
|
+
"kind": 20460,
|
|
411
|
+
"created_at": 1799990000,
|
|
412
|
+
"tags": [
|
|
413
|
+
[
|
|
414
|
+
"d",
|
|
415
|
+
"2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
416
|
+
],
|
|
417
|
+
[
|
|
418
|
+
"device",
|
|
419
|
+
"b4814eb28f92350f362af5eb7a1dc6b9bdd1d27e789f5d97ad3b8c7653753076"
|
|
420
|
+
],
|
|
421
|
+
[
|
|
422
|
+
"expiration",
|
|
423
|
+
"1799996400"
|
|
424
|
+
]
|
|
425
|
+
],
|
|
426
|
+
"content": "",
|
|
427
|
+
"pubkey": "b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74",
|
|
428
|
+
"id": "13316da4ab09eccbf1e082e142dbb1c506d13b071a9ee4ef211ec31e7787ee63",
|
|
429
|
+
"sig": "a74148dcf5db1493723f3331f39f5585f25e3ca3912e2250f65487f1030685cea445ba43f36698a927c0a9d893a28aade5c37af9571a2a88b0c30f7dbd1bf3a9"
|
|
430
|
+
},
|
|
431
|
+
"result": {
|
|
432
|
+
"ok": false,
|
|
433
|
+
"reason": "expired"
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
},
|
|
437
|
+
{
|
|
438
|
+
"name": "tampered-signature",
|
|
439
|
+
"kind": "negative",
|
|
440
|
+
"note": "The valid credential's device tag swapped for a different pubkey after signing - the signature no longer covers the tags it is checked against.",
|
|
441
|
+
"input": {
|
|
442
|
+
"event": {
|
|
443
|
+
"kind": 20460,
|
|
444
|
+
"created_at": 1799990000,
|
|
445
|
+
"tags": [
|
|
446
|
+
[
|
|
447
|
+
"d",
|
|
448
|
+
"2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
449
|
+
],
|
|
450
|
+
[
|
|
451
|
+
"device",
|
|
452
|
+
"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
|
|
453
|
+
],
|
|
454
|
+
[
|
|
455
|
+
"expiration",
|
|
456
|
+
"1800003600"
|
|
457
|
+
]
|
|
458
|
+
],
|
|
459
|
+
"content": "",
|
|
460
|
+
"pubkey": "b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74",
|
|
461
|
+
"id": "1a59b31aef19d879d8a650e462334887229ea95d3733d1d864c1c7a60b19b8fe",
|
|
462
|
+
"sig": "1c270e8b17baa783d99bb5e2889fb96db189de07e06f46596e84e8139e88a3a143a02d58407bcfa10a75847db42a9c4f0e696ce53b85e82db8714810c1d66821"
|
|
463
|
+
},
|
|
464
|
+
"verify": {
|
|
465
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
466
|
+
"now": 1800000000
|
|
467
|
+
}
|
|
468
|
+
},
|
|
469
|
+
"output": {
|
|
470
|
+
"result": {
|
|
471
|
+
"ok": false,
|
|
472
|
+
"reason": "bad signature"
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
],
|
|
477
|
+
"kindredProof": [
|
|
478
|
+
{
|
|
479
|
+
"name": "ken",
|
|
480
|
+
"kind": "positive",
|
|
481
|
+
"note": "A ken proof: the issuer vouches for GUEST at the 'ken' tier, in ROOM_1, until KINDRED_EXPIRES_AT. The room and the nonce are both inside the signed message - see canonicalMessage in src/access.ts - so a proof cannot be edited into another room, and two proofs on identical terms are still distinguishable. Pins the signed message layout, not any admission decision - see the accessEvaluation group for that.",
|
|
482
|
+
"input": {
|
|
483
|
+
"hostSkHex": "633c5cc7ad25effea07db59beb6adf86fdb10141db72add5a7e4084e1b6078d3",
|
|
484
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
485
|
+
"tier": "ken",
|
|
486
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
487
|
+
"nonce": "1111111111111111111111111111111111111111111111111111111111111111",
|
|
488
|
+
"expiresAt": 1800003600,
|
|
489
|
+
"auxRandHex": "3da83b091fab6157c0f31a9d8df5ad04a3e7b666c0678ecb514a1b0110418bbc"
|
|
490
|
+
},
|
|
491
|
+
"output": {
|
|
492
|
+
"proof": {
|
|
493
|
+
"tier": "ken",
|
|
494
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
495
|
+
"issuer": "00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8",
|
|
496
|
+
"room": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
497
|
+
"nonce": "1111111111111111111111111111111111111111111111111111111111111111",
|
|
498
|
+
"sig": "1c01fd207ebcf88fbfc6e41d01f807eac4a5bd36778d447406afe3481231bf0dac24f9ff0ad874e9716beb1c4d29685334d0e1960b723797aa158c98c9232cb5",
|
|
499
|
+
"expiresAt": 1800003600
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
},
|
|
503
|
+
{
|
|
504
|
+
"name": "kith",
|
|
505
|
+
"kind": "positive",
|
|
506
|
+
"note": "A kith proof: the issuer vouches for GUEST at the 'kith' tier, in ROOM_1, until KINDRED_EXPIRES_AT. The room and the nonce are both inside the signed message - see canonicalMessage in src/access.ts - so a proof cannot be edited into another room, and two proofs on identical terms are still distinguishable. Pins the signed message layout, not any admission decision - see the accessEvaluation group for that.",
|
|
507
|
+
"input": {
|
|
508
|
+
"hostSkHex": "633c5cc7ad25effea07db59beb6adf86fdb10141db72add5a7e4084e1b6078d3",
|
|
509
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
510
|
+
"tier": "kith",
|
|
511
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
512
|
+
"nonce": "2222222222222222222222222222222222222222222222222222222222222222",
|
|
513
|
+
"expiresAt": 1800003600,
|
|
514
|
+
"auxRandHex": "c2e85df0dd4e98cac103207aa4b674b7ff71e56d099c49390a0c3c57b79176d9"
|
|
515
|
+
},
|
|
516
|
+
"output": {
|
|
517
|
+
"proof": {
|
|
518
|
+
"tier": "kith",
|
|
519
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
520
|
+
"issuer": "00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8",
|
|
521
|
+
"room": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
522
|
+
"nonce": "2222222222222222222222222222222222222222222222222222222222222222",
|
|
523
|
+
"sig": "bea5dfb86bc094d554b2a03c786a4cde384e9df9e734891d66061d8d8b1a64a1dc86b97c6fc437d42ee92d3f4b34846ad912c4618ce87d7f4b6030c5e76eaffd",
|
|
524
|
+
"expiresAt": 1800003600
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
},
|
|
528
|
+
{
|
|
529
|
+
"name": "kin",
|
|
530
|
+
"kind": "positive",
|
|
531
|
+
"note": "A kin proof: the issuer vouches for GUEST at the 'kin' tier, in ROOM_1, until KINDRED_EXPIRES_AT. The room and the nonce are both inside the signed message - see canonicalMessage in src/access.ts - so a proof cannot be edited into another room, and two proofs on identical terms are still distinguishable. Pins the signed message layout, not any admission decision - see the accessEvaluation group for that.",
|
|
532
|
+
"input": {
|
|
533
|
+
"hostSkHex": "633c5cc7ad25effea07db59beb6adf86fdb10141db72add5a7e4084e1b6078d3",
|
|
534
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
535
|
+
"tier": "kin",
|
|
536
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
537
|
+
"nonce": "3333333333333333333333333333333333333333333333333333333333333333",
|
|
538
|
+
"expiresAt": 1800003600,
|
|
539
|
+
"auxRandHex": "d0879a1afafe02d1b9f9f3c84273e538bae21511fdfd36c2b3119880cefbf2c5"
|
|
540
|
+
},
|
|
541
|
+
"output": {
|
|
542
|
+
"proof": {
|
|
543
|
+
"tier": "kin",
|
|
544
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
545
|
+
"issuer": "00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8",
|
|
546
|
+
"room": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
547
|
+
"nonce": "3333333333333333333333333333333333333333333333333333333333333333",
|
|
548
|
+
"sig": "67a3e5f6c1403b74a6181d473d34c2f74e536a6df93dd2d9f9a1cf117507e94fd5e5420be8afa82faced1e065cf7a8a4780bb7312a75f96991f1f1af02504abd",
|
|
549
|
+
"expiresAt": 1800003600
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
],
|
|
554
|
+
"accessEvaluation": [
|
|
555
|
+
{
|
|
556
|
+
"name": "open-room-admits-anyone",
|
|
557
|
+
"kind": "positive",
|
|
558
|
+
"note": "An open room admits any participant without a proof at all.",
|
|
559
|
+
"input": {
|
|
560
|
+
"policy": {
|
|
561
|
+
"tier": "open"
|
|
562
|
+
},
|
|
563
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
564
|
+
"proof": null,
|
|
565
|
+
"now": 1800000000,
|
|
566
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
567
|
+
},
|
|
568
|
+
"output": {
|
|
569
|
+
"result": {
|
|
570
|
+
"admitted": true,
|
|
571
|
+
"reason": "open room"
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
},
|
|
575
|
+
{
|
|
576
|
+
"name": "kith-room-admits-kith-proof",
|
|
577
|
+
"kind": "positive",
|
|
578
|
+
"note": "A kith-gated room admits a matching kith proof from a trusted issuer.",
|
|
579
|
+
"input": {
|
|
580
|
+
"policy": {
|
|
581
|
+
"tier": "kith",
|
|
582
|
+
"admitted": [
|
|
583
|
+
"00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8"
|
|
584
|
+
]
|
|
585
|
+
},
|
|
586
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
587
|
+
"proof": {
|
|
588
|
+
"tier": "kith",
|
|
589
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
590
|
+
"issuer": "00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8",
|
|
591
|
+
"room": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
592
|
+
"nonce": "2222222222222222222222222222222222222222222222222222222222222222",
|
|
593
|
+
"sig": "bea5dfb86bc094d554b2a03c786a4cde384e9df9e734891d66061d8d8b1a64a1dc86b97c6fc437d42ee92d3f4b34846ad912c4618ce87d7f4b6030c5e76eaffd",
|
|
594
|
+
"expiresAt": 1800003600
|
|
595
|
+
},
|
|
596
|
+
"now": 1800000000,
|
|
597
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
598
|
+
},
|
|
599
|
+
"output": {
|
|
600
|
+
"result": {
|
|
601
|
+
"admitted": true,
|
|
602
|
+
"reason": "kindred proof accepted"
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
},
|
|
606
|
+
{
|
|
607
|
+
"name": "kith-room-admits-kin-proof",
|
|
608
|
+
"kind": "positive",
|
|
609
|
+
"note": "A kith-gated room also admits a kin proof - kin is closer than kith.",
|
|
610
|
+
"input": {
|
|
611
|
+
"policy": {
|
|
612
|
+
"tier": "kith",
|
|
613
|
+
"admitted": [
|
|
614
|
+
"00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8"
|
|
615
|
+
]
|
|
616
|
+
},
|
|
617
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
618
|
+
"proof": {
|
|
619
|
+
"tier": "kin",
|
|
620
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
621
|
+
"issuer": "00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8",
|
|
622
|
+
"room": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
623
|
+
"nonce": "3333333333333333333333333333333333333333333333333333333333333333",
|
|
624
|
+
"sig": "67a3e5f6c1403b74a6181d473d34c2f74e536a6df93dd2d9f9a1cf117507e94fd5e5420be8afa82faced1e065cf7a8a4780bb7312a75f96991f1f1af02504abd",
|
|
625
|
+
"expiresAt": 1800003600
|
|
626
|
+
},
|
|
627
|
+
"now": 1800000000,
|
|
628
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
629
|
+
},
|
|
630
|
+
"output": {
|
|
631
|
+
"result": {
|
|
632
|
+
"admitted": true,
|
|
633
|
+
"reason": "kindred proof accepted"
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
},
|
|
637
|
+
{
|
|
638
|
+
"name": "kith-room-rejects-ken-proof",
|
|
639
|
+
"kind": "negative",
|
|
640
|
+
"note": "A kith-gated room refuses a ken proof - ken is one-way recognition and never satisfies a kith gate ('tier too low').",
|
|
641
|
+
"input": {
|
|
642
|
+
"policy": {
|
|
643
|
+
"tier": "kith",
|
|
644
|
+
"admitted": [
|
|
645
|
+
"00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8"
|
|
646
|
+
]
|
|
647
|
+
},
|
|
648
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
649
|
+
"proof": {
|
|
650
|
+
"tier": "ken",
|
|
651
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
652
|
+
"issuer": "00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8",
|
|
653
|
+
"room": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
654
|
+
"nonce": "1111111111111111111111111111111111111111111111111111111111111111",
|
|
655
|
+
"sig": "1c01fd207ebcf88fbfc6e41d01f807eac4a5bd36778d447406afe3481231bf0dac24f9ff0ad874e9716beb1c4d29685334d0e1960b723797aa158c98c9232cb5",
|
|
656
|
+
"expiresAt": 1800003600
|
|
657
|
+
},
|
|
658
|
+
"now": 1800000000,
|
|
659
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
660
|
+
},
|
|
661
|
+
"output": {
|
|
662
|
+
"result": {
|
|
663
|
+
"admitted": false,
|
|
664
|
+
"reason": "tier too low"
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
},
|
|
668
|
+
{
|
|
669
|
+
"name": "kith-room-rejects-untrusted-issuer",
|
|
670
|
+
"kind": "negative",
|
|
671
|
+
"note": "A kith-gated room refuses a well-formed, correctly-signed kith proof from an issuer not on its allow-list.",
|
|
672
|
+
"input": {
|
|
673
|
+
"policy": {
|
|
674
|
+
"tier": "kith",
|
|
675
|
+
"admitted": [
|
|
676
|
+
"00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8"
|
|
677
|
+
]
|
|
678
|
+
},
|
|
679
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
680
|
+
"proof": {
|
|
681
|
+
"tier": "kith",
|
|
682
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
683
|
+
"issuer": "9d62f4907fa01b43a61acd6f9e81671b5a87f603ab51dc2aad4eb52cde8613f5",
|
|
684
|
+
"room": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
685
|
+
"nonce": "4444444444444444444444444444444444444444444444444444444444444444",
|
|
686
|
+
"sig": "cff34e5e68f4e9ffe759ee343cea39b38bbbaf43f08e966391521e45deee7f2ca1249a3870aec86d969cfcf3b54cd122c1b08caccce6e4d42290d3db7435f97a",
|
|
687
|
+
"expiresAt": 1800003600
|
|
688
|
+
},
|
|
689
|
+
"now": 1800000000,
|
|
690
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
691
|
+
},
|
|
692
|
+
"output": {
|
|
693
|
+
"result": {
|
|
694
|
+
"admitted": false,
|
|
695
|
+
"reason": "untrusted issuer"
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
},
|
|
699
|
+
{
|
|
700
|
+
"name": "members-admit-a-listed-participant",
|
|
701
|
+
"kind": "positive",
|
|
702
|
+
"note": "An open room with a members list admits a participant on the list, with no proof, as an open room does.",
|
|
703
|
+
"input": {
|
|
704
|
+
"policy": {
|
|
705
|
+
"tier": "open",
|
|
706
|
+
"members": [
|
|
707
|
+
"00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8",
|
|
708
|
+
"49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525"
|
|
709
|
+
]
|
|
710
|
+
},
|
|
711
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
712
|
+
"proof": null,
|
|
713
|
+
"now": 1800000000,
|
|
714
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
715
|
+
},
|
|
716
|
+
"output": {
|
|
717
|
+
"result": {
|
|
718
|
+
"admitted": true,
|
|
719
|
+
"reason": "open room"
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
},
|
|
723
|
+
{
|
|
724
|
+
"name": "members-refuse-a-stranger",
|
|
725
|
+
"kind": "negative",
|
|
726
|
+
"note": "A members list shuts the door to anybody not on it, whatever the tier says ('not a member'). This is what makes a two-member room a direct message.",
|
|
727
|
+
"input": {
|
|
728
|
+
"policy": {
|
|
729
|
+
"tier": "open",
|
|
730
|
+
"members": [
|
|
731
|
+
"00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8",
|
|
732
|
+
"b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74"
|
|
733
|
+
]
|
|
734
|
+
},
|
|
735
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
736
|
+
"proof": null,
|
|
737
|
+
"now": 1800000000,
|
|
738
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
739
|
+
},
|
|
740
|
+
"output": {
|
|
741
|
+
"result": {
|
|
742
|
+
"admitted": false,
|
|
743
|
+
"reason": "not a member"
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
},
|
|
747
|
+
{
|
|
748
|
+
"name": "members-compared-case-insensitively",
|
|
749
|
+
"kind": "positive",
|
|
750
|
+
"note": "A members entry in upper-case hex names the same participant. The rule every hex identifier here follows.",
|
|
751
|
+
"input": {
|
|
752
|
+
"policy": {
|
|
753
|
+
"tier": "open",
|
|
754
|
+
"members": [
|
|
755
|
+
"49EBB8E92DE99C03390BB88AB02704AB2A66332101FF895C512756AD7648E525"
|
|
756
|
+
]
|
|
757
|
+
},
|
|
758
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
759
|
+
"proof": null,
|
|
760
|
+
"now": 1800000000,
|
|
761
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
762
|
+
},
|
|
763
|
+
"output": {
|
|
764
|
+
"result": {
|
|
765
|
+
"admitted": true,
|
|
766
|
+
"reason": "open room"
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
},
|
|
770
|
+
{
|
|
771
|
+
"name": "members-still-need-the-tier",
|
|
772
|
+
"kind": "negative",
|
|
773
|
+
"note": "A listed member of a kith-gated room still needs a kith proof ('no kindred proof'): the list narrows who may enter, it never widens what they must show.",
|
|
774
|
+
"input": {
|
|
775
|
+
"policy": {
|
|
776
|
+
"tier": "kith",
|
|
777
|
+
"admitted": [
|
|
778
|
+
"00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8"
|
|
779
|
+
],
|
|
780
|
+
"members": [
|
|
781
|
+
"49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525"
|
|
782
|
+
]
|
|
783
|
+
},
|
|
784
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
785
|
+
"proof": null,
|
|
786
|
+
"now": 1800000000,
|
|
787
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
788
|
+
},
|
|
789
|
+
"output": {
|
|
790
|
+
"result": {
|
|
791
|
+
"admitted": false,
|
|
792
|
+
"reason": "no kindred proof"
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
},
|
|
796
|
+
{
|
|
797
|
+
"name": "kith-room-admits-issuer-via-upper-case-allow-list-entry",
|
|
798
|
+
"kind": "positive",
|
|
799
|
+
"note": "The allow-list names the trusted issuer (HOST) in upper-case hex; the proof itself is issued and signed normally, so its issuer field is the ordinary lower-case pubkey. Still admitted - an implementation that compares the allow-list entry to the issuer with an exact string match wrongly refuses this.",
|
|
800
|
+
"input": {
|
|
801
|
+
"policy": {
|
|
802
|
+
"tier": "kith",
|
|
803
|
+
"admitted": [
|
|
804
|
+
"00A0B8B578DE367E65C400CCCDB7743E82403D457469D02023B1568A92FAADD8"
|
|
805
|
+
]
|
|
806
|
+
},
|
|
807
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
808
|
+
"proof": {
|
|
809
|
+
"tier": "kith",
|
|
810
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
811
|
+
"issuer": "00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8",
|
|
812
|
+
"room": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
813
|
+
"nonce": "2222222222222222222222222222222222222222222222222222222222222222",
|
|
814
|
+
"sig": "bea5dfb86bc094d554b2a03c786a4cde384e9df9e734891d66061d8d8b1a64a1dc86b97c6fc437d42ee92d3f4b34846ad912c4618ce87d7f4b6030c5e76eaffd",
|
|
815
|
+
"expiresAt": 1800003600
|
|
816
|
+
},
|
|
817
|
+
"now": 1800000000,
|
|
818
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
819
|
+
},
|
|
820
|
+
"output": {
|
|
821
|
+
"result": {
|
|
822
|
+
"admitted": true,
|
|
823
|
+
"reason": "kindred proof accepted"
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
},
|
|
827
|
+
{
|
|
828
|
+
"name": "kith-room-admits-upper-case-issuer-against-lower-case-allow-list",
|
|
829
|
+
"kind": "positive",
|
|
830
|
+
"note": "The mirror image: the proof carries its own issuer field in upper-case hex - issuer is not part of the signed message (see canonicalMessage in src/access.ts), so upper-casing it does not disturb the signature - while the room's allow-list names HOST in the ordinary lower case. Still admitted.",
|
|
831
|
+
"input": {
|
|
832
|
+
"policy": {
|
|
833
|
+
"tier": "kith",
|
|
834
|
+
"admitted": [
|
|
835
|
+
"00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8"
|
|
836
|
+
]
|
|
837
|
+
},
|
|
838
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
839
|
+
"proof": {
|
|
840
|
+
"tier": "kith",
|
|
841
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
842
|
+
"issuer": "00A0B8B578DE367E65C400CCCDB7743E82403D457469D02023B1568A92FAADD8",
|
|
843
|
+
"room": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
844
|
+
"nonce": "2222222222222222222222222222222222222222222222222222222222222222",
|
|
845
|
+
"sig": "bea5dfb86bc094d554b2a03c786a4cde384e9df9e734891d66061d8d8b1a64a1dc86b97c6fc437d42ee92d3f4b34846ad912c4618ce87d7f4b6030c5e76eaffd",
|
|
846
|
+
"expiresAt": 1800003600
|
|
847
|
+
},
|
|
848
|
+
"now": 1800000000,
|
|
849
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
850
|
+
},
|
|
851
|
+
"output": {
|
|
852
|
+
"result": {
|
|
853
|
+
"admitted": true,
|
|
854
|
+
"reason": "kindred proof accepted"
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
},
|
|
858
|
+
{
|
|
859
|
+
"name": "kith-room-rejects-proof-for-another-room",
|
|
860
|
+
"kind": "negative",
|
|
861
|
+
"note": "A kith proof from the trusted issuer, at a sufficient tier, unexpired, naming the right participant - and minted for a different room. An implementation that does not compare proof.room to the room being joined admits a proof its issuer never granted here ('proof names another room').",
|
|
862
|
+
"input": {
|
|
863
|
+
"policy": {
|
|
864
|
+
"tier": "kith",
|
|
865
|
+
"admitted": [
|
|
866
|
+
"00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8"
|
|
867
|
+
]
|
|
868
|
+
},
|
|
869
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
870
|
+
"proof": {
|
|
871
|
+
"tier": "kith",
|
|
872
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
873
|
+
"issuer": "00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8",
|
|
874
|
+
"room": "fcdc853ddc1be7f7d978367e1a5156b55f11e4c22a49db949f5bb939a303762a",
|
|
875
|
+
"nonce": "5555555555555555555555555555555555555555555555555555555555555555",
|
|
876
|
+
"sig": "9219ba666fc6f1327da258c1a1434c3feacb41b2665915cd5d9b90af1bd0805bdb0217cfcab2f49fd128ac64756c972c0b2ea731223b23b7a2ae2012c34f09df",
|
|
877
|
+
"expiresAt": 1800003600
|
|
878
|
+
},
|
|
879
|
+
"now": 1800000000,
|
|
880
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
881
|
+
},
|
|
882
|
+
"output": {
|
|
883
|
+
"result": {
|
|
884
|
+
"admitted": false,
|
|
885
|
+
"reason": "proof names another room"
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
},
|
|
889
|
+
{
|
|
890
|
+
"name": "kith-room-rejects-room-edited-into-the-proof",
|
|
891
|
+
"kind": "negative",
|
|
892
|
+
"note": "The same other-room proof with its `room` field rewritten to name this room. The room is inside the signed message, so rewriting it invalidates the signature ('bad signature') - an implementation that binds the room but leaves it out of canonicalMessage admits this.",
|
|
893
|
+
"input": {
|
|
894
|
+
"policy": {
|
|
895
|
+
"tier": "kith",
|
|
896
|
+
"admitted": [
|
|
897
|
+
"00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8"
|
|
898
|
+
]
|
|
899
|
+
},
|
|
900
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
901
|
+
"proof": {
|
|
902
|
+
"tier": "kith",
|
|
903
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
904
|
+
"issuer": "00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8",
|
|
905
|
+
"room": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
906
|
+
"nonce": "5555555555555555555555555555555555555555555555555555555555555555",
|
|
907
|
+
"sig": "9219ba666fc6f1327da258c1a1434c3feacb41b2665915cd5d9b90af1bd0805bdb0217cfcab2f49fd128ac64756c972c0b2ea731223b23b7a2ae2012c34f09df",
|
|
908
|
+
"expiresAt": 1800003600
|
|
909
|
+
},
|
|
910
|
+
"now": 1800000000,
|
|
911
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
912
|
+
},
|
|
913
|
+
"output": {
|
|
914
|
+
"result": {
|
|
915
|
+
"admitted": false,
|
|
916
|
+
"reason": "bad signature"
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
},
|
|
920
|
+
{
|
|
921
|
+
"name": "kith-room-admits-proof-against-upper-case-room-id",
|
|
922
|
+
"kind": "positive",
|
|
923
|
+
"note": "The room id handed to evaluateAccess is upper-case hex naming the very room the proof was minted for. Hex identifiers are compared case-insensitively throughout - see the section of this README on that - so this is still admitted.",
|
|
924
|
+
"input": {
|
|
925
|
+
"policy": {
|
|
926
|
+
"tier": "kith",
|
|
927
|
+
"admitted": [
|
|
928
|
+
"00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8"
|
|
929
|
+
]
|
|
930
|
+
},
|
|
931
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
932
|
+
"proof": {
|
|
933
|
+
"tier": "kith",
|
|
934
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
935
|
+
"issuer": "00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8",
|
|
936
|
+
"room": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
937
|
+
"nonce": "2222222222222222222222222222222222222222222222222222222222222222",
|
|
938
|
+
"sig": "bea5dfb86bc094d554b2a03c786a4cde384e9df9e734891d66061d8d8b1a64a1dc86b97c6fc437d42ee92d3f4b34846ad912c4618ce87d7f4b6030c5e76eaffd",
|
|
939
|
+
"expiresAt": 1800003600
|
|
940
|
+
},
|
|
941
|
+
"now": 1800000000,
|
|
942
|
+
"roomId": "2848BDD5C60A79E2DFE667AE9616C1107F61709032B66E556E28F4A96E69450B"
|
|
943
|
+
},
|
|
944
|
+
"output": {
|
|
945
|
+
"result": {
|
|
946
|
+
"admitted": true,
|
|
947
|
+
"reason": "kindred proof accepted"
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
},
|
|
951
|
+
{
|
|
952
|
+
"name": "kith-room-rejects-tampered-signature",
|
|
953
|
+
"kind": "negative",
|
|
954
|
+
"note": "A kith proof from the trusted issuer, at a sufficient tier, unexpired, naming the right participant - identical to 'kith-room-admits-kith-proof' except its signature is garbage. Every check before the final schnorr verification passes; skip that check, or skip it entirely, and this is indistinguishable from a genuine proof.",
|
|
955
|
+
"input": {
|
|
956
|
+
"policy": {
|
|
957
|
+
"tier": "kith",
|
|
958
|
+
"admitted": [
|
|
959
|
+
"00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8"
|
|
960
|
+
]
|
|
961
|
+
},
|
|
962
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
963
|
+
"proof": {
|
|
964
|
+
"tier": "kith",
|
|
965
|
+
"participant": "49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
966
|
+
"issuer": "00a0b8b578de367e65c400cccdb7743e82403d457469d02023b1568a92faadd8",
|
|
967
|
+
"room": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
968
|
+
"nonce": "2222222222222222222222222222222222222222222222222222222222222222",
|
|
969
|
+
"sig": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
|
970
|
+
"expiresAt": 1800003600
|
|
971
|
+
},
|
|
972
|
+
"now": 1800000000,
|
|
973
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
974
|
+
},
|
|
975
|
+
"output": {
|
|
976
|
+
"result": {
|
|
977
|
+
"admitted": false,
|
|
978
|
+
"reason": "bad signature"
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
}
|
|
982
|
+
],
|
|
983
|
+
"roomEpoch": [
|
|
984
|
+
{
|
|
985
|
+
"name": "epoch-zero-is-the-room",
|
|
986
|
+
"kind": "positive",
|
|
987
|
+
"note": "Epoch 0 is not a special case bolted on: it derives to exactly what `deriveRoom` derives, with the same two HKDF info strings and no salt. A client that has never heard of epochs and one that has agree byte for byte on a room nobody has been removed from, which is what makes the whole mechanism additive.",
|
|
988
|
+
"input": {
|
|
989
|
+
"epoch": 0,
|
|
990
|
+
"secretHex": "3235bdb7cf4e08d8eb9f1441bd2158825c0e84150ac0fc123a106455130eeecf"
|
|
991
|
+
},
|
|
992
|
+
"output": {
|
|
993
|
+
"id": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
994
|
+
"keyHex": "593a3bdd10ea8589533c31ce5860e1f2698fcbc6dc9a7b64713cc94c0c38713c",
|
|
995
|
+
"epoch": 0
|
|
996
|
+
}
|
|
997
|
+
},
|
|
998
|
+
{
|
|
999
|
+
"name": "epoch-one",
|
|
1000
|
+
"kind": "positive",
|
|
1001
|
+
"note": "The first successor. `id = HKDF-SHA256(ikm = secret, info = \"kithmoot/v1/epoch-id/1\", 32)` as hex and `key = HKDF-SHA256(ikm = secret, info = \"kithmoot/v1/epoch-key/1\", 32)`, no salt. The secret is the one the rekey sealed to each remaining device - NOT the original room secret, which the removed device still holds and which now opens nothing.",
|
|
1002
|
+
"input": {
|
|
1003
|
+
"epoch": 1,
|
|
1004
|
+
"secretHex": "3235bdb7cf4e08d8eb9f1441bd2158825c0e84150ac0fc123a106455130eeecf"
|
|
1005
|
+
},
|
|
1006
|
+
"output": {
|
|
1007
|
+
"id": "664281bc1183839a58405e3281450f3b71f4add0346f826c0f1c4209d767fb91",
|
|
1008
|
+
"keyHex": "8d439bd5a6c2a53e0e3c792e8f1ed8be7aacc227b3a4b74efd8973952b22406d",
|
|
1009
|
+
"epoch": 1
|
|
1010
|
+
}
|
|
1011
|
+
},
|
|
1012
|
+
{
|
|
1013
|
+
"name": "epoch-two",
|
|
1014
|
+
"kind": "positive",
|
|
1015
|
+
"note": "A second removal from a room already at epoch 1: a fresh secret again, and the info strings carry the number so two epochs of one room never collide.",
|
|
1016
|
+
"input": {
|
|
1017
|
+
"epoch": 2,
|
|
1018
|
+
"secretHex": "3d3480782bd9eabca24b6f9a541531aa2ca4dc535342d8abf1c2347d58ab26cb"
|
|
1019
|
+
},
|
|
1020
|
+
"output": {
|
|
1021
|
+
"id": "d3593c601c50a26d2dffa2096660ad6ceea3c66ff481fa9d17e00fbdf3931ac4",
|
|
1022
|
+
"keyHex": "1413d7a381318a9b0d302dc315850f3bb6085ded694a074ceddf8eceecc95e8c",
|
|
1023
|
+
"epoch": 2
|
|
1024
|
+
}
|
|
1025
|
+
},
|
|
1026
|
+
{
|
|
1027
|
+
"name": "rekey",
|
|
1028
|
+
"kind": "positive",
|
|
1029
|
+
"note": "The authority moves the room to epoch 1 and removes one device. Encrypted to the epoch being LEFT, so everybody currently in the room can read who left; the successor secret inside is sealed separately to each device that stays, under a NIP-44 conversation key between the authority and that device, so the removed device reads the notice and not the secret. `peekRekeyEvent` answers \"which epoch is this\" with no key at all, which is how a device that has fallen behind knows it has.",
|
|
1030
|
+
"input": {
|
|
1031
|
+
"event": {
|
|
1032
|
+
"kind": 1462,
|
|
1033
|
+
"created_at": 1799999000,
|
|
1034
|
+
"tags": [
|
|
1035
|
+
[
|
|
1036
|
+
"d",
|
|
1037
|
+
"2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
1038
|
+
],
|
|
1039
|
+
[
|
|
1040
|
+
"epoch",
|
|
1041
|
+
"1"
|
|
1042
|
+
]
|
|
1043
|
+
],
|
|
1044
|
+
"content": "AoO5rvD56/1qncZx+6GpPUsuFX9oEhRM59Ew2V5tGsEJLh8PbHyTAJBz1+Q4s8C54egFnpXKtusbE0JKwsmIACdwRXkmEX/nFGXzN6sgblDOt4t/X1RLygvxPBGiv264zMOQzrBKmZG3LIyN0x3QISgwQcfaKiK+P+Em5pcifbVqENhWIv3kj1g7jgjbNLeivnLBY73P14E5GOOJgT0RVXbi4+ZtE9t7lpw58KlwWNdrfPiGM+antUOTD3vptFSXmjw1LfMNzWEV19vqIFheK9luoLiQ6lXjpz3w4s9rJJCioIjM2K6Q2S+bHWmnaZMmOMC7ZtX8Yjt8jtPjLPMwJtkGSN+ewQRVgzLCDAczcbas9tpE1sitWA3r29meWHsIO/XKmA1FnuxelkamYRMkcVhl6Hg+Dc5WyFtZIDC9WBTo39yNkIWDqFKxuArvaZjYaxWq/cfk3UCsiYjgkuccEuZ+ZEktV5jGsaQaJFgl7HB0DYPWIZPVS4UKZnRyQruD9RYoK4dHVPtP16MkbetK6TOs3Re5HJpi/c0rX6RoP31nVdIP0EVsXdagxzABVz6P+u/d8KSDaeEKGm3txnaIfgftJIqTyv38J8e0CXPgdSMFtI44seJODzMO3mUWHl7mkBrmatxF3Yw/XQv+Ifn/nH0toK0gb3ObJ/5gXjLLtcDsqXA=",
|
|
1045
|
+
"pubkey": "47ab2a9f89f155b277f1e847d7d4eba664d28324ee903ffc051bdc9e14869f86",
|
|
1046
|
+
"id": "0f2be00e697df3d8e1f9e9a7ce0eef906ae69886460ff8a5af969f4628280287",
|
|
1047
|
+
"sig": "0eeff57ea5996cd84ee3a43941f085cc3788b5ae3cbf6875e3a5f7585810605dacb143225dcfe136a2fe975d90ea708d0d271f2593ff731d32f6926ce579f371"
|
|
1048
|
+
},
|
|
1049
|
+
"authoritySkHex": "e407c0989f606d8165f63d104e1674a462b191e1df99a29ae9be3f2907deca32",
|
|
1050
|
+
"currentEpoch": 0,
|
|
1051
|
+
"currentKeyHex": "593a3bdd10ea8589533c31ce5860e1f2698fcbc6dc9a7b64713cc94c0c38713c",
|
|
1052
|
+
"next": {
|
|
1053
|
+
"epoch": 1,
|
|
1054
|
+
"secretHex": "3d3480782bd9eabca24b6f9a541531aa2ca4dc535342d8abf1c2347d58ab26cb"
|
|
1055
|
+
},
|
|
1056
|
+
"recipients": [
|
|
1057
|
+
"fcd74d122f0a212a673839482f69ad973f6d38735faeeb3e57929c2b916492fe"
|
|
1058
|
+
],
|
|
1059
|
+
"removed": [
|
|
1060
|
+
"5defbe2990a67eb3589071a06ddf03c405276fa90373f9028be03b8fdc666428"
|
|
1061
|
+
],
|
|
1062
|
+
"by": "b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74",
|
|
1063
|
+
"createdAt": 1799999000,
|
|
1064
|
+
"nonceHex": "83b9aef0f9ebfd6a9dc671fba1a93d4b2e157f6812144ce7d130d95e6d1ac109",
|
|
1065
|
+
"sealNonceHex": "e617dbf94c459bab110bc2d6a3e9e8d90c84fc0e8f5c335234a19af8c56a84fc",
|
|
1066
|
+
"auxRandHex": "0d6b80f76bdb16bb87510db4ed0acdf1f4dbcb390b13b3c896b2129db761d80a"
|
|
1067
|
+
},
|
|
1068
|
+
"output": {
|
|
1069
|
+
"peek": 1,
|
|
1070
|
+
"result": {
|
|
1071
|
+
"epoch": 1,
|
|
1072
|
+
"removed": [
|
|
1073
|
+
"5defbe2990a67eb3589071a06ddf03c405276fa90373f9028be03b8fdc666428"
|
|
1074
|
+
],
|
|
1075
|
+
"closed": false,
|
|
1076
|
+
"at": 1799999000,
|
|
1077
|
+
"by": "b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74",
|
|
1078
|
+
"secretHex": "3d3480782bd9eabca24b6f9a541531aa2ca4dc535342d8abf1c2347d58ab26cb"
|
|
1079
|
+
}
|
|
1080
|
+
},
|
|
1081
|
+
"expected": {
|
|
1082
|
+
"decode": {
|
|
1083
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
1084
|
+
"authority": "47ab2a9f89f155b277f1e847d7d4eba664d28324ee903ffc051bdc9e14869f86",
|
|
1085
|
+
"current": {
|
|
1086
|
+
"epoch": 0,
|
|
1087
|
+
"id": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
1088
|
+
"keyHex": "593a3bdd10ea8589533c31ce5860e1f2698fcbc6dc9a7b64713cc94c0c38713c"
|
|
1089
|
+
},
|
|
1090
|
+
"deviceSkHex": "751627289895e0df520a348eed03006ac69522989ce970c8a4926268de6f69de"
|
|
1091
|
+
},
|
|
1092
|
+
"result": {
|
|
1093
|
+
"epoch": 1,
|
|
1094
|
+
"removed": [
|
|
1095
|
+
"5defbe2990a67eb3589071a06ddf03c405276fa90373f9028be03b8fdc666428"
|
|
1096
|
+
],
|
|
1097
|
+
"closed": false,
|
|
1098
|
+
"at": 1799999000,
|
|
1099
|
+
"by": "b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74",
|
|
1100
|
+
"secretHex": "3d3480782bd9eabca24b6f9a541531aa2ca4dc535342d8abf1c2347d58ab26cb"
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
1103
|
+
},
|
|
1104
|
+
{
|
|
1105
|
+
"name": "rekey-read-by-the-removed-device",
|
|
1106
|
+
"kind": "positive",
|
|
1107
|
+
"note": "The same event, decoded by the device it removes. It decodes - the notice is encrypted to the epoch that device still holds - and it carries no `secret`, because no copy was sealed to it. A client must treat \"decoded, no secret\" as \"you are out\", not as an error: it is how a removed member learns it has been removed, and it is the only notice it will get.",
|
|
1108
|
+
"input": {
|
|
1109
|
+
"event": {
|
|
1110
|
+
"kind": 1462,
|
|
1111
|
+
"created_at": 1799999000,
|
|
1112
|
+
"tags": [
|
|
1113
|
+
[
|
|
1114
|
+
"d",
|
|
1115
|
+
"2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
1116
|
+
],
|
|
1117
|
+
[
|
|
1118
|
+
"epoch",
|
|
1119
|
+
"1"
|
|
1120
|
+
]
|
|
1121
|
+
],
|
|
1122
|
+
"content": "AoO5rvD56/1qncZx+6GpPUsuFX9oEhRM59Ew2V5tGsEJLh8PbHyTAJBz1+Q4s8C54egFnpXKtusbE0JKwsmIACdwRXkmEX/nFGXzN6sgblDOt4t/X1RLygvxPBGiv264zMOQzrBKmZG3LIyN0x3QISgwQcfaKiK+P+Em5pcifbVqENhWIv3kj1g7jgjbNLeivnLBY73P14E5GOOJgT0RVXbi4+ZtE9t7lpw58KlwWNdrfPiGM+antUOTD3vptFSXmjw1LfMNzWEV19vqIFheK9luoLiQ6lXjpz3w4s9rJJCioIjM2K6Q2S+bHWmnaZMmOMC7ZtX8Yjt8jtPjLPMwJtkGSN+ewQRVgzLCDAczcbas9tpE1sitWA3r29meWHsIO/XKmA1FnuxelkamYRMkcVhl6Hg+Dc5WyFtZIDC9WBTo39yNkIWDqFKxuArvaZjYaxWq/cfk3UCsiYjgkuccEuZ+ZEktV5jGsaQaJFgl7HB0DYPWIZPVS4UKZnRyQruD9RYoK4dHVPtP16MkbetK6TOs3Re5HJpi/c0rX6RoP31nVdIP0EVsXdagxzABVz6P+u/d8KSDaeEKGm3txnaIfgftJIqTyv38J8e0CXPgdSMFtI44seJODzMO3mUWHl7mkBrmatxF3Yw/XQv+Ifn/nH0toK0gb3ObJ/5gXjLLtcDsqXA=",
|
|
1123
|
+
"pubkey": "47ab2a9f89f155b277f1e847d7d4eba664d28324ee903ffc051bdc9e14869f86",
|
|
1124
|
+
"id": "0f2be00e697df3d8e1f9e9a7ce0eef906ae69886460ff8a5af969f4628280287",
|
|
1125
|
+
"sig": "0eeff57ea5996cd84ee3a43941f085cc3788b5ae3cbf6875e3a5f7585810605dacb143225dcfe136a2fe975d90ea708d0d271f2593ff731d32f6926ce579f371"
|
|
1126
|
+
}
|
|
1127
|
+
},
|
|
1128
|
+
"output": {
|
|
1129
|
+
"result": {
|
|
1130
|
+
"epoch": 1,
|
|
1131
|
+
"removed": [
|
|
1132
|
+
"5defbe2990a67eb3589071a06ddf03c405276fa90373f9028be03b8fdc666428"
|
|
1133
|
+
],
|
|
1134
|
+
"closed": false,
|
|
1135
|
+
"at": 1799999000,
|
|
1136
|
+
"by": "b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74"
|
|
1137
|
+
}
|
|
1138
|
+
},
|
|
1139
|
+
"expected": {
|
|
1140
|
+
"decode": {
|
|
1141
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
1142
|
+
"authority": "47ab2a9f89f155b277f1e847d7d4eba664d28324ee903ffc051bdc9e14869f86",
|
|
1143
|
+
"current": {
|
|
1144
|
+
"epoch": 0,
|
|
1145
|
+
"id": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
1146
|
+
"keyHex": "593a3bdd10ea8589533c31ce5860e1f2698fcbc6dc9a7b64713cc94c0c38713c"
|
|
1147
|
+
},
|
|
1148
|
+
"deviceSkHex": "f785badbca3915e8138c6bb54bc5cf69e8798485d7ea084daec5bae58db6d9e6"
|
|
1149
|
+
},
|
|
1150
|
+
"result": {
|
|
1151
|
+
"epoch": 1,
|
|
1152
|
+
"removed": [
|
|
1153
|
+
"5defbe2990a67eb3589071a06ddf03c405276fa90373f9028be03b8fdc666428"
|
|
1154
|
+
],
|
|
1155
|
+
"closed": false,
|
|
1156
|
+
"at": 1799999000,
|
|
1157
|
+
"by": "b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74"
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
},
|
|
1161
|
+
{
|
|
1162
|
+
"name": "rekey-closed",
|
|
1163
|
+
"kind": "positive",
|
|
1164
|
+
"note": "Closing a room is a rekey with no sealed copies at all: the epoch advances and nobody is given the successor, so nothing further can be published or read. `closed` is inside the ciphertext and is only a JSON `true`; the empty `keys` object is what actually closes the room, and a client that ignored the flag would still find itself with no key.",
|
|
1165
|
+
"input": {
|
|
1166
|
+
"event": {
|
|
1167
|
+
"kind": 1462,
|
|
1168
|
+
"created_at": 1799999000,
|
|
1169
|
+
"tags": [
|
|
1170
|
+
[
|
|
1171
|
+
"d",
|
|
1172
|
+
"2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
1173
|
+
],
|
|
1174
|
+
[
|
|
1175
|
+
"epoch",
|
|
1176
|
+
"1"
|
|
1177
|
+
]
|
|
1178
|
+
],
|
|
1179
|
+
"content": "AsJHGiHMdGf9Lyh+V6t8YAB522hkumHqYMOBpXj/xyPwr4AmvHyQVFAQe3bPRGssKZggHOPlMuCrU2OALnfwdhgAPMjYalin3wvvHeucJ7laIUlPAVc5Jt78SBK9dxcn01O1KXc1o0HgM64kk3R95lmgexGgScTKNjIYAYb5KBhlBcg=",
|
|
1180
|
+
"pubkey": "47ab2a9f89f155b277f1e847d7d4eba664d28324ee903ffc051bdc9e14869f86",
|
|
1181
|
+
"id": "eda9f0c935062c12dd80c6e24129390f5820101843b2cf5ded52ddd1adb6c0e8",
|
|
1182
|
+
"sig": "5bf0cd13c2a77875306e3843110f695434cafc765543cb783b848d7b40cf7dfef3a9e822013cc2ac4d4145a671808a6afd1e62ec1c41199be10317bc32f7052a"
|
|
1183
|
+
}
|
|
1184
|
+
},
|
|
1185
|
+
"output": {
|
|
1186
|
+
"result": {
|
|
1187
|
+
"epoch": 1,
|
|
1188
|
+
"removed": [],
|
|
1189
|
+
"closed": true,
|
|
1190
|
+
"at": 1799999000
|
|
1191
|
+
}
|
|
1192
|
+
},
|
|
1193
|
+
"expected": {
|
|
1194
|
+
"decode": {
|
|
1195
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
1196
|
+
"authority": "47ab2a9f89f155b277f1e847d7d4eba664d28324ee903ffc051bdc9e14869f86",
|
|
1197
|
+
"current": {
|
|
1198
|
+
"epoch": 0,
|
|
1199
|
+
"id": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
1200
|
+
"keyHex": "593a3bdd10ea8589533c31ce5860e1f2698fcbc6dc9a7b64713cc94c0c38713c"
|
|
1201
|
+
},
|
|
1202
|
+
"deviceSkHex": "751627289895e0df520a348eed03006ac69522989ce970c8a4926268de6f69de"
|
|
1203
|
+
},
|
|
1204
|
+
"result": {
|
|
1205
|
+
"epoch": 1,
|
|
1206
|
+
"removed": [],
|
|
1207
|
+
"closed": true,
|
|
1208
|
+
"at": 1799999000
|
|
1209
|
+
}
|
|
1210
|
+
}
|
|
1211
|
+
},
|
|
1212
|
+
{
|
|
1213
|
+
"name": "rekey-not-the-authority",
|
|
1214
|
+
"kind": "negative",
|
|
1215
|
+
"note": "A perfectly formed rekey, correctly encrypted to the current epoch, signed by a member who is not the room authority - which is to say, by anybody else who holds the room key, which is everybody in the room. It is REFUSED before decryption, on the signing key alone. Without this check any member could remove any other, and \"removal\" would mean nothing.",
|
|
1216
|
+
"input": {
|
|
1217
|
+
"event": {
|
|
1218
|
+
"kind": 1462,
|
|
1219
|
+
"created_at": 1799999000,
|
|
1220
|
+
"tags": [
|
|
1221
|
+
[
|
|
1222
|
+
"d",
|
|
1223
|
+
"2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
1224
|
+
],
|
|
1225
|
+
[
|
|
1226
|
+
"epoch",
|
|
1227
|
+
"1"
|
|
1228
|
+
]
|
|
1229
|
+
],
|
|
1230
|
+
"content": "AqBigkXsdPEEP96tDIA2af3Cb5YPB1nvr6ylEcFq1ZCHBP7IFSnMaA32dxfnRA7pLdnKbLGyyBKSmHWtY1I3mA7UfGYyJK+8ZB+BJQmGvzXwSTo2GgcXviwglwO0dYGGV35Ces/+Z3tYSNy1QzrkjmY3RMfQjPufwnYN+4wFJjlbNnFWq6/Q+qCDgHqg7YT74su8AYy8LgCRl/Gj4SCqtlIOpTrL9VtOspU2OTykvevA1tDAl8Nt0ewtCdbucjmy817Px8hjIp6eHM76/14nMGujLDDYFAjDmg7Vz3y8Clc1hVkkzZWwl2YSG6hUd28ljHuXdMs2LzfqOuJRqnwKyoExGbayLzNgI8LagylQkSp888D54T5I6Kr7Uyogf2kztshLwv056mpMdSNRhwMkv/tssDciFBl1MNel2CI5JarPIgNUBsfMqKuR40v/UwgjqpoE/YrVvHCYUIB1TXF9j0hooDLcTSdqGnESnOyNHNdHeMKqQgd9vrSxnGB7/x7eNrsJ0BRK1SNW2qwXoaioWeBI3S9zBdoyEf1nipXC1cOD/KElmiJZSJIgfr1dptjdldyXmdbfQwZk11WhnKKaVwEh6w==",
|
|
1231
|
+
"pubkey": "9d62f4907fa01b43a61acd6f9e81671b5a87f603ab51dc2aad4eb52cde8613f5",
|
|
1232
|
+
"id": "f3825bb7a65bba2df778f82c6432fc291478e40c702013a61f9a7876cedc53c9",
|
|
1233
|
+
"sig": "b7fed265169375a270e45fe840aa13e8c85755af872b06e8412756bd03083df9af3254334eb08d67bcc44e86bdff638aec9974c4e6679bf2e2a327cafe2c3f04"
|
|
1234
|
+
},
|
|
1235
|
+
"decode": {
|
|
1236
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
1237
|
+
"authority": "47ab2a9f89f155b277f1e847d7d4eba664d28324ee903ffc051bdc9e14869f86",
|
|
1238
|
+
"current": {
|
|
1239
|
+
"epoch": 0,
|
|
1240
|
+
"id": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
1241
|
+
"keyHex": "593a3bdd10ea8589533c31ce5860e1f2698fcbc6dc9a7b64713cc94c0c38713c"
|
|
1242
|
+
},
|
|
1243
|
+
"deviceSkHex": "751627289895e0df520a348eed03006ac69522989ce970c8a4926268de6f69de"
|
|
1244
|
+
}
|
|
1245
|
+
},
|
|
1246
|
+
"output": {
|
|
1247
|
+
"peek": null,
|
|
1248
|
+
"result": null
|
|
1249
|
+
}
|
|
1250
|
+
},
|
|
1251
|
+
{
|
|
1252
|
+
"name": "rekey-skips-an-epoch",
|
|
1253
|
+
"kind": "negative",
|
|
1254
|
+
"note": "The authority naming epoch 3 while this device is at epoch 0. Refused: only the very next epoch is applied, so a device cannot be walked forward past a removal it never saw, and a replayed rekey from an epoch already passed cannot move it backwards either. `peekRekeyEvent` still answers 3, which is how a client knows it is behind and should ask.",
|
|
1255
|
+
"input": {
|
|
1256
|
+
"event": {
|
|
1257
|
+
"kind": 1462,
|
|
1258
|
+
"created_at": 1799999000,
|
|
1259
|
+
"tags": [
|
|
1260
|
+
[
|
|
1261
|
+
"d",
|
|
1262
|
+
"2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
1263
|
+
],
|
|
1264
|
+
[
|
|
1265
|
+
"epoch",
|
|
1266
|
+
"3"
|
|
1267
|
+
]
|
|
1268
|
+
],
|
|
1269
|
+
"content": "AmQtYEk0dMPHUFrz+bhTOF2FVPUOvVAlNCGka828T+NSpwOC5UCCs+pe2W+1R35i3VLAGP/Td+LQ3PXsMezani1ZvJ/kbCsbwx6OoObtknb/82UHmetg3Y13lG2ockSLEZyyc8NugcikYA/pPLty3AeqR+Iw0TwTMuflSl7CQbGb+60zksgOFm59lZyxdejz1mAzyvoqzBAaxxSuBcEmcoLonhqd8Gu3j1I5ljqRfJyLkToBUnXfC9MuS5iErTZLk6baxjJLztHbTz82FiGXrUEXAP5JzJ1L712UXF4rU/i4QQR9dznjMoe+LuJnWcscv0SFind/RrWyfa05UlPfmy8PNoVLw8dSP08Yzl8tTS41WfBlF6YbHOGUEXGcZ4jTAyQ428ffXDiHoMRCAOU/nsN4y6n5DhejbKclODDPc8AO7JeuQza7AC7LgOrOsfaNqqyDOnexeNCDpDOWeUSpAQS1rV7YwQLMgDdgDybjpjCgyQeEzEdY+4CFLznpohaOxP++v8mJP4gZrGS7eeJNYxezqmbjTkRSI/jjfh0mAYZKE5xBcEO0iOuX/x82dL/dwnWUGc5jZEaeHbFC1RxesJvw1A==",
|
|
1270
|
+
"pubkey": "47ab2a9f89f155b277f1e847d7d4eba664d28324ee903ffc051bdc9e14869f86",
|
|
1271
|
+
"id": "7eb7072786de21eaeb4fe995940149552f60cb84eec269f845f8f431efe6408c",
|
|
1272
|
+
"sig": "12d46a5632376aad4c35f3bf1d703f731ebf2906d88db3999806adc903a88b9557d525af9b2b09ffd425dba16a748cf9a0bd1fdeabc22ffec31e8bf559a0b34c"
|
|
1273
|
+
},
|
|
1274
|
+
"decode": {
|
|
1275
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
1276
|
+
"authority": "47ab2a9f89f155b277f1e847d7d4eba664d28324ee903ffc051bdc9e14869f86",
|
|
1277
|
+
"current": {
|
|
1278
|
+
"epoch": 0,
|
|
1279
|
+
"id": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
1280
|
+
"keyHex": "593a3bdd10ea8589533c31ce5860e1f2698fcbc6dc9a7b64713cc94c0c38713c"
|
|
1281
|
+
},
|
|
1282
|
+
"deviceSkHex": "751627289895e0df520a348eed03006ac69522989ce970c8a4926268de6f69de"
|
|
1283
|
+
}
|
|
1284
|
+
},
|
|
1285
|
+
"output": {
|
|
1286
|
+
"peek": 3,
|
|
1287
|
+
"result": null
|
|
1288
|
+
}
|
|
1289
|
+
},
|
|
1290
|
+
{
|
|
1291
|
+
"name": "admins-signature",
|
|
1292
|
+
"kind": "positive",
|
|
1293
|
+
"note": "Who may remove somebody, said by the authority and checkable by everybody. The message is `sha256(\"kithmoot/v1/admins:<roomId>:<epoch>:<admins joined by comma>\")` over the CANONICAL list - lower-cased, deduplicated, sorted - so two clients that hold the same set in different orders verify the same signature. The epoch is inside the message, so a list signed for one epoch does not authorise anybody after the next removal.",
|
|
1294
|
+
"input": {
|
|
1295
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
1296
|
+
"epoch": 1,
|
|
1297
|
+
"admins": [
|
|
1298
|
+
"b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74",
|
|
1299
|
+
"49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525"
|
|
1300
|
+
],
|
|
1301
|
+
"authoritySkHex": "e407c0989f606d8165f63d104e1674a462b191e1df99a29ae9be3f2907deca32",
|
|
1302
|
+
"canonicalMessage": "kithmoot/v1/admins:2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b:1:49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525,b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74",
|
|
1303
|
+
"auxRandHex": "d27fcbb1f770e6772986f7e9b8a25c52db8088ad519f70b9cdc76d82b722dc5d"
|
|
1304
|
+
},
|
|
1305
|
+
"output": {
|
|
1306
|
+
"canonical": [
|
|
1307
|
+
"49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525",
|
|
1308
|
+
"b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74"
|
|
1309
|
+
],
|
|
1310
|
+
"sig": "8655aa16882d3be3397a7987f3727f9e38a2640973a81c828b1a36a4bf804d55bdf5c2d2d4a55e8d9d3f28d38772ed9e0e3bfb309083a914ce9bbff30e66f2be"
|
|
1311
|
+
},
|
|
1312
|
+
"expected": {
|
|
1313
|
+
"verify": {
|
|
1314
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
1315
|
+
"epoch": 1,
|
|
1316
|
+
"admins": [
|
|
1317
|
+
"b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74",
|
|
1318
|
+
"49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525"
|
|
1319
|
+
],
|
|
1320
|
+
"authority": "47ab2a9f89f155b277f1e847d7d4eba664d28324ee903ffc051bdc9e14869f86"
|
|
1321
|
+
},
|
|
1322
|
+
"result": true
|
|
1323
|
+
}
|
|
1324
|
+
},
|
|
1325
|
+
{
|
|
1326
|
+
"name": "admins-signature-another-epoch",
|
|
1327
|
+
"kind": "negative",
|
|
1328
|
+
"note": "The same signature, offered for epoch 2. Refused: a list is authorised for the epoch it names and no other, so an admin set from before a removal cannot be replayed to re-authorise somebody after it.",
|
|
1329
|
+
"input": {
|
|
1330
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
1331
|
+
"epoch": 2,
|
|
1332
|
+
"admins": [
|
|
1333
|
+
"b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74",
|
|
1334
|
+
"49ebb8e92de99c03390bb88ab02704ab2a66332101ff895c512756ad7648e525"
|
|
1335
|
+
],
|
|
1336
|
+
"sig": "8655aa16882d3be3397a7987f3727f9e38a2640973a81c828b1a36a4bf804d55bdf5c2d2d4a55e8d9d3f28d38772ed9e0e3bfb309083a914ce9bbff30e66f2be",
|
|
1337
|
+
"authority": "47ab2a9f89f155b277f1e847d7d4eba664d28324ee903ffc051bdc9e14869f86"
|
|
1338
|
+
},
|
|
1339
|
+
"output": {
|
|
1340
|
+
"result": false
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1343
|
+
],
|
|
1344
|
+
"epochRequestAdmission": [
|
|
1345
|
+
{
|
|
1346
|
+
"name": "admission-proof",
|
|
1347
|
+
"kind": "positive",
|
|
1348
|
+
"note": "The proof a kind-20468 epoch request carries as `admission`. `requestKey = HKDF-SHA256(ikm = roomKey, info = \"kithmoot/v1/epoch-request-key\", 32)`, no salt, from the EPOCH-0 room key - `deriveRoom(secret).roomKey`, never a later epoch's key, so a device that has fallen any number of epochs behind can still make one. Then `admission = HMAC-SHA256(requestKey, \"kithmoot/v1/epoch-request:\" + roomId + \":\" + authority + \":\" + device + \":\" + createdAt)` as lower-case hex, the three identifiers lower-case hex and `createdAt` the request event's own `created_at` in decimal.",
|
|
1349
|
+
"input": {
|
|
1350
|
+
"roomKeyHex": "593a3bdd10ea8589533c31ce5860e1f2698fcbc6dc9a7b64713cc94c0c38713c",
|
|
1351
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
1352
|
+
"authority": "47ab2a9f89f155b277f1e847d7d4eba664d28324ee903ffc051bdc9e14869f86",
|
|
1353
|
+
"device": "fcd74d122f0a212a673839482f69ad973f6d38735faeeb3e57929c2b916492fe",
|
|
1354
|
+
"createdAt": 1800000000,
|
|
1355
|
+
"message": "kithmoot/v1/epoch-request:2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b:47ab2a9f89f155b277f1e847d7d4eba664d28324ee903ffc051bdc9e14869f86:fcd74d122f0a212a673839482f69ad973f6d38735faeeb3e57929c2b916492fe:1800000000"
|
|
1356
|
+
},
|
|
1357
|
+
"output": {
|
|
1358
|
+
"requestKeyHex": "51c647c6096dddd20dd646103d6667e8915beaebe5c86646940d686a5fddfbe5",
|
|
1359
|
+
"admission": "87a278bd02e95df8c19a2eabd6a86e04476b1c87565ae4716ffd947e398f1d64"
|
|
1360
|
+
}
|
|
1361
|
+
},
|
|
1362
|
+
{
|
|
1363
|
+
"name": "request",
|
|
1364
|
+
"kind": "positive",
|
|
1365
|
+
"note": "A complete epoch request: the device credential and the admission proof inside a NIP-44 body between the device key and the authority, on a kind-20468 event tagged `d` room id and `p` authority, signed by the device. The desk decodes it to the device, the participant the credential names, and the request id the grant will answer.",
|
|
1366
|
+
"input": {
|
|
1367
|
+
"event": {
|
|
1368
|
+
"kind": 20468,
|
|
1369
|
+
"created_at": 1800000000,
|
|
1370
|
+
"tags": [
|
|
1371
|
+
[
|
|
1372
|
+
"d",
|
|
1373
|
+
"2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
1374
|
+
],
|
|
1375
|
+
[
|
|
1376
|
+
"p",
|
|
1377
|
+
"47ab2a9f89f155b277f1e847d7d4eba664d28324ee903ffc051bdc9e14869f86"
|
|
1378
|
+
]
|
|
1379
|
+
],
|
|
1380
|
+
"content": "ArfzHVC+8B6YNMBsF0awGflQhqqsbINUeyByVDwUTl01TxviXkxH77TINN14a8A9TLr9j/I+qwZAbEtZURYvUubA//Y6AvuAjGrEUBpoJs8kIpG1MwrcCnKbv4TM9CZTbBbhb3K7pIj7gIp0T47ZFLQAa/gKx9K4QtFfOC6zpx9rU57pe4jU8GLKEKnh//mtakZ3CaPyKpC9SXBsIFyFuXYb9ZyCia26+XQLb7K6zvOOm1T5DCGSJOTmb/RwO6ia0Zh1wSDGHNlayAahmZiSHSSIxO+HphRAacTpwGAgpp79HEOV4D1fPTN108NZ6hddOkHrSwKOWdox0zTjVTlpcY1NJmHCfT7h2bBlRPXikbdRyDfO+NcLXNsBsoxZjrHSUuwORAbKiw4RLtJi9es4tFW5idFLkeoMO6D6DCwvUhEOzS7WReVuEzmWxgjVq972Hki3GT/UKxxh5ISDl29P33Dt94EiREhSg0d5gUUpVPehVRK8jdyjhGFauR2Q8Ue0cuLjMYZUsllSuPH+EL9yDr1FmjOdAtQoN/BUiwzrl4qsCvrZf5OWeHL9BazNeHfZvp02hZ8AQaMywfsQvMJpZQvSrIZMydvuDetIG4ZMaAKkjFi4zT3gNHEZyPw7eW7B6cetPT0utHguntAVwXzFluW3o9Hhkn0nxdJcbMbO7tsg1AR1NSaVbYqzwKmC0G2gZ23dVPloT7qemQqqqoA8TJo9bgqEoaZ0GR4PB7vLZSH10If9X4h+bzfL//KGeJBGQcxHf+7zk6KWbwCfyKjHSdWQtCY3VrWNUnJqX9hkRDiX4ebh1kKBHja7iWEeAwe73WV7X3826gJ/iFtIp7TNrLUjTq7bYgWK3wNAZ4LthnLJRrzgPMuj7ypryDVcyAdXLiJKWYvA+jj667PrW7HbPI+BzRZM43OnxD5GIXILPYIOfRM=",
|
|
1381
|
+
"pubkey": "fcd74d122f0a212a673839482f69ad973f6d38735faeeb3e57929c2b916492fe",
|
|
1382
|
+
"id": "860709d92f992f24ccd9bdaf99da6b6201f1665ef22166c0b84a5e22aec9a4de",
|
|
1383
|
+
"sig": "fd292b92bf14b4ac27a1d2c29465d69d08b9737a071e75f4a320f500cb03dd6fa4f6e913ee172b93dfa6c06de7c4f4da21b71332c02bb0e2f0222d6baf6f6145"
|
|
1384
|
+
},
|
|
1385
|
+
"body": {
|
|
1386
|
+
"v": 1,
|
|
1387
|
+
"credential": {
|
|
1388
|
+
"kind": 20460,
|
|
1389
|
+
"created_at": 1799990000,
|
|
1390
|
+
"tags": [
|
|
1391
|
+
[
|
|
1392
|
+
"d",
|
|
1393
|
+
"2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
1394
|
+
],
|
|
1395
|
+
[
|
|
1396
|
+
"device",
|
|
1397
|
+
"fcd74d122f0a212a673839482f69ad973f6d38735faeeb3e57929c2b916492fe"
|
|
1398
|
+
],
|
|
1399
|
+
[
|
|
1400
|
+
"expiration",
|
|
1401
|
+
"1800003600"
|
|
1402
|
+
]
|
|
1403
|
+
],
|
|
1404
|
+
"content": "",
|
|
1405
|
+
"pubkey": "b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74",
|
|
1406
|
+
"id": "955860a514bffb37f649013c7b3dbfedc4673bc1faadded13d1847b0e027d15d",
|
|
1407
|
+
"sig": "844567d3b069426b95d26462864ffbd49d55a07244cef702ebaf6a4fda2ee3f5fd0b12e0ecdd43e3ca1d799051142dfe643c416a2e84051fd32bba68f7018841"
|
|
1408
|
+
},
|
|
1409
|
+
"admission": "87a278bd02e95df8c19a2eabd6a86e04476b1c87565ae4716ffd947e398f1d64"
|
|
1410
|
+
},
|
|
1411
|
+
"deviceSkHex": "751627289895e0df520a348eed03006ac69522989ce970c8a4926268de6f69de",
|
|
1412
|
+
"nonceHex": "b7f31d50bef01e9834c06c1746b019f95086aaac6c83547b2072543c144e5d35",
|
|
1413
|
+
"auxRandHex": "f22f47f5a46f90e1108a3f37152079b04daf291b52116ad10384f96aa0dee5dd"
|
|
1414
|
+
},
|
|
1415
|
+
"output": {
|
|
1416
|
+
"result": {
|
|
1417
|
+
"device": "fcd74d122f0a212a673839482f69ad973f6d38735faeeb3e57929c2b916492fe",
|
|
1418
|
+
"participant": "b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74",
|
|
1419
|
+
"request": "860709d92f992f24ccd9bdaf99da6b6201f1665ef22166c0b84a5e22aec9a4de"
|
|
1420
|
+
}
|
|
1421
|
+
},
|
|
1422
|
+
"expected": {
|
|
1423
|
+
"decode": {
|
|
1424
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
1425
|
+
"authoritySkHex": "e407c0989f606d8165f63d104e1674a462b191e1df99a29ae9be3f2907deca32",
|
|
1426
|
+
"roomKeyHex": "593a3bdd10ea8589533c31ce5860e1f2698fcbc6dc9a7b64713cc94c0c38713c",
|
|
1427
|
+
"now": 1800000000
|
|
1428
|
+
},
|
|
1429
|
+
"result": {
|
|
1430
|
+
"device": "fcd74d122f0a212a673839482f69ad973f6d38735faeeb3e57929c2b916492fe",
|
|
1431
|
+
"participant": "b07ff66ffca2d5445cfb4a384e94fba8ecc5000283b43f2d5425c85df5032e74",
|
|
1432
|
+
"request": "860709d92f992f24ccd9bdaf99da6b6201f1665ef22166c0b84a5e22aec9a4de"
|
|
1433
|
+
}
|
|
1434
|
+
}
|
|
1435
|
+
},
|
|
1436
|
+
{
|
|
1437
|
+
"name": "request-without-admission",
|
|
1438
|
+
"kind": "negative",
|
|
1439
|
+
"note": "The same request with no `admission` field: what a client from before the proof sent, and exactly what a stranger with the room id, the authority's pubkey and a participant key of their own can produce. Refused before the policy is consulted; the desk publishes nothing, so the stranger does not learn that a desk is there.",
|
|
1440
|
+
"input": {
|
|
1441
|
+
"event": {
|
|
1442
|
+
"kind": 20468,
|
|
1443
|
+
"created_at": 1800000000,
|
|
1444
|
+
"tags": [
|
|
1445
|
+
[
|
|
1446
|
+
"d",
|
|
1447
|
+
"2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
1448
|
+
],
|
|
1449
|
+
[
|
|
1450
|
+
"p",
|
|
1451
|
+
"47ab2a9f89f155b277f1e847d7d4eba664d28324ee903ffc051bdc9e14869f86"
|
|
1452
|
+
]
|
|
1453
|
+
],
|
|
1454
|
+
"content": "AoFUOhU2v9MLbRocQqQZnqndVMW0nOn8IBUdp+Gi9GfgDV+MKXVM9AWsZuFqTjG6gpGmOLSkqeVdR1TYBIwk3dmtF+UttI7zhEaTWcLW6iUSe//Z2fYOExXU68z2VTgYVerIoZpgeQWl4RLOCDV6yTeIoAULoQndnqRqJEi6QjGrOqGrpxvgxFpHUqYkx3KVq0UNWea/zhP2627MkEdcYmklVF86jzBFT2HByeF8YlRWh2lS81D8ORCdT+tmhf1iSbLqhCV4EWtJ+QdxdTxMNeG3mvojLeLEeLMaorpKlunxcpqtbJAWoPGGsrPSn8b0Zc36tdOVo9JwMgDpI8l3SgGW2C5Gvkswa97eWbQ5nl3nP/AEv04zkZ6jvp1f1g8mGzvfhTKGxpWjALC52dG5fJV1RIvmetxy/aTx8e2oXDoKXDMofJr8wZ1WmgJwCK7o/dGroW9QNIB63tBZIl0gk65bSwMFAPYCkcvhaYWHeYGATODe8Ip2Xr1xamW+9Sn9gtoLV6lWEA//Oo/Y1Glpi5DvcnhkgIoVXEHVF70xJCqEePPu0YIINaF1OpeP/MUJ7ANzxT7drMCfOXn4dMS1jhrplARzNWUnmTEi47UaIe0d9yjjp/+o2NcbtOrcZyChaF6iJgWxaTEli8/8tfvfU1ZrCOlvE/ik0F7m1+6vGK+H2GLNsISj4pQZb686oWabr7bbu8MnFKKOGp95bgidzbEac2HrkFJbB/HMTDSbpzWNMeUaZmneJJ/sq+F1hOpXL2vF3DYM0xMverh4YIKGeBeNLj1GrbLoVElShqGO95I2FS468DpcYb/h10BA+VgfMySdTtvwnQx+/FyltA3std7h9pAgZD8FWVuKFmW+T9lcK03ISt0bxo847aMSn9zyZVGHc440b4QPxUhbe5QNFz5a5foLiImSa2AOYoDU+rC0CLs=",
|
|
1455
|
+
"pubkey": "fcd74d122f0a212a673839482f69ad973f6d38735faeeb3e57929c2b916492fe",
|
|
1456
|
+
"id": "1ecd7084c7b2a4b8a039f5eb7be3a1a1c2e6a19fb53d222b9c50e24f4a8185d8",
|
|
1457
|
+
"sig": "f5a3b54740f0655f3bbcae0b65df41b95ad171375925c4cd181bc378c18d8fdf3bed31c97c5239cb6f90657e0fa5d55fa98c244cafaa9fd74358b06dc6c57e45"
|
|
1458
|
+
}
|
|
1459
|
+
},
|
|
1460
|
+
"output": {
|
|
1461
|
+
"result": null
|
|
1462
|
+
},
|
|
1463
|
+
"expected": {
|
|
1464
|
+
"decode": {
|
|
1465
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
1466
|
+
"authoritySkHex": "e407c0989f606d8165f63d104e1674a462b191e1df99a29ae9be3f2907deca32",
|
|
1467
|
+
"roomKeyHex": "593a3bdd10ea8589533c31ce5860e1f2698fcbc6dc9a7b64713cc94c0c38713c",
|
|
1468
|
+
"now": 1800000000
|
|
1469
|
+
},
|
|
1470
|
+
"result": null
|
|
1471
|
+
}
|
|
1472
|
+
},
|
|
1473
|
+
{
|
|
1474
|
+
"name": "request-under-another-key",
|
|
1475
|
+
"kind": "negative",
|
|
1476
|
+
"note": "The proof computed under the key of epoch 1 rather than the epoch-0 room key. Refused: the proof key is always derived from epoch 0, because that is the one key every admitted device holds however far behind it is, and a desk checking against anything else would refuse exactly the devices the desk exists for.",
|
|
1477
|
+
"input": {
|
|
1478
|
+
"event": {
|
|
1479
|
+
"kind": 20468,
|
|
1480
|
+
"created_at": 1800000000,
|
|
1481
|
+
"tags": [
|
|
1482
|
+
[
|
|
1483
|
+
"d",
|
|
1484
|
+
"2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
1485
|
+
],
|
|
1486
|
+
[
|
|
1487
|
+
"p",
|
|
1488
|
+
"47ab2a9f89f155b277f1e847d7d4eba664d28324ee903ffc051bdc9e14869f86"
|
|
1489
|
+
]
|
|
1490
|
+
],
|
|
1491
|
+
"content": "AuUfBktokBfC8jEAZ1XW+9645urzhmGGFc4NrEdOiP+5uzK7LdP3+bF4u6wCdbToEe1YWFaD4zj9xjN+VfvFGdp1x0XHESePQbYBFJAKuBvyFGGIgS52aNYZtIlEsAoXMo4gqJ1RQJdFTwsrnCG4ZoKNx0+zvzchG7UF8xt9fBUSoQFDnmOSyp42AIxMKJsubW9xUn120VQt3FkMLrGEfaGZIW6Em0RKQORQ2OeGhJVVqSL94r2iJMNvD166Ecxzrw85nfxqxX1bLeUKEkbqOgIvpv38XNBZ8rKBWeH16MXS5E30p12QTm4zZFrx3tqMD16175LOZoWTAeKe+KU/ex8SAyC7tblOwUo9vjuHv9mvxPirBsuWNftg88FkKcrHImWOYdyGU95bb3lUQ4z6aNfDcZBv3M7jKbRe55AxaxS3gs3NL0HrgstmD6fJ18degnhdhobohzvLGxbzVsKk6sqBSEuukqwxJPSzYLOklYHWfSwfqroLAYnp4oqNZZRZsBYcUzmjPpQk5hxneBZTrGp541hS2cEVbf1p0XRBadU9I0yUf7bMWcIJuzzl8JCVNNplApmsXr047CU7Eq/cRV1jyP7/jfnRCD0egj6lNxEaUlwyVpinhCk1zsNYf7TgIwKrDhpctlEShoj/Ix3e9l1PrZ2i+JCjeoKeUgSONpxp1an3wGKgBzjj4O0+jdYJv5yXv12PLB3viRXzoInyWwlTyikzS0HvZ6IDi/leFmftBbzj+FtL1GQneiVWbxDU3isR4YXjC/xkk2gAlCfmLb+PB9WlYtyuQG8R6gLw361xMLgSisCc/jgwGB2xUMbGRpV62pohxtwpKmLTACcdf/W89OL6xNO0nRGRwZVrPhTakqlEarU+rUv6mVcrSE+uB5yxtc7S345p2MV73yI/YnoIYcNwx2uqvTn+SZIikpYImK4=",
|
|
1492
|
+
"pubkey": "fcd74d122f0a212a673839482f69ad973f6d38735faeeb3e57929c2b916492fe",
|
|
1493
|
+
"id": "f6761f70ade8e0bc4caa60bfdd0b3a9252c1c49a678b33cdf28fee6e7c4c53ad",
|
|
1494
|
+
"sig": "dce2560b24cca141a93c2caa4b860472467aafce2256f397e9abc2b857357d52285f77ceaf1d494ebcdd8df4193566376cb05750f544a53df1cc07102932c7cf"
|
|
1495
|
+
},
|
|
1496
|
+
"proofKeyHex": "1376c99d11c91603ba3904328d3fd6c857b098c62a187e4a1322c84e832d63b7"
|
|
1497
|
+
},
|
|
1498
|
+
"output": {
|
|
1499
|
+
"result": null
|
|
1500
|
+
},
|
|
1501
|
+
"expected": {
|
|
1502
|
+
"decode": {
|
|
1503
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
1504
|
+
"authoritySkHex": "e407c0989f606d8165f63d104e1674a462b191e1df99a29ae9be3f2907deca32",
|
|
1505
|
+
"roomKeyHex": "593a3bdd10ea8589533c31ce5860e1f2698fcbc6dc9a7b64713cc94c0c38713c",
|
|
1506
|
+
"now": 1800000000
|
|
1507
|
+
},
|
|
1508
|
+
"result": null
|
|
1509
|
+
}
|
|
1510
|
+
},
|
|
1511
|
+
{
|
|
1512
|
+
"name": "request-proof-for-another-moment",
|
|
1513
|
+
"kind": "negative",
|
|
1514
|
+
"note": "A correct proof for `created_at` one second later than the event carries. Refused: the proof binds the device and the moment, so a proof lifted from one request is no use inside another, even one from the same device.",
|
|
1515
|
+
"input": {
|
|
1516
|
+
"event": {
|
|
1517
|
+
"kind": 20468,
|
|
1518
|
+
"created_at": 1800000000,
|
|
1519
|
+
"tags": [
|
|
1520
|
+
[
|
|
1521
|
+
"d",
|
|
1522
|
+
"2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b"
|
|
1523
|
+
],
|
|
1524
|
+
[
|
|
1525
|
+
"p",
|
|
1526
|
+
"47ab2a9f89f155b277f1e847d7d4eba664d28324ee903ffc051bdc9e14869f86"
|
|
1527
|
+
]
|
|
1528
|
+
],
|
|
1529
|
+
"content": "Aum2++QEm52Lth4BQRQZi1AM2yQIzEcXA35bnqJbbz5w/tigHvF48pAbcgIiDGxF9SoHVve5jktDIn6ooJ+YV77/0z5y5RFqgFFer5d1ARPFnSfGy0tUhUZTBscQhQ33t8FmF9gqdhKgvxhkYPUdTMeS6ADNrrbu8CkuEffzn8SOncmMrqrxChhWPcekuIiDEfNBgwzkmiMLXeXyKRIEz/HeWAMefKClpO8zHkLtkhOK/zeEP+xv/iuPB5fohlwevFm8orVuE9C5f15LaxC/LxUkQx/qr6jLl824R1rfyscAv3FqzhstM2lg7PDwjFQh2Gk0yQ0TskelGjPFFHzTYlILQOEH2KceoDRwmlNjep5AO1EPgiW71HMsat94OlGzrN0x6OjUJyoZkCEV6Nd+5xSc0syWaQjqORin5/Px2dqu/wXBFxY4jl3d4MlUZlI7E/vJDgbbVCuwErPFe4Fw2AaCAbfV/n3WqLM6+YN6ls4hVClF4SFrBusgyoFoYHqTZhh/i6mnGZPRbYD82j3kteS/JGxhC0LQC9ReoMUk5a0uJK02iaAJVI/uj9aVUM9b0STHGItg8mHgnYec198/efD0hnApmM50no6fizHEA1WDpH10ljyR5/gXZPGVFirKqmVeQEDiqegIUpW0OM/q3HstrzSVOajma3r9LNK4J4yEcu+591VteUZaxNzRfPwT2WSSKjpT+UvQ9JMZodXPjJKZXFk6wH4WcDcuAfU4ojNFzYR+k78MoIoIwovYlkrdfCZOhwWWEp8h7jf6XTqDyuJZ3lC3s2Pi/UbX3y/M3G6vKTS02a4JTgAgQvbqUpoZf0cXZxUXZGXPfBllsayw7f2y/kXesL2i/VANRBAx7e1qHJURgWTUH/DVwLJbN4r0OCQMl5ighi+gLRSAI/IbPtS7PZV2VSSmZXLEl7yZ7S/1rRY=",
|
|
1530
|
+
"pubkey": "fcd74d122f0a212a673839482f69ad973f6d38735faeeb3e57929c2b916492fe",
|
|
1531
|
+
"id": "4a33347d5ab4ec176957487060cdef0a6f642fec21eb58d8ea8974423a6bbb73",
|
|
1532
|
+
"sig": "9e84d416382251472dc494ce1e1b7fb8f18ba7dceb6d07d3742f5af557be879d75ea3ad97ec8118a1f575fe86b5b06f843e43e7ad4774835b8c29d07f789ceaf"
|
|
1533
|
+
}
|
|
1534
|
+
},
|
|
1535
|
+
"output": {
|
|
1536
|
+
"result": null
|
|
1537
|
+
},
|
|
1538
|
+
"expected": {
|
|
1539
|
+
"decode": {
|
|
1540
|
+
"roomId": "2848bdd5c60a79e2dfe667ae9616c1107f61709032b66e556e28f4a96e69450b",
|
|
1541
|
+
"authoritySkHex": "e407c0989f606d8165f63d104e1674a462b191e1df99a29ae9be3f2907deca32",
|
|
1542
|
+
"roomKeyHex": "593a3bdd10ea8589533c31ce5860e1f2698fcbc6dc9a7b64713cc94c0c38713c",
|
|
1543
|
+
"now": 1800000000
|
|
1544
|
+
},
|
|
1545
|
+
"result": null
|
|
1546
|
+
}
|
|
1547
|
+
}
|
|
1548
|
+
]
|
|
1549
|
+
}
|
|
1550
|
+
}
|