| package org.bouncycastle.jce.provider; |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| |
| import org.bouncycastle.asn1.ASN1InputStream; |
| import org.bouncycastle.asn1.ASN1Primitive; |
| import org.bouncycastle.asn1.ASN1Sequence; |
| import org.bouncycastle.util.encoders.Base64; |
| |
| public class PEMUtil |
| { |
| private final String _header1; |
| private final String _header2; |
| private final String _footer1; |
| private final String _footer2; |
| |
| PEMUtil( |
| String type) |
| { |
| _header1 = "-----BEGIN " + type + "-----"; |
| _header2 = "-----BEGIN X509 " + type + "-----"; |
| _footer1 = "-----END " + type + "-----"; |
| _footer2 = "-----END X509 " + type + "-----"; |
| } |
| |
| private String readLine( |
| InputStream in) |
| throws IOException |
| { |
| int c; |
| StringBuffer l = new StringBuffer(); |
| |
| do |
| { |
| while (((c = in.read()) != '\r') && c != '\n' && (c >= 0)) |
| { |
| if (c == '\r') |
| { |
| continue; |
| } |
| |
| l.append((char)c); |
| } |
| } |
| while (c >= 0 && l.length() == 0); |
| |
| if (c < 0) |
| { |
| return null; |
| } |
| |
| 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)) |
| { |
| break; |
| } |
| } |
| |
| while ((line = readLine(in)) != null) |
| { |
| if (line.startsWith(_footer1) || line.startsWith(_footer2)) |
| { |
| break; |
| } |
| |
| pemBuf.append(line); |
| } |
| |
| if (pemBuf.length() != 0) |
| { |
| ASN1Primitive o = new ASN1InputStream(Base64.decode(pemBuf.toString())).readObject(); |
| if (!(o instanceof ASN1Sequence)) |
| { |
| throw new IOException("malformed PEM data encountered"); |
| } |
| |
| return (ASN1Sequence)o; |
| } |
| |
| return null; |
| } |
| } |