package org.apereo.cas.util.crypto; import java.io.InputStream; import java.security.KeyFactory; import java.security.PublicKey; import java.security.spec.X509EncodedKeySpec; import org.apache.commons.lang3.builder.ToStringBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.config.AbstractFactoryBean; import org.springframework.core.io.Resource; /** * FactoryBean for creating a public key from a file. * * @author Scott Battaglia * @author Misagh Moayyed * @since 3.1 */ public class PublicKeyFactoryBean extends AbstractFactoryBean<PublicKey> { private static final Logger LOGGER = LoggerFactory.getLogger(PublicKeyFactoryBean.class); private Resource resource; private String algorithm; @Override protected PublicKey createInstance() throws Exception { LOGGER.debug("Creating public key instance from [{}] using [{}]", this.resource.getFilename(), this.algorithm); try(InputStream pubKey = this.resource.getInputStream()) { final byte[] bytes = new byte[pubKey.available()]; pubKey.read(bytes); final X509EncodedKeySpec pubSpec = new X509EncodedKeySpec(bytes); final KeyFactory factory = KeyFactory.getInstance(this.algorithm); return factory.generatePublic(pubSpec); } } @Override public Class getObjectType() { return PublicKey.class; } public Resource getResource() { return this.resource; } public String getAlgorithm() { return this.algorithm; } public void setLocation(final Resource resource) { this.resource = resource; } public void setAlgorithm(final String algorithm) { this.algorithm = algorithm; } @Override public String toString() { return new ToStringBuilder(this) .appendSuper(super.toString()) .append("resource", this.resource) .append("algorithm", this.algorithm) .toString(); } }