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