UNPKG

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