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