diff options
Diffstat (limited to 'bcprov/src/main/java/org/bouncycastle/x509/X509StreamParser.java')
-rw-r--r-- | bcprov/src/main/java/org/bouncycastle/x509/X509StreamParser.java | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/bcprov/src/main/java/org/bouncycastle/x509/X509StreamParser.java b/bcprov/src/main/java/org/bouncycastle/x509/X509StreamParser.java new file mode 100644 index 0000000..3ad2846 --- /dev/null +++ b/bcprov/src/main/java/org/bouncycastle/x509/X509StreamParser.java @@ -0,0 +1,161 @@ +package org.bouncycastle.x509; + +import org.bouncycastle.x509.util.StreamParser; +import org.bouncycastle.x509.util.StreamParsingException; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.Provider; +import java.util.Collection; + +/** + * + * This class allows access to different implementations for reading X.509 + * objects from streams. + * <p> + * A X509StreamParser is used to read a collection of objects or a single object + * of a certain X.509 object structure. E.g. one X509StreamParser can read + * certificates, another one CRLs, certification paths, attribute certificates + * and so on. The kind of object structure is specified with the + * <code>algorithm</code> parameter to the <code>getInstance</code> methods. + * <p> + * Implementations must implement the + * {@link org.bouncycastle.x509.X509StreamParserSpi}. + */ +public class X509StreamParser + implements StreamParser +{ + /** + * Generates a StreamParser object that implements the specified type. If + * the default provider package provides an implementation of the requested + * type, an instance of StreamParser containing that implementation is + * returned. If the type is not available in the default package, other + * packages are searched. + * + * @param type + * The name of the requested X.509 object type. + * @return a StreamParser object for the specified type. + * + * @exception NoSuchParserException + * if the requested type is not available in the default + * provider package or any of the other provider packages + * that were searched. + */ + public static X509StreamParser getInstance(String type) + throws NoSuchParserException + { + try + { + X509Util.Implementation impl = X509Util.getImplementation("X509StreamParser", type); + + return createParser(impl); + } + catch (NoSuchAlgorithmException e) + { + throw new NoSuchParserException(e.getMessage()); + } + } + + /** + * Generates a X509StreamParser object for the specified type from the + * specified provider. + * + * @param type + * the name of the requested X.509 object type. + * @param provider + * the name of the provider. + * + * @return a X509StreamParser object for the specified type. + * + * @exception NoSuchParserException + * if the type is not available from the specified provider. + * + * @exception NoSuchProviderException + * if the provider can not be found. + * + * @see Provider + */ + public static X509StreamParser getInstance(String type, String provider) + throws NoSuchParserException, NoSuchProviderException + { + return getInstance(type, X509Util.getProvider(provider)); + } + + /** + * Generates a X509StreamParser object for the specified type from the + * specified provider. + * + * @param type + * the name of the requested X.509 object type. + * @param provider + * the Provider to use. + * + * @return a X509StreamParser object for the specified type. + * + * @exception NoSuchParserException + * if the type is not available from the specified provider. + * + * @see Provider + */ + public static X509StreamParser getInstance(String type, Provider provider) + throws NoSuchParserException + { + try + { + X509Util.Implementation impl = X509Util.getImplementation("X509StreamParser", type, provider); + + return createParser(impl); + } + catch (NoSuchAlgorithmException e) + { + throw new NoSuchParserException(e.getMessage()); + } + } + + private static X509StreamParser createParser(X509Util.Implementation impl) + { + X509StreamParserSpi spi = (X509StreamParserSpi)impl.getEngine(); + + return new X509StreamParser(impl.getProvider(), spi); + } + + private Provider _provider; + private X509StreamParserSpi _spi; + + private X509StreamParser( + Provider provider, + X509StreamParserSpi spi) + { + _provider = provider; + _spi = spi; + } + + public Provider getProvider() + { + return _provider; + } + + public void init(InputStream stream) + { + _spi.engineInit(stream); + } + + public void init(byte[] data) + { + _spi.engineInit(new ByteArrayInputStream(data)); + } + + public Object read() + throws StreamParsingException + { + return _spi.engineRead(); + } + + public Collection readAll() + throws StreamParsingException + { + return _spi.engineReadAll(); + } +} |