mirror of
https://github.com/gchq/CyberChef.git
synced 2025-04-23 08:16:17 -04:00
69 lines
1.9 KiB
JavaScript
69 lines
1.9 KiB
JavaScript
![]() |
/**
|
||
|
* @author cplussharp
|
||
|
* @copyright Crown Copyright 2023
|
||
|
* @license Apache-2.0
|
||
|
*/
|
||
|
|
||
|
import r from "jsrsasign";
|
||
|
import Operation from "../Operation.mjs";
|
||
|
import OperationError from "../errors/OperationError.mjs";
|
||
|
|
||
|
/**
|
||
|
* Public Key from Certificate operation
|
||
|
*/
|
||
|
class PubKeyFromCert extends Operation {
|
||
|
|
||
|
/**
|
||
|
* PubKeyFromCert constructor
|
||
|
*/
|
||
|
constructor() {
|
||
|
super();
|
||
|
|
||
|
this.name = "Public Key from Certificate";
|
||
|
this.module = "PublicKey";
|
||
|
this.description = "Extracts the Public Key from a Certificate.";
|
||
|
this.infoURL = "https://en.wikipedia.org/wiki/X.509";
|
||
|
this.inputType = "string";
|
||
|
this.outputType = "string";
|
||
|
this.args = [];
|
||
|
this.checks = [];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param {string} input
|
||
|
* @param {Object[]} args
|
||
|
* @returns {string}
|
||
|
*/
|
||
|
run(input, args) {
|
||
|
let output = "";
|
||
|
let match;
|
||
|
const regex = /-----BEGIN CERTIFICATE-----/g;
|
||
|
while ((match = regex.exec(input)) !== null) {
|
||
|
// find corresponding end tag
|
||
|
const indexBase64 = match.index + match[0].length;
|
||
|
const footer = "-----END CERTIFICATE-----";
|
||
|
const indexFooter = input.indexOf(footer, indexBase64);
|
||
|
if (indexFooter === -1) {
|
||
|
throw new OperationError(`PEM footer '${footer}' not found`);
|
||
|
}
|
||
|
|
||
|
const certPem = input.substring(match.index, indexFooter + footer.length);
|
||
|
const cert = new r.X509();
|
||
|
cert.readCertPEM(certPem);
|
||
|
let pubKey;
|
||
|
try {
|
||
|
pubKey = cert.getPublicKey();
|
||
|
} catch {
|
||
|
throw new OperationError("Unsupported public key type");
|
||
|
}
|
||
|
const pubKeyPem = r.KEYUTIL.getPEM(pubKey);
|
||
|
|
||
|
// PEM ends with '\n', so a new key always starts on a new line
|
||
|
output += pubKeyPem;
|
||
|
}
|
||
|
return output;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export default PubKeyFromCert;
|