window.EncryptionUtil = function () { var public_key_template = "-----BEGIN PUBLIC KEY-----\n$K-----END PUBLIC KEY-----"; return { certParser: function (cert) { var lines = cert.split('\n'); var read = false; var b64 = false; var end = false; var flag = ''; var retObj = {}; retObj.info = ''; retObj.salt = ''; retObj.iv; retObj.b64 = ''; retObj.aes = false; retObj.mode = ''; retObj.bits = 0; for (var i = 0; i < lines.length; i++) { flag = lines[i].substr(0, 9); if (i == 1 && flag != 'Proc-Type' && flag.indexOf('M') == 0)//unencrypted cert? b64 = true; switch (flag) { case '-----BEGI': read = true; break; case 'Proc-Type': if (read) retObj.info = lines[i]; break; case 'DEK-Info:': if (read) { var tmp = lines[i].split(','); var dek = tmp[0].split(': '); var aes = dek[1].split('-'); retObj.aes = (aes[0] == 'AES') ? true : false; retObj.mode = aes[2]; retObj.bits = parseInt(aes[1]); retObj.salt = tmp[1].substr(0, 16); retObj.iv = tmp[1]; } break; case '': if (read) b64 = true; break; case '-----END ': if (read) { b64 = false; read = false; } break; default: if (read && b64) retObj.b64 += pidCryptUtil.stripLineFeeds(lines[i]); } } return retObj; }, encrypt: function (iframed) { // Concat the encrypted fields's name var encrypted_fields = ""; var encrypted_values = ""; jQuery("input[encrypt='true']").each(function () { encrypted_fields = encrypted_fields + "#" + jQuery(this).prop('name'); // remvoe extra blank space before encryption (Except bankAccountName field) var fieldName = jQuery(this).prop('name'); if (fieldName.indexOf("bankAccountName") < 0) { encrypted_values = encrypted_values + "#" + jQuery(this).val().replace(/ /g, ""); } else { encrypted_values = encrypted_values + "#" + jQuery(this).val(); } }); jQuery("select[encrypt='true']").each(function () { encrypted_fields = encrypted_fields + "#" + jQuery(this).prop('name'); encrypted_values = encrypted_values + "#" + jQuery(this).val(); }); var encKey = jQuery("input[name='field_key']")[0].value; if (encrypted_fields.length > 0) { jQuery("input[id='encrypted_fields']").val(encrypted_fields); if (!disableHPMEncryption) { // encrypt required. jQuery("input[id='encrypted_values']").val(window.EncryptionUtil.encryptText(encrypted_values, encKey)); } else { // no encrypt required. jQuery("input[id='encrypted_values']").val(encrypted_values); } } if (iframed) { return; } else { // Get the parameters as an array var values = jQuery('#HostedPageForm').serializeArray(); jQuery.each(values, function (i, field) { var fieldName = field.name; if (encrypted_fields.indexOf(fieldName) > -1) { // scratch the encrypted fields field.value = ''; } }); // Convert to URL-encoded string var fValues = jQuery.param(values); return fValues; } }, encryptText: function (text, key) { try { if (key) { var public_key_1024; if (key.indexOf("-----BEGIN") > -1) { public_key_1024 = key; } else { public_key_1024 = public_key_template.replace('$K', key); } /*-----------------------------------------------------------* * ENCRYPT: RSA 4098 bit * *-----------------------------------------------------------*/ var params = window.EncryptionUtil.certParser(public_key_1024); var key = pidCryptUtil.decodeBase64(params.b64); var rsa = new pidCrypt.RSA(); // ASN1 parsing var asn = pidCrypt.ASN1.decode(pidCryptUtil.toByteArray(key)); var tree = asn.toHexTree(); // setting the public key for encryption with retrieved ASN.1 tree rsa.setPublicKeyFromASN(tree); /*** encrypt */ var crypted = rsa.encrypt(text); var fromHex = pidCryptUtil.encodeBase64(pidCryptUtil.convertFromHex(crypted)); var ciphertext = pidCryptUtil.fragment(fromHex, 64); //alert('$$$ '+ciphertext); return ciphertext; } } catch (e) { //alert(e); } return text; } }; }();