1
package org.bouncycastle.jce.provider;
3
import java.io.IOException;
4
import java.math.BigInteger;
5
import java.security.InvalidKeyException;
6
import java.security.PrivateKey;
7
import java.security.PublicKey;
8
import java.security.SecureRandom;
9
import java.security.SignatureException;
10
import java.security.SignatureSpi;
11
import java.security.interfaces.DSAKey;
12
import java.security.spec.AlgorithmParameterSpec;
14
import org.bouncycastle.asn1.ASN1Encodable;
15
import org.bouncycastle.asn1.ASN1Object;
16
import org.bouncycastle.asn1.ASN1Sequence;
17
import org.bouncycastle.asn1.DERInteger;
18
import org.bouncycastle.asn1.DERSequence;
19
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
20
import org.bouncycastle.asn1.x509.X509ObjectIdentifiers;
21
import org.bouncycastle.crypto.CipherParameters;
22
import org.bouncycastle.crypto.DSA;
23
import org.bouncycastle.crypto.Digest;
24
import org.bouncycastle.crypto.digests.NullDigest;
25
import org.bouncycastle.crypto.digests.SHA1Digest;
26
import org.bouncycastle.crypto.digests.SHA224Digest;
27
import org.bouncycastle.crypto.digests.SHA256Digest;
28
import org.bouncycastle.crypto.digests.SHA384Digest;
29
import org.bouncycastle.crypto.digests.SHA512Digest;
30
import org.bouncycastle.crypto.params.ParametersWithRandom;
31
import org.bouncycastle.crypto.signers.DSASigner;
32
import org.bouncycastle.jce.interfaces.GOST3410Key;
34
public class JDKDSASigner
36
implements PKCSObjectIdentifiers, X509ObjectIdentifiers
38
private Digest digest;
40
private SecureRandom random;
42
protected JDKDSASigner(
50
protected void engineInitVerify(
52
throws InvalidKeyException
54
CipherParameters param;
56
if (publicKey instanceof GOST3410Key)
58
param = GOST3410Util.generatePublicKeyParameter(publicKey);
60
else if (publicKey instanceof DSAKey)
62
param = DSAUtil.generatePublicKeyParameter(publicKey);
68
byte[] bytes = publicKey.getEncoded();
70
publicKey = JDKKeyFactory.createPublicKeyFromDERStream(bytes);
72
if (publicKey instanceof DSAKey)
74
param = DSAUtil.generatePublicKeyParameter(publicKey);
78
throw new InvalidKeyException("can't recognise key type in DSA based signer");
83
throw new InvalidKeyException("can't recognise key type in DSA based signer");
88
signer.init(false, param);
91
protected void engineInitSign(
92
PrivateKey privateKey,
94
throws InvalidKeyException
97
engineInitSign(privateKey);
100
protected void engineInitSign(
101
PrivateKey privateKey)
102
throws InvalidKeyException
104
CipherParameters param;
106
if (privateKey instanceof GOST3410Key)
108
param = GOST3410Util.generatePrivateKeyParameter(privateKey);
112
param = DSAUtil.generatePrivateKeyParameter(privateKey);
117
param = new ParametersWithRandom(param, random);
121
signer.init(true, param);
124
protected void engineUpdate(
126
throws SignatureException
131
protected void engineUpdate(
135
throws SignatureException
137
digest.update(b, off, len);
140
protected byte[] engineSign()
141
throws SignatureException
143
byte[] hash = new byte[digest.getDigestSize()];
145
digest.doFinal(hash, 0);
149
BigInteger[] sig = signer.generateSignature(hash);
151
return derEncode(sig[0], sig[1]);
155
throw new SignatureException(e.toString());
159
protected boolean engineVerify(
161
throws SignatureException
163
byte[] hash = new byte[digest.getDigestSize()];
165
digest.doFinal(hash, 0);
171
sig = derDecode(sigBytes);
175
throw new SignatureException("error decoding signature bytes.");
178
return signer.verifySignature(hash, sig[0], sig[1]);
181
protected void engineSetParameter(
182
AlgorithmParameterSpec params)
184
throw new UnsupportedOperationException("engineSetParameter unsupported");
188
* @deprecated replaced with <a href = "#engineSetParameter(java.security.spec.AlgorithmParameterSpec)">
190
protected void engineSetParameter(
194
throw new UnsupportedOperationException("engineSetParameter unsupported");
200
protected Object engineGetParameter(
203
throw new UnsupportedOperationException("engineSetParameter unsupported");
206
private byte[] derEncode(
211
DERInteger[] rs = new DERInteger[]{ new DERInteger(r), new DERInteger(s) };
212
return new DERSequence(rs).getEncoded(ASN1Encodable.DER);
215
private BigInteger[] derDecode(
219
ASN1Sequence s = (ASN1Sequence)ASN1Object.fromByteArray(encoding);
220
return new BigInteger[]{
221
((DERInteger)s.getObjectAt(0)).getValue(),
222
((DERInteger)s.getObjectAt(1)).getValue()
226
static public class stdDSA
231
super(new SHA1Digest(), new DSASigner());
235
static public class dsa224
240
super(new SHA224Digest(), new DSASigner());
244
static public class dsa256
249
super(new SHA256Digest(), new DSASigner());
253
static public class dsa384
258
super(new SHA384Digest(), new DSASigner());
262
static public class dsa512
267
super(new SHA512Digest(), new DSASigner());
271
static public class noneDSA
276
super(new NullDigest(), new DSASigner());