@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
JavaScript
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