I'm trying to write a sample decryptor for GnuPG encrypted files in JavaScript using openpgp.js.
So I tried it naively without even asking if it is even possible. I made the following page.
popup.html
<!doctype html> <!-- --> <html> <head> <title>Popup</title> <script src="openpgp.js"></script> <script src="popup.js"></script> </head> <body> <p>Upload message: </p><input id="message" type="file"/><br> <p>Upload secret key: </p><input id="secret" type="file"/><br> <p>Secret key password: </p><input id="password" type="password"/><br><br> <button id="decrypt">Decrypt</button> <p id="output"></p> <div id="loadingDiv"></div> </body> </html>
popup.js
var message = ""; var secret = ""; function readMessage (e) { var file = e.target.files[0]; if (!file) { message = ""; } var reader = new FileReader(); reader.onload = function (e) { message = e.target.result; }; reader.readAsText (file); } function readSecret (e) { var file = e.target.files[0]; if (!file) { secret = ""; } var reader = new FileReader(); reader.onload = function (e) { secret = e.target.result; }; reader.readAsText (file); } function loadScript(url, callback) { var head = document.getElementsByTagName ("head")[0]; var script = document.createElement ("script"); script.type = "text/javascript"; script.src = url; script.onreadystatechange = callback; script.onload = callback; head.appendChild(script); } document.addEventListener ("DOMContentLoaded", function() { document.getElementById ("message").addEventListener("change", readMessage, false); document.getElementById ("secret").addEventListener("change", readSecret, false); var gen = function() { document.getElementById ("decrypt").addEventListener ("click", function() { var output = document.getElementById ("output"); output.style.color = "black"; if (document.getElementById ("message").value == "") { output.innerHTML = "No message provided"; output.style.color = "red"; } else if (document.getElementById ("secret").value == "") { output.innerHTML = "No secret key provided"; output.style.color = "red"; } else if (document.getElementById ("password").value == "") { output.innerHTML = "No password for secret key provided"; output.style.color = "red"; } else { var privateKey = openpgp.key.readArmored (secret).keys[0]; var isCorrect = privateKey.decrypt (document.getElementById ("password").value); if (isCorrect) { output.innerHTML = ""; output.style.color = "black"; var img = document.createElement ("img"); img.src = "loading.gif"; img.id = "loading"; document.getElementById ("loadingDiv").appendChild (img); message = openpgp.message.readArmored (message); openpgp.decryptMessage (privateKey, message).then (function (plaintext) { output.innerHTML = plaintext; }).catch (function(error) { output.innerHTML = "Error while decrypting"; output.style.color = "red"; }); } else { output.innerHTML = "Incorrect password"; output.style.color = "red"; } } }); } loadScript ("openpgp.js", gen); });
openpgp.js gives an Unknown ASCII armor type
error on message = openpgp.message.readArmored (message);
.
So is it possible? If it is, should I do something different?