diff options
Diffstat (limited to 'bcprov/src/main/java/org/bouncycastle/jce/provider/X509CRLParser.java')
-rw-r--r-- | bcprov/src/main/java/org/bouncycastle/jce/provider/X509CRLParser.java | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/bcprov/src/main/java/org/bouncycastle/jce/provider/X509CRLParser.java b/bcprov/src/main/java/org/bouncycastle/jce/provider/X509CRLParser.java new file mode 100644 index 00000000..0d1eca72 --- /dev/null +++ b/bcprov/src/main/java/org/bouncycastle/jce/provider/X509CRLParser.java @@ -0,0 +1,150 @@ +package org.bouncycastle.jce.provider; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.security.cert.CRL; +import java.security.cert.CRLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.bouncycastle.asn1.ASN1InputStream; +import org.bouncycastle.asn1.ASN1ObjectIdentifier; +import org.bouncycastle.asn1.ASN1Sequence; +import org.bouncycastle.asn1.ASN1Set; +import org.bouncycastle.asn1.ASN1TaggedObject; +import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers; +import org.bouncycastle.asn1.pkcs.SignedData; +import org.bouncycastle.asn1.x509.CertificateList; +import org.bouncycastle.x509.X509StreamParserSpi; +import org.bouncycastle.x509.util.StreamParsingException; + +public class X509CRLParser + extends X509StreamParserSpi +{ + private static final PEMUtil PEM_PARSER = new PEMUtil("CRL"); + + private ASN1Set sData = null; + private int sDataObjectCount = 0; + private InputStream currentStream = null; + + private CRL readDERCRL( + InputStream in) + throws IOException, CRLException + { + ASN1InputStream dIn = new ASN1InputStream(in); + ASN1Sequence seq = (ASN1Sequence)dIn.readObject(); + + if (seq.size() > 1 + && seq.getObjectAt(0) instanceof ASN1ObjectIdentifier) + { + if (seq.getObjectAt(0).equals(PKCSObjectIdentifiers.signedData)) + { + sData = new SignedData(ASN1Sequence.getInstance( + (ASN1TaggedObject)seq.getObjectAt(1), true)).getCRLs(); + + return getCRL(); + } + } + + return new X509CRLObject(CertificateList.getInstance(seq)); + } + + private CRL getCRL() + throws CRLException + { + if (sData == null || sDataObjectCount >= sData.size()) + { + return null; + } + + return new X509CRLObject( + CertificateList.getInstance( + sData.getObjectAt(sDataObjectCount++))); + } + + private CRL readPEMCRL( + InputStream in) + throws IOException, CRLException + { + ASN1Sequence seq = PEM_PARSER.readPEMObject(in); + + if (seq != null) + { + return new X509CRLObject(CertificateList.getInstance(seq)); + } + + return null; + } + + public void engineInit(InputStream in) + { + currentStream = in; + sData = null; + sDataObjectCount = 0; + + if (!currentStream.markSupported()) + { + currentStream = new BufferedInputStream(currentStream); + } + } + + public Object engineRead() + throws StreamParsingException + { + try + { + if (sData != null) + { + if (sDataObjectCount != sData.size()) + { + return getCRL(); + } + else + { + sData = null; + sDataObjectCount = 0; + return null; + } + } + + currentStream.mark(10); + int tag = currentStream.read(); + + if (tag == -1) + { + return null; + } + + if (tag != 0x30) // assume ascii PEM encoded. + { + currentStream.reset(); + return readPEMCRL(currentStream); + } + else + { + currentStream.reset(); + return readDERCRL(currentStream); + } + } + catch (Exception e) + { + throw new StreamParsingException(e.toString(), e); + } + } + + public Collection engineReadAll() + throws StreamParsingException + { + CRL crl; + List certs = new ArrayList(); + + while ((crl = (CRL)engineRead()) != null) + { + certs.add(crl); + } + + return certs; + } +} |