p7s-info
Version:
P7S Info
62 lines (51 loc) • 2.39 kB
JavaScript
#!/usr/bin/env node
// Import.
const fs = require('fs');
const CColor = require('ccolor');
const jk = require('jkurwa');
const Help = require('./lib/help');
// Constants.
const PROCESS_TITLE = 'p7s-info';
const KEY_PARAM_HELP = '--help';
const KEY_PARAM_VERSION = '--version';
// Set process title.
process.title = PROCESS_TITLE;
// Define params.
const appArguments = process.argv.slice(2);
const [maybeServiceCommand] = appArguments;
const showHelp = maybeServiceCommand === KEY_PARAM_HELP;
const showVersion = maybeServiceCommand === KEY_PARAM_VERSION;
const [p7sFilePath, signedContentFilePath] = appArguments;
const isWrongCommand = !showHelp && !showVersion && !p7sFilePath;
// Start async thread.
(async () => {
// If service command.
if (showHelp) { Help.show(); process.exit(0); }
if (showVersion) { Help.version(); process.exit(0); }
// If wrong command.
if (isWrongCommand) { Help.wrongParams(); process.exit(1); }
// Get P7S in BASE64 encoding.
let p7sFileBuffer;
try { p7sFileBuffer = fs.readFileSync(p7sFilePath); }
catch (error) { console.log(CColor.red(`Can not read file "${p7sFilePath}".`)); process.exit(1); }
const p7sFileBase64 = p7sFileBuffer.toString('base64');
// Define signature info.
const message = new jk.models.Message(jk.b64_decode(p7sFileBase64));
const cert = message && message.signer();
const signedContent = message.info && message.info.contentInfo && message.info.contentInfo.content;
const pem = cert && cert.as_pem();
const signTime = message && message.pattrs && message.pattrs.signingTime && new Date(message.pattrs.signingTime).toISOString();
const signer = { ...cert.subject, ipn: cert.extension && cert.extension.ipn };
const issuer = cert.issuer;
const serial = cert.serial;
const { signatureAlgorithm, pubkeyAlgorithm, extension } = cert;
const { issuers, ocsp, tsp } = extension;
// Save signed content if need it.
if (signedContentFilePath) {
try { fs.writeFileSync(signedContentFilePath, typeof signedContent !== 'undefined' ? signedContent : ''); }
catch (error) { console.log(CColor.red(`Can not write file "${signedContentFilePath}".`)); process.exit(1); }
}
// Show signature info.
const signatureInfo = JSON.stringify({ pem, signTime, signer, issuer, serial, signatureAlgorithm, pubkeyAlgorithm, issuers, ocsp, tsp }, null, 2);
console.log(signatureInfo);
})();