X509CertificateFactory.java [plain text]
package gnu.java.security.provider;
import java.io.BufferedInputStream;
import java.io.EOFException;
import java.io.InputStream;
import java.io.IOException;
import java.security.cert.Certificate;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactorySpi;
import java.security.cert.CertPath;
import java.security.cert.CRL;
import java.security.cert.CRLException;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import gnu.java.io.Base64InputStream;
import gnu.java.security.x509.X509Certificate;
import gnu.java.security.x509.X509CertPath;
import gnu.java.security.x509.X509CRL;
public class X509CertificateFactory extends CertificateFactorySpi
{
public static final String BEGIN_CERTIFICATE = "-----BEGIN CERTIFICATE-----";
public static final String END_CERTIFICATE = "-----END CERTIFICATE-----";
public static final String BEGIN_X509_CRL = "-----BEGIN X509 CRL-----";
public static final String END_X509_CRL = "-----END X509 CRL-----";
public X509CertificateFactory()
{
super();
}
public Certificate engineGenerateCertificate(InputStream inStream)
throws CertificateException
{
try
{
return generateCert(inStream);
}
catch (IOException ioe)
{
CertificateException ce = new CertificateException(ioe.getMessage());
ce.initCause (ioe);
throw ce;
}
}
public Collection engineGenerateCertificates(InputStream inStream)
throws CertificateException
{
LinkedList certs = new LinkedList();
while (true)
{
try
{
certs.add(generateCert(inStream));
}
catch (EOFException eof)
{
break;
}
catch (IOException ioe)
{
CertificateException ce = new CertificateException(ioe.getMessage());
ce.initCause (ioe);
throw ce;
}
}
return certs;
}
public CRL engineGenerateCRL(InputStream inStream) throws CRLException
{
try
{
return generateCRL(inStream);
}
catch (IOException ioe)
{
CRLException crle = new CRLException(ioe.getMessage());
crle.initCause (ioe);
throw crle;
}
}
public Collection engineGenerateCRLs(InputStream inStream)
throws CRLException
{
LinkedList crls = new LinkedList();
while (true)
{
try
{
crls.add(generateCRL(inStream));
}
catch (EOFException eof)
{
break;
}
catch (IOException ioe)
{
CRLException crle = new CRLException(ioe.getMessage());
crle.initCause (ioe);
throw crle;
}
}
return crls;
}
public CertPath engineGenerateCertPath(List certs)
{
return new X509CertPath(certs);
}
public CertPath engineGenerateCertPath(InputStream in)
throws CertificateEncodingException
{
return new X509CertPath(in);
}
public CertPath engineGenerateCertPath(InputStream in, String encoding)
throws CertificateEncodingException
{
return new X509CertPath(in, encoding);
}
public Iterator engineGetCertPathEncodings()
{
return X509CertPath.ENCODINGS.iterator();
}
private X509Certificate generateCert(InputStream inStream)
throws IOException, CertificateException
{
if (inStream == null)
throw new CertificateException("missing input stream");
if (!inStream.markSupported())
inStream = new BufferedInputStream(inStream, 8192);
inStream.mark(20);
int i = inStream.read();
if (i == -1)
throw new EOFException();
if (i != 0x30)
{
inStream.reset();
StringBuffer line = new StringBuffer(80);
do
{
line.setLength(0);
do
{
i = inStream.read();
if (i == -1)
throw new EOFException();
if (i != '\n' && i != '\r')
line.append((char) i);
}
while (i != '\n' && i != '\r');
}
while (!line.toString().equals(BEGIN_CERTIFICATE));
X509Certificate ret = new X509Certificate(
new BufferedInputStream(new Base64InputStream(inStream), 8192));
line.setLength(0);
line.append('-'); do
{
i = inStream.read();
if (i == -1)
throw new EOFException();
if (i != '\n' && i != '\r')
line.append((char) i);
}
while (i != '\n' && i != '\r');
if (!line.toString().equals(END_CERTIFICATE))
throw new CertificateException("no end-of-certificate marker");
return ret;
}
else
{
inStream.reset();
return new X509Certificate(inStream);
}
}
private X509CRL generateCRL(InputStream inStream)
throws IOException, CRLException
{
if (inStream == null)
throw new CRLException("missing input stream");
if (!inStream.markSupported())
inStream = new BufferedInputStream(inStream, 8192);
inStream.mark(20);
int i = inStream.read();
if (i == -1)
throw new EOFException();
if (i != 0x30)
{
inStream.reset();
StringBuffer line = new StringBuffer(80);
do
{
line.setLength(0);
do
{
i = inStream.read();
if (i == -1)
throw new EOFException();
if (i != '\n' && i != '\r')
line.append((char) i);
}
while (i != '\n' && i != '\r');
}
while (!line.toString().startsWith(BEGIN_X509_CRL));
X509CRL ret = new X509CRL(
new BufferedInputStream(new Base64InputStream(inStream), 8192));
line.setLength(0);
line.append('-'); do
{
i = inStream.read();
if (i == -1)
throw new EOFException();
if (i != '\n' && i != '\r')
line.append((char) i);
}
while (i != '\n' && i != '\r');
if (!line.toString().startsWith(END_X509_CRL))
throw new CRLException("no end-of-CRL marker");
return ret;
}
else
{
inStream.reset();
return new X509CRL(inStream);
}
}
}