package io.fathom.cloud.secrets.services.ca; import java.io.IOException; import java.io.StringReader; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.CharsetDecoder; import java.nio.charset.CodingErrorAction; import org.bouncycastle.pkcs.PKCS10CertificationRequest; import org.bouncycastle.util.io.pem.PemObject; import org.bouncycastle.util.io.pem.PemReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Charsets; public class CsrParser { private static final Logger log = LoggerFactory.getLogger(CsrParser.class); public CsrParser() { } // static final String BEGIN_PEM = "-----BEGIN CERTIFICATE REQUEST-----"; // static final String END_PEM = "-----END CERTIFICATE REQUEST-----"; public Object parse(byte[] data) { Object key = null; if (key == null) { String s = tryDecodeAsString(data); if (s != null) { key = parse(s); } } return null; } public PKCS10CertificationRequest parse(String s) { PKCS10CertificationRequest key = null; if (key == null) { try { key = parsePemFormat(s); } catch (Exception e) { log.debug("Cannot debug as PEM", e); } // if (s.contains(BEGIN_PEM)) { // String payload = s.substring(s.indexOf(BEGIN_PEM) + // BEGIN_PEM.length()); // // if (payload.contains(END_PEM)) { // payload = payload.substring(0, payload.indexOf(END_PEM) + // END_PEM.length()); // // try { // key = parsePemFormat(payload); // } catch (Exception e) { // log.debug("Cannot debug as PEM", e); // } // } // } } // if (key == null) { // try { // // TODO: Check if looks like base64?? // byte[] fromBase64 = CryptoUtils.fromBase64(s); // // key = parse(fromBase64); // } catch (Exception e) { // log.debug("Cannot decode as base64", e); // } // } return key; } private String tryDecodeAsString(byte[] data) { try { // We do this so we get strict input processing CharsetDecoder decoder = Charsets.UTF_8.newDecoder(); decoder.onMalformedInput(CodingErrorAction.REPORT); decoder.onUnmappableCharacter(CodingErrorAction.REPORT); ByteBuffer byteBuffer = ByteBuffer.wrap(data); CharBuffer charBuffer = decoder.decode(byteBuffer); return charBuffer.toString(); } catch (Exception e) { log.debug("Cannot decode as string", e); return null; } } private PKCS10CertificationRequest parsePemFormat(String data) throws IOException { PemReader reader = new PemReader(new StringReader(data)); PemObject pemObject = reader.readPemObject(); reader.close(); PKCS10CertificationRequest csr = new PKCS10CertificationRequest(pemObject.getContent()); return csr; } }