@ledgerhq/hw-ledger-key-ring-protocol 0.5.2-nightly.3 → 0.5.2
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 +1 -1
- package/CHANGELOG.md +5 -19
- package/lib/__tests__/codec.d.ts +2 -0
- package/lib/__tests__/codec.d.ts.map +1 -0
- package/lib/__tests__/codec.js +99 -0
- package/lib/__tests__/codec.js.map +1 -0
- package/lib/__tests__/crypto.d.ts +2 -0
- package/lib/__tests__/crypto.d.ts.map +1 -0
- package/lib/__tests__/crypto.js +37 -0
- package/lib/__tests__/crypto.js.map +1 -0
- package/lib/__tests__/indexed_tree.d.ts +2 -0
- package/lib/__tests__/indexed_tree.d.ts.map +1 -0
- package/lib/__tests__/indexed_tree.js +44 -0
- package/lib/__tests__/indexed_tree.js.map +1 -0
- package/lib/__tests__/key_exchange.d.ts +2 -0
- package/lib/__tests__/key_exchange.d.ts.map +1 -0
- package/lib/__tests__/key_exchange.js +120 -0
- package/lib/__tests__/key_exchange.js.map +1 -0
- package/lib/__tests__/seedId.d.ts +2 -0
- package/lib/__tests__/seedId.d.ts.map +1 -0
- package/lib/__tests__/seedId.js +92 -0
- package/lib/__tests__/seedId.js.map +1 -0
- package/lib/__tests__/shared_object.d.ts +2 -0
- package/lib/__tests__/shared_object.d.ts.map +1 -0
- package/lib/__tests__/shared_object.js +65 -0
- package/lib/__tests__/shared_object.js.map +1 -0
- package/lib/__tests__/units/NobleCrypto.test.d.ts +2 -0
- package/lib/__tests__/units/NobleCrypto.test.d.ts.map +1 -0
- package/lib/__tests__/units/NobleCrypto.test.js +58 -0
- package/lib/__tests__/units/NobleCrypto.test.js.map +1 -0
- package/lib-es/__tests__/codec.d.ts +2 -0
- package/lib-es/__tests__/codec.d.ts.map +1 -0
- package/lib-es/__tests__/codec.js +97 -0
- package/lib-es/__tests__/codec.js.map +1 -0
- package/lib-es/__tests__/crypto.d.ts +2 -0
- package/lib-es/__tests__/crypto.d.ts.map +1 -0
- package/lib-es/__tests__/crypto.js +35 -0
- package/lib-es/__tests__/crypto.js.map +1 -0
- package/lib-es/__tests__/indexed_tree.d.ts +2 -0
- package/lib-es/__tests__/indexed_tree.d.ts.map +1 -0
- package/lib-es/__tests__/indexed_tree.js +42 -0
- package/lib-es/__tests__/indexed_tree.js.map +1 -0
- package/lib-es/__tests__/key_exchange.d.ts +2 -0
- package/lib-es/__tests__/key_exchange.d.ts.map +1 -0
- package/lib-es/__tests__/key_exchange.js +115 -0
- package/lib-es/__tests__/key_exchange.js.map +1 -0
- package/lib-es/__tests__/seedId.d.ts +2 -0
- package/lib-es/__tests__/seedId.d.ts.map +1 -0
- package/lib-es/__tests__/seedId.js +90 -0
- package/lib-es/__tests__/seedId.js.map +1 -0
- package/lib-es/__tests__/shared_object.d.ts +2 -0
- package/lib-es/__tests__/shared_object.d.ts.map +1 -0
- package/lib-es/__tests__/shared_object.js +63 -0
- package/lib-es/__tests__/shared_object.js.map +1 -0
- package/lib-es/__tests__/units/NobleCrypto.test.d.ts +2 -0
- package/lib-es/__tests__/units/NobleCrypto.test.d.ts.map +1 -0
- package/lib-es/__tests__/units/NobleCrypto.test.js +56 -0
- package/lib-es/__tests__/units/NobleCrypto.test.js.map +1 -0
- package/package.json +3 -3
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
|
|
2
|
-
> @ledgerhq/hw-ledger-key-ring-protocol@0.5.2
|
|
2
|
+
> @ledgerhq/hw-ledger-key-ring-protocol@0.5.2 build /home/runner/work/ledger-live/ledger-live/libs/hw-ledger-key-ring-protocol
|
|
3
3
|
> tsc && tsc -m esnext --moduleResolution bundler --outDir lib-es
|
|
4
4
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,32 +1,18 @@
|
|
|
1
1
|
# @ledgerhq/live-wallet
|
|
2
2
|
|
|
3
|
-
## 0.5.2
|
|
3
|
+
## 0.5.2
|
|
4
4
|
|
|
5
5
|
### Patch Changes
|
|
6
6
|
|
|
7
|
-
- Updated dependencies [[`
|
|
8
|
-
- @ledgerhq/live-env@2.19.0
|
|
9
|
-
|
|
10
|
-
## 0.5.2-nightly.2
|
|
11
|
-
|
|
12
|
-
### Patch Changes
|
|
13
|
-
|
|
14
|
-
- Updated dependencies [[`cadf2e1`](https://github.com/LedgerHQ/ledger-live/commit/cadf2e1dfb09248d3f77d96f94ae774425dbca75)]:
|
|
15
|
-
- @ledgerhq/live-env@2.19.0-nightly.1
|
|
16
|
-
|
|
17
|
-
## 0.5.2-nightly.1
|
|
18
|
-
|
|
19
|
-
### Patch Changes
|
|
20
|
-
|
|
21
|
-
- Updated dependencies []:
|
|
22
|
-
- @ledgerhq/hw-transport@6.31.13-nightly.0
|
|
7
|
+
- Updated dependencies [[`f1f3845`](https://github.com/LedgerHQ/ledger-live/commit/f1f3845942e4cbce9c585dc65f6170ddbc319f19)]:
|
|
8
|
+
- @ledgerhq/live-env@2.19.0
|
|
23
9
|
|
|
24
|
-
## 0.5.2-
|
|
10
|
+
## 0.5.2-next.0
|
|
25
11
|
|
|
26
12
|
### Patch Changes
|
|
27
13
|
|
|
28
14
|
- Updated dependencies [[`f1f3845`](https://github.com/LedgerHQ/ledger-live/commit/f1f3845942e4cbce9c585dc65f6170ddbc319f19)]:
|
|
29
|
-
- @ledgerhq/live-env@2.19.0-
|
|
15
|
+
- @ledgerhq/live-env@2.19.0-next.0
|
|
30
16
|
|
|
31
17
|
## 0.5.1
|
|
32
18
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/__tests__/codec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const CommandBlock_1 = require("../CommandBlock");
|
|
4
|
+
const tlv_1 = require("../tlv");
|
|
5
|
+
const CommandStreamDecoder_1 = require("../CommandStreamDecoder");
|
|
6
|
+
const CommandStreamEncoder_1 = require("../CommandStreamEncoder");
|
|
7
|
+
const Crypto_1 = require("../Crypto");
|
|
8
|
+
const __1 = require("..");
|
|
9
|
+
describe("Encode/Decode command stream tester", () => {
|
|
10
|
+
it("should encode and decode a byte", () => {
|
|
11
|
+
const byte = 42;
|
|
12
|
+
let buffer = new Uint8Array();
|
|
13
|
+
buffer = tlv_1.TLV.pushByte(buffer, 42);
|
|
14
|
+
const decoded = tlv_1.TLV.readVarInt(tlv_1.TLV.readTLV(buffer, 0));
|
|
15
|
+
expect(decoded.value).toBe(byte);
|
|
16
|
+
});
|
|
17
|
+
it("should encode and decode a Int32", () => {
|
|
18
|
+
const varint = 0xdeadbeef;
|
|
19
|
+
let buffer = new Uint8Array();
|
|
20
|
+
buffer = tlv_1.TLV.pushInt32(buffer, varint);
|
|
21
|
+
const decoded = tlv_1.TLV.readVarInt(tlv_1.TLV.readTLV(buffer, 0));
|
|
22
|
+
expect(decoded.value).toBe(varint);
|
|
23
|
+
});
|
|
24
|
+
it("should encode and decode a string", () => {
|
|
25
|
+
const str = "Hello World";
|
|
26
|
+
let buffer = new Uint8Array();
|
|
27
|
+
buffer = tlv_1.TLV.pushString(buffer, str);
|
|
28
|
+
const decoded = tlv_1.TLV.readString(tlv_1.TLV.readTLV(buffer, 0));
|
|
29
|
+
expect(decoded.value).toBe(str);
|
|
30
|
+
});
|
|
31
|
+
it("should encode and decode a hash", () => {
|
|
32
|
+
const hash = Crypto_1.crypto.hash(new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]));
|
|
33
|
+
let buffer = new Uint8Array();
|
|
34
|
+
buffer = tlv_1.TLV.pushHash(buffer, hash);
|
|
35
|
+
const decoded = tlv_1.TLV.readHash(tlv_1.TLV.readTLV(buffer, 0));
|
|
36
|
+
expect(Crypto_1.crypto.to_hex(decoded.value)).toEqual(Crypto_1.crypto.to_hex(hash));
|
|
37
|
+
});
|
|
38
|
+
it("should encode and decode bytes", () => {
|
|
39
|
+
const bytes = new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
|
|
40
|
+
let buffer = new Uint8Array();
|
|
41
|
+
buffer = tlv_1.TLV.pushBytes(buffer, bytes);
|
|
42
|
+
const decoded = tlv_1.TLV.readBytes(tlv_1.TLV.readTLV(buffer, 0));
|
|
43
|
+
expect(decoded.value).toEqual(bytes);
|
|
44
|
+
});
|
|
45
|
+
it("should encode and decode a signature", () => {
|
|
46
|
+
const alice = Crypto_1.crypto.randomKeypair();
|
|
47
|
+
const block = (0, CommandBlock_1.signCommandBlock)((0, CommandBlock_1.createCommandBlock)(alice.publicKey, []), alice.publicKey, alice.privateKey);
|
|
48
|
+
let buffer = new Uint8Array();
|
|
49
|
+
buffer = tlv_1.TLV.pushSignature(buffer, block.signature);
|
|
50
|
+
const decoded = tlv_1.TLV.readSignature(tlv_1.TLV.readTLV(buffer, 0));
|
|
51
|
+
expect(decoded.value).toEqual(block.signature);
|
|
52
|
+
});
|
|
53
|
+
it("should encode and decode a public key", () => {
|
|
54
|
+
const alice = Crypto_1.crypto.randomKeypair();
|
|
55
|
+
let buffer = new Uint8Array();
|
|
56
|
+
buffer = tlv_1.TLV.pushPublicKey(buffer, alice.publicKey);
|
|
57
|
+
const decoded = tlv_1.TLV.readPublicKey(tlv_1.TLV.readTLV(buffer, 0));
|
|
58
|
+
expect(decoded.value).toEqual(alice.publicKey);
|
|
59
|
+
});
|
|
60
|
+
it("should encode and decode a stream. Encoding/Decoding should not alter the stream", () => {
|
|
61
|
+
const alice = Crypto_1.crypto.randomKeypair();
|
|
62
|
+
const groupPk = Crypto_1.crypto.randomKeypair();
|
|
63
|
+
const groupChainCode = Crypto_1.crypto.randomBytes(32);
|
|
64
|
+
const xpriv = new Uint8Array(64);
|
|
65
|
+
const initializationVector = Crypto_1.crypto.randomBytes(16);
|
|
66
|
+
xpriv.set(groupPk.privateKey);
|
|
67
|
+
xpriv.set(groupChainCode, 32);
|
|
68
|
+
const ephemeralPk = Crypto_1.crypto.randomKeypair();
|
|
69
|
+
const block1 = (0, CommandBlock_1.signCommandBlock)((0, CommandBlock_1.createCommandBlock)(alice.publicKey, [
|
|
70
|
+
new CommandBlock_1.Seed(Crypto_1.crypto.randomBytes(16), 0, groupPk.publicKey, initializationVector, xpriv, ephemeralPk.publicKey),
|
|
71
|
+
]), alice.publicKey, alice.privateKey);
|
|
72
|
+
const block2 = (0, CommandBlock_1.signCommandBlock)((0, CommandBlock_1.createCommandBlock)(alice.publicKey, [
|
|
73
|
+
new CommandBlock_1.AddMember("Alice", Crypto_1.crypto.randomBytes(32), CommandBlock_1.Permissions.OWNER),
|
|
74
|
+
new CommandBlock_1.PublishKey(Crypto_1.crypto.randomBytes(16), Crypto_1.crypto.randomBytes(32), Crypto_1.crypto.randomBytes(32), Crypto_1.crypto.randomBytes(32)),
|
|
75
|
+
]), alice.publicKey, alice.privateKey);
|
|
76
|
+
const block3 = (0, CommandBlock_1.signCommandBlock)((0, CommandBlock_1.createCommandBlock)(alice.publicKey, []), alice.publicKey, alice.privateKey);
|
|
77
|
+
const stream = [block1, block2, block3];
|
|
78
|
+
const encoded = CommandStreamEncoder_1.CommandStreamEncoder.encode(stream);
|
|
79
|
+
const digestEncoded = Crypto_1.crypto.hash(encoded);
|
|
80
|
+
const decoded = CommandStreamDecoder_1.CommandStreamDecoder.decode(encoded);
|
|
81
|
+
const reencoded = CommandStreamEncoder_1.CommandStreamEncoder.encode(decoded);
|
|
82
|
+
const digestReencoded = Crypto_1.crypto.hash(reencoded);
|
|
83
|
+
expect(digestEncoded).toEqual(digestReencoded);
|
|
84
|
+
});
|
|
85
|
+
it("decodes a specific command stream", async () => {
|
|
86
|
+
const tlv = "0101010220824b3168c79e8b61b599751c107117b5c9b647f2b6859de8a245952559707692062102a13e82cd0d2f77d1ab1434d8bd799571e54cd32e1121c5cf82217f8b0b713b6b01010315a8050c800000008000001080000000062103ccf74aa7775b3d39d6cbb0236acee7a7f980b9f6a556a4d814d44b0bd56cb77b05108c51eda6be26623ca919ed17333afcdb054019c0b60ede1692479cc04ce69eae6a0bd51941bab6f044f3dec10c11cf11e6253504d1df6b0aab7dc1996e4eaa7c6f92c29153c59534578901cd7ff4efcea1ae06210268abdb3d49ba4a274ce8660cde0d1eeaf1fea00e281218be775f6b3aefc39756113a040f7765622d746f6f6c732d6563626638062103a270456b0f95714cc61a6473e6b6d8db354a3c377281096bdd2439a5475ecbf80104ffffffff129a05100e5205b4a616b2a4d79b07b4a4932f560540669e741f38fee07956fb0dc0ea9978d55bd5d8424b0d0f66a2c5a45788f92d0ddc283138c7ba62c521de1d604ee7f847c5aed40a11536bbe742af0be8cfd4132062103a270456b0f95714cc61a6473e6b6d8db354a3c377281096bdd2439a5475ecbf80621027003755248202ea8a67d1fcdcd82d7f7022248f3af892fa5307d3ea250dc81050346304402204422a779fd08723d8cba19c0cc11ef7a24f6f1f459cb01598ff1a26f27ea8976022053a554d4f509223f2d08faa5de796fed13a9762f35da08e94884edd1f7c0d015";
|
|
87
|
+
const decoded = CommandStreamDecoder_1.CommandStreamDecoder.decode(Crypto_1.crypto.from_hex(tlv));
|
|
88
|
+
const stream = new __1.CommandStream(decoded);
|
|
89
|
+
const resolved = await stream.resolve();
|
|
90
|
+
expect(resolved.getMembersData()).toEqual([
|
|
91
|
+
{
|
|
92
|
+
id: "03a270456b0f95714cc61a6473e6b6d8db354a3c377281096bdd2439a5475ecbf8",
|
|
93
|
+
name: "web-tools-ecbf8",
|
|
94
|
+
permissions: 4294967295,
|
|
95
|
+
},
|
|
96
|
+
]);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
//# sourceMappingURL=codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/__tests__/codec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/__tests__/crypto.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const Crypto_1 = require("../Crypto");
|
|
4
|
+
describe("Sodium wrapper tester", () => {
|
|
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);
|
|
10
|
+
expect(Crypto_1.crypto.to_hex(shared1)).toBe(Crypto_1.crypto.to_hex(shared2));
|
|
11
|
+
});
|
|
12
|
+
it("should encrypt a message and decrypt using the same symmetric key", async () => {
|
|
13
|
+
//const message = "Hello world!"
|
|
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);
|
|
19
|
+
expect(Crypto_1.crypto.to_hex(decrypted)).toBe(Crypto_1.crypto.to_hex(message));
|
|
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);
|
|
26
|
+
expect(Crypto_1.crypto.to_hex(decrypted)).toBe(Crypto_1.crypto.to_hex(data));
|
|
27
|
+
});
|
|
28
|
+
it("should verify truncated signature by padding 0s from the start", async () => {
|
|
29
|
+
const hash = Crypto_1.crypto.from_hex("19514a2e50bfad4a6de397ebde776191cbb720e8bbfcc3c165385c3664c03341");
|
|
30
|
+
const signature = Crypto_1.crypto.from_hex(
|
|
31
|
+
// Here the "S" part of the signature is only 31 bytes long it should be padded with a 0
|
|
32
|
+
"3043022052a82876fcd4d9d8383ce12a7e4d96bb4c1d9e71e857cd087c092b87cec6baeb021f6b86b9a3bab1e7794ca6ef081c66cb6e6dff06cceddbd23e1f25089e311784");
|
|
33
|
+
const issuer = Crypto_1.crypto.from_hex("026e7bf1e015da491674be5796b15d6fabd1f454aad478a6a223934e5a872719e0");
|
|
34
|
+
expect(await Crypto_1.crypto.verify(hash, signature, issuer)).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexed_tree.d.ts","sourceRoot":"","sources":["../../src/__tests__/indexed_tree.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const IndexedTree_1 = require("../IndexedTree");
|
|
4
|
+
describe("Indexed tree unit test suite", () => {
|
|
5
|
+
it("should create a new tree with a root", () => {
|
|
6
|
+
const tree = new IndexedTree_1.IndexedTree(0);
|
|
7
|
+
expect(tree.getValue()).toBe(0);
|
|
8
|
+
});
|
|
9
|
+
it("should create a new tree with a root and update the root", () => {
|
|
10
|
+
let tree = new IndexedTree_1.IndexedTree(0);
|
|
11
|
+
tree = tree.updateChild([], 1);
|
|
12
|
+
expect(tree.getValue()).toBe(1);
|
|
13
|
+
});
|
|
14
|
+
it("should create a new tree with a root and update a child", () => {
|
|
15
|
+
let tree = new IndexedTree_1.IndexedTree(0);
|
|
16
|
+
tree = tree.updateChild([1], 1);
|
|
17
|
+
expect(tree.getChild(1).getValue()).toBe(1);
|
|
18
|
+
});
|
|
19
|
+
it("should create a tree with multiple children and update a child which had no value before", () => {
|
|
20
|
+
let tree = new IndexedTree_1.IndexedTree(0);
|
|
21
|
+
tree = tree.updateChild([0, 1], 1);
|
|
22
|
+
tree = tree.updateChild([0, 2], 2);
|
|
23
|
+
expect(tree.findChild([0, 1]).getValue()).toBe(1);
|
|
24
|
+
expect(tree.findChild([0, 2]).getValue()).toBe(2);
|
|
25
|
+
expect(tree.getChild(0)?.getValue()).toBe(null);
|
|
26
|
+
tree = tree.updateChild([0], 42);
|
|
27
|
+
expect(tree.getChild(0)?.getValue()).toBe(42);
|
|
28
|
+
});
|
|
29
|
+
it("should add a subtree to the tree", () => {
|
|
30
|
+
let tree = new IndexedTree_1.IndexedTree(0);
|
|
31
|
+
tree = tree.addChild([0, 1], new IndexedTree_1.IndexedTree(1));
|
|
32
|
+
tree = tree.addChild([0, 2], new IndexedTree_1.IndexedTree(2));
|
|
33
|
+
let subtree = new IndexedTree_1.IndexedTree(42);
|
|
34
|
+
subtree = subtree.updateChild([0], 43);
|
|
35
|
+
subtree = subtree.updateChild([1], 44);
|
|
36
|
+
tree = tree.addChild([0, 3], subtree);
|
|
37
|
+
expect(tree.findChild([0, 1]).getValue()).toBe(1);
|
|
38
|
+
expect(tree.findChild([0, 2]).getValue()).toBe(2);
|
|
39
|
+
expect(tree.findChild([0, 3]).getValue()).toBe(42);
|
|
40
|
+
expect(tree.findChild([0, 3, 0]).getValue()).toBe(43);
|
|
41
|
+
expect(tree.findChild([0, 3, 1]).getValue()).toBe(44);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=indexed_tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexed_tree.js","sourceRoot":"","sources":["../../src/__tests__/indexed_tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key_exchange.d.ts","sourceRoot":"","sources":["../../src/__tests__/key_exchange.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const Device_1 = require("../Device");
|
|
7
|
+
const CommandStream_1 = __importDefault(require("../CommandStream"));
|
|
8
|
+
const CommandBlock_1 = require("../CommandBlock");
|
|
9
|
+
const Crypto_1 = require("../Crypto");
|
|
10
|
+
const StreamTreeCipher_1 = require("../StreamTreeCipher");
|
|
11
|
+
const StreamTree_1 = require("../StreamTree");
|
|
12
|
+
const DEFAULT_TOPIC = "c96d450545ff2836204c29af291428a5bf740304978f5dfb0b4a261474192851";
|
|
13
|
+
describe("Symmetric key exchange scenarii", () => {
|
|
14
|
+
it("create a new group with 1 member", async () => {
|
|
15
|
+
const alice = await (0, Device_1.createDevice)();
|
|
16
|
+
const topic = Crypto_1.crypto.from_hex(DEFAULT_TOPIC);
|
|
17
|
+
let stream = new CommandStream_1.default([]);
|
|
18
|
+
stream = await stream.edit().seed(topic).issue(alice);
|
|
19
|
+
const resolved = await stream.resolve();
|
|
20
|
+
expect(resolved.isCreated()).toBe(true);
|
|
21
|
+
expect(resolved.getMembers().length).toBe(1);
|
|
22
|
+
expect(resolved.getMembersData().length).toBe(0);
|
|
23
|
+
expect(Crypto_1.crypto.to_hex(resolved.getTopic())).toBe(Crypto_1.crypto.to_hex(topic));
|
|
24
|
+
//const parsed = CommandStreamDecoder.decode(CommandStreamEncoder.encode(stream.blocks));
|
|
25
|
+
//console.log(JSON.stringify(CommandStreamJsonifier.jsonify(parsed), null, 2));
|
|
26
|
+
//const raw = CommandStreamEncoder.encode(stream.blocks);
|
|
27
|
+
//console.log(crypto.to_hex(raw));
|
|
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)();
|
|
32
|
+
let stream = new CommandStream_1.default();
|
|
33
|
+
stream = await stream.edit().seed(Crypto_1.crypto.from_hex(DEFAULT_TOPIC)).issue(alice);
|
|
34
|
+
stream = await stream
|
|
35
|
+
.edit()
|
|
36
|
+
.addMember("Bob", (await bob.getPublicKey()).publicKey, CommandBlock_1.Permissions.KEY_READER)
|
|
37
|
+
.issue(alice);
|
|
38
|
+
const tree = StreamTree_1.StreamTree.from(stream);
|
|
39
|
+
// Encrypt a message from Alice
|
|
40
|
+
const originalMessage = new TextEncoder().encode("Hello World!");
|
|
41
|
+
const encryptedMessage = await StreamTreeCipher_1.StreamTreeCipher.create(alice).encrypt(tree, [], originalMessage);
|
|
42
|
+
// The message should be different from the original
|
|
43
|
+
expect(Crypto_1.crypto.to_hex(encryptedMessage)).not.toEqual(Crypto_1.crypto.to_hex(originalMessage));
|
|
44
|
+
// Decrypt the message from Bob
|
|
45
|
+
const decryptedMessage = await StreamTreeCipher_1.StreamTreeCipher.create(bob).decrypt(tree, [], encryptedMessage);
|
|
46
|
+
// The message should be the same as the original
|
|
47
|
+
expect(Crypto_1.crypto.to_hex(decryptedMessage)).toBe(Crypto_1.crypto.to_hex(originalMessage));
|
|
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)();
|
|
53
|
+
let stream = new CommandStream_1.default();
|
|
54
|
+
stream = await stream.edit().seed(Crypto_1.crypto.from_hex(DEFAULT_TOPIC)).issue(alice);
|
|
55
|
+
stream = await stream
|
|
56
|
+
.edit()
|
|
57
|
+
.addMember("Bob", (await bob.getPublicKey()).publicKey, CommandBlock_1.Permissions.KEY_READER)
|
|
58
|
+
.issue(alice);
|
|
59
|
+
stream = await stream
|
|
60
|
+
.edit()
|
|
61
|
+
.addMember("Charlie", (await charlie.getPublicKey()).publicKey, CommandBlock_1.Permissions.KEY_READER)
|
|
62
|
+
.issue(alice);
|
|
63
|
+
const tree = StreamTree_1.StreamTree.from(stream);
|
|
64
|
+
// Encrypt a message from Alice
|
|
65
|
+
const originalMessage = new TextEncoder().encode("Hello World!");
|
|
66
|
+
const encryptedMessage = await StreamTreeCipher_1.StreamTreeCipher.create(alice).encrypt(tree, [], originalMessage);
|
|
67
|
+
// The message should be different from the original
|
|
68
|
+
expect(Crypto_1.crypto.to_hex(encryptedMessage)).not.toBe(Crypto_1.crypto.to_hex(originalMessage));
|
|
69
|
+
{
|
|
70
|
+
// Decrypt the message from Bob
|
|
71
|
+
const decryptedMessage = await StreamTreeCipher_1.StreamTreeCipher.create(bob).decrypt(tree, [], encryptedMessage);
|
|
72
|
+
// The message should be the same as the original
|
|
73
|
+
expect(Crypto_1.crypto.to_hex(decryptedMessage)).toBe(Crypto_1.crypto.to_hex(originalMessage));
|
|
74
|
+
}
|
|
75
|
+
{
|
|
76
|
+
// Decrypt the message from Charlie
|
|
77
|
+
const decryptedMessage = await StreamTreeCipher_1.StreamTreeCipher.create(charlie).decrypt(tree, [], encryptedMessage);
|
|
78
|
+
// The message should be the same as the original
|
|
79
|
+
expect(Crypto_1.crypto.to_hex(decryptedMessage)).toBe(Crypto_1.crypto.to_hex(originalMessage));
|
|
80
|
+
}
|
|
81
|
+
//console.log(crypto.to_hex(CommandStreamEncoder.encode(stream.blocks)));
|
|
82
|
+
//const parsed = CommandStreamDecoder.decode(CommandStreamEncoder.encode(stream.blocks));
|
|
83
|
+
//console.log(JSON.stringify(CommandStreamJsonifier.jsonify(parsed), null, 2));
|
|
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)();
|
|
89
|
+
let stream = new CommandStream_1.default();
|
|
90
|
+
stream = await stream.edit().seed(Crypto_1.crypto.from_hex(DEFAULT_TOPIC)).issue(alice);
|
|
91
|
+
stream = await stream
|
|
92
|
+
.edit()
|
|
93
|
+
.addMember("Bob", (await bob.getPublicKey()).publicKey, CommandBlock_1.Permissions.ADD_MEMBER | CommandBlock_1.Permissions.KEY_READER)
|
|
94
|
+
.issue(alice);
|
|
95
|
+
stream = await stream
|
|
96
|
+
.edit()
|
|
97
|
+
.addMember("Charlie", (await charlie.getPublicKey()).publicKey, CommandBlock_1.Permissions.KEY_READER)
|
|
98
|
+
.issue(bob);
|
|
99
|
+
const tree = StreamTree_1.StreamTree.from(stream);
|
|
100
|
+
// Encrypt a message from Alice
|
|
101
|
+
const originalMessage = new TextEncoder().encode("Hello World!");
|
|
102
|
+
const encryptedMessage = await StreamTreeCipher_1.StreamTreeCipher.create(alice).encrypt(tree, [], originalMessage);
|
|
103
|
+
// The message should be different from the original
|
|
104
|
+
expect(Crypto_1.crypto.to_hex(encryptedMessage)).not.toBe(Crypto_1.crypto.to_hex(originalMessage));
|
|
105
|
+
{
|
|
106
|
+
// Decrypt the message from Bob
|
|
107
|
+
const decryptedMessage = await StreamTreeCipher_1.StreamTreeCipher.create(bob).decrypt(tree, [], encryptedMessage);
|
|
108
|
+
// The message should be the same as the original
|
|
109
|
+
expect(Crypto_1.crypto.to_hex(decryptedMessage)).toBe(Crypto_1.crypto.to_hex(originalMessage));
|
|
110
|
+
}
|
|
111
|
+
{
|
|
112
|
+
// Decrypt the message from Charlie
|
|
113
|
+
const decryptedMessage = await StreamTreeCipher_1.StreamTreeCipher.create(charlie).decrypt(tree, [], encryptedMessage);
|
|
114
|
+
// The message should be the same as the original
|
|
115
|
+
expect(Crypto_1.crypto.to_hex(decryptedMessage)).toBe(Crypto_1.crypto.to_hex(originalMessage));
|
|
116
|
+
}
|
|
117
|
+
//console.log(JSON.stringify(CommandStreamJsonifier.jsonify(stream.blocks), null, 2));
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
//# sourceMappingURL=key_exchange.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key_exchange.js","sourceRoot":"","sources":["../../src/__tests__/key_exchange.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seedId.d.ts","sourceRoot":"","sources":["../../src/__tests__/seedId.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const Crypto_1 = require("../Crypto");
|
|
4
|
+
const SeedId_1 = require("../SeedId");
|
|
5
|
+
describe("PubKeyCredential regular cases", () => {
|
|
6
|
+
const rpPubKeyCredential = new SeedId_1.PubKeyCredential({
|
|
7
|
+
version: 0,
|
|
8
|
+
curveId: 0x21,
|
|
9
|
+
signAlgorithm: 0x01,
|
|
10
|
+
publicKey: Crypto_1.crypto.from_hex("02b2c29ab36022219967cc21a306599ecaf51ce9f2998da6982388d52c8c69a6a5"),
|
|
11
|
+
});
|
|
12
|
+
test("assertValidity", () => {
|
|
13
|
+
expect(() => rpPubKeyCredential.assertValidity()).not.toThrow();
|
|
14
|
+
});
|
|
15
|
+
test("toJSON", () => {
|
|
16
|
+
expect(rpPubKeyCredential.toJSON()).toEqual({
|
|
17
|
+
version: 0,
|
|
18
|
+
curveId: 33,
|
|
19
|
+
signAlgorithm: 1,
|
|
20
|
+
publicKey: "02b2c29ab36022219967cc21a306599ecaf51ce9f2998da6982388d52c8c69a6a5",
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
test("toBytes", () => {
|
|
24
|
+
expect(Crypto_1.crypto.to_hex(rpPubKeyCredential.toBytes())).toEqual("0021012102b2c29ab36022219967cc21a306599ecaf51ce9f2998da6982388d52c8c69a6a5");
|
|
25
|
+
});
|
|
26
|
+
test("fromBytes", () => {
|
|
27
|
+
expect(SeedId_1.PubKeyCredential.fromBytes(Crypto_1.crypto.from_hex("0021012102b2c29ab36022219967cc21a306599ecaf51ce9f2998da6982388d52c8c69a6a5"))).toEqual([rpPubKeyCredential, 37]);
|
|
28
|
+
});
|
|
29
|
+
test("toBytes into fromBytes", () => {
|
|
30
|
+
const bytes = rpPubKeyCredential.toBytes();
|
|
31
|
+
const [pubKeyCredential, _] = SeedId_1.PubKeyCredential.fromBytes(bytes);
|
|
32
|
+
expect(pubKeyCredential).toEqual(rpPubKeyCredential);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe("Challenge regular cases", () => {
|
|
36
|
+
const rpPubKeyCredential = new SeedId_1.PubKeyCredential({
|
|
37
|
+
version: 0,
|
|
38
|
+
curveId: 0x21,
|
|
39
|
+
signAlgorithm: 0x01,
|
|
40
|
+
publicKey: Crypto_1.crypto.from_hex("02b2c29ab36022219967cc21a306599ecaf51ce9f2998da6982388d52c8c69a6a5"),
|
|
41
|
+
});
|
|
42
|
+
const challengeData = Crypto_1.crypto.from_hex("53cafde60e5395b164eb867213bc05f6");
|
|
43
|
+
const rpSignature = Crypto_1.crypto.from_hex("3045022025d130d7ae5c48a6cf09781d04a08e9a2d07ce1bd17e84637f6ede4a043c5dcc022100a846ececf20eb53ffc2dc502ce8074ba40b241bfd13edaf1e8575559a9b2b4ea");
|
|
44
|
+
const challenge = new SeedId_1.Challenge({
|
|
45
|
+
payloadType: 0x07,
|
|
46
|
+
version: 0,
|
|
47
|
+
protocolVersion: {
|
|
48
|
+
major: 1,
|
|
49
|
+
minor: 0,
|
|
50
|
+
patch: 0,
|
|
51
|
+
},
|
|
52
|
+
challengeData: challengeData,
|
|
53
|
+
challengeExpiry: new Date(1708678950000),
|
|
54
|
+
host: "localhost",
|
|
55
|
+
rpCredential: rpPubKeyCredential,
|
|
56
|
+
rpSignature: rpSignature,
|
|
57
|
+
});
|
|
58
|
+
test("parse one example from backend", () => {
|
|
59
|
+
const hex = "01010702010012102d4492d50ef878a450d9bd6e8862690014010115483046022100beb271fa9752c377251005e125cc115737e427d5259a2dbbc9a38f7a36430c3f0221008826b3d3c1b491b41908d7cc89d71b92e9428c52a927e95341d555252f687b0f16046654aea120096c6f63616c686f7374320121332103cb7628e7248ddf9c07da54b979f16bf081fb3d173aac0992ad2a44ef6a388ae2600401000000";
|
|
60
|
+
const bytes = Crypto_1.crypto.from_hex(hex);
|
|
61
|
+
const [challengeFromBytes, l] = SeedId_1.Challenge.fromBytes(bytes);
|
|
62
|
+
expect(l).toEqual(bytes.length);
|
|
63
|
+
expect(challengeFromBytes.toJSON()).toEqual({
|
|
64
|
+
payloadType: 7,
|
|
65
|
+
version: 0,
|
|
66
|
+
challenge: { data: "2d4492d50ef878a450d9bd6e88626900", expiry: "2024-05-27T16:02:41.000Z" },
|
|
67
|
+
host: "localhost",
|
|
68
|
+
rp: [
|
|
69
|
+
{
|
|
70
|
+
credential: {
|
|
71
|
+
version: 0,
|
|
72
|
+
curveId: 33,
|
|
73
|
+
signAlgorithm: 1,
|
|
74
|
+
publicKey: "03cb7628e7248ddf9c07da54b979f16bf081fb3d173aac0992ad2a44ef6a388ae2",
|
|
75
|
+
},
|
|
76
|
+
signature: "3046022100beb271fa9752c377251005e125cc115737e427d5259a2dbbc9a38f7a36430c3f0221008826b3d3c1b491b41908d7cc89d71b92e9428c52a927e95341d555252f687b0f",
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
protocolVersion: { major: 1, minor: 0, patch: 0 },
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
test("toBytes", () => {
|
|
83
|
+
expect(Crypto_1.crypto.to_hex(challenge.toBytes())).toEqual("010107020100121053cafde60e5395b164eb867213bc05f614010115473045022025d130d7ae5c48a6cf09781d04a08e9a2d07ce1bd17e84637f6ede4a043c5dcc022100a846ececf20eb53ffc2dc502ce8074ba40b241bfd13edaf1e8575559a9b2b4ea160465d85f2620096c6f63616c686f7374320121332102b2c29ab36022219967cc21a306599ecaf51ce9f2998da6982388d52c8c69a6a5600401000000");
|
|
84
|
+
});
|
|
85
|
+
test("toBytes <> fromBytes", () => {
|
|
86
|
+
const bytes = challenge.toBytes();
|
|
87
|
+
const [challengeFromBytes, _] = SeedId_1.Challenge.fromBytes(bytes);
|
|
88
|
+
expect(challengeFromBytes).toEqual(challenge);
|
|
89
|
+
expect(challengeFromBytes.toBytes()).toEqual(bytes);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
//# sourceMappingURL=seedId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seedId.js","sourceRoot":"","sources":["../../src/__tests__/seedId.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared_object.d.ts","sourceRoot":"","sources":["../../src/__tests__/shared_object.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
This test suite simulates an application generating data (using a fixed shchema) and sharing part of the
|
|
4
|
+
data to specific users. The data is encrypted using a StreamTree.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const StreamTree_1 = require("../StreamTree");
|
|
8
|
+
const __1 = require("..");
|
|
9
|
+
const CommandBlock_1 = require("../CommandBlock");
|
|
10
|
+
const StreamTreeCipher_1 = require("../StreamTreeCipher");
|
|
11
|
+
const Crypto_1 = require("../Crypto");
|
|
12
|
+
const APPLICATION_ID = 12;
|
|
13
|
+
async function encryptSharedObject(device, tree, sharedObject, mapping = new Map()) {
|
|
14
|
+
const cipher = StreamTreeCipher_1.StreamTreeCipher.create(device);
|
|
15
|
+
const encrypt = async (key, defaultPath) => {
|
|
16
|
+
return Crypto_1.crypto.to_hex(await cipher.encrypt(tree, Crypto_1.DerivationPath.toIndexArray(mapping.get(key) || defaultPath), new TextEncoder().encode(sharedObject[key].toString())));
|
|
17
|
+
};
|
|
18
|
+
const encryptedSharedObject = {
|
|
19
|
+
name: await encrypt("name", `0h/${APPLICATION_ID}h/0h/0h/0h`),
|
|
20
|
+
age: await encrypt("age", `0h/${APPLICATION_ID}h/0h/1h/0h`),
|
|
21
|
+
email: await encrypt("email", `0h/${APPLICATION_ID}h/0h/2h/0h`),
|
|
22
|
+
};
|
|
23
|
+
return encryptedSharedObject;
|
|
24
|
+
}
|
|
25
|
+
async function decryptSharedObject(device, tree, encryptedSharedObject, mapping = new Map()) {
|
|
26
|
+
const cipher = StreamTreeCipher_1.StreamTreeCipher.create(device);
|
|
27
|
+
const decrypt = async (key, defaultPath) => {
|
|
28
|
+
const path = Crypto_1.DerivationPath.toIndexArray(mapping.get(key) || defaultPath);
|
|
29
|
+
const bytes = await cipher.decrypt(tree, path, Crypto_1.crypto.from_hex(encryptedSharedObject[key]));
|
|
30
|
+
return new TextDecoder().decode(bytes);
|
|
31
|
+
};
|
|
32
|
+
const sharedObject = {
|
|
33
|
+
name: await decrypt("name", `0h/${APPLICATION_ID}h/0h/0h/0h`),
|
|
34
|
+
age: parseInt(await decrypt("age", `0h/${APPLICATION_ID}h/0h/1h/0h`)),
|
|
35
|
+
email: await decrypt("email", `0h/${APPLICATION_ID}h/0h/2h/0h`),
|
|
36
|
+
};
|
|
37
|
+
return sharedObject;
|
|
38
|
+
}
|
|
39
|
+
describe("Shared object scenario using StreamTree", () => {
|
|
40
|
+
it("should create a tree with 3 members, one member encrypt a shared object and another one decrypts it", async () => {
|
|
41
|
+
const alice = await __1.device.software();
|
|
42
|
+
const bob = await __1.device.software();
|
|
43
|
+
const carol = await __1.device.software();
|
|
44
|
+
// Create a new tree owned by alice
|
|
45
|
+
let tree = await StreamTree_1.StreamTree.createNewTree(alice);
|
|
46
|
+
// Share the application node with bob
|
|
47
|
+
tree = await tree.share(tree.getApplicationRootPath(APPLICATION_ID), alice, (await bob.getPublicKey()).publicKey, "Bob", CommandBlock_1.Permissions.OWNER);
|
|
48
|
+
// Bob creates a shared object and encrypt it (1 value -> 1 encryption key)
|
|
49
|
+
const sharedObject = {
|
|
50
|
+
name: "Bob",
|
|
51
|
+
age: 42,
|
|
52
|
+
email: "bob@box.com",
|
|
53
|
+
};
|
|
54
|
+
//console.dir(sharedObject, { depth: null });
|
|
55
|
+
const encryptedObject = await encryptSharedObject(bob, tree, sharedObject);
|
|
56
|
+
// Share the application node with carol
|
|
57
|
+
tree = await tree.share(tree.getApplicationRootPath(APPLICATION_ID), alice, (await carol.getPublicKey()).publicKey, "Carol", CommandBlock_1.Permissions.OWNER);
|
|
58
|
+
// Decrypt with Carol
|
|
59
|
+
const decryptedObject = await decryptSharedObject(carol, tree, encryptedObject);
|
|
60
|
+
//console.dir(encryptedObject, { depth: null });
|
|
61
|
+
//console.dir(decryptedObject, { depth: null });
|
|
62
|
+
expect(decryptedObject).toEqual(sharedObject);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=shared_object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared_object.js","sourceRoot":"","sources":["../../src/__tests__/shared_object.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NobleCrypto.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/units/NobleCrypto.test.ts"],"names":[],"mappings":""}
|