diff --git a/crypto/src/math/raw/Nat.cs b/crypto/src/math/raw/Nat.cs
index 9f2412580..d67de0a5c 100644
--- a/crypto/src/math/raw/Nat.cs
+++ b/crypto/src/math/raw/Nat.cs
@@ -515,32 +515,42 @@ namespace Org.BouncyCastle.Math.Raw
public static uint[] FromBigInteger(int bits, BigInteger x)
{
+ if (bits < 1)
+ throw new ArgumentException();
if (x.SignValue < 0 || x.BitLength > bits)
throw new ArgumentException();
int len = (bits + 31) >> 5;
+ Debug.Assert(len > 0);
uint[] z = Create(len);
- int i = 0;
- while (x.SignValue != 0)
+
+ // NOTE: Use a fixed number of loop iterations
+ z[0] = (uint)x.IntValue;
+ for (int i = 1; i < len; ++i)
{
- z[i++] = (uint)x.IntValue;
x = x.ShiftRight(32);
+ z[i] = (uint)x.IntValue;
}
return z;
}
public static ulong[] FromBigInteger64(int bits, BigInteger x)
{
+ if (bits < 1)
+ throw new ArgumentException();
if (x.SignValue < 0 || x.BitLength > bits)
throw new ArgumentException();
int len = (bits + 63) >> 6;
+ Debug.Assert(len > 0);
ulong[] z = Create64(len);
- int i = 0;
- while (x.SignValue != 0)
+
+ // NOTE: Use a fixed number of loop iterations
+ z[0] = (ulong)x.LongValue;
+ for (int i = 1; i < len; ++i)
{
- z[i++] = (ulong)x.LongValue;
x = x.ShiftRight(64);
+ z[i] = (ulong)x.LongValue;
}
return z;
}
diff --git a/crypto/src/math/raw/Nat128.cs b/crypto/src/math/raw/Nat128.cs
index 7617a9ee9..d336b320a 100644
--- a/crypto/src/math/raw/Nat128.cs
+++ b/crypto/src/math/raw/Nat128.cs
@@ -185,36 +185,6 @@ namespace Org.BouncyCastle.Math.Raw
return true;
}
- public static uint[] FromBigInteger(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 128)
- throw new ArgumentException();
-
- uint[] z = Create();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (uint)x.IntValue;
- x = x.ShiftRight(32);
- }
- return z;
- }
-
- public static ulong[] FromBigInteger64(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 128)
- throw new ArgumentException();
-
- ulong[] z = Create64();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (ulong)x.LongValue;
- x = x.ShiftRight(64);
- }
- return z;
- }
-
public static uint GetBit(uint[] x, int bit)
{
if (bit == 0)
diff --git a/crypto/src/math/raw/Nat160.cs b/crypto/src/math/raw/Nat160.cs
index f5514d7b4..f862700b1 100644
--- a/crypto/src/math/raw/Nat160.cs
+++ b/crypto/src/math/raw/Nat160.cs
@@ -172,21 +172,6 @@ namespace Org.BouncyCastle.Math.Raw
return true;
}
- public static uint[] FromBigInteger(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 160)
- throw new ArgumentException();
-
- uint[] z = Create();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (uint)x.IntValue;
- x = x.ShiftRight(32);
- }
- return z;
- }
-
public static uint GetBit(uint[] x, int bit)
{
if (bit == 0)
diff --git a/crypto/src/math/raw/Nat192.cs b/crypto/src/math/raw/Nat192.cs
index 1311dee04..752290747 100644
--- a/crypto/src/math/raw/Nat192.cs
+++ b/crypto/src/math/raw/Nat192.cs
@@ -225,36 +225,6 @@ namespace Org.BouncyCastle.Math.Raw
return true;
}
- public static uint[] FromBigInteger(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 192)
- throw new ArgumentException();
-
- uint[] z = Create();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (uint)x.IntValue;
- x = x.ShiftRight(32);
- }
- return z;
- }
-
- public static ulong[] FromBigInteger64(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 192)
- throw new ArgumentException();
-
- ulong[] z = Create64();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (ulong)x.LongValue;
- x = x.ShiftRight(64);
- }
- return z;
- }
-
public static uint GetBit(uint[] x, int bit)
{
if (bit == 0)
diff --git a/crypto/src/math/raw/Nat224.cs b/crypto/src/math/raw/Nat224.cs
index 565abcb9c..1aabd3f17 100644
--- a/crypto/src/math/raw/Nat224.cs
+++ b/crypto/src/math/raw/Nat224.cs
@@ -261,21 +261,6 @@ namespace Org.BouncyCastle.Math.Raw
return true;
}
- public static uint[] FromBigInteger(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 224)
- throw new ArgumentException();
-
- uint[] z = Create();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (uint)x.IntValue;
- x = x.ShiftRight(32);
- }
- return z;
- }
-
public static uint GetBit(uint[] x, int bit)
{
if (bit == 0)
diff --git a/crypto/src/math/raw/Nat256.cs b/crypto/src/math/raw/Nat256.cs
index 5c473c405..710060bee 100644
--- a/crypto/src/math/raw/Nat256.cs
+++ b/crypto/src/math/raw/Nat256.cs
@@ -323,36 +323,6 @@ namespace Org.BouncyCastle.Math.Raw
return true;
}
- public static uint[] FromBigInteger(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 256)
- throw new ArgumentException();
-
- uint[] z = Create();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (uint)x.IntValue;
- x = x.ShiftRight(32);
- }
- return z;
- }
-
- public static ulong[] FromBigInteger64(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 256)
- throw new ArgumentException();
-
- ulong[] z = Create64();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (ulong)x.LongValue;
- x = x.ShiftRight(64);
- }
- return z;
- }
-
public static uint GetBit(uint[] x, int bit)
{
if (bit == 0)
diff --git a/crypto/src/math/raw/Nat320.cs b/crypto/src/math/raw/Nat320.cs
index 0ad677db4..0b250aa77 100644
--- a/crypto/src/math/raw/Nat320.cs
+++ b/crypto/src/math/raw/Nat320.cs
@@ -47,21 +47,6 @@ namespace Org.BouncyCastle.Math.Raw
return true;
}
- public static ulong[] FromBigInteger64(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 320)
- throw new ArgumentException();
-
- ulong[] z = Create64();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (ulong)x.LongValue;
- x = x.ShiftRight(64);
- }
- return z;
- }
-
public static bool IsOne64(ulong[] x)
{
if (x[0] != 1UL)
diff --git a/crypto/src/math/raw/Nat448.cs b/crypto/src/math/raw/Nat448.cs
index b0774b37a..8c7f3244d 100644
--- a/crypto/src/math/raw/Nat448.cs
+++ b/crypto/src/math/raw/Nat448.cs
@@ -51,21 +51,6 @@ namespace Org.BouncyCastle.Math.Raw
return true;
}
- public static ulong[] FromBigInteger64(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 448)
- throw new ArgumentException();
-
- ulong[] z = Create64();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (ulong)x.LongValue;
- x = x.ShiftRight(64);
- }
- return z;
- }
-
public static bool IsOne64(ulong[] x)
{
if (x[0] != 1UL)
diff --git a/crypto/src/math/raw/Nat576.cs b/crypto/src/math/raw/Nat576.cs
index 14279b61a..174d52bcf 100644
--- a/crypto/src/math/raw/Nat576.cs
+++ b/crypto/src/math/raw/Nat576.cs
@@ -55,21 +55,6 @@ namespace Org.BouncyCastle.Math.Raw
return true;
}
- public static ulong[] FromBigInteger64(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 576)
- throw new ArgumentException();
-
- ulong[] z = Create64();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (ulong)x.LongValue;
- x = x.ShiftRight(64);
- }
- return z;
- }
-
public static bool IsOne64(ulong[] x)
{
if (x[0] != 1UL)
|