IKVM11  11
Java SE 11 Virtual Machine for .NET
Loading...
Searching...
No Matches
CipherBlockChaining_Arm.cs
Go to the documentation of this file.
1#if NET6_0_OR_GREATER
2
3using System;
5using System.Runtime.InteropServices;
6using System.Runtime.Intrinsics;
7using System.Runtime.Intrinsics.Arm;
8
10{
14 [SkipLocalsInit]
15 static class CipherBlockChaining_Arm
16 {
17
21 public static bool IsSupported => AESCrypt_Arm.IsSupported;
22
34 [MethodImpl(MethodImplOptions.AggressiveInlining)]
35 public static int DecryptAESCrypt(ReadOnlySpan<byte> from, Span<byte> to, ReadOnlySpan<int> key, Span<byte> rvec, int length)
36 {
37 // ext\openjdk\hotspot\src\cpu\aarch64\vm\stubGenerator_aarch64.cpp:2606-2699
38 int rscratch2 = length;
39 if (rscratch2 == 0)
40 {
41 goto finish;
42 }
43
44 var keylen = key.Length;
45
46 var v2 = Vector128Util.LoadUnsafe(in MemoryMarshal.GetReference(rvec));
47
48 var v31 = Vector128Util.LoadUnsafe(in RefUtils.Post(ref key, 16));
49 v31 = AdvSimd.ReverseElement8(v31);
50
51 // Initialize Values, due to branching below,
52 // these are - for csc - unassigned, when
53 // setting the value in the branch.
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);
58
59 switch (keylen)
60 {
61 case < 52: goto loadkeys_44;
62 case 52: goto loadkeys_52;
63 }
64
65 (v17, v18) = Vector128Util.Load2xUnsafe(in RefUtils.Post(ref key, 32));
66 v17 = AdvSimd.ReverseElement8(v17);
67 v18 = AdvSimd.ReverseElement8(v18);
68 loadkeys_52:;
69 (v19, v20) = Vector128Util.Load2xUnsafe(in RefUtils.Post(ref key, 32));
70 v19 = AdvSimd.ReverseElement8(v19);
71 v20 = AdvSimd.ReverseElement8(v20);
72 loadkeys_44:;
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);
86
87 aes_loop:;
88 var v0 = Vector128Util.LoadUnsafe(in RefUtils.Post(ref from, 16));
89 var v1 = AdvSimd.Or(v0, v0);
90
91 switch (keylen)
92 {
93 case < 52: goto rounds_44;
94 case 52: goto rounds_52;
95 }
96
97 v0 = Aes.InverseMixColumns(Aes.Decrypt(v0, v17.AsByte()));
98 v0 = Aes.InverseMixColumns(Aes.Decrypt(v0, v18.AsByte()));
99 rounds_52:;
100 v0 = Aes.InverseMixColumns(Aes.Decrypt(v0, v19.AsByte()));
101 v0 = Aes.InverseMixColumns(Aes.Decrypt(v0, v20.AsByte()));
102 rounds_44:;
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());
115
116 v0.StoreUnsafe(ref RefUtils.Post(ref to, 16));
117 v2 = AdvSimd.Or(v1, v1);
118
119 if ((length -= 16) != 0)
120 {
121 goto aes_loop;
122 }
123
124 v2.CopyTo(rvec);
125
126 finish:;
127 return rscratch2;
128 }
129
141 [MethodImpl(MethodImplOptions.AggressiveInlining)]
142 public static int EncryptAESCrypt(ReadOnlySpan<byte> from, Span<byte> to, ReadOnlySpan<int> key, Span<byte> rvec, int length)
143 {
144 // ext\openjdk\hotspot\src\cpu\aarch64\vm\stubGenerator_aarch64.cpp:2713-2805
145 int rscratch2 = length;
146 if (rscratch2 == 0)
147 {
148 goto finish;
149 }
150
151 var keylen = key.Length;
152
153 var v0 = Vector128Util.LoadUnsafe(in MemoryMarshal.GetReference(rvec));
154
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);
159
160 switch (keylen)
161 {
162 case < 52: goto loadkeys_44;
163 case 52: goto loadkeys_52;
164 }
165
166 (v17, v18) = Vector128Util.Load2xUnsafe(in RefUtils.Post(ref key, 32));
167 v17 = AdvSimd.ReverseElement8(v17);
168 v18 = AdvSimd.ReverseElement8(v18);
169 loadkeys_52:;
170 (v19, v20) = Vector128Util.Load2xUnsafe(in RefUtils.Post(ref key, 32));
171 v19 = AdvSimd.ReverseElement8(v19);
172 v20 = AdvSimd.ReverseElement8(v20);
173 loadkeys_44:;
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);
188
189 aes_loop:
190 var v1 = Vector128Util.LoadUnsafe(in RefUtils.Post(ref from, 16));
191 v0 = AdvSimd.Xor(v0, v1);
192
193 switch (keylen)
194 {
195 case < 52: goto rounds_44;
196 case 52: goto rounds_52;
197 }
198
199 v0 = Aes.MixColumns(Aes.Encrypt(v0, v17.AsByte()));
200 v0 = Aes.MixColumns(Aes.Encrypt(v0, v18.AsByte()));
201 rounds_52:;
202 v0 = Aes.MixColumns(Aes.Encrypt(v0, v19.AsByte()));
203 v0 = Aes.MixColumns(Aes.Encrypt(v0, v20.AsByte()));
204 rounds_44:;
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());
216
217 v0.StoreUnsafe(ref RefUtils.Post(ref to, 16));
218
219 if ((length -= 16) != 0)
220 {
221 goto aes_loop;
222 }
223
224 v0.CopyTo(rvec);
225
226 finish:;
227 return rscratch2;
228 }
229 }
230}
231
232#endif