UNPKG

fsl-js-sdk

Version:
293 lines (292 loc) 15.3 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; // @ts-ignore var crypto_browserify_1 = __importDefault(require("crypto-browserify")); var jsrsasign_1 = __importDefault(require("jsrsasign")); var md5_1 = __importDefault(require("md5")); var jsencrypt_1 = __importDefault(require("jsencrypt")); var api_1 = require("../../api"); var utils_1 = require("../../utils"); var keyPairs = { privateKey: '', publicKey: '', }; var EncryptBase = /** @class */ (function () { function EncryptBase() { } EncryptBase.encryption = function (key, value) { var cipher = crypto_browserify_1.default.createCipher('aes-256-cbc', key); var encrypted = cipher.update(value, 'utf8', 'hex'); encrypted += cipher.final('hex'); return encrypted; }; EncryptBase.decrypt = function (key, hash) { var decipher = crypto_browserify_1.default.createDecipher('aes-256-cbc', key); var decrypted = decipher.update(hash, 'hex', 'utf8'); decrypted += decipher.final('utf8'); return decrypted; }; EncryptBase.privateEncryption = function (key, value) { var cipher = crypto_browserify_1.default.createCipher('aes-256-cbc', key); var encrypted = cipher.update(value, 'utf8', 'hex'); encrypted += cipher.final('hex'); return encrypted; }; EncryptBase.privateDecrypt = function (key, hash) { var decipher = crypto_browserify_1.default.createDecipher('aes-256-cbc', key); var decrypted = decipher.update(hash, 'hex', 'utf8'); decrypted += decipher.final('utf8'); return decrypted; }; EncryptBase.generateRsaKey = function () { var key = jsrsasign_1.default.KEYUTIL.generateKeypair('RSA', 1024); var privateKey = jsrsasign_1.default.KEYUTIL.getPEM(key.prvKeyObj, 'PKCS8PRV'); var publicKey = jsrsasign_1.default.KEYUTIL.getPEM(key.pubKeyObj); return { privateKey: privateKey, publicKey: publicKey, }; }; EncryptBase.sign = function (str, publicKey) { var enc = jsrsasign_1.default.KJUR.crypto.Cipher.encrypt(str, jsrsasign_1.default.KEYUTIL.getKey(publicKey), 'RSAOAEP'); return enc; }; EncryptBase.decryptSign = function (privateKey, sign) { var decrypt = new jsencrypt_1.default(); decrypt.setPrivateKey(privateKey); var result = decrypt.decrypt(sign) || ''; return result; }; EncryptBase.encryptAES = function (text, key) { return __awaiter(this, void 0, void 0, function () { var encoder, data, keyData, hashBuffer, aesKey, iv, encryptedData, combinedData; return __generator(this, function (_a) { switch (_a.label) { case 0: encoder = new TextEncoder(); data = encoder.encode(text); keyData = encoder.encode(key); return [4 /*yield*/, window.crypto.subtle.digest('SHA-256', keyData)]; case 1: hashBuffer = _a.sent(); return [4 /*yield*/, window.crypto.subtle.importKey('raw', hashBuffer, { name: 'AES-GCM' }, false, ['encrypt'])]; case 2: aesKey = _a.sent(); iv = window.crypto.getRandomValues(new Uint8Array(12)); return [4 /*yield*/, window.crypto.subtle.encrypt({ name: 'AES-GCM', iv: iv, }, aesKey, data)]; case 3: encryptedData = _a.sent(); combinedData = new Uint8Array(iv.byteLength + encryptedData.byteLength); combinedData.set(iv, 0); combinedData.set(new Uint8Array(encryptedData), iv.byteLength); return [2 /*return*/, btoa(String.fromCharCode.apply(null, combinedData))]; } }); }); }; EncryptBase.decryptAES = function (encryptedText, key) { return __awaiter(this, void 0, void 0, function () { var combinedData, iv, encryptedData, encoder, keyData, hashBuffer, aesKey, decryptedData, decoder; return __generator(this, function (_a) { switch (_a.label) { case 0: combinedData = new Uint8Array(atob(encryptedText) .split('') .map(function (c) { return c.charCodeAt(0); })); iv = combinedData.slice(0, 12); encryptedData = combinedData.slice(12); encoder = new TextEncoder(); keyData = encoder.encode(key); return [4 /*yield*/, window.crypto.subtle.digest('SHA-256', keyData)]; case 1: hashBuffer = _a.sent(); return [4 /*yield*/, window.crypto.subtle.importKey('raw', hashBuffer, { name: 'AES-GCM' }, false, ['decrypt'])]; case 2: aesKey = _a.sent(); return [4 /*yield*/, window.crypto.subtle.decrypt({ name: 'AES-GCM', iv: iv, }, aesKey, encryptedData)]; case 3: decryptedData = _a.sent(); decoder = new TextDecoder(); return [2 /*return*/, decoder.decode(decryptedData)]; } }); }); }; EncryptBase.md5Encode = function (val) { return (0, md5_1.default)(val + ''); }; EncryptBase.getEncryptedChainKeys = function (isNewUser, pwd, code) { return __awaiter(this, void 0, void 0, function () { var privateKey, publicKey, keys, pubKey, _a, localPwd_1, cloudPwd_1, local_1, cloud_1, params, _b, localPwd, cloudPwd, local, cloud; return __generator(this, function (_c) { switch (_c.label) { case 0: privateKey = keyPairs.privateKey, publicKey = keyPairs.publicKey; if (!privateKey || !publicKey) { keys = EncryptBase.generateRsaKey(); privateKey = keys.privateKey; publicKey = keys.publicKey; keyPairs.privateKey = privateKey; keyPairs.publicKey = publicKey; } pubKey = publicKey .replace('-----BEGIN PUBLIC KEY-----', '') .replace('-----END PUBLIC KEY-----', ''); if (!isNewUser) return [3 /*break*/, 2]; if (!pwd) { (0, utils_1.toast)(JSON.stringify({ msg: 'invalid password', code: -1, method: 'getEncryptedChainKeys', })); return [2 /*return*/, Promise.reject({ msg: 'invalid password' })]; } return [4 /*yield*/, (0, api_1.updateUserInfo)([ '5', EncryptBase.md5Encode(pwd), pubKey, ]).catch(function (err) { var errorMsg = err.msg || err.message; var msg = [ '|this| is not an object', 'PromiseReject called on non-object', ].includes(errorMsg) ? 'network error' : errorMsg; (0, utils_1.toast)(JSON.stringify({ msg: "".concat(msg), code: err === null || err === void 0 ? void 0 : err.code, method: 'getEncryptedChainKeys', })); return Promise.reject({ msg: msg }); })]; case 1: _a = (_c.sent()), localPwd_1 = _a.localPwd, cloudPwd_1 = _a.cloudPwd; local_1 = EncryptBase.decryptSign(privateKey, localPwd_1); cloud_1 = EncryptBase.decryptSign(privateKey, cloudPwd_1); if (local_1 || cloud_1) { (0, utils_1.toast)(JSON.stringify({ data: { localToken: local_1, cloudFilePwd: cloud_1, }, method: 'getEncryptedChainKeys', })); } return [2 /*return*/, { localToken: local_1, cloudFilePwd: cloud_1 }]; case 2: params = [pubKey, pwd ? EncryptBase.md5Encode(pwd) : '']; if (code) { params.push(code); } return [4 /*yield*/, (0, api_1.getChainKeys)(params).catch(function (err) { var errorMsg = err.msg || err.message; var msg = [ '|this| is not an object', 'PromiseReject called on non-object', ].includes(errorMsg) ? 'network error' : errorMsg; (0, utils_1.toast)(JSON.stringify({ msg: "".concat(msg), code: err === null || err === void 0 ? void 0 : err.code, method: 'getEncryptedChainKeys', })); return Promise.reject({ msg: msg }); })]; case 3: _b = (_c.sent()), localPwd = _b.localPwd, cloudPwd = _b.cloudPwd; local = EncryptBase.decryptSign(privateKey, localPwd); if (cloudPwd) { cloud = EncryptBase.decryptSign(privateKey, cloudPwd); } if (local || cloud) { (0, utils_1.toast)(JSON.stringify({ data: { localToken: local, cloudFilePwd: cloud, }, method: 'getEncryptedChainKeys', })); } return [2 /*return*/, { localToken: local, cloudFilePwd: cloud, }]; } }); }); }; __decorate([ utils_1.addNotifyFunction ], EncryptBase, "encryption", null); __decorate([ utils_1.addNotifyFunction ], EncryptBase, "decrypt", null); __decorate([ utils_1.addNotifyFunction ], EncryptBase, "generateRsaKey", null); __decorate([ utils_1.addNotifyFunction ], EncryptBase, "sign", null); __decorate([ utils_1.addNotifyFunction ], EncryptBase, "decryptSign", null); __decorate([ utils_1.addNotifyFunction ], EncryptBase, "md5Encode", null); return EncryptBase; }()); exports.default = EncryptBase;