package org.spongycastle.openpgp.operator.jcajce; import java.io.IOException; import java.io.OutputStream; import java.security.GeneralSecurityException; import java.security.MessageDigest; import java.security.Provider; import org.spongycastle.jcajce.DefaultJcaJceHelper; import org.spongycastle.jcajce.NamedJcaJceHelper; import org.spongycastle.jcajce.ProviderJcaJceHelper; import org.spongycastle.openpgp.PGPException; import org.spongycastle.openpgp.operator.PGPDigestCalculator; import org.spongycastle.openpgp.operator.PGPDigestCalculatorProvider; public class JcaPGPDigestCalculatorProviderBuilder { private OperatorHelper helper = new OperatorHelper(new DefaultJcaJceHelper()); public JcaPGPDigestCalculatorProviderBuilder() { } public JcaPGPDigestCalculatorProviderBuilder setProvider(Provider provider) { this.helper = new OperatorHelper(new ProviderJcaJceHelper(provider)); return this; } public JcaPGPDigestCalculatorProviderBuilder setProvider(String providerName) { this.helper = new OperatorHelper(new NamedJcaJceHelper(providerName)); return this; } public PGPDigestCalculatorProvider build() throws PGPException { return new PGPDigestCalculatorProvider() { public PGPDigestCalculator get(final int algorithm) throws PGPException { final DigestOutputStream stream; final MessageDigest dig; try { dig = helper.createDigest(algorithm); stream = new DigestOutputStream(dig); } catch (GeneralSecurityException e) { throw new PGPException("exception on setup: " + e, e); } return new PGPDigestCalculator() { public int getAlgorithm() { return algorithm; } public OutputStream getOutputStream() { return stream; } public byte[] getDigest() { return stream.getDigest(); } public void reset() { dig.reset(); } }; } }; } private class DigestOutputStream extends OutputStream { private MessageDigest dig; DigestOutputStream(MessageDigest dig) { this.dig = dig; } public void write(byte[] bytes, int off, int len) throws IOException { dig.update(bytes, off, len); } public void write(byte[] bytes) throws IOException { dig.update(bytes); } public void write(int b) throws IOException { dig.update((byte)b); } byte[] getDigest() { return dig.digest(); } } }