UNPKG

@lakutata/core

Version:

Lakutata Framework Core

131 lines 5.56 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 __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