5using System.Runtime.InteropServices;
6using System.Runtime.Intrinsics;
7using System.Runtime.Intrinsics.Arm;
15 static class AESCrypt_Arm
20 public static bool IsSupported => Aes.IsSupported && AdvSimd.IsSupported;
30 [MethodImpl(MethodImplOptions.AggressiveInlining)]
31 public static void DecryptBlock(ReadOnlySpan<byte> from, Span<byte> to, ReadOnlySpan<int> key)
34 var keylen = key.Length;
36 var v0 = Vector128Util.LoadUnsafe(in MemoryMarshal.GetReference(from));
43 var v5 = Vector128Util.LoadUnsafe(in RefUtils.Post(
ref key, 16));
44 v5 = AdvSimd.ReverseElement8(v5);
46 var (v1, v2, v3, v4) = Vector128Util.Load4xUnsafe(in RefUtils.Post(
ref key, 64));
47 v1 = AdvSimd.ReverseElement8(v1);
48 v2 = AdvSimd.ReverseElement8(v2);
49 v3 = AdvSimd.ReverseElement8(v3);
50 v4 = AdvSimd.ReverseElement8(v4);
51 v0 = Aes.Decrypt(v0, v1.AsByte());
52 v0 = Aes.InverseMixColumns(v0);
53 v0 = Aes.Decrypt(v0, v2.AsByte());
54 v0 = Aes.InverseMixColumns(v0);
55 v0 = Aes.Decrypt(v0, v3.AsByte());
56 v0 = Aes.InverseMixColumns(v0);
57 v0 = Aes.Decrypt(v0, v4.AsByte());
58 v0 = Aes.InverseMixColumns(v0);
60 (v1, v2, v3, v4) = Vector128Util.Load4xUnsafe(in RefUtils.Post(
ref key, 64));
61 v1 = AdvSimd.ReverseElement8(v1);
62 v2 = AdvSimd.ReverseElement8(v2);
63 v3 = AdvSimd.ReverseElement8(v3);
64 v4 = AdvSimd.ReverseElement8(v4);
65 v0 = Aes.Decrypt(v0, v1.AsByte());
66 v0 = Aes.InverseMixColumns(v0);
67 v0 = Aes.Decrypt(v0, v2.AsByte());
68 v0 = Aes.InverseMixColumns(v0);
69 v0 = Aes.Decrypt(v0, v3.AsByte());
70 v0 = Aes.InverseMixColumns(v0);
71 v0 = Aes.Decrypt(v0, v4.AsByte());
72 v0 = Aes.InverseMixColumns(v0);
74 (v1, v2) = Vector128Util.Load2xUnsafe(in RefUtils.Post(
ref key, 32));
75 v1 = AdvSimd.ReverseElement8(v1);
76 v2 = AdvSimd.ReverseElement8(v2);
83 v0 = Aes.Decrypt(v0, v1.AsByte());
84 v0 = Aes.InverseMixColumns(v0);
85 v0 = Aes.Decrypt(v0, v2.AsByte());
86 v0 = Aes.InverseMixColumns(v0);
88 (v1, v2) = Vector128Util.Load2xUnsafe(in RefUtils.Post(
ref key, 32));
89 v1 = AdvSimd.ReverseElement8(v1);
90 v2 = AdvSimd.ReverseElement8(v2);
97 v0 = Aes.Decrypt(v0, v1.AsByte());
98 v0 = Aes.InverseMixColumns(v0);
99 v0 = Aes.Decrypt(v0, v2.AsByte());
100 v0 = Aes.InverseMixColumns(v0);
102 (v1, v2) = Vector128Util.Load2xUnsafe(in RefUtils.Post(
ref key, 32));
103 v1 = AdvSimd.ReverseElement8(v1);
104 v2 = AdvSimd.ReverseElement8(v2);
108 v0 = Aes.Decrypt(v0, v1.AsByte());
109 v0 = Aes.InverseMixColumns(v0);
110 v0 = Aes.Decrypt(v0, v2.AsByte());
112 v0 = AdvSimd.Xor(v0, v5.AsByte());
125 [MethodImpl(MethodImplOptions.AggressiveInlining)]
126 public static void EncryptBlock(ReadOnlySpan<byte> from, Span<byte> to, ReadOnlySpan<int> key)
129 var keylen = key.Length;
131 var v0 = Vector128Util.LoadUnsafe(in MemoryMarshal.GetReference(from));
138 var (v1, v2, v3, v4) = Vector128Util.Load4xUnsafe(in RefUtils.Post(
ref key, 64));
139 v1 = AdvSimd.ReverseElement8(v1);
140 v2 = AdvSimd.ReverseElement8(v2);
141 v3 = AdvSimd.ReverseElement8(v3);
142 v4 = AdvSimd.ReverseElement8(v4);
143 v0 = Aes.Encrypt(v0, v1.AsByte());
144 v0 = Aes.MixColumns(v0);
145 v0 = Aes.Encrypt(v0, v2.AsByte());
146 v0 = Aes.MixColumns(v0);
147 v0 = Aes.Encrypt(v0, v3.AsByte());
148 v0 = Aes.MixColumns(v0);
149 v0 = Aes.Encrypt(v0, v4.AsByte());
150 v0 = Aes.MixColumns(v0);
152 (v1, v2, v3, v4) = Vector128Util.Load4xUnsafe(in RefUtils.Post(
ref key, 64));
153 v1 = AdvSimd.ReverseElement8(v1);
154 v2 = AdvSimd.ReverseElement8(v2);
155 v3 = AdvSimd.ReverseElement8(v3);
156 v4 = AdvSimd.ReverseElement8(v4);
157 v0 = Aes.Encrypt(v0, v1.AsByte());
158 v0 = Aes.MixColumns(v0);
159 v0 = Aes.Encrypt(v0, v2.AsByte());
160 v0 = Aes.MixColumns(v0);
161 v0 = Aes.Encrypt(v0, v3.AsByte());
162 v0 = Aes.MixColumns(v0);
163 v0 = Aes.Encrypt(v0, v4.AsByte());
164 v0 = Aes.MixColumns(v0);
166 (v1, v2) = Vector128Util.Load2xUnsafe(in RefUtils.Post(
ref key, 32));
167 v1 = AdvSimd.ReverseElement8(v1);
168 v2 = AdvSimd.ReverseElement8(v2);
175 v0 = Aes.Encrypt(v0, v1.AsByte());
176 v0 = Aes.MixColumns(v0);
177 v0 = Aes.Encrypt(v0, v2.AsByte());
178 v0 = Aes.MixColumns(v0);
180 (v1, v2) = Vector128Util.Load2xUnsafe(in RefUtils.Post(
ref key, 32));
181 v1 = AdvSimd.ReverseElement8(v1);
182 v2 = AdvSimd.ReverseElement8(v2);
189 v0 = Aes.Encrypt(v0, v1.AsByte());
190 v0 = Aes.MixColumns(v0);
191 v0 = Aes.Encrypt(v0, v2.AsByte());
192 v0 = Aes.MixColumns(v0);
194 (v1, v2) = Vector128Util.Load2xUnsafe(in RefUtils.Post(
ref key, 32));
195 v1 = AdvSimd.ReverseElement8(v1);
196 v2 = AdvSimd.ReverseElement8(v2);
200 v0 = Aes.Encrypt(v0, v1.AsByte());
201 v0 = Aes.MixColumns(v0);
202 v0 = Aes.Encrypt(v0, v2.AsByte());
204 v1 = Vector128Util.LoadUnsafe(in MemoryMarshal.GetReference(key));
205 v1 = AdvSimd.ReverseElement8(v1);
206 v0 = AdvSimd.Xor(v0, v1.AsByte());