package org.bouncycastle.crypto.tls; import java.security.SecureRandom; import org.bouncycastle.crypto.CryptoException; import org.bouncycastle.crypto.DSA; import org.bouncycastle.crypto.Signer; import org.bouncycastle.crypto.digests.NullDigest; import org.bouncycastle.crypto.digests.SHA1Digest; import org.bouncycastle.crypto.params.AsymmetricKeyParameter; import org.bouncycastle.crypto.params.ParametersWithRandom; import org.bouncycastle.crypto.signers.DSADigestSigner; abstract class TlsDSASigner implements TlsSigner { public byte[] calculateRawSignature(SecureRandom secureRandom, AsymmetricKeyParameter privateKey, byte[] md5andsha1) throws CryptoException { // Note: Only use the SHA1 part of the hash Signer signer = new DSADigestSigner(createDSAImpl(), new NullDigest()); signer.init(true, new ParametersWithRandom(privateKey, secureRandom)); signer.update(md5andsha1, 16, 20); return signer.generateSignature(); } public Signer createVerifyer(AsymmetricKeyParameter publicKey) { Signer verifyer = new DSADigestSigner(createDSAImpl(), new SHA1Digest()); verifyer.init(false, publicKey); return verifyer; } protected abstract DSA createDSAImpl(); }