42 if (inCredentials ==
null)
46 global::Interop.SspiCli.SecBufferDesc secBufferDesc =
new global::Interop.SspiCli.SecBufferDesc(inSecBuffers.Count);
47 global::Interop.SspiCli.SecBufferDesc outputBuffer =
new global::Interop.SspiCli.SecBufferDesc(1);
48 bool flag = (((inFlags & global::Interop.SspiCli.ContextFlags.AllocateMemory) != 0) ? true :
false);
51 if (refContext !=
null)
53 flag2 = refContext._handle.IsZero;
58 Span<global::Interop.SspiCli.SecBuffer> span = stackalloc global::Interop.SspiCli.SecBuffer[3];
59 fixed (global::Interop.SspiCli.SecBuffer* ptr = span)
62 fixed (
byte* ptr2 = inSecBuffers._item0.Token)
65 fixed (
byte* ptr4 = inSecBuffers._item1.Token)
68 fixed (
byte* ptr6 = inSecBuffers._item2.Token)
71 secBufferDesc.pBuffers = pBuffers;
72 if (inSecBuffers.Count > 2)
74 span[2].BufferType = inSecBuffers._item2.Type;
75 if (inSecBuffers._item2.UnmanagedToken !=
null)
77 span[2].pvBuffer = inSecBuffers._item2.UnmanagedToken.DangerousGetHandle();
78 span[2].cbBuffer = ((
ChannelBinding)inSecBuffers._item2.UnmanagedToken).Size;
82 span[2].cbBuffer = inSecBuffers._item2.Token.
Length;
83 span[2].pvBuffer = (
IntPtr)ptr7;
86 if (inSecBuffers.Count > 1)
88 span[1].BufferType = inSecBuffers._item1.Type;
89 if (inSecBuffers._item1.UnmanagedToken !=
null)
91 span[1].pvBuffer = inSecBuffers._item1.UnmanagedToken.DangerousGetHandle();
92 span[1].cbBuffer = ((
ChannelBinding)inSecBuffers._item1.UnmanagedToken).Size;
96 span[1].cbBuffer = inSecBuffers._item1.Token.Length;
97 span[1].pvBuffer = (
IntPtr)ptr5;
100 if (inSecBuffers.Count > 0)
102 span[0].BufferType = inSecBuffers._item0.Type;
103 if (inSecBuffers._item0.UnmanagedToken !=
null)
105 span[0].pvBuffer = inSecBuffers._item0.UnmanagedToken.DangerousGetHandle();
106 span[0].cbBuffer = ((
ChannelBinding)inSecBuffers._item0.UnmanagedToken).Size;
110 span[0].cbBuffer = inSecBuffers._item0.Token.Length;
111 span[0].pvBuffer = (
IntPtr)ptr3;
114 fixed (
byte* ptr8 = outSecBuffer.token)
116 global::Interop.SspiCli.SecBuffer secBuffer =
default(global::Interop.SspiCli.SecBuffer);
117 outputBuffer.pBuffers = &secBuffer;
118 secBuffer.cbBuffer = outSecBuffer.size;
119 secBuffer.BufferType = outSecBuffer.type;
120 secBuffer.pvBuffer = ((outSecBuffer.token ==
null || outSecBuffer.token.Length == 0) ?
IntPtr.
Zero : ((
IntPtr)(ptr8 + outSecBuffer.offset)));
121 if ((refContext ==
null || refContext.IsInvalid) && flag2)
125 if (targetName ==
null || targetName.Length == 0)
130 fixed (
char* ptr9 = ascii)
132 result =
MustRunInitializeSecurityContext(ref inCredentials, flag2, (
byte*)(((
object)targetName ==
" ") ?
null : ptr9), inFlags, endianness, &secBufferDesc, refContext, ref outputBuffer, ref outFlags,
null);
135 intPtr = secBuffer.pvBuffer;
137 outSecBuffer.size = secBuffer.cbBuffer;
138 outSecBuffer.type = secBuffer.BufferType;
139 outSecBuffer.token = ((outSecBuffer.size > 0) ?
new Span<byte>((
void*)secBuffer.pvBuffer, secBuffer.cbBuffer).ToArray() :
null);
140 if (inSecBuffers.Count > 1 && span[1].BufferType ==
System.
Net.
Security.SecurityBufferType.SECBUFFER_EXTRA && inSecBuffers._item1.Type ==
System.
Net.
Security.SecurityBufferType.SECBUFFER_EMPTY)
142 int cbBuffer = span[1].cbBuffer;
143 int num = inSecBuffers._item0.Token.Length - span[1].cbBuffer;
144 span[0].cbBuffer = cbBuffer;
145 span[0].pvBuffer = span[0].pvBuffer + num;
147 span[1].cbBuffer = 0;
148 secBuffer.cbBuffer = 0;
151 global::Interop.SspiCli.FreeContextBuffer(intPtr);
154 result =
MustRunInitializeSecurityContext(ref inCredentials, flag2, (
byte*)(((
object)targetName ==
" ") ?
null : ptr9), inFlags, endianness, &secBufferDesc, refContext, ref outputBuffer, ref outFlags,
null);
157 intPtr = secBuffer.pvBuffer;
159 if (secBuffer.cbBuffer > 0)
161 if (outSecBuffer.size == 0)
163 outSecBuffer.size = secBuffer.cbBuffer;
164 outSecBuffer.type = secBuffer.BufferType;
165 outSecBuffer.token =
new Span<byte>((
void*)secBuffer.pvBuffer, secBuffer.cbBuffer).
ToArray();
169 byte[]
array =
new byte[outSecBuffer.size + secBuffer.cbBuffer];
172 outSecBuffer.size =
array.Length;
173 outSecBuffer.token =
array;
176 if (span[1].BufferType ==
System.
Net.
Security.SecurityBufferType.SECBUFFER_EXTRA)
178 result = -2146893032;
192 global::Interop.SspiCli.FreeContextBuffer(intPtr);
200 int num = -2146893055;
203 bool success =
false;
204 inCredentials.DangerousAddRef(ref success);
205 outContext.DangerousAddRef(ref success);
206 global::Interop.SspiCli.CredHandle credentialHandle = inCredentials._handle;
207 global::Interop.SspiCli.CredHandle credHandle = outContext._handle;
208 void* ptr = (credHandle.IsZero ? null : (&credHandle));
209 isContextAbsent = ptr ==
null;
210 num = global::Interop.SspiCli.InitializeSecurityContextW(ref credentialHandle, ptr, targetName, inFlags, 0, endianness, inputBuffer, 0, ref outContext._handle, ref outputBuffer, ref attributes, out var _);
214 if (outContext._EffectiveCredential != inCredentials && (num & 0x80000000u) == 0
L)
216 outContext._EffectiveCredential?.DangerousRelease();
217 outContext._EffectiveCredential = inCredentials;
221 inCredentials.DangerousRelease();
223 outContext.DangerousRelease();
225 if (handleTemplate !=
null)
227 handleTemplate.Set(((global::Interop.SspiCli.SecBuffer*)outputBuffer.pBuffers)->pvBuffer);
228 if (handleTemplate.IsInvalid)
230 handleTemplate.SetHandleAsInvalid();
233 if (isContextAbsent && (num & 0x80000000u) != 0
L)
235 outContext._handle.SetToInvalid();
242 if (inCredentials ==
null)
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);
251 if (refContext !=
null)
253 flag2 = refContext._handle.IsZero;
255 Span<global::Interop.SspiCli.SecBuffer> span = stackalloc global::Interop.SspiCli.SecBuffer[2];
259 Span<global::Interop.SspiCli.SecBuffer> span2 = stackalloc global::Interop.SspiCli.SecBuffer[3];
260 fixed (global::Interop.SspiCli.SecBuffer* ptr = span2)
262 void* pBuffers = ptr;
263 fixed (global::Interop.SspiCli.SecBuffer* ptr2 = span)
265 void* pBuffers2 = ptr2;
266 fixed (
byte* ptr3 = inSecBuffers._item0.Token)
269 fixed (
byte* ptr5 = inSecBuffers._item1.Token)
272 fixed (
byte* ptr7 = inSecBuffers._item2.Token)
275 secBufferDesc.pBuffers = pBuffers;
276 if (inSecBuffers.Count > 2)
278 span2[2].BufferType = inSecBuffers._item2.Type;
279 if (inSecBuffers._item2.UnmanagedToken !=
null)
281 span2[2].pvBuffer = inSecBuffers._item2.UnmanagedToken.DangerousGetHandle();
282 span2[2].cbBuffer = ((
ChannelBinding)inSecBuffers._item2.UnmanagedToken).Size;
286 span2[2].cbBuffer = inSecBuffers._item2.Token.
Length;
287 span2[2].pvBuffer = (
IntPtr)ptr8;
290 if (inSecBuffers.Count > 1)
292 span2[1].BufferType = inSecBuffers._item1.Type;
293 if (inSecBuffers._item1.UnmanagedToken !=
null)
295 span2[1].pvBuffer = inSecBuffers._item1.UnmanagedToken.DangerousGetHandle();
296 span2[1].cbBuffer = ((
ChannelBinding)inSecBuffers._item1.UnmanagedToken).Size;
300 span2[1].cbBuffer = inSecBuffers._item1.Token.Length;
301 span2[1].pvBuffer = (
IntPtr)ptr6;
304 if (inSecBuffers.Count > 0)
306 span2[0].BufferType = inSecBuffers._item0.Type;
307 if (inSecBuffers._item0.UnmanagedToken !=
null)
309 span2[0].pvBuffer = inSecBuffers._item0.UnmanagedToken.DangerousGetHandle();
310 span2[0].cbBuffer = ((
ChannelBinding)inSecBuffers._item0.UnmanagedToken).Size;
314 span2[0].cbBuffer = inSecBuffers._item0.Token.Length;
315 span2[0].pvBuffer = (
IntPtr)ptr4;
318 fixed (
byte* ptr9 = outSecBuffer.token)
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;
326 if ((refContext ==
null || refContext.IsInvalid) && flag2)
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 ==
System.
Net.
Security.SecurityBufferType.SECBUFFER_EXTRA && inSecBuffers._item1.Type ==
System.
Net.
Security.SecurityBufferType.SECBUFFER_EMPTY)
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;
342 span2[1].cbBuffer = 0;
343 span[0].cbBuffer = 0;
346 global::Interop.SspiCli.FreeContextBuffer(span[0].pvBuffer);
350 index = ((span[0].cbBuffer == 0 && span[1].cbBuffer > 0) ? 1 : 0);
351 if (span[
index].cbBuffer > 0)
353 if (outSecBuffer.size == 0)
355 outSecBuffer.size = span[
index].cbBuffer;
356 outSecBuffer.type = span[
index].BufferType;
361 byte[]
array =
new byte[outSecBuffer.size + span[
index].cbBuffer];
364 outSecBuffer.size =
array.Length;
365 outSecBuffer.token =
array;
368 if (span2[1].BufferType ==
System.
Net.
Security.SecurityBufferType.SECBUFFER_EXTRA)
370 result = -2146893032;
384 global::Interop.SspiCli.FreeContextBuffer(span[0].pvBuffer);
388 global::Interop.SspiCli.FreeContextBuffer(span[1].pvBuffer);
396 int num = -2146893055;
399 bool success =
false;
400 inCredentials.DangerousAddRef(ref success);
401 outContext.DangerousAddRef(ref success);
402 global::Interop.SspiCli.CredHandle credentialHandle = inCredentials._handle;
403 global::Interop.SspiCli.CredHandle credHandle = outContext._handle;
404 void* ptr = (credHandle.IsZero ? null : (&credHandle));
405 isContextAbsent = ptr ==
null;
406 num = global::Interop.SspiCli.AcceptSecurityContext(ref credentialHandle, ptr, inputBuffer, inFlags, endianness, ref outContext._handle, ref outputBuffer, ref outFlags, out var _);
410 if (outContext._EffectiveCredential != inCredentials && (num & 0x80000000u) == 0
L)
412 outContext._EffectiveCredential?.DangerousRelease();
413 outContext._EffectiveCredential = inCredentials;
417 inCredentials.DangerousRelease();
419 outContext.DangerousRelease();
421 if (handleTemplate !=
null)
423 handleTemplate.Set(((global::Interop.SspiCli.SecBuffer*)outputBuffer.pBuffers)->pvBuffer);
424 if (handleTemplate.IsInvalid)
426 handleTemplate.SetHandleAsInvalid();
429 if (isContextAbsent && (num & 0x80000000u) != 0
L)
431 outContext._handle.SetToInvalid();
442 global::Interop.SspiCli.SecBufferDesc inputBuffers =
new global::Interop.SspiCli.SecBufferDesc(1);
443 int result = -2146893055;
444 global::Interop.SspiCli.SecBuffer secBuffer =
default(global::Interop.SspiCli.SecBuffer);
445 inputBuffers.pBuffers = &secBuffer;
446 fixed (
byte* ptr = inSecBuffer.token)
448 secBuffer.cbBuffer = inSecBuffer.size;
449 secBuffer.BufferType = inSecBuffer.type;
450 secBuffer.pvBuffer = ((inSecBuffer.unmanagedToken !=
null) ? inSecBuffer.unmanagedToken.DangerousGetHandle() : ((inSecBuffer.token ==
null || inSecBuffer.token.Length == 0) ?
IntPtr.
Zero : ((
IntPtr)(ptr + inSecBuffer.offset))));
451 global::Interop.SspiCli.CredHandle credHandle = ((refContext !=
null) ? refContext._handle :
default(global::Interop.SspiCli.CredHandle));
452 if ((refContext ==
null || refContext.IsInvalid) && credHandle.IsZero)
456 bool success =
false;
460 result = global::Interop.SspiCli.CompleteAuthToken(credHandle.IsZero ?
null : (&credHandle), ref inputBuffers);
466 refContext.DangerousRelease();