From c9a0b9b02d8980adc3f9a547bd14898c6b101285 Mon Sep 17 00:00:00 2001 From: Peter Dettman Date: Sun, 9 Oct 2022 19:07:44 +0700 Subject: Round out Bits methods - AggressiveInlining - Debug guards --- crypto/src/math/raw/Bits.cs | 65 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 4 deletions(-) (limited to 'crypto/src') 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); } } -- cgit 1.4.1