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

◆ InitializeSecurityContext() [4/4]

static unsafe int System.Net.Security.SafeDeleteContext.InitializeSecurityContext ( ref System::Net::Security::SafeFreeCredentials inCredentials,
ref System::Net::Security::SafeDeleteSslContext refContext,
string targetName,
global::Interop::SspiCli::ContextFlags inFlags,
global::Interop::SspiCli::Endianness endianness,
System::Net::Security::InputSecurityBuffers inSecBuffers,
ref System::Net::Security::SecurityBuffer outSecBuffer,
ref global::Interop::SspiCli::ContextFlags outFlags )
inlinestaticpackageinherited

Definition at line 40 of file SafeDeleteContext.cs.

41 {
42 if (inCredentials == null)
43 {
44 throw new ArgumentNullException("inCredentials");
45 }
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);
49 int result = -1;
50 bool flag2 = true;
51 if (refContext != null)
52 {
53 flag2 = refContext._handle.IsZero;
54 }
55 IntPtr intPtr = IntPtr.Zero;
56 try
57 {
58 Span<global::Interop.SspiCli.SecBuffer> span = stackalloc global::Interop.SspiCli.SecBuffer[3];
59 fixed (global::Interop.SspiCli.SecBuffer* ptr = span)
60 {
61 void* pBuffers = ptr;
62 fixed (byte* ptr2 = inSecBuffers._item0.Token)
63 {
64 void* ptr3 = ptr2;
65 fixed (byte* ptr4 = inSecBuffers._item1.Token)
66 {
67 void* ptr5 = ptr4;
68 fixed (byte* ptr6 = inSecBuffers._item2.Token)
69 {
70 void* ptr7 = ptr6;
71 secBufferDesc.pBuffers = pBuffers;
72 if (inSecBuffers.Count > 2)
73 {
74 span[2].BufferType = inSecBuffers._item2.Type;
75 if (inSecBuffers._item2.UnmanagedToken != null)
76 {
77 span[2].pvBuffer = inSecBuffers._item2.UnmanagedToken.DangerousGetHandle();
78 span[2].cbBuffer = ((ChannelBinding)inSecBuffers._item2.UnmanagedToken).Size;
79 }
80 else
81 {
82 span[2].cbBuffer = inSecBuffers._item2.Token.Length;
83 span[2].pvBuffer = (IntPtr)ptr7;
84 }
85 }
86 if (inSecBuffers.Count > 1)
87 {
88 span[1].BufferType = inSecBuffers._item1.Type;
89 if (inSecBuffers._item1.UnmanagedToken != null)
90 {
91 span[1].pvBuffer = inSecBuffers._item1.UnmanagedToken.DangerousGetHandle();
92 span[1].cbBuffer = ((ChannelBinding)inSecBuffers._item1.UnmanagedToken).Size;
93 }
94 else
95 {
96 span[1].cbBuffer = inSecBuffers._item1.Token.Length;
97 span[1].pvBuffer = (IntPtr)ptr5;
98 }
99 }
100 if (inSecBuffers.Count > 0)
101 {
102 span[0].BufferType = inSecBuffers._item0.Type;
103 if (inSecBuffers._item0.UnmanagedToken != null)
104 {
105 span[0].pvBuffer = inSecBuffers._item0.UnmanagedToken.DangerousGetHandle();
106 span[0].cbBuffer = ((ChannelBinding)inSecBuffers._item0.UnmanagedToken).Size;
107 }
108 else
109 {
110 span[0].cbBuffer = inSecBuffers._item0.Token.Length;
111 span[0].pvBuffer = (IntPtr)ptr3;
112 }
113 }
114 fixed (byte* ptr8 = outSecBuffer.token)
115 {
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)
122 {
123 refContext = new System.Net.Security.SafeDeleteSslContext();
124 }
125 if (targetName == null || targetName.Length == 0)
126 {
127 targetName = " ";
128 }
129 string ascii = s_idnMapping.GetAscii(targetName);
130 fixed (char* ptr9 = ascii)
131 {
132 result = MustRunInitializeSecurityContext(ref inCredentials, flag2, (byte*)(((object)targetName == " ") ? null : ptr9), inFlags, endianness, &secBufferDesc, refContext, ref outputBuffer, ref outFlags, null);
133 if (flag)
134 {
135 intPtr = secBuffer.pvBuffer;
136 }
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)
141 {
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;
146 span[1].BufferType = System.Net.Security.SecurityBufferType.SECBUFFER_EMPTY;
147 span[1].cbBuffer = 0;
148 secBuffer.cbBuffer = 0;
149 if (intPtr != IntPtr.Zero)
150 {
151 global::Interop.SspiCli.FreeContextBuffer(intPtr);
152 intPtr = IntPtr.Zero;
153 }
154 result = MustRunInitializeSecurityContext(ref inCredentials, flag2, (byte*)(((object)targetName == " ") ? null : ptr9), inFlags, endianness, &secBufferDesc, refContext, ref outputBuffer, ref outFlags, null);
155 if (flag)
156 {
157 intPtr = secBuffer.pvBuffer;
158 }
159 if (secBuffer.cbBuffer > 0)
160 {
161 if (outSecBuffer.size == 0)
162 {
163 outSecBuffer.size = secBuffer.cbBuffer;
164 outSecBuffer.type = secBuffer.BufferType;
165 outSecBuffer.token = new Span<byte>((void*)secBuffer.pvBuffer, secBuffer.cbBuffer).ToArray();
166 }
167 else
168 {
169 byte[] array = new byte[outSecBuffer.size + secBuffer.cbBuffer];
170 Buffer.BlockCopy(outSecBuffer.token, 0, array, 0, outSecBuffer.size);
171 new Span<byte>((void*)secBuffer.pvBuffer, secBuffer.cbBuffer).CopyTo(new Span<byte>(array, outSecBuffer.size, secBuffer.cbBuffer));
172 outSecBuffer.size = array.Length;
173 outSecBuffer.token = array;
174 }
175 }
176 if (span[1].BufferType == System.Net.Security.SecurityBufferType.SECBUFFER_EXTRA)
177 {
178 result = -2146893032;
179 }
180 }
181 }
182 }
183 }
184 }
185 }
186 }
187 }
188 finally
189 {
190 if (intPtr != IntPtr.Zero)
191 {
192 global::Interop.SspiCli.FreeContextBuffer(intPtr);
193 }
194 }
195 return result;
196 }
static readonly IdnMapping s_idnMapping
static unsafe int MustRunInitializeSecurityContext(ref System.Net.Security.SafeFreeCredentials inCredentials, bool isContextAbsent, byte *targetName, global::Interop.SspiCli.ContextFlags inFlags, global::Interop.SspiCli.Endianness endianness, global::Interop.SspiCli.SecBufferDesc *inputBuffer, System.Net.Security.SafeDeleteContext outContext, ref global::Interop.SspiCli.SecBufferDesc outputBuffer, ref global::Interop.SspiCli.ContextFlags attributes, System.Net.Security.SafeFreeContextBuffer handleTemplate)
System.Net.Security.InputSecurityBuffer _item2
System.Net.Security.InputSecurityBuffer _item1
System.Net.Security.InputSecurityBuffer _item0

References System.array, System.Buffer.BlockCopy(), System.Span< T >.CopyTo(), System.Span< T >.Length, System.Net.Security.SafeDeleteContext.MustRunInitializeSecurityContext(), System.Net.Security.SafeDeleteContext.s_idnMapping, System.Span< T >.ToArray(), and System.IntPtr.Zero.