From 2bf1ac6b9cba7545765fe88eff776fd8117a78a2 Mon Sep 17 00:00:00 2001 From: n1474335 Date: Wed, 8 Jun 2022 18:59:27 +0100 Subject: [PATCH] 'Parse X.509 Certificate' Issuer and Subject name parsing improved. Closes #1365 --- src/core/lib/PublicKey.mjs | 34 +++++++------------- src/core/operations/ParseX509Certificate.mjs | 10 +++--- 2 files changed, 17 insertions(+), 27 deletions(-) diff --git a/src/core/lib/PublicKey.mjs b/src/core/lib/PublicKey.mjs index 8c04cdd9..ea931d7e 100644 --- a/src/core/lib/PublicKey.mjs +++ b/src/core/lib/PublicKey.mjs @@ -9,35 +9,25 @@ import { toHex, fromHex } from "./Hex.mjs"; /** - * Formats Distinguished Name (DN) strings. + * Formats Distinguished Name (DN) objects to strings. * - * @param {string} dnStr + * @param {Object} dnObj * @param {number} indent * @returns {string} */ -export function formatDnStr(dnStr, indent) { - const fields = dnStr.substr(1).replace(/([^\\])\//g, "$1$1/").split(/[^\\]\//); - let output = "", - maxKeyLen = 0, - key, - value, - i, - str; +export function formatDnObj(dnObj, indent) { + let output = ""; - for (i = 0; i < fields.length; i++) { - if (!fields[i].length) continue; + const maxKeyLen = dnObj.array.reduce((max, item) => { + return item[0].type.length > max ? item[0].type.length : max; + }, 0); - key = fields[i].split("=")[0]; + for (let i = 0; i < dnObj.array.length; i++) { + if (!dnObj.array[i].length) continue; - maxKeyLen = key.length > maxKeyLen ? key.length : maxKeyLen; - } - - for (i = 0; i < fields.length; i++) { - if (!fields[i].length) continue; - - key = fields[i].split("=")[0]; - value = fields[i].split("=")[1]; - str = key.padEnd(maxKeyLen, " ") + " = " + value + "\n"; + const key = dnObj.array[i][0].type; + const value = dnObj.array[i][0].value; + const str = `${key.padEnd(maxKeyLen, " ")} = ${value}\n`; output += str.padStart(indent + str.length, " "); } diff --git a/src/core/operations/ParseX509Certificate.mjs b/src/core/operations/ParseX509Certificate.mjs index 2c123f45..aeb5f677 100644 --- a/src/core/operations/ParseX509Certificate.mjs +++ b/src/core/operations/ParseX509Certificate.mjs @@ -7,7 +7,7 @@ import r from "jsrsasign"; import { fromBase64 } from "../lib/Base64.mjs"; import { toHex } from "../lib/Hex.mjs"; -import { formatByteStr, formatDnStr } from "../lib/PublicKey.mjs"; +import { formatByteStr, formatDnObj } from "../lib/PublicKey.mjs"; import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; @@ -76,8 +76,8 @@ class ParseX509Certificate extends Operation { } const sn = cert.getSerialNumberHex(), - issuer = cert.getIssuerString(), - subject = cert.getSubjectString(), + issuer = cert.getIssuer(), + subject = cert.getSubject(), pk = cert.getPublicKey(), pkFields = [], sig = cert.getSignatureValueHex(); @@ -170,10 +170,10 @@ class ParseX509Certificate extends Operation { extensions = cert.getInfo().split("X509v3 Extensions:\n")[1].split("signature")[0]; } catch (err) {} - const issuerStr = formatDnStr(issuer, 2), + const issuerStr = formatDnObj(issuer, 2), nbDate = formatDate(cert.getNotBefore()), naDate = formatDate(cert.getNotAfter()), - subjectStr = formatDnStr(subject, 2); + subjectStr = formatDnObj(subject, 2); return `Version: ${cert.version} (0x${Utils.hex(cert.version - 1)}) Serial number: ${new r.BigInteger(sn, 16).toString()} (0x${sn})