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);
}
}
|