/* * Copyright (c) 2011 ICM Uniwersytet Warszawski All rights reserved. * See LICENCE file for licensing information. */ package eu.emi.security.authn.x509.helpers; import java.io.CharArrayReader; import java.io.IOException; import java.io.InputStream; import org.bouncycastle.openssl.PEMParser; import org.bouncycastle.util.io.Streams; import org.bouncycastle.util.io.pem.PemObject; import org.bouncycastle.util.io.pem.PemReader; /** * This class extends the {@link PEMParser} class from the BC library. * It is modified to read DER input, not the PEM (it can be considered a smart-hack) * as otherwise BC's parsers code would need to be copied. It supports reading of the * PKCS8 private key in DER form. It is assumed that the key is encrypted if * a password is provided. * <p> * This class interface is the readObject method. * <p> * This implementation overrides the * {@link PemReader} readPemObject method to actually read the DER. The Reader used by * the {@link PemReader} is not used. * * @author K. Benedyczak */ public class PKCS8DERReader extends PEMParser { protected InputStream is; protected boolean encrypted; public PKCS8DERReader(InputStream is, boolean encrypted) { super(new CharArrayReader(new char[0])); this.is = is; this.encrypted = encrypted; } /** * Generate BC's PemObject from the input stream. The object's type is * fixed to encrypted or plain private key. * @return the parsed PEM object * @throws IOException IO exception */ @Override public PemObject readPemObject() throws IOException { byte []buf = Streams.readAll(is); String name = (encrypted) ? "ENCRYPTED PRIVATE KEY": "PRIVATE KEY"; return new PemObject(name, buf); } }