<PackageReference Include="BouncyCastle.Cryptography" Version="2.6.2" />

PicnicUtilities

static class PicnicUtilities
using Org.BouncyCastle.Utilities; namespace Org.BouncyCastle.Pqc.Crypto.Picnic { internal static class PicnicUtilities { internal static void Fill(uint[] buf, int from, int to, uint b) { for (int i = from; i < to; i++) { buf[i] = b; } } internal static int NumBytes(int numBits) { return numBits + 7 >> 3; } internal static uint ceil_log2(uint x) { if (x != 0) return (uint)(32 - Integers.NumberOfLeadingZeros((int)(x - 1))); return 0; } internal static int Parity(byte[] data, int len) { byte b = data[0]; for (int i = 1; i < len; i++) { b = (byte)(b ^ data[i]); } return Integers.PopCount(b) & 1; } internal static uint Parity16(uint x) { return (uint)(Integers.PopCount(x & 65535) & 1); } internal static uint Parity32(uint x) { return (uint)(Integers.PopCount(x) & 1); } internal static void SetBitInWordArray(uint[] array, int bitNumber, uint val) { SetBit(array, bitNumber, val); } internal static uint GetBitFromWordArray(uint[] array, int bitNumber) { return GetBit(array, bitNumber); } internal static byte GetBit(byte[] array, int bitNumber) { int num = bitNumber >> 3; int num2 = (bitNumber & 7) ^ 7; return (byte)((array[num] >> num2) & 1); } internal static byte GetCrumbAligned(byte[] array, int crumbNumber) { int num = crumbNumber >> 2; int num2 = ((crumbNumber << 1) & 6) ^ 6; uint num3 = (uint)array[num] >> num2; return (byte)(((num3 & 1) << 1) | ((num3 & 2) >> 1)); } internal static uint GetBit(uint word, int bitNumber) { int num = bitNumber ^ 7; return (word >> num) & 1; } internal static uint GetBit(uint[] array, int bitNumber) { int num = bitNumber >> 5; int num2 = (bitNumber & 31) ^ 7; return (array[num] >> num2) & 1; } internal static void SetBit(byte[] array, int bitNumber, byte val) { int num = bitNumber >> 3; int num2 = (bitNumber & 7) ^ 7; uint num3 = array[num]; num3 = (uint)((int)num3 & ~(1 << num2)); num3 = (uint)((int)num3 | (val << num2)); array[num] = (byte)num3; } internal static uint SetBit(uint word, int bitNumber, uint bit) { int num = bitNumber ^ 7; word = (uint)((int)word & ~(1 << num)); word |= bit << num; return word; } internal static void SetBit(uint[] array, int bitNumber, uint val) { int num = bitNumber >> 5; int num2 = (bitNumber & 31) ^ 7; uint num3 = array[num]; num3 = (uint)((int)num3 & ~(1 << num2)); num3 = (array[num] = (num3 | (val << num2))); } internal static void ZeroTrailingBits(uint[] data, int bitLength) { if ((bitLength & 31) != 0) data[bitLength >> 5] &= GetTrailingBitsMask(bitLength); } internal static uint GetTrailingBitsMask(int bitLength) { int num = bitLength & -8; uint num2 = (uint)(~(-1 << num)); int num3 = bitLength & 7; if (num3 != 0) num2 ^= ((65280 >> num3) & 255) << num; return num2; } } }