Skip to content
This repository has been archived by the owner on Jul 7, 2021. It is now read-only.

test(ark): add ledger tests #226

Merged
merged 1 commit into from
May 14, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 95 additions & 0 deletions packages/platform-sdk-ark/__tests__/__fixtures__/ledger.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
export const ledger = {
appVersion: {
record: `
=> e006000000
<= 000200019000
`,
result: "2.0.1",
},
bip44: {
path: "44'/111'/0'/0/0",
},
publicKey: {
// Ledger-Transport v1.0.5 has incorrect P2.
// >1.0.5 will be:
// - `e002000015058000002c8000006f800000000000000000000000`
record: `
=> e002004015058000002c8000006f800000000000000000000000
<= 21034151a3ec46b5670a682b0a63394f863587d1bc97483b1b6c70eb58e7f0aed1929000
`,
result: "034151a3ec46b5670a682b0a63394f863587d1bc97483b1b6c70eb58e7f0aed192",
},
transaction: {
ecdsa: {
record: `
=> e004804071058000002c8000006f800000000000000000000000ff0217010000000000010000000000000003a02b9d5fdd1307c2ee4652ba54d492d1fd11a7d1bb3f3a44c4a05e79f19de933809698000000000000a08601000000000000000000171dfc69b54c7fe901e91d5a9ab78388645e2427ea
<= 304402202869100c9e7f6dc7c6289b5fe5b21aeb3c9ab164bfa5af8894cef1e17d51b65f02201e88b69379496fc75d7d65a44d3978994f332cab614a8fdcb83fd9872b408bdb9000
`,
payload:
"ff0217010000000000010000000000000003a02b9d5fdd1307c2ee4652ba54d492d1fd11a7d1bb3f3a44c4a05e79f19de933809698000000000000a08601000000000000000000171dfc69b54c7fe901e91d5a9ab78388645e2427ea",
result:
"304402202869100c9e7f6dc7c6289b5fe5b21aeb3c9ab164bfa5af8894cef1e17d51b65f02201e88b69379496fc75d7d65a44d3978994f332cab614a8fdcb83fd9872b408bdb",
},
// Ledger-Transport v1.0.5 does not support Schnorr.
// >1.0.5 will be:
// - "=> e0040050ff058000002c8000006f800000000000000000000000ff0217010000000400020000000000000003b593aa66b53525c5399b4af5a4f583dede1c2a46176c6796a7284ee9c0a1167f0094357700000000000210037eaa8cb236c40a08fcb9d6220743ee6ae1b5c40e8a77a38f286516c3ff6639010301fd417566397113ba8c55de2f093a572744ed1829b37b56a129058000ef7bce0209d3c0f68994253cee24b23df3266ba1f0ca2f0666cd69a46544d63001cdf150037eaa8cb236c40a08fcb9d6220743ee6ae1b5c40e8a77a38f286516c3ff6639010301fd417566397113ba8c55de2f093a572744ed1829b37b56a129058000ef7bce0209d3c0f6899425\n<= 9000\n=> e0040150ff3cee24b23df3266ba1f0ca2f0666cd69a46544d63001cdf150037eaa8cb236c40a08fcb9d6220743ee6ae1b5c40e8a77a38f286516c3ff6639010301fd417566397113ba8c55de2f093a572744ed1829b37b56a129058000ef7bce0209d3c0f68994253cee24b23df3266ba1f0ca2f0666cd69a46544d63001cdf150037eaa8cb236c40a08fcb9d6220743ee6ae1b5c40e8a77a38f286516c3ff6639010301fd417566397113ba8c55de2f093a572744ed1829b37b56a129058000ef7bce0209d3c0f68994253cee24b23df3266ba1f0ca2f0666cd69a46544d63001cdf150037eaa8cb236c40a08fcb9d6220743ee6ae1b5c40e8a77a38f286516c3ff6639\n<= 9000\n=> e0040150ff01037eaa8cb236c40a08fcb9d6220743ee6ae1b5c40e8a77a38f286516c3ff6639010301fd417566397113ba8c55de2f093a572744ed1829b37b56a129058000ef7bce0209d3c0f68994253cee24b23df3266ba1f0ca2f0666cd69a46544d63001cdf150004495d593cfb8be3293e2473acf504870d2dcf71dbee7620270e136ed63c5eef259099d225f7866178968f0c3581509d92d902914674c8f86b99eb55aaa97586e0171d86f3f6552b237dd81272a7b0da7718c4d26682255223dcf1928174082ce72b07218162938c674afe741119650135338eb3da159e0626ddab6b7851882e08b02d44d9bde77c9ea02d3516ab3263a77f4f9fbb90c30b47eba\n<= 9000\n=> e0040150ff7a8bb87325edeb78dd69f914f28426e6ff661c4bc001f253130f4e7eb092a9131c8ca69dbfaff32f034495d593cfb8be3293e2473acf504870d2dcf71dbee7620270e136ed63c5eef259099d225f7866178968f0c3581509d92d902914674c8f86b99eb55aaa97586e0471d86f3f6552b237dd81272a7b0da7718c4d26682255223dcf1928174082ce72b07218162938c674afe741119650135338eb3da159e0626ddab6b7851882e08b05d44d9bde77c9ea02d3516ab3263a77f4f9fbb90c30b47eba7a8bb87325edeb78dd69f914f28426e6ff661c4bc001f253130f4e7eb092a9131c8ca69dbfaff32f064495d593cfb8be3293e2473acf504870d2dcf7\n<= 9000\n=> e0040150ff1dbee7620270e136ed63c5eef259099d225f7866178968f0c3581509d92d902914674c8f86b99eb55aaa97586e0771d86f3f6552b237dd81272a7b0da7718c4d26682255223dcf1928174082ce72b07218162938c674afe741119650135338eb3da159e0626ddab6b7851882e08b08d44d9bde77c9ea02d3516ab3263a77f4f9fbb90c30b47eba7a8bb87325edeb78dd69f914f28426e6ff661c4bc001f253130f4e7eb092a9131c8ca69dbfaff32f094495d593cfb8be3293e2473acf504870d2dcf71dbee7620270e136ed63c5eef259099d225f7866178968f0c3581509d92d902914674c8f86b99eb55aaa97586e0a71d86f3f6552b237dd81272a7b0d\n<= 9000\n=> e0040150ffa7718c4d26682255223dcf1928174082ce72b07218162938c674afe741119650135338eb3da159e0626ddab6b7851882e08b0bd44d9bde77c9ea02d3516ab3263a77f4f9fbb90c30b47eba7a8bb87325edeb78dd69f914f28426e6ff661c4bc001f253130f4e7eb092a9131c8ca69dbfaff32f0c4495d593cfb8be3293e2473acf504870d2dcf71dbee7620270e136ed63c5eef259099d225f7866178968f0c3581509d92d902914674c8f86b99eb55aaa97586e0d4495d593cfb8be3293e2473acf504870d2dcf71dbee7620270e136ed63c5eef259099d225f7866178968f0c3581509d92d902914674c8f86b99eb55aaa97586e0e71d86f3f6552b237dd\n<= 9000\n=> e00481507881272a7b0da7718c4d26682255223dcf1928174082ce72b07218162938c674afe741119650135338eb3da159e0626ddab6b7851882e08b0fd44d9bde77c9ea02d3516ab3263a77f4f9fbb90c30b47eba7a8bb87325edeb78dd69f914f28426e6ff661c4bc001f253130f4e7eb092a9131c8ca69dbfaff32f\n<= 4f6f3fc62e2c9b5672f878c8e5034332bd300b2216820747a4344154ef62210977e3fc6654efcb6ea97bad2ce7ecebeb2f6c6e85f04a55861414dbf360fa76339000"
// - "ff0217010000000400020000000000000003b593aa66b53525c5399b4af5a4f583dede1c2a46176c6796a7284ee9c0a1167f0094357700000000000210037eaa8cb236c40a08fcb9d6220743ee6ae1b5c40e8a77a38f286516c3ff6639010301fd417566397113ba8c55de2f093a572744ed1829b37b56a129058000ef7bce0209d3c0f68994253cee24b23df3266ba1f0ca2f0666cd69a46544d63001cdf150037eaa8cb236c40a08fcb9d6220743ee6ae1b5c40e8a77a38f286516c3ff6639010301fd417566397113ba8c55de2f093a572744ed1829b37b56a129058000ef7bce0209d3c0f68994253cee24b23df3266ba1f0ca2f0666cd69a46544d63001cdf150037eaa8cb236c40a08fcb9d6220743ee6ae1b5c40e8a77a38f286516c3ff6639010301fd417566397113ba8c55de2f093a572744ed1829b37b56a129058000ef7bce0209d3c0f68994253cee24b23df3266ba1f0ca2f0666cd69a46544d63001cdf150037eaa8cb236c40a08fcb9d6220743ee6ae1b5c40e8a77a38f286516c3ff6639010301fd417566397113ba8c55de2f093a572744ed1829b37b56a129058000ef7bce0209d3c0f68994253cee24b23df3266ba1f0ca2f0666cd69a46544d63001cdf150037eaa8cb236c40a08fcb9d6220743ee6ae1b5c40e8a77a38f286516c3ff663901037eaa8cb236c40a08fcb9d6220743ee6ae1b5c40e8a77a38f286516c3ff6639010301fd417566397113ba8c55de2f093a572744ed1829b37b56a129058000ef7bce0209d3c0f68994253cee24b23df3266ba1f0ca2f0666cd69a46544d63001cdf150004495d593cfb8be3293e2473acf504870d2dcf71dbee7620270e136ed63c5eef259099d225f7866178968f0c3581509d92d902914674c8f86b99eb55aaa97586e0171d86f3f6552b237dd81272a7b0da7718c4d26682255223dcf1928174082ce72b07218162938c674afe741119650135338eb3da159e0626ddab6b7851882e08b02d44d9bde77c9ea02d3516ab3263a77f4f9fbb90c30b47eba7a8bb87325edeb78dd69f914f28426e6ff661c4bc001f253130f4e7eb092a9131c8ca69dbfaff32f034495d593cfb8be3293e2473acf504870d2dcf71dbee7620270e136ed63c5eef259099d225f7866178968f0c3581509d92d902914674c8f86b99eb55aaa97586e0471d86f3f6552b237dd81272a7b0da7718c4d26682255223dcf1928174082ce72b07218162938c674afe741119650135338eb3da159e0626ddab6b7851882e08b05d44d9bde77c9ea02d3516ab3263a77f4f9fbb90c30b47eba7a8bb87325edeb78dd69f914f28426e6ff661c4bc001f253130f4e7eb092a9131c8ca69dbfaff32f064495d593cfb8be3293e2473acf504870d2dcf71dbee7620270e136ed63c5eef259099d225f7866178968f0c3581509d92d902914674c8f86b99eb55aaa97586e0771d86f3f6552b237dd81272a7b0da7718c4d26682255223dcf1928174082ce72b07218162938c674afe741119650135338eb3da159e0626ddab6b7851882e08b08d44d9bde77c9ea02d3516ab3263a77f4f9fbb90c30b47eba7a8bb87325edeb78dd69f914f28426e6ff661c4bc001f253130f4e7eb092a9131c8ca69dbfaff32f094495d593cfb8be3293e2473acf504870d2dcf71dbee7620270e136ed63c5eef259099d225f7866178968f0c3581509d92d902914674c8f86b99eb55aaa97586e0a71d86f3f6552b237dd81272a7b0da7718c4d26682255223dcf1928174082ce72b07218162938c674afe741119650135338eb3da159e0626ddab6b7851882e08b0bd44d9bde77c9ea02d3516ab3263a77f4f9fbb90c30b47eba7a8bb87325edeb78dd69f914f28426e6ff661c4bc001f253130f4e7eb092a9131c8ca69dbfaff32f0c4495d593cfb8be3293e2473acf504870d2dcf71dbee7620270e136ed63c5eef259099d225f7866178968f0c3581509d92d902914674c8f86b99eb55aaa97586e0d4495d593cfb8be3293e2473acf504870d2dcf71dbee7620270e136ed63c5eef259099d225f7866178968f0c3581509d92d902914674c8f86b99eb55aaa97586e0e71d86f3f6552b237dd81272a7b0da7718c4d26682255223dcf1928174082ce72b07218162938c674afe741119650135338eb3da159e0626ddab6b7851882e08b0fd44d9bde77c9ea02d3516ab3263a77f4f9fbb90c30b47eba7a8bb87325edeb78dd69f914f28426e6ff661c4bc001f253130f4e7eb092a9131c8ca69dbfaff32f"
// - "4f6f3fc62e2c9b5672f878c8e5034332bd300b2216820747a4344154ef62210977e3fc6654efcb6ea97bad2ce7ecebeb2f6c6e85f04a55861414dbf360fa7633"
schnorr: {
record: `
=> e004804071058000002c8000006f800000000000000000000000ff0217010000000000010000000000000003a02b9d5fdd1307c2ee4652ba54d492d1fd11a7d1bb3f3a44c4a05e79f19de933809698000000000000a08601000000000000000000171dfc69b54c7fe901e91d5a9ab78388645e2427ea
<= 304402202869100c9e7f6dc7c6289b5fe5b21aeb3c9ab164bfa5af8894cef1e17d51b65f02201e88b69379496fc75d7d65a44d3978994f332cab614a8fdcb83fd9872b408bdb9000
`,
payload:
"ff0217010000000000010000000000000003a02b9d5fdd1307c2ee4652ba54d492d1fd11a7d1bb3f3a44c4a05e79f19de933809698000000000000a08601000000000000000000171dfc69b54c7fe901e91d5a9ab78388645e2427ea",
result:
"304402202869100c9e7f6dc7c6289b5fe5b21aeb3c9ab164bfa5af8894cef1e17d51b65f02201e88b69379496fc75d7d65a44d3978994f332cab614a8fdcb83fd9872b408bdb",
},
},
message: {
// Ledger-Transport v1.0.5 splits payloads incorrectly.
// >1.0.5 will be:
// record: `
// => e0080040ff058000002c8000006f800000000000000000000000416c6c2070617274732073686f756c6420676f20746f67657468657220776974686f757420666f7263696e672e20596f75206d7573742072656d656d62657220746861742074686520706172747320796f7520617265207265617373656d626c696e67207765726520646973617373656d626c656420627920796f752e205468657265666f72652c20696620796f752063616e277420676574207468656d20746f67657468657220616761696e2c207468657265206d757374206265206120726561736f6e2e20427920616c6c206d65616e732c20646f206e6f742075736520612068616d6d65722e20
// <= 9000
// => e0088140157e2049424d204d616e75616c202d20283139373529
// <= 304402202458b0765f6183c25799eacbaa1e1edba4c76453c84fdf0eb5d67d32010ef87f022061bbb21d056a401e3d99d34dbf92a45b5449a2a2ef3ccc93068b887f11f3956c9000
// `,
// payload: "416c6c2070617274732073686f756c6420676f20746f67657468657220776974686f757420666f7263696e672e20596f75206d7573742072656d656d62657220746861742074686520706172747320796f7520617265207265617373656d626c696e67207765726520646973617373656d626c656420627920796f752e205468657265666f72652c20696620796f752063616e277420676574207468656d20746f67657468657220616761696e2c207468657265206d757374206265206120726561736f6e2e20427920616c6c206d65616e732c20646f206e6f742075736520612068616d6d65722e207e2049424d204d616e75616c202d20283139373529",
// result: "304402202458b0765f6183c25799eacbaa1e1edba4c76453c84fdf0eb5d67d32010ef87f022061bbb21d056a401e3d99d34dbf92a45b5449a2a2ef3ccc93068b887f11f3956c",
ecdsa: {
record: `
=> e0080040fe058000002c8000006f800000000000000000000000416c6c2070617274732073686f756c6420676f20746f67657468657220776974686f757420666f7263696e672e20596f75206d7573742072656d656d62657220746861742074686520706172747320796f7520617265207265617373656d626c696e67207765726520646973617373656d626c656420627920796f752e205468657265666f72652c20696620796f752063616e277420676574207468656d20746f67657468657220616761696e2c207468657265206d757374206265206120726561736f6e2e20427920616c6c206d65616e732c20646f206e6f742075736520612068616d6d65722e
<= 9000
=> e008814016207e2049424d204d616e75616c202d20283139373529
<= 304402202458b0765f6183c25799eacbaa1e1edba4c76453c84fdf0eb5d67d32010ef87f022061bbb21d056a401e3d99d34dbf92a45b5449a2a2ef3ccc93068b887f11f3956c9000
`,
payload:
"416c6c2070617274732073686f756c6420676f20746f67657468657220776974686f757420666f7263696e672e20596f75206d7573742072656d656d62657220746861742074686520706172747320796f7520617265207265617373656d626c696e67207765726520646973617373656d626c656420627920796f752e205468657265666f72652c20696620796f752063616e277420676574207468656d20746f67657468657220616761696e2c207468657265206d757374206265206120726561736f6e2e20427920616c6c206d65616e732c20646f206e6f742075736520612068616d6d65722e207e2049424d204d616e75616c202d20283139373529",
result:
"304402202458b0765f6183c25799eacbaa1e1edba4c76453c84fdf0eb5d67d32010ef87f022061bbb21d056a401e3d99d34dbf92a45b5449a2a2ef3ccc93068b887f11f3956c",
},
// Ledger-Transport v1.0.5 splits payloads incorrectly and does not support Schnorr.
// >1.0.5 will be:
// record: `
// => e0080050ff058000002c8000006f800000000000000000000000416c6c2070617274732073686f756c6420676f20746f67657468657220776974686f757420666f7263696e672e20596f75206d7573742072656d656d62657220746861742074686520706172747320796f7520617265207265617373656d626c696e67207765726520646973617373656d626c656420627920796f752e205468657265666f72652c20696620796f752063616e277420676574207468656d20746f67657468657220616761696e2c207468657265206d757374206265206120726561736f6e2e20427920616c6c206d65616e732c20646f206e6f742075736520612068616d6d65722e20
// <= 9000
// => e0088150157e2049424d204d616e75616c202d20283139373529
// <= 9fe22f0c21a03ee525cb89edc2681a8b2f8f1f311bb743d5fb8925b12901a4bf89fe2ce7a77a1b7198dade55b25a5a6ae5a5eaf846cab7c62444535e998982389000
// `,
// payload: "416c6c2070617274732073686f756c6420676f20746f67657468657220776974686f757420666f7263696e672e20596f75206d7573742072656d656d62657220746861742074686520706172747320796f7520617265207265617373656d626c696e67207765726520646973617373656d626c656420627920796f752e205468657265666f72652c20696620796f752063616e277420676574207468656d20746f67657468657220616761696e2c207468657265206d757374206265206120726561736f6e2e20427920616c6c206d65616e732c20646f206e6f742075736520612068616d6d65722e207e2049424d204d616e75616c202d20283139373529",
// result: "9fe22f0c21a03ee525cb89edc2681a8b2f8f1f311bb743d5fb8925b12901a4bf89fe2ce7a77a1b7198dade55b25a5a6ae5a5eaf846cab7c62444535e99898238",
schnorr: {
record: `
=> e0080040fe058000002c8000006f800000000000000000000000416c6c2070617274732073686f756c6420676f20746f67657468657220776974686f757420666f7263696e672e20596f75206d7573742072656d656d62657220746861742074686520706172747320796f7520617265207265617373656d626c696e67207765726520646973617373656d626c656420627920796f752e205468657265666f72652c20696620796f752063616e277420676574207468656d20746f67657468657220616761696e2c207468657265206d757374206265206120726561736f6e2e20427920616c6c206d65616e732c20646f206e6f742075736520612068616d6d65722e
<= 9000
=> e008814016207e2049424d204d616e75616c202d20283139373529
<= 304402202458b0765f6183c25799eacbaa1e1edba4c76453c84fdf0eb5d67d32010ef87f022061bbb21d056a401e3d99d34dbf92a45b5449a2a2ef3ccc93068b887f11f3956c9000
`,
payload:
"416c6c2070617274732073686f756c6420676f20746f67657468657220776974686f757420666f7263696e672e20596f75206d7573742072656d656d62657220746861742074686520706172747320796f7520617265207265617373656d626c696e67207765726520646973617373656d626c656420627920796f752e205468657265666f72652c20696620796f752063616e277420676574207468656d20746f67657468657220616761696e2c207468657265206d757374206265206120726561736f6e2e20427920616c6c206d65616e732c20646f206e6f742075736520612068616d6d65722e207e2049424d204d616e75616c202d20283139373529",
result:
"304402202458b0765f6183c25799eacbaa1e1edba4c76453c84fdf0eb5d67d32010ef87f022061bbb21d056a401e3d99d34dbf92a45b5449a2a2ef3ccc93068b887f11f3956c",
},
},
};
7 changes: 2 additions & 5 deletions packages/platform-sdk-ark/__tests__/factory.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import "jest-extended";
import nock from "nock";
import { createTransportReplayer, RecordStore } from "@ledgerhq/hw-transport-mocker";
import { ledger } from "./__fixtures__/ledger";

import { Factory } from "../src/factory";

Expand All @@ -9,11 +10,7 @@ afterEach(() => nock.cleanAll());
beforeAll(() => nock.disableNetConnect());

const createMockTransport = async () =>
createTransportReplayer(
RecordStore.fromString(`
=> e006000000
<= 000200019000`),
).open();
createTransportReplayer(RecordStore.fromString(ledger.appVersion.record)).open();

describe("Factory", function () {
it("should construct and destruct", async () => {
Expand Down
69 changes: 69 additions & 0 deletions packages/platform-sdk-ark/__tests__/services/ledger.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import "jest-extended";
import { createTransportReplayer, RecordStore } from "@ledgerhq/hw-transport-mocker";
import { LedgerService } from "../../src/services/ledger";
import { ledger } from "../__fixtures__/ledger";

const createMockService = async (record: string) => {
return await LedgerService.construct({
transport: await createTransportReplayer(RecordStore.fromString(record)).open(),
});
};

describe("getVersion", () => {
it("should pass with an app version", async () => {
await createMockService(ledger.appVersion.record).then(async (ark) => {
await expect(ark.getVersion()).resolves.toEqual(ledger.appVersion.result);
});
});
});

describe("getPublicKey", () => {
it("should pass with a compressed publicKey", async () => {
await createMockService(ledger.publicKey.record).then(async (ark) => {
await expect(ark.getPublicKey(ledger.bip44.path)).resolves.toEqual(ledger.publicKey.result);
});
});
});

describe("signTransaction", () => {
it("should pass with an ecdsa signature", async () => {
await createMockService(ledger.transaction.ecdsa.record).then(async (ark) => {
await expect(
ark.signTransaction(ledger.bip44.path, Buffer.from(ledger.transaction.ecdsa.payload, "hex")),
).resolves.toEqual(ledger.transaction.ecdsa.result);
});
});
});

describe("signTransactionWithSchnorr", () => {
it("should pass with a /*schnorr*/ ecdsa signature", async () => {
await createMockService(ledger.transaction.schnorr.record).then(async (ark) => {
await expect(
ark.signTransactionWithSchnorr(
ledger.bip44.path,
Buffer.from(ledger.transaction.schnorr.payload, "hex"),
),
).resolves.toEqual(ledger.transaction.schnorr.result);
});
});
});

describe("signMessage", () => {
it("should pass with an ecdsa signature", async () => {
await createMockService(ledger.message.ecdsa.record).then(async (ark) => {
await expect(
ark.signMessage(ledger.bip44.path, Buffer.from(ledger.message.ecdsa.payload, "hex")),
).resolves.toEqual(ledger.message.ecdsa.result);
});
});
});

describe("signMessageWithSchnorr", () => {
it("should pass with a /*schnorr*/ ecdsa signature", async () => {
await createMockService(ledger.message.schnorr.record).then(async (ark) => {
await expect(
ark.signMessageWithSchnorr(ledger.bip44.path, Buffer.from(ledger.message.schnorr.payload, "hex")),
).resolves.toEqual(ledger.message.schnorr.result);
});
});
});