@bajetech/digitalbits-wallet-sdk
Version:
A library to make it easier to write wallets that interact with the DigitalBits blockchain
156 lines • 7.86 kB
JavaScript
import { __awaiter, __generator } from "tslib";
import DigitalBitsSdk from "xdb-digitalbits-sdk";
import { KeyType } from "./constants/keys";
import { generateEncryptedKey } from "./fixtures/keys";
import { getKeyMetadata } from "./helpers/getKeyMetadata";
function isKey(obj) {
return obj.privateKey !== undefined;
}
function isEncryptedKey(obj) {
return obj.encryptedBlob !== undefined;
}
/**
* Validates an `Encrypter` object. Resolves to true if valid.
*/
export function testEncrypter(encrypter) {
if (encrypter === void 0) { encrypter = 0; }
return __awaiter(this, void 0, void 0, function () {
var account, publicKey, privateKey, key, password, encryptedKey, decryptedKey;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
account = DigitalBitsSdk.Keypair.random();
if (!encrypter) {
return [2 /*return*/, Promise.reject(new Error("[Encrypter] Encrypter not defined"))];
}
if (typeof encrypter.name !== "string") {
return [2 /*return*/, Promise.reject(new Error("[Encrypter.name] Name not defined"))];
}
if (typeof encrypter.encryptKey !== "function") {
return [2 /*return*/, Promise.reject(new Error("[Encrypter.encryptKey] Function not found"))];
}
if (typeof encrypter.decryptKey !== "function") {
return [2 /*return*/, Promise.reject(new Error("[Encrypter.decryptKey] Function not found"))];
}
publicKey = account.publicKey();
privateKey = account.secret();
key = {
id: "test id",
type: KeyType.plaintextKey,
publicKey: publicKey,
privateKey: privateKey,
};
password = "kh2fu0b939uvdkj";
return [4 /*yield*/, encrypter.encryptKey({
key: key,
password: password,
})];
case 1:
encryptedKey = _a.sent();
if (!isEncryptedKey(encryptedKey)) {
return [2 /*return*/, Promise.reject(new Error("[Encrypter.encryptKey] Encrypted key not valid"))];
}
return [4 /*yield*/, encrypter.decryptKey({
encryptedKey: encryptedKey,
password: password,
})];
case 2:
decryptedKey = _a.sent();
if (!isKey(decryptedKey)) {
return [2 /*return*/, Promise.reject(new Error("[Encrypter.decryptKey] Decrypted key not valid"))];
}
if (decryptedKey.privateKey !== key.privateKey) {
return [2 /*return*/, Promise.reject(new Error("[Encrypter.decryptKey] Decrypted key doesn't match original key"))];
}
return [2 /*return*/, Promise.resolve(true)];
}
});
});
}
/**
* Validates a `KeyStore` object. Resolves to true if valid.
*/
export function testKeyStore(keyStoreCandidate) {
if (keyStoreCandidate === void 0) { keyStoreCandidate = null; }
return __awaiter(this, void 0, void 0, function () {
var functions, _i, functions_1, functionName, keyStore, encryptedKey, keyMetadata, e_1, testMetadata, e_2, allKeys, removalMetadata, noKeys;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!keyStoreCandidate) {
return [2 /*return*/, Promise.reject(new Error("[KeyStore] KeyStore not defined"))];
}
if (!keyStoreCandidate.name) {
return [2 /*return*/, Promise.reject(new Error("[KeyStore.name] Name not defined"))];
}
functions = [
"configure",
"storeKeys",
"updateKeys",
"loadKey",
"removeKey",
"loadAllKeys",
];
for (_i = 0, functions_1 = functions; _i < functions_1.length; _i++) {
functionName = functions_1[_i];
if (typeof keyStoreCandidate[functionName] !== "function") {
return [2 /*return*/, Promise.reject(new Error("[KeyStore.".concat(functionName, "] Invalid function")))];
}
}
keyStore = keyStoreCandidate;
encryptedKey = generateEncryptedKey(keyStore.name);
keyMetadata = getKeyMetadata(encryptedKey);
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
return [4 /*yield*/, keyStore.updateKeys([encryptedKey])];
case 2:
_a.sent();
return [2 /*return*/, Promise.reject(new Error("[KeyStore.updateKeys] Doesn't error when updating a nonexistent key"))];
case 3:
e_1 = _a.sent();
return [3 /*break*/, 4];
case 4: return [4 /*yield*/, keyStore.storeKeys([encryptedKey])];
case 5:
testMetadata = _a.sent();
if (keyMetadata.id !== testMetadata[0].id) {
return [2 /*return*/, Promise.reject(new Error("[KeyStore.storeKeys] Key metadata doesn't match"))];
}
_a.label = 6;
case 6:
_a.trys.push([6, 8, , 9]);
return [4 /*yield*/, keyStore.storeKeys([encryptedKey])];
case 7:
_a.sent();
return [2 /*return*/, Promise.reject(new Error("[KeyStore.updateKeys] Doesn't error when storing a stored key"))];
case 8:
e_2 = _a.sent();
return [3 /*break*/, 9];
case 9: return [4 /*yield*/, keyStore.loadAllKeys()];
case 10:
allKeys = _a.sent();
if (allKeys.length !== 1 ||
encryptedKey.encryptedBlob !== allKeys[0].encryptedBlob) {
return [2 /*return*/, Promise.reject(new Error("[KeyStore.loadAllKeys] loadAllKeys doesn't match"))];
}
return [4 /*yield*/, keyStore.removeKey(encryptedKey.id)];
case 11:
removalMetadata = _a.sent();
if (!removalMetadata || keyMetadata.id !== removalMetadata.id) {
return [2 /*return*/, Promise.reject(new Error("[KeyStore.removeKey] Removed metadata doesn't match"))];
}
if (!removalMetadata || keyMetadata.id !== removalMetadata.id) {
return [2 /*return*/, Promise.reject(new Error("[KeyStore.removeKey] Removed metadata doesn't match"))];
}
return [4 /*yield*/, keyStore.loadAllKeys()];
case 12:
noKeys = _a.sent();
if (noKeys.length) {
return [2 /*return*/, Promise.reject(new Error("[KeyStore.removeKey] Key not removed"))];
}
return [2 /*return*/, Promise.resolve(true)];
}
});
});
}
//# sourceMappingURL=PluginTesting.js.map