@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.
- package/CHANGELOG.md +11 -0
- package/package.json +6 -6
- package/lib/Exchange.integ.test.d.ts +0 -2
- package/lib/Exchange.integ.test.d.ts.map +0 -1
- package/lib/Exchange.integ.test.js +0 -458
- package/lib/Exchange.integ.test.js.map +0 -1
- package/lib/Exchange.test.d.ts +0 -2
- package/lib/Exchange.test.d.ts.map +0 -1
- package/lib/Exchange.test.js +0 -341
- package/lib/Exchange.test.js.map +0 -1
- package/lib/ReturnCode.test.d.ts +0 -2
- package/lib/ReturnCode.test.d.ts.map +0 -1
- package/lib/ReturnCode.test.js +0 -21
- package/lib/ReturnCode.test.js.map +0 -1
- package/lib/SellUtils.test.d.ts +0 -2
- package/lib/SellUtils.test.d.ts.map +0 -1
- package/lib/SellUtils.test.js +0 -32
- package/lib/SellUtils.test.js.map +0 -1
- package/lib/SwapUtils.test.d.ts +0 -2
- package/lib/SwapUtils.test.d.ts.map +0 -1
- package/lib/SwapUtils.test.js +0 -34
- package/lib/SwapUtils.test.js.map +0 -1
- package/lib-es/Exchange.integ.test.d.ts +0 -2
- package/lib-es/Exchange.integ.test.d.ts.map +0 -1
- package/lib-es/Exchange.integ.test.js +0 -453
- package/lib-es/Exchange.integ.test.js.map +0 -1
- package/lib-es/Exchange.test.d.ts +0 -2
- package/lib-es/Exchange.test.d.ts.map +0 -1
- package/lib-es/Exchange.test.js +0 -313
- package/lib-es/Exchange.test.js.map +0 -1
- package/lib-es/ReturnCode.test.d.ts +0 -2
- package/lib-es/ReturnCode.test.d.ts.map +0 -1
- package/lib-es/ReturnCode.test.js +0 -19
- package/lib-es/ReturnCode.test.js.map +0 -1
- package/lib-es/SellUtils.test.d.ts +0 -2
- package/lib-es/SellUtils.test.d.ts.map +0 -1
- package/lib-es/SellUtils.test.js +0 -30
- package/lib-es/SellUtils.test.js.map +0 -1
- package/lib-es/SwapUtils.test.d.ts +0 -2
- package/lib-es/SwapUtils.test.d.ts.map +0 -1
- package/lib-es/SwapUtils.test.js +0 -32
- 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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Exchange.test.d.ts","sourceRoot":"","sources":["../src/Exchange.test.ts"],"names":[],"mappings":""}
|