org.bouncycastle.openpgp.operator.jcajce.JcaKeyFingerprintCalculator Maven / Gradle / Ivy
package org.bouncycastle.openpgp.operator.jcajce;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Provider;
import org.bouncycastle.bcpg.BCPGKey;
import org.bouncycastle.bcpg.MPInteger;
import org.bouncycastle.bcpg.PublicKeyPacket;
import org.bouncycastle.bcpg.RSAPublicBCPGKey;
import org.bouncycastle.jcajce.util.DefaultJcaJceHelper;
import org.bouncycastle.jcajce.util.JcaJceHelper;
import org.bouncycastle.jcajce.util.NamedJcaJceHelper;
import org.bouncycastle.jcajce.util.ProviderJcaJceHelper;
import org.bouncycastle.openpgp.PGPException;
import org.bouncycastle.openpgp.operator.KeyFingerPrintCalculator;
public class JcaKeyFingerprintCalculator
implements KeyFingerPrintCalculator
{
private final JcaJceHelper helper;
/**
* Base Constructor - use the JCA defaults.
*/
public JcaKeyFingerprintCalculator()
{
this(new DefaultJcaJceHelper());
}
private JcaKeyFingerprintCalculator(JcaJceHelper helper)
{
this.helper = helper;
}
/**
* Sets the provider to use to obtain cryptographic primitives.
*
* @param provider the JCA provider to use.
* @return a new JceKeyFingerprintCalculator supported by the passed in provider.
*/
public JcaKeyFingerprintCalculator setProvider(Provider provider)
{
return new JcaKeyFingerprintCalculator(new ProviderJcaJceHelper(provider));
}
/**
* Sets the provider to use to obtain cryptographic primitives.
*
* @param providerName the name of the JCA provider to use.
* @return a new JceKeyFingerprintCalculator supported by the passed in named provider.
*/
public JcaKeyFingerprintCalculator setProvider(String providerName)
{
return new JcaKeyFingerprintCalculator(new NamedJcaJceHelper(providerName));
}
public byte[] calculateFingerprint(PublicKeyPacket publicPk)
throws PGPException
{
BCPGKey key = publicPk.getKey();
if (publicPk.getVersion() <= 3)
{
RSAPublicBCPGKey rK = (RSAPublicBCPGKey)key;
try
{
MessageDigest digest = helper.createMessageDigest("MD5");
byte[] bytes = new MPInteger(rK.getModulus()).getEncoded();
digest.update(bytes, 2, bytes.length - 2);
bytes = new MPInteger(rK.getPublicExponent()).getEncoded();
digest.update(bytes, 2, bytes.length - 2);
return digest.digest();
}
catch (NoSuchAlgorithmException e)
{
throw new PGPException("can't find MD5", e);
}
catch (NoSuchProviderException e)
{
throw new PGPException("can't find MD5", e);
}
catch (IOException e)
{
throw new PGPException("can't encode key components: " + e.getMessage(), e);
}
}
else
{
try
{
byte[] kBytes = publicPk.getEncodedContents();
MessageDigest digest = helper.createMessageDigest("SHA1");
digest.update((byte)0x99);
digest.update((byte)(kBytes.length >> 8));
digest.update((byte)kBytes.length);
digest.update(kBytes);
return digest.digest();
}
catch (NoSuchAlgorithmException e)
{
throw new PGPException("can't find SHA1", e);
}
catch (NoSuchProviderException e)
{
throw new PGPException("can't find SHA1", e);
}
catch (IOException e)
{
throw new PGPException("can't encode key components: " + e.getMessage(), e);
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy