@lakutata/core
Version:
Lakutata Framework Core
131 lines • 5.56 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 __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Crypto = void 0;
const Plugin_1 = require("../base/Plugin");
const node_rsa_1 = __importDefault(require("node-rsa"));
const CryptoException_1 = require("../exceptions/CryptoException");
const JSON_1 = require("./JSON");
const DependencyInjection_1 = require("../decorators/DependencyInjection");
class Crypto extends Plugin_1.Plugin {
constructor() {
super(...arguments);
this.bits = 512;
}
generateKeyPair(format = 'PKCS8') {
const key = new node_rsa_1.default({ b: this.bits });
let publicKeyFormat = 'public-pem';
let privateKeyFormat = 'private-pem';
switch (format) {
case 'PKCS8':
{
publicKeyFormat = `pkcs8-${publicKeyFormat}`;
privateKeyFormat = `pkcs8-${privateKeyFormat}`;
}
break;
case 'PKCS1':
{
publicKeyFormat = `pkcs1-${publicKeyFormat}`;
privateKeyFormat = `pkcs1-${privateKeyFormat}`;
}
break;
default: {
publicKeyFormat = `pkcs8-${publicKeyFormat}`;
privateKeyFormat = `pkcs8-${privateKeyFormat}`;
}
}
return {
private: key.exportKey(privateKeyFormat).toString(),
public: key.exportKey(publicKeyFormat).toString()
};
}
sign(data, privateKey) {
const key = new node_rsa_1.default();
key.importKey(privateKey);
if (key.isEmpty())
throw new CryptoException_1.CryptoException('Cannot sign data with empty key');
if (!key.isPrivate())
throw new CryptoException_1.CryptoException('Only allow private key for data signing');
const bufferData = Buffer.from(typeof data === 'string' ? data : this.JSON.stringify(data));
return key.sign(bufferData).toString('base64');
}
verify(data, sign, secretKey) {
const key = new node_rsa_1.default();
key.importKey(secretKey);
if (key.isEmpty())
throw new CryptoException_1.CryptoException('Cannot verify data sign with empty key');
const bufferData = Buffer.from(typeof data === 'string' ? data : this.JSON.stringify(data));
return key.verify(bufferData, Buffer.from(sign, 'base64'));
}
encrypt(data, secretKey) {
const key = new node_rsa_1.default();
key.importKey(secretKey);
if (key.isEmpty())
throw new CryptoException_1.CryptoException('Cannot encrypt data by empty key');
const bufferData = Buffer.from(typeof data === 'string' ? data : this.JSON.stringify(data));
if (key.isPublic(true)) {
return key.encrypt(bufferData).toString('base64');
}
else {
return key.encryptPrivate(bufferData).toString('base64');
}
}
decrypt(encryptedData, secretKey) {
const key = new node_rsa_1.default();
key.importKey(secretKey);
if (key.isEmpty())
throw new CryptoException_1.CryptoException('Cannot decrypt data by empty key');
const bufferData = Buffer.from(encryptedData, 'base64');
const decryptedData = (() => {
let decryptResult = '';
let decryptException = new CryptoException_1.CryptoException('Unknown decrypt exception');
try {
if (key.isPrivate() && !decryptResult)
decryptResult = key.decrypt(bufferData).toString();
}
catch (e) {
decryptException = new CryptoException_1.CryptoException(e.message);
}
try {
if (key.isPublic() && !decryptResult)
decryptResult = key.decryptPublic(bufferData).toString();
}
catch (e) {
decryptException = new CryptoException_1.CryptoException(e.message);
}
if (decryptResult) {
return decryptResult;
}
else {
throw decryptException;
}
})();
try {
return this.JSON.parse(decryptedData);
}
catch (e) {
return decryptedData;
}
}
}
__decorate([
(0, DependencyInjection_1.Inject)('JSON'),
__metadata("design:type", JSON_1.JSON)
], Crypto.prototype, "JSON", void 0);
__decorate([
(0, DependencyInjection_1.Configurable)(),
__metadata("design:type", Number)
], Crypto.prototype, "bits", void 0);
exports.Crypto = Crypto;
//# sourceMappingURL=Crypto.js.map