@ledgerhq/hw-ledger-key-ring-protocol 0.3.1 → 0.3.2-nightly.1
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/.turbo/turbo-build.log +2 -2
- package/CHANGELOG.md +14 -0
- package/lib/ApduDevice.d.ts +1 -0
- package/lib/ApduDevice.d.ts.map +1 -1
- package/lib/ApduDevice.js +195 -240
- package/lib/ApduDevice.js.map +1 -1
- package/lib/CommandBlock.js +26 -2
- package/lib/CommandBlock.js.map +1 -1
- package/lib/CommandStream.js +69 -85
- package/lib/CommandStream.js.map +1 -1
- package/lib/CommandStreamResolver.js +42 -56
- package/lib/CommandStreamResolver.js.map +1 -1
- package/lib/Device.js +115 -131
- package/lib/Device.js.map +1 -1
- package/lib/IndexedTree.js +2 -0
- package/lib/IndexedTree.js.map +1 -1
- package/lib/PublicKey.js +1 -0
- package/lib/PublicKey.js.map +1 -1
- package/lib/SeedId.js +12 -0
- package/lib/SeedId.js.map +1 -1
- package/lib/StreamTree.js +56 -72
- package/lib/StreamTree.js.map +1 -1
- package/lib/StreamTreeCipher.js +62 -75
- package/lib/StreamTreeCipher.js.map +1 -1
- package/lib/__tests__/codec.js +3 -12
- package/lib/__tests__/codec.js.map +1 -1
- package/lib/__tests__/crypto.js +22 -31
- package/lib/__tests__/crypto.js.map +1 -1
- package/lib/__tests__/indexed_tree.js +2 -3
- package/lib/__tests__/indexed_tree.js.map +1 -1
- package/lib/__tests__/key_exchange.js +40 -49
- package/lib/__tests__/key_exchange.js.map +1 -1
- package/lib/__tests__/shared_object.js +34 -47
- package/lib/__tests__/shared_object.js.map +1 -1
- package/lib-es/ApduDevice.d.ts +1 -0
- package/lib-es/ApduDevice.d.ts.map +1 -1
- package/lib-es/ApduDevice.js +195 -240
- package/lib-es/ApduDevice.js.map +1 -1
- package/lib-es/CommandBlock.js +26 -2
- package/lib-es/CommandBlock.js.map +1 -1
- package/lib-es/CommandStream.js +69 -85
- package/lib-es/CommandStream.js.map +1 -1
- package/lib-es/CommandStreamResolver.js +42 -56
- package/lib-es/CommandStreamResolver.js.map +1 -1
- package/lib-es/Device.js +115 -131
- package/lib-es/Device.js.map +1 -1
- package/lib-es/IndexedTree.js +2 -0
- package/lib-es/IndexedTree.js.map +1 -1
- package/lib-es/PublicKey.js +1 -0
- package/lib-es/PublicKey.js.map +1 -1
- package/lib-es/SeedId.js +12 -0
- package/lib-es/SeedId.js.map +1 -1
- package/lib-es/StreamTree.js +56 -72
- package/lib-es/StreamTree.js.map +1 -1
- package/lib-es/StreamTreeCipher.js +62 -75
- package/lib-es/StreamTreeCipher.js.map +1 -1
- package/lib-es/__tests__/codec.js +3 -12
- package/lib-es/__tests__/codec.js.map +1 -1
- package/lib-es/__tests__/crypto.js +22 -31
- package/lib-es/__tests__/crypto.js.map +1 -1
- package/lib-es/__tests__/indexed_tree.js +2 -3
- package/lib-es/__tests__/indexed_tree.js.map +1 -1
- package/lib-es/__tests__/key_exchange.js +40 -49
- package/lib-es/__tests__/key_exchange.js.map +1 -1
- package/lib-es/__tests__/shared_object.js +34 -47
- package/lib-es/__tests__/shared_object.js.map +1 -1
- package/package.json +4 -4
- package/tsconfig.json +0 -1
package/lib/StreamTree.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StreamTree.js","sourceRoot":"","sources":["../src/StreamTree.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"StreamTree.js","sourceRoot":"","sources":["../src/StreamTree.ts"],"names":[],"mappings":"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"}
|
package/lib/StreamTreeCipher.js
CHANGED
|
@@ -1,13 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
3
|
exports.StreamTreeCipher = exports.StreamTreeCipherMode = void 0;
|
|
13
4
|
const _1 = require(".");
|
|
@@ -24,6 +15,8 @@ const TAG_LENGTH = 16;
|
|
|
24
15
|
*
|
|
25
16
|
*/
|
|
26
17
|
class StreamTreeCipher {
|
|
18
|
+
_mode;
|
|
19
|
+
_device;
|
|
27
20
|
constructor(mode, device) {
|
|
28
21
|
this._mode = mode;
|
|
29
22
|
this._device = device;
|
|
@@ -41,49 +34,45 @@ class StreamTreeCipher {
|
|
|
41
34
|
* @throws Error if the cipher mode is not implemented
|
|
42
35
|
* @throws Error if the path is not found in the tree and can't be derived from the device
|
|
43
36
|
*/
|
|
44
|
-
encrypt(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
37
|
+
async encrypt(tree, path, message, nonce = null) {
|
|
38
|
+
if (nonce === null) {
|
|
39
|
+
nonce = _1.crypto.randomBytes(16);
|
|
40
|
+
}
|
|
41
|
+
// Generate ephemeral key pair
|
|
42
|
+
const ephemeralKeyPair = _1.crypto.randomKeypair();
|
|
43
|
+
// Get the group public key
|
|
44
|
+
const groupKeypair = await this.getGroupKeypair(tree, path);
|
|
45
|
+
// Compute the secret via ECDH
|
|
46
|
+
const secret = _1.crypto.ecdh(ephemeralKeyPair, groupKeypair.publicKey);
|
|
47
|
+
let encrypted = new Uint8Array(0);
|
|
48
|
+
switch (this._mode) {
|
|
49
|
+
case StreamTreeCipherMode.AES_256_CBC: {
|
|
50
|
+
encrypted = _1.crypto.encrypt(secret, nonce, message);
|
|
51
|
+
break;
|
|
48
52
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const groupKeypair = yield this.getGroupKeypair(tree, path);
|
|
53
|
-
// Compute the secret via ECDH
|
|
54
|
-
const secret = _1.crypto.ecdh(ephemeralKeyPair, groupKeypair.publicKey);
|
|
55
|
-
let encrypted = new Uint8Array(0);
|
|
56
|
-
switch (this._mode) {
|
|
57
|
-
case StreamTreeCipherMode.AES_256_CBC: {
|
|
58
|
-
encrypted = _1.crypto.encrypt(secret, nonce, message);
|
|
59
|
-
break;
|
|
60
|
-
}
|
|
61
|
-
case StreamTreeCipherMode.AES_256_GCM: {
|
|
62
|
-
encrypted = _1.crypto.encrypt(secret, nonce, message);
|
|
63
|
-
break;
|
|
64
|
-
}
|
|
65
|
-
default:
|
|
66
|
-
throw new Error("Unknown cipher mode");
|
|
53
|
+
case StreamTreeCipherMode.AES_256_GCM: {
|
|
54
|
+
encrypted = _1.crypto.encrypt(secret, nonce, message);
|
|
55
|
+
break;
|
|
67
56
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
57
|
+
default:
|
|
58
|
+
throw new Error("Unknown cipher mode");
|
|
59
|
+
}
|
|
60
|
+
// Serialize encrypted data
|
|
61
|
+
return this.encodeData(ephemeralKeyPair.publicKey, nonce, encrypted, message);
|
|
71
62
|
}
|
|
72
|
-
getGroupKeypair(tree, path) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
return { privateKey, publicKey };
|
|
86
|
-
});
|
|
63
|
+
async getGroupKeypair(tree, path) {
|
|
64
|
+
if (!this._device.isPublicKeyAvailable()) {
|
|
65
|
+
throw new Error("Stream tree cipher is only available for software devices");
|
|
66
|
+
}
|
|
67
|
+
const member = await this._device.getPublicKey();
|
|
68
|
+
const event = await tree.getPublishKeyEvent(member.publicKey, path);
|
|
69
|
+
if (!event) {
|
|
70
|
+
throw new Error("Cannot find key in the tree for the current device");
|
|
71
|
+
}
|
|
72
|
+
// Compute the relative path from the event to the path parameter
|
|
73
|
+
const privateKey = (await this._device.readKey(tree, path)).slice(0, 32);
|
|
74
|
+
const publicKey = _1.crypto.keypairFromSecretKey(privateKey).publicKey;
|
|
75
|
+
return { privateKey, publicKey };
|
|
87
76
|
}
|
|
88
77
|
encodeData(ephemeralPublicKey, nonce, data, message) {
|
|
89
78
|
const result = new Uint8Array(1 + 33 + nonce.length + TAG_LENGTH + data.length);
|
|
@@ -134,34 +123,32 @@ class StreamTreeCipher {
|
|
|
134
123
|
* @throws Error if the path is not found in the tree and can't be derived from the device
|
|
135
124
|
* @throws Error if the checksum is invalid
|
|
136
125
|
*/
|
|
137
|
-
decrypt(tree, path, encrytedPayload) {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
throw new Error("Invalid checksum");
|
|
153
|
-
}
|
|
154
|
-
break;
|
|
155
|
-
}
|
|
156
|
-
case StreamTreeCipherMode.AES_256_GCM: {
|
|
157
|
-
decrypted = _1.crypto.decrypt(secret, nonce, encryptedMessage);
|
|
158
|
-
break;
|
|
126
|
+
async decrypt(tree, path, encrytedPayload) {
|
|
127
|
+
const decodedPayload = this.decodeData(encrytedPayload);
|
|
128
|
+
const ephemeralKey = decodedPayload.ephemeralPublicKey;
|
|
129
|
+
const nonce = decodedPayload.nonce;
|
|
130
|
+
const encryptedMessage = decodedPayload.encrypted;
|
|
131
|
+
const checksum = decodedPayload.checksum;
|
|
132
|
+
const sharedKeyPair = await this.getGroupKeypair(tree, path);
|
|
133
|
+
const secret = _1.crypto.ecdh(sharedKeyPair, ephemeralKey);
|
|
134
|
+
let decrypted = new Uint8Array(0);
|
|
135
|
+
switch (this._mode) {
|
|
136
|
+
case StreamTreeCipherMode.AES_256_CBC: {
|
|
137
|
+
decrypted = _1.crypto.decrypt(secret, nonce, encryptedMessage);
|
|
138
|
+
const computedChecksum = this.computeChecksum(decrypted);
|
|
139
|
+
if (_1.crypto.to_hex(computedChecksum) !== _1.crypto.to_hex(checksum)) {
|
|
140
|
+
throw new Error("Invalid checksum");
|
|
159
141
|
}
|
|
160
|
-
|
|
161
|
-
throw new Error("Unknown cipher mode");
|
|
142
|
+
break;
|
|
162
143
|
}
|
|
163
|
-
|
|
164
|
-
|
|
144
|
+
case StreamTreeCipherMode.AES_256_GCM: {
|
|
145
|
+
decrypted = _1.crypto.decrypt(secret, nonce, encryptedMessage);
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
default:
|
|
149
|
+
throw new Error("Unknown cipher mode");
|
|
150
|
+
}
|
|
151
|
+
return decrypted;
|
|
165
152
|
}
|
|
166
153
|
computeChecksum(message) {
|
|
167
154
|
const hash = _1.crypto.hash(message);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StreamTreeCipher.js","sourceRoot":"","sources":["../src/StreamTreeCipher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"StreamTreeCipher.js","sourceRoot":"","sources":["../src/StreamTreeCipher.ts"],"names":[],"mappings":"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"}
|
package/lib/__tests__/codec.js
CHANGED
|
@@ -1,13 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
3
|
const CommandBlock_1 = require("../CommandBlock");
|
|
13
4
|
const tlv_1 = require("../tlv");
|
|
@@ -91,11 +82,11 @@ describe("Encode/Decode command stream tester", () => {
|
|
|
91
82
|
const digestReencoded = Crypto_1.crypto.hash(reencoded);
|
|
92
83
|
expect(digestEncoded).toEqual(digestReencoded);
|
|
93
84
|
});
|
|
94
|
-
it("decodes a specific command stream", () =>
|
|
85
|
+
it("decodes a specific command stream", async () => {
|
|
95
86
|
const tlv = "0101010220824b3168c79e8b61b599751c107117b5c9b647f2b6859de8a245952559707692062102a13e82cd0d2f77d1ab1434d8bd799571e54cd32e1121c5cf82217f8b0b713b6b01010315a8050c800000008000001080000000062103ccf74aa7775b3d39d6cbb0236acee7a7f980b9f6a556a4d814d44b0bd56cb77b05108c51eda6be26623ca919ed17333afcdb054019c0b60ede1692479cc04ce69eae6a0bd51941bab6f044f3dec10c11cf11e6253504d1df6b0aab7dc1996e4eaa7c6f92c29153c59534578901cd7ff4efcea1ae06210268abdb3d49ba4a274ce8660cde0d1eeaf1fea00e281218be775f6b3aefc39756113a040f7765622d746f6f6c732d6563626638062103a270456b0f95714cc61a6473e6b6d8db354a3c377281096bdd2439a5475ecbf80104ffffffff129a05100e5205b4a616b2a4d79b07b4a4932f560540669e741f38fee07956fb0dc0ea9978d55bd5d8424b0d0f66a2c5a45788f92d0ddc283138c7ba62c521de1d604ee7f847c5aed40a11536bbe742af0be8cfd4132062103a270456b0f95714cc61a6473e6b6d8db354a3c377281096bdd2439a5475ecbf80621027003755248202ea8a67d1fcdcd82d7f7022248f3af892fa5307d3ea250dc81050346304402204422a779fd08723d8cba19c0cc11ef7a24f6f1f459cb01598ff1a26f27ea8976022053a554d4f509223f2d08faa5de796fed13a9762f35da08e94884edd1f7c0d015";
|
|
96
87
|
const decoded = CommandStreamDecoder_1.CommandStreamDecoder.decode(Crypto_1.crypto.from_hex(tlv));
|
|
97
88
|
const stream = new __1.CommandStream(decoded);
|
|
98
|
-
const resolved =
|
|
89
|
+
const resolved = await stream.resolve();
|
|
99
90
|
expect(resolved.getMembersData()).toEqual([
|
|
100
91
|
{
|
|
101
92
|
id: "03a270456b0f95714cc61a6473e6b6d8db354a3c377281096bdd2439a5475ecbf8",
|
|
@@ -103,6 +94,6 @@ describe("Encode/Decode command stream tester", () => {
|
|
|
103
94
|
permissions: 4294967295,
|
|
104
95
|
},
|
|
105
96
|
]);
|
|
106
|
-
})
|
|
97
|
+
});
|
|
107
98
|
});
|
|
108
99
|
//# sourceMappingURL=codec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/__tests__/codec.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/__tests__/codec.ts"],"names":[],"mappings":"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"}
|
package/lib/__tests__/crypto.js
CHANGED
|
@@ -1,46 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
3
|
const Crypto_1 = require("../Crypto");
|
|
13
4
|
describe("Sodium wrapper tester", () => {
|
|
14
|
-
it("should computes the same symetric key with ECDH using two parties", () =>
|
|
15
|
-
const kp1 =
|
|
16
|
-
const kp2 =
|
|
17
|
-
const shared1 =
|
|
18
|
-
const shared2 =
|
|
5
|
+
it("should computes the same symetric key with ECDH using two parties", async () => {
|
|
6
|
+
const kp1 = await Crypto_1.crypto.randomKeypair();
|
|
7
|
+
const kp2 = await Crypto_1.crypto.randomKeypair();
|
|
8
|
+
const shared1 = await Crypto_1.crypto.ecdh(kp1, kp2.publicKey);
|
|
9
|
+
const shared2 = await Crypto_1.crypto.ecdh(kp2, kp1.publicKey);
|
|
19
10
|
expect(Crypto_1.crypto.to_hex(shared1)).toBe(Crypto_1.crypto.to_hex(shared2));
|
|
20
|
-
})
|
|
21
|
-
it("should encrypt a message and decrypt using the same symmetric key", () =>
|
|
11
|
+
});
|
|
12
|
+
it("should encrypt a message and decrypt using the same symmetric key", async () => {
|
|
22
13
|
//const message = "Hello world!"
|
|
23
|
-
const message =
|
|
24
|
-
const key =
|
|
25
|
-
const nonce =
|
|
26
|
-
const encrypted =
|
|
27
|
-
const decrypted =
|
|
14
|
+
const message = await Crypto_1.crypto.randomBytes(64);
|
|
15
|
+
const key = await Crypto_1.crypto.randomBytes(32);
|
|
16
|
+
const nonce = await Crypto_1.crypto.randomBytes(16);
|
|
17
|
+
const encrypted = await Crypto_1.crypto.encrypt(key, nonce, message);
|
|
18
|
+
const decrypted = await Crypto_1.crypto.decrypt(key, nonce, encrypted);
|
|
28
19
|
expect(Crypto_1.crypto.to_hex(decrypted)).toBe(Crypto_1.crypto.to_hex(message));
|
|
29
|
-
})
|
|
30
|
-
it("should encrypt user data", () =>
|
|
31
|
-
const keypair =
|
|
32
|
-
const data =
|
|
33
|
-
const encrypted =
|
|
34
|
-
const decrypted =
|
|
20
|
+
});
|
|
21
|
+
it("should encrypt user data", async () => {
|
|
22
|
+
const keypair = await Crypto_1.crypto.randomKeypair();
|
|
23
|
+
const data = await Crypto_1.crypto.randomBytes(64);
|
|
24
|
+
const encrypted = await Crypto_1.crypto.encryptUserData(keypair.privateKey, data);
|
|
25
|
+
const decrypted = await Crypto_1.crypto.decryptUserData(keypair.privateKey, encrypted);
|
|
35
26
|
expect(Crypto_1.crypto.to_hex(decrypted)).toBe(Crypto_1.crypto.to_hex(data));
|
|
36
|
-
})
|
|
37
|
-
it("should verify truncated signature by padding 0s from the start", () =>
|
|
27
|
+
});
|
|
28
|
+
it("should verify truncated signature by padding 0s from the start", async () => {
|
|
38
29
|
const hash = Crypto_1.crypto.from_hex("19514a2e50bfad4a6de397ebde776191cbb720e8bbfcc3c165385c3664c03341");
|
|
39
30
|
const signature = Crypto_1.crypto.from_hex(
|
|
40
31
|
// Here the "S" part of the signature is only 31 bytes long it should be padded with a 0
|
|
41
32
|
"3043022052a82876fcd4d9d8383ce12a7e4d96bb4c1d9e71e857cd087c092b87cec6baeb021f6b86b9a3bab1e7794ca6ef081c66cb6e6dff06cceddbd23e1f25089e311784");
|
|
42
33
|
const issuer = Crypto_1.crypto.from_hex("026e7bf1e015da491674be5796b15d6fabd1f454aad478a6a223934e5a872719e0");
|
|
43
|
-
expect(
|
|
44
|
-
})
|
|
34
|
+
expect(await Crypto_1.crypto.verify(hash, signature, issuer)).toBe(true);
|
|
35
|
+
});
|
|
45
36
|
});
|
|
46
37
|
//# sourceMappingURL=crypto.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/__tests__/crypto.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/__tests__/crypto.ts"],"names":[],"mappings":";;AAAA,sCAAmC;AAEnC,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,GAAG,GAAG,MAAM,eAAM,CAAC,aAAa,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,eAAM,CAAC,aAAa,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,MAAM,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAEtD,MAAM,CAAC,eAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,gCAAgC;QAChC,MAAM,OAAO,GAAG,MAAM,eAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,eAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,eAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,MAAM,eAAM,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,MAAM,eAAM,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAC9D,MAAM,CAAC,eAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,OAAO,GAAG,MAAM,eAAM,CAAC,aAAa,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,MAAM,eAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,MAAM,eAAM,CAAC,eAAe,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACzE,MAAM,SAAS,GAAG,MAAM,eAAM,CAAC,eAAe,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC9E,MAAM,CAAC,eAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,IAAI,GAAG,eAAM,CAAC,QAAQ,CAC1B,kEAAkE,CACnE,CAAC;QACF,MAAM,SAAS,GAAG,eAAM,CAAC,QAAQ;QAC/B,wFAAwF;QACxF,4IAA4I,CAC7I,CAAC;QACF,MAAM,MAAM,GAAG,eAAM,CAAC,QAAQ,CAC5B,oEAAoE,CACrE,CAAC;QACF,MAAM,CAAC,MAAM,eAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -17,15 +17,14 @@ describe("Indexed tree unit test suite", () => {
|
|
|
17
17
|
expect(tree.getChild(1).getValue()).toBe(1);
|
|
18
18
|
});
|
|
19
19
|
it("should create a tree with multiple children and update a child which had no value before", () => {
|
|
20
|
-
var _a, _b;
|
|
21
20
|
let tree = new IndexedTree_1.IndexedTree(0);
|
|
22
21
|
tree = tree.updateChild([0, 1], 1);
|
|
23
22
|
tree = tree.updateChild([0, 2], 2);
|
|
24
23
|
expect(tree.findChild([0, 1]).getValue()).toBe(1);
|
|
25
24
|
expect(tree.findChild([0, 2]).getValue()).toBe(2);
|
|
26
|
-
expect(
|
|
25
|
+
expect(tree.getChild(0)?.getValue()).toBe(null);
|
|
27
26
|
tree = tree.updateChild([0], 42);
|
|
28
|
-
expect(
|
|
27
|
+
expect(tree.getChild(0)?.getValue()).toBe(42);
|
|
29
28
|
});
|
|
30
29
|
it("should add a subtree to the tree", () => {
|
|
31
30
|
let tree = new IndexedTree_1.IndexedTree(0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexed_tree.js","sourceRoot":"","sources":["../../src/__tests__/indexed_tree.ts"],"names":[],"mappings":";;AAAA,gDAA6C;AAE7C,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,IAAI,GAAG,IAAI,yBAAW,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,IAAI,IAAI,GAAG,IAAI,yBAAW,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,IAAI,IAAI,GAAG,IAAI,yBAAW,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0FAA0F,EAAE,GAAG,EAAE
|
|
1
|
+
{"version":3,"file":"indexed_tree.js","sourceRoot":"","sources":["../../src/__tests__/indexed_tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
4
|
};
|
|
@@ -20,12 +11,12 @@ const StreamTreeCipher_1 = require("../StreamTreeCipher");
|
|
|
20
11
|
const StreamTree_1 = require("../StreamTree");
|
|
21
12
|
const DEFAULT_TOPIC = "c96d450545ff2836204c29af291428a5bf740304978f5dfb0b4a261474192851";
|
|
22
13
|
describe("Symmetric key exchange scenarii", () => {
|
|
23
|
-
it("create a new group with 1 member", () =>
|
|
24
|
-
const alice =
|
|
14
|
+
it("create a new group with 1 member", async () => {
|
|
15
|
+
const alice = await (0, Device_1.createDevice)();
|
|
25
16
|
const topic = Crypto_1.crypto.from_hex(DEFAULT_TOPIC);
|
|
26
17
|
let stream = new CommandStream_1.default([]);
|
|
27
|
-
stream =
|
|
28
|
-
const resolved =
|
|
18
|
+
stream = await stream.edit().seed(topic).issue(alice);
|
|
19
|
+
const resolved = await stream.resolve();
|
|
29
20
|
expect(resolved.isCreated()).toBe(true);
|
|
30
21
|
expect(resolved.getMembers().length).toBe(1);
|
|
31
22
|
expect(resolved.getMembersData().length).toBe(0);
|
|
@@ -34,96 +25,96 @@ describe("Symmetric key exchange scenarii", () => {
|
|
|
34
25
|
//console.log(JSON.stringify(CommandStreamJsonifier.jsonify(parsed), null, 2));
|
|
35
26
|
//const raw = CommandStreamEncoder.encode(stream.blocks);
|
|
36
27
|
//console.log(crypto.to_hex(raw));
|
|
37
|
-
})
|
|
38
|
-
it("create a group owned by Alice, Alice adds Bob and publish a key for Bob.", () =>
|
|
39
|
-
const alice =
|
|
40
|
-
const bob =
|
|
28
|
+
});
|
|
29
|
+
it("create a group owned by Alice, Alice adds Bob and publish a key for Bob.", async () => {
|
|
30
|
+
const alice = await (0, Device_1.createDevice)();
|
|
31
|
+
const bob = await (0, Device_1.createDevice)();
|
|
41
32
|
let stream = new CommandStream_1.default();
|
|
42
|
-
stream =
|
|
43
|
-
stream =
|
|
33
|
+
stream = await stream.edit().seed(Crypto_1.crypto.from_hex(DEFAULT_TOPIC)).issue(alice);
|
|
34
|
+
stream = await stream
|
|
44
35
|
.edit()
|
|
45
|
-
.addMember("Bob", (
|
|
36
|
+
.addMember("Bob", (await bob.getPublicKey()).publicKey, CommandBlock_1.Permissions.KEY_READER)
|
|
46
37
|
.issue(alice);
|
|
47
38
|
const tree = StreamTree_1.StreamTree.from(stream);
|
|
48
39
|
// Encrypt a message from Alice
|
|
49
40
|
const originalMessage = new TextEncoder().encode("Hello World!");
|
|
50
|
-
const encryptedMessage =
|
|
41
|
+
const encryptedMessage = await StreamTreeCipher_1.StreamTreeCipher.create(alice).encrypt(tree, [], originalMessage);
|
|
51
42
|
// The message should be different from the original
|
|
52
43
|
expect(Crypto_1.crypto.to_hex(encryptedMessage)).not.toEqual(Crypto_1.crypto.to_hex(originalMessage));
|
|
53
44
|
// Decrypt the message from Bob
|
|
54
|
-
const decryptedMessage =
|
|
45
|
+
const decryptedMessage = await StreamTreeCipher_1.StreamTreeCipher.create(bob).decrypt(tree, [], encryptedMessage);
|
|
55
46
|
// The message should be the same as the original
|
|
56
47
|
expect(Crypto_1.crypto.to_hex(decryptedMessage)).toBe(Crypto_1.crypto.to_hex(originalMessage));
|
|
57
|
-
})
|
|
58
|
-
it("create a group owned by Alice, Alice adds Bob and publish a key for Bob, Alice adds Charlie and Bob publishes a key for Charlie", () =>
|
|
59
|
-
const alice =
|
|
60
|
-
const bob =
|
|
61
|
-
const charlie =
|
|
48
|
+
});
|
|
49
|
+
it("create a group owned by Alice, Alice adds Bob and publish a key for Bob, Alice adds Charlie and Bob publishes a key for Charlie", async () => {
|
|
50
|
+
const alice = await (0, Device_1.createDevice)();
|
|
51
|
+
const bob = await (0, Device_1.createDevice)();
|
|
52
|
+
const charlie = await (0, Device_1.createDevice)();
|
|
62
53
|
let stream = new CommandStream_1.default();
|
|
63
|
-
stream =
|
|
64
|
-
stream =
|
|
54
|
+
stream = await stream.edit().seed(Crypto_1.crypto.from_hex(DEFAULT_TOPIC)).issue(alice);
|
|
55
|
+
stream = await stream
|
|
65
56
|
.edit()
|
|
66
|
-
.addMember("Bob", (
|
|
57
|
+
.addMember("Bob", (await bob.getPublicKey()).publicKey, CommandBlock_1.Permissions.KEY_READER)
|
|
67
58
|
.issue(alice);
|
|
68
|
-
stream =
|
|
59
|
+
stream = await stream
|
|
69
60
|
.edit()
|
|
70
|
-
.addMember("Charlie", (
|
|
61
|
+
.addMember("Charlie", (await charlie.getPublicKey()).publicKey, CommandBlock_1.Permissions.KEY_READER)
|
|
71
62
|
.issue(alice);
|
|
72
63
|
const tree = StreamTree_1.StreamTree.from(stream);
|
|
73
64
|
// Encrypt a message from Alice
|
|
74
65
|
const originalMessage = new TextEncoder().encode("Hello World!");
|
|
75
|
-
const encryptedMessage =
|
|
66
|
+
const encryptedMessage = await StreamTreeCipher_1.StreamTreeCipher.create(alice).encrypt(tree, [], originalMessage);
|
|
76
67
|
// The message should be different from the original
|
|
77
68
|
expect(Crypto_1.crypto.to_hex(encryptedMessage)).not.toBe(Crypto_1.crypto.to_hex(originalMessage));
|
|
78
69
|
{
|
|
79
70
|
// Decrypt the message from Bob
|
|
80
|
-
const decryptedMessage =
|
|
71
|
+
const decryptedMessage = await StreamTreeCipher_1.StreamTreeCipher.create(bob).decrypt(tree, [], encryptedMessage);
|
|
81
72
|
// The message should be the same as the original
|
|
82
73
|
expect(Crypto_1.crypto.to_hex(decryptedMessage)).toBe(Crypto_1.crypto.to_hex(originalMessage));
|
|
83
74
|
}
|
|
84
75
|
{
|
|
85
76
|
// Decrypt the message from Charlie
|
|
86
|
-
const decryptedMessage =
|
|
77
|
+
const decryptedMessage = await StreamTreeCipher_1.StreamTreeCipher.create(charlie).decrypt(tree, [], encryptedMessage);
|
|
87
78
|
// The message should be the same as the original
|
|
88
79
|
expect(Crypto_1.crypto.to_hex(decryptedMessage)).toBe(Crypto_1.crypto.to_hex(originalMessage));
|
|
89
80
|
}
|
|
90
81
|
//console.log(crypto.to_hex(CommandStreamEncoder.encode(stream.blocks)));
|
|
91
82
|
//const parsed = CommandStreamDecoder.decode(CommandStreamEncoder.encode(stream.blocks));
|
|
92
83
|
//console.log(JSON.stringify(CommandStreamJsonifier.jsonify(parsed), null, 2));
|
|
93
|
-
})
|
|
94
|
-
it("creates group owned by Alice, Alice adds Bob as an admin, Bob adds Charlie", () =>
|
|
95
|
-
const alice =
|
|
96
|
-
const bob =
|
|
97
|
-
const charlie =
|
|
84
|
+
});
|
|
85
|
+
it("creates group owned by Alice, Alice adds Bob as an admin, Bob adds Charlie", async () => {
|
|
86
|
+
const alice = await (0, Device_1.createDevice)();
|
|
87
|
+
const bob = await (0, Device_1.createDevice)();
|
|
88
|
+
const charlie = await (0, Device_1.createDevice)();
|
|
98
89
|
let stream = new CommandStream_1.default();
|
|
99
|
-
stream =
|
|
100
|
-
stream =
|
|
90
|
+
stream = await stream.edit().seed(Crypto_1.crypto.from_hex(DEFAULT_TOPIC)).issue(alice);
|
|
91
|
+
stream = await stream
|
|
101
92
|
.edit()
|
|
102
|
-
.addMember("Bob", (
|
|
93
|
+
.addMember("Bob", (await bob.getPublicKey()).publicKey, CommandBlock_1.Permissions.ADD_MEMBER | CommandBlock_1.Permissions.KEY_READER)
|
|
103
94
|
.issue(alice);
|
|
104
|
-
stream =
|
|
95
|
+
stream = await stream
|
|
105
96
|
.edit()
|
|
106
|
-
.addMember("Charlie", (
|
|
97
|
+
.addMember("Charlie", (await charlie.getPublicKey()).publicKey, CommandBlock_1.Permissions.KEY_READER)
|
|
107
98
|
.issue(bob);
|
|
108
99
|
const tree = StreamTree_1.StreamTree.from(stream);
|
|
109
100
|
// Encrypt a message from Alice
|
|
110
101
|
const originalMessage = new TextEncoder().encode("Hello World!");
|
|
111
|
-
const encryptedMessage =
|
|
102
|
+
const encryptedMessage = await StreamTreeCipher_1.StreamTreeCipher.create(alice).encrypt(tree, [], originalMessage);
|
|
112
103
|
// The message should be different from the original
|
|
113
104
|
expect(Crypto_1.crypto.to_hex(encryptedMessage)).not.toBe(Crypto_1.crypto.to_hex(originalMessage));
|
|
114
105
|
{
|
|
115
106
|
// Decrypt the message from Bob
|
|
116
|
-
const decryptedMessage =
|
|
107
|
+
const decryptedMessage = await StreamTreeCipher_1.StreamTreeCipher.create(bob).decrypt(tree, [], encryptedMessage);
|
|
117
108
|
// The message should be the same as the original
|
|
118
109
|
expect(Crypto_1.crypto.to_hex(decryptedMessage)).toBe(Crypto_1.crypto.to_hex(originalMessage));
|
|
119
110
|
}
|
|
120
111
|
{
|
|
121
112
|
// Decrypt the message from Charlie
|
|
122
|
-
const decryptedMessage =
|
|
113
|
+
const decryptedMessage = await StreamTreeCipher_1.StreamTreeCipher.create(charlie).decrypt(tree, [], encryptedMessage);
|
|
123
114
|
// The message should be the same as the original
|
|
124
115
|
expect(Crypto_1.crypto.to_hex(decryptedMessage)).toBe(Crypto_1.crypto.to_hex(originalMessage));
|
|
125
116
|
}
|
|
126
117
|
//console.log(JSON.stringify(CommandStreamJsonifier.jsonify(stream.blocks), null, 2));
|
|
127
|
-
})
|
|
118
|
+
});
|
|
128
119
|
});
|
|
129
120
|
//# sourceMappingURL=key_exchange.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key_exchange.js","sourceRoot":"","sources":["../../src/__tests__/key_exchange.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"key_exchange.js","sourceRoot":"","sources":["../../src/__tests__/key_exchange.ts"],"names":[],"mappings":"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"}
|