Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ EncryptDecryptHelper() [1/2]

static unsafe int System.Net.SSPIWrapper.EncryptDecryptHelper ( OP op,
ISSPIInterface secModule,
SafeDeleteContext context,
Span< SecurityBuffer > input,
uint sequenceNumber )
inlinestaticprivate

Definition at line 234 of file SSPIWrapper.cs.

235 {
236 global::Interop.SspiCli.SecBufferDesc inputOutput = new global::Interop.SspiCli.SecBufferDesc(input.Length);
237 Span<global::Interop.SspiCli.SecBuffer> span = stackalloc global::Interop.SspiCli.SecBuffer[input.Length];
238 span.Clear();
239 fixed (global::Interop.SspiCli.SecBuffer* pBuffers = span)
240 {
241 fixed (byte* ptr4 = ((input.Length > 0) ? input[0].token : null))
242 {
243 fixed (byte* ptr3 = ((input.Length > 1) ? input[1].token : null))
244 {
245 fixed (byte* ptr2 = ((input.Length > 2) ? input[2].token : null))
246 {
247 inputOutput.pBuffers = pBuffers;
248 ThreeByteArrays threeByteArrays = default(ThreeByteArrays);
249 Span<byte[]> span2 = MemoryMarshal.CreateSpan(ref threeByteArrays._item0, 3).Slice(0, input.Length);
250 for (int i = 0; i < input.Length; i++)
251 {
252 ref SecurityBuffer reference = ref input[i];
253 span[i].cbBuffer = reference.size;
254 span[i].BufferType = reference.type;
255 if (reference.token == null || reference.token.Length == 0)
256 {
257 span[i].pvBuffer = IntPtr.Zero;
258 continue;
259 }
260 span[i].pvBuffer = Marshal.UnsafeAddrOfPinnedArrayElement(reference.token, reference.offset);
261 span2[i] = reference.token;
262 }
263 int num = op switch
264 {
265 OP.Encrypt => secModule.EncryptMessage(context, ref inputOutput, sequenceNumber),
266 OP.Decrypt => secModule.DecryptMessage(context, ref inputOutput, sequenceNumber),
267 OP.MakeSignature => secModule.MakeSignature(context, ref inputOutput, sequenceNumber),
268 _ => secModule.VerifySignature(context, ref inputOutput, sequenceNumber),
269 };
270 for (int j = 0; j < input.Length; j++)
271 {
272 ref SecurityBuffer reference2 = ref input[j];
273 reference2.size = span[j].cbBuffer;
274 reference2.type = span[j].BufferType;
275 if (reference2.size == 0)
276 {
277 reference2.offset = 0;
278 reference2.token = null;
279 continue;
280 }
281 int k;
282 for (k = 0; k < input.Length; k++)
283 {
284 if (span2[k] != null)
285 {
286 byte* ptr = (byte*)(void*)Marshal.UnsafeAddrOfPinnedArrayElement(span2[k], 0);
287 checked
288 {
289 if ((void*)span[j].pvBuffer >= ptr && unchecked((nuint)(void*)span[j].pvBuffer) + unchecked((nuint)reference2.size) <= unchecked((nuint)ptr) + unchecked((nuint)span2[k].Length))
290 {
291 reference2.offset = (int)(unchecked((byte*)(void*)span[j].pvBuffer) - ptr);
292 reference2.token = span2[k];
293 break;
294 }
295 }
296 }
297 }
298 if (k >= input.Length)
299 {
300 reference2.size = 0;
301 reference2.offset = 0;
302 reference2.token = null;
303 }
304 }
305 if (System.Net.NetEventSource.Log.IsEnabled() && num != 0)
306 {
307 System.Net.NetEventSource.Error(null, (num == 590625) ? System.SR.Format(System.SR.event_OperationReturnedSomething, op, "SEC_I_RENEGOTIATE") : System.SR.Format(System.SR.net_log_operation_failed_with_error, op, $"0x{0:X}"), "EncryptDecryptHelper");
308 }
309 return num;
310 }
311 }
312 }
313 }
314 }
static readonly System.Net.NetEventSource Log
static void Error(object thisOrContextObject, FormattableString formattableString, [CallerMemberName] string memberName=null)
static unsafe IntPtr UnsafeAddrOfPinnedArrayElement(Array arr, int index)
Definition Marshal.cs:775
static string event_OperationReturnedSomething
Definition SR.cs:24
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string net_log_operation_failed_with_error
Definition SR.cs:154
Definition SR.cs:7

References System.Span< T >.Clear(), System.Net.ISSPIInterface.DecryptMessage(), System.Net.ISSPIInterface.EncryptMessage(), System.Net.NetEventSource.Error(), System.SR.event_OperationReturnedSomething, System.SR.Format(), System.input, System.Net.NetEventSource.Log, System.Net.ISSPIInterface.MakeSignature(), System.SR.net_log_operation_failed_with_error, System.Net.Security.SecurityBuffer.size, System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(), System.Net.ISSPIInterface.VerifySignature(), and System.IntPtr.Zero.