@ledgerhq/hw-ledger-key-ring-protocol 0.2.1-nightly.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 (225) hide show
  1. package/.eslintrc.js +33 -0
  2. package/.turbo/turbo-build.log +4 -0
  3. package/.unimportedrc.json +4 -0
  4. package/CHANGELOG.md +126 -0
  5. package/LICENSE.txt +21 -0
  6. package/README.md +3 -0
  7. package/jest.config.js +13 -0
  8. package/lib/ApduDevice.d.ts +99 -0
  9. package/lib/ApduDevice.d.ts.map +1 -0
  10. package/lib/ApduDevice.js +532 -0
  11. package/lib/ApduDevice.js.map +1 -0
  12. package/lib/BigEndian.d.ts +7 -0
  13. package/lib/BigEndian.d.ts.map +1 -0
  14. package/lib/BigEndian.js +26 -0
  15. package/lib/BigEndian.js.map +1 -0
  16. package/lib/CommandBlock.d.ts +114 -0
  17. package/lib/CommandBlock.d.ts.map +1 -0
  18. package/lib/CommandBlock.js +173 -0
  19. package/lib/CommandBlock.js.map +1 -0
  20. package/lib/CommandStream.d.ts +38 -0
  21. package/lib/CommandStream.d.ts.map +1 -0
  22. package/lib/CommandStream.js +197 -0
  23. package/lib/CommandStream.js.map +1 -0
  24. package/lib/CommandStreamDecoder.d.ts +15 -0
  25. package/lib/CommandStreamDecoder.d.ts.map +1 -0
  26. package/lib/CommandStreamDecoder.js +101 -0
  27. package/lib/CommandStreamDecoder.js.map +1 -0
  28. package/lib/CommandStreamEncoder.d.ts +16 -0
  29. package/lib/CommandStreamEncoder.d.ts.map +1 -0
  30. package/lib/CommandStreamEncoder.js +131 -0
  31. package/lib/CommandStreamEncoder.js.map +1 -0
  32. package/lib/CommandStreamJsonifier.d.ts +6 -0
  33. package/lib/CommandStreamJsonifier.d.ts.map +1 -0
  34. package/lib/CommandStreamJsonifier.js +75 -0
  35. package/lib/CommandStreamJsonifier.js.map +1 -0
  36. package/lib/CommandStreamResolver.d.ts +53 -0
  37. package/lib/CommandStreamResolver.d.ts.map +1 -0
  38. package/lib/CommandStreamResolver.js +221 -0
  39. package/lib/CommandStreamResolver.js.map +1 -0
  40. package/lib/Crypto.d.ts +38 -0
  41. package/lib/Crypto.d.ts.map +1 -0
  42. package/lib/Crypto.js +47 -0
  43. package/lib/Crypto.js.map +1 -0
  44. package/lib/Device.d.ts +43 -0
  45. package/lib/Device.d.ts.map +1 -0
  46. package/lib/Device.js +203 -0
  47. package/lib/Device.js.map +1 -0
  48. package/lib/IndexedTree.d.ts +13 -0
  49. package/lib/IndexedTree.d.ts.map +1 -0
  50. package/lib/IndexedTree.js +75 -0
  51. package/lib/IndexedTree.js.map +1 -0
  52. package/lib/NobleCrypto.d.ts +41 -0
  53. package/lib/NobleCrypto.d.ts.map +1 -0
  54. package/lib/NobleCrypto.js +298 -0
  55. package/lib/NobleCrypto.js.map +1 -0
  56. package/lib/PublicKey.d.ts +5 -0
  57. package/lib/PublicKey.d.ts.map +1 -0
  58. package/lib/PublicKey.js +10 -0
  59. package/lib/PublicKey.js.map +1 -0
  60. package/lib/SeedId.d.ts +80 -0
  61. package/lib/SeedId.d.ts.map +1 -0
  62. package/lib/SeedId.js +244 -0
  63. package/lib/SeedId.js.map +1 -0
  64. package/lib/StreamTree.d.ts +50 -0
  65. package/lib/StreamTree.d.ts.map +1 -0
  66. package/lib/StreamTree.js +169 -0
  67. package/lib/StreamTree.js.map +1 -0
  68. package/lib/StreamTreeCipher.d.ts +46 -0
  69. package/lib/StreamTreeCipher.d.ts.map +1 -0
  70. package/lib/StreamTreeCipher.js +179 -0
  71. package/lib/StreamTreeCipher.js.map +1 -0
  72. package/lib/__tests__/codec.d.ts +2 -0
  73. package/lib/__tests__/codec.d.ts.map +1 -0
  74. package/lib/__tests__/codec.js +108 -0
  75. package/lib/__tests__/codec.js.map +1 -0
  76. package/lib/__tests__/crypto.d.ts +2 -0
  77. package/lib/__tests__/crypto.d.ts.map +1 -0
  78. package/lib/__tests__/crypto.js +46 -0
  79. package/lib/__tests__/crypto.js.map +1 -0
  80. package/lib/__tests__/indexed_tree.d.ts +2 -0
  81. package/lib/__tests__/indexed_tree.d.ts.map +1 -0
  82. package/lib/__tests__/indexed_tree.js +45 -0
  83. package/lib/__tests__/indexed_tree.js.map +1 -0
  84. package/lib/__tests__/key_exchange.d.ts +2 -0
  85. package/lib/__tests__/key_exchange.d.ts.map +1 -0
  86. package/lib/__tests__/key_exchange.js +129 -0
  87. package/lib/__tests__/key_exchange.js.map +1 -0
  88. package/lib/__tests__/seedId.d.ts +2 -0
  89. package/lib/__tests__/seedId.d.ts.map +1 -0
  90. package/lib/__tests__/seedId.js +92 -0
  91. package/lib/__tests__/seedId.js.map +1 -0
  92. package/lib/__tests__/shared_object.d.ts +2 -0
  93. package/lib/__tests__/shared_object.d.ts.map +1 -0
  94. package/lib/__tests__/shared_object.js +78 -0
  95. package/lib/__tests__/shared_object.js.map +1 -0
  96. package/lib/index.d.ts +35 -0
  97. package/lib/index.d.ts.map +1 -0
  98. package/lib/index.js +81 -0
  99. package/lib/index.js.map +1 -0
  100. package/lib/tlv.d.ts +99 -0
  101. package/lib/tlv.d.ts.map +1 -0
  102. package/lib/tlv.js +150 -0
  103. package/lib/tlv.js.map +1 -0
  104. package/lib-es/ApduDevice.d.ts +99 -0
  105. package/lib-es/ApduDevice.d.ts.map +1 -0
  106. package/lib-es/ApduDevice.js +526 -0
  107. package/lib-es/ApduDevice.js.map +1 -0
  108. package/lib-es/BigEndian.d.ts +7 -0
  109. package/lib-es/BigEndian.d.ts.map +1 -0
  110. package/lib-es/BigEndian.js +23 -0
  111. package/lib-es/BigEndian.js.map +1 -0
  112. package/lib-es/CommandBlock.d.ts +114 -0
  113. package/lib-es/CommandBlock.d.ts.map +1 -0
  114. package/lib-es/CommandBlock.js +160 -0
  115. package/lib-es/CommandBlock.js.map +1 -0
  116. package/lib-es/CommandStream.d.ts +38 -0
  117. package/lib-es/CommandStream.d.ts.map +1 -0
  118. package/lib-es/CommandStream.js +189 -0
  119. package/lib-es/CommandStream.js.map +1 -0
  120. package/lib-es/CommandStreamDecoder.d.ts +15 -0
  121. package/lib-es/CommandStreamDecoder.d.ts.map +1 -0
  122. package/lib-es/CommandStreamDecoder.js +97 -0
  123. package/lib-es/CommandStreamDecoder.js.map +1 -0
  124. package/lib-es/CommandStreamEncoder.d.ts +16 -0
  125. package/lib-es/CommandStreamEncoder.d.ts.map +1 -0
  126. package/lib-es/CommandStreamEncoder.js +127 -0
  127. package/lib-es/CommandStreamEncoder.js.map +1 -0
  128. package/lib-es/CommandStreamJsonifier.d.ts +6 -0
  129. package/lib-es/CommandStreamJsonifier.d.ts.map +1 -0
  130. package/lib-es/CommandStreamJsonifier.js +72 -0
  131. package/lib-es/CommandStreamJsonifier.js.map +1 -0
  132. package/lib-es/CommandStreamResolver.d.ts +53 -0
  133. package/lib-es/CommandStreamResolver.d.ts.map +1 -0
  134. package/lib-es/CommandStreamResolver.js +216 -0
  135. package/lib-es/CommandStreamResolver.js.map +1 -0
  136. package/lib-es/Crypto.d.ts +38 -0
  137. package/lib-es/Crypto.d.ts.map +1 -0
  138. package/lib-es/Crypto.js +43 -0
  139. package/lib-es/Crypto.js.map +1 -0
  140. package/lib-es/Device.d.ts +43 -0
  141. package/lib-es/Device.d.ts.map +1 -0
  142. package/lib-es/Device.js +195 -0
  143. package/lib-es/Device.js.map +1 -0
  144. package/lib-es/IndexedTree.d.ts +13 -0
  145. package/lib-es/IndexedTree.d.ts.map +1 -0
  146. package/lib-es/IndexedTree.js +71 -0
  147. package/lib-es/IndexedTree.js.map +1 -0
  148. package/lib-es/NobleCrypto.d.ts +41 -0
  149. package/lib-es/NobleCrypto.d.ts.map +1 -0
  150. package/lib-es/NobleCrypto.js +267 -0
  151. package/lib-es/NobleCrypto.js.map +1 -0
  152. package/lib-es/PublicKey.d.ts +5 -0
  153. package/lib-es/PublicKey.d.ts.map +1 -0
  154. package/lib-es/PublicKey.js +6 -0
  155. package/lib-es/PublicKey.js.map +1 -0
  156. package/lib-es/SeedId.d.ts +80 -0
  157. package/lib-es/SeedId.d.ts.map +1 -0
  158. package/lib-es/SeedId.js +235 -0
  159. package/lib-es/SeedId.js.map +1 -0
  160. package/lib-es/StreamTree.d.ts +50 -0
  161. package/lib-es/StreamTree.d.ts.map +1 -0
  162. package/lib-es/StreamTree.js +165 -0
  163. package/lib-es/StreamTree.js.map +1 -0
  164. package/lib-es/StreamTreeCipher.d.ts +46 -0
  165. package/lib-es/StreamTreeCipher.d.ts.map +1 -0
  166. package/lib-es/StreamTreeCipher.js +175 -0
  167. package/lib-es/StreamTreeCipher.js.map +1 -0
  168. package/lib-es/__tests__/codec.d.ts +2 -0
  169. package/lib-es/__tests__/codec.d.ts.map +1 -0
  170. package/lib-es/__tests__/codec.js +106 -0
  171. package/lib-es/__tests__/codec.js.map +1 -0
  172. package/lib-es/__tests__/crypto.d.ts +2 -0
  173. package/lib-es/__tests__/crypto.d.ts.map +1 -0
  174. package/lib-es/__tests__/crypto.js +44 -0
  175. package/lib-es/__tests__/crypto.js.map +1 -0
  176. package/lib-es/__tests__/indexed_tree.d.ts +2 -0
  177. package/lib-es/__tests__/indexed_tree.d.ts.map +1 -0
  178. package/lib-es/__tests__/indexed_tree.js +43 -0
  179. package/lib-es/__tests__/indexed_tree.js.map +1 -0
  180. package/lib-es/__tests__/key_exchange.d.ts +2 -0
  181. package/lib-es/__tests__/key_exchange.d.ts.map +1 -0
  182. package/lib-es/__tests__/key_exchange.js +124 -0
  183. package/lib-es/__tests__/key_exchange.js.map +1 -0
  184. package/lib-es/__tests__/seedId.d.ts +2 -0
  185. package/lib-es/__tests__/seedId.d.ts.map +1 -0
  186. package/lib-es/__tests__/seedId.js +90 -0
  187. package/lib-es/__tests__/seedId.js.map +1 -0
  188. package/lib-es/__tests__/shared_object.d.ts +2 -0
  189. package/lib-es/__tests__/shared_object.d.ts.map +1 -0
  190. package/lib-es/__tests__/shared_object.js +76 -0
  191. package/lib-es/__tests__/shared_object.js.map +1 -0
  192. package/lib-es/index.d.ts +35 -0
  193. package/lib-es/index.d.ts.map +1 -0
  194. package/lib-es/index.js +32 -0
  195. package/lib-es/index.js.map +1 -0
  196. package/lib-es/tlv.d.ts +99 -0
  197. package/lib-es/tlv.d.ts.map +1 -0
  198. package/lib-es/tlv.js +144 -0
  199. package/lib-es/tlv.js.map +1 -0
  200. package/package.json +63 -0
  201. package/src/ApduDevice.ts +692 -0
  202. package/src/BigEndian.ts +25 -0
  203. package/src/CommandBlock.ts +247 -0
  204. package/src/CommandStream.ts +262 -0
  205. package/src/CommandStreamDecoder.ts +142 -0
  206. package/src/CommandStreamEncoder.ts +144 -0
  207. package/src/CommandStreamJsonifier.ts +82 -0
  208. package/src/CommandStreamResolver.ts +284 -0
  209. package/src/Crypto.ts +78 -0
  210. package/src/Device.ts +254 -0
  211. package/src/IndexedTree.ts +80 -0
  212. package/src/NobleCrypto.ts +294 -0
  213. package/src/PublicKey.ts +6 -0
  214. package/src/SeedId.ts +338 -0
  215. package/src/StreamTree.ts +212 -0
  216. package/src/StreamTreeCipher.ts +207 -0
  217. package/src/__tests__/codec.ts +146 -0
  218. package/src/__tests__/crypto.ts +44 -0
  219. package/src/__tests__/indexed_tree.ts +51 -0
  220. package/src/__tests__/key_exchange.ts +167 -0
  221. package/src/__tests__/seedId.ts +120 -0
  222. package/src/__tests__/shared_object.ts +118 -0
  223. package/src/index.ts +43 -0
  224. package/src/tlv.ts +210 -0
  225. package/tsconfig.json +14 -0
@@ -0,0 +1,298 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.to_hex = exports.NobleCryptoSecp256k1 = void 0;
39
+ const secp256k1 = __importStar(require("secp256k1"));
40
+ const ecc = __importStar(require("tiny-secp256k1"));
41
+ const bip32_1 = require("bip32");
42
+ const create_hmac_1 = __importDefault(require("create-hmac"));
43
+ const crypto = __importStar(require("crypto"));
44
+ const bip32 = (0, bip32_1.BIP32Factory)(ecc);
45
+ const AES_BLOCK_SIZE = 16;
46
+ const PRIVATE_KEY_SIZE = 32;
47
+ class NobleCryptoSecp256k1 {
48
+ randomKeypair() {
49
+ return __awaiter(this, void 0, void 0, function* () {
50
+ let pk;
51
+ do {
52
+ pk = crypto.randomBytes(PRIVATE_KEY_SIZE);
53
+ } while (!secp256k1.privateKeyVerify(pk));
54
+ return this.keypairFromSecretKey(pk);
55
+ });
56
+ }
57
+ derivePrivate(xpriv, path) {
58
+ return __awaiter(this, void 0, void 0, function* () {
59
+ const pk = xpriv.slice(0, 32);
60
+ const chainCode = xpriv.slice(32);
61
+ let node = bip32.fromPrivateKey(Buffer.from(pk), Buffer.from(chainCode));
62
+ for (const index of path) {
63
+ node = node.derive(index);
64
+ }
65
+ return {
66
+ publicKey: this.to_array(node.publicKey),
67
+ privateKey: this.to_array(node.privateKey),
68
+ chainCode: this.to_array(node.chainCode),
69
+ };
70
+ });
71
+ }
72
+ keypairFromSecretKey(secretKey) {
73
+ return __awaiter(this, void 0, void 0, function* () {
74
+ return {
75
+ publicKey: secp256k1.publicKeyCreate(secretKey),
76
+ privateKey: secretKey,
77
+ };
78
+ });
79
+ }
80
+ derEncode(R, S) {
81
+ if (R[0] > 0x7f) {
82
+ R = this.concat(new Uint8Array([0x00]), R);
83
+ }
84
+ if (S[0] > 0x7f) {
85
+ S = this.concat(new Uint8Array([0x00]), S);
86
+ }
87
+ R = this.concat(new Uint8Array([0x02, R.length]), R);
88
+ S = this.concat(new Uint8Array([0x02, S.length]), S);
89
+ const prefix = new Uint8Array([0x30, R.length + S.length]);
90
+ return this.concat(prefix, this.concat(R, S));
91
+ }
92
+ derDecode(signature) {
93
+ const R = signature.slice(4, 4 + signature[3]);
94
+ const S = signature.slice(6 + signature[3], 6 + signature[3] + signature[5 + signature[3]]);
95
+ return {
96
+ R: this.enforceLength(R, PRIVATE_KEY_SIZE),
97
+ S: this.enforceLength(S, PRIVATE_KEY_SIZE),
98
+ };
99
+ }
100
+ sign(message, keyPair) {
101
+ return __awaiter(this, void 0, void 0, function* () {
102
+ const signature = secp256k1.ecdsaSign(message, keyPair.privateKey).signature;
103
+ // DER encoding
104
+ return this.derEncode(signature.slice(0, 32), signature.slice(32, 64));
105
+ });
106
+ }
107
+ verify(message, signature, publicKey) {
108
+ return __awaiter(this, void 0, void 0, function* () {
109
+ // DER decoding
110
+ const { R, S } = this.derDecode(signature);
111
+ return secp256k1.ecdsaVerify(this.concat(R, S), message, publicKey);
112
+ });
113
+ }
114
+ to_array(buffer) {
115
+ return new Uint8Array(buffer);
116
+ }
117
+ normalizeKey(key) {
118
+ if (key.length === 32) {
119
+ return key;
120
+ }
121
+ throw new Error("Invalid key length for AES-256 " + `(invalid length is ${key.length})`);
122
+ }
123
+ normalizeNonce(nonce) {
124
+ if (nonce.length < 16) {
125
+ throw new Error("Invalid nonce length (must be 128bits) " + `(invalid length is ${nonce.length})`);
126
+ }
127
+ return nonce.slice(0, 16);
128
+ }
129
+ concat(a, b) {
130
+ const c = new Uint8Array(a.length + b.length);
131
+ c.set(a);
132
+ c.set(b, a.length);
133
+ return c;
134
+ }
135
+ enforceLength(buffer, length) {
136
+ if (buffer.length > length) {
137
+ return buffer.slice(buffer.length - length); // truncate extra bytes from the start
138
+ }
139
+ else if (buffer.length < length) {
140
+ const padded = new Uint8Array(length);
141
+ const start = length - buffer.length;
142
+ padded.set(Array(start).fill(0));
143
+ padded.set(buffer, start);
144
+ return padded;
145
+ }
146
+ return buffer;
147
+ }
148
+ pad(message) {
149
+ // ISO9797M2 implementation
150
+ const padLength = AES_BLOCK_SIZE - (message.length % AES_BLOCK_SIZE);
151
+ if (padLength === AES_BLOCK_SIZE) {
152
+ return message;
153
+ }
154
+ const padding = new Uint8Array(padLength);
155
+ padding[0] = 0x80;
156
+ padding.fill(0, 1);
157
+ return this.concat(message, padding);
158
+ }
159
+ unpad(message) {
160
+ // ISO9797M2 implementation
161
+ for (let i = message.length - 1; i >= 0; i--) {
162
+ if (message[i] === 0x80) {
163
+ return message.slice(0, i);
164
+ }
165
+ if (message[i] !== 0x00) {
166
+ return message;
167
+ }
168
+ }
169
+ throw new Error("Invalid padding");
170
+ }
171
+ encrypt(secret, nonce, message) {
172
+ return __awaiter(this, void 0, void 0, function* () {
173
+ const normalizedSecret = this.normalizeKey(secret);
174
+ const normalizeNonce = this.normalizeNonce(nonce);
175
+ const cipher = crypto.createCipheriv("aes-256-gcm", normalizedSecret, normalizeNonce);
176
+ cipher.setAutoPadding(false);
177
+ let result = cipher.update(this.to_hex(message), "hex", "hex");
178
+ result += cipher.final("hex");
179
+ const bytes = this.from_hex(result);
180
+ return this.concat(bytes, cipher.getAuthTag());
181
+ });
182
+ }
183
+ decrypt(secret, nonce, ciphertext) {
184
+ return __awaiter(this, void 0, void 0, function* () {
185
+ const normalizedSecret = this.normalizeKey(secret);
186
+ const normalizeNonce = this.normalizeNonce(nonce);
187
+ const encryptedData = ciphertext.slice(0, ciphertext.length - AES_BLOCK_SIZE);
188
+ const authTag = ciphertext.slice(encryptedData.length);
189
+ const decipher = crypto.createDecipheriv("aes-256-gcm", normalizedSecret, normalizeNonce);
190
+ decipher.setAuthTag(authTag);
191
+ let result = decipher.update(this.to_hex(encryptedData), "hex", "hex");
192
+ result += decipher.final("hex");
193
+ return this.from_hex(result);
194
+ });
195
+ }
196
+ /**
197
+ * Ledger Live data are encrypted following pattern based on ECIES.
198
+ * For each encryption the Ledger Live instance generates a random keypair over secp256k1 (ephemeral public key)
199
+ * and a 16 bytes IV. Ledger Live then perform an ECDH between the command stream public key and
200
+ * the ephemeral private key to get the encryption key.
201
+ * The data is then encrypted using AES-256-GCM and serialized using the following format:
202
+ 1 byte : Version of the format (0x00)
203
+ 33 bytes : Compressed ephemeral public key
204
+ 16 bytes : Nonce/IV
205
+ 16 bytes : Tag/MAC (from AES-256-GCM)
206
+ variable : Encrypted data
207
+ */
208
+ encryptUserData(commandStreamPrivateKey, data) {
209
+ return __awaiter(this, void 0, void 0, function* () {
210
+ // Generate ephemeral key pair
211
+ const ephemeralKeypair = yield this.randomKeypair();
212
+ // Derive the shared secret using ECDH
213
+ const sharedSecret = yield this.ecdh(yield this.keypairFromSecretKey(commandStreamPrivateKey), ephemeralKeypair.publicKey);
214
+ // Normalize the shared secret to be used as AES key
215
+ const aesKey = yield this.computeSymmetricKey(sharedSecret, new Uint8Array());
216
+ // Generate a random IV (nonce)
217
+ const iv = crypto.randomBytes(16);
218
+ // Encrypt the data using AES-256-GCM
219
+ const cipher = crypto.createCipheriv("aes-256-gcm", aesKey, iv);
220
+ let encryptedData = cipher.update(data);
221
+ encryptedData = Buffer.concat([encryptedData, cipher.final()]);
222
+ const tag = cipher.getAuthTag();
223
+ // Serialize the format
224
+ const result = new Uint8Array(1 + ephemeralKeypair.publicKey.length + iv.length + tag.length + encryptedData.length);
225
+ result[0] = 0x00; // Version of the format
226
+ result.set(ephemeralKeypair.publicKey, 1);
227
+ result.set(iv, 34);
228
+ result.set(tag, 50);
229
+ result.set(encryptedData, 66);
230
+ return result;
231
+ });
232
+ }
233
+ decryptUserData(commandStreamPrivateKey, data) {
234
+ return __awaiter(this, void 0, void 0, function* () {
235
+ const version = data[0];
236
+ if (version !== 0x00) {
237
+ throw new Error("Unsupported format version");
238
+ }
239
+ const ephemeralPublicKey = data.slice(1, 34);
240
+ const iv = data.slice(34, 50);
241
+ const tag = data.slice(50, 66);
242
+ const encryptedData = data.slice(66);
243
+ // Derive the shared secret using ECDH
244
+ const sharedSecret = yield this.ecdh(yield this.keypairFromSecretKey(commandStreamPrivateKey), ephemeralPublicKey);
245
+ // Normalize the shared secret to be used as AES key
246
+ const aesKey = yield this.computeSymmetricKey(sharedSecret, new Uint8Array());
247
+ // Decrypt the data using AES-256-GCM
248
+ const decipher = crypto.createDecipheriv("aes-256-gcm", aesKey, iv);
249
+ decipher.setAuthTag(tag);
250
+ let decryptedData = decipher.update(encryptedData);
251
+ decryptedData = Buffer.concat([decryptedData, decipher.final()]);
252
+ return new Uint8Array(decryptedData.buffer, decryptedData.byteOffset, decryptedData.byteLength);
253
+ });
254
+ }
255
+ randomBytes(size) {
256
+ return __awaiter(this, void 0, void 0, function* () {
257
+ return crypto.randomBytes(size);
258
+ });
259
+ }
260
+ ecdh(keyPair, publicKey) {
261
+ return __awaiter(this, void 0, void 0, function* () {
262
+ const pubkey = Buffer.from(publicKey);
263
+ const privkey = Buffer.from(keyPair.privateKey);
264
+ const point = ecc.pointMultiply(pubkey, privkey, ecc.isPointCompressed(pubkey));
265
+ return point.slice(1);
266
+ });
267
+ }
268
+ computeSymmetricKey(privateKey, extra) {
269
+ return __awaiter(this, void 0, void 0, function* () {
270
+ const digest = (0, create_hmac_1.default)("sha256", Buffer.from(extra)).update(Buffer.from(privateKey)).digest();
271
+ return digest;
272
+ });
273
+ }
274
+ hash(message) {
275
+ return __awaiter(this, void 0, void 0, function* () {
276
+ return crypto.createHash("sha256").update(Buffer.from(message)).digest();
277
+ });
278
+ }
279
+ from_hex(hex) {
280
+ const bytes = new Uint8Array(hex.length / 2);
281
+ for (let i = 0; i < hex.length; i += 2) {
282
+ bytes[i / 2] = parseInt(hex[i] + hex[i + 1], 16);
283
+ }
284
+ return bytes;
285
+ }
286
+ to_hex(bytes) {
287
+ return to_hex(bytes);
288
+ }
289
+ }
290
+ exports.NobleCryptoSecp256k1 = NobleCryptoSecp256k1;
291
+ function to_hex(bytes) {
292
+ if (!bytes) {
293
+ return "";
294
+ }
295
+ return bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), "");
296
+ }
297
+ exports.to_hex = to_hex;
298
+ //# sourceMappingURL=NobleCrypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NobleCrypto.js","sourceRoot":"","sources":["../src/NobleCrypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare class PublicKey {
2
+ publicKey: Uint8Array;
3
+ constructor(publicKey: Uint8Array);
4
+ }
5
+ //# sourceMappingURL=PublicKey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PublicKey.d.ts","sourceRoot":"","sources":["../src/PublicKey.ts"],"names":[],"mappings":"AAAA,qBAAa,SAAS;IACpB,SAAS,EAAE,UAAU,CAAC;gBACV,SAAS,EAAE,UAAU;CAGlC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PublicKey = void 0;
4
+ class PublicKey {
5
+ constructor(publicKey) {
6
+ this.publicKey = publicKey;
7
+ }
8
+ }
9
+ exports.PublicKey = PublicKey;
10
+ //# sourceMappingURL=PublicKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PublicKey.js","sourceRoot":"","sources":["../src/PublicKey.ts"],"names":[],"mappings":";;;AAAA,MAAa,SAAS;IAEpB,YAAY,SAAqB;QAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AALD,8BAKC"}
@@ -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"}
package/lib/SeedId.js ADDED
@@ -0,0 +1,244 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.parseSeedIdResult = exports.Challenge = exports.PubKeyCredential = void 0;
7
+ const BigEndian_1 = __importDefault(require("./BigEndian"));
8
+ const Crypto_1 = require("./Crypto");
9
+ const tlv_1 = require("./tlv");
10
+ class PubKeyCredential {
11
+ constructor({ version, curveId, signAlgorithm, publicKey, }) {
12
+ this.version = version;
13
+ this.curveId = curveId;
14
+ this.signAlgorithm = signAlgorithm;
15
+ this.publicKey = publicKey;
16
+ }
17
+ static fromBytes(data, offset = 0) {
18
+ const view = new DataView(data.buffer, data.byteOffset + offset);
19
+ const version = view.getUint8(0);
20
+ const curveId = view.getUint8(1);
21
+ const signAlgorithm = view.getUint8(2);
22
+ const publicKeyLength = view.getUint8(3);
23
+ const publicKey = new Uint8Array(data.buffer, data.byteOffset + offset + 4, publicKeyLength);
24
+ return [
25
+ new PubKeyCredential({
26
+ version,
27
+ curveId,
28
+ signAlgorithm,
29
+ publicKey,
30
+ }),
31
+ 4 + publicKeyLength,
32
+ ];
33
+ }
34
+ toBytes() {
35
+ const result = new Uint8Array(4 + this.publicKey.length);
36
+ const view = new DataView(result.buffer);
37
+ view.setUint8(0, this.version);
38
+ view.setUint8(1, this.curveId);
39
+ view.setUint8(2, this.signAlgorithm);
40
+ view.setUint8(3, this.publicKey.length);
41
+ result.set(this.publicKey, 4);
42
+ return result;
43
+ }
44
+ toJSON() {
45
+ return {
46
+ version: this.version,
47
+ curveId: this.curveId,
48
+ signAlgorithm: this.signAlgorithm,
49
+ publicKey: Crypto_1.crypto.to_hex(this.publicKey),
50
+ };
51
+ }
52
+ assertValidity() {
53
+ if (this.version !== 0x00) {
54
+ throw new Error(`PubKeyCredential: Wrong version: ${this.version}`);
55
+ }
56
+ if (this.curveId !== 0x21) {
57
+ throw new Error(`PubKeyCredential: Wrong curve id: ${this.curveId}`);
58
+ }
59
+ if (this.signAlgorithm !== 0x01) {
60
+ throw new Error(`PubKeyCredential: Wrong sign algorithm: ${this.signAlgorithm}`);
61
+ }
62
+ if (this.publicKey.length !== 0x21) {
63
+ throw new Error(`PubKeyCredential: Wrong pubkey len: ${this.publicKey.length}`);
64
+ }
65
+ }
66
+ }
67
+ exports.PubKeyCredential = PubKeyCredential;
68
+ class Challenge {
69
+ constructor({ payloadType, version, protocolVersion, challengeData, challengeExpiry, host, rpCredential, rpSignature, }) {
70
+ this.payloadType = payloadType;
71
+ this.version = version;
72
+ this.protocolVersion = protocolVersion;
73
+ this.challengeData = challengeData;
74
+ this.challengeExpiry = challengeExpiry;
75
+ this.host = host;
76
+ this.rpCredential = rpCredential;
77
+ this.rpSignature = rpSignature;
78
+ }
79
+ static fromBytes(data, offset = 0) {
80
+ let index = offset;
81
+ const all = tlv_1.TLV.readAllTLV(data, offset);
82
+ const byType = {};
83
+ for (const tlv of all) {
84
+ index += tlv.value.length + 2;
85
+ byType[tlv.type] = tlv.value;
86
+ // console.log(tlv.type.toString(16), "(" + tlv.value.length + ")", crypto.to_hex(tlv.value));
87
+ }
88
+ const payloadTypeField = byType[0x01];
89
+ if (payloadTypeField === undefined) {
90
+ throw new Error("Missing payloadType");
91
+ }
92
+ const payloadType = payloadTypeField[0];
93
+ const versionField = byType[0x02];
94
+ if (versionField === undefined) {
95
+ throw new Error("Missing version");
96
+ }
97
+ const version = versionField[0];
98
+ const protocolVersionField = byType[0x60];
99
+ if (protocolVersionField === undefined) {
100
+ throw new Error("Missing protocolVersion");
101
+ }
102
+ const protocolVersion = {
103
+ major: protocolVersionField[0],
104
+ minor: protocolVersionField[1],
105
+ patch: protocolVersionField[2],
106
+ };
107
+ const challengeDataField = byType[0x12];
108
+ if (challengeDataField === undefined) {
109
+ throw new Error("Missing challengeData");
110
+ }
111
+ const challengeData = challengeDataField;
112
+ const challengeExpiryField = byType[0x16];
113
+ if (challengeExpiryField === undefined) {
114
+ throw new Error("Missing challengeExpiry");
115
+ }
116
+ const challengeExpiry = new Date(1000 * BigEndian_1.default.arrayToNumber(challengeExpiryField));
117
+ const hostField = byType[0x20];
118
+ if (hostField === undefined) {
119
+ throw new Error("Missing host");
120
+ }
121
+ const host = new TextDecoder().decode(hostField);
122
+ const signAlgorithmField = byType[0x14];
123
+ if (signAlgorithmField === undefined) {
124
+ throw new Error("Missing signAlgorithm");
125
+ }
126
+ const signAlgorithm = signAlgorithmField[0];
127
+ const publicKey = byType[0x33];
128
+ if (publicKey === undefined) {
129
+ throw new Error("Missing rpCredential");
130
+ }
131
+ const curveIdField = byType[0x32];
132
+ if (curveIdField === undefined) {
133
+ throw new Error("Missing curveId");
134
+ }
135
+ const curveId = curveIdField[0];
136
+ const rpCredential = new PubKeyCredential({
137
+ version,
138
+ curveId,
139
+ signAlgorithm,
140
+ publicKey,
141
+ });
142
+ const rpSignatureField = byType[0x15];
143
+ if (rpSignatureField === undefined) {
144
+ throw new Error("Missing rpSignature");
145
+ }
146
+ const rpSignature = rpSignatureField;
147
+ const challenge = new Challenge({
148
+ payloadType,
149
+ protocolVersion,
150
+ version,
151
+ challengeData,
152
+ challengeExpiry,
153
+ host,
154
+ rpCredential,
155
+ rpSignature,
156
+ });
157
+ return [challenge, index - offset];
158
+ }
159
+ toBytes() {
160
+ let buffer = new Uint8Array();
161
+ buffer = tlv_1.TLV.pushTLV(buffer, 0x01, 1, new Uint8Array([this.payloadType]));
162
+ buffer = tlv_1.TLV.pushTLV(buffer, 0x02, 1, new Uint8Array([this.version]));
163
+ buffer = tlv_1.TLV.pushTLV(buffer, 0x12, this.challengeData.length, this.challengeData);
164
+ buffer = tlv_1.TLV.pushTLV(buffer, 0x14, 1, new Uint8Array([this.rpCredential.signAlgorithm]));
165
+ buffer = tlv_1.TLV.pushTLV(buffer, 0x15, this.rpSignature.length, this.rpSignature);
166
+ buffer = tlv_1.TLV.pushTLV(buffer, 0x16, 4, BigEndian_1.default.numberToArray(this.getChallengeExpireValue()));
167
+ buffer = tlv_1.TLV.pushTLV(buffer, 0x20, this.host.length, new TextEncoder().encode(this.host));
168
+ buffer = tlv_1.TLV.pushTLV(buffer, 0x32, 1, new Uint8Array([this.rpCredential.curveId]));
169
+ buffer = tlv_1.TLV.pushTLV(buffer, 0x33, this.rpCredential.publicKey.length, this.rpCredential.publicKey);
170
+ const data = this.getProtocolVersionData();
171
+ buffer = tlv_1.TLV.pushTLV(buffer, 0x60, data.length, data);
172
+ return buffer;
173
+ }
174
+ getUnsignedTLV() {
175
+ let buffer = new Uint8Array();
176
+ buffer = tlv_1.TLV.pushTLV(buffer, 0x01, 1, new Uint8Array([this.payloadType]));
177
+ buffer = tlv_1.TLV.pushTLV(buffer, 0x02, 1, new Uint8Array([this.version]));
178
+ buffer = tlv_1.TLV.pushTLV(buffer, 0x12, this.challengeData.length, this.challengeData);
179
+ buffer = tlv_1.TLV.pushTLV(buffer, 0x16, 4, BigEndian_1.default.numberToArray(this.getChallengeExpireValue()));
180
+ buffer = tlv_1.TLV.pushTLV(buffer, 0x20, this.host.length, new TextEncoder().encode(this.host));
181
+ const data = this.getProtocolVersionData();
182
+ buffer = tlv_1.TLV.pushTLV(buffer, 0x60, data.length, data);
183
+ return buffer;
184
+ }
185
+ toJSON() {
186
+ return {
187
+ payloadType: this.payloadType,
188
+ version: this.version,
189
+ protocolVersion: this.protocolVersion,
190
+ challenge: {
191
+ data: Crypto_1.crypto.to_hex(this.challengeData),
192
+ expiry: this.challengeExpiry.toISOString(),
193
+ },
194
+ host: this.host,
195
+ rp: [
196
+ {
197
+ credential: this.rpCredential.toJSON(),
198
+ signature: Crypto_1.crypto.to_hex(this.rpSignature),
199
+ },
200
+ ],
201
+ };
202
+ }
203
+ getProtocolVersionData() {
204
+ return new Uint8Array([
205
+ this.protocolVersion.major,
206
+ this.protocolVersion.minor,
207
+ this.protocolVersion.patch,
208
+ 0,
209
+ ]);
210
+ }
211
+ getChallengeExpireValue() {
212
+ return Math.floor(this.challengeExpiry.getTime() / 1000);
213
+ }
214
+ }
215
+ exports.Challenge = Challenge;
216
+ function parseSeedIdResult(result) {
217
+ let offset = 0;
218
+ const [pubkeyCredential, pubkeyCredentialLength] = PubKeyCredential.fromBytes(result, offset);
219
+ pubkeyCredential.assertValidity();
220
+ offset += pubkeyCredentialLength;
221
+ const signatureLen = result[offset];
222
+ offset += 1;
223
+ const signature = new Uint8Array(result.buffer, result.byteOffset + offset, signatureLen);
224
+ offset += signatureLen;
225
+ const attestationResult = new Uint8Array(result.slice(offset));
226
+ const attestationType = result[offset];
227
+ offset += 1;
228
+ const [attestationPubkeyCredential, attestationPubkeyCredentialLength] = PubKeyCredential.fromBytes(result, offset);
229
+ attestationPubkeyCredential.assertValidity();
230
+ offset += attestationPubkeyCredentialLength;
231
+ const attestationLen = result[offset];
232
+ offset += 1;
233
+ const attestation = new Uint8Array(result.buffer, result.byteOffset + offset, attestationLen);
234
+ return {
235
+ pubkeyCredential,
236
+ signature,
237
+ attestationType,
238
+ attestationPubkeyCredential,
239
+ attestation,
240
+ attestationResult,
241
+ };
242
+ }
243
+ exports.parseSeedIdResult = parseSeedIdResult;
244
+ //# sourceMappingURL=SeedId.js.map