241 {
242 if (inCredentials == null)
243 {
244 throw new ArgumentNullException("inCredentials");
245 }
246 global::Interop.SspiCli.SecBufferDesc secBufferDesc = new global::Interop.SspiCli.SecBufferDesc(inSecBuffers.Count);
247 global::Interop.SspiCli.SecBufferDesc outputBuffer = new global::Interop.SspiCli.SecBufferDesc(2);
248 bool flag = (((inFlags & global::Interop.SspiCli.ContextFlags.AllocateMemory) != 0) ? true : false);
249 int result = -1;
250 bool flag2 = true;
251 if (refContext != null)
252 {
253 flag2 = refContext._handle.IsZero;
254 }
255 Span<global::Interop.SspiCli.SecBuffer> span = stackalloc global::Interop.SspiCli.SecBuffer[2];
256 span[1].pvBuffer =
IntPtr.Zero;
257 try
258 {
259 Span<global::Interop.SspiCli.SecBuffer> span2 = stackalloc global::Interop.SspiCli.SecBuffer[3];
260 fixed (global::Interop.SspiCli.SecBuffer* ptr = span2)
261 {
262 void* pBuffers = ptr;
263 fixed (global::Interop.SspiCli.SecBuffer* ptr2 = span)
264 {
265 void* pBuffers2 = ptr2;
266 fixed (byte* ptr3 = inSecBuffers._item0.Token)
267 {
268 void* ptr4 = ptr3;
269 fixed (byte* ptr5 = inSecBuffers._item1.Token)
270 {
271 void* ptr6 = ptr5;
272 fixed (byte* ptr7 = inSecBuffers._item2.Token)
273 {
274 void* ptr8 = ptr7;
275 secBufferDesc.pBuffers = pBuffers;
276 if (inSecBuffers.Count > 2)
277 {
278 span2[2].BufferType = inSecBuffers._item2.Type;
279 if (inSecBuffers._item2.UnmanagedToken != null)
280 {
281 span2[2].pvBuffer = inSecBuffers._item2.UnmanagedToken.DangerousGetHandle();
282 span2[2].cbBuffer = ((
ChannelBinding)inSecBuffers._item2.UnmanagedToken).Size;
283 }
284 else
285 {
286 span2[2].cbBuffer = inSecBuffers._item2.Token.Length;
287 span2[2].pvBuffer = (
IntPtr)ptr8;
288 }
289 }
290 if (inSecBuffers.Count > 1)
291 {
292 span2[1].BufferType = inSecBuffers._item1.Type;
293 if (inSecBuffers._item1.UnmanagedToken != null)
294 {
295 span2[1].pvBuffer = inSecBuffers._item1.UnmanagedToken.DangerousGetHandle();
296 span2[1].cbBuffer = ((
ChannelBinding)inSecBuffers._item1.UnmanagedToken).Size;
297 }
298 else
299 {
300 span2[1].cbBuffer = inSecBuffers._item1.Token.Length;
301 span2[1].pvBuffer = (
IntPtr)ptr6;
302 }
303 }
304 if (inSecBuffers.Count > 0)
305 {
306 span2[0].BufferType = inSecBuffers._item0.Type;
307 if (inSecBuffers._item0.UnmanagedToken != null)
308 {
309 span2[0].pvBuffer = inSecBuffers._item0.UnmanagedToken.DangerousGetHandle();
310 span2[0].cbBuffer = ((
ChannelBinding)inSecBuffers._item0.UnmanagedToken).Size;
311 }
312 else
313 {
314 span2[0].cbBuffer = inSecBuffers._item0.Token.Length;
315 span2[0].pvBuffer = (
IntPtr)ptr4;
316 }
317 }
318 fixed (byte* ptr9 = outSecBuffer.token)
319 {
320 outputBuffer.pBuffers = pBuffers2;
321 span[0].cbBuffer = outSecBuffer.size;
322 span[0].BufferType = outSecBuffer.type;
323 span[0].pvBuffer = ((outSecBuffer.token ==
null || outSecBuffer.token.Length == 0) ?
IntPtr.Zero : ((
IntPtr)(ptr9 + outSecBuffer.
offset)));
324 span[1].cbBuffer = 0;
325 span[1].BufferType = SecurityBufferType.SECBUFFER_ALERT;
326 if ((refContext == null || refContext.IsInvalid) && flag2)
327 {
328 refContext = new SafeDeleteSslContext();
329 }
331 int index = ((span[0].cbBuffer == 0 && span[1].cbBuffer > 0) ? 1 : 0);
332 outSecBuffer.size = span[
index].cbBuffer;
333 outSecBuffer.type = span[
index].BufferType;
334 outSecBuffer.token = ((outSecBuffer.size > 0) ?
new Span<byte>((
void*)span[
index].pvBuffer, span[0].cbBuffer).ToArray() :
null);
335 if (inSecBuffers.Count > 1 && span2[1].BufferType == SecurityBufferType.SECBUFFER_EXTRA && inSecBuffers._item1.Type == SecurityBufferType.SECBUFFER_EMPTY)
336 {
337 int cbBuffer = span2[1].cbBuffer;
338 int num = inSecBuffers._item0.Token.Length - span2[1].cbBuffer;
339 span2[0].cbBuffer = cbBuffer;
340 span2[0].pvBuffer = span2[0].pvBuffer + num;
341 span2[1].BufferType = SecurityBufferType.SECBUFFER_EMPTY;
342 span2[1].cbBuffer = 0;
343 span[0].cbBuffer = 0;
344 if (flag && span[0].pvBuffer !=
IntPtr.Zero)
345 {
346 global::Interop.SspiCli.FreeContextBuffer(span[0].pvBuffer);
347 span[0].pvBuffer =
IntPtr.Zero;
348 }
350 index = ((span[0].cbBuffer == 0 && span[1].cbBuffer > 0) ? 1 : 0);
351 if (span[
index].cbBuffer > 0)
352 {
353 if (outSecBuffer.size == 0)
354 {
355 outSecBuffer.size = span[
index].cbBuffer;
356 outSecBuffer.type = span[
index].BufferType;
357 outSecBuffer.token =
new Span<byte>((
void*)span[
index].pvBuffer, span[
index].cbBuffer).ToArray();
358 }
359 else
360 {
361 byte[]
array =
new byte[outSecBuffer.size + span[
index].cbBuffer];
362 Buffer.BlockCopy(outSecBuffer.token, 0,
array, 0, outSecBuffer.size);
363 new Span<byte>((
void*)span[
index].pvBuffer, span[
index].cbBuffer).CopyTo(
new Span<byte>(
array, outSecBuffer.size, span[
index].cbBuffer));
364 outSecBuffer.size =
array.Length;
365 outSecBuffer.token =
array;
366 }
367 }
368 if (span2[1].BufferType == SecurityBufferType.SECBUFFER_EXTRA)
369 {
370 result = -2146893032;
371 }
372 }
373 }
374 }
375 }
376 }
377 }
378 }
379 }
380 finally
381 {
382 if (flag && span[0].pvBuffer !=
IntPtr.Zero)
383 {
384 global::Interop.SspiCli.FreeContextBuffer(span[0].pvBuffer);
385 }
386 if (span[1].pvBuffer !=
IntPtr.Zero)
387 {
388 global::Interop.SspiCli.FreeContextBuffer(span[1].pvBuffer);
389 }
390 }
391 return result;
392 }
static unsafe int MustRunAcceptSecurityContext_SECURITY(ref System.Net.Security.SafeFreeCredentials inCredentials, bool isContextAbsent, global::Interop.SspiCli.SecBufferDesc *inputBuffer, global::Interop.SspiCli.ContextFlags inFlags, global::Interop.SspiCli.Endianness endianness, System.Net.Security.SafeDeleteContext outContext, ref global::Interop.SspiCli.SecBufferDesc outputBuffer, ref global::Interop.SspiCli.ContextFlags outFlags, System.Net.Security.SafeFreeContextBuffer handleTemplate)