diff --git a/crypto/src/math/ec/rfc7748/X25519Field.cs b/crypto/src/math/ec/rfc7748/X25519Field.cs
index b5938e2e7..3a06941dd 100644
--- a/crypto/src/math/ec/rfc7748/X25519Field.cs
+++ b/crypto/src/math/ec/rfc7748/X25519Field.cs
@@ -14,7 +14,7 @@ namespace Org.BouncyCastle.Math.EC.Rfc7748
private static readonly int[] RootNegOne = { 0x020EA0B0, 0x0386C9D2, 0x00478C4E, 0x0035697F, 0x005E8630,
0x01FBD7A7, 0x0340264F, 0x01F0B2B4, 0x00027E0E, 0x00570649 };
- private X25519Field() {}
+ protected X25519Field() {}
public static void Add(int[] x, int[] y, int[] z)
{
@@ -67,6 +67,18 @@ namespace Org.BouncyCastle.Math.EC.Rfc7748
z[5] = z5; z[6] = z6; z[7] = z7; z[8] = z8; z[9] = z9;
}
+ public static void CMov(int cond, int[] x, int xOff, int[] z, int zOff)
+ {
+ Debug.Assert(0 == cond || -1 == cond);
+
+ for (int i = 0; i < Size; ++i)
+ {
+ int z_i = z[zOff + i], diff = z_i ^ x[xOff + i];
+ z_i ^= (diff & cond);
+ z[zOff + i] = z_i;
+ }
+ }
+
public static void CNegate(int negate, int[] z)
{
Debug.Assert(negate >> 1 == 0);
diff --git a/crypto/src/math/ec/rfc7748/X448Field.cs b/crypto/src/math/ec/rfc7748/X448Field.cs
index 7cda6ebcc..f1e89e520 100644
--- a/crypto/src/math/ec/rfc7748/X448Field.cs
+++ b/crypto/src/math/ec/rfc7748/X448Field.cs
@@ -1,8 +1,6 @@
using System;
using System.Diagnostics;
-using Org.BouncyCastle.Math.Raw;
-
namespace Org.BouncyCastle.Math.EC.Rfc7748
{
[CLSCompliantAttribute(false)]
@@ -12,7 +10,7 @@ namespace Org.BouncyCastle.Math.EC.Rfc7748
private const uint M28 = 0x0FFFFFFFU;
- private X448Field() {}
+ protected X448Field() {}
public static void Add(uint[] x, uint[] y, uint[] z)
{
@@ -74,6 +72,20 @@ namespace Org.BouncyCastle.Math.EC.Rfc7748
z[8] = z8; z[9] = z9; z[10] = z10; z[11] = z11; z[12] = z12; z[13] = z13; z[14] = z14; z[15] = z15;
}
+ public static void CMov(int cond, uint[] x, int xOff, uint[] z, int zOff)
+ {
+ Debug.Assert(0 == cond || -1 == cond);
+
+ uint MASK = (uint)cond;
+
+ for (int i = 0; i < Size; ++i)
+ {
+ uint z_i = z[zOff + i], diff = z_i ^ x[xOff + i];
+ z_i ^= (diff & MASK);
+ z[zOff + i] = z_i;
+ }
+ }
+
public static void CNegate(int negate, uint[] z)
{
Debug.Assert(negate >> 1 == 0);
@@ -81,7 +93,7 @@ namespace Org.BouncyCastle.Math.EC.Rfc7748
uint[] t = Create();
Sub(t, z, t);
- Nat.CMov(Size, negate, t, 0, z, 0);
+ CMov(-negate, t, 0, z, 0);
}
public static void Copy(uint[] x, int xOff, uint[] z, int zOff)
|