FalconCodec
class FalconCodec
namespace Org.BouncyCastle.Pqc.Crypto.Falcon
{
internal class FalconCodec
{
internal byte[] max_fg_bits = new byte[11] {
0,
8,
8,
8,
8,
8,
7,
7,
6,
6,
5
};
internal byte[] max_FG_bits = new byte[11] {
0,
8,
8,
8,
8,
8,
8,
8,
8,
8,
8
};
internal byte[] max_sig_bits = new byte[11] {
0,
10,
11,
11,
12,
12,
12,
12,
12,
12,
12
};
internal FalconCodec()
{
}
internal int modq_encode(byte[] outarrsrc, int outarr, int max_out_len, ushort[] xsrc, int x, uint logn)
{
int num = 1 << (int)logn;
for (int i = 0; i < num; i++) {
if (xsrc[x + i] >= 12289)
return 0;
}
int num2 = num * 14 + 7 >> 3;
if (outarrsrc == null)
return num2;
if (num2 > max_out_len)
return 0;
int num3 = outarr;
uint num4 = 0;
int num5 = 0;
for (int i = 0; i < num; i++) {
num4 = ((num4 << 14) | xsrc[x + i]);
num5 += 14;
while (num5 >= 8) {
num5 -= 8;
outarrsrc[num3++] = (byte)(num4 >> num5);
}
}
if (num5 > 0)
outarrsrc[num3] = (byte)(num4 << 8 - num5);
return num2;
}
internal int modq_decode(ushort[] xsrc, int x, uint logn, byte[] inarrsrc, int inarr, int max_in_len)
{
int num = 1 << (int)logn;
int num2 = num * 14 + 7 >> 3;
if (num2 > max_in_len)
return 0;
int num3 = inarr;
uint num4 = 0;
int num5 = 0;
int num6 = 0;
while (num6 < num) {
num4 = ((num4 << 8) | inarrsrc[num3++]);
num5 += 8;
if (num5 >= 14) {
num5 -= 14;
uint num8 = (num4 >> num5) & 16383;
if (num8 >= 12289)
return 0;
xsrc[x + num6] = (ushort)num8;
num6++;
}
}
if (((int)num4 & ((1 << num5) - 1)) != 0)
return 0;
return num2;
}
internal int trim_i16_encode(byte[] outarrsrc, int outarr, int max_out_len, short[] xsrc, int x, uint logn, uint bits)
{
int num = 1 << (int)logn;
int num2 = (1 << (int)(bits - 1)) - 1;
int num3 = -num2;
for (int i = 0; i < num; i++) {
if (xsrc[x + i] < num3 || xsrc[x + i] > num2)
return 0;
}
int num4 = (int)(num * bits + 7) >> 3;
if (outarrsrc == null)
return num4;
if (num4 > max_out_len)
return 0;
int num5 = outarr;
uint num6 = 0;
uint num7 = 0;
uint num8 = (uint)((1 << (int)bits) - 1);
for (int i = 0; i < num; i++) {
num6 = ((num6 << (int)bits) | ((ushort)xsrc[x + i] & num8));
num7 += bits;
while (num7 >= 8) {
num7 -= 8;
outarrsrc[num5++] = (byte)(num6 >> (int)num7);
}
}
if (num7 != 0)
outarrsrc[num5++] = (byte)(num6 << (int)(8 - num7));
return num4;
}
internal int trim_i16_decode(short[] xsrc, int x, uint logn, uint bits, byte[] inarrsrc, int inarr, int max_in_len)
{
int num = 1 << (int)logn;
int num2 = (int)(num * bits + 7) >> 3;
if (num2 > max_in_len)
return 0;
int num3 = inarr;
int num4 = 0;
uint num5 = 0;
uint num6 = 0;
uint num7 = (uint)((1 << (int)bits) - 1);
uint num8 = (uint)(1 << (int)(bits - 1));
while (num4 < num) {
num5 = ((num5 << 8) | inarrsrc[num3++]);
num6 += 8;
while (num6 >= bits && num4 < num) {
num6 -= bits;
uint num10 = (num5 >> (int)num6) & num7;
num10 = (uint)(num10 | (0 - (num10 & num8)));
num10 = (uint)((int)num10 | (int)(0 - (num10 & num8)));
if (num10 == 0 - num8)
return 0;
num10 = (uint)((int)num10 | (int)(0 - (num10 & num8)));
xsrc[x + num4] = (short)num10;
num4++;
}
}
if (((int)num5 & ((1 << (int)num6) - 1)) != 0)
return 0;
return num2;
}
internal int trim_i8_encode(byte[] outarrsrc, int outarr, int max_out_len, sbyte[] xsrc, int x, uint logn, uint bits)
{
int num = 1 << (int)logn;
int num2 = (1 << (int)(bits - 1)) - 1;
int num3 = -num2;
for (int i = 0; i < num; i++) {
if (xsrc[x + i] < num3 || xsrc[x + i] > num2)
return 0;
}
int num4 = (int)(num * bits + 7) >> 3;
if (outarrsrc == null)
return num4;
if (num4 > max_out_len)
return 0;
int num5 = outarr;
uint num6 = 0;
uint num7 = 0;
uint num8 = (uint)((1 << (int)bits) - 1);
for (int i = 0; i < num; i++) {
num6 = ((num6 << (int)bits) | ((byte)xsrc[x + i] & num8));
num7 += bits;
while (num7 >= 8) {
num7 -= 8;
outarrsrc[num5++] = (byte)(num6 >> (int)num7);
}
}
if (num7 != 0)
outarrsrc[num5++] = (byte)(num6 << (int)(8 - num7));
return num4;
}
internal int trim_i8_decode(sbyte[] xsrc, int x, uint logn, uint bits, byte[] inarrsrc, int inarr, int max_in_len)
{
int num = 1 << (int)logn;
int num2 = (int)(num * bits + 7) >> 3;
if (num2 > max_in_len)
return 0;
int num3 = inarr;
int num4 = 0;
uint num5 = 0;
uint num6 = 0;
uint num7 = (uint)((1 << (int)bits) - 1);
uint num8 = (uint)(1 << (int)(bits - 1));
while (num4 < num) {
num5 = ((num5 << 8) | inarrsrc[num3++]);
num6 += 8;
while (num6 >= bits && num4 < num) {
num6 -= bits;
uint num10 = (num5 >> (int)num6) & num7;
num10 = (uint)((int)num10 | (int)(0 - (num10 & num8)));
if (num10 == 0 - num8)
return 0;
xsrc[x + num4] = (sbyte)num10;
num4++;
}
}
if (((int)num5 & ((1 << (int)num6) - 1)) != 0)
return 0;
return num2;
}
internal int comp_encode(byte[] outarrsrc, int outarr, int max_out_len, short[] xsrc, int x, uint logn)
{
int num = 1 << (int)logn;
for (int i = 0; i < num; i++) {
if (xsrc[x + i] < -2047 || xsrc[x + i] > 2047)
return 0;
}
uint num2 = 0;
uint num3 = 0;
int num4 = 0;
for (int i = 0; i < num; i++) {
num2 <<= 1;
int num5 = xsrc[x + i];
if (num5 < 0) {
num5 = -num5;
num2 |= 1;
}
uint num6 = (uint)num5;
num2 <<= 7;
num2 |= (num6 & 127);
num6 >>= 7;
num3 += 8;
num2 <<= (int)(num6 + 1);
num2 |= 1;
num3 += num6 + 1;
while (num3 >= 8) {
num3 -= 8;
if (outarrsrc != null) {
if (num4 >= max_out_len)
return 0;
outarrsrc[outarr + num4] = (byte)(num2 >> (int)num3);
}
num4++;
}
}
if (num3 != 0) {
if (outarrsrc != null) {
if (num4 >= max_out_len)
return 0;
outarrsrc[outarr + num4] = (byte)(num2 << (int)(8 - num3));
}
num4++;
}
return num4;
}
internal int comp_decode(short[] xsrc, int x, uint logn, byte[] inarrsrc, int inarr, int max_in_len)
{
int num = 1 << (int)logn;
uint num2 = 0;
uint num3 = 0;
int num4 = 0;
for (int i = 0; i < num; i++) {
if (num4 >= max_in_len)
return 0;
num2 = ((num2 << 8) | inarrsrc[inarr + num4]);
num4++;
uint num5 = num2 >> (int)num3;
uint num6 = num5 & 128;
uint num7 = num5 & 127;
while (true) {
if (num3 == 0) {
if (num4 >= max_in_len)
return 0;
num2 = ((num2 << 8) | inarrsrc[inarr + num4]);
num4++;
num3 = 8;
}
num3--;
if (((num2 >> (int)num3) & 1) != 0)
break;
num7 += 128;
if (num7 > 2047)
return 0;
}
if (num6 != 0 && num7 == 0)
return 0;
xsrc[x + i] = (short)((num6 != 0) ? (0 - num7) : num7);
}
if (((int)num2 & ((1 << (int)num3) - 1)) != 0)
return 0;
return num4;
}
}
}