diff options
author | Peter Dettman <peter.dettman@bouncycastle.org> | 2022-02-05 20:13:56 +0700 |
---|---|---|
committer | Peter Dettman <peter.dettman@bouncycastle.org> | 2022-02-05 20:13:56 +0700 |
commit | 0fbb9e698c6193873b87b19e96a6385c33f436fc (patch) | |
tree | 8d7e2c7bf737aa82b585fbabab0dfbf699cca222 /crypto/src/math/ec/custom/sec/SecP384R1Point.cs | |
parent | Fix case-sensitive file names (diff) | |
download | BouncyCastle.NET-ed25519-0fbb9e698c6193873b87b19e96a6385c33f436fc.tar.xz |
Small performance optimization for important curves
Diffstat (limited to 'crypto/src/math/ec/custom/sec/SecP384R1Point.cs')
-rw-r--r-- | crypto/src/math/ec/custom/sec/SecP384R1Point.cs | 46 |
1 files changed, 24 insertions, 22 deletions
diff --git a/crypto/src/math/ec/custom/sec/SecP384R1Point.cs b/crypto/src/math/ec/custom/sec/SecP384R1Point.cs index 83159ce61..c2c364be1 100644 --- a/crypto/src/math/ec/custom/sec/SecP384R1Point.cs +++ b/crypto/src/math/ec/custom/sec/SecP384R1Point.cs @@ -74,6 +74,7 @@ namespace Org.BouncyCastle.Math.EC.Custom.Sec SecP384R1FieldElement Z2 = (SecP384R1FieldElement)b.RawZCoords[0]; uint c; + uint[] tt0 = Nat.Create(24); uint[] tt1 = Nat.Create(24); uint[] tt2 = Nat.Create(24); uint[] t3 = Nat.Create(12); @@ -89,13 +90,13 @@ namespace Org.BouncyCastle.Math.EC.Custom.Sec else { S2 = t3; - SecP384R1Field.Square(Z1.x, S2); + SecP384R1Field.Square(Z1.x, S2, tt0); U2 = tt2; - SecP384R1Field.Multiply(S2, X2.x, U2); + SecP384R1Field.Multiply(S2, X2.x, U2, tt0); - SecP384R1Field.Multiply(S2, Z1.x, S2); - SecP384R1Field.Multiply(S2, Y2.x, S2); + SecP384R1Field.Multiply(S2, Z1.x, S2, tt0); + SecP384R1Field.Multiply(S2, Y2.x, S2, tt0); } bool Z2IsOne = Z2.IsOne; @@ -108,13 +109,13 @@ namespace Org.BouncyCastle.Math.EC.Custom.Sec else { S1 = t4; - SecP384R1Field.Square(Z2.x, S1); + SecP384R1Field.Square(Z2.x, S1, tt0); U1 = tt1; - SecP384R1Field.Multiply(S1, X1.x, U1); + SecP384R1Field.Multiply(S1, X1.x, U1, tt0); - SecP384R1Field.Multiply(S1, Z2.x, S1); - SecP384R1Field.Multiply(S1, Y1.x, S1); + SecP384R1Field.Multiply(S1, Z2.x, S1, tt0); + SecP384R1Field.Multiply(S1, Y1.x, S1, tt0); } uint[] H = Nat.Create(12); @@ -137,13 +138,13 @@ namespace Org.BouncyCastle.Math.EC.Custom.Sec } uint[] HSquared = t3; - SecP384R1Field.Square(H, HSquared); + SecP384R1Field.Square(H, HSquared, tt0); uint[] G = Nat.Create(12); - SecP384R1Field.Multiply(HSquared, H, G); + SecP384R1Field.Multiply(HSquared, H, G, tt0); uint[] V = t3; - SecP384R1Field.Multiply(HSquared, U1, V); + SecP384R1Field.Multiply(HSquared, U1, V, tt0); SecP384R1Field.Negate(G, G); Nat384.Mul(S1, G, tt1); @@ -152,7 +153,7 @@ namespace Org.BouncyCastle.Math.EC.Custom.Sec SecP384R1Field.Reduce32(c, G); SecP384R1FieldElement X3 = new SecP384R1FieldElement(t4); - SecP384R1Field.Square(R, X3.x); + SecP384R1Field.Square(R, X3.x, tt0); SecP384R1Field.Subtract(X3.x, G, X3.x); SecP384R1FieldElement Y3 = new SecP384R1FieldElement(G); @@ -164,11 +165,11 @@ namespace Org.BouncyCastle.Math.EC.Custom.Sec SecP384R1FieldElement Z3 = new SecP384R1FieldElement(H); if (!Z1IsOne) { - SecP384R1Field.Multiply(Z3.x, Z1.x, Z3.x); + SecP384R1Field.Multiply(Z3.x, Z1.x, Z3.x, tt0); } if (!Z2IsOne) { - SecP384R1Field.Multiply(Z3.x, Z2.x, Z3.x); + SecP384R1Field.Multiply(Z3.x, Z2.x, Z3.x, tt0); } ECFieldElement[] zs = new ECFieldElement[] { Z3 }; @@ -190,14 +191,15 @@ namespace Org.BouncyCastle.Math.EC.Custom.Sec SecP384R1FieldElement X1 = (SecP384R1FieldElement)this.RawXCoord, Z1 = (SecP384R1FieldElement)this.RawZCoords[0]; uint c; + uint[] tt0 = Nat.Create(24); uint[] t1 = Nat.Create(12); uint[] t2 = Nat.Create(12); uint[] Y1Squared = Nat.Create(12); - SecP384R1Field.Square(Y1.x, Y1Squared); + SecP384R1Field.Square(Y1.x, Y1Squared, tt0); uint[] T = Nat.Create(12); - SecP384R1Field.Square(Y1Squared, T); + SecP384R1Field.Square(Y1Squared, T, tt0); bool Z1IsOne = Z1.IsOne; @@ -205,19 +207,19 @@ namespace Org.BouncyCastle.Math.EC.Custom.Sec if (!Z1IsOne) { Z1Squared = t2; - SecP384R1Field.Square(Z1.x, Z1Squared); + SecP384R1Field.Square(Z1.x, Z1Squared, tt0); } SecP384R1Field.Subtract(X1.x, Z1Squared, t1); uint[] M = t2; SecP384R1Field.Add(X1.x, Z1Squared, M); - SecP384R1Field.Multiply(M, t1, M); + SecP384R1Field.Multiply(M, t1, M, tt0); c = Nat.AddBothTo(12, M, M, M); SecP384R1Field.Reduce32(c, M); uint[] S = Y1Squared; - SecP384R1Field.Multiply(Y1Squared, X1.x, S); + SecP384R1Field.Multiply(Y1Squared, X1.x, S, tt0); c = Nat.ShiftUpBits(12, S, 2, 0); SecP384R1Field.Reduce32(c, S); @@ -225,20 +227,20 @@ namespace Org.BouncyCastle.Math.EC.Custom.Sec SecP384R1Field.Reduce32(c, t1); SecP384R1FieldElement X3 = new SecP384R1FieldElement(T); - SecP384R1Field.Square(M, X3.x); + SecP384R1Field.Square(M, X3.x, tt0); SecP384R1Field.Subtract(X3.x, S, X3.x); SecP384R1Field.Subtract(X3.x, S, X3.x); SecP384R1FieldElement Y3 = new SecP384R1FieldElement(S); SecP384R1Field.Subtract(S, X3.x, Y3.x); - SecP384R1Field.Multiply(Y3.x, M, Y3.x); + SecP384R1Field.Multiply(Y3.x, M, Y3.x, tt0); SecP384R1Field.Subtract(Y3.x, t1, Y3.x); SecP384R1FieldElement Z3 = new SecP384R1FieldElement(M); SecP384R1Field.Twice(Y1.x, Z3.x); if (!Z1IsOne) { - SecP384R1Field.Multiply(Z3.x, Z1.x, Z3.x); + SecP384R1Field.Multiply(Z3.x, Z1.x, Z3.x, tt0); } return new SecP384R1Point(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed); |