var algo = 'AES-CBC'; var initializeButtons = (root) => { var buttons = root.querySelectorAll('a[data-download-button]'); for (let i = 0; i < buttons.length; i ++) { initialize(buttons[i]); } }; var initialize = (button) => { button.addEventListener('click', onClick); }; var onClick = e => download(e.target); var download = (button) => { console.log(button.dataset.key); var keyData = JSON.parse(button.dataset.key), //keyData, // = JSON.parse(keyString), ivData = JSON.parse(button.dataset.iv), iv = new Uint8Array(ivData), url = button.dataset.tempUrlGet, data, key ; console.log('keyData', keyData); console.log('iv', iv); console.log('url', url); window.crypto.subtle.importKey('jwk', keyData, { name: algo, iv: iv}, false, ['decrypt']) .then(nKey => { key = nKey; console.log(key); return window.fetch(url); }) .then(r => { if (r.ok) { return r.arrayBuffer(); } else { console.log(r); throw new Error(r.statusCode); } }) .then(buffer => { return window.crypto.subtle.decrypt({ name: algo, iv: iv }, key, buffer); }) .then(decrypted => { var blob = new Blob([decrypted]), url = window.URL.createObjectURL(blob) ; button.href = url; button.removeEventListener('click', onClick); }) .catch(error => { console.log(error); }) ; }; window.addEventListener('load', function(e) { console.log('load'); initializeButtons(e.target); });