diff options
Diffstat (limited to 'core/src/main/java/org/bouncycastle/crypto/signers/ECDSASigner.java')
-rw-r--r-- | core/src/main/java/org/bouncycastle/crypto/signers/ECDSASigner.java | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/core/src/main/java/org/bouncycastle/crypto/signers/ECDSASigner.java b/core/src/main/java/org/bouncycastle/crypto/signers/ECDSASigner.java index 9156de40..2a1f98eb 100644 --- a/core/src/main/java/org/bouncycastle/crypto/signers/ECDSASigner.java +++ b/core/src/main/java/org/bouncycastle/crypto/signers/ECDSASigner.java @@ -19,9 +19,28 @@ import org.bouncycastle.math.ec.ECPoint; public class ECDSASigner implements ECConstants, DSA { - ECKeyParameters key; + private final DSAKCalculator kCalculator; - SecureRandom random; + private ECKeyParameters key; + private SecureRandom random; + + /** + * Default configuration, random K values. + */ + public ECDSASigner() + { + this.kCalculator = new RandomDSAKCalculator(); + } + + /** + * Configuration with an alternate, possibly deterministic calculator of K. + * + * @param kCalculator a K value calculator. + */ + public ECDSASigner(DSAKCalculator kCalculator) + { + this.kCalculator = kCalculator; + } public void init( boolean forSigning, @@ -64,19 +83,23 @@ public class ECDSASigner BigInteger r = null; BigInteger s = null; + if (kCalculator.isDeterministic()) + { + kCalculator.init(n, ((ECPrivateKeyParameters)key).getD(), message); + } + else + { + kCalculator.init(n, random); + } + // 5.3.2 do // generate s { BigInteger k = null; - int nBitLength = n.bitLength(); do // generate r { - do - { - k = new BigInteger(nBitLength, random); - } - while (k.equals(ZERO) || k.compareTo(n) >= 0); + k = kCalculator.nextK(); ECPoint p = key.getParameters().getG().multiply(k).normalize(); @@ -153,7 +176,7 @@ public class ECDSASigner int log2n = n.bitLength(); int messageBitLength = message.length * 8; - BigInteger e = new BigInteger(1, message); + BigInteger e = new BigInteger(1, message); if (log2n < messageBitLength) { e = e.shiftRight(messageBitLength - log2n); |