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

TbcPadding

A padder that adds Trailing-Bit-Compliment padding to a block.
using Org.BouncyCastle.Security; using System; namespace Org.BouncyCastle.Crypto.Paddings { public class TbcPadding : IBlockCipherPadding { public string PaddingName => "TBC"; public virtual void Init(SecureRandom random) { } public virtual int AddPadding(byte[] input, int inOff) { int result = input.Length - inOff; byte b = (byte)((((inOff > 0) ? input[inOff - 1] : input[input.Length - 1]) & 1) - 1); while (inOff < input.Length) { input[inOff++] = b; } return result; } public virtual int AddPadding(Span<byte> block, int position) { byte value = (byte)((((position > 0) ? block[position - 1] : block[block.Length - 1]) & 1) - 1); Span<byte> span = block.Slice(position, block.Length - position); span.Fill(value); return span.Length; } public virtual int PadCount(byte[] input) { int num = input.Length; int num2 = input[--num]; int num3 = 1; int num4 = -1; while (--num >= 0) { int num5 = (input[num] ^ num2) - 1 >> 31; num4 &= num5; num3 -= num4; } return num3; } public virtual int PadCount(ReadOnlySpan<byte> block) { int length = block.Length; int num = block[--length]; int num2 = 1; int num3 = -1; while (--length >= 0) { int num4 = (block[length] ^ num) - 1 >> 31; num3 &= num4; num2 -= num3; } return num2; } } }