@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,267 @@
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 * as secp256k1 from "secp256k1";
11
+ import * as ecc from "tiny-secp256k1";
12
+ import { BIP32Factory } from "bip32";
13
+ import hmac from "create-hmac";
14
+ import * as crypto from "crypto";
15
+ const bip32 = BIP32Factory(ecc);
16
+ const AES_BLOCK_SIZE = 16;
17
+ const PRIVATE_KEY_SIZE = 32;
18
+ export class NobleCryptoSecp256k1 {
19
+ randomKeypair() {
20
+ return __awaiter(this, void 0, void 0, function* () {
21
+ let pk;
22
+ do {
23
+ pk = crypto.randomBytes(PRIVATE_KEY_SIZE);
24
+ } while (!secp256k1.privateKeyVerify(pk));
25
+ return this.keypairFromSecretKey(pk);
26
+ });
27
+ }
28
+ derivePrivate(xpriv, path) {
29
+ return __awaiter(this, void 0, void 0, function* () {
30
+ const pk = xpriv.slice(0, 32);
31
+ const chainCode = xpriv.slice(32);
32
+ let node = bip32.fromPrivateKey(Buffer.from(pk), Buffer.from(chainCode));
33
+ for (const index of path) {
34
+ node = node.derive(index);
35
+ }
36
+ return {
37
+ publicKey: this.to_array(node.publicKey),
38
+ privateKey: this.to_array(node.privateKey),
39
+ chainCode: this.to_array(node.chainCode),
40
+ };
41
+ });
42
+ }
43
+ keypairFromSecretKey(secretKey) {
44
+ return __awaiter(this, void 0, void 0, function* () {
45
+ return {
46
+ publicKey: secp256k1.publicKeyCreate(secretKey),
47
+ privateKey: secretKey,
48
+ };
49
+ });
50
+ }
51
+ derEncode(R, S) {
52
+ if (R[0] > 0x7f) {
53
+ R = this.concat(new Uint8Array([0x00]), R);
54
+ }
55
+ if (S[0] > 0x7f) {
56
+ S = this.concat(new Uint8Array([0x00]), S);
57
+ }
58
+ R = this.concat(new Uint8Array([0x02, R.length]), R);
59
+ S = this.concat(new Uint8Array([0x02, S.length]), S);
60
+ const prefix = new Uint8Array([0x30, R.length + S.length]);
61
+ return this.concat(prefix, this.concat(R, S));
62
+ }
63
+ derDecode(signature) {
64
+ const R = signature.slice(4, 4 + signature[3]);
65
+ const S = signature.slice(6 + signature[3], 6 + signature[3] + signature[5 + signature[3]]);
66
+ return {
67
+ R: this.enforceLength(R, PRIVATE_KEY_SIZE),
68
+ S: this.enforceLength(S, PRIVATE_KEY_SIZE),
69
+ };
70
+ }
71
+ sign(message, keyPair) {
72
+ return __awaiter(this, void 0, void 0, function* () {
73
+ const signature = secp256k1.ecdsaSign(message, keyPair.privateKey).signature;
74
+ // DER encoding
75
+ return this.derEncode(signature.slice(0, 32), signature.slice(32, 64));
76
+ });
77
+ }
78
+ verify(message, signature, publicKey) {
79
+ return __awaiter(this, void 0, void 0, function* () {
80
+ // DER decoding
81
+ const { R, S } = this.derDecode(signature);
82
+ return secp256k1.ecdsaVerify(this.concat(R, S), message, publicKey);
83
+ });
84
+ }
85
+ to_array(buffer) {
86
+ return new Uint8Array(buffer);
87
+ }
88
+ normalizeKey(key) {
89
+ if (key.length === 32) {
90
+ return key;
91
+ }
92
+ throw new Error("Invalid key length for AES-256 " + `(invalid length is ${key.length})`);
93
+ }
94
+ normalizeNonce(nonce) {
95
+ if (nonce.length < 16) {
96
+ throw new Error("Invalid nonce length (must be 128bits) " + `(invalid length is ${nonce.length})`);
97
+ }
98
+ return nonce.slice(0, 16);
99
+ }
100
+ concat(a, b) {
101
+ const c = new Uint8Array(a.length + b.length);
102
+ c.set(a);
103
+ c.set(b, a.length);
104
+ return c;
105
+ }
106
+ enforceLength(buffer, length) {
107
+ if (buffer.length > length) {
108
+ return buffer.slice(buffer.length - length); // truncate extra bytes from the start
109
+ }
110
+ else if (buffer.length < length) {
111
+ const padded = new Uint8Array(length);
112
+ const start = length - buffer.length;
113
+ padded.set(Array(start).fill(0));
114
+ padded.set(buffer, start);
115
+ return padded;
116
+ }
117
+ return buffer;
118
+ }
119
+ pad(message) {
120
+ // ISO9797M2 implementation
121
+ const padLength = AES_BLOCK_SIZE - (message.length % AES_BLOCK_SIZE);
122
+ if (padLength === AES_BLOCK_SIZE) {
123
+ return message;
124
+ }
125
+ const padding = new Uint8Array(padLength);
126
+ padding[0] = 0x80;
127
+ padding.fill(0, 1);
128
+ return this.concat(message, padding);
129
+ }
130
+ unpad(message) {
131
+ // ISO9797M2 implementation
132
+ for (let i = message.length - 1; i >= 0; i--) {
133
+ if (message[i] === 0x80) {
134
+ return message.slice(0, i);
135
+ }
136
+ if (message[i] !== 0x00) {
137
+ return message;
138
+ }
139
+ }
140
+ throw new Error("Invalid padding");
141
+ }
142
+ encrypt(secret, nonce, message) {
143
+ return __awaiter(this, void 0, void 0, function* () {
144
+ const normalizedSecret = this.normalizeKey(secret);
145
+ const normalizeNonce = this.normalizeNonce(nonce);
146
+ const cipher = crypto.createCipheriv("aes-256-gcm", normalizedSecret, normalizeNonce);
147
+ cipher.setAutoPadding(false);
148
+ let result = cipher.update(this.to_hex(message), "hex", "hex");
149
+ result += cipher.final("hex");
150
+ const bytes = this.from_hex(result);
151
+ return this.concat(bytes, cipher.getAuthTag());
152
+ });
153
+ }
154
+ decrypt(secret, nonce, ciphertext) {
155
+ return __awaiter(this, void 0, void 0, function* () {
156
+ const normalizedSecret = this.normalizeKey(secret);
157
+ const normalizeNonce = this.normalizeNonce(nonce);
158
+ const encryptedData = ciphertext.slice(0, ciphertext.length - AES_BLOCK_SIZE);
159
+ const authTag = ciphertext.slice(encryptedData.length);
160
+ const decipher = crypto.createDecipheriv("aes-256-gcm", normalizedSecret, normalizeNonce);
161
+ decipher.setAuthTag(authTag);
162
+ let result = decipher.update(this.to_hex(encryptedData), "hex", "hex");
163
+ result += decipher.final("hex");
164
+ return this.from_hex(result);
165
+ });
166
+ }
167
+ /**
168
+ * Ledger Live data are encrypted following pattern based on ECIES.
169
+ * For each encryption the Ledger Live instance generates a random keypair over secp256k1 (ephemeral public key)
170
+ * and a 16 bytes IV. Ledger Live then perform an ECDH between the command stream public key and
171
+ * the ephemeral private key to get the encryption key.
172
+ * The data is then encrypted using AES-256-GCM and serialized using the following format:
173
+ 1 byte : Version of the format (0x00)
174
+ 33 bytes : Compressed ephemeral public key
175
+ 16 bytes : Nonce/IV
176
+ 16 bytes : Tag/MAC (from AES-256-GCM)
177
+ variable : Encrypted data
178
+ */
179
+ encryptUserData(commandStreamPrivateKey, data) {
180
+ return __awaiter(this, void 0, void 0, function* () {
181
+ // Generate ephemeral key pair
182
+ const ephemeralKeypair = yield this.randomKeypair();
183
+ // Derive the shared secret using ECDH
184
+ const sharedSecret = yield this.ecdh(yield this.keypairFromSecretKey(commandStreamPrivateKey), ephemeralKeypair.publicKey);
185
+ // Normalize the shared secret to be used as AES key
186
+ const aesKey = yield this.computeSymmetricKey(sharedSecret, new Uint8Array());
187
+ // Generate a random IV (nonce)
188
+ const iv = crypto.randomBytes(16);
189
+ // Encrypt the data using AES-256-GCM
190
+ const cipher = crypto.createCipheriv("aes-256-gcm", aesKey, iv);
191
+ let encryptedData = cipher.update(data);
192
+ encryptedData = Buffer.concat([encryptedData, cipher.final()]);
193
+ const tag = cipher.getAuthTag();
194
+ // Serialize the format
195
+ const result = new Uint8Array(1 + ephemeralKeypair.publicKey.length + iv.length + tag.length + encryptedData.length);
196
+ result[0] = 0x00; // Version of the format
197
+ result.set(ephemeralKeypair.publicKey, 1);
198
+ result.set(iv, 34);
199
+ result.set(tag, 50);
200
+ result.set(encryptedData, 66);
201
+ return result;
202
+ });
203
+ }
204
+ decryptUserData(commandStreamPrivateKey, data) {
205
+ return __awaiter(this, void 0, void 0, function* () {
206
+ const version = data[0];
207
+ if (version !== 0x00) {
208
+ throw new Error("Unsupported format version");
209
+ }
210
+ const ephemeralPublicKey = data.slice(1, 34);
211
+ const iv = data.slice(34, 50);
212
+ const tag = data.slice(50, 66);
213
+ const encryptedData = data.slice(66);
214
+ // Derive the shared secret using ECDH
215
+ const sharedSecret = yield this.ecdh(yield this.keypairFromSecretKey(commandStreamPrivateKey), ephemeralPublicKey);
216
+ // Normalize the shared secret to be used as AES key
217
+ const aesKey = yield this.computeSymmetricKey(sharedSecret, new Uint8Array());
218
+ // Decrypt the data using AES-256-GCM
219
+ const decipher = crypto.createDecipheriv("aes-256-gcm", aesKey, iv);
220
+ decipher.setAuthTag(tag);
221
+ let decryptedData = decipher.update(encryptedData);
222
+ decryptedData = Buffer.concat([decryptedData, decipher.final()]);
223
+ return new Uint8Array(decryptedData.buffer, decryptedData.byteOffset, decryptedData.byteLength);
224
+ });
225
+ }
226
+ randomBytes(size) {
227
+ return __awaiter(this, void 0, void 0, function* () {
228
+ return crypto.randomBytes(size);
229
+ });
230
+ }
231
+ ecdh(keyPair, publicKey) {
232
+ return __awaiter(this, void 0, void 0, function* () {
233
+ const pubkey = Buffer.from(publicKey);
234
+ const privkey = Buffer.from(keyPair.privateKey);
235
+ const point = ecc.pointMultiply(pubkey, privkey, ecc.isPointCompressed(pubkey));
236
+ return point.slice(1);
237
+ });
238
+ }
239
+ computeSymmetricKey(privateKey, extra) {
240
+ return __awaiter(this, void 0, void 0, function* () {
241
+ const digest = hmac("sha256", Buffer.from(extra)).update(Buffer.from(privateKey)).digest();
242
+ return digest;
243
+ });
244
+ }
245
+ hash(message) {
246
+ return __awaiter(this, void 0, void 0, function* () {
247
+ return crypto.createHash("sha256").update(Buffer.from(message)).digest();
248
+ });
249
+ }
250
+ from_hex(hex) {
251
+ const bytes = new Uint8Array(hex.length / 2);
252
+ for (let i = 0; i < hex.length; i += 2) {
253
+ bytes[i / 2] = parseInt(hex[i] + hex[i + 1], 16);
254
+ }
255
+ return bytes;
256
+ }
257
+ to_hex(bytes) {
258
+ return to_hex(bytes);
259
+ }
260
+ }
261
+ export function to_hex(bytes) {
262
+ if (!bytes) {
263
+ return "";
264
+ }
265
+ return bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), "");
266
+ }
267
+ //# 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,6 @@
1
+ export class PublicKey {
2
+ constructor(publicKey) {
3
+ this.publicKey = publicKey;
4
+ }
5
+ }
6
+ //# sourceMappingURL=PublicKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PublicKey.js","sourceRoot":"","sources":["../src/PublicKey.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,SAAS;IAEpB,YAAY,SAAqB;QAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF"}
@@ -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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"}