@dxos/credentials 2.33.1-dev.83d113fe → 2.33.1-dev.eb88db79

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.
Files changed (62) hide show
  1. package/.rush/temp/package-deps_build.json +14 -14
  2. package/.rush/temp/package-deps_build:test.json +13 -13
  3. package/.rush/temp/package-deps_prerelease.json +13 -13
  4. package/dist/src/auth/auth-message.d.ts +1 -1
  5. package/dist/src/auth/auth-message.d.ts.map +1 -1
  6. package/dist/src/auth/auth-message.js +4 -3
  7. package/dist/src/auth/auth-message.js.map +1 -1
  8. package/dist/src/auth/auth-plugin.test.js +2 -4
  9. package/dist/src/auth/auth-plugin.test.js.map +1 -1
  10. package/dist/src/auth/auth.test.d.ts.map +1 -1
  11. package/dist/src/auth/auth.test.js +255 -248
  12. package/dist/src/auth/auth.test.js.map +1 -1
  13. package/dist/src/auth/authenticator.d.ts +9 -14
  14. package/dist/src/auth/authenticator.d.ts.map +1 -1
  15. package/dist/src/auth/authenticator.js +15 -46
  16. package/dist/src/auth/authenticator.js.map +1 -1
  17. package/dist/src/greet/greeter-plugin.test.js +4 -4
  18. package/dist/src/greet/greeter-plugin.test.js.map +1 -1
  19. package/dist/src/greet/greeter.d.ts +15 -15
  20. package/dist/src/greet/greeter.js +5 -5
  21. package/dist/src/greet/greeter.js.map +1 -1
  22. package/dist/src/greet/greeter.test.js +12 -12
  23. package/dist/src/greet/greeter.test.js.map +1 -1
  24. package/dist/src/greet/greeting-message.d.ts +2 -2
  25. package/dist/src/greet/greeting-message.js +9 -9
  26. package/dist/src/greet/greeting-message.js.map +1 -1
  27. package/dist/src/identity/identity-message.js +4 -4
  28. package/dist/src/identity/identity-message.js.map +1 -1
  29. package/dist/src/keys/keyring-helpers.d.ts.map +1 -1
  30. package/dist/src/keys/keyring-helpers.js +4 -3
  31. package/dist/src/keys/keyring-helpers.js.map +1 -1
  32. package/dist/src/keys/keyring.js +2 -2
  33. package/dist/src/keys/keyring.js.map +1 -1
  34. package/dist/src/party/party-credential.d.ts +1 -1
  35. package/dist/src/party/party-credential.js +10 -10
  36. package/dist/src/party/party-credential.js.map +1 -1
  37. package/dist/src/proto/any.d.ts +3 -3
  38. package/dist/src/proto/any.d.ts.map +1 -1
  39. package/dist/src/proto/gen/dxos/credentials/auth.d.ts +16 -0
  40. package/dist/src/proto/gen/dxos/credentials/auth.d.ts.map +1 -1
  41. package/dist/src/proto/gen/index.d.ts.map +1 -1
  42. package/dist/src/proto/gen/index.js +1 -1
  43. package/dist/src/proto/gen/index.js.map +1 -1
  44. package/dist/src/proto/substitutions.d.ts +1 -1
  45. package/dist/tsconfig.tsbuildinfo +1 -1
  46. package/package.json +11 -11
  47. package/src/auth/auth-message.ts +5 -3
  48. package/src/auth/auth-plugin.test.ts +7 -9
  49. package/src/auth/auth.test.ts +551 -0
  50. package/src/auth/authenticator.ts +21 -42
  51. package/src/greet/greeter-plugin.test.ts +4 -4
  52. package/src/greet/greeter.test.js +12 -12
  53. package/src/greet/greeter.ts +5 -5
  54. package/src/greet/greeting-message.ts +9 -9
  55. package/src/identity/identity-message.ts +4 -4
  56. package/src/keys/keyring-helpers.ts +4 -3
  57. package/src/keys/keyring.ts +2 -2
  58. package/src/party/party-credential.ts +10 -10
  59. package/src/proto/any.ts +3 -3
  60. package/src/proto/gen/dxos/credentials/auth.ts +16 -0
  61. package/src/proto/gen/index.ts +1 -1
  62. package/src/auth/auth.test.js +0 -515
@@ -40,21 +40,6 @@ const createPartyKeyrings = async () => {
40
40
  bareKeyring
41
41
  };
42
42
  };
43
- /* eslint-disable unused-imports/no-unused-vars */
44
- const chainToString = (chain, depth = 0) => {
45
- let ret = chain.publicKey.toHex() + '\n';
46
- if (chain.parents.length) {
47
- depth += 1;
48
- for (const parent of chain.parents) {
49
- let spaces = '';
50
- for (let i = 0; i < depth; i++) {
51
- spaces += ' ';
52
- }
53
- ret += `${spaces}-> ${chainToString(parent, depth)}`;
54
- }
55
- }
56
- return ret;
57
- };
58
43
  /* eslint-enable @typescript-eslint/no-unused-vars */
59
44
  const messageMap = (messages) => {
60
45
  const map = new Map();
@@ -70,239 +55,261 @@ const getIdentityKeyChainForDevice = (keyring, devicePublicKey, messages) => {
70
55
  // Excludes all the FEED keys.
71
56
  return keys_1.Keyring.buildKeyChain(devicePublicKey, messages, keyring.findKeys(keys_1.Filter.matches({ type: proto_1.KeyType.FEED })).map(key => key.publicKey));
72
57
  };
73
- it('Chain of Keys', async () => {
74
- const haloKeyring = new keys_1.Keyring();
75
- const identityKey = await haloKeyring.createKeyRecord({ type: proto_1.KeyType.PARTY });
76
- const deviceKeyA = await haloKeyring.createKeyRecord({ type: proto_1.KeyType.DEVICE });
77
- const deviceKeyB = await haloKeyring.createKeyRecord({ type: proto_1.KeyType.DEVICE });
78
- const deviceKeyC = await haloKeyring.createKeyRecord({ type: proto_1.KeyType.DEVICE });
79
- const feedKeyA = await haloKeyring.createKeyRecord({ type: proto_1.KeyType.FEED });
80
- const messages = new Map();
81
- // The first message in the chain in always a PartyGenesis for the Halo.
82
- messages.set(identityKey.publicKey.toHex(), (0, party_1.createPartyGenesisMessage)(haloKeyring, identityKey, feedKeyA.publicKey, deviceKeyA));
83
- messages.set(deviceKeyA.publicKey.toHex(), messages.get(identityKey.publicKey.toHex()));
84
- messages.set(feedKeyA.publicKey.toHex(), messages.get(identityKey.publicKey.toHex()));
85
- // Next is DeviceB greeted by DeviceA.
86
- messages.set(deviceKeyB.publicKey.toHex(), (0, party_1.createEnvelopeMessage)(haloKeyring, identityKey.publicKey, (0, party_1.createKeyAdmitMessage)(haloKeyring, identityKey.publicKey, deviceKeyB, [deviceKeyB]), [deviceKeyA]));
87
- // Next is DeviceC greeted by DeviceB.
88
- messages.set(deviceKeyC.publicKey.toHex(), (0, party_1.createEnvelopeMessage)(haloKeyring, identityKey.publicKey, (0, party_1.createKeyAdmitMessage)(haloKeyring, identityKey.publicKey, deviceKeyC, [deviceKeyC]), [deviceKeyB]));
89
- const targetKeyring = new keys_1.Keyring();
90
- await targetKeyring.addPublicKey({
91
- publicKey: identityKey.publicKey,
92
- type: proto_1.KeyType.IDENTITY,
93
- trusted: true,
94
- own: false
58
+ describe('PartyAuthenticator', () => {
59
+ it('Chain of Keys', async () => {
60
+ const haloKeyring = new keys_1.Keyring();
61
+ const identityKey = await haloKeyring.createKeyRecord({ type: proto_1.KeyType.PARTY });
62
+ const deviceKeyA = await haloKeyring.createKeyRecord({ type: proto_1.KeyType.DEVICE });
63
+ const deviceKeyB = await haloKeyring.createKeyRecord({ type: proto_1.KeyType.DEVICE });
64
+ const deviceKeyC = await haloKeyring.createKeyRecord({ type: proto_1.KeyType.DEVICE });
65
+ const feedKeyA = await haloKeyring.createKeyRecord({ type: proto_1.KeyType.FEED });
66
+ const messages = new Map();
67
+ // The first message in the chain in always a PartyGenesis for the Halo.
68
+ messages.set(identityKey.publicKey.toHex(), (0, party_1.createPartyGenesisMessage)(haloKeyring, identityKey, feedKeyA.publicKey, deviceKeyA));
69
+ messages.set(deviceKeyA.publicKey.toHex(), messages.get(identityKey.publicKey.toHex()));
70
+ messages.set(feedKeyA.publicKey.toHex(), messages.get(identityKey.publicKey.toHex()));
71
+ // Next is DeviceB greeted by DeviceA.
72
+ messages.set(deviceKeyB.publicKey.toHex(), (0, party_1.createEnvelopeMessage)(haloKeyring, identityKey.publicKey, (0, party_1.createKeyAdmitMessage)(haloKeyring, identityKey.publicKey, deviceKeyB, [deviceKeyB]), [deviceKeyA]));
73
+ // Next is DeviceC greeted by DeviceB.
74
+ messages.set(deviceKeyC.publicKey.toHex(), (0, party_1.createEnvelopeMessage)(haloKeyring, identityKey.publicKey, (0, party_1.createKeyAdmitMessage)(haloKeyring, identityKey.publicKey, deviceKeyC, [deviceKeyC]), [deviceKeyB]));
75
+ const targetKeyring = new keys_1.Keyring();
76
+ await targetKeyring.addPublicKey({
77
+ publicKey: identityKey.publicKey,
78
+ type: proto_1.KeyType.IDENTITY,
79
+ trusted: true,
80
+ own: false
81
+ });
82
+ for (const deviceKey of [deviceKeyA, deviceKeyB, deviceKeyC]) {
83
+ const emptyKeyring = new keys_1.Keyring();
84
+ const chain = keys_1.Keyring.buildKeyChain(deviceKey.publicKey, messages);
85
+ // In the target keyring, which only has the Identity, it should chase all the way back to the Identity.
86
+ (0, expect_1.default)(identityKey.publicKey).toEqual((await targetKeyring.findTrusted(chain)).publicKey);
87
+ // And in the halo, which has all the keys, it should chase straight back to this key.
88
+ (0, expect_1.default)(deviceKey.publicKey).toEqual((await haloKeyring.findTrusted(chain)).publicKey);
89
+ // And in an empty Keyring, we should not get anything.
90
+ (0, expect_1.default)(await emptyKeyring.findTrusted(chain)).toBeUndefined();
91
+ }
92
+ });
93
+ it('good direct', async () => {
94
+ const { keyring, partyKey } = await createPartyKeyrings();
95
+ const party = new party_1.PartyState(partyKey);
96
+ const auth = new authenticator_1.PartyAuthenticator(party, async () => { });
97
+ const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
98
+ const messages = [
99
+ (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, identityKeyRecord)
100
+ ];
101
+ // Only add the Identity to the party keyring.
102
+ await party.processMessages(messages);
103
+ const wrappedCredentials = (0, proto_1.codecLoop)((0, auth_message_1.createAuthMessage)(keyring, partyKey, identityKeyRecord, identityKeyRecord));
104
+ const ok = await auth.authenticate(wrappedCredentials.payload);
105
+ (0, expect_1.default)(ok).toBe(true);
106
+ });
107
+ it('auth callback is called', async () => {
108
+ const { keyring, partyKey } = await createPartyKeyrings();
109
+ const party = new party_1.PartyState(partyKey);
110
+ let called = false;
111
+ const auth = new authenticator_1.PartyAuthenticator(party, async (msg) => {
112
+ called = true;
113
+ });
114
+ const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
115
+ const messages = [
116
+ (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, identityKeyRecord)
117
+ ];
118
+ // Only add the Identity to the party keyring.
119
+ await party.processMessages(messages);
120
+ const newFeedKeyRecord = await keyring.createKeyRecord({ type: proto_1.KeyType.FEED });
121
+ const feedAdmit = (0, party_1.createFeedAdmitMessage)(keyring, partyKey, newFeedKeyRecord.publicKey);
122
+ const wrappedCredentials = (0, proto_1.codecLoop)((0, auth_message_1.createAuthMessage)(keyring, partyKey, identityKeyRecord, identityKeyRecord, newFeedKeyRecord, undefined, feedAdmit));
123
+ const ok = await auth.authenticate(wrappedCredentials.payload);
124
+ (0, expect_1.default)(ok).toBe(true);
125
+ (0, expect_1.default)(called).toEqual(true);
126
+ });
127
+ it('good chain', async () => {
128
+ const { keyring, partyKey } = await createPartyKeyrings();
129
+ const party = new party_1.PartyState(partyKey);
130
+ const auth = new authenticator_1.PartyAuthenticator(party, async () => { });
131
+ const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
132
+ const deviceKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.DEVICE }));
133
+ const secondDeviceKeyRecord = await keyring.createKeyRecord({ type: proto_1.KeyType.DEVICE });
134
+ const messages = [
135
+ (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, identityKeyRecord)
136
+ ];
137
+ // Only add the Identity to the party keyring.
138
+ await party.processMessages(messages);
139
+ const wrappedCredentials = (0, proto_1.codecLoop)((0, auth_message_1.createAuthMessage)(keyring, partyKey, identityKeyRecord, getIdentityKeyChainForDevice(keyring, secondDeviceKeyRecord.publicKey, messageMap([
140
+ ...messages,
141
+ (0, party_1.createKeyAdmitMessage)(keyring, partyKey, deviceKeyRecord, [identityKeyRecord]),
142
+ (0, party_1.createKeyAdmitMessage)(keyring, partyKey, secondDeviceKeyRecord, [deviceKeyRecord])
143
+ ]))));
144
+ const ok = await auth.authenticate(wrappedCredentials.payload);
145
+ (0, expect_1.default)(ok).toBe(true);
146
+ });
147
+ it('bad chain', async () => {
148
+ const { keyring, partyKey } = await createPartyKeyrings();
149
+ const party = new party_1.PartyState(partyKey);
150
+ const auth = new authenticator_1.PartyAuthenticator(party, async () => { });
151
+ const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
152
+ const deviceKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.DEVICE }));
153
+ const secondDeviceKeyRecord = await keyring.createKeyRecord({ type: proto_1.KeyType.DEVICE });
154
+ const messages = [
155
+ (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, identityKeyRecord)
156
+ ];
157
+ // Only add the Identity to the party keyring.
158
+ await party.processMessages(messages);
159
+ // A bad chain, it doesn't track back to the Identity.
160
+ const chain = getIdentityKeyChainForDevice(keyring, secondDeviceKeyRecord.publicKey, messageMap([
161
+ ...messages,
162
+ (0, party_1.createKeyAdmitMessage)(keyring, partyKey, deviceKeyRecord, [deviceKeyRecord]),
163
+ (0, party_1.createKeyAdmitMessage)(keyring, partyKey, secondDeviceKeyRecord, [deviceKeyRecord])
164
+ ]));
165
+ const wrappedCredentials = (0, proto_1.codecLoop)((0, auth_message_1.createAuthMessage)(keyring, partyKey, identityKeyRecord, chain));
166
+ const ok = await auth.authenticate(wrappedCredentials.payload);
167
+ (0, expect_1.default)(ok).toBe(false);
168
+ });
169
+ // TODO(dboreham): This test isn't discriminating errors because when I broke the code entirely it still passed.
170
+ it('wrong key', async () => {
171
+ const { keyring, partyKey } = await createPartyKeyrings();
172
+ const party = new party_1.PartyState(partyKey);
173
+ const auth = new authenticator_1.PartyAuthenticator(party, async () => { });
174
+ const wrongKey = await keyring.createKeyRecord();
175
+ const messages = [
176
+ (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY })))
177
+ ];
178
+ await party.processMessages(messages);
179
+ const wrappedCredentials = (0, proto_1.codecLoop)((0, auth_message_1.createAuthMessage)(keyring, partyKey, keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY })), wrongKey));
180
+ const ok = await auth.authenticate(wrappedCredentials.payload);
181
+ (0, expect_1.default)(ok).toBe(false);
182
+ });
183
+ it('wrong party', async () => {
184
+ const { keyring, partyKey } = await createPartyKeyrings();
185
+ const party = new party_1.PartyState(partyKey);
186
+ const auth = new authenticator_1.PartyAuthenticator(party, async () => { });
187
+ const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
188
+ const messages = [
189
+ (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, identityKeyRecord)
190
+ ];
191
+ await party.processMessages(messages);
192
+ const wrappedCredentials = (0, proto_1.codecLoop)((0, auth_message_1.createAuthMessage)(keyring, (0, crypto_1.randomBytes)(32), identityKeyRecord, identityKeyRecord));
193
+ const ok = await auth.authenticate(wrappedCredentials.payload);
194
+ (0, expect_1.default)(ok).toBe(false);
195
+ });
196
+ it('missing deviceKey', async () => {
197
+ const { keyring, partyKey } = await createPartyKeyrings();
198
+ const party = new party_1.PartyState(partyKey);
199
+ const auth = new authenticator_1.PartyAuthenticator(party, async () => { });
200
+ const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
201
+ const messages = [
202
+ (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY })))
203
+ ];
204
+ await party.processMessages(messages);
205
+ const wrappedCredentials = {
206
+ '@type': 'dxos.credentials.Message',
207
+ payload: keyring.sign({
208
+ '@type': 'dxos.credentials.auth.Auth',
209
+ partyKey,
210
+ identityKey: identityKeyRecord.publicKey
211
+ }, [identityKeyRecord])
212
+ };
213
+ const ok = await auth.authenticate(wrappedCredentials.payload);
214
+ (0, expect_1.default)(ok).toBe(false);
215
+ });
216
+ it('tampered message', async () => {
217
+ const { keyring, partyKey } = await createPartyKeyrings();
218
+ const party = new party_1.PartyState(partyKey);
219
+ const auth = new authenticator_1.PartyAuthenticator(party, async () => { });
220
+ const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
221
+ const messages = [
222
+ (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, identityKeyRecord)
223
+ ];
224
+ await party.processMessages(messages);
225
+ const wrappedCredentials = (0, proto_1.codecLoop)((0, auth_message_1.createAuthMessage)(keyring, partyKey, identityKeyRecord, identityKeyRecord));
226
+ const before = await auth.authenticate(wrappedCredentials.payload);
227
+ (0, expect_1.default)(before).toBe(true);
228
+ wrappedCredentials.payload.signed.payload.deviceKey = (0, crypto_1.randomBytes)(32);
229
+ const after = await auth.authenticate(wrappedCredentials.payload);
230
+ (0, expect_1.default)(after).toBe(false);
231
+ });
232
+ it('tampered signature', async () => {
233
+ const { keyring, partyKey } = await createPartyKeyrings();
234
+ const party = new party_1.PartyState(partyKey);
235
+ const auth = new authenticator_1.PartyAuthenticator(party, async () => { });
236
+ const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
237
+ const messages = [
238
+ (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, identityKeyRecord)
239
+ ];
240
+ await party.processMessages(messages);
241
+ const wrappedCredentials = (0, proto_1.codecLoop)((0, auth_message_1.createAuthMessage)(keyring, partyKey, identityKeyRecord, identityKeyRecord));
242
+ const before = await auth.authenticate(wrappedCredentials.payload);
243
+ (0, expect_1.default)(before).toBe(true);
244
+ wrappedCredentials.payload.signatures[0].signature = (0, crypto_1.randomBytes)(64);
245
+ const after = await auth.authenticate(wrappedCredentials.payload);
246
+ (0, expect_1.default)(after).toBe(false);
247
+ });
248
+ it('signature too old', async () => {
249
+ const { keyring, partyKey } = await createPartyKeyrings();
250
+ const party = new party_1.PartyState(partyKey);
251
+ const auth = new authenticator_1.PartyAuthenticator(party, async () => { });
252
+ const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
253
+ const deviceKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.DEVICE }));
254
+ const messages = [
255
+ (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, identityKeyRecord)
256
+ ];
257
+ await party.processMessages(messages);
258
+ const wrappedCredentials = {
259
+ '@type': 'dxos.credentials.Message',
260
+ payload: keyring.sign({
261
+ '@type': 'dxos.credentials.auth.Auth',
262
+ partyKey,
263
+ identityKey: identityKeyRecord.publicKey,
264
+ deviceKey: deviceKeyRecord.publicKey
265
+ }, [identityKeyRecord], undefined, (0, moment_1.default)().subtract(2, 'days').format('YYYY-MM-DDTHH:mm:ssZ'))
266
+ };
267
+ const ok = await auth.authenticate(wrappedCredentials.payload);
268
+ (0, expect_1.default)(ok).toBe(false);
269
+ });
270
+ it('signature too far in future', async () => {
271
+ const { keyring, partyKey } = await createPartyKeyrings();
272
+ const party = new party_1.PartyState(partyKey);
273
+ const auth = new authenticator_1.PartyAuthenticator(party, async () => { });
274
+ const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
275
+ const deviceKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.DEVICE }));
276
+ const messages = [
277
+ (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, identityKeyRecord)
278
+ ];
279
+ await party.processMessages(messages);
280
+ const wrappedCredentials = {
281
+ '@type': 'dxos.credentials.Message',
282
+ payload: keyring.sign({
283
+ '@type': 'dxos.credentials.auth.Auth',
284
+ partyKey,
285
+ identityKey: identityKeyRecord.publicKey,
286
+ deviceKey: deviceKeyRecord.publicKey
287
+ }, [identityKeyRecord], undefined, (0, moment_1.default)().add(2, 'days').format('YYYY-MM-DDTHH:mm:ssZ'))
288
+ };
289
+ const ok = await auth.authenticate(wrappedCredentials.payload);
290
+ (0, expect_1.default)(ok).toBe(false);
291
+ });
292
+ it('signature date invalid', async () => {
293
+ const { keyring, partyKey } = await createPartyKeyrings();
294
+ const party = new party_1.PartyState(partyKey);
295
+ const auth = new authenticator_1.PartyAuthenticator(party, async () => { });
296
+ const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
297
+ const deviceKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.DEVICE }));
298
+ const messages = [
299
+ (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, identityKeyRecord)
300
+ ];
301
+ await party.processMessages(messages);
302
+ const wrappedCredentials = {
303
+ '@type': 'dxos.credentials.Message',
304
+ payload: keyring.sign({
305
+ '@type': 'dxos.credentials.auth.Auth',
306
+ partyKey,
307
+ identityKey: identityKeyRecord.publicKey,
308
+ deviceKey: deviceKeyRecord.publicKey
309
+ }, [identityKeyRecord], undefined, 'INVALID')
310
+ };
311
+ const ok = await auth.authenticate(wrappedCredentials.payload);
312
+ (0, expect_1.default)(ok).toBe(false);
95
313
  });
96
- for (const deviceKey of [deviceKeyA, deviceKeyB, deviceKeyC]) {
97
- const emptyKeyring = new keys_1.Keyring();
98
- const chain = keys_1.Keyring.buildKeyChain(deviceKey.publicKey, messages);
99
- // In the target keyring, which only has the Identity, it should chase all the way back to the Identity.
100
- (0, expect_1.default)(identityKey.publicKey).toEqual((await targetKeyring.findTrusted(chain)).publicKey);
101
- // And in the halo, which has all the keys, it should chase straight back to this key.
102
- (0, expect_1.default)(deviceKey.publicKey).toEqual((await haloKeyring.findTrusted(chain)).publicKey);
103
- // And in an empty Keyring, we should not get anything.
104
- (0, expect_1.default)(await emptyKeyring.findTrusted(chain)).toBeUndefined();
105
- }
106
- });
107
- it('PartyAuthenticator - good direct', async () => {
108
- const { keyring, partyKey } = await createPartyKeyrings();
109
- const party = new party_1.PartyState(partyKey);
110
- const auth = new authenticator_1.PartyAuthenticator(party);
111
- const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
112
- const messages = [
113
- (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, identityKeyRecord)
114
- ];
115
- // Only add the Identity to the party keyring.
116
- await party.processMessages(messages);
117
- const wrappedCredentials = (0, proto_1.codecLoop)((0, auth_message_1.createAuthMessage)(keyring, partyKey, identityKeyRecord, identityKeyRecord));
118
- const ok = await auth.authenticate(wrappedCredentials.payload);
119
- (0, expect_1.default)(ok).toBe(true);
120
- });
121
- it('PartyAuthenticator - good chain', async () => {
122
- const { keyring, partyKey } = await createPartyKeyrings();
123
- const party = new party_1.PartyState(partyKey);
124
- const auth = new authenticator_1.PartyAuthenticator(party);
125
- const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
126
- const deviceKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.DEVICE }));
127
- const secondDeviceKeyRecord = await keyring.createKeyRecord({ type: proto_1.KeyType.DEVICE });
128
- const messages = [
129
- (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, identityKeyRecord)
130
- ];
131
- // Only add the Identity to the party keyring.
132
- await party.processMessages(messages);
133
- const wrappedCredentials = (0, proto_1.codecLoop)((0, auth_message_1.createAuthMessage)(keyring, partyKey, identityKeyRecord, getIdentityKeyChainForDevice(keyring, secondDeviceKeyRecord.publicKey, messageMap([
134
- ...messages,
135
- (0, party_1.createKeyAdmitMessage)(keyring, partyKey, deviceKeyRecord, [identityKeyRecord]),
136
- (0, party_1.createKeyAdmitMessage)(keyring, partyKey, secondDeviceKeyRecord, [deviceKeyRecord])
137
- ]))));
138
- const ok = await auth.authenticate(wrappedCredentials.payload);
139
- (0, expect_1.default)(ok).toBe(true);
140
- });
141
- it('PartyAuthenticator - bad chain', async () => {
142
- const { keyring, partyKey } = await createPartyKeyrings();
143
- const party = new party_1.PartyState(partyKey);
144
- const auth = new authenticator_1.PartyAuthenticator(party);
145
- const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
146
- const deviceKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.DEVICE }));
147
- const secondDeviceKeyRecord = await keyring.createKeyRecord({ type: proto_1.KeyType.DEVICE });
148
- const messages = [
149
- (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, identityKeyRecord)
150
- ];
151
- // Only add the Identity to the party keyring.
152
- await party.processMessages(messages);
153
- // A bad chain, it doesn't track back to the Identity.
154
- const chain = getIdentityKeyChainForDevice(keyring, secondDeviceKeyRecord.publicKey, messageMap([
155
- ...messages,
156
- (0, party_1.createKeyAdmitMessage)(keyring, partyKey, deviceKeyRecord, [deviceKeyRecord]),
157
- (0, party_1.createKeyAdmitMessage)(keyring, partyKey, secondDeviceKeyRecord, [deviceKeyRecord])
158
- ]));
159
- const wrappedCredentials = (0, proto_1.codecLoop)((0, auth_message_1.createAuthMessage)(keyring, partyKey, identityKeyRecord, chain));
160
- const ok = await auth.authenticate(wrappedCredentials.payload);
161
- (0, expect_1.default)(ok).toBe(false);
162
- });
163
- // TODO(dboreham): This test isn't discriminating errors because when I broke the code entirely it still passed.
164
- it('PartyAuthenticator - wrong key', async () => {
165
- const { keyring, partyKey } = await createPartyKeyrings();
166
- const party = new party_1.PartyState(partyKey);
167
- const auth = new authenticator_1.PartyAuthenticator(party);
168
- const wrongKey = await keyring.createKeyRecord();
169
- const messages = [
170
- (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY })))
171
- ];
172
- await party.processMessages(messages);
173
- const wrappedCredentials = (0, proto_1.codecLoop)((0, auth_message_1.createAuthMessage)(keyring, partyKey, keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY })), wrongKey));
174
- const ok = await auth.authenticate(wrappedCredentials.payload);
175
- (0, expect_1.default)(ok).toBe(false);
176
- });
177
- it('PartyAuthenticator - wrong party', async () => {
178
- const { keyring, partyKey } = await createPartyKeyrings();
179
- const party = new party_1.PartyState(partyKey);
180
- const auth = new authenticator_1.PartyAuthenticator(party);
181
- const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
182
- const messages = [
183
- (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, identityKeyRecord)
184
- ];
185
- await party.processMessages(messages);
186
- const wrappedCredentials = (0, proto_1.codecLoop)((0, auth_message_1.createAuthMessage)(keyring, (0, crypto_1.randomBytes)(32), identityKeyRecord, identityKeyRecord));
187
- const ok = await auth.authenticate(wrappedCredentials.payload);
188
- (0, expect_1.default)(ok).toBe(false);
189
- });
190
- it('PartyAuthenticator - missing deviceKey', async () => {
191
- const { keyring, partyKey } = await createPartyKeyrings();
192
- const party = new party_1.PartyState(partyKey);
193
- const auth = new authenticator_1.PartyAuthenticator(party);
194
- const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
195
- const messages = [
196
- (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY })))
197
- ];
198
- await party.processMessages(messages);
199
- const wrappedCredentials = {
200
- __type_url: 'dxos.credentials.Message',
201
- payload: keyring.sign({
202
- __type_url: 'dxos.credentials.auth.Auth',
203
- partyKey,
204
- identityKey: identityKeyRecord.publicKey
205
- }, [identityKeyRecord])
206
- };
207
- const ok = await auth.authenticate(wrappedCredentials.payload);
208
- (0, expect_1.default)(ok).toBe(false);
209
- });
210
- it('PartyAuthenticator - tampered message', async () => {
211
- const { keyring, partyKey } = await createPartyKeyrings();
212
- const party = new party_1.PartyState(partyKey);
213
- const auth = new authenticator_1.PartyAuthenticator(party);
214
- const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
215
- const messages = [
216
- (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, identityKeyRecord)
217
- ];
218
- await party.processMessages(messages);
219
- const wrappedCredentials = (0, proto_1.codecLoop)((0, auth_message_1.createAuthMessage)(keyring, partyKey, identityKeyRecord, identityKeyRecord));
220
- const before = await auth.authenticate(wrappedCredentials.payload);
221
- (0, expect_1.default)(before).toBe(true);
222
- wrappedCredentials.payload.signed.payload.deviceKey = (0, crypto_1.randomBytes)(32);
223
- const after = await auth.authenticate(wrappedCredentials.payload);
224
- (0, expect_1.default)(after).toBe(false);
225
- });
226
- it('PartyAuthenticator - tampered signature', async () => {
227
- const { keyring, partyKey } = await createPartyKeyrings();
228
- const party = new party_1.PartyState(partyKey);
229
- const auth = new authenticator_1.PartyAuthenticator(party);
230
- const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
231
- const messages = [
232
- (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, identityKeyRecord)
233
- ];
234
- await party.processMessages(messages);
235
- const wrappedCredentials = (0, proto_1.codecLoop)((0, auth_message_1.createAuthMessage)(keyring, partyKey, identityKeyRecord, identityKeyRecord));
236
- const before = await auth.authenticate(wrappedCredentials.payload);
237
- (0, expect_1.default)(before).toBe(true);
238
- wrappedCredentials.payload.signatures[0].signature = (0, crypto_1.randomBytes)(64);
239
- const after = await auth.authenticate(wrappedCredentials.payload);
240
- (0, expect_1.default)(after).toBe(false);
241
- });
242
- it('PartyAuthenticator - signature too old', async () => {
243
- const { keyring, partyKey } = await createPartyKeyrings();
244
- const party = new party_1.PartyState(partyKey);
245
- const auth = new authenticator_1.PartyAuthenticator(party);
246
- const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
247
- const deviceKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.DEVICE }));
248
- const messages = [
249
- (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, identityKeyRecord)
250
- ];
251
- await party.processMessages(messages);
252
- const wrappedCredentials = {
253
- __type_url: 'dxos.credentials.Message',
254
- payload: keyring.sign({
255
- __type_url: 'dxos.credentials.auth.Auth',
256
- partyKey,
257
- identityKey: identityKeyRecord.publicKey,
258
- deviceKey: deviceKeyRecord.publicKey
259
- }, [identityKeyRecord], null, (0, moment_1.default)().subtract(2, 'days').format('YYYY-MM-DDTHH:mm:ssZ'))
260
- };
261
- const ok = await auth.authenticate(wrappedCredentials.payload);
262
- (0, expect_1.default)(ok).toBe(false);
263
- });
264
- it('PartyAuthenticator - signature too far in future', async () => {
265
- const { keyring, partyKey } = await createPartyKeyrings();
266
- const party = new party_1.PartyState(partyKey);
267
- const auth = new authenticator_1.PartyAuthenticator(party);
268
- const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
269
- const deviceKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.DEVICE }));
270
- const messages = [
271
- (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, identityKeyRecord)
272
- ];
273
- await party.processMessages(messages);
274
- const wrappedCredentials = {
275
- __type_url: 'dxos.credentials.Message',
276
- payload: keyring.sign({
277
- __type_url: 'dxos.credentials.auth.Auth',
278
- partyKey,
279
- identityKey: identityKeyRecord.publicKey,
280
- deviceKey: deviceKeyRecord.publicKey
281
- }, [identityKeyRecord], null, (0, moment_1.default)().add(2, 'days').format('YYYY-MM-DDTHH:mm:ssZ'))
282
- };
283
- const ok = await auth.authenticate(wrappedCredentials.payload);
284
- (0, expect_1.default)(ok).toBe(false);
285
- });
286
- it('PartyAuthenticator - signature date invalid', async () => {
287
- const { keyring, partyKey } = await createPartyKeyrings();
288
- const party = new party_1.PartyState(partyKey);
289
- const auth = new authenticator_1.PartyAuthenticator(party);
290
- const identityKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.IDENTITY }));
291
- const deviceKeyRecord = keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.DEVICE }));
292
- const messages = [
293
- (0, party_1.createPartyGenesisMessage)(keyring, keyring.findKey(keys_1.Filter.matches({ type: proto_1.KeyType.PARTY })), keyring.findKey(keys_1.Keyring.signingFilter({ type: proto_1.KeyType.FEED })).publicKey, identityKeyRecord)
294
- ];
295
- await party.processMessages(messages);
296
- const wrappedCredentials = {
297
- __type_url: 'dxos.credentials.Message',
298
- payload: keyring.sign({
299
- __type_url: 'dxos.credentials.auth.Auth',
300
- partyKey,
301
- identityKey: identityKeyRecord.publicKey,
302
- deviceKey: deviceKeyRecord.publicKey
303
- }, [identityKeyRecord], null, 'INVALID')
304
- };
305
- const ok = await auth.authenticate(wrappedCredentials.payload);
306
- (0, expect_1.default)(ok).toBe(false);
307
314
  });
308
315
  //# sourceMappingURL=auth.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../../../src/auth/auth.test.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../../../src/auth/auth.test.ts"],"names":[],"mappings":"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"}