5using System.Runtime.InteropServices;
6using System.Runtime.Intrinsics;
7using System.Runtime.Intrinsics.Arm;
15 static class CipherBlockChaining_Arm
21 public static bool IsSupported => AESCrypt_Arm.IsSupported;
34 [MethodImpl(MethodImplOptions.AggressiveInlining)]
35 public static int DecryptAESCrypt(ReadOnlySpan<byte> from, Span<byte> to, ReadOnlySpan<int> key, Span<byte> rvec,
int length)
38 int rscratch2 = length;
44 var keylen = key.Length;
46 var v2 = Vector128Util.LoadUnsafe(in MemoryMarshal.GetReference(rvec));
48 var v31 = Vector128Util.LoadUnsafe(in RefUtils.Post(
ref key, 16));
49 v31 = AdvSimd.ReverseElement8(v31);
54 Unsafe.SkipInit(out Vector128<int> v17);
55 Unsafe.SkipInit(out Vector128<int> v18);
56 Unsafe.SkipInit(out Vector128<int> v19);
57 Unsafe.SkipInit(out Vector128<int> v20);
61 case < 52:
goto loadkeys_44;
62 case 52:
goto loadkeys_52;
65 (v17, v18) = Vector128Util.Load2xUnsafe(in RefUtils.Post(
ref key, 32));
66 v17 = AdvSimd.ReverseElement8(v17);
67 v18 = AdvSimd.ReverseElement8(v18);
69 (v19, v20) = Vector128Util.Load2xUnsafe(in RefUtils.Post(
ref key, 32));
70 v19 = AdvSimd.ReverseElement8(v19);
71 v20 = AdvSimd.ReverseElement8(v20);
73 var (v21, v22, v23, v24) = Vector128Util.Load4xUnsafe(in RefUtils.Post(
ref key, 64));
74 v21 = AdvSimd.ReverseElement8(v21);
75 v22 = AdvSimd.ReverseElement8(v22);
76 v23 = AdvSimd.ReverseElement8(v23);
77 v24 = AdvSimd.ReverseElement8(v24);
78 var (v25, v26, v27, v28) = Vector128Util.Load4xUnsafe(in RefUtils.Post(
ref key, 64));
79 v25 = AdvSimd.ReverseElement8(v25);
80 v26 = AdvSimd.ReverseElement8(v26);
81 v27 = AdvSimd.ReverseElement8(v27);
82 v28 = AdvSimd.ReverseElement8(v28);
83 var (v29, v30) = Vector128Util.Load2xUnsafe(in MemoryMarshal.GetReference(key));
84 v29 = AdvSimd.ReverseElement8(v29);
85 v30 = AdvSimd.ReverseElement8(v30);
88 var v0 = Vector128Util.LoadUnsafe(in RefUtils.Post(
ref from, 16));
89 var v1 = AdvSimd.Or(v0, v0);
93 case < 52:
goto rounds_44;
94 case 52:
goto rounds_52;
97 v0 = Aes.InverseMixColumns(Aes.Decrypt(v0, v17.AsByte()));
98 v0 = Aes.InverseMixColumns(Aes.Decrypt(v0, v18.AsByte()));
100 v0 = Aes.InverseMixColumns(Aes.Decrypt(v0, v19.AsByte()));
101 v0 = Aes.InverseMixColumns(Aes.Decrypt(v0, v20.AsByte()));
103 v0 = Aes.InverseMixColumns(Aes.Decrypt(v0, v21.AsByte()));
104 v0 = Aes.InverseMixColumns(Aes.Decrypt(v0, v22.AsByte()));
105 v0 = Aes.InverseMixColumns(Aes.Decrypt(v0, v23.AsByte()));
106 v0 = Aes.InverseMixColumns(Aes.Decrypt(v0, v24.AsByte()));
107 v0 = Aes.InverseMixColumns(Aes.Decrypt(v0, v25.AsByte()));
108 v0 = Aes.InverseMixColumns(Aes.Decrypt(v0, v26.AsByte()));
109 v0 = Aes.InverseMixColumns(Aes.Decrypt(v0, v27.AsByte()));
110 v0 = Aes.InverseMixColumns(Aes.Decrypt(v0, v28.AsByte()));
111 v0 = Aes.InverseMixColumns(Aes.Decrypt(v0, v29.AsByte()));
112 v0 = Aes.Decrypt(v0, v30.AsByte());
113 v0 = AdvSimd.Xor(v0, v31.AsByte());
114 v0 = AdvSimd.Xor(v0, v2.AsByte());
116 v0.StoreUnsafe(
ref RefUtils.Post(
ref to, 16));
117 v2 = AdvSimd.Or(v1, v1);
119 if ((length -= 16) != 0)
141 [MethodImpl(MethodImplOptions.AggressiveInlining)]
142 public static int EncryptAESCrypt(ReadOnlySpan<byte> from, Span<byte> to, ReadOnlySpan<int> key, Span<byte> rvec,
int length)
145 int rscratch2 = length;
151 var keylen = key.Length;
153 var v0 = Vector128Util.LoadUnsafe(in MemoryMarshal.GetReference(rvec));
155 Unsafe.SkipInit(out Vector128<int> v17);
156 Unsafe.SkipInit(out Vector128<int> v18);
157 Unsafe.SkipInit(out Vector128<int> v19);
158 Unsafe.SkipInit(out Vector128<int> v20);
162 case < 52:
goto loadkeys_44;
163 case 52:
goto loadkeys_52;
166 (v17, v18) = Vector128Util.Load2xUnsafe(in RefUtils.Post(
ref key, 32));
167 v17 = AdvSimd.ReverseElement8(v17);
168 v18 = AdvSimd.ReverseElement8(v18);
170 (v19, v20) = Vector128Util.Load2xUnsafe(in RefUtils.Post(
ref key, 32));
171 v19 = AdvSimd.ReverseElement8(v19);
172 v20 = AdvSimd.ReverseElement8(v20);
174 var (v21, v22, v23, v24) = Vector128Util.Load4xUnsafe(in RefUtils.Post(
ref key, 64));
175 v21 = AdvSimd.ReverseElement8(v21);
176 v22 = AdvSimd.ReverseElement8(v22);
177 v23 = AdvSimd.ReverseElement8(v23);
178 v24 = AdvSimd.ReverseElement8(v24);
179 var (v25, v26, v27, v28) = Vector128Util.Load4xUnsafe(in RefUtils.Post(
ref key, 64));
180 v25 = AdvSimd.ReverseElement8(v25);
181 v26 = AdvSimd.ReverseElement8(v26);
182 v27 = AdvSimd.ReverseElement8(v27);
183 v28 = AdvSimd.ReverseElement8(v28);
184 var (v29, v30, v31) = Vector128Util.Load3xUnsafe(in MemoryMarshal.GetReference(key));
185 v29 = AdvSimd.ReverseElement8(v29);
186 v30 = AdvSimd.ReverseElement8(v30);
187 v31 = AdvSimd.ReverseElement8(v31);
190 var v1 = Vector128Util.LoadUnsafe(in RefUtils.Post(
ref from, 16));
191 v0 = AdvSimd.Xor(v0, v1);
195 case < 52:
goto rounds_44;
196 case 52:
goto rounds_52;
199 v0 = Aes.MixColumns(Aes.Encrypt(v0, v17.AsByte()));
200 v0 = Aes.MixColumns(Aes.Encrypt(v0, v18.AsByte()));
202 v0 = Aes.MixColumns(Aes.Encrypt(v0, v19.AsByte()));
203 v0 = Aes.MixColumns(Aes.Encrypt(v0, v20.AsByte()));
205 v0 = Aes.MixColumns(Aes.Encrypt(v0, v21.AsByte()));
206 v0 = Aes.MixColumns(Aes.Encrypt(v0, v22.AsByte()));
207 v0 = Aes.MixColumns(Aes.Encrypt(v0, v23.AsByte()));
208 v0 = Aes.MixColumns(Aes.Encrypt(v0, v24.AsByte()));
209 v0 = Aes.MixColumns(Aes.Encrypt(v0, v25.AsByte()));
210 v0 = Aes.MixColumns(Aes.Encrypt(v0, v26.AsByte()));
211 v0 = Aes.MixColumns(Aes.Encrypt(v0, v27.AsByte()));
212 v0 = Aes.MixColumns(Aes.Encrypt(v0, v28.AsByte()));
213 v0 = Aes.MixColumns(Aes.Encrypt(v0, v29.AsByte()));
214 v0 = Aes.Encrypt(v0, v30.AsByte());
215 v0 = AdvSimd.Xor(v0, v31.AsByte());
217 v0.StoreUnsafe(
ref RefUtils.Post(
ref to, 16));
219 if ((length -= 16) != 0)