TnepresEngine
using Org.BouncyCastle.Crypto.Utilities;
using Org.BouncyCastle.Utilities;
using System;
namespace Org.BouncyCastle.Crypto.Engines
{
public sealed class TnepresEngine : SerpentEngineBase
{
public override string AlgorithmName => "Tnepres";
internal override int[] MakeWorkingKey(byte[] key)
{
int[] array = new int[16];
int num = 0;
int num2 = 0;
for (num = key.Length - 4; num > 0; num -= 4) {
array[num2++] = (int)Pack.BE_To_UInt32(key, num);
}
if (num != 0)
throw new ArgumentException("key must be a multiple of 4 bytes");
array[num2++] = (int)Pack.BE_To_UInt32(key, 0);
if (num2 < 8)
array[num2] = 1;
int num5 = 132;
int[] array2 = new int[num5];
for (int i = 8; i < 16; i++) {
array[i] = Integers.RotateLeft(array[i - 8] ^ array[i - 5] ^ array[i - 3] ^ array[i - 1] ^ -1640531527 ^ (i - 8), 11);
}
Array.Copy(array, 8, array2, 0, 8);
for (int j = 8; j < num5; j++) {
array2[j] = Integers.RotateLeft(array2[j - 8] ^ array2[j - 5] ^ array2[j - 3] ^ array2[j - 1] ^ -1640531527 ^ j, 11);
}
Sb3(array2[0], array2[1], array2[2], array2[3]);
array2[0] = X0;
array2[1] = X1;
array2[2] = X2;
array2[3] = X3;
Sb2(array2[4], array2[5], array2[6], array2[7]);
array2[4] = X0;
array2[5] = X1;
array2[6] = X2;
array2[7] = X3;
Sb1(array2[8], array2[9], array2[10], array2[11]);
array2[8] = X0;
array2[9] = X1;
array2[10] = X2;
array2[11] = X3;
Sb0(array2[12], array2[13], array2[14], array2[15]);
array2[12] = X0;
array2[13] = X1;
array2[14] = X2;
array2[15] = X3;
Sb7(array2[16], array2[17], array2[18], array2[19]);
array2[16] = X0;
array2[17] = X1;
array2[18] = X2;
array2[19] = X3;
Sb6(array2[20], array2[21], array2[22], array2[23]);
array2[20] = X0;
array2[21] = X1;
array2[22] = X2;
array2[23] = X3;
Sb5(array2[24], array2[25], array2[26], array2[27]);
array2[24] = X0;
array2[25] = X1;
array2[26] = X2;
array2[27] = X3;
Sb4(array2[28], array2[29], array2[30], array2[31]);
array2[28] = X0;
array2[29] = X1;
array2[30] = X2;
array2[31] = X3;
Sb3(array2[32], array2[33], array2[34], array2[35]);
array2[32] = X0;
array2[33] = X1;
array2[34] = X2;
array2[35] = X3;
Sb2(array2[36], array2[37], array2[38], array2[39]);
array2[36] = X0;
array2[37] = X1;
array2[38] = X2;
array2[39] = X3;
Sb1(array2[40], array2[41], array2[42], array2[43]);
array2[40] = X0;
array2[41] = X1;
array2[42] = X2;
array2[43] = X3;
Sb0(array2[44], array2[45], array2[46], array2[47]);
array2[44] = X0;
array2[45] = X1;
array2[46] = X2;
array2[47] = X3;
Sb7(array2[48], array2[49], array2[50], array2[51]);
array2[48] = X0;
array2[49] = X1;
array2[50] = X2;
array2[51] = X3;
Sb6(array2[52], array2[53], array2[54], array2[55]);
array2[52] = X0;
array2[53] = X1;
array2[54] = X2;
array2[55] = X3;
Sb5(array2[56], array2[57], array2[58], array2[59]);
array2[56] = X0;
array2[57] = X1;
array2[58] = X2;
array2[59] = X3;
Sb4(array2[60], array2[61], array2[62], array2[63]);
array2[60] = X0;
array2[61] = X1;
array2[62] = X2;
array2[63] = X3;
Sb3(array2[64], array2[65], array2[66], array2[67]);
array2[64] = X0;
array2[65] = X1;
array2[66] = X2;
array2[67] = X3;
Sb2(array2[68], array2[69], array2[70], array2[71]);
array2[68] = X0;
array2[69] = X1;
array2[70] = X2;
array2[71] = X3;
Sb1(array2[72], array2[73], array2[74], array2[75]);
array2[72] = X0;
array2[73] = X1;
array2[74] = X2;
array2[75] = X3;
Sb0(array2[76], array2[77], array2[78], array2[79]);
array2[76] = X0;
array2[77] = X1;
array2[78] = X2;
array2[79] = X3;
Sb7(array2[80], array2[81], array2[82], array2[83]);
array2[80] = X0;
array2[81] = X1;
array2[82] = X2;
array2[83] = X3;
Sb6(array2[84], array2[85], array2[86], array2[87]);
array2[84] = X0;
array2[85] = X1;
array2[86] = X2;
array2[87] = X3;
Sb5(array2[88], array2[89], array2[90], array2[91]);
array2[88] = X0;
array2[89] = X1;
array2[90] = X2;
array2[91] = X3;
Sb4(array2[92], array2[93], array2[94], array2[95]);
array2[92] = X0;
array2[93] = X1;
array2[94] = X2;
array2[95] = X3;
Sb3(array2[96], array2[97], array2[98], array2[99]);
array2[96] = X0;
array2[97] = X1;
array2[98] = X2;
array2[99] = X3;
Sb2(array2[100], array2[101], array2[102], array2[103]);
array2[100] = X0;
array2[101] = X1;
array2[102] = X2;
array2[103] = X3;
Sb1(array2[104], array2[105], array2[106], array2[107]);
array2[104] = X0;
array2[105] = X1;
array2[106] = X2;
array2[107] = X3;
Sb0(array2[108], array2[109], array2[110], array2[111]);
array2[108] = X0;
array2[109] = X1;
array2[110] = X2;
array2[111] = X3;
Sb7(array2[112], array2[113], array2[114], array2[115]);
array2[112] = X0;
array2[113] = X1;
array2[114] = X2;
array2[115] = X3;
Sb6(array2[116], array2[117], array2[118], array2[119]);
array2[116] = X0;
array2[117] = X1;
array2[118] = X2;
array2[119] = X3;
Sb5(array2[120], array2[121], array2[122], array2[123]);
array2[120] = X0;
array2[121] = X1;
array2[122] = X2;
array2[123] = X3;
Sb4(array2[124], array2[125], array2[126], array2[127]);
array2[124] = X0;
array2[125] = X1;
array2[126] = X2;
array2[127] = X3;
Sb3(array2[128], array2[129], array2[130], array2[131]);
array2[128] = X0;
array2[129] = X1;
array2[130] = X2;
array2[131] = X3;
return array2;
}
internal override void EncryptBlock(byte[] input, int inOff, byte[] output, int outOff)
{
X3 = (int)Pack.BE_To_UInt32(input, inOff);
X2 = (int)Pack.BE_To_UInt32(input, inOff + 4);
X1 = (int)Pack.BE_To_UInt32(input, inOff + 8);
X0 = (int)Pack.BE_To_UInt32(input, inOff + 12);
Sb0(wKey[0] ^ X0, wKey[1] ^ X1, wKey[2] ^ X2, wKey[3] ^ X3);
LT();
Sb1(wKey[4] ^ X0, wKey[5] ^ X1, wKey[6] ^ X2, wKey[7] ^ X3);
LT();
Sb2(wKey[8] ^ X0, wKey[9] ^ X1, wKey[10] ^ X2, wKey[11] ^ X3);
LT();
Sb3(wKey[12] ^ X0, wKey[13] ^ X1, wKey[14] ^ X2, wKey[15] ^ X3);
LT();
Sb4(wKey[16] ^ X0, wKey[17] ^ X1, wKey[18] ^ X2, wKey[19] ^ X3);
LT();
Sb5(wKey[20] ^ X0, wKey[21] ^ X1, wKey[22] ^ X2, wKey[23] ^ X3);
LT();
Sb6(wKey[24] ^ X0, wKey[25] ^ X1, wKey[26] ^ X2, wKey[27] ^ X3);
LT();
Sb7(wKey[28] ^ X0, wKey[29] ^ X1, wKey[30] ^ X2, wKey[31] ^ X3);
LT();
Sb0(wKey[32] ^ X0, wKey[33] ^ X1, wKey[34] ^ X2, wKey[35] ^ X3);
LT();
Sb1(wKey[36] ^ X0, wKey[37] ^ X1, wKey[38] ^ X2, wKey[39] ^ X3);
LT();
Sb2(wKey[40] ^ X0, wKey[41] ^ X1, wKey[42] ^ X2, wKey[43] ^ X3);
LT();
Sb3(wKey[44] ^ X0, wKey[45] ^ X1, wKey[46] ^ X2, wKey[47] ^ X3);
LT();
Sb4(wKey[48] ^ X0, wKey[49] ^ X1, wKey[50] ^ X2, wKey[51] ^ X3);
LT();
Sb5(wKey[52] ^ X0, wKey[53] ^ X1, wKey[54] ^ X2, wKey[55] ^ X3);
LT();
Sb6(wKey[56] ^ X0, wKey[57] ^ X1, wKey[58] ^ X2, wKey[59] ^ X3);
LT();
Sb7(wKey[60] ^ X0, wKey[61] ^ X1, wKey[62] ^ X2, wKey[63] ^ X3);
LT();
Sb0(wKey[64] ^ X0, wKey[65] ^ X1, wKey[66] ^ X2, wKey[67] ^ X3);
LT();
Sb1(wKey[68] ^ X0, wKey[69] ^ X1, wKey[70] ^ X2, wKey[71] ^ X3);
LT();
Sb2(wKey[72] ^ X0, wKey[73] ^ X1, wKey[74] ^ X2, wKey[75] ^ X3);
LT();
Sb3(wKey[76] ^ X0, wKey[77] ^ X1, wKey[78] ^ X2, wKey[79] ^ X3);
LT();
Sb4(wKey[80] ^ X0, wKey[81] ^ X1, wKey[82] ^ X2, wKey[83] ^ X3);
LT();
Sb5(wKey[84] ^ X0, wKey[85] ^ X1, wKey[86] ^ X2, wKey[87] ^ X3);
LT();
Sb6(wKey[88] ^ X0, wKey[89] ^ X1, wKey[90] ^ X2, wKey[91] ^ X3);
LT();
Sb7(wKey[92] ^ X0, wKey[93] ^ X1, wKey[94] ^ X2, wKey[95] ^ X3);
LT();
Sb0(wKey[96] ^ X0, wKey[97] ^ X1, wKey[98] ^ X2, wKey[99] ^ X3);
LT();
Sb1(wKey[100] ^ X0, wKey[101] ^ X1, wKey[102] ^ X2, wKey[103] ^ X3);
LT();
Sb2(wKey[104] ^ X0, wKey[105] ^ X1, wKey[106] ^ X2, wKey[107] ^ X3);
LT();
Sb3(wKey[108] ^ X0, wKey[109] ^ X1, wKey[110] ^ X2, wKey[111] ^ X3);
LT();
Sb4(wKey[112] ^ X0, wKey[113] ^ X1, wKey[114] ^ X2, wKey[115] ^ X3);
LT();
Sb5(wKey[116] ^ X0, wKey[117] ^ X1, wKey[118] ^ X2, wKey[119] ^ X3);
LT();
Sb6(wKey[120] ^ X0, wKey[121] ^ X1, wKey[122] ^ X2, wKey[123] ^ X3);
LT();
Sb7(wKey[124] ^ X0, wKey[125] ^ X1, wKey[126] ^ X2, wKey[127] ^ X3);
Pack.UInt32_To_BE((uint)(wKey[131] ^ X3), output, outOff);
Pack.UInt32_To_BE((uint)(wKey[130] ^ X2), output, outOff + 4);
Pack.UInt32_To_BE((uint)(wKey[129] ^ X1), output, outOff + 8);
Pack.UInt32_To_BE((uint)(wKey[128] ^ X0), output, outOff + 12);
}
internal override void DecryptBlock(byte[] input, int inOff, byte[] output, int outOff)
{
X3 = (wKey[131] ^ (int)Pack.BE_To_UInt32(input, inOff));
X2 = (wKey[130] ^ (int)Pack.BE_To_UInt32(input, inOff + 4));
X1 = (wKey[129] ^ (int)Pack.BE_To_UInt32(input, inOff + 8));
X0 = (wKey[128] ^ (int)Pack.BE_To_UInt32(input, inOff + 12));
Ib7(X0, X1, X2, X3);
X0 ^= wKey[124];
X1 ^= wKey[125];
X2 ^= wKey[126];
X3 ^= wKey[127];
InverseLT();
Ib6(X0, X1, X2, X3);
X0 ^= wKey[120];
X1 ^= wKey[121];
X2 ^= wKey[122];
X3 ^= wKey[123];
InverseLT();
Ib5(X0, X1, X2, X3);
X0 ^= wKey[116];
X1 ^= wKey[117];
X2 ^= wKey[118];
X3 ^= wKey[119];
InverseLT();
Ib4(X0, X1, X2, X3);
X0 ^= wKey[112];
X1 ^= wKey[113];
X2 ^= wKey[114];
X3 ^= wKey[115];
InverseLT();
Ib3(X0, X1, X2, X3);
X0 ^= wKey[108];
X1 ^= wKey[109];
X2 ^= wKey[110];
X3 ^= wKey[111];
InverseLT();
Ib2(X0, X1, X2, X3);
X0 ^= wKey[104];
X1 ^= wKey[105];
X2 ^= wKey[106];
X3 ^= wKey[107];
InverseLT();
Ib1(X0, X1, X2, X3);
X0 ^= wKey[100];
X1 ^= wKey[101];
X2 ^= wKey[102];
X3 ^= wKey[103];
InverseLT();
Ib0(X0, X1, X2, X3);
X0 ^= wKey[96];
X1 ^= wKey[97];
X2 ^= wKey[98];
X3 ^= wKey[99];
InverseLT();
Ib7(X0, X1, X2, X3);
X0 ^= wKey[92];
X1 ^= wKey[93];
X2 ^= wKey[94];
X3 ^= wKey[95];
InverseLT();
Ib6(X0, X1, X2, X3);
X0 ^= wKey[88];
X1 ^= wKey[89];
X2 ^= wKey[90];
X3 ^= wKey[91];
InverseLT();
Ib5(X0, X1, X2, X3);
X0 ^= wKey[84];
X1 ^= wKey[85];
X2 ^= wKey[86];
X3 ^= wKey[87];
InverseLT();
Ib4(X0, X1, X2, X3);
X0 ^= wKey[80];
X1 ^= wKey[81];
X2 ^= wKey[82];
X3 ^= wKey[83];
InverseLT();
Ib3(X0, X1, X2, X3);
X0 ^= wKey[76];
X1 ^= wKey[77];
X2 ^= wKey[78];
X3 ^= wKey[79];
InverseLT();
Ib2(X0, X1, X2, X3);
X0 ^= wKey[72];
X1 ^= wKey[73];
X2 ^= wKey[74];
X3 ^= wKey[75];
InverseLT();
Ib1(X0, X1, X2, X3);
X0 ^= wKey[68];
X1 ^= wKey[69];
X2 ^= wKey[70];
X3 ^= wKey[71];
InverseLT();
Ib0(X0, X1, X2, X3);
X0 ^= wKey[64];
X1 ^= wKey[65];
X2 ^= wKey[66];
X3 ^= wKey[67];
InverseLT();
Ib7(X0, X1, X2, X3);
X0 ^= wKey[60];
X1 ^= wKey[61];
X2 ^= wKey[62];
X3 ^= wKey[63];
InverseLT();
Ib6(X0, X1, X2, X3);
X0 ^= wKey[56];
X1 ^= wKey[57];
X2 ^= wKey[58];
X3 ^= wKey[59];
InverseLT();
Ib5(X0, X1, X2, X3);
X0 ^= wKey[52];
X1 ^= wKey[53];
X2 ^= wKey[54];
X3 ^= wKey[55];
InverseLT();
Ib4(X0, X1, X2, X3);
X0 ^= wKey[48];
X1 ^= wKey[49];
X2 ^= wKey[50];
X3 ^= wKey[51];
InverseLT();
Ib3(X0, X1, X2, X3);
X0 ^= wKey[44];
X1 ^= wKey[45];
X2 ^= wKey[46];
X3 ^= wKey[47];
InverseLT();
Ib2(X0, X1, X2, X3);
X0 ^= wKey[40];
X1 ^= wKey[41];
X2 ^= wKey[42];
X3 ^= wKey[43];
InverseLT();
Ib1(X0, X1, X2, X3);
X0 ^= wKey[36];
X1 ^= wKey[37];
X2 ^= wKey[38];
X3 ^= wKey[39];
InverseLT();
Ib0(X0, X1, X2, X3);
X0 ^= wKey[32];
X1 ^= wKey[33];
X2 ^= wKey[34];
X3 ^= wKey[35];
InverseLT();
Ib7(X0, X1, X2, X3);
X0 ^= wKey[28];
X1 ^= wKey[29];
X2 ^= wKey[30];
X3 ^= wKey[31];
InverseLT();
Ib6(X0, X1, X2, X3);
X0 ^= wKey[24];
X1 ^= wKey[25];
X2 ^= wKey[26];
X3 ^= wKey[27];
InverseLT();
Ib5(X0, X1, X2, X3);
X0 ^= wKey[20];
X1 ^= wKey[21];
X2 ^= wKey[22];
X3 ^= wKey[23];
InverseLT();
Ib4(X0, X1, X2, X3);
X0 ^= wKey[16];
X1 ^= wKey[17];
X2 ^= wKey[18];
X3 ^= wKey[19];
InverseLT();
Ib3(X0, X1, X2, X3);
X0 ^= wKey[12];
X1 ^= wKey[13];
X2 ^= wKey[14];
X3 ^= wKey[15];
InverseLT();
Ib2(X0, X1, X2, X3);
X0 ^= wKey[8];
X1 ^= wKey[9];
X2 ^= wKey[10];
X3 ^= wKey[11];
InverseLT();
Ib1(X0, X1, X2, X3);
X0 ^= wKey[4];
X1 ^= wKey[5];
X2 ^= wKey[6];
X3 ^= wKey[7];
InverseLT();
Ib0(X0, X1, X2, X3);
Pack.UInt32_To_BE((uint)(X3 ^ wKey[3]), output, outOff);
Pack.UInt32_To_BE((uint)(X2 ^ wKey[2]), output, outOff + 4);
Pack.UInt32_To_BE((uint)(X1 ^ wKey[1]), output, outOff + 8);
Pack.UInt32_To_BE((uint)(X0 ^ wKey[0]), output, outOff + 12);
}
}
}