@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.
Files changed (224) hide show
  1. package/.eslintrc.js +33 -0
  2. package/.turbo/turbo-build.log +4 -0
  3. package/CHANGELOG.md +126 -0
  4. package/LICENSE.txt +21 -0
  5. package/README.md +3 -0
  6. package/jest.config.js +13 -0
  7. package/lib/ApduDevice.d.ts +99 -0
  8. package/lib/ApduDevice.d.ts.map +1 -0
  9. package/lib/ApduDevice.js +528 -0
  10. package/lib/ApduDevice.js.map +1 -0
  11. package/lib/BigEndian.d.ts +7 -0
  12. package/lib/BigEndian.d.ts.map +1 -0
  13. package/lib/BigEndian.js +26 -0
  14. package/lib/BigEndian.js.map +1 -0
  15. package/lib/CommandBlock.d.ts +114 -0
  16. package/lib/CommandBlock.d.ts.map +1 -0
  17. package/lib/CommandBlock.js +156 -0
  18. package/lib/CommandBlock.js.map +1 -0
  19. package/lib/CommandStream.d.ts +38 -0
  20. package/lib/CommandStream.d.ts.map +1 -0
  21. package/lib/CommandStream.js +195 -0
  22. package/lib/CommandStream.js.map +1 -0
  23. package/lib/CommandStreamDecoder.d.ts +15 -0
  24. package/lib/CommandStreamDecoder.d.ts.map +1 -0
  25. package/lib/CommandStreamDecoder.js +101 -0
  26. package/lib/CommandStreamDecoder.js.map +1 -0
  27. package/lib/CommandStreamEncoder.d.ts +16 -0
  28. package/lib/CommandStreamEncoder.d.ts.map +1 -0
  29. package/lib/CommandStreamEncoder.js +131 -0
  30. package/lib/CommandStreamEncoder.js.map +1 -0
  31. package/lib/CommandStreamJsonifier.d.ts +6 -0
  32. package/lib/CommandStreamJsonifier.d.ts.map +1 -0
  33. package/lib/CommandStreamJsonifier.js +75 -0
  34. package/lib/CommandStreamJsonifier.js.map +1 -0
  35. package/lib/CommandStreamResolver.d.ts +53 -0
  36. package/lib/CommandStreamResolver.d.ts.map +1 -0
  37. package/lib/CommandStreamResolver.js +221 -0
  38. package/lib/CommandStreamResolver.js.map +1 -0
  39. package/lib/Crypto.d.ts +38 -0
  40. package/lib/Crypto.d.ts.map +1 -0
  41. package/lib/Crypto.js +47 -0
  42. package/lib/Crypto.js.map +1 -0
  43. package/lib/Device.d.ts +43 -0
  44. package/lib/Device.d.ts.map +1 -0
  45. package/lib/Device.js +195 -0
  46. package/lib/Device.js.map +1 -0
  47. package/lib/IndexedTree.d.ts +13 -0
  48. package/lib/IndexedTree.d.ts.map +1 -0
  49. package/lib/IndexedTree.js +75 -0
  50. package/lib/IndexedTree.js.map +1 -0
  51. package/lib/NobleCrypto.d.ts +39 -0
  52. package/lib/NobleCrypto.d.ts.map +1 -0
  53. package/lib/NobleCrypto.js +240 -0
  54. package/lib/NobleCrypto.js.map +1 -0
  55. package/lib/PublicKey.d.ts +5 -0
  56. package/lib/PublicKey.d.ts.map +1 -0
  57. package/lib/PublicKey.js +10 -0
  58. package/lib/PublicKey.js.map +1 -0
  59. package/lib/SeedId.d.ts +80 -0
  60. package/lib/SeedId.d.ts.map +1 -0
  61. package/lib/SeedId.js +244 -0
  62. package/lib/SeedId.js.map +1 -0
  63. package/lib/StreamTree.d.ts +50 -0
  64. package/lib/StreamTree.d.ts.map +1 -0
  65. package/lib/StreamTree.js +169 -0
  66. package/lib/StreamTree.js.map +1 -0
  67. package/lib/StreamTreeCipher.d.ts +46 -0
  68. package/lib/StreamTreeCipher.d.ts.map +1 -0
  69. package/lib/StreamTreeCipher.js +175 -0
  70. package/lib/StreamTreeCipher.js.map +1 -0
  71. package/lib/__tests__/codec.d.ts +2 -0
  72. package/lib/__tests__/codec.d.ts.map +1 -0
  73. package/lib/__tests__/codec.js +108 -0
  74. package/lib/__tests__/codec.js.map +1 -0
  75. package/lib/__tests__/crypto.d.ts +2 -0
  76. package/lib/__tests__/crypto.d.ts.map +1 -0
  77. package/lib/__tests__/crypto.js +46 -0
  78. package/lib/__tests__/crypto.js.map +1 -0
  79. package/lib/__tests__/indexed_tree.d.ts +2 -0
  80. package/lib/__tests__/indexed_tree.d.ts.map +1 -0
  81. package/lib/__tests__/indexed_tree.js +45 -0
  82. package/lib/__tests__/indexed_tree.js.map +1 -0
  83. package/lib/__tests__/key_exchange.d.ts +2 -0
  84. package/lib/__tests__/key_exchange.d.ts.map +1 -0
  85. package/lib/__tests__/key_exchange.js +129 -0
  86. package/lib/__tests__/key_exchange.js.map +1 -0
  87. package/lib/__tests__/seedId.d.ts +2 -0
  88. package/lib/__tests__/seedId.d.ts.map +1 -0
  89. package/lib/__tests__/seedId.js +92 -0
  90. package/lib/__tests__/seedId.js.map +1 -0
  91. package/lib/__tests__/shared_object.d.ts +2 -0
  92. package/lib/__tests__/shared_object.d.ts.map +1 -0
  93. package/lib/__tests__/shared_object.js +78 -0
  94. package/lib/__tests__/shared_object.js.map +1 -0
  95. package/lib/index.d.ts +35 -0
  96. package/lib/index.d.ts.map +1 -0
  97. package/lib/index.js +81 -0
  98. package/lib/index.js.map +1 -0
  99. package/lib/tlv.d.ts +99 -0
  100. package/lib/tlv.d.ts.map +1 -0
  101. package/lib/tlv.js +150 -0
  102. package/lib/tlv.js.map +1 -0
  103. package/lib-es/ApduDevice.d.ts +99 -0
  104. package/lib-es/ApduDevice.d.ts.map +1 -0
  105. package/lib-es/ApduDevice.js +522 -0
  106. package/lib-es/ApduDevice.js.map +1 -0
  107. package/lib-es/BigEndian.d.ts +7 -0
  108. package/lib-es/BigEndian.d.ts.map +1 -0
  109. package/lib-es/BigEndian.js +23 -0
  110. package/lib-es/BigEndian.js.map +1 -0
  111. package/lib-es/CommandBlock.d.ts +114 -0
  112. package/lib-es/CommandBlock.d.ts.map +1 -0
  113. package/lib-es/CommandBlock.js +143 -0
  114. package/lib-es/CommandBlock.js.map +1 -0
  115. package/lib-es/CommandStream.d.ts +38 -0
  116. package/lib-es/CommandStream.d.ts.map +1 -0
  117. package/lib-es/CommandStream.js +187 -0
  118. package/lib-es/CommandStream.js.map +1 -0
  119. package/lib-es/CommandStreamDecoder.d.ts +15 -0
  120. package/lib-es/CommandStreamDecoder.d.ts.map +1 -0
  121. package/lib-es/CommandStreamDecoder.js +97 -0
  122. package/lib-es/CommandStreamDecoder.js.map +1 -0
  123. package/lib-es/CommandStreamEncoder.d.ts +16 -0
  124. package/lib-es/CommandStreamEncoder.d.ts.map +1 -0
  125. package/lib-es/CommandStreamEncoder.js +127 -0
  126. package/lib-es/CommandStreamEncoder.js.map +1 -0
  127. package/lib-es/CommandStreamJsonifier.d.ts +6 -0
  128. package/lib-es/CommandStreamJsonifier.d.ts.map +1 -0
  129. package/lib-es/CommandStreamJsonifier.js +72 -0
  130. package/lib-es/CommandStreamJsonifier.js.map +1 -0
  131. package/lib-es/CommandStreamResolver.d.ts +53 -0
  132. package/lib-es/CommandStreamResolver.d.ts.map +1 -0
  133. package/lib-es/CommandStreamResolver.js +216 -0
  134. package/lib-es/CommandStreamResolver.js.map +1 -0
  135. package/lib-es/Crypto.d.ts +38 -0
  136. package/lib-es/Crypto.d.ts.map +1 -0
  137. package/lib-es/Crypto.js +43 -0
  138. package/lib-es/Crypto.js.map +1 -0
  139. package/lib-es/Device.d.ts +43 -0
  140. package/lib-es/Device.d.ts.map +1 -0
  141. package/lib-es/Device.js +187 -0
  142. package/lib-es/Device.js.map +1 -0
  143. package/lib-es/IndexedTree.d.ts +13 -0
  144. package/lib-es/IndexedTree.d.ts.map +1 -0
  145. package/lib-es/IndexedTree.js +71 -0
  146. package/lib-es/IndexedTree.js.map +1 -0
  147. package/lib-es/NobleCrypto.d.ts +39 -0
  148. package/lib-es/NobleCrypto.d.ts.map +1 -0
  149. package/lib-es/NobleCrypto.js +209 -0
  150. package/lib-es/NobleCrypto.js.map +1 -0
  151. package/lib-es/PublicKey.d.ts +5 -0
  152. package/lib-es/PublicKey.d.ts.map +1 -0
  153. package/lib-es/PublicKey.js +6 -0
  154. package/lib-es/PublicKey.js.map +1 -0
  155. package/lib-es/SeedId.d.ts +80 -0
  156. package/lib-es/SeedId.d.ts.map +1 -0
  157. package/lib-es/SeedId.js +235 -0
  158. package/lib-es/SeedId.js.map +1 -0
  159. package/lib-es/StreamTree.d.ts +50 -0
  160. package/lib-es/StreamTree.d.ts.map +1 -0
  161. package/lib-es/StreamTree.js +165 -0
  162. package/lib-es/StreamTree.js.map +1 -0
  163. package/lib-es/StreamTreeCipher.d.ts +46 -0
  164. package/lib-es/StreamTreeCipher.d.ts.map +1 -0
  165. package/lib-es/StreamTreeCipher.js +171 -0
  166. package/lib-es/StreamTreeCipher.js.map +1 -0
  167. package/lib-es/__tests__/codec.d.ts +2 -0
  168. package/lib-es/__tests__/codec.d.ts.map +1 -0
  169. package/lib-es/__tests__/codec.js +106 -0
  170. package/lib-es/__tests__/codec.js.map +1 -0
  171. package/lib-es/__tests__/crypto.d.ts +2 -0
  172. package/lib-es/__tests__/crypto.d.ts.map +1 -0
  173. package/lib-es/__tests__/crypto.js +44 -0
  174. package/lib-es/__tests__/crypto.js.map +1 -0
  175. package/lib-es/__tests__/indexed_tree.d.ts +2 -0
  176. package/lib-es/__tests__/indexed_tree.d.ts.map +1 -0
  177. package/lib-es/__tests__/indexed_tree.js +43 -0
  178. package/lib-es/__tests__/indexed_tree.js.map +1 -0
  179. package/lib-es/__tests__/key_exchange.d.ts +2 -0
  180. package/lib-es/__tests__/key_exchange.d.ts.map +1 -0
  181. package/lib-es/__tests__/key_exchange.js +124 -0
  182. package/lib-es/__tests__/key_exchange.js.map +1 -0
  183. package/lib-es/__tests__/seedId.d.ts +2 -0
  184. package/lib-es/__tests__/seedId.d.ts.map +1 -0
  185. package/lib-es/__tests__/seedId.js +90 -0
  186. package/lib-es/__tests__/seedId.js.map +1 -0
  187. package/lib-es/__tests__/shared_object.d.ts +2 -0
  188. package/lib-es/__tests__/shared_object.d.ts.map +1 -0
  189. package/lib-es/__tests__/shared_object.js +76 -0
  190. package/lib-es/__tests__/shared_object.js.map +1 -0
  191. package/lib-es/index.d.ts +35 -0
  192. package/lib-es/index.d.ts.map +1 -0
  193. package/lib-es/index.js +32 -0
  194. package/lib-es/index.js.map +1 -0
  195. package/lib-es/tlv.d.ts +99 -0
  196. package/lib-es/tlv.d.ts.map +1 -0
  197. package/lib-es/tlv.js +144 -0
  198. package/lib-es/tlv.js.map +1 -0
  199. package/package.json +63 -0
  200. package/src/ApduDevice.ts +688 -0
  201. package/src/BigEndian.ts +25 -0
  202. package/src/CommandBlock.ts +244 -0
  203. package/src/CommandStream.ts +260 -0
  204. package/src/CommandStreamDecoder.ts +142 -0
  205. package/src/CommandStreamEncoder.ts +144 -0
  206. package/src/CommandStreamJsonifier.ts +82 -0
  207. package/src/CommandStreamResolver.ts +284 -0
  208. package/src/Crypto.ts +78 -0
  209. package/src/Device.ts +246 -0
  210. package/src/IndexedTree.ts +80 -0
  211. package/src/NobleCrypto.ts +255 -0
  212. package/src/PublicKey.ts +6 -0
  213. package/src/SeedId.ts +338 -0
  214. package/src/StreamTree.ts +212 -0
  215. package/src/StreamTreeCipher.ts +207 -0
  216. package/src/__tests__/codec.ts +146 -0
  217. package/src/__tests__/crypto.ts +44 -0
  218. package/src/__tests__/indexed_tree.ts +51 -0
  219. package/src/__tests__/key_exchange.ts +167 -0
  220. package/src/__tests__/seedId.ts +120 -0
  221. package/src/__tests__/shared_object.ts +118 -0
  222. package/src/index.ts +43 -0
  223. package/src/tlv.ts +210 -0
  224. 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"}
@@ -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"}