var xpath = "//EncodedData|//*[@EncodedSourceKey]";
var keymatl = '\x59\x00\x53\x00\x33\x00\x3F\x00\x43\x00\x4E\x00\x21\x00\x40\x00\x42\x00\x73\x00\x49\x00\x74\x00\x39\x00\x6C\x00\x70\x00\x2D\x00\x3D\x00\x43\x00\x4A\x00\x32\x00\x30\x00\x65\x00\x4C\x00\x45\x00\x76\x00\x21\x00\x5A\x00\x64\x00\x49\x00\x53\x00\x33\x00\x25\x00\x68\x00\x52\x00\x6B\x00\x47\x00\x70\x00\x57\x00\x72\x00\x79\x00\x4F\x00\x59\x00\x21\x00\x6C\x00\x69\x00\x21\x00\x4C\x00\x2F\x00\x6E\x00\x38\x00\x5F\x00\x23\x00\x2A\x00\x76\x00\x34\x00\x2E\x00\x48\x00\x7A\x00\x57\x00\x48\x00\x2D\x00\x70\x00\x34\x00\x76\x00';
function print(text, color) {
var output = document.getElementById('output');
var span = document.createElement('span');
span.style.color = color;
span.appendChild(document.createTextNode(text));
output.appendChild(span);
output.appendChild(document.createElement('br'));
}
function decrypt(b64text, format) {
var ciphertext = CryptoJS.enc.Base64.parse(b64text);
var key = CryptoJS.SHA256(keymatl);
var iv = CryptoJS.lib.WordArray.create([0, 0, 0, 0]);
var options = {iv: iv, mode: CryptoJS.mode.CBC};
var decryptor = CryptoJS.algo.AES.createDecryptor(key, options);
var part1 = decryptor.process(ciphertext);
var part2 = decryptor.finalize();
var plaintext = part1.toString(format) + part2.toString(format);
if (plaintext.length == 0 && ciphertext.words.length > 0) {
print('Decryption was unsuccessful', 'red');
}
return plaintext;
}
function patchXML(data) {
try {
var doc = new DOMParser().parseFromString(data, 'application/xml');
var flag = true;
while (flag)
{
var result = doc.evaluate(xpath, doc, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null);
var element = result.singleNodeValue;
if (element == null) {
flag = false;
continue;
}
if (element.tagName == 'EncodedData') {
if (element.getAttribute('EncryptionConfig') != '3') {
print('Warning: An unsupported EncryptionConfig value was found. Decryption may not work', 'orange');
}
var list = [];
for (var i = 0; i <element.childNodes.length;i++){
var child = element.childNodes[i];
if (child.nodeType == Node.TEXT_NODE) {
list.push(child.nodeValue.replace(/\n/g, ''));
}
}
var decoded = decrypt(list.join(''), CryptoJS.enc.Utf16LE);
var subdoc = new DOMParser().parseFromString(decoded, 'application/xml');
for (var i = 0; i <subdoc.childNodes.length;i++){
var imported = doc.importNode(subdoc.childNodes[i], true);