/* See LICENSE for licensing and NOTICE for copyright. */ package org.cryptacular.bean; import java.io.IOException; import java.security.PrivateKey; import org.cryptacular.EncodingException; import org.cryptacular.StreamException; import org.cryptacular.io.Resource; import org.cryptacular.util.KeyPairUtil; /** * Factory for reading a private from a {@link Resource} containing data in any of the formats supported by {@link * KeyPairUtil#readPrivateKey(java.io.InputStream, char[])}. * * @author Middleware Services * @see KeyPairUtil#readPrivateKey(java.io.InputStream, char[]) * @see KeyPairUtil#readPrivateKey(java.io.InputStream) */ public class ResourceBasedPrivateKeyFactoryBean implements FactoryBean<PrivateKey> { /** Resource containing key data. */ private Resource resource; /** Password required to decrypt an encrypted private key. */ private String password; /** Creates a new instance. */ public ResourceBasedPrivateKeyFactoryBean() {} /** * Creates a new instance capable of reading an unencrypted private key. * * @param resource Resource containing encoded key data. */ public ResourceBasedPrivateKeyFactoryBean(final Resource resource) { setResource(resource); } /** * Creates a new instance of reading an encrypted private key. * * @param resource Resource containing encoded key data. * @param decryptionPassword Password-based encryption key. */ public ResourceBasedPrivateKeyFactoryBean(final Resource resource, final String decryptionPassword) { setResource(resource); setPassword(decryptionPassword); } /** @return Resource containing key data. */ public Resource getResource() { return resource; } /** * Sets the resource containing key data. * * @param resource Resource containing key bytes. */ public void setResource(final Resource resource) { this.resource = resource; } /** * Sets the password-based key used to decrypt an encrypted private key. * * @param decryptionPassword Password-based encryption key. */ public void setPassword(final String decryptionPassword) { this.password = decryptionPassword; } @Override public PrivateKey newInstance() throws EncodingException, StreamException { try { if (password != null) { return KeyPairUtil.readPrivateKey(resource.getInputStream(), password.toCharArray()); } return KeyPairUtil.readPrivateKey(resource.getInputStream()); } catch (IOException e) { throw new StreamException(e); } } }