@ledgerhq/ledger-key-ring-protocol 0.5.1-fix-build-number-pre.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/.eslintrc.js +33 -0
- package/.turbo/turbo-build.log +4 -0
- package/CHANGELOG.md +299 -0
- package/LICENSE.txt +21 -0
- package/README.md +3 -0
- package/jest.config.js +13 -0
- package/lib/HWDeviceProvider.d.ts +25 -0
- package/lib/HWDeviceProvider.d.ts.map +1 -0
- package/lib/HWDeviceProvider.js +88 -0
- package/lib/HWDeviceProvider.js.map +1 -0
- package/lib/api.d.ts +77 -0
- package/lib/api.d.ts.map +1 -0
- package/lib/api.js +150 -0
- package/lib/api.js.map +1 -0
- package/lib/auth.d.ts +3 -0
- package/lib/auth.d.ts.map +1 -0
- package/lib/auth.js +79 -0
- package/lib/auth.js.map +1 -0
- package/lib/errors.d.ts +40 -0
- package/lib/errors.d.ts.map +1 -0
- package/lib/errors.js +18 -0
- package/lib/errors.js.map +1 -0
- package/lib/index.d.ts +6 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +17 -0
- package/lib/index.js.map +1 -0
- package/lib/mockSdk.d.ts +22 -0
- package/lib/mockSdk.d.ts.map +1 -0
- package/lib/mockSdk.js +208 -0
- package/lib/mockSdk.js.map +1 -0
- package/lib/qrcode/cipher.d.ts +12 -0
- package/lib/qrcode/cipher.d.ts.map +1 -0
- package/lib/qrcode/cipher.js +52 -0
- package/lib/qrcode/cipher.js.map +1 -0
- package/lib/qrcode/cipher.test.d.ts +2 -0
- package/lib/qrcode/cipher.test.d.ts.map +1 -0
- package/lib/qrcode/cipher.test.js +31 -0
- package/lib/qrcode/cipher.test.js.map +1 -0
- package/lib/qrcode/index.d.ts +70 -0
- package/lib/qrcode/index.d.ts.map +1 -0
- package/lib/qrcode/index.js +309 -0
- package/lib/qrcode/index.js.map +1 -0
- package/lib/qrcode/index.test.d.ts +2 -0
- package/lib/qrcode/index.test.d.ts.map +1 -0
- package/lib/qrcode/index.test.js +131 -0
- package/lib/qrcode/index.test.js.map +1 -0
- package/lib/qrcode/types.d.ts +69 -0
- package/lib/qrcode/types.d.ts.map +1 -0
- package/lib/qrcode/types.js +3 -0
- package/lib/qrcode/types.js.map +1 -0
- package/lib/sdk.d.ts +31 -0
- package/lib/sdk.d.ts.map +1 -0
- package/lib/sdk.js +380 -0
- package/lib/sdk.js.map +1 -0
- package/lib/store.d.ts +71 -0
- package/lib/store.d.ts.map +1 -0
- package/lib/store.js +62 -0
- package/lib/store.js.map +1 -0
- package/lib/types.d.ts +181 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +10 -0
- package/lib/types.js.map +1 -0
- package/lib-es/HWDeviceProvider.d.ts +25 -0
- package/lib-es/HWDeviceProvider.d.ts.map +1 -0
- package/lib-es/HWDeviceProvider.js +81 -0
- package/lib-es/HWDeviceProvider.js.map +1 -0
- package/lib-es/api.d.ts +77 -0
- package/lib-es/api.d.ts.map +1 -0
- package/lib-es/api.js +145 -0
- package/lib-es/api.js.map +1 -0
- package/lib-es/auth.d.ts +3 -0
- package/lib-es/auth.d.ts.map +1 -0
- package/lib-es/auth.js +75 -0
- package/lib-es/auth.js.map +1 -0
- package/lib-es/errors.d.ts +40 -0
- package/lib-es/errors.d.ts.map +1 -0
- package/lib-es/errors.js +15 -0
- package/lib-es/errors.js.map +1 -0
- package/lib-es/index.d.ts +6 -0
- package/lib-es/index.d.ts.map +1 -0
- package/lib-es/index.js +13 -0
- package/lib-es/index.js.map +1 -0
- package/lib-es/mockSdk.d.ts +22 -0
- package/lib-es/mockSdk.d.ts.map +1 -0
- package/lib-es/mockSdk.js +201 -0
- package/lib-es/mockSdk.js.map +1 -0
- package/lib-es/qrcode/cipher.d.ts +12 -0
- package/lib-es/qrcode/cipher.d.ts.map +1 -0
- package/lib-es/qrcode/cipher.js +44 -0
- package/lib-es/qrcode/cipher.js.map +1 -0
- package/lib-es/qrcode/cipher.test.d.ts +2 -0
- package/lib-es/qrcode/cipher.test.d.ts.map +1 -0
- package/lib-es/qrcode/cipher.test.js +29 -0
- package/lib-es/qrcode/cipher.test.js.map +1 -0
- package/lib-es/qrcode/index.d.ts +70 -0
- package/lib-es/qrcode/index.d.ts.map +1 -0
- package/lib-es/qrcode/index.js +301 -0
- package/lib-es/qrcode/index.js.map +1 -0
- package/lib-es/qrcode/index.test.d.ts +2 -0
- package/lib-es/qrcode/index.test.d.ts.map +1 -0
- package/lib-es/qrcode/index.test.js +126 -0
- package/lib-es/qrcode/index.test.js.map +1 -0
- package/lib-es/qrcode/types.d.ts +69 -0
- package/lib-es/qrcode/types.d.ts.map +1 -0
- package/lib-es/qrcode/types.js +2 -0
- package/lib-es/qrcode/types.js.map +1 -0
- package/lib-es/sdk.d.ts +31 -0
- package/lib-es/sdk.d.ts.map +1 -0
- package/lib-es/sdk.js +371 -0
- package/lib-es/sdk.js.map +1 -0
- package/lib-es/store.d.ts +71 -0
- package/lib-es/store.d.ts.map +1 -0
- package/lib-es/store.js +51 -0
- package/lib-es/store.js.map +1 -0
- package/lib-es/types.d.ts +181 -0
- package/lib-es/types.d.ts.map +1 -0
- package/lib-es/types.js +7 -0
- package/lib-es/types.js.map +1 -0
- package/mocks/scenarios/addSameMemberMultipleTimes.json +426 -0
- package/mocks/scenarios/create2trustchainInARow.json +616 -0
- package/mocks/scenarios/getOrCreateTransactionCases.json +591 -0
- package/mocks/scenarios/member3implicitlyAdded.json +648 -0
- package/mocks/scenarios/membersManySelfAdd.json +1427 -0
- package/mocks/scenarios/randomMemberTryToDestroy.json +371 -0
- package/mocks/scenarios/removeMemberWithTheWrongSeed.json +510 -0
- package/mocks/scenarios/removedMemberEjectedOnDeletedTrustchain.json +481 -0
- package/mocks/scenarios/removedMemberEjectedOnGetMembers.json +648 -0
- package/mocks/scenarios/removedMemberEjectedOnRestore.json +648 -0
- package/mocks/scenarios/removingAMemberCreatesAnInteraction.json +593 -0
- package/mocks/scenarios/removingYourselfIsForbidden.json +397 -0
- package/mocks/scenarios/success.json +978 -0
- package/mocks/scenarios/tokenExpires.json +371 -0
- package/mocks/scenarios/twoAddMembersFollowedByDeviceAdd.json +705 -0
- package/mocks/scenarios/userRefusesAuth.json +40 -0
- package/mocks/scenarios/userRefusesRemoveMember.json +542 -0
- package/package.json +91 -0
- package/scripts/README.md +15 -0
- package/scripts/e2e.ts +57 -0
- package/src/HWDeviceProvider.ts +105 -0
- package/src/__tests__/integration/mock.sdk.test.ts +47 -0
- package/src/__tests__/integration/sdk.test.ts +20 -0
- package/src/__tests__/tsconfig.json +8 -0
- package/src/__tests__/unit/sdk.test.ts +236 -0
- package/src/api.ts +202 -0
- package/src/auth.ts +81 -0
- package/src/errors.ts +18 -0
- package/src/index.ts +20 -0
- package/src/mockSdk.ts +253 -0
- package/src/qrcode/cipher.test.ts +30 -0
- package/src/qrcode/cipher.ts +61 -0
- package/src/qrcode/index.test.ts +138 -0
- package/src/qrcode/index.ts +394 -0
- package/src/qrcode/types.ts +70 -0
- package/src/sdk.ts +542 -0
- package/src/store.ts +99 -0
- package/src/types.ts +242 -0
- package/tests/scenarios/_template.ts +18 -0
- package/tests/scenarios/addSameMemberMultipleTimes.ts +20 -0
- package/tests/scenarios/create2trustchainInARow.ts +14 -0
- package/tests/scenarios/getOrCreateTransactionCases.ts +74 -0
- package/tests/scenarios/member3implicitlyAdded.ts +51 -0
- package/tests/scenarios/membersManySelfAdd.ts +18 -0
- package/tests/scenarios/randomMemberTryToDestroy.ts +23 -0
- package/tests/scenarios/removeMemberWithTheWrongSeed.ts +28 -0
- package/tests/scenarios/removedMemberEjectedOnDeletedTrustchain.ts +31 -0
- package/tests/scenarios/removedMemberEjectedOnGetMembers.ts +29 -0
- package/tests/scenarios/removedMemberEjectedOnRestore.ts +31 -0
- package/tests/scenarios/removingAMemberCreatesAnInteraction.ts +42 -0
- package/tests/scenarios/removingYourselfIsForbidden.ts +11 -0
- package/tests/scenarios/success.ts +94 -0
- package/tests/scenarios/tokenExpires.ts +20 -0
- package/tests/scenarios/twoAddMembersFollowedByDeviceAdd.ts +49 -0
- package/tests/scenarios/userRefusesAuth.ts +28 -0
- package/tests/scenarios/userRefusesRemoveMember.ts +66 -0
- package/tests/test-helpers/recordTrustchainSdkTests.ts +178 -0
- package/tests/test-helpers/replayTrustchainSdkTests.ts +141 -0
- package/tests/test-helpers/types.ts +45 -0
- package/tests/tsconfig.json +8 -0
- package/tsconfig.json +15 -0
|
@@ -0,0 +1,52 @@
|
|
|
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
|
+
exports.makeMessageCipher = exports.makeCipher = void 0;
|
|
7
|
+
const base64_js_1 = __importDefault(require("base64-js"));
|
|
8
|
+
const hw_ledger_key_ring_protocol_1 = require("@ledgerhq/hw-ledger-key-ring-protocol");
|
|
9
|
+
const errors_1 = require("../errors");
|
|
10
|
+
function makeCipher(sessionEncryptionKey) {
|
|
11
|
+
function encrypt(obj) {
|
|
12
|
+
const plaintext = JSON.stringify(obj);
|
|
13
|
+
const data = new TextEncoder().encode(plaintext);
|
|
14
|
+
const nonce = hw_ledger_key_ring_protocol_1.crypto.randomBytes(16);
|
|
15
|
+
const ciphertext = hw_ledger_key_ring_protocol_1.crypto.encrypt(sessionEncryptionKey, nonce, data);
|
|
16
|
+
const blob = new Uint8Array(nonce.length + ciphertext.length);
|
|
17
|
+
blob.set(nonce);
|
|
18
|
+
blob.set(ciphertext, nonce.length);
|
|
19
|
+
return base64_js_1.default.fromByteArray(blob);
|
|
20
|
+
}
|
|
21
|
+
function decrypt(data) {
|
|
22
|
+
const blob = base64_js_1.default.toByteArray(data);
|
|
23
|
+
const nonce = blob.slice(0, 16);
|
|
24
|
+
const ciphertext = blob.slice(16);
|
|
25
|
+
try {
|
|
26
|
+
const plaintext = hw_ledger_key_ring_protocol_1.crypto.decrypt(sessionEncryptionKey, nonce, ciphertext);
|
|
27
|
+
const text = new TextDecoder().decode(plaintext);
|
|
28
|
+
return JSON.parse(text);
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
throw new errors_1.InvalidEncryptionKeyError("data can't be decrypted");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return { encrypt, decrypt };
|
|
35
|
+
}
|
|
36
|
+
exports.makeCipher = makeCipher;
|
|
37
|
+
function makeMessageCipher(cipher) {
|
|
38
|
+
function encryptMessagePayload(payload) {
|
|
39
|
+
const encrypted = cipher.encrypt(payload);
|
|
40
|
+
return { encrypted };
|
|
41
|
+
}
|
|
42
|
+
function decryptMessage(message) {
|
|
43
|
+
if (message.message === "InitiateHandshake" || message.message === "Failure") {
|
|
44
|
+
throw new Error(message.message + " is not encrypted");
|
|
45
|
+
}
|
|
46
|
+
const decrypted = cipher.decrypt(message.payload.encrypted);
|
|
47
|
+
return decrypted;
|
|
48
|
+
}
|
|
49
|
+
return { encryptMessagePayload, decryptMessage };
|
|
50
|
+
}
|
|
51
|
+
exports.makeMessageCipher = makeMessageCipher;
|
|
52
|
+
//# sourceMappingURL=cipher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cipher.js","sourceRoot":"","sources":["../../src/qrcode/cipher.ts"],"names":[],"mappings":";;;;;;AAAA,0DAA+B;AAC/B,uFAA+D;AAE/D,sCAAsD;AAYtD,SAAgB,UAAU,CAAC,oBAAgC;IACzD,SAAS,OAAO,CAAC,GAAW;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,oCAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,oCAAM,CAAC,OAAO,CAAC,oBAAoB,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChB,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACnC,OAAO,mBAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,SAAS,OAAO,CAAC,IAAY;QAC3B,MAAM,IAAI,GAAG,mBAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,oCAAM,CAAC,OAAO,CAAC,oBAAoB,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YAC1E,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,kCAAyB,CAAC,yBAAyB,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AA1BD,gCA0BC;AAED,SAAgB,iBAAiB,CAAC,MAAc;IAC9C,SAAS,qBAAqB,CAC5B,OAAU;QAEV,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,EAAE,SAAS,EAAE,CAAC;IACvB,CAAC;IAED,SAAS,cAAc,CAAoB,OAAU;QACnD,IAAI,OAAO,CAAC,OAAO,KAAK,mBAAmB,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC7E,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,GAAG,mBAAmB,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAwB,CAAC;QACnF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,CAAC;AACnD,CAAC;AAjBD,8CAiBC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cipher.test.d.ts","sourceRoot":"","sources":["../../src/qrcode/cipher.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const hw_ledger_key_ring_protocol_1 = require("@ledgerhq/hw-ledger-key-ring-protocol");
|
|
4
|
+
const cipher_1 = require("./cipher");
|
|
5
|
+
const errors_1 = require("../errors");
|
|
6
|
+
describe("makeCipher", () => {
|
|
7
|
+
it("should encrypt and decrypt correctly", () => {
|
|
8
|
+
const ephemeralKey = hw_ledger_key_ring_protocol_1.crypto.randomKeypair();
|
|
9
|
+
const candidate = hw_ledger_key_ring_protocol_1.crypto.randomKeypair();
|
|
10
|
+
const sessionEncryptionKey = hw_ledger_key_ring_protocol_1.crypto.ecdh(ephemeralKey, candidate.publicKey);
|
|
11
|
+
const cipher = (0, cipher_1.makeCipher)(sessionEncryptionKey);
|
|
12
|
+
const plaintext = { message: "Hello, World!" };
|
|
13
|
+
const encrypted = cipher.encrypt(plaintext);
|
|
14
|
+
expect(typeof encrypted).toBe("string");
|
|
15
|
+
const decrypted = cipher.decrypt(encrypted);
|
|
16
|
+
expect(decrypted).toEqual(plaintext);
|
|
17
|
+
});
|
|
18
|
+
it("should throw InvalidEncryptionKeyError if key changes", () => {
|
|
19
|
+
const ephemeralKey = hw_ledger_key_ring_protocol_1.crypto.randomKeypair();
|
|
20
|
+
const candidate = hw_ledger_key_ring_protocol_1.crypto.randomKeypair();
|
|
21
|
+
const sessionEncryptionKey = hw_ledger_key_ring_protocol_1.crypto.ecdh(ephemeralKey, candidate.publicKey);
|
|
22
|
+
const cipher = (0, cipher_1.makeCipher)(sessionEncryptionKey);
|
|
23
|
+
const plaintext = { message: "Hello, World!" };
|
|
24
|
+
const encrypted = cipher.encrypt(plaintext);
|
|
25
|
+
const ephemeralKey2 = hw_ledger_key_ring_protocol_1.crypto.randomKeypair();
|
|
26
|
+
const otherSessionEncryptionKey = hw_ledger_key_ring_protocol_1.crypto.ecdh(ephemeralKey2, candidate.publicKey);
|
|
27
|
+
const cipher2 = (0, cipher_1.makeCipher)(otherSessionEncryptionKey);
|
|
28
|
+
expect(() => cipher2.decrypt(encrypted)).toThrow(errors_1.InvalidEncryptionKeyError);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=cipher.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cipher.test.js","sourceRoot":"","sources":["../../src/qrcode/cipher.test.ts"],"names":[],"mappings":";;AAAA,uFAA+D;AAC/D,qCAAsC;AACtC,sCAAsD;AAEtD,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,YAAY,GAAG,oCAAM,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,oCAAM,CAAC,aAAa,EAAE,CAAC;QACzC,MAAM,oBAAoB,GAAG,oCAAM,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,oBAAoB,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,YAAY,GAAG,oCAAM,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,oCAAM,CAAC,aAAa,EAAE,CAAC;QACzC,MAAM,oBAAoB,GAAG,oCAAM,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,oBAAoB,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,aAAa,GAAG,oCAAM,CAAC,aAAa,EAAE,CAAC;QAC7C,MAAM,yBAAyB,GAAG,oCAAM,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QAClF,MAAM,OAAO,GAAG,IAAA,mBAAU,EAAC,yBAAyB,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,kCAAyB,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { MemberCredentials, Trustchain, TrustchainMember } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* establish a channel to be able to add a member to the trustchain after displaying the QR Code
|
|
4
|
+
* @returns a promise that resolves when this is done
|
|
5
|
+
*/
|
|
6
|
+
export declare function createQRCodeHostInstance({ trustchainApiBaseUrl, onDisplayQRCode, onDisplayDigits, addMember, memberCredentials, memberName, initialTrustchainId, }: {
|
|
7
|
+
/**
|
|
8
|
+
* the base URL of the trustchain API
|
|
9
|
+
*/
|
|
10
|
+
trustchainApiBaseUrl: string;
|
|
11
|
+
/**
|
|
12
|
+
* this function will need to display a UI to show the QR Code
|
|
13
|
+
*/
|
|
14
|
+
onDisplayQRCode: (url: string) => void;
|
|
15
|
+
/**
|
|
16
|
+
* this function will need to display a UI to show the digits
|
|
17
|
+
*/
|
|
18
|
+
onDisplayDigits: (digits: string) => void;
|
|
19
|
+
/**
|
|
20
|
+
* this function will need to using the TrustchainSDK (and use sdk.addMember)
|
|
21
|
+
*/
|
|
22
|
+
addMember: (member: TrustchainMember) => Promise<Trustchain>;
|
|
23
|
+
/**
|
|
24
|
+
* the client credentials of the instance (given by TrustchainSDK)
|
|
25
|
+
*/
|
|
26
|
+
memberCredentials: MemberCredentials;
|
|
27
|
+
/**
|
|
28
|
+
* the name of the member
|
|
29
|
+
*/
|
|
30
|
+
memberName: string;
|
|
31
|
+
/**
|
|
32
|
+
* if the member already has a trustchain, this will be defined
|
|
33
|
+
*/
|
|
34
|
+
initialTrustchainId?: string;
|
|
35
|
+
}): Promise<Trustchain | void>;
|
|
36
|
+
/**
|
|
37
|
+
* establish a channel to be able to add myself to the trustchain after scanning the QR Code
|
|
38
|
+
* @returns a promise that resolves a Trustchain when this is done
|
|
39
|
+
*/
|
|
40
|
+
export declare function createQRCodeCandidateInstance({ memberCredentials, memberName, addMember, initialTrustchainId, scannedUrl, onRequestQRCodeInput, }: {
|
|
41
|
+
/**
|
|
42
|
+
* the client credentials of the instance (given by TrustchainSDK)
|
|
43
|
+
*/
|
|
44
|
+
memberCredentials: MemberCredentials;
|
|
45
|
+
/**
|
|
46
|
+
* the name of the member
|
|
47
|
+
*/
|
|
48
|
+
memberName: string;
|
|
49
|
+
/**
|
|
50
|
+
* if the member already has a trustchain, this will be defined
|
|
51
|
+
*/
|
|
52
|
+
initialTrustchainId?: string;
|
|
53
|
+
/**
|
|
54
|
+
* this function will need to using the TrustchainSDK (and use sdk.addMember)
|
|
55
|
+
*/
|
|
56
|
+
addMember: (member: TrustchainMember) => Promise<Trustchain>;
|
|
57
|
+
/**
|
|
58
|
+
* the scanned URL that contains the host public key
|
|
59
|
+
*/
|
|
60
|
+
scannedUrl: string;
|
|
61
|
+
/**
|
|
62
|
+
* this function will need to display a UI to ask the user to input the digits
|
|
63
|
+
* and then call the callback with the digits
|
|
64
|
+
*/
|
|
65
|
+
onRequestQRCodeInput: (config: {
|
|
66
|
+
digits: number;
|
|
67
|
+
connected: boolean;
|
|
68
|
+
}, callback: (digits: string) => void) => void;
|
|
69
|
+
}): Promise<Trustchain | void>;
|
|
70
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/qrcode/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AA8F3E;;;GAGG;AACH,wBAAsB,wBAAwB,CAAC,EAC7C,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,SAAS,EACT,iBAAiB,EACjB,UAAU,EACV,mBAAmB,GACpB,EAAE;IACD;;OAEG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;OAEG;IACH,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC;;OAEG;IACH,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;;OAEG;IACH,SAAS,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7D;;OAEG;IACH,iBAAiB,EAAE,iBAAiB,CAAC;IACrC;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAsF7B;AAED;;;GAGG;AACH,wBAAsB,6BAA6B,CAAC,EAClD,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,mBAAmB,EACnB,UAAU,EACV,oBAAoB,GACrB,EAAE;IACD;;OAEG;IACH,iBAAiB,EAAE,iBAAiB,CAAC;IACrC;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;OAEG;IACH,SAAS,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7D;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,oBAAoB,EAAE,CACpB,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,OAAO,CAAC;KACpB,EACD,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,KAC/B,IAAI,CAAC;CACX,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA6E7B"}
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.createQRCodeCandidateInstance = exports.createQRCodeHostInstance = void 0;
|
|
16
|
+
const hw_ledger_key_ring_protocol_1 = require("@ledgerhq/hw-ledger-key-ring-protocol");
|
|
17
|
+
const isomorphic_ws_1 = __importDefault(require("isomorphic-ws"));
|
|
18
|
+
const cipher_1 = require("./cipher");
|
|
19
|
+
const errors_1 = require("../errors");
|
|
20
|
+
const logs_1 = require("@ledgerhq/logs");
|
|
21
|
+
const version = 1;
|
|
22
|
+
const CLOSE_TIMEOUT = 100; // just enough time for the onerror to appear before onclose
|
|
23
|
+
const commonSwitch = (_a) => __awaiter(void 0, [_a], void 0, function* ({ data, cipher, addMember, send, publisher, resolve, memberCredentials, memberName, reject, ws, setFinished, initialTrustchainId, }) {
|
|
24
|
+
switch (data.message) {
|
|
25
|
+
case "TrustchainShareCredential": {
|
|
26
|
+
if (!initialTrustchainId) {
|
|
27
|
+
const payload = {
|
|
28
|
+
type: "UNEXPECTED_SHARE_CREDENTIAL",
|
|
29
|
+
message: "unexpected share credential",
|
|
30
|
+
};
|
|
31
|
+
send({ version, publisher, message: "Failure", payload });
|
|
32
|
+
throw new errors_1.NoTrustchainInitialized("unexpected share credential");
|
|
33
|
+
}
|
|
34
|
+
setFinished(true);
|
|
35
|
+
if (!cipher) {
|
|
36
|
+
throw new Error("sessionEncryptionKey not set");
|
|
37
|
+
}
|
|
38
|
+
const { id, name } = cipher.decryptMessage(data);
|
|
39
|
+
const trustchain = yield addMember({ id, name, permissions: hw_ledger_key_ring_protocol_1.Permissions.OWNER });
|
|
40
|
+
const payload = cipher.encryptMessagePayload({ trustchain });
|
|
41
|
+
send({ version, publisher, message: "TrustchainAddedMember", payload });
|
|
42
|
+
resolve();
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
case "TrustchainRequestCredential": {
|
|
46
|
+
if (initialTrustchainId) {
|
|
47
|
+
const payload = {
|
|
48
|
+
type: "UNEXPECTED_REQUEST_CREDENTIAL",
|
|
49
|
+
message: initialTrustchainId,
|
|
50
|
+
};
|
|
51
|
+
send({ version, publisher, message: "Failure", payload });
|
|
52
|
+
throw new errors_1.TrustchainAlreadyInitialized(initialTrustchainId);
|
|
53
|
+
}
|
|
54
|
+
const payload = cipher.encryptMessagePayload({
|
|
55
|
+
id: memberCredentials.pubkey,
|
|
56
|
+
name: memberName,
|
|
57
|
+
});
|
|
58
|
+
send({ version, publisher, message: "TrustchainShareCredential", payload });
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
case "TrustchainAddedMember": {
|
|
62
|
+
setFinished(true);
|
|
63
|
+
const { trustchain } = cipher.decryptMessage(data);
|
|
64
|
+
resolve(trustchain);
|
|
65
|
+
ws.close();
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
case "Failure": {
|
|
69
|
+
setFinished(true);
|
|
70
|
+
(0, logs_1.log)("trustchain/qrcode", "Failure", { data });
|
|
71
|
+
const error = fromErrorMessage(data.payload);
|
|
72
|
+
reject(error);
|
|
73
|
+
ws.close();
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
case "HandshakeChallenge":
|
|
77
|
+
case "HandshakeCompletionSucceeded":
|
|
78
|
+
case "InitiateHandshake":
|
|
79
|
+
case "CompleteHandshakeChallenge":
|
|
80
|
+
break;
|
|
81
|
+
default:
|
|
82
|
+
throw new Error("unexpected message");
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
/**
|
|
86
|
+
* establish a channel to be able to add a member to the trustchain after displaying the QR Code
|
|
87
|
+
* @returns a promise that resolves when this is done
|
|
88
|
+
*/
|
|
89
|
+
function createQRCodeHostInstance(_a) {
|
|
90
|
+
return __awaiter(this, arguments, void 0, function* ({ trustchainApiBaseUrl, onDisplayQRCode, onDisplayDigits, addMember, memberCredentials, memberName, initialTrustchainId, }) {
|
|
91
|
+
const ephemeralKey = hw_ledger_key_ring_protocol_1.crypto.randomKeypair();
|
|
92
|
+
const publisher = hw_ledger_key_ring_protocol_1.crypto.to_hex(ephemeralKey.publicKey);
|
|
93
|
+
const url = `${trustchainApiBaseUrl.replace("http", "ws")}/v1/qr?host=${publisher}`;
|
|
94
|
+
const ws = new isomorphic_ws_1.default(url);
|
|
95
|
+
function send(message) {
|
|
96
|
+
ws.send(JSON.stringify(message));
|
|
97
|
+
}
|
|
98
|
+
let sessionEncryptionKey;
|
|
99
|
+
let cipher;
|
|
100
|
+
let expectedDigits;
|
|
101
|
+
let finished = false;
|
|
102
|
+
const setFinished = newValue => (finished = newValue);
|
|
103
|
+
onDisplayQRCode(url);
|
|
104
|
+
return new Promise((resolve, reject) => {
|
|
105
|
+
const startedAt = Date.now();
|
|
106
|
+
ws.addEventListener("error", reject);
|
|
107
|
+
ws.addEventListener("close", () => {
|
|
108
|
+
if (finished)
|
|
109
|
+
return;
|
|
110
|
+
// this error would reflect a protocol error. because otherwise, we would get the "error" event.
|
|
111
|
+
const time = Date.now() - startedAt;
|
|
112
|
+
reject(new errors_1.QRCodeWSClosed("qrcode websocket prematurely closed", { time }));
|
|
113
|
+
});
|
|
114
|
+
ws.addEventListener("message", (e) => __awaiter(this, void 0, void 0, function* () {
|
|
115
|
+
try {
|
|
116
|
+
const data = parseMessage(e.data);
|
|
117
|
+
switch (data.message) {
|
|
118
|
+
case "InitiateHandshake": {
|
|
119
|
+
const candidatePublicKey = hw_ledger_key_ring_protocol_1.crypto.from_hex(data.payload.ephemeral_public_key);
|
|
120
|
+
sessionEncryptionKey = hw_ledger_key_ring_protocol_1.crypto.ecdh(ephemeralKey, candidatePublicKey);
|
|
121
|
+
cipher = (0, cipher_1.makeMessageCipher)((0, cipher_1.makeCipher)(sessionEncryptionKey));
|
|
122
|
+
// --- end of handshake first phase ---
|
|
123
|
+
const digitsCount = 3;
|
|
124
|
+
const digits = randomDigits(digitsCount);
|
|
125
|
+
expectedDigits = digits;
|
|
126
|
+
onDisplayDigits(digits);
|
|
127
|
+
const payload = cipher.encryptMessagePayload({
|
|
128
|
+
digits: digitsCount,
|
|
129
|
+
connected: false,
|
|
130
|
+
});
|
|
131
|
+
send({ version, publisher, message: "HandshakeChallenge", payload });
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
case "CompleteHandshakeChallenge": {
|
|
135
|
+
if (!cipher) {
|
|
136
|
+
throw new Error("sessionEncryptionKey not set");
|
|
137
|
+
}
|
|
138
|
+
const { digits } = cipher.decryptMessage(data);
|
|
139
|
+
if (digits !== expectedDigits) {
|
|
140
|
+
console.warn("User invalid digits", { digits, expectedDigits });
|
|
141
|
+
const payload = {
|
|
142
|
+
type: "HANDSHAKE_COMPLETION_FAILED",
|
|
143
|
+
message: "invalid digits",
|
|
144
|
+
};
|
|
145
|
+
send({ version, publisher, message: "Failure", payload });
|
|
146
|
+
throw new errors_1.InvalidDigitsError("invalid digits");
|
|
147
|
+
}
|
|
148
|
+
const payload = cipher.encryptMessagePayload({});
|
|
149
|
+
send({ version, publisher, message: "HandshakeCompletionSucceeded", payload });
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
yield commonSwitch({
|
|
154
|
+
data,
|
|
155
|
+
cipher,
|
|
156
|
+
addMember,
|
|
157
|
+
send,
|
|
158
|
+
publisher,
|
|
159
|
+
resolve,
|
|
160
|
+
memberCredentials,
|
|
161
|
+
memberName,
|
|
162
|
+
reject,
|
|
163
|
+
ws,
|
|
164
|
+
setFinished,
|
|
165
|
+
initialTrustchainId,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
catch (e) {
|
|
169
|
+
console.error("socket error", e);
|
|
170
|
+
ws.close();
|
|
171
|
+
reject(e);
|
|
172
|
+
}
|
|
173
|
+
}));
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
exports.createQRCodeHostInstance = createQRCodeHostInstance;
|
|
178
|
+
/**
|
|
179
|
+
* establish a channel to be able to add myself to the trustchain after scanning the QR Code
|
|
180
|
+
* @returns a promise that resolves a Trustchain when this is done
|
|
181
|
+
*/
|
|
182
|
+
function createQRCodeCandidateInstance(_a) {
|
|
183
|
+
return __awaiter(this, arguments, void 0, function* ({ memberCredentials, memberName, addMember, initialTrustchainId, scannedUrl, onRequestQRCodeInput, }) {
|
|
184
|
+
const m = scannedUrl.match(/host=([0-9A-Fa-f]+)/);
|
|
185
|
+
if (!m) {
|
|
186
|
+
if (isFromOldAccountsImport(scannedUrl))
|
|
187
|
+
throw new errors_1.ScannedOldImportQrCode();
|
|
188
|
+
throw new errors_1.ScannedInvalidQrCode();
|
|
189
|
+
}
|
|
190
|
+
const hostPublicKey = hw_ledger_key_ring_protocol_1.crypto.from_hex(m[1]);
|
|
191
|
+
const ephemeralKey = hw_ledger_key_ring_protocol_1.crypto.randomKeypair();
|
|
192
|
+
const publisher = hw_ledger_key_ring_protocol_1.crypto.to_hex(ephemeralKey.publicKey);
|
|
193
|
+
const sessionEncryptionKey = hw_ledger_key_ring_protocol_1.crypto.ecdh(ephemeralKey, hostPublicKey);
|
|
194
|
+
const cipher = (0, cipher_1.makeMessageCipher)((0, cipher_1.makeCipher)(sessionEncryptionKey));
|
|
195
|
+
const ws = new isomorphic_ws_1.default(scannedUrl);
|
|
196
|
+
function send(message) {
|
|
197
|
+
ws.send(JSON.stringify(message));
|
|
198
|
+
}
|
|
199
|
+
let finished = false;
|
|
200
|
+
const setFinished = newValue => (finished = newValue);
|
|
201
|
+
return new Promise((resolve, reject) => {
|
|
202
|
+
ws.addEventListener("close", () => {
|
|
203
|
+
if (finished)
|
|
204
|
+
return;
|
|
205
|
+
// this error would reflect a protocol error. because otherwise, we would get the "error" event. it shouldn't be visible to user, but we use it to ensure the promise ends.
|
|
206
|
+
setTimeout(() => reject(new Error("qrcode websocket prematurely closed")), CLOSE_TIMEOUT);
|
|
207
|
+
});
|
|
208
|
+
ws.addEventListener("message", (e) => __awaiter(this, void 0, void 0, function* () {
|
|
209
|
+
try {
|
|
210
|
+
const data = parseMessage(e.data);
|
|
211
|
+
switch (data.message) {
|
|
212
|
+
case "HandshakeChallenge": {
|
|
213
|
+
const config = cipher.decryptMessage(data);
|
|
214
|
+
onRequestQRCodeInput(config, digits => {
|
|
215
|
+
const payload = cipher.encryptMessagePayload({ digits });
|
|
216
|
+
send({ version, publisher, message: "CompleteHandshakeChallenge", payload });
|
|
217
|
+
});
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
case "HandshakeCompletionSucceeded": {
|
|
221
|
+
if (initialTrustchainId) {
|
|
222
|
+
const payload = cipher.encryptMessagePayload({});
|
|
223
|
+
send({ version, publisher, message: "TrustchainRequestCredential", payload });
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
const payload = cipher.encryptMessagePayload({
|
|
227
|
+
id: memberCredentials.pubkey,
|
|
228
|
+
name: memberName,
|
|
229
|
+
});
|
|
230
|
+
send({ version, publisher, message: "TrustchainShareCredential", payload });
|
|
231
|
+
}
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
yield commonSwitch({
|
|
236
|
+
data,
|
|
237
|
+
cipher,
|
|
238
|
+
addMember,
|
|
239
|
+
send,
|
|
240
|
+
publisher,
|
|
241
|
+
resolve,
|
|
242
|
+
memberCredentials,
|
|
243
|
+
memberName,
|
|
244
|
+
reject,
|
|
245
|
+
ws,
|
|
246
|
+
setFinished,
|
|
247
|
+
initialTrustchainId,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
catch (e) {
|
|
251
|
+
console.error("socket error", e);
|
|
252
|
+
ws.close();
|
|
253
|
+
reject(e);
|
|
254
|
+
}
|
|
255
|
+
}));
|
|
256
|
+
ws.addEventListener("error", reject);
|
|
257
|
+
ws.addEventListener("open", () => {
|
|
258
|
+
const payload = { ephemeral_public_key: hw_ledger_key_ring_protocol_1.crypto.to_hex(ephemeralKey.publicKey) };
|
|
259
|
+
send({ version, publisher, message: "InitiateHandshake", payload });
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
exports.createQRCodeCandidateInstance = createQRCodeCandidateInstance;
|
|
265
|
+
function randomDigits(count) {
|
|
266
|
+
const bytes = hw_ledger_key_ring_protocol_1.crypto.randomBytes(count);
|
|
267
|
+
let digits = "";
|
|
268
|
+
for (let i = 0; i < count; i++) {
|
|
269
|
+
digits += (bytes[i] % 10).toString();
|
|
270
|
+
}
|
|
271
|
+
return digits;
|
|
272
|
+
}
|
|
273
|
+
function parseMessage(e) {
|
|
274
|
+
const message = JSON.parse(e.toString());
|
|
275
|
+
if (!message || typeof message !== "object") {
|
|
276
|
+
throw new Error("invalid message");
|
|
277
|
+
}
|
|
278
|
+
if (message.version !== 1) {
|
|
279
|
+
throw new Error("invalid version");
|
|
280
|
+
}
|
|
281
|
+
if (typeof message.publisher !== "string") {
|
|
282
|
+
throw new Error("invalid publisher");
|
|
283
|
+
}
|
|
284
|
+
if (typeof message.message !== "string") {
|
|
285
|
+
throw new Error("invalid message");
|
|
286
|
+
}
|
|
287
|
+
if (typeof message.payload !== "object") {
|
|
288
|
+
throw new Error("invalid payload");
|
|
289
|
+
}
|
|
290
|
+
return message;
|
|
291
|
+
}
|
|
292
|
+
function fromErrorMessage(payload) {
|
|
293
|
+
if (payload.type === "HANDSHAKE_COMPLETION_FAILED") {
|
|
294
|
+
throw new errors_1.InvalidDigitsError(payload.message);
|
|
295
|
+
}
|
|
296
|
+
if (payload.type === "UNEXPECTED_SHARE_CREDENTIAL") {
|
|
297
|
+
throw new errors_1.NoTrustchainInitialized(payload.message);
|
|
298
|
+
}
|
|
299
|
+
if (payload.type === "UNEXPECTED_REQUEST_CREDENTIAL") {
|
|
300
|
+
throw new errors_1.TrustchainAlreadyInitialized(payload.message);
|
|
301
|
+
}
|
|
302
|
+
const error = new Error(payload.message);
|
|
303
|
+
error.name = "TrustchainQRCode-" + payload.type;
|
|
304
|
+
return error;
|
|
305
|
+
}
|
|
306
|
+
function isFromOldAccountsImport(scannedUrl) {
|
|
307
|
+
return !!scannedUrl.match(/^[A-Za-z0-9+/=]*$/);
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/qrcode/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/qrcode/index.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const _1 = require(".");
|
|
16
|
+
const ws_1 = __importDefault(require("ws"));
|
|
17
|
+
const sdk_1 = require("../sdk");
|
|
18
|
+
const hw_ledger_key_ring_protocol_1 = require("@ledgerhq/hw-ledger-key-ring-protocol");
|
|
19
|
+
const errors_1 = require("../errors");
|
|
20
|
+
describe("Trustchain QR Code", () => {
|
|
21
|
+
let server;
|
|
22
|
+
let a;
|
|
23
|
+
let b;
|
|
24
|
+
beforeAll(() => {
|
|
25
|
+
server = new ws_1.default.Server({ port: 1234 });
|
|
26
|
+
server.on("connection", ws => {
|
|
27
|
+
if (!a) {
|
|
28
|
+
a = ws;
|
|
29
|
+
}
|
|
30
|
+
else if (!b) {
|
|
31
|
+
b = ws;
|
|
32
|
+
}
|
|
33
|
+
ws.on("message", message => {
|
|
34
|
+
if (ws === a && b) {
|
|
35
|
+
b.send(message);
|
|
36
|
+
}
|
|
37
|
+
else if (ws === b && a) {
|
|
38
|
+
a.send(message);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
afterAll(() => {
|
|
44
|
+
server.close();
|
|
45
|
+
});
|
|
46
|
+
test("digits matching scenario", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
47
|
+
const onDisplayDigits = jest.fn();
|
|
48
|
+
const trustchain = {
|
|
49
|
+
rootId: "test-root-id",
|
|
50
|
+
walletSyncEncryptionKey: "test-wallet-sync-encryption-key",
|
|
51
|
+
applicationPath: "m/0'/16'/0'",
|
|
52
|
+
};
|
|
53
|
+
const addMember = jest.fn(() => Promise.resolve(trustchain));
|
|
54
|
+
const memberCredentials = (0, sdk_1.convertKeyPairToLiveCredentials)(yield hw_ledger_key_ring_protocol_1.crypto.randomKeypair());
|
|
55
|
+
const memberName = "foo";
|
|
56
|
+
let scannedUrlResolve;
|
|
57
|
+
const scannedUrlPromise = new Promise(resolve => {
|
|
58
|
+
scannedUrlResolve = resolve;
|
|
59
|
+
});
|
|
60
|
+
const onDisplayQRCode = (url) => {
|
|
61
|
+
scannedUrlResolve(url);
|
|
62
|
+
};
|
|
63
|
+
const onRequestQRCodeInput = jest.fn((config, callback) => callback(onDisplayDigits.mock.calls[0][0]));
|
|
64
|
+
const hostP = (0, _1.createQRCodeHostInstance)({
|
|
65
|
+
trustchainApiBaseUrl: "ws://localhost:1234",
|
|
66
|
+
onDisplayQRCode,
|
|
67
|
+
onDisplayDigits,
|
|
68
|
+
addMember,
|
|
69
|
+
memberCredentials,
|
|
70
|
+
memberName,
|
|
71
|
+
initialTrustchainId: trustchain.rootId,
|
|
72
|
+
});
|
|
73
|
+
const scannedUrl = yield scannedUrlPromise;
|
|
74
|
+
const candidateP = (0, _1.createQRCodeCandidateInstance)({
|
|
75
|
+
memberCredentials,
|
|
76
|
+
memberName,
|
|
77
|
+
initialTrustchainId: undefined,
|
|
78
|
+
addMember,
|
|
79
|
+
scannedUrl,
|
|
80
|
+
onRequestQRCodeInput,
|
|
81
|
+
});
|
|
82
|
+
const [_, res] = yield Promise.all([hostP, candidateP]);
|
|
83
|
+
expect(onDisplayDigits).toHaveBeenCalledWith(expect.any(String));
|
|
84
|
+
expect(addMember).toHaveBeenCalled();
|
|
85
|
+
expect(onRequestQRCodeInput).toHaveBeenCalledWith({ digits: 3, connected: false }, expect.any(Function));
|
|
86
|
+
expect(res).toEqual(trustchain);
|
|
87
|
+
}));
|
|
88
|
+
test("invalid qr code scanned", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
89
|
+
const trustchain = {
|
|
90
|
+
rootId: "test-root-id",
|
|
91
|
+
walletSyncEncryptionKey: "test-wallet-sync-encryption-key",
|
|
92
|
+
applicationPath: "m/0'/16'/0'",
|
|
93
|
+
};
|
|
94
|
+
const addMember = jest.fn(() => Promise.resolve(trustchain));
|
|
95
|
+
const memberCredentials = (0, sdk_1.convertKeyPairToLiveCredentials)(yield hw_ledger_key_ring_protocol_1.crypto.randomKeypair());
|
|
96
|
+
const memberName = "foo";
|
|
97
|
+
const onRequestQRCodeInput = jest.fn();
|
|
98
|
+
const scannedUrl = "https://example.com";
|
|
99
|
+
const candidateP = (0, _1.createQRCodeCandidateInstance)({
|
|
100
|
+
memberCredentials,
|
|
101
|
+
memberName,
|
|
102
|
+
initialTrustchainId: undefined,
|
|
103
|
+
addMember,
|
|
104
|
+
scannedUrl,
|
|
105
|
+
onRequestQRCodeInput,
|
|
106
|
+
});
|
|
107
|
+
yield expect(candidateP).rejects.toThrow(new errors_1.ScannedInvalidQrCode());
|
|
108
|
+
}));
|
|
109
|
+
test("old accounts export qr code scanned", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
110
|
+
const trustchain = {
|
|
111
|
+
rootId: "test-root-id",
|
|
112
|
+
walletSyncEncryptionKey: "test-wallet-sync-encryption-key",
|
|
113
|
+
applicationPath: "m/0'/16'/0'",
|
|
114
|
+
};
|
|
115
|
+
const addMember = jest.fn(() => Promise.resolve(trustchain));
|
|
116
|
+
const memberCredentials = (0, sdk_1.convertKeyPairToLiveCredentials)(yield hw_ledger_key_ring_protocol_1.crypto.randomKeypair());
|
|
117
|
+
const memberName = "foo";
|
|
118
|
+
const onRequestQRCodeInput = jest.fn();
|
|
119
|
+
const scannedUrl = "ZAADAAIAAAAEd2JXMpuoYdzvkNzFTlmQLPcGf2LSjDOgqaB3nQoZqlimcCX6HNkescWKyT1DCGuwO7IesD7oYg+fdZPkiIfFL3V9swfZRePkaNN09IjXsWLsim9hK/qi/RC1/ofX3hYNKUxUAgYVVG82WKXIk47siWfUlRZsCYSAARQ6ASpUgidPjMHaOMK6w53wTZplwo7Zjv1HrIyKwr3Ci8OmrFye5g==";
|
|
120
|
+
const candidateP = (0, _1.createQRCodeCandidateInstance)({
|
|
121
|
+
memberCredentials,
|
|
122
|
+
memberName,
|
|
123
|
+
initialTrustchainId: undefined,
|
|
124
|
+
addMember,
|
|
125
|
+
scannedUrl,
|
|
126
|
+
onRequestQRCodeInput,
|
|
127
|
+
});
|
|
128
|
+
yield expect(candidateP).rejects.toThrow(new errors_1.ScannedOldImportQrCode());
|
|
129
|
+
}));
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/qrcode/index.test.ts"],"names":[],"mappings":"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"}
|