diff options
Diffstat (limited to 'core/src/main/java/org/bouncycastle/crypto/tls/TlsDSASigner.java')
-rw-r--r-- | core/src/main/java/org/bouncycastle/crypto/tls/TlsDSASigner.java | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/core/src/main/java/org/bouncycastle/crypto/tls/TlsDSASigner.java b/core/src/main/java/org/bouncycastle/crypto/tls/TlsDSASigner.java new file mode 100644 index 00000000..b0e89572 --- /dev/null +++ b/core/src/main/java/org/bouncycastle/crypto/tls/TlsDSASigner.java @@ -0,0 +1,57 @@ +package org.bouncycastle.crypto.tls; + +import org.bouncycastle.crypto.CipherParameters; +import org.bouncycastle.crypto.CryptoException; +import org.bouncycastle.crypto.DSA; +import org.bouncycastle.crypto.Digest; +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; + +public abstract class TlsDSASigner + extends AbstractTlsSigner +{ + + public byte[] generateRawSignature(AsymmetricKeyParameter privateKey, byte[] md5AndSha1) + throws CryptoException + { + + // Note: Only use the SHA1 part of the hash + Signer signer = makeSigner(new NullDigest(), true, + new ParametersWithRandom(privateKey, this.context.getSecureRandom())); + signer.update(md5AndSha1, 16, 20); + return signer.generateSignature(); + } + + public boolean verifyRawSignature(byte[] sigBytes, AsymmetricKeyParameter publicKey, byte[] md5AndSha1) + throws CryptoException + { + + // Note: Only use the SHA1 part of the hash + Signer signer = makeSigner(new NullDigest(), false, publicKey); + signer.update(md5AndSha1, 16, 20); + return signer.verifySignature(sigBytes); + } + + public Signer createSigner(AsymmetricKeyParameter privateKey) + { + return makeSigner(new SHA1Digest(), true, new ParametersWithRandom(privateKey, this.context.getSecureRandom())); + } + + public Signer createVerifyer(AsymmetricKeyParameter publicKey) + { + return makeSigner(new SHA1Digest(), false, publicKey); + } + + protected Signer makeSigner(Digest d, boolean forSigning, CipherParameters cp) + { + Signer s = new DSADigestSigner(createDSAImpl(), d); + s.init(forSigning, cp); + return s; + } + + protected abstract DSA createDSAImpl(); +} |