summary refs log tree commit diff
path: root/crypto
diff options
context:
space:
mode:
Diffstat (limited to 'crypto')
-rw-r--r--crypto/src/math/ec/ECPoint.cs45
1 files changed, 28 insertions, 17 deletions
diff --git a/crypto/src/math/ec/ECPoint.cs b/crypto/src/math/ec/ECPoint.cs
index d26cfb914..f2b0cdc27 100644
--- a/crypto/src/math/ec/ECPoint.cs
+++ b/crypto/src/math/ec/ECPoint.cs
@@ -1245,14 +1245,13 @@ namespace Org.BouncyCastle.Math.EC
                     case ECCurve.COORD_LAMBDA_PROJECTIVE:
                     {
                         // Y is actually Lambda (X + Y/X) here
-                        return Y.Subtract(X).TestBitZero();
+                        return Y.TestBitZero() != X.TestBitZero();
                     }
                     default:
                     {
                         return Y.Divide(X).TestBitZero();
                     }
                 }
-
             }
         }
 
@@ -1312,9 +1311,10 @@ namespace Org.BouncyCastle.Math.EC
                     ECFieldElement Y1 = this.RawYCoord;
                     ECFieldElement Y2 = b.RawYCoord;
 
-                    if (X1.Equals(X2))
+                    ECFieldElement dx = X1.Add(X2), dy = Y1.Add(Y2);
+                    if (dx.IsZero)
                     {
-                        if (Y1.Equals(Y2))
+                        if (dy.IsZero)
                         {
                             return (F2mPoint)Twice();
                         }
@@ -1322,10 +1322,9 @@ namespace Org.BouncyCastle.Math.EC
                         return (F2mPoint)curve.Infinity;
                     }
 
-                    ECFieldElement sumX = X1.Add(X2);
-                    ECFieldElement L = Y1.Add(Y2).Divide(sumX);
+                    ECFieldElement L = dy.Divide(dx);
 
-                    ECFieldElement X3 = L.Square().Add(L).Add(sumX).Add(curve.A);
+                    ECFieldElement X3 = L.Square().Add(L).Add(dx).Add(curve.A);
                     ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
 
                     return new F2mPoint(curve, X3, Y3, IsCompressed);
@@ -1339,14 +1338,14 @@ namespace Org.BouncyCastle.Math.EC
 
                     ECFieldElement U1 = Z1.Multiply(Y2);
                     ECFieldElement U2 = Z2IsOne ? Y1 : Y1.Multiply(Z2);
-                    ECFieldElement U = U1.Subtract(U2);
+                    ECFieldElement U = U1.Add(U2);
                     ECFieldElement V1 = Z1.Multiply(X2);
                     ECFieldElement V2 = Z2IsOne ? X1 : X1.Multiply(Z2);
-                    ECFieldElement V = V1.Subtract(V2);
+                    ECFieldElement V = V1.Add(V2);
 
-                    if (V1.Equals(V2))
+                    if (V.IsZero)
                     {
-                        if (U1.Equals(U2))
+                        if (U.IsZero)
                         {
                             return (F2mPoint)Twice();
                         }
@@ -1355,13 +1354,17 @@ namespace Org.BouncyCastle.Math.EC
                     }
 
                     ECFieldElement VSq = V.Square();
+                    ECFieldElement VCu = VSq.Multiply(V);
                     ECFieldElement W = Z2IsOne ? Z1 : Z1.Multiply(Z2);
-                    ECFieldElement A = U.Square().Add(U.Multiply(V).Add(VSq.Multiply(curve.A))).Multiply(W).Add(V.Multiply(VSq));
+                    ECFieldElement uv = U.Add(V);
+                    // TODO Delayed modular reduction for sum of products
+                    ECFieldElement A = uv.Multiply(U).Add(VSq.Multiply(curve.A)).Multiply(W).Add(VCu);
 
                     ECFieldElement X3 = V.Multiply(A);
                     ECFieldElement VSqZ2 = Z2IsOne ? VSq : VSq.Multiply(Z2);
-                    ECFieldElement Y3 = VSqZ2.Multiply(U.Multiply(X1).Add(Y1.Multiply(V))).Add(A.Multiply(U.Add(V)));
-                    ECFieldElement Z3 = VSq.Multiply(V).Multiply(W);
+                    // TODO Delayed modular reduction for sum of products
+                    ECFieldElement Y3 = U.Multiply(X1).Add(Y1.Multiply(V)).Multiply(VSqZ2).Add(A.Multiply(uv));
+                    ECFieldElement Z3 = VCu.Multiply(W);
 
                     return new F2mPoint(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed);
                 }
@@ -1447,6 +1450,7 @@ namespace Org.BouncyCastle.Math.EC
                             ABZ2 = ABZ2.Multiply(Z2);
                         }
 
+                        // TODO Delayed modular reduction for sum of products
                         L3 = AU2.Add(B).Square().Add(ABZ2.Multiply(L1.Add(Z1)));
 
                         Z3 = ABZ2;
@@ -1555,6 +1559,7 @@ namespace Org.BouncyCastle.Math.EC
                     ECFieldElement L1 = Y1.Divide(X1).Add(X1);
 
                     ECFieldElement X3 = L1.Square().Add(L1).Add(curve.A);
+                    // TODO Delayed modular reduction for sum of products
                     ECFieldElement Y3 = X1.Square().Add(X3.Multiply(L1.AddOne()));
 
                     return new F2mPoint(curve, X3, Y3, IsCompressed);
@@ -1571,10 +1576,13 @@ namespace Org.BouncyCastle.Math.EC
                     ECFieldElement S = X1Sq.Add(Y1Z1);
                     ECFieldElement V = X1Z1;
                     ECFieldElement vSquared = V.Square();
-                    ECFieldElement h = S.Square().Add(S.Multiply(V)).Add(curve.A.Multiply(vSquared));
+                    ECFieldElement sv = S.Add(V);
+                    // TODO Delayed modular reduction for sum of products
+                    ECFieldElement h = sv.Multiply(S).Add(curve.A.Multiply(vSquared));
 
                     ECFieldElement X3 = V.Multiply(h);
-                    ECFieldElement Y3 = h.Multiply(S.Add(V)).Add(X1Sq.Square().Multiply(V));
+                    // TODO Delayed modular reduction for sum of products
+                    ECFieldElement Y3 = h.Multiply(sv).Add(X1Sq.Square().Multiply(V));
                     ECFieldElement Z3 = V.Multiply(vSquared);
 
                     return new F2mPoint(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed);
@@ -1627,7 +1635,8 @@ namespace Org.BouncyCastle.Math.EC
                     else
                     {
                         ECFieldElement X1Z1 = Z1IsOne ? X1 : X1.Multiply(Z1);
-                        L3 = X1Z1.Square().Add(X3).Add(T.Multiply(L1Z1)).Add(Z3);
+                        // TODO Delayed modular reduction for sum of products
+                        L3 = X1Z1.Square().Add(T.Multiply(L1Z1)).Add(X3).Add(Z3);
                     }
 
                     return new F2mPoint(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
@@ -1678,6 +1687,7 @@ namespace Org.BouncyCastle.Math.EC
 
                     ECFieldElement T = curve.A.Multiply(Z1Sq).Add(L1Sq).Add(L1Z1);
                     ECFieldElement L2plus1 = L2.AddOne();
+                    // TODO Delayed modular reduction for sum of products
                     ECFieldElement A = curve.A.Add(L2plus1).Multiply(Z1Sq).Add(L1Sq).Multiply(T).Add(X1Sq.Multiply(Z1Sq));
                     ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq);
                     ECFieldElement B = X2Z1Sq.Add(T).Square();
@@ -1699,6 +1709,7 @@ namespace Org.BouncyCastle.Math.EC
 
                     ECFieldElement X3 = A.Square().Multiply(X2Z1Sq);
                     ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq);
+                    // TODO Delayed modular reduction for sum of products
                     ECFieldElement L3 = A.Add(B).Square().Multiply(T).Add(L2plus1.Multiply(Z3));
 
                     return new F2mPoint(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);