diff options
Diffstat (limited to 'crypto/src/math/ec/ECPoint.cs')
-rw-r--r-- | crypto/src/math/ec/ECPoint.cs | 66 |
1 files changed, 32 insertions, 34 deletions
diff --git a/crypto/src/math/ec/ECPoint.cs b/crypto/src/math/ec/ECPoint.cs index f2b0cdc27..257e0fd5d 100644 --- a/crypto/src/math/ec/ECPoint.cs +++ b/crypto/src/math/ec/ECPoint.cs @@ -617,7 +617,7 @@ namespace Org.BouncyCastle.Math.EC ECFieldElement A = u.Square().Multiply(w).Subtract(vCubed).Subtract(Two(vSquaredV2)); ECFieldElement X3 = v.Multiply(A); - ECFieldElement Y3 = vSquaredV2.Subtract(A).Multiply(u).Subtract(vCubed.Multiply(u2)); + ECFieldElement Y3 = vSquaredV2.Subtract(A).MultiplyMinusProduct(u, u2, vCubed); ECFieldElement Z3 = vCubed.Multiply(w); return new FpPoint(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed); @@ -714,7 +714,7 @@ namespace Org.BouncyCastle.Math.EC ECFieldElement V = HSquared.Multiply(U1); X3 = R.Square().Add(G).Subtract(Two(V)); - Y3 = V.Subtract(X3).Multiply(R).Subtract(S1.Multiply(G)); + Y3 = V.Subtract(X3).MultiplyMinusProduct(R, G, S1); Z3 = H; if (!Z1IsOne) @@ -1038,7 +1038,6 @@ namespace Org.BouncyCastle.Math.EC return a.Add(b).Square().Subtract(aSquared).Subtract(bSquared); } - // D.3.2 pg 102 (see Note:) public override ECPoint Subtract( ECPoint b) { @@ -1068,7 +1067,7 @@ namespace Org.BouncyCastle.Math.EC protected virtual ECFieldElement CalculateJacobianModifiedW(ECFieldElement Z, ECFieldElement ZSquared) { ECFieldElement a4 = this.Curve.A; - if (a4.IsZero) + if (a4.IsZero || Z.IsOne) return a4; if (ZSquared == null) @@ -1334,13 +1333,23 @@ namespace Org.BouncyCastle.Math.EC ECFieldElement Y1 = this.RawYCoord, Z1 = this.RawZCoords[0]; ECFieldElement Y2 = b.RawYCoord, Z2 = b.RawZCoords[0]; + bool Z1IsOne = Z1.IsOne; + ECFieldElement U1 = Y2, V1 = X2; + if (!Z1IsOne) + { + U1 = U1.Multiply(Z1); + V1 = V1.Multiply(Z1); + } + bool Z2IsOne = Z2.IsOne; + ECFieldElement U2 = Y1, V2 = X1; + if (!Z2IsOne) + { + U2 = U2.Multiply(Z2); + V2 = V2.Multiply(Z2); + } - ECFieldElement U1 = Z1.Multiply(Y2); - ECFieldElement U2 = Z2IsOne ? Y1 : Y1.Multiply(Z2); ECFieldElement U = U1.Add(U2); - ECFieldElement V1 = Z1.Multiply(X2); - ECFieldElement V2 = Z2IsOne ? X1 : X1.Multiply(Z2); ECFieldElement V = V1.Add(V2); if (V.IsZero) @@ -1355,15 +1364,13 @@ namespace Org.BouncyCastle.Math.EC ECFieldElement VSq = V.Square(); ECFieldElement VCu = VSq.Multiply(V); - ECFieldElement W = Z2IsOne ? Z1 : Z1.Multiply(Z2); + ECFieldElement W = Z1IsOne ? Z2 : Z2IsOne ? Z1 : Z1.Multiply(Z2); 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 A = uv.MultiplyPlusProduct(U, VSq, curve.A).Multiply(W).Add(VCu); ECFieldElement X3 = V.Multiply(A); ECFieldElement VSqZ2 = Z2IsOne ? VSq : VSq.Multiply(Z2); - // TODO Delayed modular reduction for sum of products - ECFieldElement Y3 = U.Multiply(X1).Add(Y1.Multiply(V)).Multiply(VSqZ2).Add(A.Multiply(uv)); + ECFieldElement Y3 = U.MultiplyPlusProduct(X1, V, Y1).MultiplyPlusProduct(VSqZ2, uv, A); ECFieldElement Z3 = VCu.Multiply(W); return new F2mPoint(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed); @@ -1450,8 +1457,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))); + L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1)); Z3 = ABZ2; if (!Z1IsOne) @@ -1559,8 +1565,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())); + ECFieldElement Y3 = X1.SquarePlusProduct(X3, L1.AddOne()); return new F2mPoint(curve, X3, Y3, IsCompressed); } @@ -1577,12 +1582,10 @@ namespace Org.BouncyCastle.Math.EC ECFieldElement V = X1Z1; ECFieldElement vSquared = V.Square(); ECFieldElement sv = S.Add(V); - // TODO Delayed modular reduction for sum of products - ECFieldElement h = sv.Multiply(S).Add(curve.A.Multiply(vSquared)); + ECFieldElement h = sv.MultiplyPlusProduct(S, vSquared, curve.A); ECFieldElement X3 = V.Multiply(h); - // TODO Delayed modular reduction for sum of products - ECFieldElement Y3 = h.Multiply(sv).Add(X1Sq.Square().Multiply(V)); + ECFieldElement Y3 = X1Sq.Square().MultiplyPlusProduct(V, h, sv); ECFieldElement Z3 = V.Multiply(vSquared); return new F2mPoint(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed); @@ -1610,19 +1613,17 @@ namespace Org.BouncyCastle.Math.EC if (b.BitLength < (curve.FieldSize >> 1)) { ECFieldElement t1 = L1.Add(X1).Square(); - ECFieldElement t4; + ECFieldElement t2; if (b.IsOne) { - t4 = aZ1Sq.Add(Z1Sq).Square(); + t2 = aZ1Sq.Add(Z1Sq).Square(); } else { - // TODO t2/t3 can be calculated with one square if we pre-compute sqrt(b) - ECFieldElement t2 = aZ1Sq.Square(); - ECFieldElement t3 = b.Multiply(Z1Sq.Square()); - t4 = t2.Add(t3); + // TODO Can be calculated with one square if we pre-compute sqrt(b) + t2 = aZ1Sq.SquarePlusProduct(b, Z1Sq.Square()); } - L3 = t1.Add(T).Add(Z1Sq).Multiply(t1).Add(t4).Add(X3); + L3 = t1.Add(T).Add(Z1Sq).Multiply(t1).Add(t2).Add(X3); if (a.IsZero) { L3 = L3.Add(Z3); @@ -1635,8 +1636,7 @@ namespace Org.BouncyCastle.Math.EC else { ECFieldElement X1Z1 = Z1IsOne ? X1 : X1.Multiply(Z1); - // TODO Delayed modular reduction for sum of products - L3 = X1Z1.Square().Add(T.Multiply(L1Z1)).Add(X3).Add(Z3); + L3 = X1Z1.SquarePlusProduct(T, L1Z1).Add(X3).Add(Z3); } return new F2mPoint(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed); @@ -1687,8 +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 A = curve.A.Add(L2plus1).Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq); ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq); ECFieldElement B = X2Z1Sq.Add(T).Square(); @@ -1709,8 +1708,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)); + ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2plus1, Z3); return new F2mPoint(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed); } |