AesEngine_X86
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Runtime.Intrinsics;
using Org.BouncyCastle.Runtime.Intrinsics.X86;
using Org.BouncyCastle.Utilities;
using System;
using System.Buffers.Binary;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.X86;
namespace Org.BouncyCastle.Crypto.Engines
{
public struct AesEngine_X86 : IBlockCipher
{
private enum Mode
{
DEC_128,
DEC_192,
DEC_256,
ENC_128,
ENC_192,
ENC_256,
UNINITIALIZED
}
private Vector128<byte>[] m_roundKeys;
private Mode m_mode;
public static bool IsSupported => Org.BouncyCastle.Runtime.Intrinsics.X86.Aes.IsEnabled;
public string AlgorithmName => "AES";
private unsafe static Vector128<byte>[] CreateRoundKeys(ReadOnlySpan<byte> key, bool forEncryption)
{
Vector128<byte>[] array;
switch (key.Length) {
case 16: {
byte* intPtr = stackalloc byte[10];
memcpy(intPtr, ref global::<PrivateImplementationDetails>.30EBF374C7BC4564E7437F65ECBFAC4121B61C40947F2EC471D1B7FC3B16F595, 10);
ReadOnlySpan<byte> readOnlySpan = new Span<byte>(intPtr, 10);
array = new Vector128<byte>[11];
Vector128<byte> vector4 = array[0] = Load128(key.Slice(0, 16));
int num2 = 0;
while (num2 < 10) {
Vector128<byte> left3 = System.Runtime.Intrinsics.X86.Sse2.Shuffle(System.Runtime.Intrinsics.X86.Aes.KeygenAssist(vector4, readOnlySpan[num2++]).AsInt32(), byte.MaxValue).AsByte();
vector4 = System.Runtime.Intrinsics.X86.Sse2.Xor(vector4, System.Runtime.Intrinsics.X86.Sse2.ShiftLeftLogical128BitLane(vector4, 8));
vector4 = (array[num2] = System.Runtime.Intrinsics.X86.Sse2.Xor(System.Runtime.Intrinsics.X86.Sse2.Xor(left3, vector4), System.Runtime.Intrinsics.X86.Sse2.ShiftLeftLogical128BitLane(vector4, 4)));
}
break;
}
case 24: {
array = new Vector128<byte>[13];
Vector128<byte> vector5 = Load128(key.Slice(0, 16));
Vector128<byte> vector6 = Load64(key.Slice(16, 8)).ToVector128();
array[0] = vector5;
byte b2 = 1;
int num4 = 0;
while (true) {
Vector128<byte> vector7 = System.Runtime.Intrinsics.X86.Aes.KeygenAssist(vector6, b2);
b2 = (byte)(b2 << 1);
Vector128<byte> left4 = System.Runtime.Intrinsics.X86.Sse2.Shuffle(vector7.AsInt32(), 85).AsByte();
vector5 = System.Runtime.Intrinsics.X86.Sse2.Xor(vector5, System.Runtime.Intrinsics.X86.Sse2.ShiftLeftLogical128BitLane(vector5, 8));
vector5 = System.Runtime.Intrinsics.X86.Sse2.Xor(System.Runtime.Intrinsics.X86.Sse2.Xor(left4, vector5), System.Runtime.Intrinsics.X86.Sse2.ShiftLeftLogical128BitLane(vector5, 4));
array[++num4] = System.Runtime.Intrinsics.X86.Sse2.Xor(vector6, System.Runtime.Intrinsics.X86.Sse2.ShiftLeftLogical128BitLane(vector5, 8));
Vector128<byte> vector8 = System.Runtime.Intrinsics.X86.Sse2.Xor(vector6, System.Runtime.Intrinsics.X86.Sse2.ShiftRightLogical128BitLane(vector5, 12));
vector8 = System.Runtime.Intrinsics.X86.Sse2.Xor(vector8, System.Runtime.Intrinsics.X86.Sse2.ShiftLeftLogical128BitLane(vector8, 4));
array[++num4] = System.Runtime.Intrinsics.X86.Sse2.Xor(System.Runtime.Intrinsics.X86.Sse2.ShiftRightLogical128BitLane(vector5, 8), System.Runtime.Intrinsics.X86.Sse2.ShiftLeftLogical128BitLane(vector8, 8));
Vector128<byte> vector9 = System.Runtime.Intrinsics.X86.Aes.KeygenAssist(vector8, b2);
b2 = (byte)(b2 << 1);
Vector128<byte> left5 = System.Runtime.Intrinsics.X86.Sse2.Shuffle(vector9.AsInt32(), 85).AsByte();
vector5 = System.Runtime.Intrinsics.X86.Sse2.Xor(vector5, System.Runtime.Intrinsics.X86.Sse2.ShiftLeftLogical128BitLane(vector5, 8));
vector5 = System.Runtime.Intrinsics.X86.Sse2.Xor(System.Runtime.Intrinsics.X86.Sse2.Xor(left5, vector5), System.Runtime.Intrinsics.X86.Sse2.ShiftLeftLogical128BitLane(vector5, 4));
array[++num4] = vector5;
if (num4 == 12)
break;
vector6 = System.Runtime.Intrinsics.X86.Sse2.Xor(vector8, System.Runtime.Intrinsics.X86.Sse2.ShiftRightLogical128BitLane(vector5, 12));
vector6 = System.Runtime.Intrinsics.X86.Sse2.Xor(vector6, System.Runtime.Intrinsics.X86.Sse2.ShiftLeftLogical128BitLane(vector6, 4));
vector6 = vector6.WithUpper(Vector64<byte>.Zero);
}
break;
}
case 32: {
array = new Vector128<byte>[15];
Vector128<byte> vector = Load128(key.Slice(0, 16));
Vector128<byte> vector2 = Load128(key.Slice(16, 16));
array[0] = vector;
array[1] = vector2;
byte b = 1;
int num = 1;
while (true) {
Vector128<byte> vector3 = System.Runtime.Intrinsics.X86.Aes.KeygenAssist(vector2, b);
b = (byte)(b << 1);
Vector128<byte> left = System.Runtime.Intrinsics.X86.Sse2.Shuffle(vector3.AsInt32(), byte.MaxValue).AsByte();
vector = System.Runtime.Intrinsics.X86.Sse2.Xor(vector, System.Runtime.Intrinsics.X86.Sse2.ShiftLeftLogical128BitLane(vector, 8));
vector = System.Runtime.Intrinsics.X86.Sse2.Xor(System.Runtime.Intrinsics.X86.Sse2.Xor(left, vector), System.Runtime.Intrinsics.X86.Sse2.ShiftLeftLogical128BitLane(vector, 4));
array[++num] = vector;
if (num == 14)
break;
Vector128<byte> left2 = System.Runtime.Intrinsics.X86.Sse2.Shuffle(System.Runtime.Intrinsics.X86.Aes.KeygenAssist(vector, 0).AsInt32(), 170).AsByte();
vector2 = System.Runtime.Intrinsics.X86.Sse2.Xor(vector2, System.Runtime.Intrinsics.X86.Sse2.ShiftLeftLogical128BitLane(vector2, 8));
vector2 = System.Runtime.Intrinsics.X86.Sse2.Xor(System.Runtime.Intrinsics.X86.Sse2.Xor(left2, vector2), System.Runtime.Intrinsics.X86.Sse2.ShiftLeftLogical128BitLane(vector2, 4));
array[++num] = vector2;
}
break;
}
default:
throw new ArgumentException("Key length not 128/192/256 bits.");
}
if (!forEncryption) {
int i = 1;
for (int num5 = array.Length - 1; i < num5; i++) {
array[i] = System.Runtime.Intrinsics.X86.Aes.InverseMixColumns(array[i]);
}
Array.Reverse(array);
}
return array;
}
public AesEngine_X86()
{
m_roundKeys = null;
m_mode = Mode.UNINITIALIZED;
if (!IsSupported)
throw new PlatformNotSupportedException("AesEngine_X86");
}
public int GetBlockSize()
{
return 16;
}
public void Init(bool forEncryption, ICipherParameters parameters)
{
KeyParameter keyParameter = parameters as KeyParameter;
if (keyParameter == null) {
ArgumentNullException.ThrowIfNull(parameters, "parameters");
throw new ArgumentException("invalid type: " + Platform.GetTypeName(parameters), "parameters");
}
m_roundKeys = CreateRoundKeys(keyParameter.Key, forEncryption);
if (m_roundKeys.Length == 11)
m_mode = (forEncryption ? Mode.ENC_128 : Mode.DEC_128);
else if (m_roundKeys.Length == 13) {
m_mode = ((!forEncryption) ? Mode.DEC_192 : Mode.ENC_192);
} else {
m_mode = (forEncryption ? Mode.ENC_256 : Mode.DEC_256);
}
}
public int ProcessBlock(byte[] inBuf, int inOff, byte[] outBuf, int outOff)
{
Check.DataLength(inBuf, inOff, 16, "input buffer too short");
Check.OutputLength(outBuf, outOff, 16, "output buffer too short");
Vector128<byte> state = Load128(inBuf.AsSpan(inOff, 16));
ImplRounds(ref state);
Store128(state, outBuf.AsSpan(outOff, 16));
return 16;
}
public int ProcessBlock(ReadOnlySpan<byte> input, Span<byte> output)
{
Check.DataLength(input, 16, "input buffer too short");
Check.OutputLength(output, 16, "output buffer too short");
Vector128<byte> state = Load128(input.Slice(0, 16));
ImplRounds(ref state);
Store128(state, output.Slice(0, 16));
return 16;
}
public int ProcessFourBlocks(ReadOnlySpan<byte> input, Span<byte> output)
{
Check.DataLength(input, 64, "input buffer too short");
Check.OutputLength(output, 64, "output buffer too short");
Vector128<byte> s = Load128(input.Slice(0, 16));
Vector128<byte> s2 = Load128(input.Slice(16, 16));
Vector128<byte> s3 = Load128(input.Slice(32, 16));
Vector128<byte> s4 = Load128(input.Slice(48, 16));
ImplRounds(ref s, ref s2, ref s3, ref s4);
Store128(s, output.Slice(0, 16));
Store128(s2, output.Slice(16, 16));
Store128(s3, output.Slice(32, 16));
Store128(s4, output.Slice(48, 16));
return 64;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void ImplRounds(ref Vector128<byte> state)
{
switch (m_mode) {
case Mode.DEC_128:
Decrypt128(m_roundKeys, ref state);
break;
case Mode.DEC_192:
Decrypt192(m_roundKeys, ref state);
break;
case Mode.DEC_256:
Decrypt256(m_roundKeys, ref state);
break;
case Mode.ENC_128:
Encrypt128(m_roundKeys, ref state);
break;
case Mode.ENC_192:
Encrypt192(m_roundKeys, ref state);
break;
case Mode.ENC_256:
Encrypt256(m_roundKeys, ref state);
break;
default:
throw new InvalidOperationException("AesEngine_X86 not initialised");
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void ImplRounds(ref Vector128<byte> s1, ref Vector128<byte> s2, ref Vector128<byte> s3, ref Vector128<byte> s4)
{
switch (m_mode) {
case Mode.DEC_128:
DecryptFour128(m_roundKeys, ref s1, ref s2, ref s3, ref s4);
break;
case Mode.DEC_192:
DecryptFour192(m_roundKeys, ref s1, ref s2, ref s3, ref s4);
break;
case Mode.DEC_256:
DecryptFour256(m_roundKeys, ref s1, ref s2, ref s3, ref s4);
break;
case Mode.ENC_128:
EncryptFour128(m_roundKeys, ref s1, ref s2, ref s3, ref s4);
break;
case Mode.ENC_192:
EncryptFour192(m_roundKeys, ref s1, ref s2, ref s3, ref s4);
break;
case Mode.ENC_256:
EncryptFour256(m_roundKeys, ref s1, ref s2, ref s3, ref s4);
break;
default:
throw new InvalidOperationException("AesEngine_X86 not initialised");
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void Decrypt128(Vector128<byte>[] roundKeys, ref Vector128<byte> state)
{
ref Vector128<byte> reference;
reference = ref roundKeys[10];
Vector128<byte> value = System.Runtime.Intrinsics.X86.Sse2.Xor(state, roundKeys[0]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[1]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[2]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[3]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[4]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[5]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[6]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[7]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[8]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[9]);
state = System.Runtime.Intrinsics.X86.Aes.DecryptLast(value, roundKeys[10]);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void Decrypt192(Vector128<byte>[] roundKeys, ref Vector128<byte> state)
{
ref Vector128<byte> reference;
reference = ref roundKeys[12];
Vector128<byte> value = System.Runtime.Intrinsics.X86.Sse2.Xor(state, roundKeys[0]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[1]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[2]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[3]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[4]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[5]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[6]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[7]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[8]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[9]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[10]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[11]);
state = System.Runtime.Intrinsics.X86.Aes.DecryptLast(value, roundKeys[12]);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void Decrypt256(Vector128<byte>[] roundKeys, ref Vector128<byte> state)
{
ref Vector128<byte> reference;
reference = ref roundKeys[14];
Vector128<byte> value = System.Runtime.Intrinsics.X86.Sse2.Xor(state, roundKeys[0]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[1]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[2]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[3]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[4]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[5]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[6]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[7]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[8]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[9]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[10]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[11]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[12]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, roundKeys[13]);
state = System.Runtime.Intrinsics.X86.Aes.DecryptLast(value, roundKeys[14]);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void DecryptFour128(Vector128<byte>[] rk, ref Vector128<byte> s1, ref Vector128<byte> s2, ref Vector128<byte> s3, ref Vector128<byte> s4)
{
ref Vector128<byte> reference;
reference = ref rk[10];
Vector128<byte> value = System.Runtime.Intrinsics.X86.Sse2.Xor(s1, rk[0]);
Vector128<byte> value2 = System.Runtime.Intrinsics.X86.Sse2.Xor(s2, rk[0]);
Vector128<byte> value3 = System.Runtime.Intrinsics.X86.Sse2.Xor(s3, rk[0]);
Vector128<byte> value4 = System.Runtime.Intrinsics.X86.Sse2.Xor(s4, rk[0]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[1]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[1]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[1]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[1]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[2]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[2]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[2]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[2]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[3]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[3]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[3]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[3]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[4]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[4]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[4]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[4]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[5]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[5]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[5]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[5]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[6]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[6]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[6]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[6]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[7]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[7]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[7]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[7]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[8]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[8]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[8]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[8]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[9]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[9]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[9]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[9]);
s1 = System.Runtime.Intrinsics.X86.Aes.DecryptLast(value, rk[10]);
s2 = System.Runtime.Intrinsics.X86.Aes.DecryptLast(value2, rk[10]);
s3 = System.Runtime.Intrinsics.X86.Aes.DecryptLast(value3, rk[10]);
s4 = System.Runtime.Intrinsics.X86.Aes.DecryptLast(value4, rk[10]);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void DecryptFour192(Vector128<byte>[] rk, ref Vector128<byte> s1, ref Vector128<byte> s2, ref Vector128<byte> s3, ref Vector128<byte> s4)
{
ref Vector128<byte> reference;
reference = ref rk[12];
Vector128<byte> value = System.Runtime.Intrinsics.X86.Sse2.Xor(s1, rk[0]);
Vector128<byte> value2 = System.Runtime.Intrinsics.X86.Sse2.Xor(s2, rk[0]);
Vector128<byte> value3 = System.Runtime.Intrinsics.X86.Sse2.Xor(s3, rk[0]);
Vector128<byte> value4 = System.Runtime.Intrinsics.X86.Sse2.Xor(s4, rk[0]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[1]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[1]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[1]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[1]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[2]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[2]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[2]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[2]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[3]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[3]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[3]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[3]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[4]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[4]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[4]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[4]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[5]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[5]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[5]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[5]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[6]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[6]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[6]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[6]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[7]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[7]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[7]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[7]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[8]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[8]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[8]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[8]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[9]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[9]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[9]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[9]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[10]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[10]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[10]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[10]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[11]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[11]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[11]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[11]);
s1 = System.Runtime.Intrinsics.X86.Aes.DecryptLast(value, rk[12]);
s2 = System.Runtime.Intrinsics.X86.Aes.DecryptLast(value2, rk[12]);
s3 = System.Runtime.Intrinsics.X86.Aes.DecryptLast(value3, rk[12]);
s4 = System.Runtime.Intrinsics.X86.Aes.DecryptLast(value4, rk[12]);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void DecryptFour256(Vector128<byte>[] rk, ref Vector128<byte> s1, ref Vector128<byte> s2, ref Vector128<byte> s3, ref Vector128<byte> s4)
{
ref Vector128<byte> reference;
reference = ref rk[14];
Vector128<byte> value = System.Runtime.Intrinsics.X86.Sse2.Xor(s1, rk[0]);
Vector128<byte> value2 = System.Runtime.Intrinsics.X86.Sse2.Xor(s2, rk[0]);
Vector128<byte> value3 = System.Runtime.Intrinsics.X86.Sse2.Xor(s3, rk[0]);
Vector128<byte> value4 = System.Runtime.Intrinsics.X86.Sse2.Xor(s4, rk[0]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[1]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[1]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[1]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[1]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[2]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[2]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[2]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[2]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[3]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[3]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[3]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[3]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[4]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[4]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[4]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[4]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[5]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[5]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[5]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[5]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[6]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[6]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[6]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[6]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[7]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[7]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[7]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[7]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[8]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[8]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[8]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[8]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[9]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[9]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[9]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[9]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[10]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[10]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[10]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[10]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[11]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[11]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[11]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[11]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[12]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[12]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[12]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[12]);
value = System.Runtime.Intrinsics.X86.Aes.Decrypt(value, rk[13]);
value2 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value2, rk[13]);
value3 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value3, rk[13]);
value4 = System.Runtime.Intrinsics.X86.Aes.Decrypt(value4, rk[13]);
s1 = System.Runtime.Intrinsics.X86.Aes.DecryptLast(value, rk[14]);
s2 = System.Runtime.Intrinsics.X86.Aes.DecryptLast(value2, rk[14]);
s3 = System.Runtime.Intrinsics.X86.Aes.DecryptLast(value3, rk[14]);
s4 = System.Runtime.Intrinsics.X86.Aes.DecryptLast(value4, rk[14]);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void Encrypt128(Vector128<byte>[] roundKeys, ref Vector128<byte> state)
{
ref Vector128<byte> reference;
reference = ref roundKeys[10];
Vector128<byte> value = System.Runtime.Intrinsics.X86.Sse2.Xor(state, roundKeys[0]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[1]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[2]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[3]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[4]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[5]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[6]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[7]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[8]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[9]);
state = System.Runtime.Intrinsics.X86.Aes.EncryptLast(value, roundKeys[10]);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void Encrypt192(Vector128<byte>[] roundKeys, ref Vector128<byte> state)
{
ref Vector128<byte> reference;
reference = ref roundKeys[12];
Vector128<byte> value = System.Runtime.Intrinsics.X86.Sse2.Xor(state, roundKeys[0]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[1]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[2]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[3]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[4]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[5]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[6]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[7]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[8]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[9]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[10]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[11]);
state = System.Runtime.Intrinsics.X86.Aes.EncryptLast(value, roundKeys[12]);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void Encrypt256(Vector128<byte>[] roundKeys, ref Vector128<byte> state)
{
ref Vector128<byte> reference;
reference = ref roundKeys[14];
Vector128<byte> value = System.Runtime.Intrinsics.X86.Sse2.Xor(state, roundKeys[0]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[1]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[2]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[3]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[4]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[5]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[6]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[7]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[8]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[9]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[10]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[11]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[12]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, roundKeys[13]);
state = System.Runtime.Intrinsics.X86.Aes.EncryptLast(value, roundKeys[14]);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void EncryptFour128(Vector128<byte>[] rk, ref Vector128<byte> s1, ref Vector128<byte> s2, ref Vector128<byte> s3, ref Vector128<byte> s4)
{
ref Vector128<byte> reference;
reference = ref rk[10];
Vector128<byte> value = System.Runtime.Intrinsics.X86.Sse2.Xor(s1, rk[0]);
Vector128<byte> value2 = System.Runtime.Intrinsics.X86.Sse2.Xor(s2, rk[0]);
Vector128<byte> value3 = System.Runtime.Intrinsics.X86.Sse2.Xor(s3, rk[0]);
Vector128<byte> value4 = System.Runtime.Intrinsics.X86.Sse2.Xor(s4, rk[0]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[1]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[1]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[1]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[1]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[2]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[2]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[2]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[2]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[3]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[3]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[3]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[3]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[4]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[4]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[4]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[4]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[5]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[5]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[5]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[5]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[6]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[6]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[6]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[6]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[7]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[7]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[7]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[7]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[8]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[8]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[8]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[8]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[9]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[9]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[9]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[9]);
s1 = System.Runtime.Intrinsics.X86.Aes.EncryptLast(value, rk[10]);
s2 = System.Runtime.Intrinsics.X86.Aes.EncryptLast(value2, rk[10]);
s3 = System.Runtime.Intrinsics.X86.Aes.EncryptLast(value3, rk[10]);
s4 = System.Runtime.Intrinsics.X86.Aes.EncryptLast(value4, rk[10]);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void EncryptFour192(Vector128<byte>[] rk, ref Vector128<byte> s1, ref Vector128<byte> s2, ref Vector128<byte> s3, ref Vector128<byte> s4)
{
ref Vector128<byte> reference;
reference = ref rk[12];
Vector128<byte> value = System.Runtime.Intrinsics.X86.Sse2.Xor(s1, rk[0]);
Vector128<byte> value2 = System.Runtime.Intrinsics.X86.Sse2.Xor(s2, rk[0]);
Vector128<byte> value3 = System.Runtime.Intrinsics.X86.Sse2.Xor(s3, rk[0]);
Vector128<byte> value4 = System.Runtime.Intrinsics.X86.Sse2.Xor(s4, rk[0]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[1]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[1]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[1]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[1]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[2]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[2]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[2]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[2]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[3]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[3]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[3]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[3]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[4]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[4]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[4]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[4]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[5]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[5]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[5]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[5]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[6]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[6]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[6]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[6]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[7]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[7]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[7]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[7]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[8]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[8]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[8]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[8]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[9]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[9]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[9]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[9]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[10]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[10]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[10]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[10]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[11]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[11]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[11]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[11]);
s1 = System.Runtime.Intrinsics.X86.Aes.EncryptLast(value, rk[12]);
s2 = System.Runtime.Intrinsics.X86.Aes.EncryptLast(value2, rk[12]);
s3 = System.Runtime.Intrinsics.X86.Aes.EncryptLast(value3, rk[12]);
s4 = System.Runtime.Intrinsics.X86.Aes.EncryptLast(value4, rk[12]);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void EncryptFour256(Vector128<byte>[] rk, ref Vector128<byte> s1, ref Vector128<byte> s2, ref Vector128<byte> s3, ref Vector128<byte> s4)
{
ref Vector128<byte> reference;
reference = ref rk[14];
Vector128<byte> value = System.Runtime.Intrinsics.X86.Sse2.Xor(s1, rk[0]);
Vector128<byte> value2 = System.Runtime.Intrinsics.X86.Sse2.Xor(s2, rk[0]);
Vector128<byte> value3 = System.Runtime.Intrinsics.X86.Sse2.Xor(s3, rk[0]);
Vector128<byte> value4 = System.Runtime.Intrinsics.X86.Sse2.Xor(s4, rk[0]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[1]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[1]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[1]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[1]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[2]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[2]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[2]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[2]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[3]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[3]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[3]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[3]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[4]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[4]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[4]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[4]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[5]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[5]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[5]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[5]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[6]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[6]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[6]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[6]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[7]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[7]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[7]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[7]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[8]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[8]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[8]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[8]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[9]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[9]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[9]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[9]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[10]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[10]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[10]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[10]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[11]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[11]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[11]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[11]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[12]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[12]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[12]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[12]);
value = System.Runtime.Intrinsics.X86.Aes.Encrypt(value, rk[13]);
value2 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value2, rk[13]);
value3 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value3, rk[13]);
value4 = System.Runtime.Intrinsics.X86.Aes.Encrypt(value4, rk[13]);
s1 = System.Runtime.Intrinsics.X86.Aes.EncryptLast(value, rk[14]);
s2 = System.Runtime.Intrinsics.X86.Aes.EncryptLast(value2, rk[14]);
s3 = System.Runtime.Intrinsics.X86.Aes.EncryptLast(value3, rk[14]);
s4 = System.Runtime.Intrinsics.X86.Aes.EncryptLast(value4, rk[14]);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static Vector128<byte> Load128(ReadOnlySpan<byte> t)
{
if (Vector.IsPackedLittleEndian)
return MemoryMarshal.Read<Vector128<byte>>(t);
return Vector128.Create(BinaryPrimitives.ReadUInt64LittleEndian(t.Slice(0, 8)), BinaryPrimitives.ReadUInt64LittleEndian(t.Slice(8, t.Length - 8))).AsByte();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static Vector64<byte> Load64(ReadOnlySpan<byte> t)
{
if (Vector.IsPackedLittleEndian)
return MemoryMarshal.Read<Vector64<byte>>(t);
return Vector64.Create(BinaryPrimitives.ReadUInt64LittleEndian(t.Slice(0, 8))).AsByte();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void Store128(Vector128<byte> s, Span<byte> t)
{
if (Vector.IsPackedLittleEndian)
MemoryMarshal.Write(t, ref s);
else {
Vector128<ulong> vector = s.AsUInt64();
BinaryPrimitives.WriteUInt64LittleEndian(t.Slice(0, 8), vector.GetElement(0));
BinaryPrimitives.WriteUInt64LittleEndian(t.Slice(8, t.Length - 8), vector.GetElement(1));
}
}
}
}