UNPKG

@bajetech/digitalbits-wallet-sdk

Version:

A library to make it easier to write wallets that interact with the DigitalBits blockchain

418 lines 18.5 kB
import { __awaiter, __generator } from "tslib"; import DigitalBitsSdk from "xdb-digitalbits-sdk"; import { mockRandomForEach } from "jest-mock-random"; import sinon from "sinon"; import { KeyType } from "./constants/keys"; import { KeyManager } from "./KeyManager"; import { IdentityEncrypter } from "./plugins/IdentityEncrypter"; import { MemoryKeyStore } from "./plugins/MemoryKeyStore"; import { ScryptEncrypter } from "./plugins/ScryptEncrypter"; describe("KeyManager", function () { var _this = this; var clock; mockRandomForEach([0.5]); beforeEach(function () { clock = sinon.useFakeTimers(); }); afterEach(function () { clock.restore(); }); test("Save an ID of one's own", function () { return __awaiter(_this, void 0, void 0, function () { var id, testStore, testKeyManager, password, metadata, _a, _b; return __generator(this, function (_c) { switch (_c.label) { case 0: id = "this is a very good id, and I like it"; testStore = new MemoryKeyStore(); testKeyManager = new KeyManager({ keyStore: testStore, }); testKeyManager.registerEncrypter(IdentityEncrypter); password = "test"; return [4 /*yield*/, testKeyManager.storeKey({ key: { id: id, type: KeyType.plaintextKey, publicKey: "AVACYN", privateKey: "ARCHANGEL", }, password: password, encrypterName: "IdentityEncrypter", })]; case 1: metadata = _c.sent(); expect(metadata).toEqual({ id: id, }); _a = expect; return [4 /*yield*/, testKeyManager.loadAllKeyIds()]; case 2: _a.apply(void 0, [_c.sent()]).toEqual([id]); _b = expect; return [4 /*yield*/, testKeyManager.loadKey(id, password)]; case 3: _b.apply(void 0, [_c.sent()]).toEqual({ id: id, type: KeyType.plaintextKey, publicKey: "AVACYN", privateKey: "ARCHANGEL", }); return [2 /*return*/]; } }); }); }); test("Save and remove an ID of one's own", function () { return __awaiter(_this, void 0, void 0, function () { var testStore, testKeyManager, id, password, metadata, _a, _b, e_1; return __generator(this, function (_c) { switch (_c.label) { case 0: testStore = new MemoryKeyStore(); testKeyManager = new KeyManager({ keyStore: testStore, }); id = "this is a very good id, and I like it"; testKeyManager.registerEncrypter(IdentityEncrypter); password = "test"; return [4 /*yield*/, testKeyManager.storeKey({ key: { id: id, type: KeyType.plaintextKey, publicKey: "AVACYN", privateKey: "ARCHANGEL", }, password: password, encrypterName: "IdentityEncrypter", })]; case 1: metadata = _c.sent(); expect(metadata).toEqual({ id: id, }); _a = expect; return [4 /*yield*/, testKeyManager.loadAllKeyIds()]; case 2: _a.apply(void 0, [_c.sent()]).toEqual([id]); _b = expect; return [4 /*yield*/, testKeyManager.loadKey(id, password)]; case 3: _b.apply(void 0, [_c.sent()]).toEqual({ id: id, type: KeyType.plaintextKey, publicKey: "AVACYN", privateKey: "ARCHANGEL", }); return [4 /*yield*/, testKeyManager.removeKey(metadata.id)]; case 4: _c.sent(); _c.label = 5; case 5: _c.trys.push([5, 7, , 8]); return [4 /*yield*/, testKeyManager.loadKey(id, password)]; case 6: _c.sent(); expect("The function should have thrown but didn't, the test failed!").toBe(null); return [3 /*break*/, 8]; case 7: e_1 = _c.sent(); expect(e_1.toString()).toContain("Key not found"); return [3 /*break*/, 8]; case 8: return [2 /*return*/]; } }); }); }); test("Save keys", function () { return __awaiter(_this, void 0, void 0, function () { var testStore, testKeyManager, password, metadata, _a; return __generator(this, function (_b) { switch (_b.label) { case 0: testStore = new MemoryKeyStore(); testKeyManager = new KeyManager({ keyStore: testStore, }); testKeyManager.registerEncrypter(IdentityEncrypter); password = "test"; return [4 /*yield*/, testKeyManager.storeKey({ key: { type: KeyType.plaintextKey, publicKey: "AVACYN", privateKey: "ARCHANGEL", }, password: password, encrypterName: "IdentityEncrypter", })]; case 1: metadata = _b.sent(); expect(metadata).toEqual({ id: "0.5", }); _a = expect; return [4 /*yield*/, testKeyManager.loadKey("0.5", password)]; case 2: _a.apply(void 0, [_b.sent()]).toEqual({ id: "0.5", privateKey: "ARCHANGEL", publicKey: "AVACYN", type: "plaintextKey", }); return [2 /*return*/]; } }); }); }); test("Save / remove keys", function () { return __awaiter(_this, void 0, void 0, function () { var testStore, testKeyManager, password, metadata, _a, e_2; return __generator(this, function (_b) { switch (_b.label) { case 0: testStore = new MemoryKeyStore(); testKeyManager = new KeyManager({ keyStore: testStore, }); testKeyManager.registerEncrypter(IdentityEncrypter); password = "test"; return [4 /*yield*/, testKeyManager.storeKey({ key: { type: KeyType.plaintextKey, publicKey: "AVACYN", privateKey: "ARCHANGEL", }, password: password, encrypterName: "IdentityEncrypter", })]; case 1: metadata = _b.sent(); expect(metadata).toEqual({ id: "0.5", }); _a = expect; return [4 /*yield*/, testKeyManager.loadKey("0.5", password)]; case 2: _a.apply(void 0, [_b.sent()]).toEqual({ id: "0.5", privateKey: "ARCHANGEL", publicKey: "AVACYN", type: "plaintextKey", }); return [4 /*yield*/, testKeyManager.removeKey(metadata.id)]; case 3: _b.sent(); _b.label = 4; case 4: _b.trys.push([4, 6, , 7]); return [4 /*yield*/, testKeyManager.loadKey("0.5", password)]; case 5: _b.sent(); expect("The function should have thrown but didn't, the test failed!").toBe(null); return [3 /*break*/, 7]; case 6: e_2 = _b.sent(); expect(e_2.toString()).toContain("Key not found"); return [3 /*break*/, 7]; case 7: return [2 /*return*/]; } }); }); }); test("Sign transactions", function () { return __awaiter(_this, void 0, void 0, function () { var testStore, testKeyManager, network, keypair, keyMetadata, source, transaction, signedTransaction; return __generator(this, function (_a) { switch (_a.label) { case 0: testStore = new MemoryKeyStore(); testKeyManager = new KeyManager({ keyStore: testStore, }); network = DigitalBitsSdk.Networks.TESTNET; testKeyManager.registerEncrypter(IdentityEncrypter); keypair = DigitalBitsSdk.Keypair.master(network); return [4 /*yield*/, testKeyManager.storeKey({ key: { type: KeyType.plaintextKey, publicKey: keypair.publicKey(), privateKey: keypair.secret(), network: network, }, password: "test", encrypterName: "IdentityEncrypter", })]; case 1: keyMetadata = _a.sent(); source = new DigitalBitsSdk.Account("GBBM6BKZPEHWYO3E3YKREDPQXMS4VK35YLNU7NFBRI26RAN7GI5POFBB", "0"); transaction = new DigitalBitsSdk.TransactionBuilder(source, { fee: DigitalBitsSdk.BASE_FEE, networkPassphrase: network, }) .addOperation(DigitalBitsSdk.Operation.inflation({})) .setTimeout(DigitalBitsSdk.TimeoutInfinite) .build(); return [4 /*yield*/, testKeyManager.signTransaction({ transaction: transaction, id: keyMetadata.id, password: "test", })]; case 2: signedTransaction = _a.sent(); expect(keypair.verify(transaction.hash(), // @ts-ignore signedTransaction.signatures[0].signature())).toEqual(true); return [2 /*return*/]; } }); }); }); }); describe("KeyManager Scrypt", function () { var clock; mockRandomForEach([0.5]); beforeEach(function () { clock = sinon.useFakeTimers(); }); afterEach(function () { clock.restore(); }); test("Save / remove keys", function () { return __awaiter(void 0, void 0, void 0, function () { var testStore, testKeyManager, password, metadata, _a, e_3, e_4; return __generator(this, function (_b) { switch (_b.label) { case 0: testStore = new MemoryKeyStore(); testKeyManager = new KeyManager({ keyStore: testStore, }); testKeyManager.registerEncrypter(ScryptEncrypter); password = "test"; return [4 /*yield*/, testKeyManager.storeKey({ key: { type: KeyType.plaintextKey, publicKey: "AVACYN", privateKey: "ARCHANGEL", }, password: password, encrypterName: ScryptEncrypter.name, })]; case 1: metadata = _b.sent(); expect(metadata).toEqual({ id: "0.5", }); _a = expect; return [4 /*yield*/, testKeyManager.loadKey("0.5", password)]; case 2: _a.apply(void 0, [_b.sent()]).toEqual({ id: "0.5", privateKey: "ARCHANGEL", publicKey: "AVACYN", type: "plaintextKey", }); _b.label = 3; case 3: _b.trys.push([3, 5, , 6]); return [4 /*yield*/, testKeyManager.loadKey("0.5", "I don't know the password but I'm hoping the decrypter works anyway")]; case 4: _b.sent(); expect("The function should have thrown but didn't, the test failed!").toBe(null); return [3 /*break*/, 6]; case 5: e_3 = _b.sent(); expect(e_3.toString()).toContain("Couldn't decrypt key"); return [3 /*break*/, 6]; case 6: return [4 /*yield*/, testKeyManager.removeKey(metadata.id)]; case 7: _b.sent(); _b.label = 8; case 8: _b.trys.push([8, 10, , 11]); return [4 /*yield*/, testKeyManager.loadKey("0.5", password)]; case 9: _b.sent(); expect("The function should have thrown but didn't, the test failed!").toBe(null); return [3 /*break*/, 11]; case 10: e_4 = _b.sent(); expect(e_4.toString()).toContain("Key not found"); return [3 /*break*/, 11]; case 11: return [2 /*return*/]; } }); }); }); }); describe("KeyManager Scrypt, multiple keys with different passwords", function () { var clock; beforeEach(function () { clock = sinon.useFakeTimers(); }); afterEach(function () { clock.restore(); }); test("Save multiple keys", function () { return __awaiter(void 0, void 0, void 0, function () { var testStore, testKeyManager, password1, metadata1, _a, password2, metadata2, _b, _c; return __generator(this, function (_d) { switch (_d.label) { case 0: testStore = new MemoryKeyStore(); testKeyManager = new KeyManager({ keyStore: testStore, }); testKeyManager.registerEncrypter(ScryptEncrypter); password1 = "test1"; return [4 /*yield*/, testKeyManager.storeKey({ key: { id: "key1", type: KeyType.plaintextKey, publicKey: "AVACYN1", privateKey: "ARCHANGEL1", }, password: password1, encrypterName: ScryptEncrypter.name, })]; case 1: metadata1 = _d.sent(); expect(metadata1).toEqual({ id: "key1", }); _a = expect; return [4 /*yield*/, testKeyManager.loadKey("key1", password1)]; case 2: _a.apply(void 0, [_d.sent()]).toEqual({ id: "key1", privateKey: "ARCHANGEL1", publicKey: "AVACYN1", type: "plaintextKey", }); password2 = "test1"; return [4 /*yield*/, testKeyManager.storeKey({ key: { id: "key2", type: KeyType.plaintextKey, publicKey: "AVACYN2", privateKey: "ARCHANGEL2", }, password: password2, encrypterName: ScryptEncrypter.name, })]; case 3: metadata2 = _d.sent(); expect(metadata2).toEqual({ id: "key2", }); _b = expect; return [4 /*yield*/, testKeyManager.loadKey("key2", password2)]; case 4: _b.apply(void 0, [_d.sent()]).toEqual({ id: "key2", privateKey: "ARCHANGEL2", publicKey: "AVACYN2", type: "plaintextKey", }); _c = expect; return [4 /*yield*/, testKeyManager.loadKey("key1", password1)]; case 5: _c.apply(void 0, [_d.sent()]).toEqual({ id: "key1", privateKey: "ARCHANGEL1", publicKey: "AVACYN1", type: "plaintextKey", }); return [2 /*return*/]; } }); }); }); }); //# sourceMappingURL=KeyManager.test.js.map