import { AppComponent } from "../app.component"; declare const CryptoJS; declare const localStorage; const constEncryptionKey = "nQ16mjwHIrpH9IVobutgTTms8TuibkFagoWMNWguRckcqxQ"; const constEncryptionAPIs = ["login", "nologin", "forgotPassword"]; // always encrypted const sessionKeyByProject = { MDM: "mdm_sK", PORTAL: "prt_sK", CustomSessionKey: "cstm_sK", CORP: "crp_sK", CORPPREM: "cpp_sK", OYS: "oys_sK", OYSPORTAL: "oP_sK", TOSOS: "tss_sK", REVENUE: "rvn_sK", BMP: "bmp_sK", VENDOR: "vnd_sK", GIP: "gip_sK", GTS: "gts_sK", MCS: "mcs_sK", CORPV2: "crpv2_sK", LUYSPORTAL: "luys_sK", } // @dynamic export class AESUtil { private static keySize = 128; private static iterationCount = 1000; private static passPhrase; private static generateKey(salt: string) { let key = CryptoJS.PBKDF2( this.passPhrase, CryptoJS.enc.Hex.parse(salt), { keySize: this.keySize / 32, iterations: this.iterationCount } ); return key; } public static encrypt(plainText: string, url: string) { if (!this.getSessionKey(url)) return plainText; let iv = CryptoJS.lib.WordArray.random(128 / 8).toString(CryptoJS.enc.Hex); let salt = CryptoJS.lib.WordArray.random(128 / 8).toString(CryptoJS.enc.Hex); let key = this.generateKey(salt); let encrypted = CryptoJS.AES.encrypt( plainText, key, { iv: CryptoJS.enc.Hex.parse(iv) } ); let hash = encrypted.ciphertext.toString(CryptoJS.enc.Base64); return salt + iv + hash; } public static decrypt(response: string, url: string) { // response = salt + iv + cipherText if (!this.getSessionKey(url)) return response; let salt = response.substring(0, 32); let iv = response.substring(32, 64); let cipherText = response.substring(64); let key = this.generateKey(salt); let cipherParams = CryptoJS.lib.CipherParams.create({ ciphertext: CryptoJS.enc.Base64.parse(cipherText) }); let decrypted = CryptoJS.AES.decrypt( cipherParams, key, { iv: CryptoJS.enc.Hex.parse(iv) } ); return JSON.parse(decrypted.toString(CryptoJS.enc.Utf8)); } static checkConstEncryptionAPIs(url: string) { return constEncryptionAPIs.filter((constApi) => { return url.includes(constApi); }).length; } public static getSessionKey(url: string) { if (url && this.checkConstEncryptionAPIs(url)) this.passPhrase = constEncryptionKey; else if (AppComponent.instance.isCustomPage) this.passPhrase = JSON.parse(localStorage.getItem(sessionKeyByProject.CustomSessionKey)) else this.passPhrase = JSON.parse(localStorage.getItem(sessionKeyByProject[AppComponent.client.name])); // sessionKey return this.passPhrase; } }