summary refs log tree commit diff
path: root/crypto/src/math/raw/Bits.cs
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/src/math/raw/Bits.cs')
-rw-r--r--crypto/src/math/raw/Bits.cs65
1 files changed, 61 insertions, 4 deletions
diff --git a/crypto/src/math/raw/Bits.cs b/crypto/src/math/raw/Bits.cs
index d344e1672..423151651 100644
--- a/crypto/src/math/raw/Bits.cs
+++ b/crypto/src/math/raw/Bits.cs
@@ -1,28 +1,85 @@
-using System;
+using System.Diagnostics;
+#if NETSTANDARD1_0_OR_GREATER || NETCOREAPP1_0_OR_GREATER
+using System.Runtime.CompilerServices;
+#endif
 
 namespace Org.BouncyCastle.Math.Raw
 {
-    internal abstract class Bits
+    internal static class Bits
     {
+#if NETSTANDARD1_0_OR_GREATER || NETCOREAPP1_0_OR_GREATER
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+#endif
         internal static uint BitPermuteStep(uint x, uint m, int s)
         {
+            Debug.Assert((m & (m << s)) == 0U);
+            Debug.Assert((m << s) >> s == m);
+
             uint t = (x ^ (x >> s)) & m;
-            return (t ^ (t << s)) ^ x;
+            return t ^ (t << s) ^ x;
         }
 
+#if NETSTANDARD1_0_OR_GREATER || NETCOREAPP1_0_OR_GREATER
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+#endif
         internal static ulong BitPermuteStep(ulong x, ulong m, int s)
         {
+            Debug.Assert((m & (m << s)) == 0UL);
+            Debug.Assert((m << s) >> s == m);
+
             ulong t = (x ^ (x >> s)) & m;
-            return (t ^ (t << s)) ^ x;
+            return t ^ (t << s) ^ x;
+        }
+
+#if NETSTANDARD1_0_OR_GREATER || NETCOREAPP1_0_OR_GREATER
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+#endif
+        internal static void BitPermuteStep2(ref uint hi, ref uint lo, uint m, int s)
+        {
+#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP1_1_OR_GREATER
+            Debug.Assert(!Unsafe.AreSame(ref hi, ref lo) || (m & (m << s)) == 0U);
+#endif
+            Debug.Assert((m << s) >> s == m);
+
+            uint t = ((lo >> s) ^ hi) & m;
+            lo ^= t << s;
+            hi ^= t;
         }
 
+#if NETSTANDARD1_0_OR_GREATER || NETCOREAPP1_0_OR_GREATER
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+#endif
+        internal static void BitPermuteStep2(ref ulong hi, ref ulong lo, ulong m, int s)
+        {
+#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP1_1_OR_GREATER
+            Debug.Assert(!Unsafe.AreSame(ref hi, ref lo) || (m & (m << s)) == 0UL);
+#endif
+            Debug.Assert((m << s) >> s == m);
+
+            ulong t = ((lo >> s) ^ hi) & m;
+            lo ^= t << s;
+            hi ^= t;
+        }
+
+#if NETSTANDARD1_0_OR_GREATER || NETCOREAPP1_0_OR_GREATER
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+#endif
         internal static uint BitPermuteStepSimple(uint x, uint m, int s)
         {
+            Debug.Assert((m & (m << s)) == 0U);
+            Debug.Assert((m << s) >> s == m);
+
             return ((x & m) << s) | ((x >> s) & m);
         }
 
+#if NETSTANDARD1_0_OR_GREATER || NETCOREAPP1_0_OR_GREATER
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+#endif
         internal static ulong BitPermuteStepSimple(ulong x, ulong m, int s)
         {
+            Debug.Assert((m & (m << s)) == 0UL);
+            Debug.Assert((m << s) >> s == m);
+
             return ((x & m) << s) | ((x >> s) & m);
         }
     }