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

Utils

class Utils
using Org.BouncyCastle.Crypto.Utilities; using System; namespace Org.BouncyCastle.Pqc.Crypto.Hqc { internal class Utils { internal static void ResizeArray(long[] output, int sizeOutBits, long[] input, int sizeInBits, int n1n2ByteSize, int n1n2Byte64Size) { long num = 9223372036854775807; int num2 = 0; if (sizeOutBits < sizeInBits) { if (sizeOutBits % 64 != 0) num2 = 64 - sizeOutBits % 64; Array.Copy(input, 0, output, 0, n1n2ByteSize); for (int i = 0; i < num2; i++) { output[n1n2Byte64Size - 1] &= num >> i; } } else Array.Copy(input, 0, output, 0, (sizeInBits + 7) / 8); } internal static void FromLongArrayToByteArray(byte[] output, long[] input) { int num = output.Length / 8; for (int i = 0; i != num; i++) { Pack.UInt64_To_LE((ulong)input[i], output, i * 8); } if (output.Length % 8 != 0) { int num2 = num * 8; int num3 = 0; while (num2 < output.Length) { output[num2++] = (byte)(input[num] >> num3++ * 8); } } } internal static long BitMask(ulong a, ulong b) { uint num = (uint)(a % b); return (1 << (int)num) - 1; } internal static void FromByteArrayToLongArray(long[] output, byte[] input) { byte[] array = input; if (input.Length % 8 != 0) { array = new byte[(input.Length + 7) / 8 * 8]; Array.Copy(input, 0, array, 0, input.Length); } int num = 0; for (int i = 0; i < output.Length; i++) { output[i] = (long)Pack.LE_To_UInt64(array, num); num += 8; } } internal static void FromByteArrayToByte16Array(int[] output, byte[] input) { byte[] array = input; if (input.Length % 2 != 0) { array = new byte[(input.Length + 1) / 2 * 2]; Array.Copy(input, 0, array, 0, input.Length); } int num = 0; for (int i = 0; i < output.Length; i++) { output[i] = Pack.LE_To_UInt16(array, num); num += 2; } } internal static void FromByte32ArrayToLongArray(long[] output, int[] input) { for (int i = 0; i != input.Length; i += 2) { output[i / 2] = (uint)input[i]; output[i / 2] |= (long)input[i + 1] << 32; } } internal static void FromByte16ArrayToULongArray(ulong[] output, ushort[] input) { for (int i = 0; i != input.Length; i += 4) { output[i / 4] = input[i]; output[i / 4] |= (ulong)input[i + 1] << 16; output[i / 4] |= (ulong)input[i + 2] << 32; output[i / 4] |= (ulong)input[i + 3] << 48; } } internal static void FromLongArrayToByte32Array(int[] output, long[] input) { for (int i = 0; i != input.Length; i++) { output[2 * i] = (int)input[i]; output[2 * i + 1] = (int)(input[i] >> 32); } } internal static void CopyBytes(int[] src, int offsetSrc, int[] dst, int offsetDst, int lengthBytes) { Array.Copy(src, offsetSrc, dst, offsetDst, lengthBytes / 2); } internal static int GetByteSizeFromBitSize(int size) { return (size + 7) / 8; } internal static int GetByte64SizeFromBitSize(int size) { return (size + 63) / 64; } internal static int ToUnsigned8bits(int a) { return a & 255; } internal static int ToUnsigned16Bits(int a) { return a & 65535; } internal static void XorULongToByte16Array(ushort[] output, int outOff, ulong input) { output[outOff] ^= (ushort)input; output[outOff + 1] ^= (ushort)(input >> 16); output[outOff + 2] ^= (ushort)(input >> 32); output[outOff + 3] ^= (ushort)(input >> 48); } } }