summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2022-11-13 21:23:57 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2022-11-13 21:23:57 +0700
commit1b668ed4c25ce3214945524b87e00b9dad3e0ce0 (patch)
tree8d01238c75e23f51ab90783884f2e1bce7e0f2a2
parentRunAnalyzersDuringBuild = false (diff)
downloadBouncyCastle.NET-ed25519-1b668ed4c25ce3214945524b87e00b9dad3e0ce0.tar.xz
BigInteger changed to use uint[] internally
-rw-r--r--crypto/src/math/BigInteger.cs1036
1 files changed, 420 insertions, 616 deletions
diff --git a/crypto/src/math/BigInteger.cs b/crypto/src/math/BigInteger.cs
index 44d6ee20a..c8581775d 100644
--- a/crypto/src/math/BigInteger.cs
+++ b/crypto/src/math/BigInteger.cs
@@ -130,7 +130,7 @@ namespace Org.BouncyCastle.Math
         private const long IMASK = 0xFFFFFFFFL;
         private const ulong UIMASK = 0xFFFFFFFFUL;
 
-        private static readonly int[] ZeroMagnitude = new int[0];
+        private static readonly uint[] ZeroMagnitude = new uint[0];
         private static readonly byte[] ZeroEncoding = new byte[0];
 
         private static readonly BigInteger[] SMALL_CONSTANTS = new BigInteger[17];
@@ -221,8 +221,8 @@ namespace Org.BouncyCastle.Math
             }
         }
 
-        private int[] magnitude; // array of ints with [0] being the most significant
-        private int sign; // -1 means -ve; +1 means +ve; 0 means 0;
+        private readonly uint[] magnitude; // array of uints with [0] being the most significant
+        private readonly int sign; // -1 means -ve; +1 means +ve; 0 means 0;
 
         [NonSerialized]
         private int nBits = -1; // cache BitCount() value
@@ -253,56 +253,49 @@ namespace Org.BouncyCastle.Math
             return new BigInteger(sizeInBits, SecureRandom.ArbitraryRandom);
         }
 
-        private BigInteger(
-            int		signum,
-            int[]	mag,
-            bool	checkMag)
+        private BigInteger(int signum, uint[] mag, bool checkMag)
         {
-            if (checkMag)
+            if (!checkMag)
             {
-                int i = 0;
-                while (i < mag.Length && mag[i] == 0)
-                {
-                    ++i;
-                }
+                this.sign = signum;
+                this.magnitude = mag;
+                return;
+            }
 
-                if (i == mag.Length)
-                {
-                    this.sign = 0;
-                    this.magnitude = ZeroMagnitude;
-                }
-                else
-                {
-                    this.sign = signum;
+            int i = 0;
+            while (i < mag.Length && mag[i] == 0)
+            {
+                ++i;
+            }
 
-                    if (i == 0)
-                    {
-                        this.magnitude = mag;
-                    }
-                    else
-                    {
-                        // strip leading 0 words
-                        this.magnitude = new int[mag.Length - i];
-                        Array.Copy(mag, i, this.magnitude, 0, this.magnitude.Length);
-                    }
-                }
+            if (i == mag.Length)
+            {
+                this.sign = 0;
+                this.magnitude = ZeroMagnitude;
             }
             else
             {
                 this.sign = signum;
-                this.magnitude = mag;
+
+                if (i == 0)
+                {
+                    this.magnitude = mag;
+                }
+                else
+                {
+                    // strip leading 0 words
+                    this.magnitude = new uint[mag.Length - i];
+                    Array.Copy(mag, i, this.magnitude, 0, this.magnitude.Length);
+                }
             }
         }
 
-        public BigInteger(
-            string value)
+        public BigInteger(string value)
             : this(value, 10)
         {
         }
 
-        public BigInteger(
-            string	str,
-            int		radix)
+        public BigInteger(string str, int radix)
         {
             if (str.Length == 0)
                 throw new FormatException("Zero length BigInteger");
@@ -314,36 +307,36 @@ namespace Org.BouncyCastle.Math
 
             switch (radix)
             {
-                case 2:
-                    // Is there anyway to restrict to binary digits?
-                    style = NumberStyles.Integer;
-                    chunk = chunk2;
-                    r = radix2;
-                    rE = radix2E;
-                    break;
-                case 8:
-                    // Is there anyway to restrict to octal digits?
-                    style = NumberStyles.Integer;
-                    chunk = chunk8;
-                    r = radix8;
-                    rE = radix8E;
-                    break;
-                case 10:
-                    // This style seems to handle spaces and minus sign already (our processing redundant?)
-                    style = NumberStyles.Integer;
-                    chunk = chunk10;
-                    r = radix10;
-                    rE = radix10E;
-                    break;
-                case 16:
-                    // TODO Should this be HexNumber?
-                    style = NumberStyles.AllowHexSpecifier;
-                    chunk = chunk16;
-                    r = radix16;
-                    rE = radix16E;
-                    break;
-                default:
-                    throw new FormatException("Only bases 2, 8, 10, or 16 allowed");
+            case 2:
+                // Is there anyway to restrict to binary digits?
+                style = NumberStyles.Integer;
+                chunk = chunk2;
+                r = radix2;
+                rE = radix2E;
+                break;
+            case 8:
+                // Is there anyway to restrict to octal digits?
+                style = NumberStyles.Integer;
+                chunk = chunk8;
+                r = radix8;
+                rE = radix8E;
+                break;
+            case 10:
+                // This style seems to handle spaces and minus sign already (our processing redundant?)
+                style = NumberStyles.Integer;
+                chunk = chunk10;
+                r = radix10;
+                rE = radix10E;
+                break;
+            case 16:
+                // TODO Should this be HexNumber?
+                style = NumberStyles.AllowHexSpecifier;
+                chunk = chunk16;
+                r = radix16;
+                rE = radix16E;
+                break;
+            default:
+                throw new FormatException("Only bases 2, 8, 10, or 16 allowed");
             }
 
 
@@ -394,28 +387,28 @@ namespace Org.BouncyCastle.Math
 
                     switch (radix)
                     {
-                        case 2:
-                            // TODO Need this because we are parsing in radix 10 above
-                            if (i >= 2)
-                                throw new FormatException("Bad character in radix 2 string: " + s);
-
-                            // TODO Parse 64 bits at a time
-                            b = b.ShiftLeft(1);
-                            break;
-                        case 8:
-                            // TODO Need this because we are parsing in radix 10 above
-                            if (i >= 8)
-                                throw new FormatException("Bad character in radix 8 string: " + s);
-
-                            // TODO Parse 63 bits at a time
-                            b = b.ShiftLeft(3);
-                            break;
-                        case 16:
-                            b = b.ShiftLeft(64);
-                            break;
-                        default:
-                            b = b.Multiply(rE);
-                            break;
+                    case 2:
+                        // TODO Need this because we are parsing in radix 10 above
+                        if (i >= 2)
+                            throw new FormatException("Bad character in radix 2 string: " + s);
+
+                        // TODO Parse 64 bits at a time
+                        b = b.ShiftLeft(1);
+                        break;
+                    case 8:
+                        // TODO Need this because we are parsing in radix 10 above
+                        if (i >= 8)
+                            throw new FormatException("Bad character in radix 8 string: " + s);
+
+                        // TODO Parse 63 bits at a time
+                        b = b.ShiftLeft(3);
+                        break;
+                    case 16:
+                        b = b.ShiftLeft(64);
+                        break;
+                    default:
+                        b = b.Multiply(rE);
+                        break;
                     }
 
                     b = b.Add(bi);
@@ -481,81 +474,75 @@ namespace Org.BouncyCastle.Math
             magnitude = b.magnitude;
         }
 
-        public BigInteger(
-            byte[] bytes)
+        public BigInteger(byte[] bytes)
             : this(bytes, 0, bytes.Length)
         {
         }
 
-        public BigInteger(
-            byte[]	bytes,
-            int		offset,
-            int		length)
+        public BigInteger(byte[] bytes, int offset, int length)
         {
             if (length == 0)
                 throw new FormatException("Zero length BigInteger");
 
             // TODO Move this processing into MakeMagnitude (provide sign argument)
-            if ((sbyte)bytes[offset] < 0)
+            if ((sbyte)bytes[offset] >= 0)
             {
-                this.sign = -1;
+                // strip leading zero bytes and return magnitude bytes
+                this.magnitude = MakeMagnitude(bytes, offset, length);
+                this.sign = this.magnitude.Length > 0 ? 1 : 0;
+                return;
+            }
 
-                int end = offset + length;
+            this.sign = -1;
 
-                int iBval;
-                // strip leading sign bytes
-                for (iBval = offset; iBval < end && ((sbyte)bytes[iBval] == -1); iBval++)
-                {
-                }
+            int end = offset + length;
 
-                if (iBval >= end)
-                {
-                    this.magnitude = One.magnitude;
-                }
-                else
-                {
-                    int numBytes = end - iBval;
+            int iBval;
+            // strip leading sign bytes
+            for (iBval = offset; iBval < end && ((sbyte)bytes[iBval] == -1); iBval++)
+            {
+            }
+
+            if (iBval >= end)
+            {
+                this.magnitude = One.magnitude;
+                return;
+            }
+
+            int numBytes = end - iBval;
 
 #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER
-                    Span<byte> inverse = numBytes <= 512
-                        ? stackalloc byte[numBytes]
-                        : new byte[numBytes];
+            Span<byte> inverse = numBytes <= 512
+                ? stackalloc byte[numBytes]
+                : new byte[numBytes];
 #else
-                    byte[] inverse = new byte[numBytes];
+            byte[] inverse = new byte[numBytes];
 #endif
 
-                    int index = 0;
-                    while (index < numBytes)
-                    {
-                        inverse[index++] = (byte)~bytes[iBval++];
-                    }
-
-                    Debug.Assert(iBval == end);
-
-                    while (inverse[--index] == byte.MaxValue)
-                    {
-                        inverse[index] = byte.MinValue;
-                    }
+            int index = 0;
+            while (index < numBytes)
+            {
+                inverse[index++] = (byte)~bytes[iBval++];
+            }
 
-                    inverse[index]++;
+            Debug.Assert(iBval == end);
 
-                    this.magnitude = MakeMagnitude(inverse);
-                }
-            }
-            else
+            while (inverse[--index] == byte.MaxValue)
             {
-                // strip leading zero bytes and return magnitude bytes
-                this.magnitude = MakeMagnitude(bytes, offset, length);
-                this.sign = this.magnitude.Length > 0 ? 1 : 0;
+                inverse[index] = byte.MinValue;
             }
+
+            inverse[index]++;
+
+            this.magnitude = MakeMagnitude(inverse);
         }
 
-        private static int[] MakeMagnitude(byte[] bytes)
+        private static uint[] MakeMagnitude(byte[] bytes)
         {
             return MakeMagnitude(bytes, 0, bytes.Length);
         }
 
-        private static int[] MakeMagnitude(byte[] bytes, int offset, int length)
+        private static uint[] MakeMagnitude(byte[] bytes, int offset, int length)
         {
 #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER
             return MakeMagnitude(bytes.AsSpan(offset, length));
@@ -581,21 +568,21 @@ namespace Org.BouncyCastle.Math
             if (nInts < 1)
                 return ZeroMagnitude;
 
-            int[] mag = new int[nInts];
+            uint[] mag = new uint[nInts];
 
-            int v = 0;
+            uint v = 0U;
             int magnitudeIndex = 0;
             for (int i = firstSignificant; i < end; ++i)
             {
                 v <<= 8;
-                v |= bytes[i] & 0xff;
+                v |= bytes[i];
                 bCount--;
                 if (bCount <= 0)
                 {
                     mag[magnitudeIndex] = v;
                     magnitudeIndex++;
                     bCount = BytesPerInt;
-                    v = 0;
+                    v = 0U;
                 }
             }
 
@@ -609,7 +596,7 @@ namespace Org.BouncyCastle.Math
         }
 
 #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER
-        private static int[] MakeMagnitude(ReadOnlySpan<byte> bytes)
+        private static uint[] MakeMagnitude(ReadOnlySpan<byte> bytes)
         {
             int end = bytes.Length;
 
@@ -632,21 +619,21 @@ namespace Org.BouncyCastle.Math
             if (nInts < 1)
                 return ZeroMagnitude;
 
-            int[] mag = new int[nInts];
+            uint[] mag = new uint[nInts];
 
-            int v = 0;
+            uint v = 0;
             int magnitudeIndex = 0;
             for (int i = firstSignificant; i < end; ++i)
             {
                 v <<= 8;
-                v |= bytes[i] & 0xff;
+                v |= bytes[i];
                 bCount--;
                 if (bCount <= 0)
                 {
                     mag[magnitudeIndex] = v;
                     magnitudeIndex++;
                     bCount = BytesPerInt;
-                    v = 0;
+                    v = 0U;
                 }
             }
 
@@ -702,9 +689,7 @@ namespace Org.BouncyCastle.Math
         }
 #endif
 
-        public BigInteger(
-            int		sizeInBits,
-            Random	random)
+        public BigInteger(int sizeInBits, Random random)
         {
             if (sizeInBits < 0)
                 throw new ArgumentException("sizeInBits must be non-negative");
@@ -738,10 +723,7 @@ namespace Org.BouncyCastle.Math
             this.sign = this.magnitude.Length < 1 ? 0 : 1;
         }
 
-        public BigInteger(
-            int		bitLength,
-            int		certainty,
-            Random	random)
+        public BigInteger(int bitLength, int certainty, Random random)
         {
             if (bitLength < 2)
                 throw new ArithmeticException("bitLength < 2");
@@ -795,7 +777,7 @@ namespace Org.BouncyCastle.Math
 
                 for (int j = 1; j < (magnitude.Length - 1); ++j)
                 {
-                    this.magnitude[j] ^= random.Next();
+                    this.magnitude[j] ^= (uint)random.Next();
 
                     if (CheckProbablePrime(certainty, random, true))
                         return;
@@ -811,24 +793,22 @@ namespace Org.BouncyCastle.Math
         /**
          * return a = a + b - b preserved.
          */
-        private static int[] AddMagnitudes(
-            int[] a,
-            int[] b)
+        private static uint[] AddMagnitudes(uint[] a, uint[] b)
         {
             int tI = a.Length - 1;
             int vI = b.Length - 1;
-            long m = 0;
+            ulong m = 0;
 
             while (vI >= 0)
             {
-                m += ((long)(uint)a[tI] + (long)(uint)b[vI--]);
-                a[tI--] = (int)m;
-                m = (long)((ulong)m >> 32);
+                m += (ulong)a[tI] + b[vI--];
+                a[tI--] = (uint)m;
+                m >>= 32;
             }
 
             if (m != 0)
             {
-                while (tI >= 0 && ++a[tI--] == 0)
+                while (tI >= 0 && ++a[tI--] == uint.MinValue)
                 {
                 }
             }
@@ -836,30 +816,26 @@ namespace Org.BouncyCastle.Math
             return a;
         }
 
-        public BigInteger Add(
-            BigInteger value)
+        public BigInteger Add(BigInteger value)
         {
             if (this.sign == 0)
                 return value;
 
-            if (this.sign != value.sign)
-            {
-                if (value.sign == 0)
-                    return this;
+            if (this.sign == value.sign)
+                return AddToMagnitude(value.magnitude);
 
-                if (value.sign < 0)
-                    return Subtract(value.Negate());
+            if (value.sign == 0)
+                return this;
 
-                return value.Subtract(Negate());
-            }
+            if (value.sign < 0)
+                return Subtract(value.Negate());
 
-            return AddToMagnitude(value.magnitude);
+            return value.Subtract(Negate());
         }
 
-        private BigInteger AddToMagnitude(
-            int[] magToAdd)
+        private BigInteger AddToMagnitude(uint[] magToAdd)
         {
-            int[] big, small;
+            uint[] big, small;
             if (this.magnitude.Length < magToAdd.Length)
             {
                 big = magToAdd;
@@ -874,19 +850,21 @@ namespace Org.BouncyCastle.Math
             // Conservatively avoid over-allocation when no overflow possible
             uint limit = uint.MaxValue;
             if (big.Length == small.Length)
-                limit -= (uint) small[0];
+            {
+                limit -= small[0];
+            }
 
-            bool possibleOverflow = (uint) big[0] >= limit;
+            bool possibleOverflow = big[0] >= limit;
 
-            int[] bigCopy;
+            uint[] bigCopy;
             if (possibleOverflow)
             {
-                bigCopy = new int[big.Length + 1];
+                bigCopy = new uint[big.Length + 1];
                 big.CopyTo(bigCopy, 1);
             }
             else
             {
-                bigCopy = (int[]) big.Clone();
+                bigCopy = (uint[])big.Clone();
             }
 
             bigCopy = AddMagnitudes(bigCopy, small);
@@ -894,33 +872,25 @@ namespace Org.BouncyCastle.Math
             return new BigInteger(this.sign, bigCopy, possibleOverflow);
         }
 
-        public BigInteger And(
-            BigInteger value)
+        public BigInteger And(BigInteger value)
         {
             if (this.sign == 0 || value.sign == 0)
-            {
                 return Zero;
-            }
-
-            int[] aMag = this.sign > 0
-                ? this.magnitude
-                : Add(One).magnitude;
 
-            int[] bMag = value.sign > 0
-                ? value.magnitude
-                : value.Add(One).magnitude;
+            uint[] aMag = this.sign > 0 ? this.magnitude : Add(One).magnitude;
+            uint[] bMag = value.sign > 0 ? value.magnitude : value.Add(One).magnitude;
 
             bool resultNeg = sign < 0 && value.sign < 0;
             int resultLength = System.Math.Max(aMag.Length, bMag.Length);
-            int[] resultMag = new int[resultLength];
+            uint[] resultMag = new uint[resultLength];
 
             int aStart = resultMag.Length - aMag.Length;
             int bStart = resultMag.Length - bMag.Length;
 
             for (int i = 0; i < resultMag.Length; ++i)
             {
-                int aWord = i >= aStart ? aMag[i - aStart] : 0;
-                int bWord = i >= bStart ? bMag[i - bStart] : 0;
+                uint aWord = i >= aStart ? aMag[i - aStart] : 0U;
+                uint bWord = i >= bStart ? bMag[i - bStart] : 0U;
 
                 if (this.sign < 0)
                 {
@@ -951,8 +921,7 @@ namespace Org.BouncyCastle.Math
             return result;
         }
 
-        public BigInteger AndNot(
-            BigInteger val)
+        public BigInteger AndNot(BigInteger val)
         {
             return And(val.Not());
         }
@@ -983,12 +952,11 @@ namespace Org.BouncyCastle.Math
             }
         }
 
-        public static int BitCnt(int i)
+        internal static int BitCnt(uint u)
         {
 #if NETCOREAPP3_0_OR_GREATER
-            return BitOperations.PopCount((uint)i);
+            return BitOperations.PopCount(u);
 #else
-            uint u = (uint)i;
             u = u - ((u >> 1) & 0x55555555);
             u = (u & 0x33333333) + ((u >> 2) & 0x33333333);
             u = (u + (u >> 4)) & 0x0f0f0f0f;
@@ -999,14 +967,14 @@ namespace Org.BouncyCastle.Math
 #endif
         }
 
-        private static int CalcBitLength(int sign, int indx, int[]	mag)
+        private static int CalcBitLength(int sign, int indx, uint[]	mag)
         {
             for (;;)
             {
                 if (indx >= mag.Length)
                     return 0;
 
-                if (mag[indx] != 0)
+                if (mag[indx] != 0U)
                     break;
 
                 ++indx;
@@ -1016,7 +984,7 @@ namespace Org.BouncyCastle.Math
             int bitLength = 32 * ((mag.Length - indx) - 1);
 
             // and determine bitlength of first int
-            int firstMag = mag[indx];
+            uint firstMag = mag[indx];
             bitLength += BitLen(firstMag);
 
             // Check for negative powers of two
@@ -1030,7 +998,7 @@ namespace Org.BouncyCastle.Math
                         break;
                     }
                 }
-                while (mag[indx] == 0);
+                while (mag[indx] == 0U);
             }
 
             return bitLength;
@@ -1060,12 +1028,11 @@ namespace Org.BouncyCastle.Math
 #endif
         }
 
-        private static int BitLen(int w)
+        private static int BitLen(uint v)
         {
 #if NETCOREAPP3_0_OR_GREATER
-            return 32 - BitOperations.LeadingZeroCount((uint)w);
+            return 32 - BitOperations.LeadingZeroCount(v);
 #else
-            uint v = (uint)w;
             uint t = v >> 24;
             if (t != 0)
                 return 24 + BitLengthTable[t];
@@ -1102,18 +1069,14 @@ namespace Org.BouncyCastle.Math
          * unsigned comparison on two arrays - note the arrays may
          * start with leading zeros.
          */
-        private static int CompareTo(
-            int		xIndx,
-            int[]	x,
-            int		yIndx,
-            int[]	y)
+        private static int CompareTo(int xIndx, uint[] x, int yIndx, uint[] y)
         {
-            while (xIndx != x.Length && x[xIndx] == 0)
+            while (xIndx != x.Length && x[xIndx] == 0U)
             {
                 xIndx++;
             }
 
-            while (yIndx != y.Length && y[yIndx] == 0)
+            while (yIndx != y.Length && y[yIndx] == 0U)
             {
                 yIndx++;
             }
@@ -1121,25 +1084,19 @@ namespace Org.BouncyCastle.Math
             return CompareNoLeadingZeroes(xIndx, x, yIndx, y);
         }
 
-        private static int CompareNoLeadingZeroes(
-            int		xIndx,
-            int[]	x,
-            int		yIndx,
-            int[]	y)
+        private static int CompareNoLeadingZeroes(int xIndx, uint[] x, int yIndx, uint[] y)
         {
             int diff = (x.Length - y.Length) - (xIndx - yIndx);
 
             if (diff != 0)
-            {
                 return diff < 0 ? -1 : 1;
-            }
 
             // lengths of magnitudes the same, test the magnitude values
 
             while (xIndx < x.Length)
             {
-                uint v1 = (uint)x[xIndx++];
-                uint v2 = (uint)y[yIndx++];
+                uint v1 = x[xIndx++];
+                uint v2 = y[yIndx++];
 
                 if (v1 != v2)
                     return v1 < v2 ? -1 : 1;
@@ -1152,18 +1109,16 @@ namespace Org.BouncyCastle.Math
          * return z = x / y - done in place (z value preserved, x contains the
          * remainder)
          */
-        private int[] Divide(
-            int[]	x,
-            int[]	y)
+        private uint[] Divide(uint[] x, uint[] y)
         {
             int xStart = 0;
-            while (xStart < x.Length && x[xStart] == 0)
+            while (xStart < x.Length && x[xStart] == 0U)
             {
                 ++xStart;
             }
 
             int yStart = 0;
-            while (yStart < y.Length && y[yStart] == 0)
+            while (yStart < y.Length && y[yStart] == 0U)
             {
                 ++yStart;
             }
@@ -1171,7 +1126,7 @@ namespace Org.BouncyCastle.Math
             Debug.Assert(yStart < y.Length);
 
             int xyCmp = CompareNoLeadingZeroes(xStart, x, yStart, y);
-            int[] count;
+            uint[] count;
 
             if (xyCmp > 0)
             {
@@ -1179,31 +1134,30 @@ namespace Org.BouncyCastle.Math
                 int xBitLength = CalcBitLength(1, xStart, x);
                 int shift = xBitLength - yBitLength;
 
-                int[] iCount;
+                uint[] iCount;
                 int iCountStart = 0;
 
-                int[] c;
+                uint[] c;
                 int cStart = 0;
                 int cBitLength = yBitLength;
                 if (shift > 0)
                 {
-//					iCount = ShiftLeft(One.magnitude, shift);
-                    iCount = new int[(shift >> 5) + 1];
-                    iCount[0] = 1 << (shift % 32);
+                    iCount = new uint[(shift >> 5) + 1];
+                    iCount[0] = 1U << (shift % 32);
 
                     c = ShiftLeft(y, shift);
                     cBitLength += shift;
                 }
                 else
                 {
-                    iCount = new int[] { 1 };
+                    iCount = new uint[1]{ 1U };
 
                     int len = y.Length - yStart;
-                    c = new int[len];
+                    c = new uint[len];
                     Array.Copy(y, yStart, c, 0, len);
                 }
 
-                count = new int[iCount.Length];
+                count = new uint[iCount.Length];
 
                 for (;;)
                 {
@@ -1213,13 +1167,12 @@ namespace Org.BouncyCastle.Math
                         Subtract(xStart, x, cStart, c);
                         AddMagnitudes(count, iCount);
 
-                        while (x[xStart] == 0)
+                        while (x[xStart] == 0U)
                         {
                             if (++xStart == x.Length)
                                 return count;
                         }
 
-                        //xBitLength = CalcBitLength(xStart, x);
                         xBitLength = 32 * (x.Length - xStart - 1) + BitLen(x[xStart]);
 
                         if (xBitLength <= yBitLength)
@@ -1239,10 +1192,12 @@ namespace Org.BouncyCastle.Math
                     // NB: The case where c[cStart] is 1-bit is harmless
                     if (shift == 1)
                     {
-                        uint firstC = (uint) c[cStart] >> 1;
-                        uint firstX = (uint) x[xStart];
+                        uint firstC = c[cStart] >> 1;
+                        uint firstX = x[xStart];
                         if (firstC > firstX)
+                        {
                             ++shift;
+                        }
                     }
 
                     if (shift < 2)
@@ -1258,7 +1213,6 @@ namespace Org.BouncyCastle.Math
                         ShiftRightInPlace(iCountStart, iCount, shift);
                     }
 
-                    //cStart = c.Length - ((cBitLength + 31) / 32);
                     while (c[cStart] == 0)
                     {
                         ++cStart;
@@ -1272,7 +1226,7 @@ namespace Org.BouncyCastle.Math
             }
             else
             {
-                count = new int[1];
+                count = new uint[1];
             }
 
             if (xyCmp == 0)
@@ -1284,8 +1238,7 @@ namespace Org.BouncyCastle.Math
             return count;
         }
 
-        public BigInteger Divide(
-            BigInteger val)
+        public BigInteger Divide(BigInteger val)
         {
             if (val.sign == 0)
                 throw new ArithmeticException("Division by zero error");
@@ -1299,13 +1252,12 @@ namespace Org.BouncyCastle.Math
                 return val.sign == this.sign ? result : result.Negate();
             }
 
-            int[] mag = (int[]) this.magnitude.Clone();
+            uint[] mag = (uint[])this.magnitude.Clone();
 
             return new BigInteger(this.sign * val.sign, Divide(mag, val.magnitude), true);
         }
 
-        public BigInteger[] DivideAndRemainder(
-            BigInteger val)
+        public BigInteger[] DivideAndRemainder(BigInteger val)
         {
             if (val.sign == 0)
                 throw new ArithmeticException("Division by zero error");
@@ -1321,15 +1273,15 @@ namespace Org.BouncyCastle.Math
             {
                 int e = val.Abs().BitLength - 1;
                 BigInteger quotient = this.Abs().ShiftRight(e);
-                int[] remainder = this.LastNBits(e);
+                uint[] remainder = this.LastNBits(e);
 
                 biggies[0] = val.sign == this.sign ? quotient : quotient.Negate();
                 biggies[1] = new BigInteger(this.sign, remainder, true);
             }
             else
             {
-                int[] remainder = (int[]) this.magnitude.Clone();
-                int[] quotient = Divide(remainder, val.magnitude);
+                uint[] remainder = (uint[])this.magnitude.Clone();
+                uint[] quotient = Divide(remainder, val.magnitude);
 
                 biggies[0] = new BigInteger(this.sign * val.sign, quotient, true);
                 biggies[1] = new BigInteger(this.sign, remainder, true);
@@ -1360,7 +1312,6 @@ namespace Org.BouncyCastle.Math
 
         private bool IsEqualMagnitude(BigInteger x)
         {
-            int[] xMag = x.magnitude;
             if (magnitude.Length != x.magnitude.Length)
                 return false;
             for (int i = 0; i < magnitude.Length; i++)
@@ -1371,8 +1322,7 @@ namespace Org.BouncyCastle.Math
             return true;
         }
 
-        public BigInteger Gcd(
-            BigInteger value)
+        public BigInteger Gcd(BigInteger value)
         {
             if (value.sign == 0)
                 return Abs();
@@ -1399,11 +1349,11 @@ namespace Org.BouncyCastle.Math
             int hc = magnitude.Length;
             if (magnitude.Length > 0)
             {
-                hc ^= magnitude[0];
+                hc ^= (int)magnitude[0];
 
                 if (magnitude.Length > 1)
                 {
-                    hc ^= magnitude[magnitude.Length - 1];
+                    hc ^= (int)magnitude[magnitude.Length - 1];
                 }
             }
 
@@ -1417,7 +1367,7 @@ namespace Org.BouncyCastle.Math
                 return One;
 
             if (this.sign < 0)
-                return new BigInteger(-1, doSubBigLil(this.magnitude, One.magnitude), true);
+                return new BigInteger(-1, DoSubBigLil(this.magnitude, One.magnitude), true);
 
             return AddToMagnitude(One.magnitude);
         }
@@ -1431,7 +1381,7 @@ namespace Org.BouncyCastle.Math
 
                 int n = magnitude.Length;
 
-                int v = magnitude[n - 1];
+                int v = (int)magnitude[n - 1];
 
                 return sign < 0 ? -v : v;
             }
@@ -1555,7 +1505,7 @@ namespace Org.BouncyCastle.Math
 
             // let n = 1 + d . 2^s
             BigInteger n = this;
-            int s = n.GetLowestSetBitMaskFirst(-1 << 1);
+            int s = n.GetLowestSetBitMaskFirst(uint.MaxValue << 1);
             Debug.Assert(s >= 1);
             BigInteger r = n.ShiftRight(s);
 
@@ -1596,95 +1546,6 @@ namespace Org.BouncyCastle.Math
             return true;
         }
 
-//		private bool SolovayStrassenTest(
-//			int		certainty,
-//			Random	random)
-//		{
-//			Debug.Assert(certainty > 0);
-//			Debug.Assert(CompareTo(Two) > 0);
-//			Debug.Assert(TestBit(0));
-//
-//			BigInteger n = this;
-//			BigInteger nMinusOne = n.Subtract(One);
-//			BigInteger e = nMinusOne.ShiftRight(1);
-//
-//			do
-//			{
-//				BigInteger a;
-//				do
-//				{
-//					a = new BigInteger(nBitLength, random);
-//				}
-//				// NB: Spec says 0 < x < n, but 1 is trivial
-//				while (a.CompareTo(One) <= 0 || a.CompareTo(n) >= 0);
-//
-//
-//				// TODO Check this is redundant given the way Jacobi() works?
-////				if (!a.Gcd(n).Equals(One))
-////					return false;
-//
-//				int x = Jacobi(a, n);
-//
-//				if (x == 0)
-//					return false;
-//
-//				BigInteger check = a.ModPow(e, n);
-//
-//				if (x == 1 && !check.Equals(One))
-//					return false;
-//
-//				if (x == -1 && !check.Equals(nMinusOne))
-//					return false;
-//
-//				--certainty;
-//			}
-//			while (certainty > 0);
-//
-//			return true;
-//		}
-//
-//		private static int Jacobi(
-//			BigInteger	a,
-//			BigInteger	b)
-//		{
-//			Debug.Assert(a.sign >= 0);
-//			Debug.Assert(b.sign > 0);
-//			Debug.Assert(b.TestBit(0));
-//			Debug.Assert(a.CompareTo(b) < 0);
-//
-//			int totalS = 1;
-//			for (;;)
-//			{
-//				if (a.sign == 0)
-//					return 0;
-//
-//				if (a.Equals(One))
-//					break;
-//
-//				int e = a.GetLowestSetBit();
-//
-//				int bLsw = b.magnitude[b.magnitude.Length - 1];
-//				if ((e & 1) != 0 && ((bLsw & 7) == 3 || (bLsw & 7) == 5))
-//					totalS = -totalS;
-//
-//				// TODO Confirm this is faster than later a1.Equals(One) test
-//				if (a.BitLength == e + 1)
-//					break;
-//				BigInteger a1 = a.ShiftRight(e);
-////				if (a1.Equals(One))
-////					break;
-//
-//				int a1Lsw = a1.magnitude[a1.magnitude.Length - 1];
-//				if ((bLsw & 3) == 3 && (a1Lsw & 3) == 3)
-//					totalS = -totalS;
-//
-////				a = b.Mod(a1);
-//				a = b.Remainder(a1);
-//				b = a1;
-//			}
-//			return totalS;
-//		}
-
         public long LongValue
         {
             get
@@ -1915,7 +1776,7 @@ namespace Org.BouncyCastle.Math
             BigInteger result = this.Mod(m);
             if (!e.Equals(One))
             {
-                if ((m.magnitude[m.magnitude.Length - 1] & 1) == 0)
+                if ((m.magnitude[m.magnitude.Length - 1] & 1U) == 0U)
                 {
                     result = ModPowBarrett(result, e, m);
                 }
@@ -2034,7 +1895,7 @@ namespace Org.BouncyCastle.Math
             int n = m.magnitude.Length;
             int powR = 32 * n;
             bool smallMontyModulus = m.BitLength + 2 <= powR;
-            uint mDash = (uint)m.GetMQuote();
+            uint mDash = m.GetMQuote();
 
             // tmp = this * R mod m
             if (convert)
@@ -2042,13 +1903,13 @@ namespace Org.BouncyCastle.Math
                 b = b.ShiftLeft(powR).Remainder(m);
             }
 
-            int[] yAccum = new int[n + 1];
+            uint[] yAccum = new uint[n + 1];
 
-            int[] zVal = b.magnitude;
+            uint[] zVal = b.magnitude;
             Debug.Assert(zVal.Length <= n);
             if (zVal.Length < n)
             {
-                int[] tmp = new int[n];
+                uint[] tmp = new uint[n];
                 zVal.CopyTo(tmp, n - zVal.Length);
                 zVal = tmp;
             }
@@ -2068,10 +1929,10 @@ namespace Org.BouncyCastle.Math
             }
 
             int numPowers = 1 << extraBits;
-            int[][] oddPowers = new int[numPowers][];
+            uint[][] oddPowers = new uint[numPowers][];
             oddPowers[0] = zVal;
 
-            int[] zSquared = Arrays.Clone(zVal);
+            uint[] zSquared = Arrays.Clone(zVal);
             SquareMonty(yAccum, zSquared, m.magnitude, mDash, smallMontyModulus);
 
             for (int i = 1; i < numPowers; ++i)
@@ -2086,7 +1947,7 @@ namespace Org.BouncyCastle.Math
             int window = windowList[0];
             int mult = window & 0xFF, lastZeroes = window >> 8;
 
-            int[] yVal;
+            uint[] yVal;
             if (mult == 1)
             {
                 yVal = zSquared;
@@ -2131,12 +1992,12 @@ namespace Org.BouncyCastle.Math
             return new BigInteger(1, yVal, true);
         }
 
-        private static int[] GetWindowList(int[] mag, int extraBits)
+        private static int[] GetWindowList(uint[] mag, int extraBits)
         {
-            int v = mag[0];
+            int v = (int)mag[0];
             Debug.Assert(v != 0);
 
-            int leadingBits = BitLen(v);
+            int leadingBits = BitLen((uint)v);
 
             int resultSize = (((mag.Length - 1) << 5) + leadingBits) / (1 + extraBits) + 2;
             int[] result = new int[resultSize];
@@ -2149,7 +2010,7 @@ namespace Org.BouncyCastle.Math
             int zeroes = 0;
 
             int i = 0;
-            for (; ; )
+            for (;;)
             {
                 for (; bitPos < 32; ++bitPos)
                 {
@@ -2177,7 +2038,7 @@ namespace Org.BouncyCastle.Math
                     break;
                 }
 
-                v = mag[i];
+                v = (int)mag[i];
                 bitPos = 0;
             }
 
@@ -2207,9 +2068,7 @@ namespace Org.BouncyCastle.Math
         /**
          * return w with w = x * x - w is assumed to have enough space.
          */
-        private static int[] Square(
-            int[]	w,
-            int[]	x)
+        private static uint[] Square(uint[] w, uint[] x)
         {
             // Note: this method allows w to be only (2 * x.Length - 1) words if result will fit
 //			if (w.Length != 2 * x.Length)
@@ -2221,27 +2080,27 @@ namespace Org.BouncyCastle.Math
 
             for (int i = x.Length - 1; i > 0; --i)
             {
-                ulong v = (uint)x[i];
+                ulong v = x[i];
 
-                c = v * v + (uint)w[wBase];
-                w[wBase] = (int)c;
+                c = v * v + w[wBase];
+                w[wBase] = (uint)c;
                 c >>= 32;
 
                 for (int j = i - 1; j >= 0; --j)
                 {
-                    ulong prod = v * (uint)x[j];
+                    ulong prod = v * x[j];
 
-                    c += ((uint)w[--wBase] & UIMASK) + ((uint)prod << 1);
-                    w[wBase] = (int)c;
+                    c += (w[--wBase] & UIMASK) + ((uint)prod << 1);
+                    w[wBase] = (uint)c;
                     c = (c >> 32) + (prod >> 31);
                 }
 
-                c += (uint)w[--wBase];
-                w[wBase] = (int)c;
+                c += w[--wBase];
+                w[wBase] = (uint)c;
 
                 if (--wBase >= 0)
                 {
-                    w[wBase] = (int)(c >> 32);
+                    w[wBase] = (uint)(c >> 32);
                 }
                 else
                 {
@@ -2251,14 +2110,14 @@ namespace Org.BouncyCastle.Math
                 wBase += i;
             }
 
-            c = (uint)x[0];
+            c = x[0];
 
-            c = c * c + (uint)w[wBase];
-            w[wBase] = (int)c;
+            c = c * c + w[wBase];
+            w[wBase] = (uint)c;
 
             if (--wBase >= 0)
             {
-                w[wBase] += (int)(c >> 32);
+                w[wBase] += (uint)(c >> 32);
             }
             else
             {
@@ -2271,7 +2130,7 @@ namespace Org.BouncyCastle.Math
         /**
          * return x with x = y * z - x is assumed to have enough space.
          */
-        private static int[] Multiply(int[]	x, int[] y, int[] z)
+        private static uint[] Multiply(uint[] x, uint[] y, uint[] z)
         {
             int i = z.Length;
 
@@ -2290,9 +2149,9 @@ namespace Org.BouncyCastle.Math
                     for (int j = y.Length - 1; j >= 0; j--)
                     {
                         val += a * (y[j] & IMASK) + (x[xBase + j] & IMASK);
-    
-                        x[xBase + j] = (int)val;
-    
+
+                        x[xBase + j] = (uint)val;
+
                         val = (long)((ulong)val >> 32);
                     }
                 }
@@ -2301,11 +2160,11 @@ namespace Org.BouncyCastle.Math
 
                 if (xBase >= 0)
                 {
-                    x[xBase] = (int)val;
+                    x[xBase] = (uint)val;
                 }
                 else
                 {
-                    Debug.Assert(val == 0);
+                    Debug.Assert(val == 0L);
                 }
             }
             while (i > 0);
@@ -2316,18 +2175,18 @@ namespace Org.BouncyCastle.Math
         /**
          * Calculate mQuote = -m^(-1) mod b with b = 2^32 (32 = word size)
          */
-        private int GetMQuote()
+        private uint GetMQuote()
         {
             Debug.Assert(this.sign > 0);
 
-            int d = -magnitude[magnitude.Length - 1];
+            uint d = 0U - magnitude[magnitude.Length - 1];
 
-            Debug.Assert((d & 1) != 0);
+            Debug.Assert((d & 1U) != 0U);
 
-            return (int)Raw.Mod.Inverse32((uint)d);
+            return Raw.Mod.Inverse32(d);
         }
 
-        private static void MontgomeryReduce(int[] x, int[] m, uint mDash) // mDash = -m^(-1) mod b
+        private static void MontgomeryReduce(uint[] x, uint[] m, uint mDash) // mDash = -m^(-1) mod b
         {
             // NOTE: Not a general purpose reduction (which would allow x up to twice the bitlength of m)
             Debug.Assert(x.Length == m.Length);
@@ -2336,21 +2195,21 @@ namespace Org.BouncyCastle.Math
 
             for (int i = n - 1; i >= 0; --i)
             {
-                uint x0 = (uint)x[n - 1];
+                uint x0 = x[n - 1];
                 ulong t = x0 * mDash;
 
-                ulong carry = t * (uint)m[n - 1] + x0;
+                ulong carry = t * m[n - 1] + x0;
                 Debug.Assert((uint)carry == 0);
                 carry >>= 32;
 
                 for (int j = n - 2; j >= 0; --j)
                 {
-                    carry += t * (uint)m[j] + (uint)x[j];
-                    x[j + 1] = (int)carry;
+                    carry += t * m[j] + x[j];
+                    x[j + 1] = (uint)carry;
                     carry >>= 32;
                 }
 
-                x[0] = (int)carry;
+                x[0] = (uint)carry;
                 Debug.Assert(carry >> 32 == 0);
             }
 
@@ -2373,72 +2232,72 @@ namespace Org.BouncyCastle.Math
          * <br/>
          * NOTE: the indices of x, y, m, a different in HAC and in Java
          */
-        private static void MultiplyMonty(int[]	a, int[] x, int[] y, int[] m, uint mDash, bool smallMontyModulus)
+        private static void MultiplyMonty(uint[] a, uint[] x, uint[] y, uint[] m, uint mDash, bool smallMontyModulus)
             // mDash = -m^(-1) mod b
         {
             int n = m.Length;
 
             if (n == 1)
             {
-                x[0] = (int)MultiplyMontyNIsOne((uint)x[0], (uint)y[0], (uint)m[0], mDash);
+                x[0] = MultiplyMontyNIsOne(x[0], y[0], m[0], mDash);
                 return;
             }
 
-            uint y0 = (uint)y[n - 1];
-            int aMax;
+            uint y0 = y[n - 1];
+            uint aMax;
 
             {
-                ulong xi = (uint)x[n - 1];
+                ulong xi = x[n - 1];
 
                 ulong carry = xi * y0;
                 ulong t = (uint)carry * mDash;
 
-                ulong prod2 = t * (uint)m[n - 1];
+                ulong prod2 = t * m[n - 1];
                 carry += (uint)prod2;
                 Debug.Assert((uint)carry == 0);
                 carry = (carry >> 32) + (prod2 >> 32);
 
                 for (int j = n - 2; j >= 0; --j)
                 {
-                    ulong prod1 = xi * (uint)y[j];
-                    prod2 = t * (uint)m[j];
+                    ulong prod1 = xi * y[j];
+                    prod2 = t * m[j];
 
                     carry += (prod1 & UIMASK) + (uint)prod2;
-                    a[j + 2] = (int)carry;
+                    a[j + 2] = (uint)carry;
                     carry = (carry >> 32) + (prod1 >> 32) + (prod2 >> 32);
                 }
 
-                a[1] = (int)carry;
-                aMax = (int)(carry >> 32);
+                a[1] = (uint)carry;
+                aMax = (uint)(carry >> 32);
             }
 
             for (int i = n - 2; i >= 0; --i)
             {
-                uint a0 = (uint)a[n];
-                ulong xi = (uint)x[i];
+                uint a0 = a[n];
+                ulong xi = x[i];
 
                 ulong prod1 = xi * y0;
                 ulong carry = (prod1 & UIMASK) + a0;
                 ulong t = (uint)carry * mDash;
 
-                ulong prod2 = t * (uint)m[n - 1];
+                ulong prod2 = t * m[n - 1];
                 carry += (uint)prod2;
                 Debug.Assert((uint)carry == 0);
                 carry = (carry >> 32) + (prod1 >> 32) + (prod2 >> 32);
 
                 for (int j = n - 2; j >= 0; --j)
                 {
-                    prod1 = xi * (uint)y[j];
-                    prod2 = t * (uint)m[j];
+                    prod1 = xi * y[j];
+                    prod2 = t * m[j];
 
-                    carry += (prod1 & UIMASK) + (uint)prod2 + (uint)a[j + 1];
-                    a[j + 2] = (int)carry;
+                    carry += (prod1 & UIMASK) + (uint)prod2 + a[j + 1];
+                    a[j + 2] = (uint)carry;
                     carry = (carry >> 32) + (prod1 >> 32) + (prod2 >> 32);
                 }
 
-                carry += (uint)aMax;
-                a[1] = (int)carry;
-                aMax = (int)(carry >> 32);
+                carry += aMax;
+                a[1] = (uint)carry;
+                aMax = (uint)(carry >> 32);
             }
 
             a[0] = aMax;
@@ -2451,84 +2310,84 @@ namespace Org.BouncyCastle.Math
             Array.Copy(a, 1, x, 0, n);
         }
 
-        private static void SquareMonty(int[] a, int[] x, int[] m, uint mDash, bool smallMontyModulus)
+        private static void SquareMonty(uint[] a, uint[] x, uint[] m, uint mDash, bool smallMontyModulus)
             // mDash = -m^(-1) mod b
         {
             int n = m.Length;
 
             if (n == 1)
             {
-                uint xVal = (uint)x[0];
-                x[0] = (int)MultiplyMontyNIsOne(xVal, xVal, (uint)m[0], mDash);
+                uint xVal = x[0];
+                x[0] = MultiplyMontyNIsOne(xVal, xVal, m[0], mDash);
                 return;
             }
 
-            ulong x0 = (uint)x[n - 1];
-            int aMax;
+            ulong x0 = x[n - 1];
+            uint aMax;
 
             {
                 ulong carry = x0 * x0;
                 ulong t = (uint)carry * mDash;
 
-                ulong prod2 = t * (uint)m[n - 1];
+                ulong prod2 = t * m[n - 1];
                 carry += (uint)prod2;
                 Debug.Assert((uint)carry == 0);
                 carry = (carry >> 32) + (prod2 >> 32);
 
                 for (int j = n - 2; j >= 0; --j)
                 {
-                    ulong prod1 = x0 * (uint)x[j];
-                    prod2 = t * (uint)m[j];
+                    ulong prod1 = x0 * x[j];
+                    prod2 = t * m[j];
 
                     carry += (prod2 & UIMASK) + ((uint)prod1 << 1);
-                    a[j + 2] = (int)carry;
+                    a[j + 2] = (uint)carry;
                     carry = (carry >> 32) + (prod1 >> 31) + (prod2 >> 32);
                 }
 
-                a[1] = (int)carry;
-                aMax = (int)(carry >> 32);
+                a[1] = (uint)carry;
+                aMax = (uint)(carry >> 32);
             }
 
             for (int i = n - 2; i >= 0; --i)
             {
-                uint a0 = (uint)a[n];
+                uint a0 = a[n];
                 ulong t = a0 * mDash;
 
-                ulong carry = t * (uint)m[n - 1] + a0;
+                ulong carry = t * m[n - 1] + a0;
                 Debug.Assert((uint)carry == 0);
                 carry >>= 32;
 
                 for (int j = n - 2; j > i; --j)
                 {
-                    carry += t * (uint)m[j] + (uint)a[j + 1];
-                    a[j + 2] = (int)carry;
+                    carry += t * m[j] + a[j + 1];
+                    a[j + 2] = (uint)carry;
                     carry >>= 32;
                 }
 
-                ulong xi = (uint)x[i];
+                ulong xi = x[i];
 
                 {
                     ulong prod1 = xi * xi;
-                    ulong prod2 = t * (uint)m[i];
+                    ulong prod2 = t * m[i];
 
-                    carry += (prod1 & UIMASK) + (uint)prod2 + (uint)a[i + 1];
-                    a[i + 2] = (int)carry;
+                    carry += (prod1 & UIMASK) + (uint)prod2 + a[i + 1];
+                    a[i + 2] = (uint)carry;
                     carry = (carry >> 32) + (prod1 >> 32) + (prod2 >> 32);
                 }
 
                 for (int j = i - 1; j >= 0; --j)
                 {
-                    ulong prod1 = xi * (uint)x[j];
-                    ulong prod2 = t * (uint)m[j];
+                    ulong prod1 = xi * x[j];
+                    ulong prod2 = t * m[j];
 
-                    carry += (prod2 & UIMASK) + ((uint)prod1 << 1) + (uint)a[j + 1];
-                    a[j + 2] = (int)carry;
+                    carry += (prod2 & UIMASK) + ((uint)prod1 << 1) + a[j + 1];
+                    a[j + 2] = (uint)carry;
                     carry = (carry >> 32) + (prod1 >> 31) + (prod2 >> 32);
                 }
 
-                carry += (uint)aMax;
-                a[1] = (int)carry;
-                aMax = (int)(carry >> 32);
+                carry += aMax;
+                a[1] = (uint)carry;
+                aMax = (uint)(carry >> 32);
             }
 
             a[0] = aMax;
@@ -2558,8 +2417,7 @@ namespace Org.BouncyCastle.Math
             return (uint)carry;
         }
 
-        public BigInteger Multiply(
-            BigInteger val)
+        public BigInteger Multiply(BigInteger val)
         {
             if (val == this)
                 return Square();
@@ -2580,7 +2438,7 @@ namespace Org.BouncyCastle.Math
             }
 
             int resLength = magnitude.Length + val.magnitude.Length;
-            int[] res = new int[resLength];
+            uint[] res = new uint[resLength];
 
             Multiply(res, this.magnitude, val.magnitude);
 
@@ -2595,9 +2453,11 @@ namespace Org.BouncyCastle.Math
             if (this.QuickPow2Check())
                 return ShiftLeft(Abs().BitLength - 1);
             int resLength = magnitude.Length << 1;
-            if ((uint)magnitude[0] >> 16 == 0)
+            if (magnitude[0] >> 16 == 0U)
+            {
                 --resLength;
-            int[] res = new int[resLength];
+            }
+            uint[] res = new uint[resLength];
             Square(res, magnitude);
             return new BigInteger(1, res, false);
         }
@@ -2675,43 +2535,38 @@ namespace Org.BouncyCastle.Math
             return y;
         }
 
-        public static BigInteger ProbablePrime(
-            int bitLength,
-            Random random)
+        public static BigInteger ProbablePrime(int bitLength, Random random)
         {
             return new BigInteger(bitLength, 100, random);
         }
 
-        private int Remainder(
-            int m)
+        private int Remainder(int m)
         {
             Debug.Assert(m > 0);
 
             long acc = 0;
             for (int pos = 0; pos < magnitude.Length; ++pos)
             {
-                long posVal = (uint) magnitude[pos];
+                long posVal = magnitude[pos];
                 acc = (acc << 32 | posVal) % m;
             }
 
-            return (int) acc;
+            return (int)acc;
         }
 
         /**
          * return x = x % y - done in place (y value preserved)
          */
-        private static int[] Remainder(
-            int[] x,
-            int[] y)
+        private static uint[] Remainder(uint[] x, uint[] y)
         {
             int xStart = 0;
-            while (xStart < x.Length && x[xStart] == 0)
+            while (xStart < x.Length && x[xStart] == 0U)
             {
                 ++xStart;
             }
 
             int yStart = 0;
-            while (yStart < y.Length && y[yStart] == 0)
+            while (yStart < y.Length && y[yStart] == 0U)
             {
                 ++yStart;
             }
@@ -2726,19 +2581,19 @@ namespace Org.BouncyCastle.Math
                 int xBitLength = CalcBitLength(1, xStart, x);
                 int shift = xBitLength - yBitLength;
 
-                int[] c;
+                uint[] c;
                 int cStart = 0;
                 int cBitLength = yBitLength;
                 if (shift > 0)
                 {
                     c = ShiftLeft(y, shift);
                     cBitLength += shift;
-                    Debug.Assert(c[0] != 0);
+                    Debug.Assert(c[0] != 0U);
                 }
                 else
                 {
                     int len = y.Length - yStart;
-                    c = new int[len];
+                    c = new uint[len];
                     Array.Copy(y, yStart, c, 0, len);
                 }
 
@@ -2749,13 +2604,12 @@ namespace Org.BouncyCastle.Math
                     {
                         Subtract(xStart, x, cStart, c);
 
-                        while (x[xStart] == 0)
+                        while (x[xStart] == 0U)
                         {
                             if (++xStart == x.Length)
                                 return x;
                         }
 
-                        //xBitLength = CalcBitLength(xStart, x);
                         xBitLength = 32 * (x.Length - xStart - 1) + BitLen(x[xStart]);
 
                         if (xBitLength <= yBitLength)
@@ -2775,10 +2629,12 @@ namespace Org.BouncyCastle.Math
                     // NB: The case where c[cStart] is 1-bit is harmless
                     if (shift == 1)
                     {
-                        uint firstC = (uint) c[cStart] >> 1;
-                        uint firstX = (uint) x[xStart];
+                        uint firstC = c[cStart] >> 1;
+                        uint firstX = x[xStart];
                         if (firstC > firstX)
+                        {
                             ++shift;
+                        }
                     }
 
                     if (shift < 2)
@@ -2792,8 +2648,7 @@ namespace Org.BouncyCastle.Math
                         cBitLength -= shift;
                     }
 
-                    //cStart = c.Length - ((cBitLength + 31) / 32);
-                    while (c[cStart] == 0)
+                    while (c[cStart] == 0U)
                     {
                         ++cStart;
                     }
@@ -2808,8 +2663,7 @@ namespace Org.BouncyCastle.Math
             return x;
         }
 
-        public BigInteger Remainder(
-            BigInteger n)
+        public BigInteger Remainder(BigInteger n)
         {
             if (n.sign == 0)
                 throw new ArithmeticException("Division by zero error");
@@ -2820,7 +2674,7 @@ namespace Org.BouncyCastle.Math
             // For small values, use fast remainder method
             if (n.magnitude.Length == 1)
             {
-                int val = n.magnitude[0];
+                int val = (int)n.magnitude[0];
 
                 if (val > 0)
                 {
@@ -2832,14 +2686,14 @@ namespace Org.BouncyCastle.Math
 
                     return rem == 0
                         ?	Zero
-                        :	new BigInteger(sign, new int[]{ rem }, false);
+                        :	new BigInteger(sign, new uint[1]{ (uint)rem }, false);
                 }
             }
 
             if (CompareNoLeadingZeroes(0, magnitude, 0, n.magnitude) < 0)
                 return this;
 
-            int[] result;
+            uint[] result;
             if (n.QuickPow2Check())  // n is power of two
             {
                 // TODO Move before small values branch above?
@@ -2847,29 +2701,28 @@ namespace Org.BouncyCastle.Math
             }
             else
             {
-                result = (int[]) this.magnitude.Clone();
+                result = (uint[])this.magnitude.Clone();
                 result = Remainder(result, n.magnitude);
             }
 
             return new BigInteger(sign, result, true);
         }
 
-        private int[] LastNBits(
-            int n)
+        private uint[] LastNBits(int n)
         {
             if (n < 1)
                 return ZeroMagnitude;
 
             int numWords = (n + BitsPerInt - 1) / BitsPerInt;
             numWords = System.Math.Min(numWords, this.magnitude.Length);
-            int[] result = new int[numWords];
+            uint[] result = new uint[numWords];
 
             Array.Copy(this.magnitude, this.magnitude.Length - numWords, result, 0, numWords);
 
             int excessBits = (numWords << 5) - n;
             if (excessBits > 0)
             {
-                result[0] &= (int)(uint.MaxValue >> excessBits);
+                result[0] &= uint.MaxValue >> excessBits;
             }
 
             return result;
@@ -2881,7 +2734,7 @@ namespace Org.BouncyCastle.Math
             int n = magnitude.Length;
             if (w >= n)
                 return Zero;
-            int[] mag = new int[n - w];
+            uint[] mag = new uint[n - w];
             Array.Copy(magnitude, 0, mag, 0, n - w);
             return new BigInteger(sign, mag, false);
         }
@@ -2892,7 +2745,7 @@ namespace Org.BouncyCastle.Math
             int n = magnitude.Length;
             if (w >= n)
                 return this;
-            int[] mag = new int[w];
+            uint[] mag = new uint[w];
             Array.Copy(magnitude, n - w, mag, 0, w);
             return new BigInteger(sign, mag, false);
         }
@@ -2900,42 +2753,40 @@ namespace Org.BouncyCastle.Math
         /**
          * do a left shift - this returns a new array.
          */
-        private static int[] ShiftLeft(
-            int[]	mag,
-            int		n)
+        private static uint[] ShiftLeft(uint[] mag, int n)
         {
             int nInts = (int)((uint)n >> 5);
             int nBits = n & 0x1f;
             int magLen = mag.Length;
-            int[] newMag;
+            uint[] newMag;
 
             if (nBits == 0)
             {
-                newMag = new int[magLen + nInts];
+                newMag = new uint[magLen + nInts];
                 mag.CopyTo(newMag, 0);
             }
             else
             {
                 int i = 0;
                 int nBits2 = 32 - nBits;
-                int highBits = (int)((uint)mag[0] >> nBits2);
+                uint highBits = mag[0] >> nBits2;
 
-                if (highBits != 0)
+                if (highBits != 0U)
                 {
-                    newMag = new int[magLen + nInts + 1];
+                    newMag = new uint[magLen + nInts + 1];
                     newMag[i++] = highBits;
                 }
                 else
                 {
-                    newMag = new int[magLen + nInts];
+                    newMag = new uint[magLen + nInts];
                 }
 
-                int m = mag[0];
+                uint m = mag[0];
                 for (int j = 0; j < magLen - 1; j++)
                 {
-                    int next = mag[j + 1];
+                    uint next = mag[j + 1];
 
-                    newMag[i++] = (m << nBits) | (int)((uint)next >> nBits2);
+                    newMag[i++] = (m << nBits) | (next >> nBits2);
                     m = next;
                 }
 
@@ -2958,8 +2809,7 @@ namespace Org.BouncyCastle.Math
             return carry;
         }
 
-        public BigInteger ShiftLeft(
-            int n)
+        public BigInteger ShiftLeft(int n)
         {
             if (sign == 0 || magnitude.Length == 0)
                 return Zero;
@@ -2990,10 +2840,7 @@ namespace Org.BouncyCastle.Math
         /**
          * do a right shift - this does it in place.
          */
-        private static void ShiftRightInPlace(
-            int		start,
-            int[]	mag,
-            int		n)
+        private static void ShiftRightInPlace(int start, uint[] mag, int n)
         {
             int nInts = (int)((uint)n >> 5) + start;
             int nBits = n & 0x1f;
@@ -3009,49 +2856,46 @@ namespace Org.BouncyCastle.Math
                 }
                 for (int i = nInts - 1; i >= start; i--)
                 {
-                    mag[i] = 0;
+                    mag[i] = 0U;
                 }
             }
 
             if (nBits != 0)
             {
                 int nBits2 = 32 - nBits;
-                int m = mag[magEnd];
+                uint m = mag[magEnd];
 
                 for (int i = magEnd; i > nInts; --i)
                 {
-                    int next = mag[i - 1];
+                    uint next = mag[i - 1];
 
-                    mag[i] = (int)((uint)m >> nBits) | (next << nBits2);
+                    mag[i] = (m >> nBits) | (next << nBits2);
                     m = next;
                 }
 
-                mag[nInts] = (int)((uint)mag[nInts] >> nBits);
+                mag[nInts] = mag[nInts] >> nBits;
             }
         }
 
         /**
          * do a right shift by one - this does it in place.
          */
-        private static void ShiftRightOneInPlace(
-            int		start,
-            int[]	mag)
+        private static void ShiftRightOneInPlace(int start, uint[] mag)
         {
             int i = mag.Length;
-            int m = mag[i - 1];
+            uint m = mag[i - 1];
 
             while (--i > start)
             {
-                int next = mag[i - 1];
-                mag[i] = ((int)((uint)m >> 1)) | (next << 31);
+                uint next = mag[i - 1];
+                mag[i] = (m >> 1) | (next << 31);
                 m = next;
             }
 
-            mag[start] = (int)((uint)mag[start] >> 1);
+            mag[start] = mag[start] >> 1;
         }
 
-        public BigInteger ShiftRight(
-            int n)
+        public BigInteger ShiftRight(int n)
         {
             if (n == 0)
                 return this;
@@ -3062,14 +2906,8 @@ namespace Org.BouncyCastle.Math
             if (n >= BitLength)
                 return (this.sign < 0 ? One.Negate() : Zero);
 
-//			int[] res = (int[]) this.magnitude.Clone();
-//
-//			ShiftRightInPlace(0, res, n);
-//
-//			return new BigInteger(this.sign, res, true);
-
             int resultLength = (BitLength - n + 31) >> 5;
-            int[] res = new int[resultLength];
+            uint[] res = new uint[resultLength];
 
             int numInts = n >> 5;
             int numBits = n & 31;
@@ -3085,7 +2923,7 @@ namespace Org.BouncyCastle.Math
                 int magPos = this.magnitude.Length - 1 - numInts;
                 for (int i = resultLength - 1; i >= 0; --i)
                 {
-                    res[i] = (int)((uint) this.magnitude[magPos--] >> numBits);
+                    res[i] = this.magnitude[magPos--] >> numBits;
 
                     if (magPos >= 0)
                     {
@@ -3094,7 +2932,7 @@ namespace Org.BouncyCastle.Math
                 }
             }
 
-            Debug.Assert(res[0] != 0);
+            Debug.Assert(res[0] != 0U);
 
             return new BigInteger(this.sign, res, false);
         }
@@ -3107,11 +2945,7 @@ namespace Org.BouncyCastle.Math
         /**
          * returns x = x - y - we assume x is >= y
          */
-        private static int[] Subtract(
-            int		xStart,
-            int[]	x,
-            int		yStart,
-            int[]	y)
+        private static uint[] Subtract(int xStart, uint[] x, int yStart, uint[] y)
         {
             Debug.Assert(yStart < y.Length);
             Debug.Assert(x.Length - xStart >= y.Length - yStart);
@@ -3124,16 +2958,15 @@ namespace Org.BouncyCastle.Math
             do
             {
                 m = (x[--iT] & IMASK) - (y[--iV] & IMASK) + borrow;
-                x[iT] = (int) m;
+                x[iT] = (uint)m;
 
-//				borrow = (m < 0) ? -1 : 0;
                 borrow = (int)(m >> 63);
             }
             while (iV > yStart);
 
             if (borrow != 0)
             {
-                while (--x[--iT] == -1)
+                while (--x[--iT] == uint.MaxValue)
                 {
                 }
             }
@@ -3141,8 +2974,7 @@ namespace Org.BouncyCastle.Math
             return x;
         }
 
-        public BigInteger Subtract(
-            BigInteger n)
+        public BigInteger Subtract(BigInteger n)
         {
             if (n.sign == 0)
                 return this;
@@ -3169,14 +3001,12 @@ namespace Org.BouncyCastle.Math
                 lilun = n;
             }
 
-            return new BigInteger(this.sign * compare, doSubBigLil(bigun.magnitude, lilun.magnitude), true);
+            return new BigInteger(this.sign * compare, DoSubBigLil(bigun.magnitude, lilun.magnitude), true);
         }
 
-        private static int[] doSubBigLil(
-            int[]	bigMag,
-            int[]	lilMag)
+        private static uint[] DoSubBigLil(uint[] bigMag, uint[] lilMag)
         {
-            int[] res = (int[]) bigMag.Clone();
+            uint[] res = (uint[])bigMag.Clone();
 
             return Subtract(0, res, 0, lilMag);
         }
@@ -3270,12 +3100,12 @@ namespace Org.BouncyCastle.Math
             {
                 while (magIndex > 1)
                 {
-                    uint mag = (uint) magnitude[--magIndex];
+                    uint mag = magnitude[--magIndex];
                     bytesIndex -= 4;
                     Pack.UInt32_To_BE(mag, bytes, bytesIndex);
                 }
 
-                uint lastMag = (uint) magnitude[0];
+                uint lastMag = magnitude[0];
                 while (lastMag > byte.MaxValue)
                 {
                     bytes[--bytesIndex] = (byte) lastMag;
@@ -3295,7 +3125,7 @@ namespace Org.BouncyCastle.Math
 
                 while (magIndex > 1)
                 {
-                    uint mag = ~((uint) magnitude[--magIndex]);
+                    uint mag = ~magnitude[--magIndex];
 
                     if (carry)
                     {
@@ -3306,7 +3136,7 @@ namespace Org.BouncyCastle.Math
                     Pack.UInt32_To_BE(mag, bytes, bytesIndex);
                 }
 
-                uint lastMag = (uint) magnitude[0];
+                uint lastMag = magnitude[0];
 
                 if (carry)
                 {
@@ -3316,11 +3146,11 @@ namespace Org.BouncyCastle.Math
 
                 while (lastMag > byte.MaxValue)
                 {
-                    bytes[--bytesIndex] = (byte) ~lastMag;
+                    bytes[--bytesIndex] = (byte)~lastMag;
                     lastMag >>= 8;
                 }
 
-                bytes[--bytesIndex] = (byte) ~lastMag;
+                bytes[--bytesIndex] = (byte)~lastMag;
                 Debug.Assert((bytesIndex & 1) == bytesIndex);
                 if (bytesIndex != 0)
                 {
@@ -3356,12 +3186,12 @@ namespace Org.BouncyCastle.Math
             {
                 while (magIndex > 1)
                 {
-                    uint mag = (uint) magnitude[--magIndex];
+                    uint mag = magnitude[--magIndex];
                     bytesIndex -= 4;
                     Pack.UInt32_To_BE(mag, output[bytesIndex..]);
                 }
 
-                uint lastMag = (uint)magnitude[0];
+                uint lastMag = magnitude[0];
                 while (lastMag > byte.MaxValue)
                 {
                     output[--bytesIndex] = (byte)lastMag;
@@ -3381,7 +3211,7 @@ namespace Org.BouncyCastle.Math
 
                 while (magIndex > 1)
                 {
-                    uint mag = ~((uint)magnitude[--magIndex]);
+                    uint mag = ~magnitude[--magIndex];
 
                     if (carry)
                     {
@@ -3392,7 +3222,7 @@ namespace Org.BouncyCastle.Math
                     Pack.UInt32_To_BE(mag, output[bytesIndex..]);
                 }
 
-                uint lastMag = (uint)magnitude[0];
+                uint lastMag = magnitude[0];
 
                 if (carry)
                 {
@@ -3439,7 +3269,7 @@ namespace Org.BouncyCastle.Math
             {
                 while (magIndex > 0)
                 {
-                    output[--intsIndex] = (uint)magnitude[--magIndex];
+                    output[--intsIndex] = magnitude[--magIndex];
                 }
 
                 Debug.Assert((intsIndex & 1) == intsIndex);
@@ -3453,7 +3283,7 @@ namespace Org.BouncyCastle.Math
                 ulong cc = 1UL;
                 while (magIndex > 0)
                 {
-                    cc += ~(uint)magnitude[--magIndex];
+                    cc += ~magnitude[--magIndex];
                     output[--intsIndex] = (uint)cc; cc >>= 32;
                 }
                 Debug.Assert(cc == 0UL);
@@ -3489,7 +3319,7 @@ namespace Org.BouncyCastle.Math
             {
                 for (int intsIndex = 0; intsIndex < magnitude.Length; ++intsIndex)
                 {
-                    output[intsIndex] = (uint)magnitude[--magIndex];
+                    output[intsIndex] = magnitude[--magIndex];
                 }
 
                 if (nInts > magnitude.Length)
@@ -3503,7 +3333,7 @@ namespace Org.BouncyCastle.Math
                 ulong cc = 1UL;
                 for (int intsIndex = 0; intsIndex < magnitude.Length; ++intsIndex)
                 {
-                    cc += ~(uint)magnitude[--magIndex];
+                    cc += ~magnitude[--magIndex];
                     output[intsIndex] = (uint)cc; cc >>= 32;
                 }
                 Debug.Assert(cc == 0UL);
@@ -3528,13 +3358,13 @@ namespace Org.BouncyCastle.Math
 
             switch (radix)
             {
-                case 2:
-                case 8:
-                case 10:
-                case 16:
-                    break;
-                default:
-                    throw new FormatException("Only bases 2, 8, 10, 16 are allowed");
+            case 2:
+            case 8:
+            case 10:
+            case 16:
+                break;
+            default:
+                throw new FormatException("Only bases 2, 8, 10, 16 are allowed");
             }
 
             // NB: Can only happen to internally managed instances
@@ -3549,18 +3379,14 @@ namespace Org.BouncyCastle.Math
             int firstNonZero = 0;
             while (firstNonZero < magnitude.Length)
             {
-                if (magnitude[firstNonZero] != 0)
-                {
+                if (magnitude[firstNonZero] != 0U)
                     break;
-                }
+
                 ++firstNonZero;
             }
 
             if (firstNonZero == magnitude.Length)
-            {
                 return "0";
-            }
-
 
             StringBuilder sb = new StringBuilder();
             if (sign == -1)
@@ -3672,18 +3498,17 @@ namespace Org.BouncyCastle.Math
             sb.Append(s);
         }
 
-        private static BigInteger CreateUValueOf(
-            ulong value)
+        private static BigInteger CreateUValueOf(ulong value)
         {
-            int msw = (int)(value >> 32);
-            int lsw = (int)value;
+            uint msw = (uint)(value >> 32);
+            uint lsw = (uint)value;
 
             if (msw != 0)
-                return new BigInteger(1, new int[] { msw, lsw }, false);
+                return new BigInteger(1, new uint[]{ msw, lsw }, false);
 
             if (lsw != 0)
             {
-                BigInteger n = new BigInteger(1, new int[] { lsw }, false);
+                BigInteger n = new BigInteger(1, new uint[]{ lsw }, false);
                 // Check for a power of two
                 if ((lsw & -lsw) == lsw)
                 {
@@ -3695,8 +3520,7 @@ namespace Org.BouncyCastle.Math
             return Zero;
         }
 
-        private static BigInteger CreateValueOf(
-            long value)
+        private static BigInteger CreateValueOf(long value)
         {
             if (value < 0)
             {
@@ -3709,13 +3533,10 @@ namespace Org.BouncyCastle.Math
             return CreateUValueOf((ulong)value);
         }
 
-        public static BigInteger ValueOf(
-            long value)
+        public static BigInteger ValueOf(long value)
         {
             if (value >= 0 && value < SMALL_CONSTANTS.Length)
-            {
                 return SMALL_CONSTANTS[value];
-            }
 
             return CreateValueOf(value);
         }
@@ -3725,19 +3546,19 @@ namespace Org.BouncyCastle.Math
             if (this.sign == 0)
                 return -1;
 
-            return GetLowestSetBitMaskFirst(-1);
+            return GetLowestSetBitMaskFirst(uint.MaxValue);
         }
 
-        private int GetLowestSetBitMaskFirst(int firstWordMask)
+        private int GetLowestSetBitMaskFirst(uint firstWordMaskX)
         {
             int w = magnitude.Length, offset = 0;
 
-            uint word = (uint)(magnitude[--w] & firstWordMask);
-            Debug.Assert(magnitude[0] != 0);
+            uint word = magnitude[--w] & firstWordMaskX;
+            Debug.Assert(magnitude[0] != 0U);
 
             while (word == 0)
             {
-                word = (uint)magnitude[--w];
+                word = magnitude[--w];
                 offset += 32;
             }
 
@@ -3760,8 +3581,7 @@ namespace Org.BouncyCastle.Math
             return offset;
         }
 
-        public bool TestBit(
-            int n)
+        public bool TestBit(int n)
         {
             if (n < 0)
                 throw new ArithmeticException("Bit position must not be negative");
@@ -3773,12 +3593,11 @@ namespace Org.BouncyCastle.Math
             if (wordNum >= magnitude.Length)
                 return false;
 
-            int word = magnitude[magnitude.Length - 1 - wordNum];
-            return ((word >> (n % 32)) & 1) > 0;
+            uint word = magnitude[magnitude.Length - 1 - wordNum];
+            return ((word >> (n % 32)) & 1U) != 0;
         }
 
-        public BigInteger Or(
-            BigInteger value)
+        public BigInteger Or(BigInteger value)
         {
             if (this.sign == 0)
                 return value;
@@ -3786,25 +3605,20 @@ namespace Org.BouncyCastle.Math
             if (value.sign == 0)
                 return this;
 
-            int[] aMag = this.sign > 0
-                ? this.magnitude
-                : Add(One).magnitude;
-
-            int[] bMag = value.sign > 0
-                ? value.magnitude
-                : value.Add(One).magnitude;
+            uint[] aMag = this.sign > 0 ? this.magnitude : Add(One).magnitude;
+            uint[] bMag = value.sign > 0 ? value.magnitude : value.Add(One).magnitude;
 
             bool resultNeg = sign < 0 || value.sign < 0;
             int resultLength = System.Math.Max(aMag.Length, bMag.Length);
-            int[] resultMag = new int[resultLength];
+            uint[] resultMag = new uint[resultLength];
 
             int aStart = resultMag.Length - aMag.Length;
             int bStart = resultMag.Length - bMag.Length;
 
             for (int i = 0; i < resultMag.Length; ++i)
             {
-                int aWord = i >= aStart ? aMag[i - aStart] : 0;
-                int bWord = i >= bStart ? bMag[i - bStart] : 0;
+                uint aWord = i >= aStart ? aMag[i - aStart] : 0U;
+                uint bWord = i >= bStart ? bMag[i - bStart] : 0U;
 
                 if (this.sign < 0)
                 {
@@ -3835,8 +3649,7 @@ namespace Org.BouncyCastle.Math
             return result;
         }
 
-        public BigInteger Xor(
-            BigInteger value)
+        public BigInteger Xor(BigInteger value)
         {
             if (this.sign == 0)
                 return value;
@@ -3844,26 +3657,21 @@ namespace Org.BouncyCastle.Math
             if (value.sign == 0)
                 return this;
 
-            int[] aMag = this.sign > 0
-                ? this.magnitude
-                : Add(One).magnitude;
-
-            int[] bMag = value.sign > 0
-                ? value.magnitude
-                : value.Add(One).magnitude;
+            uint[] aMag = this.sign > 0 ? this.magnitude : Add(One).magnitude;
+            uint[] bMag = value.sign > 0 ? value.magnitude : value.Add(One).magnitude;
 
             // TODO Can just replace with sign != value.sign?
             bool resultNeg = (sign < 0 && value.sign >= 0) || (sign >= 0 && value.sign < 0);
             int resultLength = System.Math.Max(aMag.Length, bMag.Length);
-            int[] resultMag = new int[resultLength];
+            uint[] resultMag = new uint[resultLength];
 
             int aStart = resultMag.Length - aMag.Length;
             int bStart = resultMag.Length - bMag.Length;
 
             for (int i = 0; i < resultMag.Length; ++i)
             {
-                int aWord = i >= aStart ? aMag[i - aStart] : 0;
-                int bWord = i >= bStart ? bMag[i - bStart] : 0;
+                uint aWord = i >= aStart ? aMag[i - aStart] : 0U;
+                uint bWord = i >= bStart ? bMag[i - bStart] : 0U;
 
                 if (this.sign < 0)
                 {
@@ -3894,8 +3702,7 @@ namespace Org.BouncyCastle.Math
             return result;
         }
 
-        public BigInteger SetBit(
-            int n)
+        public BigInteger SetBit(int n)
         {
             if (n < 0)
                 throw new ArithmeticException("Bit address less than zero");
@@ -3910,8 +3717,7 @@ namespace Org.BouncyCastle.Math
             return Or(One.ShiftLeft(n));
         }
 
-        public BigInteger ClearBit(
-            int n)
+        public BigInteger ClearBit(int n)
         {
             if (n < 0)
                 throw new ArithmeticException("Bit address less than zero");
@@ -3926,8 +3732,7 @@ namespace Org.BouncyCastle.Math
             return AndNot(One.ShiftLeft(n));
         }
 
-        public BigInteger FlipBit(
-            int n)
+        public BigInteger FlipBit(int n)
         {
             if (n < 0)
                 throw new ArithmeticException("Bit address less than zero");
@@ -3939,15 +3744,14 @@ namespace Org.BouncyCastle.Math
             return Xor(One.ShiftLeft(n));
         }
 
-        private BigInteger FlipExistingBit(
-            int n)
+        private BigInteger FlipExistingBit(int n)
         {
             Debug.Assert(sign > 0);
             Debug.Assert(n >= 0);
             Debug.Assert(n < BitLength - 1);
 
-            int[] mag = (int[]) this.magnitude.Clone();
-            mag[mag.Length - 1 - (n >> 5)] ^= (1 << (n & 31)); // Flip bit
+            uint[] mag = (uint[])this.magnitude.Clone();
+            mag[mag.Length - 1 - (n >> 5)] ^= (1U << (n & 31)); // Flip bit
             return new BigInteger(this.sign, mag, false);
         }
     }