package org.bouncycastle.jcajce.provider.asymmetric.x509; import java.io.IOException; import java.io.InputStream; import org.bouncycastle.asn1.ASN1Sequence; import org.bouncycastle.util.encoders.Base64; class PEMUtil { private final String _header1; private final String _header2; private final String _header3; private final String _footer1; private final String _footer2; private final String _footer3; PEMUtil( String type) { _header1 = "-----BEGIN " + type + "-----"; _header2 = "-----BEGIN X509 " + type + "-----"; _header3 = "-----BEGIN PKCS7-----"; _footer1 = "-----END " + type + "-----"; _footer2 = "-----END X509 " + type + "-----"; _footer3 = "-----END PKCS7-----"; } private String readLine( InputStream in) throws IOException { int c; StringBuffer l = new StringBuffer(); do { while (((c = in.read()) != '\r') && c != '\n' && (c >= 0)) { l.append((char)c); } } while (c >= 0 && l.length() == 0); if (c < 0) { return null; } // make sure we parse to end of line. if (c == '\r') { // a '\n' may follow in.mark(1); if (((c = in.read()) == '\n')) { in.mark(1); } if (c > 0) { in.reset(); } } return l.toString(); } ASN1Sequence readPEMObject( InputStream in) throws IOException { String line; StringBuffer pemBuf = new StringBuffer(); while ((line = readLine(in)) != null) { if (line.startsWith(_header1) || line.startsWith(_header2) || line.startsWith(_header3)) { break; } } while ((line = readLine(in)) != null) { if (line.startsWith(_footer1) || line.startsWith(_footer2) || line.startsWith(_footer3)) { break; } pemBuf.append(line); } if (pemBuf.length() != 0) { try { return ASN1Sequence.getInstance(Base64.decode(pemBuf.toString())); } catch (Exception e) { throw new IOException("malformed PEM data encountered"); } } return null; } }