@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
@@ -0,0 +1,80 @@
1
+ export declare class PubKeyCredential {
2
+ version: number;
3
+ curveId: number;
4
+ signAlgorithm: number;
5
+ publicKey: Uint8Array;
6
+ constructor({ version, curveId, signAlgorithm, publicKey, }: {
7
+ version: number;
8
+ curveId: number;
9
+ signAlgorithm: number;
10
+ publicKey: Uint8Array;
11
+ });
12
+ static fromBytes(data: any, offset?: number): [PubKeyCredential, number];
13
+ toBytes(): Uint8Array;
14
+ toJSON(): {
15
+ version: number;
16
+ curveId: number;
17
+ signAlgorithm: number;
18
+ publicKey: string;
19
+ };
20
+ assertValidity(): void;
21
+ }
22
+ export type SemVer = {
23
+ major: number;
24
+ minor: number;
25
+ patch: number;
26
+ };
27
+ export declare class Challenge {
28
+ payloadType: number;
29
+ version: number;
30
+ protocolVersion: SemVer;
31
+ challengeData: Uint8Array;
32
+ challengeExpiry: Date;
33
+ host: string;
34
+ rpCredential: PubKeyCredential;
35
+ rpSignature: Uint8Array;
36
+ constructor({ payloadType, version, protocolVersion, challengeData, challengeExpiry, host, rpCredential, rpSignature, }: {
37
+ payloadType: number;
38
+ version: number;
39
+ protocolVersion: SemVer;
40
+ challengeData: Uint8Array;
41
+ challengeExpiry: Date;
42
+ host: string;
43
+ rpCredential: PubKeyCredential;
44
+ rpSignature: Uint8Array;
45
+ });
46
+ static fromBytes(data: Uint8Array, offset?: number): [Challenge, number];
47
+ toBytes(): Uint8Array;
48
+ getUnsignedTLV(): Uint8Array;
49
+ toJSON(): {
50
+ payloadType: number;
51
+ version: number;
52
+ protocolVersion: SemVer;
53
+ challenge: {
54
+ data: string;
55
+ expiry: string;
56
+ };
57
+ host: string;
58
+ rp: {
59
+ credential: {
60
+ version: number;
61
+ curveId: number;
62
+ signAlgorithm: number;
63
+ publicKey: string;
64
+ };
65
+ signature: string;
66
+ }[];
67
+ };
68
+ getProtocolVersionData(): Uint8Array;
69
+ getChallengeExpireValue(): number;
70
+ }
71
+ export type SeedIdResult = {
72
+ pubkeyCredential: PubKeyCredential;
73
+ signature: Uint8Array;
74
+ attestationType: number;
75
+ attestationPubkeyCredential: PubKeyCredential;
76
+ attestation: Uint8Array;
77
+ attestationResult: Uint8Array;
78
+ };
79
+ export declare function parseSeedIdResult(result: Uint8Array): SeedIdResult;
80
+ //# sourceMappingURL=SeedId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeedId.d.ts","sourceRoot":"","sources":["../src/SeedId.ts"],"names":[],"mappings":"AAIA,qBAAa,gBAAgB;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,UAAU,CAAC;gBAEV,EACV,OAAO,EACP,OAAO,EACP,aAAa,EACb,SAAS,GACV,EAAE;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,UAAU,CAAC;KACvB;IAOD,MAAM,CAAC,SAAS,CAAC,IAAI,KAAA,EAAE,MAAM,SAAI,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAmB9D,OAAO,IAAI,UAAU;IAWrB,MAAM;;;;;;IASN,cAAc;CAcf;AAED,MAAM,MAAM,MAAM,GAAG;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,qBAAa,SAAS;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,UAAU,CAAC;IAC1B,eAAe,EAAE,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,gBAAgB,CAAC;IAC/B,WAAW,EAAE,UAAU,CAAC;gBAEZ,EACV,WAAW,EACX,OAAO,EACP,eAAe,EACf,aAAa,EACb,eAAe,EACf,IAAI,EACJ,YAAY,EACZ,WAAW,GACZ,EAAE;QACD,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,UAAU,CAAC;QAC1B,eAAe,EAAE,IAAI,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,EAAE,gBAAgB,CAAC;QAC/B,WAAW,EAAE,UAAU,CAAC;KACzB;IAWD,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,SAAI,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC;IA8FnE,OAAO,IAAI,UAAU;IAuBrB,cAAc,IAAI,UAAU;IAY5B,MAAM;;;;;;;;;;;;;;;;;;;IAmBN,sBAAsB,IAAI,UAAU;IASpC,uBAAuB,IAAI,MAAM;CAGlC;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,SAAS,EAAE,UAAU,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,2BAA2B,EAAE,gBAAgB,CAAC;IAC9C,WAAW,EAAE,UAAU,CAAC;IACxB,iBAAiB,EAAE,UAAU,CAAC;CAC/B,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CAuClE"}
@@ -0,0 +1,235 @@
1
+ import BigEndian from "./BigEndian";
2
+ import { crypto } from "./Crypto";
3
+ import { TLV } from "./tlv";
4
+ export class PubKeyCredential {
5
+ constructor({ version, curveId, signAlgorithm, publicKey, }) {
6
+ this.version = version;
7
+ this.curveId = curveId;
8
+ this.signAlgorithm = signAlgorithm;
9
+ this.publicKey = publicKey;
10
+ }
11
+ static fromBytes(data, offset = 0) {
12
+ const view = new DataView(data.buffer, data.byteOffset + offset);
13
+ const version = view.getUint8(0);
14
+ const curveId = view.getUint8(1);
15
+ const signAlgorithm = view.getUint8(2);
16
+ const publicKeyLength = view.getUint8(3);
17
+ const publicKey = new Uint8Array(data.buffer, data.byteOffset + offset + 4, publicKeyLength);
18
+ return [
19
+ new PubKeyCredential({
20
+ version,
21
+ curveId,
22
+ signAlgorithm,
23
+ publicKey,
24
+ }),
25
+ 4 + publicKeyLength,
26
+ ];
27
+ }
28
+ toBytes() {
29
+ const result = new Uint8Array(4 + this.publicKey.length);
30
+ const view = new DataView(result.buffer);
31
+ view.setUint8(0, this.version);
32
+ view.setUint8(1, this.curveId);
33
+ view.setUint8(2, this.signAlgorithm);
34
+ view.setUint8(3, this.publicKey.length);
35
+ result.set(this.publicKey, 4);
36
+ return result;
37
+ }
38
+ toJSON() {
39
+ return {
40
+ version: this.version,
41
+ curveId: this.curveId,
42
+ signAlgorithm: this.signAlgorithm,
43
+ publicKey: crypto.to_hex(this.publicKey),
44
+ };
45
+ }
46
+ assertValidity() {
47
+ if (this.version !== 0x00) {
48
+ throw new Error(`PubKeyCredential: Wrong version: ${this.version}`);
49
+ }
50
+ if (this.curveId !== 0x21) {
51
+ throw new Error(`PubKeyCredential: Wrong curve id: ${this.curveId}`);
52
+ }
53
+ if (this.signAlgorithm !== 0x01) {
54
+ throw new Error(`PubKeyCredential: Wrong sign algorithm: ${this.signAlgorithm}`);
55
+ }
56
+ if (this.publicKey.length !== 0x21) {
57
+ throw new Error(`PubKeyCredential: Wrong pubkey len: ${this.publicKey.length}`);
58
+ }
59
+ }
60
+ }
61
+ export class Challenge {
62
+ constructor({ payloadType, version, protocolVersion, challengeData, challengeExpiry, host, rpCredential, rpSignature, }) {
63
+ this.payloadType = payloadType;
64
+ this.version = version;
65
+ this.protocolVersion = protocolVersion;
66
+ this.challengeData = challengeData;
67
+ this.challengeExpiry = challengeExpiry;
68
+ this.host = host;
69
+ this.rpCredential = rpCredential;
70
+ this.rpSignature = rpSignature;
71
+ }
72
+ static fromBytes(data, offset = 0) {
73
+ let index = offset;
74
+ const all = TLV.readAllTLV(data, offset);
75
+ const byType = {};
76
+ for (const tlv of all) {
77
+ index += tlv.value.length + 2;
78
+ byType[tlv.type] = tlv.value;
79
+ // console.log(tlv.type.toString(16), "(" + tlv.value.length + ")", crypto.to_hex(tlv.value));
80
+ }
81
+ const payloadTypeField = byType[0x01];
82
+ if (payloadTypeField === undefined) {
83
+ throw new Error("Missing payloadType");
84
+ }
85
+ const payloadType = payloadTypeField[0];
86
+ const versionField = byType[0x02];
87
+ if (versionField === undefined) {
88
+ throw new Error("Missing version");
89
+ }
90
+ const version = versionField[0];
91
+ const protocolVersionField = byType[0x60];
92
+ if (protocolVersionField === undefined) {
93
+ throw new Error("Missing protocolVersion");
94
+ }
95
+ const protocolVersion = {
96
+ major: protocolVersionField[0],
97
+ minor: protocolVersionField[1],
98
+ patch: protocolVersionField[2],
99
+ };
100
+ const challengeDataField = byType[0x12];
101
+ if (challengeDataField === undefined) {
102
+ throw new Error("Missing challengeData");
103
+ }
104
+ const challengeData = challengeDataField;
105
+ const challengeExpiryField = byType[0x16];
106
+ if (challengeExpiryField === undefined) {
107
+ throw new Error("Missing challengeExpiry");
108
+ }
109
+ const challengeExpiry = new Date(1000 * BigEndian.arrayToNumber(challengeExpiryField));
110
+ const hostField = byType[0x20];
111
+ if (hostField === undefined) {
112
+ throw new Error("Missing host");
113
+ }
114
+ const host = new TextDecoder().decode(hostField);
115
+ const signAlgorithmField = byType[0x14];
116
+ if (signAlgorithmField === undefined) {
117
+ throw new Error("Missing signAlgorithm");
118
+ }
119
+ const signAlgorithm = signAlgorithmField[0];
120
+ const publicKey = byType[0x33];
121
+ if (publicKey === undefined) {
122
+ throw new Error("Missing rpCredential");
123
+ }
124
+ const curveIdField = byType[0x32];
125
+ if (curveIdField === undefined) {
126
+ throw new Error("Missing curveId");
127
+ }
128
+ const curveId = curveIdField[0];
129
+ const rpCredential = new PubKeyCredential({
130
+ version,
131
+ curveId,
132
+ signAlgorithm,
133
+ publicKey,
134
+ });
135
+ const rpSignatureField = byType[0x15];
136
+ if (rpSignatureField === undefined) {
137
+ throw new Error("Missing rpSignature");
138
+ }
139
+ const rpSignature = rpSignatureField;
140
+ const challenge = new Challenge({
141
+ payloadType,
142
+ protocolVersion,
143
+ version,
144
+ challengeData,
145
+ challengeExpiry,
146
+ host,
147
+ rpCredential,
148
+ rpSignature,
149
+ });
150
+ return [challenge, index - offset];
151
+ }
152
+ toBytes() {
153
+ let buffer = new Uint8Array();
154
+ buffer = TLV.pushTLV(buffer, 0x01, 1, new Uint8Array([this.payloadType]));
155
+ buffer = TLV.pushTLV(buffer, 0x02, 1, new Uint8Array([this.version]));
156
+ buffer = TLV.pushTLV(buffer, 0x12, this.challengeData.length, this.challengeData);
157
+ buffer = TLV.pushTLV(buffer, 0x14, 1, new Uint8Array([this.rpCredential.signAlgorithm]));
158
+ buffer = TLV.pushTLV(buffer, 0x15, this.rpSignature.length, this.rpSignature);
159
+ buffer = TLV.pushTLV(buffer, 0x16, 4, BigEndian.numberToArray(this.getChallengeExpireValue()));
160
+ buffer = TLV.pushTLV(buffer, 0x20, this.host.length, new TextEncoder().encode(this.host));
161
+ buffer = TLV.pushTLV(buffer, 0x32, 1, new Uint8Array([this.rpCredential.curveId]));
162
+ buffer = TLV.pushTLV(buffer, 0x33, this.rpCredential.publicKey.length, this.rpCredential.publicKey);
163
+ const data = this.getProtocolVersionData();
164
+ buffer = TLV.pushTLV(buffer, 0x60, data.length, data);
165
+ return buffer;
166
+ }
167
+ getUnsignedTLV() {
168
+ let buffer = new Uint8Array();
169
+ buffer = TLV.pushTLV(buffer, 0x01, 1, new Uint8Array([this.payloadType]));
170
+ buffer = TLV.pushTLV(buffer, 0x02, 1, new Uint8Array([this.version]));
171
+ buffer = TLV.pushTLV(buffer, 0x12, this.challengeData.length, this.challengeData);
172
+ buffer = TLV.pushTLV(buffer, 0x16, 4, BigEndian.numberToArray(this.getChallengeExpireValue()));
173
+ buffer = TLV.pushTLV(buffer, 0x20, this.host.length, new TextEncoder().encode(this.host));
174
+ const data = this.getProtocolVersionData();
175
+ buffer = TLV.pushTLV(buffer, 0x60, data.length, data);
176
+ return buffer;
177
+ }
178
+ toJSON() {
179
+ return {
180
+ payloadType: this.payloadType,
181
+ version: this.version,
182
+ protocolVersion: this.protocolVersion,
183
+ challenge: {
184
+ data: crypto.to_hex(this.challengeData),
185
+ expiry: this.challengeExpiry.toISOString(),
186
+ },
187
+ host: this.host,
188
+ rp: [
189
+ {
190
+ credential: this.rpCredential.toJSON(),
191
+ signature: crypto.to_hex(this.rpSignature),
192
+ },
193
+ ],
194
+ };
195
+ }
196
+ getProtocolVersionData() {
197
+ return new Uint8Array([
198
+ this.protocolVersion.major,
199
+ this.protocolVersion.minor,
200
+ this.protocolVersion.patch,
201
+ 0,
202
+ ]);
203
+ }
204
+ getChallengeExpireValue() {
205
+ return Math.floor(this.challengeExpiry.getTime() / 1000);
206
+ }
207
+ }
208
+ export function parseSeedIdResult(result) {
209
+ let offset = 0;
210
+ const [pubkeyCredential, pubkeyCredentialLength] = PubKeyCredential.fromBytes(result, offset);
211
+ pubkeyCredential.assertValidity();
212
+ offset += pubkeyCredentialLength;
213
+ const signatureLen = result[offset];
214
+ offset += 1;
215
+ const signature = new Uint8Array(result.buffer, result.byteOffset + offset, signatureLen);
216
+ offset += signatureLen;
217
+ const attestationResult = new Uint8Array(result.slice(offset));
218
+ const attestationType = result[offset];
219
+ offset += 1;
220
+ const [attestationPubkeyCredential, attestationPubkeyCredentialLength] = PubKeyCredential.fromBytes(result, offset);
221
+ attestationPubkeyCredential.assertValidity();
222
+ offset += attestationPubkeyCredentialLength;
223
+ const attestationLen = result[offset];
224
+ offset += 1;
225
+ const attestation = new Uint8Array(result.buffer, result.byteOffset + offset, attestationLen);
226
+ return {
227
+ pubkeyCredential,
228
+ signature,
229
+ attestationType,
230
+ attestationPubkeyCredential,
231
+ attestation,
232
+ attestationResult,
233
+ };
234
+ }
235
+ //# sourceMappingURL=SeedId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeedId.js","sourceRoot":"","sources":["../src/SeedId.ts"],"names":[],"mappings":"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"}
@@ -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,165 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { CommandStream, CommandStreamDecoder, CommandStreamEncoder } from ".";
11
+ import { crypto, DerivationPath } from "./Crypto";
12
+ import { IndexedTree } from "./IndexedTree";
13
+ /**
14
+ *
15
+ */
16
+ export class StreamTree {
17
+ constructor(tree) {
18
+ if (tree.getValue() === null) {
19
+ throw new Error("Root of the tree cannot be null");
20
+ }
21
+ this.tree = tree;
22
+ }
23
+ getApplicationRootPath(applicationId, increment = 0) {
24
+ var _a;
25
+ // tree index is always 0 in the current implementation
26
+ const treeIndex = 0;
27
+ // for application index, we have key rotation that is possible so we need to find the last index
28
+ const child = (_a = this.tree
29
+ .getChild(DerivationPath.hardenedIndex(treeIndex))) === null || _a === void 0 ? void 0 : _a.getChild(DerivationPath.hardenedIndex(applicationId));
30
+ const applicationIndex = child
31
+ ? DerivationPath.reverseHardenedIndex(child.getHighestIndex())
32
+ : 0;
33
+ return `m/${treeIndex}'/${applicationId}'/${applicationIndex + increment}'`;
34
+ }
35
+ getPublishKeyEvent(member, path) {
36
+ return __awaiter(this, void 0, void 0, function* () {
37
+ // Iterate over the tree from leaf to root
38
+ const leaf = this.tree.findChild(path);
39
+ if (!leaf || leaf.getValue() === null) {
40
+ if (path.length === 0) {
41
+ return null;
42
+ }
43
+ return this.getPublishKeyEvent(member, path.slice(0, path.length - 1));
44
+ }
45
+ const resolved = yield leaf.getValue().resolve();
46
+ const key = resolved.getEncryptedKey(member);
47
+ if (!key) {
48
+ if (path.length === 0) {
49
+ return null;
50
+ }
51
+ return this.getPublishKeyEvent(member, path.slice(0, path.length - 1));
52
+ }
53
+ return {
54
+ stream: leaf.getValue(),
55
+ encryptedXpriv: key.encryptedXpriv,
56
+ ephemeralPublicKey: key.ephemeralPublicKey,
57
+ nonce: key.initialiationVector,
58
+ groupPublicKey: resolved.getGroupPublicKey(),
59
+ };
60
+ });
61
+ }
62
+ getChild(path) {
63
+ const indexes = typeof path === "string" ? DerivationPath.toIndexArray(path) : path;
64
+ const subtree = this.tree.findChild(indexes);
65
+ if (subtree === undefined) {
66
+ return null;
67
+ }
68
+ return subtree.getValue();
69
+ }
70
+ getRoot() {
71
+ return this.tree.getValue();
72
+ }
73
+ /**
74
+ * Share a private key with a member
75
+ */
76
+ share(path, owner, member, name, permission) {
77
+ return __awaiter(this, void 0, void 0, function* () {
78
+ const indexes = typeof path === "string" ? DerivationPath.toIndexArray(path) : path;
79
+ let stream = this.getChild(indexes) || new CommandStream();
80
+ if (stream.blocks.length === 0 && indexes.length > 0) {
81
+ const root = yield this.getRoot().getRootHash();
82
+ stream = yield stream
83
+ .edit()
84
+ .derive(indexes)
85
+ .addMember(name, member, permission, true)
86
+ .issue(owner, this, root);
87
+ return this.update(stream);
88
+ }
89
+ else if (stream.blocks.length === 0) {
90
+ throw new Error("StreamTree.share cannot add a member if the root was not previously created");
91
+ }
92
+ else {
93
+ const newStream = yield stream.edit().addMember(name, member, permission).issue(owner, this);
94
+ return this.update(newStream);
95
+ }
96
+ });
97
+ }
98
+ /**
99
+ * Close a stream
100
+ */
101
+ close(path, owner) {
102
+ return __awaiter(this, void 0, void 0, function* () {
103
+ const indexes = typeof path === "string" ? DerivationPath.toIndexArray(path) : path;
104
+ let stream = this.getChild(indexes) || new CommandStream();
105
+ stream = yield stream.edit().close().issue(owner, this);
106
+ return this.update(stream);
107
+ });
108
+ }
109
+ update(stream) {
110
+ const path = stream.getStreamPath();
111
+ if (path === null)
112
+ throw new Error("Stream path cannot be null");
113
+ const indexes = DerivationPath.toIndexArray(path);
114
+ const newTree = this.tree.updateChild(indexes, stream);
115
+ return new StreamTree(newTree);
116
+ }
117
+ serialize() {
118
+ const streamEntries = serializeTree(this.tree, []);
119
+ const entries = streamEntries.flatMap(([path, stream]) => stream ? [[path, crypto.to_hex(CommandStreamEncoder.encode(stream.blocks))]] : []);
120
+ return Object.fromEntries(entries);
121
+ function serializeTree(tree, path) {
122
+ const stream = tree.getValue();
123
+ const childrens = tree.getChildren();
124
+ return [
125
+ [DerivationPath.toString(path), stream],
126
+ ...Array.from(childrens.entries()).flatMap(([index, child]) => serializeTree(child, [...path, index])),
127
+ ];
128
+ }
129
+ }
130
+ static deserialize(data) {
131
+ const streams = Object.values(data).map(data => new CommandStream(CommandStreamDecoder.decode(crypto.from_hex(data))));
132
+ return StreamTree.from(...streams);
133
+ }
134
+ static createNewTree(owner_1) {
135
+ return __awaiter(this, arguments, void 0, function* (owner, opts = {}) {
136
+ let stream = new CommandStream();
137
+ const streamToIssue = stream.edit().seed(opts.topic);
138
+ stream = yield streamToIssue.issue(owner);
139
+ const tree = new IndexedTree(stream);
140
+ return new StreamTree(tree);
141
+ });
142
+ }
143
+ static from(...streams) {
144
+ // Map all stream with their path
145
+ const streamMap = new Map();
146
+ streams.forEach(stream => {
147
+ const path = stream.getStreamPath();
148
+ if (path === null)
149
+ throw new Error("Stream path cannot be null");
150
+ streamMap.set(path, stream);
151
+ });
152
+ // Create tree if the list contains the root
153
+ const root = streamMap.get("");
154
+ if (root === undefined)
155
+ throw new Error("StreamTree.from requires the root of the tree");
156
+ let tree = new IndexedTree(root);
157
+ streamMap.delete("");
158
+ streamMap.forEach((stream, path) => {
159
+ const p = DerivationPath.toIndexArray(path);
160
+ tree = tree.addChild(p, new IndexedTree(stream));
161
+ });
162
+ return new StreamTree(tree);
163
+ }
164
+ }
165
+ //# sourceMappingURL=StreamTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StreamTree.js","sourceRoot":"","sources":["../src/StreamTree.ts"],"names":[],"mappings":"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"}
@@ -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"}