@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
package/lib/Crypto.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.crypto = exports.DerivationPath = void 0;
|
|
4
|
+
const NobleCrypto_1 = require("./NobleCrypto");
|
|
5
|
+
class DerivationPath {
|
|
6
|
+
constructor() { }
|
|
7
|
+
static hardenedIndex(index) {
|
|
8
|
+
return index + 0x80000000;
|
|
9
|
+
}
|
|
10
|
+
static reverseHardenedIndex(index) {
|
|
11
|
+
return index - 0x80000000;
|
|
12
|
+
}
|
|
13
|
+
static toIndexArray(path) {
|
|
14
|
+
if (Array.isArray(path)) {
|
|
15
|
+
return path;
|
|
16
|
+
}
|
|
17
|
+
if (path.startsWith("m/")) {
|
|
18
|
+
path = path.substring(2);
|
|
19
|
+
}
|
|
20
|
+
return path.split("/").map(s => {
|
|
21
|
+
if (s.endsWith("'") || s.endsWith("h")) {
|
|
22
|
+
return parseInt(s.substring(0, s.length - 1)) + 0x80000000;
|
|
23
|
+
}
|
|
24
|
+
return parseInt(s);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
static toString(path) {
|
|
28
|
+
if (typeof path === "string") {
|
|
29
|
+
return path;
|
|
30
|
+
}
|
|
31
|
+
return ("m/" +
|
|
32
|
+
path
|
|
33
|
+
.map(s => {
|
|
34
|
+
if (s >= 0x80000000) {
|
|
35
|
+
return s - 0x80000000 + "'";
|
|
36
|
+
}
|
|
37
|
+
return s;
|
|
38
|
+
})
|
|
39
|
+
.join("/"));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.DerivationPath = DerivationPath;
|
|
43
|
+
/**
|
|
44
|
+
*
|
|
45
|
+
*/
|
|
46
|
+
exports.crypto = new NobleCrypto_1.NobleCryptoSecp256k1();
|
|
47
|
+
//# sourceMappingURL=Crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Crypto.js","sourceRoot":"","sources":["../src/Crypto.ts"],"names":[],"mappings":";;;AAAA,+CAAqD;AA8BrD,MAAa,cAAc;IACzB,gBAAuB,CAAC;IAExB,MAAM,CAAC,aAAa,CAAC,KAAa;QAChC,OAAO,KAAK,GAAG,UAAU,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,oBAAoB,CAAC,KAAa;QACvC,OAAO,KAAK,GAAG,UAAU,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,IAAuB;QACzC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAC7B,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvC,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;YAC7D,CAAC;YACD,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAAuB;QACrC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,CACL,IAAI;YACJ,IAAI;iBACD,GAAG,CAAC,CAAC,CAAC,EAAE;gBACP,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC;oBACpB,OAAO,CAAC,GAAG,UAAU,GAAG,GAAG,CAAC;gBAC9B,CAAC;gBACD,OAAO,CAAC,CAAC;YACX,CAAC,CAAC;iBACD,IAAI,CAAC,GAAG,CAAC,CACb,CAAC;IACJ,CAAC;CACF;AA1CD,wCA0CC;AAED;;GAEG;AACU,QAAA,MAAM,GAAG,IAAI,kCAAoB,EAAE,CAAC"}
|
package/lib/Device.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { PublicKey } from "./PublicKey";
|
|
2
|
+
import { CommandBlock } from "./CommandBlock";
|
|
3
|
+
import { KeyPair } from "./Crypto";
|
|
4
|
+
import { StreamTree } from "./StreamTree";
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
*/
|
|
8
|
+
export interface Device {
|
|
9
|
+
getPublicKey(): Promise<PublicKey>;
|
|
10
|
+
/**
|
|
11
|
+
* Checks wether the public key can be directly fetched or if acquiring the public key
|
|
12
|
+
* requires a user action.
|
|
13
|
+
*
|
|
14
|
+
* @returns True if the public key is directly available, false otherwise
|
|
15
|
+
*/
|
|
16
|
+
isPublicKeyAvailable(): boolean;
|
|
17
|
+
sign(stream: CommandBlock[], tree?: StreamTree): Promise<CommandBlock>;
|
|
18
|
+
/**
|
|
19
|
+
* Read the symmetric key from the stream tree at the given path. This function may not be implemented by all devices.
|
|
20
|
+
* @param tree The stream tree
|
|
21
|
+
* @param path The path to the key
|
|
22
|
+
* @returns The public key of the symmetric key
|
|
23
|
+
*/
|
|
24
|
+
readKey(tree: StreamTree, path: number[]): Promise<Uint8Array>;
|
|
25
|
+
}
|
|
26
|
+
export declare class SoftwareDevice implements Device {
|
|
27
|
+
private keyPair;
|
|
28
|
+
constructor(kp: KeyPair);
|
|
29
|
+
getPublicKey(): Promise<PublicKey>;
|
|
30
|
+
private generateSharedKey;
|
|
31
|
+
private encryptSharedKey;
|
|
32
|
+
private decryptSharedKey;
|
|
33
|
+
private deriveKey;
|
|
34
|
+
sign(stream: CommandBlock[], tree?: StreamTree): Promise<CommandBlock>;
|
|
35
|
+
readKey(tree: StreamTree, path: number[]): Promise<Uint8Array>;
|
|
36
|
+
isPublicKeyAvailable(): boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
*
|
|
40
|
+
*/
|
|
41
|
+
export declare function createDevice(): Device;
|
|
42
|
+
export declare const ISSUER_PLACEHOLDER: Uint8Array;
|
|
43
|
+
//# sourceMappingURL=Device.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Device.d.ts","sourceRoot":"","sources":["../src/Device.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,YAAY,EAMb,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAA0B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,MAAM;IAErB,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;IAEnC;;;;;OAKG;IACH,oBAAoB,IAAI,OAAO,CAAC;IAGhC,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAEvE;;;;;OAKG;IACH,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAChE;AAcD,qBAAa,cAAe,YAAW,MAAM;IAC3C,OAAO,CAAC,OAAO,CAAU;gBAEb,EAAE,EAAE,OAAO;IAIjB,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC;IAIxC,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,gBAAgB;YAUV,SAAS;IAmBjB,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IA2FtE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IA4BpE,oBAAoB,IAAI,OAAO;CAGhC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AAED,eAAO,MAAM,kBAAkB,YAE7B,CAAC"}
|
package/lib/Device.js
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.ISSUER_PLACEHOLDER = exports.createDevice = exports.SoftwareDevice = void 0;
|
|
16
|
+
const PublicKey_1 = require("./PublicKey");
|
|
17
|
+
const CommandBlock_1 = require("./CommandBlock");
|
|
18
|
+
const CommandStreamResolver_1 = __importDefault(require("./CommandStreamResolver"));
|
|
19
|
+
const Crypto_1 = require("./Crypto");
|
|
20
|
+
class SoftwareDevice {
|
|
21
|
+
constructor(kp) {
|
|
22
|
+
this.keyPair = kp;
|
|
23
|
+
}
|
|
24
|
+
getPublicKey() {
|
|
25
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
26
|
+
return new PublicKey_1.PublicKey(this.keyPair.publicKey);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
generateSharedKey() {
|
|
30
|
+
const xpriv = Crypto_1.crypto.randomBytes(64);
|
|
31
|
+
const pk = Crypto_1.crypto.derivePrivate(xpriv, []);
|
|
32
|
+
return { xpriv, publicKey: pk.publicKey };
|
|
33
|
+
}
|
|
34
|
+
encryptSharedKey(sharedKey, recipient) {
|
|
35
|
+
const kp = Crypto_1.crypto.randomKeypair();
|
|
36
|
+
const ecdh = Crypto_1.crypto.ecdh(kp, recipient);
|
|
37
|
+
const initializationVector = Crypto_1.crypto.randomBytes(16);
|
|
38
|
+
const encryptedXpriv = Crypto_1.crypto.encrypt(ecdh, initializationVector, sharedKey.xpriv);
|
|
39
|
+
return {
|
|
40
|
+
encryptedXpriv,
|
|
41
|
+
publicKey: sharedKey.publicKey,
|
|
42
|
+
ephemeralPublicKey: kp.publicKey,
|
|
43
|
+
initializationVector,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
decryptSharedKey(encryptedSharedKey) {
|
|
47
|
+
const ecdh = Crypto_1.crypto.ecdh(this.keyPair, encryptedSharedKey.ephemeralPublicKey);
|
|
48
|
+
const xpriv = Crypto_1.crypto.decrypt(ecdh, encryptedSharedKey.initializationVector, encryptedSharedKey.encryptedXpriv);
|
|
49
|
+
return { xpriv, publicKey: encryptedSharedKey.publicKey };
|
|
50
|
+
}
|
|
51
|
+
deriveKey(tree, path) {
|
|
52
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
53
|
+
const event = yield tree.getPublishKeyEvent(this.keyPair.publicKey, path);
|
|
54
|
+
if (!event) {
|
|
55
|
+
throw new Error("Cannot find key in the tree for the current device");
|
|
56
|
+
}
|
|
57
|
+
const encryptedSharedKey = {
|
|
58
|
+
encryptedXpriv: event.encryptedXpriv,
|
|
59
|
+
publicKey: event.groupPublicKey,
|
|
60
|
+
ephemeralPublicKey: event.ephemeralPublicKey,
|
|
61
|
+
initializationVector: event.nonce,
|
|
62
|
+
};
|
|
63
|
+
const sharedKey = this.decryptSharedKey(encryptedSharedKey);
|
|
64
|
+
const newKey = Crypto_1.crypto.derivePrivate(sharedKey.xpriv, path);
|
|
65
|
+
const xpriv = new Uint8Array(64);
|
|
66
|
+
xpriv.set(newKey.privateKey);
|
|
67
|
+
xpriv.set(newKey.chainCode, 32);
|
|
68
|
+
return { xpriv, publicKey: newKey.publicKey };
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
sign(stream, tree) {
|
|
72
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
73
|
+
if (stream.length === 0) {
|
|
74
|
+
throw new Error("Cannot sign an empty stream");
|
|
75
|
+
}
|
|
76
|
+
if (stream[stream.length - 1].commands.length === 0) {
|
|
77
|
+
throw new Error("Cannot sign an empty block");
|
|
78
|
+
}
|
|
79
|
+
const lastBlock = stream[stream.length - 1];
|
|
80
|
+
lastBlock.issuer = this.keyPair.publicKey;
|
|
81
|
+
// Resolve the stream (before the last block)
|
|
82
|
+
const resolved = yield CommandStreamResolver_1.default.resolve(stream.slice(0, stream.length - 1));
|
|
83
|
+
// The shared key of the stream
|
|
84
|
+
let sharedKey = null;
|
|
85
|
+
// Iterate through the commands to inject encrypted keys
|
|
86
|
+
for (let commandIndex = 0; commandIndex < lastBlock.commands.length; commandIndex++) {
|
|
87
|
+
const command = lastBlock.commands[commandIndex];
|
|
88
|
+
switch (command.getType()) {
|
|
89
|
+
case CommandBlock_1.CommandType.Seed: {
|
|
90
|
+
// Generate the shared key
|
|
91
|
+
sharedKey = this.generateSharedKey();
|
|
92
|
+
// Encrypt the shared key and inject it in the command
|
|
93
|
+
const encryptedSharedKey = this.encryptSharedKey(sharedKey, this.keyPair.publicKey);
|
|
94
|
+
command.groupKey = sharedKey.publicKey;
|
|
95
|
+
command.encryptedXpriv = encryptedSharedKey.encryptedXpriv;
|
|
96
|
+
command.ephemeralPublicKey = encryptedSharedKey.ephemeralPublicKey;
|
|
97
|
+
command.initializationVector = encryptedSharedKey.initializationVector;
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
case CommandBlock_1.CommandType.Derive: {
|
|
101
|
+
// Derive the shared key from the tree
|
|
102
|
+
if (!tree) {
|
|
103
|
+
throw new Error("Cannot derive a key without a tree");
|
|
104
|
+
}
|
|
105
|
+
sharedKey = yield this.deriveKey(tree, command.path);
|
|
106
|
+
// Encrypt the shared key and inject it in the command
|
|
107
|
+
const encryptedDerivedKey = this.encryptSharedKey(sharedKey, this.keyPair.publicKey);
|
|
108
|
+
command.groupKey = sharedKey.publicKey;
|
|
109
|
+
command.encryptedXpriv = encryptedDerivedKey.encryptedXpriv;
|
|
110
|
+
command.initializationVector = encryptedDerivedKey.initializationVector;
|
|
111
|
+
command.ephemeralPublicKey = encryptedDerivedKey.ephemeralPublicKey;
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
case CommandBlock_1.CommandType.PublishKey: {
|
|
115
|
+
// Derive the shared key from the tree
|
|
116
|
+
if (!sharedKey) {
|
|
117
|
+
// If the current stream is the seed stream, read the key from the first command in the first block
|
|
118
|
+
const encryptedKey = resolved.getEncryptedKey(this.keyPair.publicKey);
|
|
119
|
+
if (encryptedKey) {
|
|
120
|
+
sharedKey = this.decryptSharedKey({
|
|
121
|
+
encryptedXpriv: encryptedKey.encryptedXpriv,
|
|
122
|
+
initializationVector: encryptedKey.initialiationVector,
|
|
123
|
+
publicKey: encryptedKey.issuer,
|
|
124
|
+
ephemeralPublicKey: encryptedKey.ephemeralPublicKey,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
else if (stream[0].commands[0].getType() == CommandBlock_1.CommandType.Seed) {
|
|
128
|
+
if (Crypto_1.crypto.to_hex(stream[0].issuer) !== Crypto_1.crypto.to_hex(this.keyPair.publicKey)) {
|
|
129
|
+
throw new Error("Cannot read the seed key from another device");
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// console.dir(stream, { depth: null });
|
|
134
|
+
sharedKey = yield this.deriveKey(tree, resolved.getStreamDerivationPath());
|
|
135
|
+
}
|
|
136
|
+
if (!sharedKey)
|
|
137
|
+
throw new Error("Cannot find the shared key");
|
|
138
|
+
}
|
|
139
|
+
const encryptedSharedKey = this.encryptSharedKey(sharedKey, command.recipient);
|
|
140
|
+
command.encryptedXpriv = encryptedSharedKey.encryptedXpriv;
|
|
141
|
+
command.initializationVector = encryptedSharedKey.initializationVector;
|
|
142
|
+
command.ephemeralPublicKey = encryptedSharedKey.ephemeralPublicKey;
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const signature = (0, CommandBlock_1.signCommandBlock)(lastBlock, (yield this.getPublicKey()).publicKey, this.keyPair.privateKey).signature;
|
|
148
|
+
lastBlock.signature = signature;
|
|
149
|
+
return lastBlock;
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
readKey(tree, path) {
|
|
153
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
154
|
+
const event = yield tree.getPublishKeyEvent(this.keyPair.publicKey, path);
|
|
155
|
+
if (!event) {
|
|
156
|
+
throw new Error("Cannot find key in the tree for the current device");
|
|
157
|
+
}
|
|
158
|
+
const encryptedSharedKey = {
|
|
159
|
+
encryptedXpriv: event.encryptedXpriv,
|
|
160
|
+
initializationVector: event.nonce,
|
|
161
|
+
publicKey: event.groupPublicKey,
|
|
162
|
+
ephemeralPublicKey: event.ephemeralPublicKey,
|
|
163
|
+
};
|
|
164
|
+
const sharedKey = this.decryptSharedKey(encryptedSharedKey);
|
|
165
|
+
// Derive the key to match the path
|
|
166
|
+
let index = Crypto_1.DerivationPath.toIndexArray(event.stream.getStreamPath()).length;
|
|
167
|
+
while (index < path.length) {
|
|
168
|
+
const derivation = Crypto_1.crypto.derivePrivate(sharedKey.xpriv, [index]);
|
|
169
|
+
const xpriv = new Uint8Array(64);
|
|
170
|
+
xpriv.set(derivation.privateKey);
|
|
171
|
+
xpriv.set(derivation.chainCode, 32);
|
|
172
|
+
sharedKey.xpriv = xpriv;
|
|
173
|
+
sharedKey.publicKey = derivation.publicKey;
|
|
174
|
+
index += 1;
|
|
175
|
+
}
|
|
176
|
+
return sharedKey.xpriv;
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
isPublicKeyAvailable() {
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
exports.SoftwareDevice = SoftwareDevice;
|
|
184
|
+
/**
|
|
185
|
+
*
|
|
186
|
+
*/
|
|
187
|
+
function createDevice() {
|
|
188
|
+
const kp = Crypto_1.crypto.randomKeypair();
|
|
189
|
+
return new SoftwareDevice(kp);
|
|
190
|
+
}
|
|
191
|
+
exports.createDevice = createDevice;
|
|
192
|
+
exports.ISSUER_PLACEHOLDER = new Uint8Array([
|
|
193
|
+
3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
194
|
+
]);
|
|
195
|
+
//# sourceMappingURL=Device.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Device.js","sourceRoot":"","sources":["../src/Device.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class IndexedTree<T> {
|
|
2
|
+
private node;
|
|
3
|
+
private children;
|
|
4
|
+
constructor(node: T | null, children?: Map<number, IndexedTree<T>>);
|
|
5
|
+
getHighestIndex(): number;
|
|
6
|
+
getChildren(): Map<number, IndexedTree<T>>;
|
|
7
|
+
getChild(index: number): IndexedTree<T> | undefined;
|
|
8
|
+
findChild(path: number[]): IndexedTree<T> | undefined;
|
|
9
|
+
getValue(): T | null;
|
|
10
|
+
updateChild(path: number[], value: T): IndexedTree<T>;
|
|
11
|
+
addChild(path: number[], child: IndexedTree<T>): IndexedTree<T>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=IndexedTree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndexedTree.d.ts","sourceRoot":"","sources":["../src/IndexedTree.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAW,CAAC,CAAC;IACxB,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,QAAQ,CAA8B;gBAElC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,QAAQ,GAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAa;IAKtE,eAAe,IAAI,MAAM;IAIzB,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAI1C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS;IAInD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS;IAYrD,QAAQ,IAAI,CAAC,GAAG,IAAI;IAKpB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IAmBrD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;CAsBvE"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IndexedTree = void 0;
|
|
4
|
+
class IndexedTree {
|
|
5
|
+
constructor(node, children = new Map()) {
|
|
6
|
+
this.node = node;
|
|
7
|
+
this.children = children;
|
|
8
|
+
}
|
|
9
|
+
getHighestIndex() {
|
|
10
|
+
return [...this.children.keys()].reduce((a, b) => Math.max(a, b), 0);
|
|
11
|
+
}
|
|
12
|
+
getChildren() {
|
|
13
|
+
return this.children;
|
|
14
|
+
}
|
|
15
|
+
getChild(index) {
|
|
16
|
+
return this.children.get(index);
|
|
17
|
+
}
|
|
18
|
+
findChild(path) {
|
|
19
|
+
if (path.length === 0) {
|
|
20
|
+
return this;
|
|
21
|
+
}
|
|
22
|
+
const index = path[0];
|
|
23
|
+
const rest = path.slice(1);
|
|
24
|
+
if (this.children.has(index)) {
|
|
25
|
+
return this.children.get(index).findChild(rest);
|
|
26
|
+
}
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
getValue() {
|
|
30
|
+
return this.node;
|
|
31
|
+
}
|
|
32
|
+
/// Update the value of the node, if the node doesn't exist, it will be created
|
|
33
|
+
updateChild(path, value) {
|
|
34
|
+
if (path.length === 0) {
|
|
35
|
+
return new IndexedTree(value, this.children);
|
|
36
|
+
}
|
|
37
|
+
const index = path[0];
|
|
38
|
+
const rest = path.slice(1);
|
|
39
|
+
const children = new Map(this.children);
|
|
40
|
+
if (this.children.has(index)) {
|
|
41
|
+
const subTree = this.children.get(index).updateChild(rest, value);
|
|
42
|
+
children.set(index, subTree);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
const subTree = new IndexedTree(null).updateChild(rest, value);
|
|
46
|
+
children.set(index, subTree);
|
|
47
|
+
}
|
|
48
|
+
return new IndexedTree(this.node, children);
|
|
49
|
+
}
|
|
50
|
+
/// Adds a subtree to the tree
|
|
51
|
+
addChild(path, child) {
|
|
52
|
+
if (path.length === 0) {
|
|
53
|
+
return this;
|
|
54
|
+
}
|
|
55
|
+
if (path.length == 1) {
|
|
56
|
+
const children = new Map(this.children);
|
|
57
|
+
children.set(path[0], child);
|
|
58
|
+
return new IndexedTree(this.node, children);
|
|
59
|
+
}
|
|
60
|
+
const index = path[0];
|
|
61
|
+
const rest = path.slice(1);
|
|
62
|
+
const children = new Map(this.children);
|
|
63
|
+
if (this.children.has(index)) {
|
|
64
|
+
const subTree = this.children.get(index).addChild(rest, child);
|
|
65
|
+
children.set(index, subTree);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
const subTree = new IndexedTree(null).addChild(rest, child);
|
|
69
|
+
children.set(index, subTree);
|
|
70
|
+
}
|
|
71
|
+
return new IndexedTree(this.node, children);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.IndexedTree = IndexedTree;
|
|
75
|
+
//# sourceMappingURL=IndexedTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndexedTree.js","sourceRoot":"","sources":["../src/IndexedTree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Crypto, KeyPair, KeyPairWithChainCode } from "./Crypto";
|
|
2
|
+
export declare class NobleCryptoSecp256k1 implements Crypto {
|
|
3
|
+
randomKeypair(): KeyPair;
|
|
4
|
+
derivePrivate(xpriv: Uint8Array, path: number[]): KeyPairWithChainCode;
|
|
5
|
+
keypairFromSecretKey(secretKey: Uint8Array): KeyPair;
|
|
6
|
+
private derEncode;
|
|
7
|
+
private derDecode;
|
|
8
|
+
sign(message: Uint8Array, keyPair: KeyPair): Uint8Array;
|
|
9
|
+
verify(message: Uint8Array, signature: Uint8Array, publicKey: Uint8Array): boolean;
|
|
10
|
+
private to_array;
|
|
11
|
+
private normalizeKey;
|
|
12
|
+
private normalizeNonce;
|
|
13
|
+
private concat;
|
|
14
|
+
private enforceLength;
|
|
15
|
+
encrypt(secret: Uint8Array, nonce: Uint8Array, message: Uint8Array): Uint8Array;
|
|
16
|
+
decrypt(secret: Uint8Array, nonce: Uint8Array, ciphertext: Uint8Array): Uint8Array;
|
|
17
|
+
/**
|
|
18
|
+
* Ledger Live data are encrypted following pattern based on ECIES.
|
|
19
|
+
* For each encryption the Ledger Live instance generates a random keypair over secp256k1 (ephemeral public key)
|
|
20
|
+
* and a 16 bytes IV. Ledger Live then perform an ECDH between the command stream public key and
|
|
21
|
+
* the ephemeral private key to get the encryption key.
|
|
22
|
+
* The data is then encrypted using AES-256-GCM and serialized using the following format:
|
|
23
|
+
1 byte : Version of the format (0x00)
|
|
24
|
+
33 bytes : Compressed ephemeral public key
|
|
25
|
+
16 bytes : Nonce/IV
|
|
26
|
+
16 bytes : Tag/MAC (from AES-256-GCM)
|
|
27
|
+
variable : Encrypted data
|
|
28
|
+
*/
|
|
29
|
+
encryptUserData(commandStreamPrivateKey: Uint8Array, data: Uint8Array): Uint8Array;
|
|
30
|
+
decryptUserData(commandStreamPrivateKey: Uint8Array, data: Uint8Array): Uint8Array;
|
|
31
|
+
randomBytes(size: number): Uint8Array;
|
|
32
|
+
ecdh(keyPair: KeyPair, publicKey: Uint8Array): Uint8Array;
|
|
33
|
+
computeSymmetricKey(privateKey: Uint8Array, extra: Uint8Array): any;
|
|
34
|
+
hash(message: Uint8Array): Uint8Array;
|
|
35
|
+
from_hex(hex: string): Uint8Array;
|
|
36
|
+
to_hex(bytes?: Uint8Array | undefined | null): string;
|
|
37
|
+
}
|
|
38
|
+
export declare function to_hex(bytes?: Uint8Array | undefined | null): string;
|
|
39
|
+
//# sourceMappingURL=NobleCrypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NobleCrypto.d.ts","sourceRoot":"","sources":["../src/NobleCrypto.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAMjE,qBAAa,oBAAqB,YAAW,MAAM;IACjD,aAAa,IAAI,OAAO;IAQxB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,oBAAoB;IActE,oBAAoB,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO;IAOpD,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,SAAS;IAYjB,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,UAAU;IAMvD,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO;IAMlF,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,GAAG,UAAU;IAW/E,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,GAAG,UAAU;IAYlF;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,uBAAuB,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU;IAmClF,eAAe,CAAC,uBAAuB,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU;IA2BlF,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IAIrC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU;IAOzD,mBAAmB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU;IAK7D,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU;IAIrC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;IAQjC,MAAM,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM;CAGtD;AAED,wBAAgB,MAAM,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAKpE"}
|