@ledgerhq/hw-app-exchange 0.16.0 → 0.17.0-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 (42) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/package.json +6 -6
  3. package/lib/Exchange.integ.test.d.ts +0 -2
  4. package/lib/Exchange.integ.test.d.ts.map +0 -1
  5. package/lib/Exchange.integ.test.js +0 -458
  6. package/lib/Exchange.integ.test.js.map +0 -1
  7. package/lib/Exchange.test.d.ts +0 -2
  8. package/lib/Exchange.test.d.ts.map +0 -1
  9. package/lib/Exchange.test.js +0 -341
  10. package/lib/Exchange.test.js.map +0 -1
  11. package/lib/ReturnCode.test.d.ts +0 -2
  12. package/lib/ReturnCode.test.d.ts.map +0 -1
  13. package/lib/ReturnCode.test.js +0 -21
  14. package/lib/ReturnCode.test.js.map +0 -1
  15. package/lib/SellUtils.test.d.ts +0 -2
  16. package/lib/SellUtils.test.d.ts.map +0 -1
  17. package/lib/SellUtils.test.js +0 -32
  18. package/lib/SellUtils.test.js.map +0 -1
  19. package/lib/SwapUtils.test.d.ts +0 -2
  20. package/lib/SwapUtils.test.d.ts.map +0 -1
  21. package/lib/SwapUtils.test.js +0 -34
  22. package/lib/SwapUtils.test.js.map +0 -1
  23. package/lib-es/Exchange.integ.test.d.ts +0 -2
  24. package/lib-es/Exchange.integ.test.d.ts.map +0 -1
  25. package/lib-es/Exchange.integ.test.js +0 -453
  26. package/lib-es/Exchange.integ.test.js.map +0 -1
  27. package/lib-es/Exchange.test.d.ts +0 -2
  28. package/lib-es/Exchange.test.d.ts.map +0 -1
  29. package/lib-es/Exchange.test.js +0 -313
  30. package/lib-es/Exchange.test.js.map +0 -1
  31. package/lib-es/ReturnCode.test.d.ts +0 -2
  32. package/lib-es/ReturnCode.test.d.ts.map +0 -1
  33. package/lib-es/ReturnCode.test.js +0 -19
  34. package/lib-es/ReturnCode.test.js.map +0 -1
  35. package/lib-es/SellUtils.test.d.ts +0 -2
  36. package/lib-es/SellUtils.test.d.ts.map +0 -1
  37. package/lib-es/SellUtils.test.js +0 -30
  38. package/lib-es/SellUtils.test.js.map +0 -1
  39. package/lib-es/SwapUtils.test.d.ts +0 -2
  40. package/lib-es/SwapUtils.test.d.ts.map +0 -1
  41. package/lib-es/SwapUtils.test.js +0 -32
  42. package/lib-es/SwapUtils.test.js.map +0 -1
@@ -1,453 +0,0 @@
1
- import bippath from "bip32-path";
2
- import SpeculosTransportHttp from "@ledgerhq/hw-transport-node-speculos-http";
3
- import Exchange from "./Exchange";
4
- import { randomBytes, subtle } from "crypto";
5
- import { secp256k1 } from "@noble/curves/secp256k1";
6
- import protobuf from "protobufjs";
7
- import BigNumber from "bignumber.js";
8
- describe("Check Exchange until payload signature", () => {
9
- let transport;
10
- beforeAll(async () => {
11
- transport = await SpeculosTransportHttp.open({});
12
- });
13
- afterAll(async () => {
14
- transport.close();
15
- });
16
- describe("Check SWAP", () => {
17
- it("Legacy SWAP", async () => {
18
- // Given
19
- const exchange = new Exchange(transport, 0 /* ExchangeTypes.Swap */);
20
- // When
21
- const transactionId = await exchange.startNewTransaction();
22
- // Then
23
- expect(transactionId).toEqual(expect.any(String));
24
- expect(transactionId).toHaveLength(10);
25
- const { partnerInfo, partnerSigned, partnerPrivKey } = await appExchangeDatasetTest(legacySignFormat);
26
- await exchange.setPartnerKey(partnerInfo);
27
- await exchange.checkPartner(partnerSigned);
28
- const amount = new BigNumber(100000);
29
- const amountToWallet = new BigNumber(1000);
30
- const encodedPayload = await generateSwapPayloadProtobuf({
31
- payinAddress: "0xd692Cb1346262F584D17B4B470954501f6715a82",
32
- refundAddress: "0xDad77910DbDFdE764fC21FCD4E74D71bBACA6D8D",
33
- payoutAddress: "bc1qer57ma0fzhqys2cmydhuj9cprf9eg0nw922a8j",
34
- currencyFrom: "ETH",
35
- currencyTo: "BTC",
36
- amountToProvider: Buffer.from(amount.toString(16), "hex"),
37
- amountToWallet: Buffer.from(amountToWallet.toString(16), "hex"),
38
- deviceTransactionId: transactionId,
39
- });
40
- const estimatedFees = new BigNumber(0);
41
- await exchange.processTransaction(encodedPayload, estimatedFees);
42
- const payloadSignature = await signMessage(encodedPayload, partnerPrivKey, "der");
43
- await exchange.checkTransactionSignature(payloadSignature);
44
- });
45
- it("NG SWAP", async () => {
46
- // Given
47
- const exchange = new Exchange(transport, 3 /* ExchangeTypes.SwapNg */);
48
- // When
49
- const transactionId = await exchange.startNewTransaction();
50
- // Then
51
- expect(transactionId).toEqual(expect.any(String));
52
- expect(transactionId).toHaveLength(64);
53
- const { partnerInfo, partnerSigned, partnerPrivKey } = await appExchangeDatasetTest(ngSignFormat);
54
- await exchange.setPartnerKey(partnerInfo);
55
- await exchange.checkPartner(partnerSigned);
56
- const amount = new BigNumber(100_000);
57
- const amountToWallet = new BigNumber(100_000_000_000);
58
- let encodedPayload = await generateSwapPayloadProtobuf({
59
- payinAddress: "0xd692Cb1346262F584D17B4B470954501f6715a82",
60
- refundAddress: "0xDad77910DbDFdE764fC21FCD4E74D71bBACA6D8D",
61
- payoutAddress: "bc1qer57ma0fzhqys2cmydhuj9cprf9eg0nw922a8j",
62
- currencyFrom: "ETH",
63
- currencyTo: "BTC",
64
- amountToProvider: Buffer.from(amount.toString(16), "hex"),
65
- amountToWallet: Buffer.from(amountToWallet.toString(16), "hex"),
66
- deviceTransactionIdNg: Buffer.from(transactionId.padStart(32, "0"), "hex"),
67
- });
68
- encodedPayload = convertToJWSPayload(encodedPayload);
69
- const estimatedFees = new BigNumber(0);
70
- await exchange.processTransaction(encodedPayload, estimatedFees, "jws");
71
- const payloadSignature = await signMessage(encodedPayload, partnerPrivKey, "rs");
72
- await exchange.checkTransactionSignature(payloadSignature);
73
- });
74
- it("NG SWAP with more than 255 bytes in process transaction", async () => {
75
- // Given
76
- const exchange = new Exchange(transport, 3 /* ExchangeTypes.SwapNg */);
77
- // When
78
- const transactionId = await exchange.startNewTransaction();
79
- // Then
80
- expect(transactionId).toEqual(expect.any(String));
81
- expect(transactionId).toHaveLength(64);
82
- const { partnerInfo, partnerSigned, partnerPrivKey } = await appExchangeDatasetTest(ngSignFormat);
83
- await exchange.setPartnerKey(partnerInfo);
84
- await exchange.checkPartner(partnerSigned);
85
- const amount = new BigNumber(100_000);
86
- const amountToWallet = new BigNumber(100_000_000_000);
87
- // Extra properties have a limited size of 20 (i.e. app-exchange/src/proto/protocol.options)
88
- let encodedPayload = await generateSwapPayloadProtobuf({
89
- payinAddress: "0xd692Cb1346262F584D17B4B470954501f6715a82",
90
- payinExtraId: '{ extraInfo: "Go" }',
91
- refundAddress: "0xDad77910DbDFdE764fC21FCD4E74D71bBACA6D8D",
92
- refundExtraId: '{ extraInfo: "Go" }',
93
- payoutAddress: "bc1qer57ma0fzhqys2cmydhuj9cprf9eg0nw922a8j",
94
- payoutExtraId: "bc1qer57ma0fzhqys2c",
95
- currencyFrom: "ETH",
96
- currencyTo: "BTC",
97
- amountToProvider: Buffer.from(amount.toString(16), "hex"),
98
- amountToWallet: Buffer.from(amountToWallet.toString(16), "hex"),
99
- deviceTransactionIdNg: Buffer.from(transactionId.padStart(32, "0"), "hex"),
100
- });
101
- encodedPayload = convertToJWSPayload(encodedPayload);
102
- const estimatedFees = new BigNumber(0);
103
- await exchange.processTransaction(encodedPayload, estimatedFees, "jws");
104
- console.log("DEBUG - SWAP partner encoded payload:", encodedPayload.toString("hex"));
105
- const payloadSignature = await signMessage(encodedPayload, partnerPrivKey, "rs");
106
- console.log("DEBUG - SWAP partner payload signature:", Buffer.from(payloadSignature).toString("hex"));
107
- await exchange.checkTransactionSignature(payloadSignature);
108
- });
109
- it("NG SWAP with prepared data", async () => {
110
- // Given
111
- const exchange = new Exchange(transport, 3 /* ExchangeTypes.SwapNg */);
112
- // When
113
- const transactionId = await exchange.startNewTransaction();
114
- // Then
115
- expect(transactionId).toEqual(expect.any(String));
116
- expect(transactionId).toHaveLength(64);
117
- const { partnerInfo, partnerSigned, apdu } = await appExchangeDataset(ngSignFormat);
118
- await exchange.setPartnerKey(partnerInfo);
119
- console.log("DEBUG - Swap partner APDU:", apdu.toString("hex"));
120
- console.log("DEBUG - Swap partner signed:", Buffer.from(partnerSigned).toString("hex"));
121
- await exchange.checkPartner(partnerSigned);
122
- const encodedPayload = Buffer.from(".CipiYzFxYXIwc3Jycjd4Zmt2eTVsNjQzbHlkbnc5cmU1OWd0enp3ZjVtZHEaKmJjMXFhcjBzcnJyN3hma3Z5NWw2NDNseWRudzlyZTU5Z3R6endmNHRlcSoqMHhiNzk0ZjVlYTBiYTM5NDk0Y2U4Mzk2MTNmZmZiYTc0Mjc5NTc5MjY4OgNCVENCA0JBVEoCBH5SBgV0-95gAGIgNQrqDJf3R_HQ92CBRhSkdSOAGxrrfQvLuqKk9Gv4GEs=");
123
- const estimatedFees = new BigNumber(0);
124
- await exchange.processTransaction(encodedPayload, estimatedFees, "jws");
125
- console.log("DEBUG - SWAP partner encoded payload:", encodedPayload.toString("hex"));
126
- // const payloadSignature = await signMessage(encodedPayload, partnerPrivKey, "rs");
127
- const payloadSignature = Buffer.from("zGcNUYKM8sLxvT7zPU1C8vrMmanVlUroELnAeil4weo1LCk0zUBRse5-3Acv7I7II90xVTIxm26BnxRbZvVmTQ==", "base64url");
128
- console.log("DEBUG - SWAP partner payload signature:", Buffer.from(payloadSignature).toString("hex"));
129
- await exchange.checkTransactionSignature(payloadSignature);
130
- });
131
- it("NG SWAP with TON", async () => {
132
- // Given
133
- const exchange = new Exchange(transport, 3 /* ExchangeTypes.SwapNg */);
134
- // When
135
- const transactionId = await exchange.startNewTransaction();
136
- // Then
137
- expect(transactionId).toEqual(expect.any(String));
138
- expect(transactionId).toHaveLength(64);
139
- const { partnerInfo, partnerSigned, apdu, partnerPrivKey } = await appExchangeDatasetTest(ngSignFormat);
140
- await exchange.setPartnerKey(partnerInfo);
141
- console.log("DEBUG - Swap partner APDU:", apdu.toString("hex"));
142
- console.log("DEBUG - Swap partner signed:", Buffer.from(partnerSigned).toString("hex"));
143
- await exchange.checkPartner(partnerSigned);
144
- const amount = new BigNumber(100);
145
- const amountToWallet = new BigNumber(1_000);
146
- // Extra properties have a limited size of 20 (i.e. app-exchange/src/proto/protocol.options)
147
- let encodedPayload = await generateSwapPayloadProtobuf({
148
- payinAddress: "UQAbvs2tCnsTWxCZX7JW-dqlk0vM8x_m8aJqF4wwRWGtTEZD",
149
- refundAddress: "UQAbvs2tCnsTWxCZX7JW-dqlk0vM8x_m8aJqF4wwRWGtTEZD",
150
- payoutAddress: "0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3",
151
- // payinAddress: "UQCa_2bcwBt5eH9gOMgHC497nyfjgSl8hGpZ90O7B17WHA==",
152
- // refundAddress: "UQCa_2bcwBt5eH9gOMgHC497nyfjgSl8hGpZ90O7B17WHA==",
153
- // payoutAddress: "0xDad77910DbDFdE764fC21FCD4E74D71bBACA6D8D",
154
- currencyFrom: "TON",
155
- currencyTo: "ETH",
156
- amountToProvider: Buffer.from(amount.toString(16), "hex"),
157
- amountToWallet: Buffer.from(amountToWallet.toString(16), "hex"),
158
- deviceTransactionIdNg: Buffer.from(transactionId.padStart(32, "0"), "hex"),
159
- });
160
- encodedPayload = convertToJWSPayload(encodedPayload);
161
- const estimatedFees = new BigNumber(0);
162
- await exchange.processTransaction(encodedPayload, estimatedFees, "jws");
163
- console.log("DEBUG - SWAP partner encoded payload:", encodedPayload.toString("hex"));
164
- const payloadSignature = await signMessage(encodedPayload, partnerPrivKey, "rs");
165
- console.log("DEBUG - SWAP partner payload signature:", Buffer.from(payloadSignature).toString("hex"));
166
- await exchange.checkTransactionSignature(payloadSignature);
167
- const configEth = {
168
- config: Buffer.from("0345544808457468657265756d050345544812", "hex"),
169
- signature: Buffer.from("3044022065d7931ab3144362d57e3fdcc5de921fb65024737d917f0ab1f8b173d1ed3c2e022027493568d112dc53c7177f8e5fc915d91a903780a067badf109085a73d360323", "hex"),
170
- };
171
- let addressParameters = bip32asBuffer("44'/60'/0'/0/0");
172
- await exchange.validatePayoutOrAsset(configEth.config, configEth.signature, addressParameters);
173
- const delay = (milliseconds) => {
174
- return new Promise(resolve => {
175
- setTimeout(resolve, milliseconds);
176
- });
177
- };
178
- await delay(500);
179
- const configTon = {
180
- config: Buffer.from("03544f4e03544f4e00", "hex"),
181
- signature: Buffer.from("3045022100b35be5d1ad0d71572b5f3d72b40766521d5492fad6ed54289a64488bec3344a902205b522b7b8c7c800826bcd0bda092e84db5d1c23f6061c8b57c8efb3641d243a7", "hex"),
182
- };
183
- addressParameters = bip32asBuffer("44'/607'/0'/0'/0'/0'");
184
- await exchange.checkRefundAddress(configTon.config, configTon.signature, addressParameters);
185
- });
186
- });
187
- describe("Check SELL", () => {
188
- it("NG Sell", async () => {
189
- // Given
190
- const exchange = new Exchange(transport, 4 /* ExchangeTypes.SellNg */);
191
- // When
192
- const transactionId = await exchange.startNewTransaction();
193
- // Then
194
- expect(transactionId).toEqual(expect.any(String));
195
- expect(transactionId).toHaveLength(64);
196
- const { partnerInfo, partnerSigned, partnerPrivKey, apdu } = await appExchangeSellDataset(ngSignFormat);
197
- await exchange.setPartnerKey(partnerInfo);
198
- console.log("DEBUG - Sell partner pubkey:", partnerInfo.publicKey.toString("hex"));
199
- console.log("DEBUG - Sell partner APDU:", apdu.toString("hex"));
200
- console.log("DEBUG - Sell partner signed:", Buffer.from(partnerSigned).toString("hex"));
201
- await exchange.checkPartner(partnerSigned);
202
- const amount = new BigNumber(100_000);
203
- let encodedPayload = await generateSellPayloadProtobuf({
204
- traderEmail: "test@ledger.fr",
205
- inCurrency: "ETH",
206
- inAmount: Buffer.from(amount.toString(16), "hex"),
207
- inAddress: "0xd692Cb1346262F584D17B4B470954501f6715a82",
208
- outCurrency: "EUR",
209
- outAmount: {
210
- coefficient: Buffer.from("1", "hex"),
211
- exponent: 1,
212
- },
213
- deviceTransactionId: Buffer.from(transactionId.padStart(32, "0"), "hex"),
214
- });
215
- encodedPayload = convertToJWSPayload(encodedPayload);
216
- const estimatedFees = new BigNumber(0);
217
- await exchange.processTransaction(encodedPayload, estimatedFees, "jws");
218
- console.log("DEBUG - SELL partner encoded payload:", encodedPayload.toString("hex"));
219
- const payloadSignature = await signMessage(encodedPayload, partnerPrivKey, "rs");
220
- console.log("DEBUG - SELL partner payload signature:", Buffer.from(payloadSignature).toString("hex"));
221
- await exchange.checkTransactionSignature(payloadSignature);
222
- });
223
- });
224
- });
225
- describe("Test internal sign and verification functionality", () => {
226
- describe("With Ledger keys", () => {
227
- const privKey = Buffer.from("b1ed47ef58f782e2bc4d5abe70ef66d9009c2957967017054470e0f3e10f5833", "hex");
228
- const pubKey = Buffer.from("0420da62003c0ce097e33644a10fe4c30454069a4454f0fa9d4e84f45091429b5220af9e35c0b2d9289380137307de4dd1d418428cf21a93b33561bb09d88fe579", "hex");
229
- test("simple signature", async () => {
230
- // Given
231
- const msg = "Something important to cipher";
232
- // When
233
- const sig = await signMessage(Buffer.from(msg), privKey, "rs");
234
- console.log("DEBUG - Test internal: message signature", Buffer.from(sig).toString("hex"));
235
- // Then
236
- const hashBuffer = await subtle.digest("SHA-256", Buffer.from(msg));
237
- const hash = new Uint8Array(hashBuffer);
238
- expect(secp256k1.verify(sig, hash, pubKey)).toBeTruthy();
239
- });
240
- test("APDU signature generated by this test suite", async () => {
241
- // Given
242
- const msg = "0953454c4c5f54455354000478d5facdae2305f48795d3ce7d9244f5060d2f800901da5746d1f4177ae8d7bbe63f3870efc0d36af8f91962811e1d8d9df91ce3b3ea2cd9f550c7d465f8b7b3";
243
- // When
244
- const sig = Buffer.from("30440220471b035b40dafa095d615998c82202b2bd00fb45670b828f1dda3b68e5b24cc3022022a1c64d02b8c14e1e4cc2d05b00234642c11db3d4461ff5366f5af337cf0ced", "hex");
245
- // Then
246
- const hashBuffer = await subtle.digest("SHA-256", Buffer.from(msg, "hex"));
247
- const hash = new Uint8Array(hashBuffer);
248
- expect(secp256k1.verify(convertSignatureFromDER(sig), hash, pubKey, { prehash: false })).toBeTruthy();
249
- });
250
- test("APDU signature generated by external tool", async () => {
251
- // Given
252
- // {"name":"TEST_PROVIDER","payloadSignatureComputedFormat":"jws","publicKey":{"curve":"secp256r1","data":"047c13debdb9e1afac5a82bbe78da6dca98a2e59af8a9a3f827acb8ed325c79a6c5749eff65d4e3470bd2995def771f45426c58eada7227d536feeffb58fa71c24"},"service":{"appVersion":2,"name":"swap"},"signature":"3045022072e6773318af531e478c40f53815d2fa0a1c06c49519bb693ff234662fb6558802210083ab26162da41d3c429dd10051f565440576193031eb0590a9ea200af987f062"}
253
- const msg = "0d544553545f50524f564944455201047c13debdb9e1afac5a82bbe78da6dca98a2e59af8a9a3f827acb8ed325c79a6c5749eff65d4e3470bd2995def771f45426c58eada7227d536feeffb58fa71c24";
254
- const apdu = ngSignFormat({
255
- name: "TEST_PROVIDER",
256
- curve: "secp256r1",
257
- publicKey: Buffer.from("047c13debdb9e1afac5a82bbe78da6dca98a2e59af8a9a3f827acb8ed325c79a6c5749eff65d4e3470bd2995def771f45426c58eada7227d536feeffb58fa71c24", "hex"),
258
- // signatureComputedFormat?: PayloadSignatureComputedFormat;
259
- });
260
- console.log("DEBUG - Test internal: expected APDU to sign\t", apdu.toString("hex"));
261
- console.log("DEBUG - Test internal: APDU to sign\t", msg);
262
- // When
263
- // const sig = Buffer.from(
264
- // "3045022068e5971fdad78583e7bb28adac09212108966fd2ed4f8ad206499bca59f0ad12022100aed715d306f772524b805dd4f91afc79b4bda1a14f91d90ea78739e05461d6c7",
265
- // "hex",
266
- // );
267
- const sig = await signMessage(Buffer.from(msg, "hex"), LEDGER_FAKE_PRIVATE_KEY, "der");
268
- console.log("DEBUG - Test internal: message signature", Buffer.from(sig).toString("hex"));
269
- // Then
270
- const hashBuffer = await subtle.digest("SHA-256", Buffer.from(msg, "hex"));
271
- const hash = new Uint8Array(hashBuffer);
272
- expect(secp256k1.verify(convertSignatureFromDER(sig), hash, pubKey, { prehash: false })).toBeTruthy();
273
- });
274
- test("APDU signature already validated", async () => {
275
- // Given
276
- const msg = legacySignFormat({
277
- name: "Coinify",
278
- curve: "secp256r1",
279
- publicKey: Buffer.from("044f22668f5f321d3784266c932a2a3141c3ec196ddd51f42cf975267eda23d3a8b02170e4c5c70536e7d03ba4e66ee3e1f9d65e772d3217871a830a7cf60da366", "hex"),
280
- // signatureComputedFormat?: PayloadSignatureComputedFormat;
281
- });
282
- console.log("DEBUG - Test internal: APDU to sign", msg.toString("hex"));
283
- // When
284
- const sig = Buffer.from("30450221008e8b2172ddd48e196dbff81ebe8aebc4ec0988f72de1b02da202f3a8d8f33f9c02205273c1d426aeb460fd36a27696aafda68bdff4139886f29e558895ea85527749", "hex");
285
- // const sig = await signMessage(Buffer.from(msg, "hex"), LEDGER_FAKE_PRIVATE_KEY, "der");
286
- console.log("DEBUG - Test internal: message signature", Buffer.from(sig).toString("hex"));
287
- // Then
288
- const hashBuffer = await subtle.digest("SHA-256", msg);
289
- const hash = new Uint8Array(hashBuffer);
290
- expect(secp256k1.verify(convertSignatureFromDER(sig), hash, pubKey, { prehash: false })).toBeTruthy();
291
- });
292
- });
293
- describe("With SELL keys", () => {
294
- const privKey = Buffer.from("308f6a5369aea611d89abf937d0ffaf0b43b457d42cbf0cf754786b3088f17ae", "hex");
295
- const pubKey = Buffer.from("0478d5facdae2305f48795d3ce7d9244f5060d2f800901da5746d1f4177ae8d7bbe63f3870efc0d36af8f91962811e1d8d9df91ce3b3ea2cd9f550c7d465f8b7b3", "hex");
296
- test("SELL private and public K1 key pair", async () => {
297
- // Given
298
- const msg = "Something important to cipher";
299
- // When
300
- const sig = await signMessage(Buffer.from(msg), privKey, "rs");
301
- console.log("DEBUG - Test internal: message signature", Buffer.from(sig).toString("hex"));
302
- // Then
303
- const hashBuffer = await subtle.digest("SHA-256", Buffer.from(msg));
304
- const hash = new Uint8Array(hashBuffer);
305
- expect(secp256k1.verify(sig, hash, pubKey)).toBeTruthy();
306
- });
307
- test("SELL verify payload signature", async () => {
308
- // Given
309
- const msg = "2e436735305a584e305147786c5a47646c6369356d636849445256524947674959616949714d48686b4e6a6b79513249784d7a51324d6a5979526a55344e4551784e304930516a51334d446b314e4455774d5759324e7a4531595467794b674e465656497942416f41454145364944554b366779583930667830506467675559557048556a674273613633304c79377169705052722d42684c";
310
- // When
311
- const sig = Buffer.from("348e938ce75c06da9a27652c2af6146b4581f948c600b4f7093743e8af256d172324131dcc852f068d0bd20afd0c8444bc635e9520d3a29cab7ff7c27dc8b782", "hex");
312
- console.log("DEBUG - Test internal: message signature", Buffer.from(sig).toString("hex"));
313
- // Then
314
- const hashBuffer = await subtle.digest("SHA-256", Buffer.from(msg, "hex"));
315
- const hash = new Uint8Array(hashBuffer);
316
- expect(secp256k1.verify(sig, hash, pubKey)).toBeTruthy();
317
- });
318
- });
319
- });
320
- // Those information comes from dataset test of app-exchange (i.e. check signing_authority.py file).
321
- // The public key is bundle with DEBUG version of app-exchange.
322
- const LEDGER_FAKE_PRIVATE_KEY = Buffer.from("b1ed47ef58f782e2bc4d5abe70ef66d9009c2957967017054470e0f3e10f5833", "hex");
323
- const legacySignFormat = (info) => {
324
- return Buffer.concat([
325
- Buffer.from([info.name.length]),
326
- Buffer.from(info.name, "ascii"),
327
- info.publicKey,
328
- ]);
329
- };
330
- const curves = {
331
- secp256k1: 0x00,
332
- secp256r1: 0x01,
333
- };
334
- const ngSignFormat = (info) => {
335
- return Buffer.concat([
336
- Buffer.from([info.name.length]),
337
- Buffer.from(info.name, "ascii"),
338
- Buffer.from([curves[info.curve]]),
339
- info.publicKey,
340
- ]);
341
- };
342
- async function appExchangeDatasetTest(signFormat) {
343
- // Generate random provider key
344
- let privKey;
345
- do {
346
- privKey = randomBytes(32);
347
- } while (!secp256k1.utils.isValidPrivateKey(privKey));
348
- // The expected public should not be compressed and be a full 64 length (with R and S)
349
- const isCompressed = false;
350
- const pubKey = secp256k1.getPublicKey(privKey, isCompressed);
351
- const partnerInfo = {
352
- name: "SWAP_TEST",
353
- curve: "secp256k1",
354
- publicKey: Buffer.from(pubKey),
355
- };
356
- const msg = signFormat(partnerInfo);
357
- const sig = await signMessage(msg, LEDGER_FAKE_PRIVATE_KEY, "der");
358
- return {
359
- partnerInfo,
360
- apdu: msg,
361
- partnerSigned: sig,
362
- partnerPrivKey: privKey,
363
- };
364
- }
365
- async function appExchangeDataset(signFormat) {
366
- const pubKey = Buffer.from("0478d5facdae2305f48795d3ce7d9244f5060d2f800901da5746d1f4177ae8d7bbe63f3870efc0d36af8f91962811e1d8d9df91ce3b3ea2cd9f550c7d465f8b7b3", "hex");
367
- // Verify public key by trying to create Point from it
368
- secp256k1.ProjectivePoint.fromHex(pubKey);
369
- const partnerInfo = {
370
- name: "SWAP_TEST",
371
- curve: "secp256k1",
372
- publicKey: Buffer.from(pubKey),
373
- };
374
- const msg = signFormat(partnerInfo);
375
- const sig = await signMessage(msg, LEDGER_FAKE_PRIVATE_KEY, "der");
376
- return {
377
- partnerInfo,
378
- apdu: msg,
379
- partnerSigned: sig,
380
- };
381
- }
382
- async function appExchangeSellDataset(signFormat) {
383
- const privKey = Buffer.from("308f6a5369aea611d89abf937d0ffaf0b43b457d42cbf0cf754786b3088f17ae", "hex");
384
- const pubKey = Buffer.from("0478d5facdae2305f48795d3ce7d9244f5060d2f800901da5746d1f4177ae8d7bbe63f3870efc0d36af8f91962811e1d8d9df91ce3b3ea2cd9f550c7d465f8b7b3", "hex");
385
- // Verify public key by trying to create Point from it
386
- secp256k1.ProjectivePoint.fromHex(pubKey);
387
- const partnerInfo = {
388
- name: "SELL_TEST",
389
- curve: "secp256k1",
390
- publicKey: pubKey,
391
- };
392
- const msg = signFormat(partnerInfo);
393
- const sig = await signMessage(msg, LEDGER_FAKE_PRIVATE_KEY, "der");
394
- return {
395
- partnerInfo,
396
- apdu: msg,
397
- partnerSigned: sig,
398
- partnerPrivKey: privKey,
399
- };
400
- }
401
- async function generateSwapPayloadProtobuf(payload) {
402
- const root = await protobuf.load("protocol.proto");
403
- const TransactionResponse = root.lookupType("ledger_swap.NewTransactionResponse");
404
- const err = TransactionResponse.verify(payload);
405
- if (err) {
406
- throw Error(err);
407
- }
408
- const message = TransactionResponse.create(payload);
409
- const messageEncoded = TransactionResponse.encode(message).finish();
410
- return Buffer.from(messageEncoded);
411
- }
412
- async function generateSellPayloadProtobuf(payload) {
413
- const root = await protobuf.load("protocol.proto");
414
- const SellResponse = root.lookupType("ledger_swap.NewSellResponse");
415
- const err = SellResponse.verify(payload);
416
- if (err) {
417
- throw Error(err);
418
- }
419
- const message = SellResponse.create(payload);
420
- const messageEncoded = SellResponse.encode(message).finish();
421
- return Buffer.from(messageEncoded);
422
- }
423
- // Sign message in ECDSA-SHA256 with secp256k1 curve and returnsa DER format signature
424
- async function signMessage(message, privKey, sigFormat) {
425
- const hashBuffer = await subtle.digest("SHA-256", message);
426
- const hash = new Uint8Array(hashBuffer);
427
- const signature = secp256k1.sign(hash, privKey, { prehash: false });
428
- const sig = signature.toCompactRawBytes();
429
- if (sigFormat === "der") {
430
- return convertSignatureToDER(sig);
431
- }
432
- return Buffer.from(sig);
433
- }
434
- function convertSignatureToDER(sig) {
435
- return Buffer.from(secp256k1.Signature.fromCompact(sig).toDERRawBytes());
436
- }
437
- // Convert raw buffer to a JWS compatible one: '.'+base64Url(raw)
438
- function convertToJWSPayload(raw) {
439
- return Buffer.from("." + raw.toString("base64url"));
440
- }
441
- function convertSignatureFromDER(sig) {
442
- return Buffer.from(secp256k1.Signature.fromDER(sig).toCompactRawBytes());
443
- }
444
- function bip32asBuffer(path) {
445
- const pathElements = !path ? [] : bippath.fromString(path).toPathArray();
446
- const buffer = Buffer.alloc(1 + pathElements.length * 4);
447
- buffer[0] = pathElements.length;
448
- pathElements.forEach((element, index) => {
449
- buffer.writeUInt32BE(element, 1 + 4 * index);
450
- });
451
- return buffer;
452
- }
453
- //# sourceMappingURL=Exchange.integ.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Exchange.integ.test.js","sourceRoot":"","sources":["../src/Exchange.integ.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=Exchange.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Exchange.test.d.ts","sourceRoot":"","sources":["../src/Exchange.test.ts"],"names":[],"mappings":""}