Post-Quantum Cryptography (PQC) Risk Assessment Tool
Assess the hypothetical quantum vulnerability risk for a cryptographic asset based on selected parameters.
Important Disclaimer: This tool uses a **simplified, illustrative model**. The "Quantum Risk Score" and "Recommended Action Timeline" generated are **NOT scientific or definitive measures** of actual quantum risk. They are intended for **conceptual exploration and discussion purposes only**, helping to highlight the multi-faceted nature of PQC migration.
Recommended Action Timeline: ${recommendedTimeline}
${riskDescription}
`; downloadPdfButton.style.display = 'block'; // Store data for PDF report resultArea.dataset.algoType = document.getElementById('algoType').options[document.getElementById('algoType').selectedIndex].text; resultArea.dataset.dataLifetime = document.getElementById('dataLifetime').options[document.getElementById('dataLifetime').selectedIndex].text; resultArea.dataset.threatCapability = document.getElementById('threatCapability').options[document.getElementById('threatCapability').selectedIndex].text; resultArea.dataset.migrationReadiness = document.getElementById('migrationReadiness').options[document.getElementById('migrationReadiness').selectedIndex].text; resultArea.dataset.riskScore = riskScore.toFixed(0); resultArea.dataset.riskLevel = riskLevel; resultArea.dataset.recommendedTimeline = recommendedTimeline; resultArea.dataset.riskDescription = riskDescription; } /** * Clears all inputs and results. */ function clearAll() { document.getElementById('algoType').value = 'rsa-ecc'; document.getElementById('dataLifetime').value = '<5'; document.getElementById('threatCapability').value = 'low'; document.getElementById('migrationReadiness').value = 'not-prepared'; const resultArea = document.getElementById('resultArea'); const downloadPdfButton = document.getElementById('downloadPdfButton'); const errorMessageDiv = document.getElementById('errorMessage'); if (resultArea) { resultArea.style.display = 'none'; resultArea.innerHTML = ''; // Clear stored data for PDF delete resultArea.dataset.algoType; delete resultArea.dataset.dataLifetime; delete resultArea.dataset.threatCapability; delete resultArea.dataset.migrationReadiness; delete resultArea.dataset.riskScore; delete resultArea.dataset.riskLevel; delete resultArea.dataset.recommendedTimeline; delete resultArea.dataset.riskDescription; } if (downloadPdfButton) { downloadPdfButton.style.display = 'none'; } if (errorMessageDiv) { errorMessageDiv.style.display = 'none'; } } /** * Generates a PDF report of the PQC risk assessment. */ function generatePdfReport() { try { // Check if jsPDF library is loaded if (typeof window.jspdf === 'undefined' || typeof window.jspdf.jsPDF === 'undefined') { console.error('jsPDF library not loaded. Cannot generate PDF.'); showMessage('PDF generation failed: jspdf library not loaded. Please try again or check your internet connection.', 'error'); return; } const { jsPDF } = window.jspdf; const doc = new jsPDF(); const resultArea = document.getElementById('resultArea'); // Retrieve stored data const algoType = resultArea.dataset.algoType || 'N/A'; const dataLifetime = resultArea.dataset.dataLifetime || 'N/A'; const threatCapability = resultArea.dataset.threatCapability || 'N/A'; const migrationReadiness = resultArea.dataset.migrationReadiness || 'N/A'; const riskScore = resultArea.dataset.riskScore || 'N/A'; const riskLevel = resultArea.dataset.riskLevel || 'N/A'; const recommendedTimeline = resultArea.dataset.recommendedTimeline || 'N/A'; const riskDescription = resultArea.dataset.riskDescription || 'N/A'; const generationDate = new Date().toLocaleString(); if (riskScore === 'N/A') { showMessage('No assessment data available to generate a PDF. Please perform an assessment first.', 'info'); return; } let yOffset = 20; // Title doc.setFontSize(22); doc.setTextColor(44, 62, 80); doc.text("PQC Risk Assessment Report", 105, yOffset, { align: 'center' }); yOffset += 15; // Date Generated doc.setFontSize(10); doc.setTextColor(100, 100, 100); doc.text(`Report Generated: ${generationDate}`, 105, yOffset, { align: 'center' }); yOffset += 20; // Disclaimer doc.setFontSize(9); doc.setTextColor(150, 150, 150); const disclaimerText = "Disclaimer: This report is based on a simplified, illustrative model. The 'Quantum Risk Score' and 'Recommended Action Timeline' are conceptual and for discussion purposes only, not precise scientific or security evaluations of actual quantum risk."; const splitDisclaimer = doc.splitTextToSize(disclaimerText, 170); doc.text(splitDisclaimer, 20, yOffset); yOffset += (splitDisclaimer.length * 5) + 15; // Input Parameters doc.setFontSize(14); doc.setTextColor(51, 51, 51); doc.text("Input Parameters:", 20, yOffset); yOffset += 10; doc.setFontSize(12); doc.text(`- Algorithm Type: ${algoType}`, 25, yOffset); yOffset += 7; doc.text(`- Data Confidentiality Lifetime: ${dataLifetime}`, 25, yOffset); yOffset += 7; doc.text(`- Threat Actor Quantum Capability: ${threatCapability}`, 25, yOffset); yOffset += 7; doc.text(`- Organizational PQC Migration Readiness: ${migrationReadiness}`, 25, yOffset); yOffset += 15; // Assessment Result doc.setFontSize(16); doc.setTextColor(46, 204, 113); /* Green */ doc.text("Assessment Result:", 20, yOffset); yOffset += 10; doc.setFontSize(20); doc.text(`Hypothetical Quantum Risk Score: ${riskScore} points`, 25, yOffset); yOffset += 10; doc.text(`Risk Level: ${riskLevel}`, 25, yOffset); yOffset += 10; doc.text(`Recommended Action Timeline: ${recommendedTimeline}`, 25, yOffset); yOffset += 15; doc.setFontSize(10); doc.setTextColor(80, 80, 80); const riskDescriptionLines = doc.splitTextToSize(riskDescription, 170); doc.text(riskDescriptionLines, 25, yOffset); yOffset += (riskDescriptionLines.length * 6) + 15; // Simplified Model Logic Table doc.setFontSize(12); doc.setTextColor(80, 80, 80); doc.text("Simplified Model Logic (Illustrative):", 20, yOffset); yOffset += 10; const modelData = [ ["Factor", "Input", "Impact Points"], ["Base Algorithm Risk", algoType, ""], ["Data Confidentiality Lifetime", dataLifetime, ""], ["Threat Actor Capability", threatCapability, ""], ["Migration Readiness", migrationReadiness, ""], ]; // Dynamically fill impact points if desired, but for simplicity just show categories // For this report, just list the categories as the specific calculation is conceptual. doc.autoTable({ startY: yOffset, head: [modelData[0]], body: modelData.slice(1), theme: 'grid', styles: { fontSize: 9, cellPadding: 2, fillColor: [255, 255, 255] }, headStyles: { fillColor: [209, 236, 241], textColor: [12, 84, 96], fontStyle: 'bold', halign: 'center' }, alternateRowStyles: { fillColor: [242, 242, 242] }, columnStyles: { 0: { cellWidth: 50 }, 1: { cellWidth: 60 }, 2: { halign: 'center', cellWidth: 50 } }, margin: { left: 20, right: 20 }, didDrawPage: function(data) { // Footer for each page doc.setFontSize(8); doc.setTextColor(150, 150, 150); doc.text(`Page ${doc.internal.getNumberOfPages()}`, doc.internal.pageSize.width - 20, doc.internal.pageSize.height - 10, { align: 'right' }); doc.text("PQC Risk Assessment Tool", 20, doc.internal.pageSize.height - 10); } }); // Final footer for the last page if not already drawn by autoTable if (doc.autoTable.previous.finalY < doc.internal.pageSize.height - 25) { doc.setFontSize(9); doc.setTextColor(150, 150, 150); doc.text(`Report Generated: ${generationDate}`, 20, doc.internal.pageSize.height - 15); doc.text("PQC Risk Assessment Tool", doc.internal.pageSize.width - 20, doc.internal.pageSize.height - 15, { align: 'right' }); } doc.save("PQC_Risk_Assessment_Report.pdf"); } catch (error) { console.error('Error generating PDF:', error); showMessage(`PDF generation failed: ${error.message}. Please check your browser's console for more details.`, 'error'); } }