summaryrefslogtreecommitdiffstats
path: root/bcprov/src/main/java/org/bouncycastle/crypto/ec/ECFixedTransform.java
diff options
context:
space:
mode:
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.java27
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();
+ }
}