fsl-js-sdk
Version:
sdk for web
293 lines (292 loc) • 15.3 kB
JavaScript
;
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;