@ledgerhq/hw-ledger-key-ring-protocol 0.2.1-fix-build-number-pre.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +33 -0
- package/.turbo/turbo-build.log +4 -0
- package/CHANGELOG.md +126 -0
- package/LICENSE.txt +21 -0
- package/README.md +3 -0
- package/jest.config.js +13 -0
- package/lib/ApduDevice.d.ts +99 -0
- package/lib/ApduDevice.d.ts.map +1 -0
- package/lib/ApduDevice.js +528 -0
- package/lib/ApduDevice.js.map +1 -0
- package/lib/BigEndian.d.ts +7 -0
- package/lib/BigEndian.d.ts.map +1 -0
- package/lib/BigEndian.js +26 -0
- package/lib/BigEndian.js.map +1 -0
- package/lib/CommandBlock.d.ts +114 -0
- package/lib/CommandBlock.d.ts.map +1 -0
- package/lib/CommandBlock.js +156 -0
- package/lib/CommandBlock.js.map +1 -0
- package/lib/CommandStream.d.ts +38 -0
- package/lib/CommandStream.d.ts.map +1 -0
- package/lib/CommandStream.js +195 -0
- package/lib/CommandStream.js.map +1 -0
- package/lib/CommandStreamDecoder.d.ts +15 -0
- package/lib/CommandStreamDecoder.d.ts.map +1 -0
- package/lib/CommandStreamDecoder.js +101 -0
- package/lib/CommandStreamDecoder.js.map +1 -0
- package/lib/CommandStreamEncoder.d.ts +16 -0
- package/lib/CommandStreamEncoder.d.ts.map +1 -0
- package/lib/CommandStreamEncoder.js +131 -0
- package/lib/CommandStreamEncoder.js.map +1 -0
- package/lib/CommandStreamJsonifier.d.ts +6 -0
- package/lib/CommandStreamJsonifier.d.ts.map +1 -0
- package/lib/CommandStreamJsonifier.js +75 -0
- package/lib/CommandStreamJsonifier.js.map +1 -0
- package/lib/CommandStreamResolver.d.ts +53 -0
- package/lib/CommandStreamResolver.d.ts.map +1 -0
- package/lib/CommandStreamResolver.js +221 -0
- package/lib/CommandStreamResolver.js.map +1 -0
- package/lib/Crypto.d.ts +38 -0
- package/lib/Crypto.d.ts.map +1 -0
- package/lib/Crypto.js +47 -0
- package/lib/Crypto.js.map +1 -0
- package/lib/Device.d.ts +43 -0
- package/lib/Device.d.ts.map +1 -0
- package/lib/Device.js +195 -0
- package/lib/Device.js.map +1 -0
- package/lib/IndexedTree.d.ts +13 -0
- package/lib/IndexedTree.d.ts.map +1 -0
- package/lib/IndexedTree.js +75 -0
- package/lib/IndexedTree.js.map +1 -0
- package/lib/NobleCrypto.d.ts +39 -0
- package/lib/NobleCrypto.d.ts.map +1 -0
- package/lib/NobleCrypto.js +240 -0
- package/lib/NobleCrypto.js.map +1 -0
- package/lib/PublicKey.d.ts +5 -0
- package/lib/PublicKey.d.ts.map +1 -0
- package/lib/PublicKey.js +10 -0
- package/lib/PublicKey.js.map +1 -0
- package/lib/SeedId.d.ts +80 -0
- package/lib/SeedId.d.ts.map +1 -0
- package/lib/SeedId.js +244 -0
- package/lib/SeedId.js.map +1 -0
- package/lib/StreamTree.d.ts +50 -0
- package/lib/StreamTree.d.ts.map +1 -0
- package/lib/StreamTree.js +169 -0
- package/lib/StreamTree.js.map +1 -0
- package/lib/StreamTreeCipher.d.ts +46 -0
- package/lib/StreamTreeCipher.d.ts.map +1 -0
- package/lib/StreamTreeCipher.js +175 -0
- package/lib/StreamTreeCipher.js.map +1 -0
- package/lib/__tests__/codec.d.ts +2 -0
- package/lib/__tests__/codec.d.ts.map +1 -0
- package/lib/__tests__/codec.js +108 -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 +46 -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 +45 -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 +129 -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 +78 -0
- package/lib/__tests__/shared_object.js.map +1 -0
- package/lib/index.d.ts +35 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +81 -0
- package/lib/index.js.map +1 -0
- package/lib/tlv.d.ts +99 -0
- package/lib/tlv.d.ts.map +1 -0
- package/lib/tlv.js +150 -0
- package/lib/tlv.js.map +1 -0
- package/lib-es/ApduDevice.d.ts +99 -0
- package/lib-es/ApduDevice.d.ts.map +1 -0
- package/lib-es/ApduDevice.js +522 -0
- package/lib-es/ApduDevice.js.map +1 -0
- package/lib-es/BigEndian.d.ts +7 -0
- package/lib-es/BigEndian.d.ts.map +1 -0
- package/lib-es/BigEndian.js +23 -0
- package/lib-es/BigEndian.js.map +1 -0
- package/lib-es/CommandBlock.d.ts +114 -0
- package/lib-es/CommandBlock.d.ts.map +1 -0
- package/lib-es/CommandBlock.js +143 -0
- package/lib-es/CommandBlock.js.map +1 -0
- package/lib-es/CommandStream.d.ts +38 -0
- package/lib-es/CommandStream.d.ts.map +1 -0
- package/lib-es/CommandStream.js +187 -0
- package/lib-es/CommandStream.js.map +1 -0
- package/lib-es/CommandStreamDecoder.d.ts +15 -0
- package/lib-es/CommandStreamDecoder.d.ts.map +1 -0
- package/lib-es/CommandStreamDecoder.js +97 -0
- package/lib-es/CommandStreamDecoder.js.map +1 -0
- package/lib-es/CommandStreamEncoder.d.ts +16 -0
- package/lib-es/CommandStreamEncoder.d.ts.map +1 -0
- package/lib-es/CommandStreamEncoder.js +127 -0
- package/lib-es/CommandStreamEncoder.js.map +1 -0
- package/lib-es/CommandStreamJsonifier.d.ts +6 -0
- package/lib-es/CommandStreamJsonifier.d.ts.map +1 -0
- package/lib-es/CommandStreamJsonifier.js +72 -0
- package/lib-es/CommandStreamJsonifier.js.map +1 -0
- package/lib-es/CommandStreamResolver.d.ts +53 -0
- package/lib-es/CommandStreamResolver.d.ts.map +1 -0
- package/lib-es/CommandStreamResolver.js +216 -0
- package/lib-es/CommandStreamResolver.js.map +1 -0
- package/lib-es/Crypto.d.ts +38 -0
- package/lib-es/Crypto.d.ts.map +1 -0
- package/lib-es/Crypto.js +43 -0
- package/lib-es/Crypto.js.map +1 -0
- package/lib-es/Device.d.ts +43 -0
- package/lib-es/Device.d.ts.map +1 -0
- package/lib-es/Device.js +187 -0
- package/lib-es/Device.js.map +1 -0
- package/lib-es/IndexedTree.d.ts +13 -0
- package/lib-es/IndexedTree.d.ts.map +1 -0
- package/lib-es/IndexedTree.js +71 -0
- package/lib-es/IndexedTree.js.map +1 -0
- package/lib-es/NobleCrypto.d.ts +39 -0
- package/lib-es/NobleCrypto.d.ts.map +1 -0
- package/lib-es/NobleCrypto.js +209 -0
- package/lib-es/NobleCrypto.js.map +1 -0
- package/lib-es/PublicKey.d.ts +5 -0
- package/lib-es/PublicKey.d.ts.map +1 -0
- package/lib-es/PublicKey.js +6 -0
- package/lib-es/PublicKey.js.map +1 -0
- package/lib-es/SeedId.d.ts +80 -0
- package/lib-es/SeedId.d.ts.map +1 -0
- package/lib-es/SeedId.js +235 -0
- package/lib-es/SeedId.js.map +1 -0
- package/lib-es/StreamTree.d.ts +50 -0
- package/lib-es/StreamTree.d.ts.map +1 -0
- package/lib-es/StreamTree.js +165 -0
- package/lib-es/StreamTree.js.map +1 -0
- package/lib-es/StreamTreeCipher.d.ts +46 -0
- package/lib-es/StreamTreeCipher.d.ts.map +1 -0
- package/lib-es/StreamTreeCipher.js +171 -0
- package/lib-es/StreamTreeCipher.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 +106 -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 +44 -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 +43 -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 +124 -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 +76 -0
- package/lib-es/__tests__/shared_object.js.map +1 -0
- package/lib-es/index.d.ts +35 -0
- package/lib-es/index.d.ts.map +1 -0
- package/lib-es/index.js +32 -0
- package/lib-es/index.js.map +1 -0
- package/lib-es/tlv.d.ts +99 -0
- package/lib-es/tlv.d.ts.map +1 -0
- package/lib-es/tlv.js +144 -0
- package/lib-es/tlv.js.map +1 -0
- package/package.json +63 -0
- package/src/ApduDevice.ts +688 -0
- package/src/BigEndian.ts +25 -0
- package/src/CommandBlock.ts +244 -0
- package/src/CommandStream.ts +260 -0
- package/src/CommandStreamDecoder.ts +142 -0
- package/src/CommandStreamEncoder.ts +144 -0
- package/src/CommandStreamJsonifier.ts +82 -0
- package/src/CommandStreamResolver.ts +284 -0
- package/src/Crypto.ts +78 -0
- package/src/Device.ts +246 -0
- package/src/IndexedTree.ts +80 -0
- package/src/NobleCrypto.ts +255 -0
- package/src/PublicKey.ts +6 -0
- package/src/SeedId.ts +338 -0
- package/src/StreamTree.ts +212 -0
- package/src/StreamTreeCipher.ts +207 -0
- package/src/__tests__/codec.ts +146 -0
- package/src/__tests__/crypto.ts +44 -0
- package/src/__tests__/indexed_tree.ts +51 -0
- package/src/__tests__/key_exchange.ts +167 -0
- package/src/__tests__/seedId.ts +120 -0
- package/src/__tests__/shared_object.ts +118 -0
- package/src/index.ts +43 -0
- package/src/tlv.ts +210 -0
- package/tsconfig.json +14 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { CommandStream, Device } from ".";
|
|
2
|
+
import { IndexedTree } from "./IndexedTree";
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
export interface ApplicationStreams {
|
|
7
|
+
appStream: CommandStream;
|
|
8
|
+
appRootStream: CommandStream;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
*
|
|
12
|
+
*/
|
|
13
|
+
export interface StreamTreeCreateOpts {
|
|
14
|
+
topic?: Uint8Array;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
export interface PublishKeyEvent {
|
|
20
|
+
stream: CommandStream;
|
|
21
|
+
encryptedXpriv: Uint8Array;
|
|
22
|
+
groupPublicKey: Uint8Array;
|
|
23
|
+
ephemeralPublicKey: Uint8Array;
|
|
24
|
+
nonce: Uint8Array;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
*
|
|
28
|
+
*/
|
|
29
|
+
export declare class StreamTree {
|
|
30
|
+
private tree;
|
|
31
|
+
constructor(tree: IndexedTree<CommandStream>);
|
|
32
|
+
getApplicationRootPath(applicationId: number, increment?: number): string;
|
|
33
|
+
getPublishKeyEvent(member: Uint8Array, path: number[]): Promise<PublishKeyEvent | null>;
|
|
34
|
+
getChild(path: string | number[]): CommandStream | null;
|
|
35
|
+
getRoot(): CommandStream;
|
|
36
|
+
/**
|
|
37
|
+
* Share a private key with a member
|
|
38
|
+
*/
|
|
39
|
+
share(path: string | number[], owner: Device, member: Uint8Array, name: string, permission: number): Promise<StreamTree>;
|
|
40
|
+
/**
|
|
41
|
+
* Close a stream
|
|
42
|
+
*/
|
|
43
|
+
close(path: string | number[], owner: Device): Promise<StreamTree>;
|
|
44
|
+
update(stream: CommandStream): StreamTree;
|
|
45
|
+
serialize(): Record<string, string>;
|
|
46
|
+
static deserialize(data: Record<string, string>): StreamTree;
|
|
47
|
+
static createNewTree(owner: Device, opts?: StreamTreeCreateOpts): Promise<StreamTree>;
|
|
48
|
+
static from(...streams: CommandStream[]): StreamTree;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=StreamTree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StreamTree.d.ts","sourceRoot":"","sources":["../src/StreamTree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA8C,MAAM,EAAE,MAAM,GAAG,CAAC;AAEtF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,aAAa,CAAC;IACzB,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,aAAa,CAAC;IACtB,cAAc,EAAE,UAAU,CAAC;IAC3B,cAAc,EAAE,UAAU,CAAC;IAC3B,kBAAkB,EAAE,UAAU,CAAC;IAC/B,KAAK,EAAE,UAAU,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAA6B;gBAE7B,IAAI,EAAE,WAAW,CAAC,aAAa,CAAC;IAOrC,sBAAsB,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU,GAAG,MAAM;IAatE,kBAAkB,CAC7B,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IA0B3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,aAAa,GAAG,IAAI;IAUvD,OAAO,IAAI,aAAa;IAI/B;;OAEG;IACU,KAAK,CAChB,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,CAAC;IAsBtB;;OAEG;IACU,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAQxE,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU;IAUzC,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAuB1C,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,UAAU;WAO/C,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,oBAAyB,GAAG,OAAO,CAAC,UAAU,CAAC;IAU/F,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,EAAE,aAAa,EAAE,GAAG,UAAU;CAoBrD"}
|
|
@@ -0,0 +1,169 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.StreamTree = void 0;
|
|
13
|
+
const _1 = require(".");
|
|
14
|
+
const Crypto_1 = require("./Crypto");
|
|
15
|
+
const IndexedTree_1 = require("./IndexedTree");
|
|
16
|
+
/**
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
class StreamTree {
|
|
20
|
+
constructor(tree) {
|
|
21
|
+
if (tree.getValue() === null) {
|
|
22
|
+
throw new Error("Root of the tree cannot be null");
|
|
23
|
+
}
|
|
24
|
+
this.tree = tree;
|
|
25
|
+
}
|
|
26
|
+
getApplicationRootPath(applicationId, increment = 0) {
|
|
27
|
+
var _a;
|
|
28
|
+
// tree index is always 0 in the current implementation
|
|
29
|
+
const treeIndex = 0;
|
|
30
|
+
// for application index, we have key rotation that is possible so we need to find the last index
|
|
31
|
+
const child = (_a = this.tree
|
|
32
|
+
.getChild(Crypto_1.DerivationPath.hardenedIndex(treeIndex))) === null || _a === void 0 ? void 0 : _a.getChild(Crypto_1.DerivationPath.hardenedIndex(applicationId));
|
|
33
|
+
const applicationIndex = child
|
|
34
|
+
? Crypto_1.DerivationPath.reverseHardenedIndex(child.getHighestIndex())
|
|
35
|
+
: 0;
|
|
36
|
+
return `m/${treeIndex}'/${applicationId}'/${applicationIndex + increment}'`;
|
|
37
|
+
}
|
|
38
|
+
getPublishKeyEvent(member, path) {
|
|
39
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
40
|
+
// Iterate over the tree from leaf to root
|
|
41
|
+
const leaf = this.tree.findChild(path);
|
|
42
|
+
if (!leaf || leaf.getValue() === null) {
|
|
43
|
+
if (path.length === 0) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
return this.getPublishKeyEvent(member, path.slice(0, path.length - 1));
|
|
47
|
+
}
|
|
48
|
+
const resolved = yield leaf.getValue().resolve();
|
|
49
|
+
const key = resolved.getEncryptedKey(member);
|
|
50
|
+
if (!key) {
|
|
51
|
+
if (path.length === 0) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
return this.getPublishKeyEvent(member, path.slice(0, path.length - 1));
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
stream: leaf.getValue(),
|
|
58
|
+
encryptedXpriv: key.encryptedXpriv,
|
|
59
|
+
ephemeralPublicKey: key.ephemeralPublicKey,
|
|
60
|
+
nonce: key.initialiationVector,
|
|
61
|
+
groupPublicKey: resolved.getGroupPublicKey(),
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
getChild(path) {
|
|
66
|
+
const indexes = typeof path === "string" ? Crypto_1.DerivationPath.toIndexArray(path) : path;
|
|
67
|
+
const subtree = this.tree.findChild(indexes);
|
|
68
|
+
if (subtree === undefined) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
return subtree.getValue();
|
|
72
|
+
}
|
|
73
|
+
getRoot() {
|
|
74
|
+
return this.tree.getValue();
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Share a private key with a member
|
|
78
|
+
*/
|
|
79
|
+
share(path, owner, member, name, permission) {
|
|
80
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
81
|
+
const indexes = typeof path === "string" ? Crypto_1.DerivationPath.toIndexArray(path) : path;
|
|
82
|
+
let stream = this.getChild(indexes) || new _1.CommandStream();
|
|
83
|
+
if (stream.blocks.length === 0 && indexes.length > 0) {
|
|
84
|
+
const root = yield this.getRoot().getRootHash();
|
|
85
|
+
stream = yield stream
|
|
86
|
+
.edit()
|
|
87
|
+
.derive(indexes)
|
|
88
|
+
.addMember(name, member, permission, true)
|
|
89
|
+
.issue(owner, this, root);
|
|
90
|
+
return this.update(stream);
|
|
91
|
+
}
|
|
92
|
+
else if (stream.blocks.length === 0) {
|
|
93
|
+
throw new Error("StreamTree.share cannot add a member if the root was not previously created");
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
const newStream = yield stream.edit().addMember(name, member, permission).issue(owner, this);
|
|
97
|
+
return this.update(newStream);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Close a stream
|
|
103
|
+
*/
|
|
104
|
+
close(path, owner) {
|
|
105
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
106
|
+
const indexes = typeof path === "string" ? Crypto_1.DerivationPath.toIndexArray(path) : path;
|
|
107
|
+
let stream = this.getChild(indexes) || new _1.CommandStream();
|
|
108
|
+
stream = yield stream.edit().close().issue(owner, this);
|
|
109
|
+
return this.update(stream);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
update(stream) {
|
|
113
|
+
const path = stream.getStreamPath();
|
|
114
|
+
if (path === null)
|
|
115
|
+
throw new Error("Stream path cannot be null");
|
|
116
|
+
const indexes = Crypto_1.DerivationPath.toIndexArray(path);
|
|
117
|
+
const newTree = this.tree.updateChild(indexes, stream);
|
|
118
|
+
return new StreamTree(newTree);
|
|
119
|
+
}
|
|
120
|
+
serialize() {
|
|
121
|
+
const streamEntries = serializeTree(this.tree, []);
|
|
122
|
+
const entries = streamEntries.flatMap(([path, stream]) => stream ? [[path, Crypto_1.crypto.to_hex(_1.CommandStreamEncoder.encode(stream.blocks))]] : []);
|
|
123
|
+
return Object.fromEntries(entries);
|
|
124
|
+
function serializeTree(tree, path) {
|
|
125
|
+
const stream = tree.getValue();
|
|
126
|
+
const childrens = tree.getChildren();
|
|
127
|
+
return [
|
|
128
|
+
[Crypto_1.DerivationPath.toString(path), stream],
|
|
129
|
+
...Array.from(childrens.entries()).flatMap(([index, child]) => serializeTree(child, [...path, index])),
|
|
130
|
+
];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
static deserialize(data) {
|
|
134
|
+
const streams = Object.values(data).map(data => new _1.CommandStream(_1.CommandStreamDecoder.decode(Crypto_1.crypto.from_hex(data))));
|
|
135
|
+
return StreamTree.from(...streams);
|
|
136
|
+
}
|
|
137
|
+
static createNewTree(owner_1) {
|
|
138
|
+
return __awaiter(this, arguments, void 0, function* (owner, opts = {}) {
|
|
139
|
+
let stream = new _1.CommandStream();
|
|
140
|
+
const streamToIssue = stream.edit().seed(opts.topic);
|
|
141
|
+
stream = yield streamToIssue.issue(owner);
|
|
142
|
+
const tree = new IndexedTree_1.IndexedTree(stream);
|
|
143
|
+
return new StreamTree(tree);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
static from(...streams) {
|
|
147
|
+
// Map all stream with their path
|
|
148
|
+
const streamMap = new Map();
|
|
149
|
+
streams.forEach(stream => {
|
|
150
|
+
const path = stream.getStreamPath();
|
|
151
|
+
if (path === null)
|
|
152
|
+
throw new Error("Stream path cannot be null");
|
|
153
|
+
streamMap.set(path, stream);
|
|
154
|
+
});
|
|
155
|
+
// Create tree if the list contains the root
|
|
156
|
+
const root = streamMap.get("");
|
|
157
|
+
if (root === undefined)
|
|
158
|
+
throw new Error("StreamTree.from requires the root of the tree");
|
|
159
|
+
let tree = new IndexedTree_1.IndexedTree(root);
|
|
160
|
+
streamMap.delete("");
|
|
161
|
+
streamMap.forEach((stream, path) => {
|
|
162
|
+
const p = Crypto_1.DerivationPath.toIndexArray(path);
|
|
163
|
+
tree = tree.addChild(p, new IndexedTree_1.IndexedTree(stream));
|
|
164
|
+
});
|
|
165
|
+
return new StreamTree(tree);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
exports.StreamTree = StreamTree;
|
|
169
|
+
//# sourceMappingURL=StreamTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StreamTree.js","sourceRoot":"","sources":["../src/StreamTree.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wBAAsF;AACtF,qCAAkD;AAClD,+CAA4C;AA4B5C;;GAEG;AACH,MAAa,UAAU;IAGrB,YAAY,IAAgC;QAC1C,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAEM,sBAAsB,CAAC,aAAqB,EAAE,YAAoB,CAAC;;QACxE,uDAAuD;QACvD,MAAM,SAAS,GAAG,CAAC,CAAC;QACpB,iGAAiG;QACjG,MAAM,KAAK,GAAG,MAAA,IAAI,CAAC,IAAI;aACpB,QAAQ,CAAC,uBAAc,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,0CAChD,QAAQ,CAAC,uBAAc,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC;QAC1D,MAAM,gBAAgB,GAAG,KAAK;YAC5B,CAAC,CAAC,uBAAc,CAAC,oBAAoB,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;YAC9D,CAAC,CAAC,CAAC,CAAC;QACN,OAAO,KAAK,SAAS,KAAK,aAAa,KAAK,gBAAgB,GAAG,SAAS,GAAG,CAAC;IAC9E,CAAC;IAEY,kBAAkB,CAC7B,MAAkB,EAClB,IAAc;;YAEd,0CAA0C;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,IAAI,IAAI,IAAK,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC;gBACvC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACtB,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YACzE,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAG,CAAC,OAAO,EAAE,CAAC;YAClD,MAAM,GAAG,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAC7C,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACtB,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YACzE,CAAC;YACD,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAG;gBACxB,cAAc,EAAE,GAAG,CAAC,cAAc;gBAClC,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;gBAC1C,KAAK,EAAE,GAAG,CAAC,mBAAmB;gBAC9B,cAAc,EAAE,QAAQ,CAAC,iBAAiB,EAAE;aAC7C,CAAC;QACJ,CAAC;KAAA;IAEM,QAAQ,CAAC,IAAuB;QACrC,MAAM,OAAO,GACX,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,uBAAc,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAAiB,CAAC;QACpF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,OAAO,CAAC,QAAQ,EAAG,CAAC;IAC7B,CAAC;IAEM,OAAO;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAG,CAAC;IAC/B,CAAC;IAED;;OAEG;IACU,KAAK,CAChB,IAAuB,EACvB,KAAa,EACb,MAAkB,EAClB,IAAY,EACZ,UAAkB;;YAElB,MAAM,OAAO,GACX,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,uBAAc,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAAiB,CAAC;YACpF,IAAI,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,gBAAa,EAAE,CAAC;YAC3D,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,CAAC;gBAChD,MAAM,GAAG,MAAM,MAAM;qBAClB,IAAI,EAAE;qBACN,MAAM,CAAC,OAAO,CAAC;qBACf,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC;qBACzC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;iBAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC7F,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;KAAA;IAED;;OAEG;IACU,KAAK,CAAC,IAAuB,EAAE,KAAa;;YACvD,MAAM,OAAO,GACX,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,uBAAc,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAAiB,CAAC;YACpF,IAAI,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,gBAAa,EAAE,CAAC;YAC3D,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;KAAA;IAEM,MAAM,CAAC,MAAqB;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QAEpC,IAAI,IAAI,KAAK,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,uBAAc,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEvD,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAEM,SAAS;QACd,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CACvD,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,eAAM,CAAC,MAAM,CAAC,uBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAClF,CAAC;QACF,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAEnC,SAAS,aAAa,CACpB,IAAgC,EAChC,IAAc;YAEd,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAErC,OAAO;gBACL,CAAC,uBAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;gBACvC,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAC5D,aAAa,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,CACvC;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAA4B;QAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CACrC,IAAI,CAAC,EAAE,CAAC,IAAI,gBAAa,CAAC,uBAAoB,CAAC,MAAM,CAAC,eAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAC9E,CAAC;QACF,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,CAAO,aAAa;6DAAC,KAAa,EAAE,OAA6B,EAAE;YACvE,IAAI,MAAM,GAAG,IAAI,gBAAa,EAAE,CAAC;YACjC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAErD,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAE1C,MAAM,IAAI,GAAG,IAAI,yBAAW,CAAC,MAAM,CAAC,CAAC;YACrC,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;KAAA;IAED,MAAM,CAAC,IAAI,CAAC,GAAG,OAAwB;QACrC,iCAAiC;QACjC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAyB,CAAC;QACnD,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACvB,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;YACpC,IAAI,IAAI,KAAK,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YACjE,SAAS,CAAC,GAAG,CAAC,IAAK,EAAE,MAAM,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,4CAA4C;QAC5C,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACzF,IAAI,IAAI,GAAG,IAAI,yBAAW,CAAC,IAAI,CAAC,CAAC;QACjC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrB,SAAS,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;YACjC,MAAM,CAAC,GAAG,uBAAc,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,yBAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;CACF;AAlLD,gCAkLC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Device } from ".";
|
|
2
|
+
import { StreamTree } from "./StreamTree";
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
export declare enum StreamTreeCipherMode {
|
|
7
|
+
AES_256_CBC = 0,
|
|
8
|
+
AES_256_GCM = 1
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
*
|
|
12
|
+
*/
|
|
13
|
+
export declare class StreamTreeCipher {
|
|
14
|
+
private _mode;
|
|
15
|
+
private _device;
|
|
16
|
+
constructor(mode: StreamTreeCipherMode, device: Device);
|
|
17
|
+
get mode(): StreamTreeCipherMode;
|
|
18
|
+
/**
|
|
19
|
+
* Encrypts a message for a given path in the tree
|
|
20
|
+
* @param tree
|
|
21
|
+
* @param path
|
|
22
|
+
* @param message
|
|
23
|
+
* @param nonce optional nonce to use for the encryption (if null a random nonce will be generated)
|
|
24
|
+
* @returns the encrypted message with the nonce prepended (1 byte for the nonce length + nonce + 33 bytes ephemeral key + encrypted message + 4 bytes checksum)
|
|
25
|
+
* @throws Error if the cipher mode is not implemented
|
|
26
|
+
* @throws Error if the path is not found in the tree and can't be derived from the device
|
|
27
|
+
*/
|
|
28
|
+
encrypt(tree: StreamTree, path: number[], message: Uint8Array, nonce?: Uint8Array | null): Promise<Uint8Array>;
|
|
29
|
+
private getGroupKeypair;
|
|
30
|
+
private encodeData;
|
|
31
|
+
private decodeData;
|
|
32
|
+
/**
|
|
33
|
+
* Decrypts a message for a given path in the tree
|
|
34
|
+
* @param tree
|
|
35
|
+
* @param path
|
|
36
|
+
* @param encrytedPayload
|
|
37
|
+
* @returns the decrypted message
|
|
38
|
+
* @throws Error if the cipher mode is not implemented
|
|
39
|
+
* @throws Error if the path is not found in the tree and can't be derived from the device
|
|
40
|
+
* @throws Error if the checksum is invalid
|
|
41
|
+
*/
|
|
42
|
+
decrypt(tree: StreamTree, path: number[], encrytedPayload: Uint8Array): Promise<Uint8Array>;
|
|
43
|
+
private computeChecksum;
|
|
44
|
+
static create(device: Device, mode?: StreamTreeCipherMode): StreamTreeCipher;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=StreamTreeCipher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StreamTreeCipher.d.ts","sourceRoot":"","sources":["../src/StreamTreeCipher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,MAAM,GAAG,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;GAEG;AACH,oBAAY,oBAAoB;IAC9B,WAAW,IAAO;IAClB,WAAW,IAAO;CACnB;AAYD;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,OAAO,CAAS;gBAEZ,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM;IAKtD,IAAI,IAAI,IAAI,oBAAoB,CAE/B;IAED;;;;;;;;;OASG;IACG,OAAO,CACX,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,UAAU,EACnB,KAAK,GAAE,UAAU,GAAG,IAAW,GAC9B,OAAO,CAAC,UAAU,CAAC;YAgCR,eAAe;IAmB7B,OAAO,CAAC,UAAU;IA4BlB,OAAO,CAAC,UAAU;IAkBlB;;;;;;;;;OASG;IACG,OAAO,CACX,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,MAAM,EAAE,EACd,eAAe,EAAE,UAAU,GAC1B,OAAO,CAAC,UAAU,CAAC;IAgCtB,OAAO,CAAC,eAAe;IAKvB,MAAM,CAAC,MAAM,CACX,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,oBAAuD,GAC5D,gBAAgB;CAGpB"}
|
|
@@ -0,0 +1,175 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.StreamTreeCipher = exports.StreamTreeCipherMode = void 0;
|
|
13
|
+
const _1 = require(".");
|
|
14
|
+
/**
|
|
15
|
+
*
|
|
16
|
+
*/
|
|
17
|
+
var StreamTreeCipherMode;
|
|
18
|
+
(function (StreamTreeCipherMode) {
|
|
19
|
+
StreamTreeCipherMode[StreamTreeCipherMode["AES_256_CBC"] = 0] = "AES_256_CBC";
|
|
20
|
+
StreamTreeCipherMode[StreamTreeCipherMode["AES_256_GCM"] = 1] = "AES_256_GCM";
|
|
21
|
+
})(StreamTreeCipherMode || (exports.StreamTreeCipherMode = StreamTreeCipherMode = {}));
|
|
22
|
+
const TAG_LENGTH = 16;
|
|
23
|
+
/**
|
|
24
|
+
*
|
|
25
|
+
*/
|
|
26
|
+
class StreamTreeCipher {
|
|
27
|
+
constructor(mode, device) {
|
|
28
|
+
this._mode = mode;
|
|
29
|
+
this._device = device;
|
|
30
|
+
}
|
|
31
|
+
get mode() {
|
|
32
|
+
return this._mode;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Encrypts a message for a given path in the tree
|
|
36
|
+
* @param tree
|
|
37
|
+
* @param path
|
|
38
|
+
* @param message
|
|
39
|
+
* @param nonce optional nonce to use for the encryption (if null a random nonce will be generated)
|
|
40
|
+
* @returns the encrypted message with the nonce prepended (1 byte for the nonce length + nonce + 33 bytes ephemeral key + encrypted message + 4 bytes checksum)
|
|
41
|
+
* @throws Error if the cipher mode is not implemented
|
|
42
|
+
* @throws Error if the path is not found in the tree and can't be derived from the device
|
|
43
|
+
*/
|
|
44
|
+
encrypt(tree_1, path_1, message_1) {
|
|
45
|
+
return __awaiter(this, arguments, void 0, function* (tree, path, message, nonce = null) {
|
|
46
|
+
if (nonce === null) {
|
|
47
|
+
nonce = _1.crypto.randomBytes(16);
|
|
48
|
+
}
|
|
49
|
+
// Generate ephemeral key pair
|
|
50
|
+
const ephemeralKeyPair = _1.crypto.randomKeypair();
|
|
51
|
+
// Get the group public key
|
|
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");
|
|
67
|
+
}
|
|
68
|
+
// Serialize encrypted data
|
|
69
|
+
return this.encodeData(ephemeralKeyPair.publicKey, nonce, encrypted, message);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
getGroupKeypair(tree, path) {
|
|
73
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
74
|
+
if (!this._device.isPublicKeyAvailable()) {
|
|
75
|
+
throw new Error("Stream tree cipher is only available for software devices");
|
|
76
|
+
}
|
|
77
|
+
const member = yield this._device.getPublicKey();
|
|
78
|
+
const event = yield tree.getPublishKeyEvent(member.publicKey, path);
|
|
79
|
+
if (!event) {
|
|
80
|
+
throw new Error("Cannot find key in the tree for the current device");
|
|
81
|
+
}
|
|
82
|
+
// Compute the relative path from the event to the path parameter
|
|
83
|
+
const privateKey = (yield this._device.readKey(tree, path)).slice(0, 32);
|
|
84
|
+
const publicKey = _1.crypto.keypairFromSecretKey(privateKey).publicKey;
|
|
85
|
+
return { privateKey, publicKey };
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
encodeData(ephemeralPublicKey, nonce, data, message) {
|
|
89
|
+
const result = new Uint8Array(1 + 33 + nonce.length + TAG_LENGTH + data.length);
|
|
90
|
+
let offset = 0;
|
|
91
|
+
// Version
|
|
92
|
+
result[offset] = this._mode;
|
|
93
|
+
offset += 1;
|
|
94
|
+
// Ephemeral public key
|
|
95
|
+
result.set(ephemeralPublicKey, offset);
|
|
96
|
+
offset += ephemeralPublicKey.length;
|
|
97
|
+
// Nonce/IV
|
|
98
|
+
result.set(nonce, offset);
|
|
99
|
+
offset += nonce.length;
|
|
100
|
+
// Checksum
|
|
101
|
+
if (this._mode == StreamTreeCipherMode.AES_256_CBC) {
|
|
102
|
+
const checksum = this.computeChecksum(message);
|
|
103
|
+
result.set(checksum, offset);
|
|
104
|
+
offset += checksum.length;
|
|
105
|
+
}
|
|
106
|
+
// Encrypted data
|
|
107
|
+
result.set(data, offset);
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
decodeData(payload) {
|
|
111
|
+
const version = payload[0];
|
|
112
|
+
let offset = 1;
|
|
113
|
+
const ephemeralPublicKey = payload.slice(offset, offset + 33);
|
|
114
|
+
offset += 33;
|
|
115
|
+
const nonce = payload.slice(offset, offset + 16);
|
|
116
|
+
offset += 16;
|
|
117
|
+
const checksum = payload.slice(payload.length - 16, payload.length);
|
|
118
|
+
const encrypted = payload.slice(offset, payload.length - 16);
|
|
119
|
+
return {
|
|
120
|
+
version,
|
|
121
|
+
ephemeralPublicKey,
|
|
122
|
+
nonce,
|
|
123
|
+
encrypted,
|
|
124
|
+
checksum,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Decrypts a message for a given path in the tree
|
|
129
|
+
* @param tree
|
|
130
|
+
* @param path
|
|
131
|
+
* @param encrytedPayload
|
|
132
|
+
* @returns the decrypted message
|
|
133
|
+
* @throws Error if the cipher mode is not implemented
|
|
134
|
+
* @throws Error if the path is not found in the tree and can't be derived from the device
|
|
135
|
+
* @throws Error if the checksum is invalid
|
|
136
|
+
*/
|
|
137
|
+
decrypt(tree, path, encrytedPayload) {
|
|
138
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
139
|
+
const decodedPayload = this.decodeData(encrytedPayload);
|
|
140
|
+
const ephemeralKey = decodedPayload.ephemeralPublicKey;
|
|
141
|
+
const nonce = decodedPayload.nonce;
|
|
142
|
+
const encryptedMessage = decodedPayload.encrypted;
|
|
143
|
+
const checksum = decodedPayload.checksum;
|
|
144
|
+
const sharedKeyPair = yield this.getGroupKeypair(tree, path);
|
|
145
|
+
const secret = _1.crypto.ecdh(sharedKeyPair, ephemeralKey);
|
|
146
|
+
let decrypted = new Uint8Array(0);
|
|
147
|
+
switch (this._mode) {
|
|
148
|
+
case StreamTreeCipherMode.AES_256_CBC: {
|
|
149
|
+
decrypted = _1.crypto.decrypt(secret, nonce, encryptedMessage);
|
|
150
|
+
const computedChecksum = this.computeChecksum(decrypted);
|
|
151
|
+
if (_1.crypto.to_hex(computedChecksum) !== _1.crypto.to_hex(checksum)) {
|
|
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;
|
|
159
|
+
}
|
|
160
|
+
default:
|
|
161
|
+
throw new Error("Unknown cipher mode");
|
|
162
|
+
}
|
|
163
|
+
return decrypted;
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
computeChecksum(message) {
|
|
167
|
+
const hash = _1.crypto.hash(message);
|
|
168
|
+
return hash.slice(0, 16);
|
|
169
|
+
}
|
|
170
|
+
static create(device, mode = StreamTreeCipherMode.AES_256_GCM) {
|
|
171
|
+
return new StreamTreeCipher(mode, device);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
exports.StreamTreeCipher = StreamTreeCipher;
|
|
175
|
+
//# sourceMappingURL=StreamTreeCipher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StreamTreeCipher.js","sourceRoot":"","sources":["../src/StreamTreeCipher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/__tests__/codec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,108 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const CommandBlock_1 = require("../CommandBlock");
|
|
13
|
+
const tlv_1 = require("../tlv");
|
|
14
|
+
const CommandStreamDecoder_1 = require("../CommandStreamDecoder");
|
|
15
|
+
const CommandStreamEncoder_1 = require("../CommandStreamEncoder");
|
|
16
|
+
const Crypto_1 = require("../Crypto");
|
|
17
|
+
const __1 = require("..");
|
|
18
|
+
describe("Encode/Decode command stream tester", () => {
|
|
19
|
+
it("should encode and decode a byte", () => {
|
|
20
|
+
const byte = 42;
|
|
21
|
+
let buffer = new Uint8Array();
|
|
22
|
+
buffer = tlv_1.TLV.pushByte(buffer, 42);
|
|
23
|
+
const decoded = tlv_1.TLV.readVarInt(tlv_1.TLV.readTLV(buffer, 0));
|
|
24
|
+
expect(decoded.value).toBe(byte);
|
|
25
|
+
});
|
|
26
|
+
it("should encode and decode a Int32", () => {
|
|
27
|
+
const varint = 0xdeadbeef;
|
|
28
|
+
let buffer = new Uint8Array();
|
|
29
|
+
buffer = tlv_1.TLV.pushInt32(buffer, varint);
|
|
30
|
+
const decoded = tlv_1.TLV.readVarInt(tlv_1.TLV.readTLV(buffer, 0));
|
|
31
|
+
expect(decoded.value).toBe(varint);
|
|
32
|
+
});
|
|
33
|
+
it("should encode and decode a string", () => {
|
|
34
|
+
const str = "Hello World";
|
|
35
|
+
let buffer = new Uint8Array();
|
|
36
|
+
buffer = tlv_1.TLV.pushString(buffer, str);
|
|
37
|
+
const decoded = tlv_1.TLV.readString(tlv_1.TLV.readTLV(buffer, 0));
|
|
38
|
+
expect(decoded.value).toBe(str);
|
|
39
|
+
});
|
|
40
|
+
it("should encode and decode a hash", () => {
|
|
41
|
+
const hash = Crypto_1.crypto.hash(new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]));
|
|
42
|
+
let buffer = new Uint8Array();
|
|
43
|
+
buffer = tlv_1.TLV.pushHash(buffer, hash);
|
|
44
|
+
const decoded = tlv_1.TLV.readHash(tlv_1.TLV.readTLV(buffer, 0));
|
|
45
|
+
expect(Crypto_1.crypto.to_hex(decoded.value)).toEqual(Crypto_1.crypto.to_hex(hash));
|
|
46
|
+
});
|
|
47
|
+
it("should encode and decode bytes", () => {
|
|
48
|
+
const bytes = new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
|
|
49
|
+
let buffer = new Uint8Array();
|
|
50
|
+
buffer = tlv_1.TLV.pushBytes(buffer, bytes);
|
|
51
|
+
const decoded = tlv_1.TLV.readBytes(tlv_1.TLV.readTLV(buffer, 0));
|
|
52
|
+
expect(decoded.value).toEqual(bytes);
|
|
53
|
+
});
|
|
54
|
+
it("should encode and decode a signature", () => {
|
|
55
|
+
const alice = Crypto_1.crypto.randomKeypair();
|
|
56
|
+
const block = (0, CommandBlock_1.signCommandBlock)((0, CommandBlock_1.createCommandBlock)(alice.publicKey, []), alice.publicKey, alice.privateKey);
|
|
57
|
+
let buffer = new Uint8Array();
|
|
58
|
+
buffer = tlv_1.TLV.pushSignature(buffer, block.signature);
|
|
59
|
+
const decoded = tlv_1.TLV.readSignature(tlv_1.TLV.readTLV(buffer, 0));
|
|
60
|
+
expect(decoded.value).toEqual(block.signature);
|
|
61
|
+
});
|
|
62
|
+
it("should encode and decode a public key", () => {
|
|
63
|
+
const alice = Crypto_1.crypto.randomKeypair();
|
|
64
|
+
let buffer = new Uint8Array();
|
|
65
|
+
buffer = tlv_1.TLV.pushPublicKey(buffer, alice.publicKey);
|
|
66
|
+
const decoded = tlv_1.TLV.readPublicKey(tlv_1.TLV.readTLV(buffer, 0));
|
|
67
|
+
expect(decoded.value).toEqual(alice.publicKey);
|
|
68
|
+
});
|
|
69
|
+
it("should encode and decode a stream. Encoding/Decoding should not alter the stream", () => {
|
|
70
|
+
const alice = Crypto_1.crypto.randomKeypair();
|
|
71
|
+
const groupPk = Crypto_1.crypto.randomKeypair();
|
|
72
|
+
const groupChainCode = Crypto_1.crypto.randomBytes(32);
|
|
73
|
+
const xpriv = new Uint8Array(64);
|
|
74
|
+
const initializationVector = Crypto_1.crypto.randomBytes(16);
|
|
75
|
+
xpriv.set(groupPk.privateKey);
|
|
76
|
+
xpriv.set(groupChainCode, 32);
|
|
77
|
+
const ephemeralPk = Crypto_1.crypto.randomKeypair();
|
|
78
|
+
const block1 = (0, CommandBlock_1.signCommandBlock)((0, CommandBlock_1.createCommandBlock)(alice.publicKey, [
|
|
79
|
+
new CommandBlock_1.Seed(Crypto_1.crypto.randomBytes(16), 0, groupPk.publicKey, initializationVector, xpriv, ephemeralPk.publicKey),
|
|
80
|
+
]), alice.publicKey, alice.privateKey);
|
|
81
|
+
const block2 = (0, CommandBlock_1.signCommandBlock)((0, CommandBlock_1.createCommandBlock)(alice.publicKey, [
|
|
82
|
+
new CommandBlock_1.AddMember("Alice", Crypto_1.crypto.randomBytes(32), CommandBlock_1.Permissions.OWNER),
|
|
83
|
+
new CommandBlock_1.PublishKey(Crypto_1.crypto.randomBytes(16), Crypto_1.crypto.randomBytes(32), Crypto_1.crypto.randomBytes(32), Crypto_1.crypto.randomBytes(32)),
|
|
84
|
+
]), alice.publicKey, alice.privateKey);
|
|
85
|
+
const block3 = (0, CommandBlock_1.signCommandBlock)((0, CommandBlock_1.createCommandBlock)(alice.publicKey, []), alice.publicKey, alice.privateKey);
|
|
86
|
+
const stream = [block1, block2, block3];
|
|
87
|
+
const encoded = CommandStreamEncoder_1.CommandStreamEncoder.encode(stream);
|
|
88
|
+
const digestEncoded = Crypto_1.crypto.hash(encoded);
|
|
89
|
+
const decoded = CommandStreamDecoder_1.CommandStreamDecoder.decode(encoded);
|
|
90
|
+
const reencoded = CommandStreamEncoder_1.CommandStreamEncoder.encode(decoded);
|
|
91
|
+
const digestReencoded = Crypto_1.crypto.hash(reencoded);
|
|
92
|
+
expect(digestEncoded).toEqual(digestReencoded);
|
|
93
|
+
});
|
|
94
|
+
it("decodes a specific command stream", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
95
|
+
const tlv = "0101010220824b3168c79e8b61b599751c107117b5c9b647f2b6859de8a245952559707692062102a13e82cd0d2f77d1ab1434d8bd799571e54cd32e1121c5cf82217f8b0b713b6b01010315a8050c800000008000001080000000062103ccf74aa7775b3d39d6cbb0236acee7a7f980b9f6a556a4d814d44b0bd56cb77b05108c51eda6be26623ca919ed17333afcdb054019c0b60ede1692479cc04ce69eae6a0bd51941bab6f044f3dec10c11cf11e6253504d1df6b0aab7dc1996e4eaa7c6f92c29153c59534578901cd7ff4efcea1ae06210268abdb3d49ba4a274ce8660cde0d1eeaf1fea00e281218be775f6b3aefc39756113a040f7765622d746f6f6c732d6563626638062103a270456b0f95714cc61a6473e6b6d8db354a3c377281096bdd2439a5475ecbf80104ffffffff129a05100e5205b4a616b2a4d79b07b4a4932f560540669e741f38fee07956fb0dc0ea9978d55bd5d8424b0d0f66a2c5a45788f92d0ddc283138c7ba62c521de1d604ee7f847c5aed40a11536bbe742af0be8cfd4132062103a270456b0f95714cc61a6473e6b6d8db354a3c377281096bdd2439a5475ecbf80621027003755248202ea8a67d1fcdcd82d7f7022248f3af892fa5307d3ea250dc81050346304402204422a779fd08723d8cba19c0cc11ef7a24f6f1f459cb01598ff1a26f27ea8976022053a554d4f509223f2d08faa5de796fed13a9762f35da08e94884edd1f7c0d015";
|
|
96
|
+
const decoded = CommandStreamDecoder_1.CommandStreamDecoder.decode(Crypto_1.crypto.from_hex(tlv));
|
|
97
|
+
const stream = new __1.CommandStream(decoded);
|
|
98
|
+
const resolved = yield stream.resolve();
|
|
99
|
+
expect(resolved.getMembersData()).toEqual([
|
|
100
|
+
{
|
|
101
|
+
id: "03a270456b0f95714cc61a6473e6b6d8db354a3c377281096bdd2439a5475ecbf8",
|
|
102
|
+
name: "web-tools-ecbf8",
|
|
103
|
+
permissions: 4294967295,
|
|
104
|
+
},
|
|
105
|
+
]);
|
|
106
|
+
}));
|
|
107
|
+
});
|
|
108
|
+
//# 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":""}
|