decodeEntries/index.js (54 lines of code) (raw):

"use strict"; function base64ToHex(base64) { let byteString = atob(base64); let output = ""; for (let i = 0; i < byteString.length; i++) { output += (output ? "" : "") + byteString .charCodeAt(i) .toString(16) .padStart(2, "0"); } return output; } function formatRDNS(rdns) { let output = ""; rdns.forEach((rdn) => { output += `/${rdn.shortName}=${forge.util.decodeUtf8(rdn.value)}`; }); return output; } function parseBase64DN(base64) { let byteString = atob(base64); let asn1 = forge.asn1.fromDer(byteString); let rdns = forge.pki.RDNAttributesAsArray(asn1, null); return rdns; } function decodeLine(line) { let parts = line.split(" "); let issuer = formatRDNS(parseBase64DN(parts[1])); let serial = base64ToHex(parts[3]); return { issuer, serial }; } function decodeFromInput() { let input = document.getElementById("input").value; let output = document.getElementById("output"); while (output.childNodes.length > 0) { output.removeChild(output.childNodes[0]); } let lines = input.split("\n"); lines.forEach((line) => { if (line.length > 0) { let text; try { let decoded = decodeLine(line); text = `issuer: ${decoded.issuer} serial: ${decoded.serial}`; } catch (e) { text = `Couldn't decode entry: ${line}`; } let textNode = document.createTextNode(text); output.appendChild(textNode); let br = document.createElement("br"); output.appendChild(br); } }); }