1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
- using System;
- #if BESTHTTP_WITH_BURST
- using Unity.Burst.Intrinsics;
- using static Unity.Burst.Intrinsics.X86;
- using static Unity.Burst.Intrinsics.Arm;
- #endif
- namespace Best.HTTP.Shared.TLS.Crypto.Impl
- {
- #if BESTHTTP_WITH_BURST
- [Unity.Burst.BurstCompile]
- #endif
- internal static class FastSalsa20EngineHelper
- {
- #if BESTHTTP_WITH_BURST
- [Unity.Burst.BurstCompile]
- public unsafe static void ProcessBytes([Unity.Burst.NoAlias] byte* outBytes, int outOff, [Unity.Burst.NoAlias] byte* inBytes, int inOff, [Unity.Burst.NoAlias] byte* keyStream)
- {
- //for (int i = 0; i < 64; ++i)
- // outBytes[idx + i + outOff] = (byte)(keyStream[i] ^ inBytes[idx + i + inOff]);
- #if !UNITY_ANDROID && !UNITY_IOS
- if (Sse2.IsSse2Supported)
- {
- for (int offset = 0; offset < 64; offset += 16)
- {
- var vin = Sse2.loadu_si128(inBytes + inOff + offset);
- //var vout = Sse2.loadu_si128(outBytes + outOff + offset);
- var vkeyStream = Sse2.loadu_si128(keyStream + offset);
- var vout = Sse2.xor_si128(vkeyStream, vin);
- Sse2.storeu_si128(outBytes + outOff + offset, vout);
- }
- }
- else
- #endif
- if (Neon.IsNeonSupported)
- {
- for (int offset = 0; offset < 64; offset += 16)
- {
- var vin = Neon.vld1q_u8(inBytes + inOff + offset);
- var vkeyStream = Neon.vld1q_u8(keyStream + offset);
- var vOut = Neon.veorq_u8(vkeyStream, vin);
- Neon.vst1q_u8(outBytes + outOff + offset, vOut);
- }
- }
- else
- {
- ulong* pulOut = (ulong*)&outBytes[outOff];
- ulong* pulIn = (ulong*)&inBytes[inOff];
- ulong* pulKeyStream = (ulong*)keyStream;
- pulOut[0] = pulKeyStream[0] ^ pulIn[0];
- pulOut[1] = pulKeyStream[1] ^ pulIn[1];
- pulOut[2] = pulKeyStream[2] ^ pulIn[2];
- pulOut[3] = pulKeyStream[3] ^ pulIn[3];
- }
- }
- #endif
- }
- }
- #endif
|