org.spongycastle.jcajce.provider.asymmetric.x509.PEMUtil Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of prov Show documentation
Show all versions of prov Show documentation
Spongy Castle is a package-rename (org.bouncycastle.* to org.spongycastle.*) of Bouncy Castle
intended for the Android platform. Android unfortunately ships with a stripped-down version of
Bouncy Castle, which prevents easy upgrades - Spongy Castle overcomes this and provides a full,
up-to-date version of the Bouncy Castle cryptographic libs.
The newest version!
package org.spongycastle.jcajce.provider.asymmetric.x509;
import java.io.IOException;
import java.io.InputStream;
import org.spongycastle.asn1.ASN1Sequence;
import org.spongycastle.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;
}
}