Ameisen

Untitled

Jun 7th, 2022
1,445
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.34 KB | None | 0 0
  1.         Vector256<ulong> accumulator0 = Vector256.Create(Prime32.Prime2, Prime64.Prime0, Prime64.Prime1, Prime64.Prime2);
  2.         Vector256<ulong> accumulator1 = Vector256.Create(Prime64.Prime3, Prime32.Prime1, Prime64.Prime4, Prime32.Prime0);
  3.  
  4.         [MethodImpl(MethodImplOptions.AggressiveInlining)]
  5.         static ValueTuple<Vector256<ulong>, Vector256<ulong>> Pass(byte* data, byte* secret, in Vector256<ulong> accumulator0, in Vector256<ulong> accumulator1, uint offset) {
  6.             PrefetchNonTemporalNext(data + (offset * StripeLength) + 0x040);
  7.             PrefetchNonTemporalNext(data + (offset * StripeLength) + 0x080);
  8.  
  9.             byte* lData = data + (offset * StripeLength);
  10.             byte* lSecret = secret + (offset * 8u);
  11.  
  12.             var dataVec0 = *(Vector256<ulong>*)(lData + 0x00u);
  13.             var dataVec1 = *(Vector256<ulong>*)(lData + 0x20u);
  14.             var keyVec0 = *(Vector256<ulong>*)(lSecret + 0x00u);
  15.             var keyVec1 = *(Vector256<ulong>*)(lSecret + 0x20u);
  16.  
  17.             var dataKey0 = Avx2.Xor(dataVec0, keyVec0);
  18.             var dataKey1 = Avx2.Xor(dataVec1, keyVec1);
  19.             var dataKeyLo0 = Avx2.Shuffle(dataKey0.AsUInt32(), ShuffleDataKey);
  20.             var dataKeyLo1 = Avx2.Shuffle(dataKey1.AsUInt32(), ShuffleDataKey);
  21.             var product0 = Avx2.Multiply(dataKey0.AsUInt32(), dataKeyLo0);
  22.             var product1 = Avx2.Multiply(dataKey1.AsUInt32(), dataKeyLo1);
  23.  
  24.             var dataSwap0 = Avx2.Shuffle(dataVec0.AsUInt32(), ShuffleDataSwap);
  25.             var dataSwap1 = Avx2.Shuffle(dataVec1.AsUInt32(), ShuffleDataSwap);
  26.             var addend0 = accumulator0;
  27.             var addend1 = accumulator1;
  28.             var sum0 = Avx2.Add(addend0, dataSwap0.AsUInt64());
  29.             var sum1 = Avx2.Add(addend1, dataSwap1.AsUInt64());
  30.  
  31.             var result0 = Avx2.Add(product0, sum0);
  32.             var result1 = Avx2.Add(product1, sum1);
  33.  
  34.             addend0 = result0;
  35.             addend1 = result1;
  36.  
  37.             var dataVec2 = *(Vector256<ulong>*)(lData + 0x40u);
  38.             var dataVec3 = *(Vector256<ulong>*)(lData + 0x60u);
  39.             var keyVec2 = *(Vector256<ulong>*)(lSecret + 0x08u);
  40.             var keyVec3 = *(Vector256<ulong>*)(lSecret + 0x28u);
  41.  
  42.             var dataKey2 = Avx2.Xor(dataVec2, keyVec2);
  43.             var dataKey3 = Avx2.Xor(dataVec3, keyVec3);
  44.             var dataKeyLo2 = Avx2.Shuffle(dataKey2.AsUInt32(), ShuffleDataKey);
  45.             var dataKeyLo3 = Avx2.Shuffle(dataKey3.AsUInt32(), ShuffleDataKey);
  46.             var product2 = Avx2.Multiply(dataKey2.AsUInt32(), dataKeyLo2);
  47.             var product3 = Avx2.Multiply(dataKey3.AsUInt32(), dataKeyLo3);
  48.  
  49.             var dataSwap2 = Avx2.Shuffle(dataVec2.AsUInt32(), ShuffleDataSwap);
  50.             var dataSwap3 = Avx2.Shuffle(dataVec3.AsUInt32(), ShuffleDataSwap);
  51.             var sum2 = Avx2.Add(addend0, dataSwap2.AsUInt64());
  52.             var sum3 = Avx2.Add(addend1, dataSwap3.AsUInt64());
  53.  
  54.             var result2 = Avx2.Add(product2, sum2);
  55.             var result3 = Avx2.Add(product3, sum3);
  56.  
  57.             return (
  58.                 result2,
  59.                 result3
  60.             );
  61.         }
  62.  
  63.         {
  64.             // 0
  65.             (accumulator0, accumulator1) = Pass(data, secret, in accumulator0, in accumulator1, 0);
  66.             (accumulator0, accumulator1) = Pass(data, secret, in accumulator0, in accumulator1, 2);
  67.             (accumulator0, accumulator1) = Pass(data, secret, in accumulator0, in accumulator1, 4);
  68.             (accumulator0, accumulator1) = Pass(data, secret, in accumulator0, in accumulator1, 6);
  69.             (accumulator0, accumulator1) = Pass(data, secret, in accumulator0, in accumulator1, 8);
  70.             (accumulator0, accumulator1) = Pass(data, secret, in accumulator0, in accumulator1, 10);
  71.             (accumulator0, accumulator1) = Pass(data, secret, in accumulator0, in accumulator1, 12);
Advertisement
Add Comment
Please, Sign In to add comment