mirror of
https://github.com/gchq/CyberChef
synced 2025-12-15 07:43:22 +00:00
previous implementation only supported some PEMs (e.g. Certificate) the new implementation is more general, it just extracts the base64 between header and footer and decodes that to hex
63 lines
1.8 KiB
JavaScript
63 lines
1.8 KiB
JavaScript
/**
|
|
* @author n1474335 [n1474335@gmail.com]
|
|
* @author cplussharp
|
|
* @copyright Crown Copyright 2016
|
|
* @license Apache-2.0
|
|
*/
|
|
|
|
import {fromBase64} from "../lib/Base64.mjs";
|
|
import Operation from "../Operation.mjs";
|
|
import OperationError from "../errors/OperationError.mjs";
|
|
import Utils from "../Utils.mjs";
|
|
|
|
/**
|
|
* PEM to Hex operation
|
|
*/
|
|
class PEMToHex extends Operation {
|
|
|
|
/**
|
|
* PEMToHex constructor
|
|
*/
|
|
constructor() {
|
|
super();
|
|
|
|
this.name = "PEM to Hex";
|
|
this.module = "PublicKey";
|
|
this.description = "Converts PEM (Privacy Enhanced Mail) format to a hexadecimal DER (Distinguished Encoding Rules) string.";
|
|
this.infoURL = "https://wikipedia.org/wiki/X.690#DER_encoding";
|
|
this.inputType = "string";
|
|
this.outputType = "string";
|
|
this.args = [];
|
|
}
|
|
|
|
/**
|
|
* @param {string} input
|
|
* @param {Object[]} args
|
|
* @returns {string}
|
|
*/
|
|
run(input, args) {
|
|
let output = "";
|
|
let match;
|
|
const regex = /-----BEGIN ([A-Z][A-Z ]+[A-Z])-----/g;
|
|
while ((match = regex.exec(input)) !== null) {
|
|
// find corresponding end tag
|
|
const indexBase64 = match.index + match[0].length;
|
|
const footer = `-----END ${match[1]}-----`;
|
|
const indexFooter = input.indexOf(footer, indexBase64);
|
|
if (indexFooter === -1) {
|
|
throw new OperationError(`PEM footer '${footer}' not found`);
|
|
}
|
|
|
|
// decode base64 content
|
|
const base64 = input.substring(indexBase64, indexFooter);
|
|
const bytes = fromBase64(base64, "A-Za-z0-9+/=", "byteArray", true);
|
|
const hex = bytes.map(b => Utils.hex(b)).join("");
|
|
output += hex;
|
|
}
|
|
return output;
|
|
}
|
|
|
|
}
|
|
|
|
export default PEMToHex;
|