diff options
Diffstat (limited to 'bcprov/src/main/java/org/bouncycastle/crypto/ec/ECFixedTransform.java')
-rw-r--r-- | bcprov/src/main/java/org/bouncycastle/crypto/ec/ECFixedTransform.java | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/bcprov/src/main/java/org/bouncycastle/crypto/ec/ECFixedTransform.java b/bcprov/src/main/java/org/bouncycastle/crypto/ec/ECFixedTransform.java index e35e077..2c6a920 100644 --- a/bcprov/src/main/java/org/bouncycastle/crypto/ec/ECFixedTransform.java +++ b/bcprov/src/main/java/org/bouncycastle/crypto/ec/ECFixedTransform.java @@ -3,8 +3,11 @@ package org.bouncycastle.crypto.ec; import java.math.BigInteger; import org.bouncycastle.crypto.CipherParameters; +import org.bouncycastle.crypto.params.ECDomainParameters; import org.bouncycastle.crypto.params.ECPublicKeyParameters; +import org.bouncycastle.math.ec.ECMultiplier; import org.bouncycastle.math.ec.ECPoint; +import org.bouncycastle.math.ec.FixedPointCombMultiplier; /** * this transforms the original randomness used for an ElGamal encryption by a fixed value. @@ -38,7 +41,7 @@ public class ECFixedTransform } /** - * Transform an existing cipher test pair using the ElGamal algorithm. Note: it is assumed this + * Transform an existing cipher text pair using the ElGamal algorithm. Note: it is assumed this * transform has been initialised with the same public key that was used to create the original * cipher text. * @@ -52,11 +55,20 @@ public class ECFixedTransform throw new IllegalStateException("ECFixedTransform not initialised"); } - ECPoint g = key.getParameters().getG(); - ECPoint gamma = g.multiply(k); - ECPoint phi = key.getQ().multiply(k).add(cipherText.getY()); + ECDomainParameters ec = key.getParameters(); + BigInteger n = ec.getN(); - return new ECPair(cipherText.getX().add(gamma).normalize(), phi.normalize()); + ECMultiplier basePointMultiplier = createBasePointMultiplier(); + BigInteger k = this.k.mod(n); + + ECPoint[] gamma_phi = new ECPoint[]{ + basePointMultiplier.multiply(ec.getG(), k).add(cipherText.getX()), + key.getQ().multiply(k).add(cipherText.getY()) + }; + + ec.getCurve().normalizeAll(gamma_phi); + + return new ECPair(gamma_phi[0], gamma_phi[1]); } /** @@ -68,4 +80,9 @@ public class ECFixedTransform { return k; } + + protected ECMultiplier createBasePointMultiplier() + { + return new FixedPointCombMultiplier(); + } } |