diff options
Diffstat (limited to 'bcprov/src/main/java/org/bouncycastle/crypto/signers/DSTU4145Signer.java')
-rw-r--r-- | bcprov/src/main/java/org/bouncycastle/crypto/signers/DSTU4145Signer.java | 57 |
1 files changed, 26 insertions, 31 deletions
diff --git a/bcprov/src/main/java/org/bouncycastle/crypto/signers/DSTU4145Signer.java b/bcprov/src/main/java/org/bouncycastle/crypto/signers/DSTU4145Signer.java index 0e76950..bceb822 100644 --- a/bcprov/src/main/java/org/bouncycastle/crypto/signers/DSTU4145Signer.java +++ b/bcprov/src/main/java/org/bouncycastle/crypto/signers/DSTU4145Signer.java @@ -13,7 +13,9 @@ import org.bouncycastle.crypto.params.ParametersWithRandom; import org.bouncycastle.math.ec.ECAlgorithms; import org.bouncycastle.math.ec.ECCurve; import org.bouncycastle.math.ec.ECFieldElement; +import org.bouncycastle.math.ec.ECMultiplier; import org.bouncycastle.math.ec.ECPoint; +import org.bouncycastle.math.ec.FixedPointCombMultiplier; import org.bouncycastle.util.Arrays; /** @@ -57,9 +59,9 @@ public class DSTU4145Signer public BigInteger[] generateSignature(byte[] message) { - ECDomainParameters parameters = key.getParameters(); + ECDomainParameters ec = key.getParameters(); - ECCurve curve = parameters.getCurve(); + ECCurve curve = ec.getCurve(); ECFieldElement h = hash2FieldElement(curve, message); if (h.isZero()) @@ -67,10 +69,14 @@ public class DSTU4145Signer h = curve.fromBigInteger(ONE); } - BigInteger n = parameters.getN(); + BigInteger n = ec.getN(); BigInteger e, r, s; ECFieldElement Fe, y; + BigInteger d = ((ECPrivateKeyParameters)key).getD(); + + ECMultiplier basePointMultiplier = createBasePointMultiplier(); + do { do @@ -78,7 +84,7 @@ public class DSTU4145Signer do { e = generateRandomInteger(n, random); - Fe = parameters.getG().multiply(e).normalize().getAffineXCoord(); + Fe = basePointMultiplier.multiply(ec.getG(), e).normalize().getAffineXCoord(); } while (Fe.isZero()); @@ -87,7 +93,7 @@ public class DSTU4145Signer } while (r.signum() == 0); - s = r.multiply(((ECPrivateKeyParameters)key).getD()).add(e).mod(n); + s = r.multiply(d).add(e).mod(n); } while (s.signum() == 0); @@ -129,6 +135,11 @@ public class DSTU4145Signer return fieldElement2Integer(n, y).compareTo(r) == 0; } + protected ECMultiplier createBasePointMultiplier() + { + return new FixedPointCombMultiplier(); + } + /** * Generates random integer such, than its bit length is less than that of n */ @@ -136,40 +147,24 @@ public class DSTU4145Signer { return new BigInteger(n.bitLength() - 1, random); } - - private static void reverseBytes(byte[] bytes) - { - byte tmp; - - for (int i=0; i<bytes.length/2; i++) - { - tmp=bytes[i]; - bytes[i]=bytes[bytes.length-1-i]; - bytes[bytes.length-1-i]=tmp; - } - } private static ECFieldElement hash2FieldElement(ECCurve curve, byte[] hash) { - byte[] data = Arrays.clone(hash); - reverseBytes(data); - BigInteger num = new BigInteger(1, data); - while (num.bitLength() > curve.getFieldSize()) - { - num = num.clearBit(num.bitLength() - 1); - } + byte[] data = Arrays.reverse(hash); + return curve.fromBigInteger(truncate(new BigInteger(1, data), curve.getFieldSize())); + } - return curve.fromBigInteger(num); + private static BigInteger fieldElement2Integer(BigInteger n, ECFieldElement fe) + { + return truncate(fe.toBigInteger(), n.bitLength() - 1); } - private static BigInteger fieldElement2Integer(BigInteger n, ECFieldElement fieldElement) + private static BigInteger truncate(BigInteger x, int bitLength) { - BigInteger num = fieldElement.toBigInteger(); - while (num.bitLength() >= n.bitLength()) + if (x.bitLength() > bitLength) { - num = num.clearBit(num.bitLength() - 1); + x = x.mod(ONE.shiftLeft(bitLength)); } - - return num; + return x; } } |