diff --git a/crypto/src/math/ec/custom/sec/SecP192K1Field.cs b/crypto/src/math/ec/custom/sec/SecP192K1Field.cs
index 6f6f28f91..d5ca903d1 100644
--- a/crypto/src/math/ec/custom/sec/SecP192K1Field.cs
+++ b/crypto/src/math/ec/custom/sec/SecP192K1Field.cs
@@ -75,6 +75,18 @@ namespace Org.BouncyCastle.Math.EC.Custom.Sec
Reduce(tt, z);
}
+ public static void MultiplyAddToExt(uint[] x, uint[] y, uint[] zz)
+ {
+ uint c = Nat192.MulAddTo(x, y, zz);
+ if (c != 0 || (zz[11] == PExt11 && Nat.Gte(12, zz, PExt)))
+ {
+ if (Nat.AddTo(PExtInv.Length, PExtInv, zz) != 0)
+ {
+ Nat.IncAt(12, zz, PExtInv.Length);
+ }
+ }
+ }
+
public static void Negate(uint[] x, uint[] z)
{
if (Nat192.IsZero(x))
diff --git a/crypto/src/math/ec/custom/sec/SecP192R1Field.cs b/crypto/src/math/ec/custom/sec/SecP192R1Field.cs
index 5878749cf..85e3a0394 100644
--- a/crypto/src/math/ec/custom/sec/SecP192R1Field.cs
+++ b/crypto/src/math/ec/custom/sec/SecP192R1Field.cs
@@ -74,6 +74,18 @@ namespace Org.BouncyCastle.Math.EC.Custom.Sec
Reduce(tt, z);
}
+ public static void MultiplyAddToExt(uint[] x, uint[] y, uint[] zz)
+ {
+ uint c = Nat192.MulAddTo(x, y, zz);
+ if (c != 0 || (zz[11] == PExt11 && Nat.Gte(12, zz, PExt)))
+ {
+ if (Nat.AddTo(PExtInv.Length, PExtInv, zz) != 0)
+ {
+ Nat.IncAt(12, zz, PExtInv.Length);
+ }
+ }
+ }
+
public static void Negate(uint[] x, uint[] z)
{
if (Nat192.IsZero(x))
diff --git a/crypto/src/math/ec/custom/sec/SecP224K1Field.cs b/crypto/src/math/ec/custom/sec/SecP224K1Field.cs
index 89eb6258e..a55810c6d 100644
--- a/crypto/src/math/ec/custom/sec/SecP224K1Field.cs
+++ b/crypto/src/math/ec/custom/sec/SecP224K1Field.cs
@@ -76,6 +76,18 @@ namespace Org.BouncyCastle.Math.EC.Custom.Sec
Reduce(tt, z);
}
+ public static void MultiplyAddToExt(uint[] x, uint[] y, uint[] zz)
+ {
+ uint c = Nat224.MulAddTo(x, y, zz);
+ if (c != 0 || (zz[13] == PExt13 && Nat.Gte(14, zz, PExt)))
+ {
+ if (Nat.AddTo(PExtInv.Length, PExtInv, zz) != 0)
+ {
+ Nat.IncAt(14, zz, PExtInv.Length);
+ }
+ }
+ }
+
public static void Negate(uint[] x, uint[] z)
{
if (Nat224.IsZero(x))
diff --git a/crypto/src/math/ec/custom/sec/SecP224R1Field.cs b/crypto/src/math/ec/custom/sec/SecP224R1Field.cs
index 51d9020b6..559593c66 100644
--- a/crypto/src/math/ec/custom/sec/SecP224R1Field.cs
+++ b/crypto/src/math/ec/custom/sec/SecP224R1Field.cs
@@ -74,6 +74,18 @@ namespace Org.BouncyCastle.Math.EC.Custom.Sec
Reduce(tt, z);
}
+ public static void MultiplyAddToExt(uint[] x, uint[] y, uint[] zz)
+ {
+ uint c = Nat224.MulAddTo(x, y, zz);
+ if (c != 0 || (zz[13] == PExt13 && Nat.Gte(14, zz, PExt)))
+ {
+ if (Nat.AddTo(PExtInv.Length, PExtInv, zz) != 0)
+ {
+ Nat.IncAt(14, zz, PExtInv.Length);
+ }
+ }
+ }
+
public static void Negate(uint[] x, uint[] z)
{
if (Nat224.IsZero(x))
diff --git a/crypto/src/math/ec/custom/sec/SecP256K1Field.cs b/crypto/src/math/ec/custom/sec/SecP256K1Field.cs
index 42564fd4f..ba3a070a9 100644
--- a/crypto/src/math/ec/custom/sec/SecP256K1Field.cs
+++ b/crypto/src/math/ec/custom/sec/SecP256K1Field.cs
@@ -77,6 +77,18 @@ namespace Org.BouncyCastle.Math.EC.Custom.Sec
Reduce(tt, z);
}
+ public static void MultiplyAddToExt(uint[] x, uint[] y, uint[] zz)
+ {
+ uint c = Nat256.MulAddTo(x, y, zz);
+ if (c != 0 || (zz[15] == PExt15 && Nat.Gte(16, zz, PExt)))
+ {
+ if (Nat.AddTo(PExtInv.Length, PExtInv, zz) != 0)
+ {
+ Nat.IncAt(16, zz, PExtInv.Length);
+ }
+ }
+ }
+
public static void Negate(uint[] x, uint[] z)
{
if (Nat256.IsZero(x))
diff --git a/crypto/src/math/ec/custom/sec/SecP256R1Field.cs b/crypto/src/math/ec/custom/sec/SecP256R1Field.cs
index 1ae07f341..9ed9dcd41 100644
--- a/crypto/src/math/ec/custom/sec/SecP256R1Field.cs
+++ b/crypto/src/math/ec/custom/sec/SecP256R1Field.cs
@@ -11,8 +11,8 @@ namespace Org.BouncyCastle.Math.EC.Custom.Sec
internal static readonly uint[] PExt = new uint[]{ 0x00000001, 0x00000000, 0x00000000, 0xFFFFFFFE, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFE, 0x00000001, 0xFFFFFFFE, 0x00000001, 0xFFFFFFFE, 0x00000001, 0x00000001, 0xFFFFFFFE,
0x00000002, 0xFFFFFFFE };
- private const uint P7 = 0xFFFFFFFF;
- private const uint PExt15 = 0xFFFFFFFE;
+ internal const uint P7 = 0xFFFFFFFF;
+ internal const uint PExt15 = 0xFFFFFFFE;
public static void Add(uint[] x, uint[] y, uint[] z)
{
@@ -71,6 +71,15 @@ namespace Org.BouncyCastle.Math.EC.Custom.Sec
Reduce(tt, z);
}
+ public static void MultiplyAddToExt(uint[] x, uint[] y, uint[] zz)
+ {
+ uint c = Nat256.MulAddTo(x, y, zz);
+ if (c != 0 || (zz[15] >= PExt15 && Nat.Gte(16, zz, PExt)))
+ {
+ Nat.SubFrom(16, PExt, zz);
+ }
+ }
+
public static void Negate(uint[] x, uint[] z)
{
if (Nat256.IsZero(x))
|