1 // Copyright © 2016-2017 winapi-rs developers
2 // Licensed under the Apache License, Version 2.0
3 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
4 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
5 // All files in the project carrying such notice may not be copied, modified, or distributed
6 // except according to those terms.
7 //! Security Support Provider Interface Prototypes and structure definitions
8 
9 use ctypes::{c_char, c_int, c_uchar, c_ulong, c_ushort, c_void};
10 use shared::basetsd::{ULONG_PTR};
11 use shared::guiddef::GUID;
12 use shared::minwindef::{PUCHAR, ULONG, USHORT};
13 use um::subauth::PUNICODE_STRING;
14 use um::wincred::{PCREDUI_INFOA, PCREDUI_INFOW};
15 use um::winnt::{
16     BOOLEAN, CHAR, HANDLE, LARGE_INTEGER, LONG, LPSTR, LPWSTR, LUID, PCSTR, PCWSTR, PVOID, WCHAR
17 };
18 
19 pub type SEC_WCHAR = WCHAR;
20 pub type SEC_CHAR = CHAR;
21 pub type SECURITY_STATUS = LONG;
22 STRUCT!{struct SecHandle {
23     dwLower: ULONG_PTR,
24     dwUpper: ULONG_PTR,
25 }}
26 pub type PSecHandle = *mut SecHandle;
27 pub const SEC_DELETED_HANDLE: ULONG_PTR = 2;
28 pub type CredHandle = SecHandle;
29 pub type PCredHandle = PSecHandle;
30 pub type CtxtHandle = SecHandle;
31 pub type PCtxtHandle = PSecHandle;
32 pub type SECURITY_INTEGER = LARGE_INTEGER;
33 pub type PSECURITY_INTEGER = *mut LARGE_INTEGER;
34 pub type TimeStamp = SECURITY_INTEGER;
35 pub type PTimeStamp = *mut SECURITY_INTEGER;
36 STRUCT!{struct SECURITY_STRING {
37     Length: c_ushort,
38     MaximumLength: c_ushort,
39     Buffer: *mut c_ushort,
40 }}
41 pub type PSECURITY_STRING = *mut SECURITY_STRING;
42 STRUCT!{struct SecPkgInfoW {
43     fCapabilities: c_ulong,
44     wVersion: c_ushort,
45     wRPCID: c_ushort,
46     cbMaxToken: c_ulong,
47     Name: *mut SEC_WCHAR,
48     Comment: *mut SEC_WCHAR,
49 }}
50 pub type PSecPkgInfoW = *mut SecPkgInfoW;
51 STRUCT!{struct SecPkgInfoA {
52     fCapabilities: c_ulong,
53     wVersion: c_ushort,
54     wRPCID: c_ushort,
55     cbMaxToken: c_ulong,
56     Name: *mut SEC_CHAR,
57     Comment: *mut SEC_CHAR,
58 }}
59 pub type PSecPkgInfoA = *mut SecPkgInfoA;
60 pub const SECPKG_FLAG_INTEGRITY: c_ulong = 0x00000001;
61 pub const SECPKG_FLAG_PRIVACY: c_ulong = 0x00000002;
62 pub const SECPKG_FLAG_TOKEN_ONLY: c_ulong = 0x00000004;
63 pub const SECPKG_FLAG_DATAGRAM: c_ulong = 0x00000008;
64 pub const SECPKG_FLAG_CONNECTION: c_ulong = 0x00000010;
65 pub const SECPKG_FLAG_MULTI_REQUIRED: c_ulong = 0x00000020;
66 pub const SECPKG_FLAG_CLIENT_ONLY: c_ulong = 0x00000040;
67 pub const SECPKG_FLAG_EXTENDED_ERROR: c_ulong = 0x00000080;
68 pub const SECPKG_FLAG_IMPERSONATION: c_ulong = 0x00000100;
69 pub const SECPKG_FLAG_ACCEPT_WIN32_NAME: c_ulong = 0x00000200;
70 pub const SECPKG_FLAG_STREAM: c_ulong = 0x00000400;
71 pub const SECPKG_FLAG_NEGOTIABLE: c_ulong = 0x00000800;
72 pub const SECPKG_FLAG_GSS_COMPATIBLE: c_ulong = 0x00001000;
73 pub const SECPKG_FLAG_LOGON: c_ulong = 0x00002000;
74 pub const SECPKG_FLAG_ASCII_BUFFERS: c_ulong = 0x00004000;
75 pub const SECPKG_FLAG_FRAGMENT: c_ulong = 0x00008000;
76 pub const SECPKG_FLAG_MUTUAL_AUTH: c_ulong = 0x00010000;
77 pub const SECPKG_FLAG_DELEGATION: c_ulong = 0x00020000;
78 pub const SECPKG_FLAG_READONLY_WITH_CHECKSUM: c_ulong = 0x00040000;
79 pub const SECPKG_FLAG_RESTRICTED_TOKENS: c_ulong = 0x00080000;
80 pub const SECPKG_FLAG_NEGO_EXTENDER: c_ulong = 0x00100000;
81 pub const SECPKG_FLAG_NEGOTIABLE2: c_ulong = 0x00200000;
82 pub const SECPKG_FLAG_APPCONTAINER_PASSTHROUGH: c_ulong = 0x00400000;
83 pub const SECPKG_FLAG_APPCONTAINER_CHECKS: c_ulong = 0x00800000;
84 pub const SECPKG_ID_NONE: c_ulong = 0xFFFF;
85 pub const SECPKG_CALLFLAGS_APPCONTAINER: c_ulong = 0x00000001;
86 pub const SECPKG_CALLFLAGS_APPCONTAINER_AUTHCAPABLE: c_ulong = 0x00000002;
87 pub const SECPKG_CALLFLAGS_FORCE_SUPPLIED: c_ulong = 0x00000004;
88 STRUCT!{struct SecBuffer {
89     cbBuffer: c_ulong,
90     BufferType: c_ulong,
91     pvBuffer: *mut c_void,
92 }}
93 pub type PSecBuffer = *mut SecBuffer;
94 STRUCT!{struct SecBufferDesc {
95     ulVersion: c_ulong,
96     cBuffers: c_ulong,
97     pBuffers: PSecBuffer,
98 }}
99 pub type PSecBufferDesc = *mut SecBufferDesc;
100 pub const SECBUFFER_VERSION: c_ulong = 0;
101 pub const SECBUFFER_EMPTY: c_ulong = 0;
102 pub const SECBUFFER_DATA: c_ulong = 1;
103 pub const SECBUFFER_TOKEN: c_ulong = 2;
104 pub const SECBUFFER_PKG_PARAMS: c_ulong = 3;
105 pub const SECBUFFER_MISSING: c_ulong = 4;
106 pub const SECBUFFER_EXTRA: c_ulong = 5;
107 pub const SECBUFFER_STREAM_TRAILER: c_ulong = 6;
108 pub const SECBUFFER_STREAM_HEADER: c_ulong = 7;
109 pub const SECBUFFER_NEGOTIATION_INFO: c_ulong = 8;
110 pub const SECBUFFER_PADDING: c_ulong = 9;
111 pub const SECBUFFER_STREAM: c_ulong = 10;
112 pub const SECBUFFER_MECHLIST: c_ulong = 11;
113 pub const SECBUFFER_MECHLIST_SIGNATURE: c_ulong = 12;
114 pub const SECBUFFER_TARGET: c_ulong = 13;
115 pub const SECBUFFER_CHANNEL_BINDINGS: c_ulong = 14;
116 pub const SECBUFFER_CHANGE_PASS_RESPONSE: c_ulong = 15;
117 pub const SECBUFFER_TARGET_HOST: c_ulong = 16;
118 pub const SECBUFFER_ALERT: c_ulong = 17;
119 pub const SECBUFFER_APPLICATION_PROTOCOLS: c_ulong = 18;
120 pub const SECBUFFER_ATTRMASK: c_ulong = 0xF0000000;
121 pub const SECBUFFER_READONLY: c_ulong = 0x80000000;
122 pub const SECBUFFER_READONLY_WITH_CHECKSUM: c_ulong = 0x10000000;
123 pub const SECBUFFER_RESERVED: c_ulong = 0x60000000;
124 STRUCT!{struct SEC_NEGOTIATION_INFO {
125     Size: c_ulong,
126     NameLength: c_ulong,
127     Name: *mut SEC_WCHAR,
128     Reserved: *mut c_void,
129 }}
130 pub type PSEC_NEGOTIATION_INFO = *mut SEC_NEGOTIATION_INFO;
131 STRUCT!{struct SEC_CHANNEL_BINDINGS {
132     dwInitiatorAddrType: c_ulong,
133     cbInitiatorLength: c_ulong,
134     dwInitiatorOffset: c_ulong,
135     dwAcceptorAddrType: c_ulong,
136     cbAcceptorLength: c_ulong,
137     dwAcceptorOffset: c_ulong,
138     cbApplicationDataLength: c_ulong,
139     dwApplicationDataOffset: c_ulong,
140 }}
141 pub type PSEC_CHANNEL_BINDINGS = *mut SEC_CHANNEL_BINDINGS;
142 ENUM!{enum SEC_APPLICATION_PROTOCOL_NEGOTIATION_EXT {
143     SecApplicationProtocolNegotiationExt_None,
144     SecApplicationProtocolNegotiationExt_NPN,
145     SecApplicationProtocolNegotiationExt_ALPN,
146 }}
147 pub type PSEC_APPLICATION_PROTOCOL_NEGOTIATION_EXT = *mut SEC_APPLICATION_PROTOCOL_NEGOTIATION_EXT;
148 STRUCT!{struct SEC_APPLICATION_PROTOCOL_LIST {
149     ProtoNegoExt: SEC_APPLICATION_PROTOCOL_NEGOTIATION_EXT,
150     ProtocolListSize: c_ushort,
151     ProtocolList: [c_uchar; 0],
152 }}
153 pub type PSEC_APPLICATION_PROTOCOL_LIST = *mut SEC_APPLICATION_PROTOCOL_LIST;
154 STRUCT!{struct SEC_APPLICATION_PROTOCOLS {
155     ProtocolListsSize: c_ulong,
156     ProtocolLists: [SEC_APPLICATION_PROTOCOL_LIST; 0],
157 }}
158 pub type PSEC_APPLICATION_PROTOCOLS = *mut SEC_APPLICATION_PROTOCOLS;
159 pub const SECURITY_NATIVE_DREP: c_ulong = 0x00000010;
160 pub const SECURITY_NETWORK_DREP: c_ulong = 0x00000000;
161 pub const SECPKG_CRED_INBOUND: c_ulong = 0x00000001;
162 pub const SECPKG_CRED_OUTBOUND: c_ulong = 0x00000002;
163 pub const SECPKG_CRED_BOTH: c_ulong = 0x00000003;
164 pub const SECPKG_CRED_DEFAULT: c_ulong = 0x00000004;
165 pub const SECPKG_CRED_RESERVED: c_ulong = 0xF0000000;
166 pub const SECPKG_CRED_AUTOLOGON_RESTRICTED: c_ulong = 0x00000010;
167 pub const SECPKG_CRED_PROCESS_POLICY_ONLY: c_ulong = 0x00000020;
168 pub const ISC_REQ_DELEGATE: c_ulong = 0x00000001;
169 pub const ISC_REQ_MUTUAL_AUTH: c_ulong = 0x00000002;
170 pub const ISC_REQ_REPLAY_DETECT: c_ulong = 0x00000004;
171 pub const ISC_REQ_SEQUENCE_DETECT: c_ulong = 0x00000008;
172 pub const ISC_REQ_CONFIDENTIALITY: c_ulong = 0x00000010;
173 pub const ISC_REQ_USE_SESSION_KEY: c_ulong = 0x00000020;
174 pub const ISC_REQ_PROMPT_FOR_CREDS: c_ulong = 0x00000040;
175 pub const ISC_REQ_USE_SUPPLIED_CREDS: c_ulong = 0x00000080;
176 pub const ISC_REQ_ALLOCATE_MEMORY: c_ulong = 0x00000100;
177 pub const ISC_REQ_USE_DCE_STYLE: c_ulong = 0x00000200;
178 pub const ISC_REQ_DATAGRAM: c_ulong = 0x00000400;
179 pub const ISC_REQ_CONNECTION: c_ulong = 0x00000800;
180 pub const ISC_REQ_CALL_LEVEL: c_ulong = 0x00001000;
181 pub const ISC_REQ_FRAGMENT_SUPPLIED: c_ulong = 0x00002000;
182 pub const ISC_REQ_EXTENDED_ERROR: c_ulong = 0x00004000;
183 pub const ISC_REQ_STREAM: c_ulong = 0x00008000;
184 pub const ISC_REQ_INTEGRITY: c_ulong = 0x00010000;
185 pub const ISC_REQ_IDENTIFY: c_ulong = 0x00020000;
186 pub const ISC_REQ_NULL_SESSION: c_ulong = 0x00040000;
187 pub const ISC_REQ_MANUAL_CRED_VALIDATION: c_ulong = 0x00080000;
188 pub const ISC_REQ_RESERVED1: c_ulong = 0x00100000;
189 pub const ISC_REQ_FRAGMENT_TO_FIT: c_ulong = 0x00200000;
190 pub const ISC_REQ_FORWARD_CREDENTIALS: c_ulong = 0x00400000;
191 pub const ISC_REQ_NO_INTEGRITY: c_ulong = 0x00800000;
192 pub const ISC_REQ_USE_HTTP_STYLE: c_ulong = 0x01000000;
193 pub const ISC_REQ_UNVERIFIED_TARGET_NAME: c_ulong = 0x20000000;
194 pub const ISC_REQ_CONFIDENTIALITY_ONLY: c_ulong = 0x40000000;
195 pub const ISC_RET_DELEGATE: c_ulong = 0x00000001;
196 pub const ISC_RET_MUTUAL_AUTH: c_ulong = 0x00000002;
197 pub const ISC_RET_REPLAY_DETECT: c_ulong = 0x00000004;
198 pub const ISC_RET_SEQUENCE_DETECT: c_ulong = 0x00000008;
199 pub const ISC_RET_CONFIDENTIALITY: c_ulong = 0x00000010;
200 pub const ISC_RET_USE_SESSION_KEY: c_ulong = 0x00000020;
201 pub const ISC_RET_USED_COLLECTED_CREDS: c_ulong = 0x00000040;
202 pub const ISC_RET_USED_SUPPLIED_CREDS: c_ulong = 0x00000080;
203 pub const ISC_RET_ALLOCATED_MEMORY: c_ulong = 0x00000100;
204 pub const ISC_RET_USED_DCE_STYLE: c_ulong = 0x00000200;
205 pub const ISC_RET_DATAGRAM: c_ulong = 0x00000400;
206 pub const ISC_RET_CONNECTION: c_ulong = 0x00000800;
207 pub const ISC_RET_INTERMEDIATE_RETURN: c_ulong = 0x00001000;
208 pub const ISC_RET_CALL_LEVEL: c_ulong = 0x00002000;
209 pub const ISC_RET_EXTENDED_ERROR: c_ulong = 0x00004000;
210 pub const ISC_RET_STREAM: c_ulong = 0x00008000;
211 pub const ISC_RET_INTEGRITY: c_ulong = 0x00010000;
212 pub const ISC_RET_IDENTIFY: c_ulong = 0x00020000;
213 pub const ISC_RET_NULL_SESSION: c_ulong = 0x00040000;
214 pub const ISC_RET_MANUAL_CRED_VALIDATION: c_ulong = 0x00080000;
215 pub const ISC_RET_RESERVED1: c_ulong = 0x00100000;
216 pub const ISC_RET_FRAGMENT_ONLY: c_ulong = 0x00200000;
217 pub const ISC_RET_FORWARD_CREDENTIALS: c_ulong = 0x00400000;
218 pub const ISC_RET_USED_HTTP_STYLE: c_ulong = 0x01000000;
219 pub const ISC_RET_NO_ADDITIONAL_TOKEN: c_ulong = 0x02000000;
220 pub const ISC_RET_REAUTHENTICATION: c_ulong = 0x08000000;
221 pub const ISC_RET_CONFIDENTIALITY_ONLY: c_ulong = 0x40000000;
222 pub const ASC_REQ_DELEGATE: c_ulong = 0x00000001;
223 pub const ASC_REQ_MUTUAL_AUTH: c_ulong = 0x00000002;
224 pub const ASC_REQ_REPLAY_DETECT: c_ulong = 0x00000004;
225 pub const ASC_REQ_SEQUENCE_DETECT: c_ulong = 0x00000008;
226 pub const ASC_REQ_CONFIDENTIALITY: c_ulong = 0x00000010;
227 pub const ASC_REQ_USE_SESSION_KEY: c_ulong = 0x00000020;
228 pub const ASC_REQ_SESSION_TICKET: c_ulong = 0x00000040;
229 pub const ASC_REQ_ALLOCATE_MEMORY: c_ulong = 0x00000100;
230 pub const ASC_REQ_USE_DCE_STYLE: c_ulong = 0x00000200;
231 pub const ASC_REQ_DATAGRAM: c_ulong = 0x00000400;
232 pub const ASC_REQ_CONNECTION: c_ulong = 0x00000800;
233 pub const ASC_REQ_CALL_LEVEL: c_ulong = 0x00001000;
234 pub const ASC_REQ_EXTENDED_ERROR: c_ulong = 0x00008000;
235 pub const ASC_REQ_STREAM: c_ulong = 0x00010000;
236 pub const ASC_REQ_INTEGRITY: c_ulong = 0x00020000;
237 pub const ASC_REQ_LICENSING: c_ulong = 0x00040000;
238 pub const ASC_REQ_IDENTIFY: c_ulong = 0x00080000;
239 pub const ASC_REQ_ALLOW_NULL_SESSION: c_ulong = 0x00100000;
240 pub const ASC_REQ_ALLOW_NON_USER_LOGONS: c_ulong = 0x00200000;
241 pub const ASC_REQ_ALLOW_CONTEXT_REPLAY: c_ulong = 0x00400000;
242 pub const ASC_REQ_FRAGMENT_TO_FIT: c_ulong = 0x00800000;
243 pub const ASC_REQ_FRAGMENT_SUPPLIED: c_ulong = 0x00002000;
244 pub const ASC_REQ_NO_TOKEN: c_ulong = 0x01000000;
245 pub const ASC_REQ_PROXY_BINDINGS: c_ulong = 0x04000000;
246 pub const ASC_REQ_ALLOW_MISSING_BINDINGS: c_ulong = 0x10000000;
247 pub const ASC_RET_DELEGATE: c_ulong = 0x00000001;
248 pub const ASC_RET_MUTUAL_AUTH: c_ulong = 0x00000002;
249 pub const ASC_RET_REPLAY_DETECT: c_ulong = 0x00000004;
250 pub const ASC_RET_SEQUENCE_DETECT: c_ulong = 0x00000008;
251 pub const ASC_RET_CONFIDENTIALITY: c_ulong = 0x00000010;
252 pub const ASC_RET_USE_SESSION_KEY: c_ulong = 0x00000020;
253 pub const ASC_RET_SESSION_TICKET: c_ulong = 0x00000040;
254 pub const ASC_RET_ALLOCATED_MEMORY: c_ulong = 0x00000100;
255 pub const ASC_RET_USED_DCE_STYLE: c_ulong = 0x00000200;
256 pub const ASC_RET_DATAGRAM: c_ulong = 0x00000400;
257 pub const ASC_RET_CONNECTION: c_ulong = 0x00000800;
258 pub const ASC_RET_CALL_LEVEL: c_ulong = 0x00002000;
259 pub const ASC_RET_THIRD_LEG_FAILED: c_ulong = 0x00004000;
260 pub const ASC_RET_EXTENDED_ERROR: c_ulong = 0x00008000;
261 pub const ASC_RET_STREAM: c_ulong = 0x00010000;
262 pub const ASC_RET_INTEGRITY: c_ulong = 0x00020000;
263 pub const ASC_RET_LICENSING: c_ulong = 0x00040000;
264 pub const ASC_RET_IDENTIFY: c_ulong = 0x00080000;
265 pub const ASC_RET_NULL_SESSION: c_ulong = 0x00100000;
266 pub const ASC_RET_ALLOW_NON_USER_LOGONS: c_ulong = 0x00200000;
267 pub const ASC_RET_ALLOW_CONTEXT_REPLAY: c_ulong = 0x00400000;
268 pub const ASC_RET_FRAGMENT_ONLY: c_ulong = 0x00800000;
269 pub const ASC_RET_NO_TOKEN: c_ulong = 0x01000000;
270 pub const ASC_RET_NO_ADDITIONAL_TOKEN: c_ulong = 0x02000000;
271 pub const SECPKG_CRED_ATTR_NAMES: c_ulong = 1;
272 pub const SECPKG_CRED_ATTR_SSI_PROVIDER: c_ulong = 2;
273 pub const SECPKG_CRED_ATTR_KDC_PROXY_SETTINGS: c_ulong = 3;
274 pub const SECPKG_CRED_ATTR_CERT: c_ulong = 4;
275 STRUCT!{struct SecPkgCredentials_NamesW {
276     sUserName: *mut SEC_WCHAR,
277 }}
278 pub type PSecPkgCredentials_NamesW = *mut SecPkgCredentials_NamesW;
279 STRUCT!{struct SecPkgCredentials_NamesA {
280     sUserName: *mut SEC_CHAR,
281 }}
282 pub type PSecPkgCredentials_NamesA = *mut SecPkgCredentials_NamesA;
283 STRUCT!{struct SecPkgCredentials_SSIProviderW {
284     sProviderName: *mut SEC_WCHAR,
285     ProviderInfoLength: c_ulong,
286     ProviderInfo: *mut c_char,
287 }}
288 pub type PSecPkgCredentials_SSIProviderW = *mut SecPkgCredentials_SSIProviderW;
289 STRUCT!{struct SecPkgCredentials_SSIProviderA {
290     sProviderName: *mut SEC_CHAR,
291     ProviderInfoLength: c_ulong,
292     ProviderInfo: *mut c_char,
293 }}
294 pub type PSecPkgCredentials_SSIProviderA = *mut SecPkgCredentials_SSIProviderA;
295 pub const KDC_PROXY_SETTINGS_V1: ULONG = 1;
296 pub const KDC_PROXY_SETTINGS_FLAGS_FORCEPROXY: ULONG = 0x1;
297 STRUCT!{struct SecPkgCredentials_KdcProxySettingsW {
298     Version: ULONG,
299     Flags: ULONG,
300     ProxyServerOffset: USHORT,
301     ProxyServerLength: USHORT,
302     ClientTlsCredOffset: USHORT,
303     ClientTlsCredLength: USHORT,
304 }}
305 pub type PSecPkgCredentials_KdcProxySettingsW = *mut SecPkgCredentials_KdcProxySettingsW;
306 STRUCT!{struct SecPkgCredentials_Cert {
307     EncodedCertSize: c_ulong,
308     EncodedCert: *mut c_uchar,
309 }}
310 pub type PSecPkgCredentials_Cert = *mut SecPkgCredentials_Cert;
311 pub const SECPKG_ATTR_SIZES: c_ulong = 0;
312 pub const SECPKG_ATTR_NAMES: c_ulong = 1;
313 pub const SECPKG_ATTR_LIFESPAN: c_ulong = 2;
314 pub const SECPKG_ATTR_DCE_INFO: c_ulong = 3;
315 pub const SECPKG_ATTR_STREAM_SIZES: c_ulong = 4;
316 pub const SECPKG_ATTR_KEY_INFO: c_ulong = 5;
317 pub const SECPKG_ATTR_AUTHORITY: c_ulong = 6;
318 pub const SECPKG_ATTR_PROTO_INFO: c_ulong = 7;
319 pub const SECPKG_ATTR_PASSWORD_EXPIRY: c_ulong = 8;
320 pub const SECPKG_ATTR_SESSION_KEY: c_ulong = 9;
321 pub const SECPKG_ATTR_PACKAGE_INFO: c_ulong = 10;
322 pub const SECPKG_ATTR_USER_FLAGS: c_ulong = 11;
323 pub const SECPKG_ATTR_NEGOTIATION_INFO: c_ulong = 12;
324 pub const SECPKG_ATTR_NATIVE_NAMES: c_ulong = 13;
325 pub const SECPKG_ATTR_FLAGS: c_ulong = 14;
326 pub const SECPKG_ATTR_USE_VALIDATED: c_ulong = 15;
327 pub const SECPKG_ATTR_CREDENTIAL_NAME: c_ulong = 16;
328 pub const SECPKG_ATTR_TARGET_INFORMATION: c_ulong = 17;
329 pub const SECPKG_ATTR_ACCESS_TOKEN: c_ulong = 18;
330 pub const SECPKG_ATTR_TARGET: c_ulong = 19;
331 pub const SECPKG_ATTR_AUTHENTICATION_ID: c_ulong = 20;
332 pub const SECPKG_ATTR_LOGOFF_TIME: c_ulong = 21;
333 pub const SECPKG_ATTR_NEGO_KEYS: c_ulong = 22;
334 pub const SECPKG_ATTR_PROMPTING_NEEDED: c_ulong = 24;
335 pub const SECPKG_ATTR_UNIQUE_BINDINGS: c_ulong = 25;
336 pub const SECPKG_ATTR_ENDPOINT_BINDINGS: c_ulong = 26;
337 pub const SECPKG_ATTR_CLIENT_SPECIFIED_TARGET: c_ulong = 27;
338 pub const SECPKG_ATTR_LAST_CLIENT_TOKEN_STATUS: c_ulong = 30;
339 pub const SECPKG_ATTR_NEGO_PKG_INFO: c_ulong = 31;
340 pub const SECPKG_ATTR_NEGO_STATUS: c_ulong = 32;
341 pub const SECPKG_ATTR_CONTEXT_DELETED: c_ulong = 33;
342 pub const SECPKG_ATTR_DTLS_MTU: c_ulong = 34;
343 pub const SECPKG_ATTR_DATAGRAM_SIZES: c_ulong = SECPKG_ATTR_STREAM_SIZES;
344 pub const SECPKG_ATTR_SUBJECT_SECURITY_ATTRIBUTES: c_ulong = 128;
345 pub const SECPKG_ATTR_APPLICATION_PROTOCOL: c_ulong = 35;
346 STRUCT!{struct SecPkgContext_SubjectAttributes {
347     AttributeInfo: *mut c_void,
348 }}
349 pub type PSecPkgContext_SubjectAttributes = *mut SecPkgContext_SubjectAttributes;
350 pub const SECPKG_ATTR_NEGO_INFO_FLAG_NO_KERBEROS: c_ulong = 0x1;
351 pub const SECPKG_ATTR_NEGO_INFO_FLAG_NO_NTLM: c_ulong = 0x2;
352 ENUM!{enum SECPKG_CRED_CLASS {
353     SecPkgCredClass_None = 0,
354     SecPkgCredClass_Ephemeral = 10,
355     SecPkgCredClass_PersistedGeneric = 20,
356     SecPkgCredClass_PersistedSpecific = 30,
357     SecPkgCredClass_Explicit = 40,
358 }}
359 pub type PSECPKG_CRED_CLASS = *mut SECPKG_CRED_CLASS;
360 STRUCT!{struct SecPkgContext_CredInfo {
361     CredClass: SECPKG_CRED_CLASS,
362     IsPromptingNeeded: c_ulong,
363 }}
364 pub type PSecPkgContext_CredInfo = *mut SecPkgContext_CredInfo;
365 STRUCT!{struct SecPkgContext_NegoPackageInfo {
366     PackageMask: c_ulong,
367 }}
368 pub type PSecPkgContext_NegoPackageInfo = *mut SecPkgContext_NegoPackageInfo;
369 STRUCT!{struct SecPkgContext_NegoStatus {
370     LastStatus: c_ulong,
371 }}
372 pub type PSecPkgContext_NegoStatus = *mut SecPkgContext_NegoStatus;
373 STRUCT!{struct SecPkgContext_Sizes {
374     cbMaxToken: c_ulong,
375     cbMaxSignature: c_ulong,
376     cbBlockSize: c_ulong,
377     cbSecurityTrailer: c_ulong,
378 }}
379 pub type PSecPkgContext_Sizes = *mut SecPkgContext_Sizes;
380 STRUCT!{struct SecPkgContext_StreamSizes {
381     cbHeader: c_ulong,
382     cbTrailer: c_ulong,
383     cbMaximumMessage: c_ulong,
384     cBuffers: c_ulong,
385     cbBlockSize: c_ulong,
386 }}
387 pub type PSecPkgContext_StreamSizes = *mut SecPkgContext_StreamSizes;
388 pub type SecPkgContext_DatagramSizes = SecPkgContext_StreamSizes;
389 pub type PSecPkgContext_DatagramSizes = PSecPkgContext_StreamSizes;
390 STRUCT!{struct SecPkgContext_NamesW {
391     sUserName: *mut SEC_WCHAR,
392 }}
393 pub type PSecPkgContext_NamesW = *mut SecPkgContext_NamesW;
394 ENUM!{enum SECPKG_ATTR_LCT_STATUS {
395     SecPkgAttrLastClientTokenYes,
396     SecPkgAttrLastClientTokenNo,
397     SecPkgAttrLastClientTokenMaybe,
398 }}
399 pub type PSECPKG_ATTR_LCT_STATUS = *mut SECPKG_ATTR_LCT_STATUS;
400 STRUCT!{struct SecPkgContext_LastClientTokenStatus {
401     LastClientTokenStatus: SECPKG_ATTR_LCT_STATUS,
402 }}
403 pub type PSecPkgContext_LastClientTokenStatus = *mut SecPkgContext_LastClientTokenStatus;
404 STRUCT!{struct SecPkgContext_NamesA {
405     sUserName: *mut SEC_CHAR,
406 }}
407 pub type PSecPkgContext_NamesA = *mut SecPkgContext_NamesA;
408 STRUCT!{struct SecPkgContext_Lifespan {
409     tsStart: TimeStamp,
410     tsExpiry: TimeStamp,
411 }}
412 pub type PSecPkgContext_Lifespan = *mut SecPkgContext_Lifespan;
413 STRUCT!{struct SecPkgContext_DceInfo {
414     AuthzSvc: c_ulong,
415     pPac: *mut c_void,
416 }}
417 pub type PSecPkgContext_DceInfo = *mut SecPkgContext_DceInfo;
418 STRUCT!{struct SecPkgContext_KeyInfoA {
419     sSignatureAlgorithmName: *mut SEC_CHAR,
420     sEncryptAlgorithmName: *mut SEC_CHAR,
421     KeySize: c_ulong,
422     SignatureAlgorithm: c_ulong,
423     EncryptAlgorithm: c_ulong,
424 }}
425 pub type PSecPkgContext_KeyInfoA = *mut SecPkgContext_KeyInfoA;
426 STRUCT!{struct SecPkgContext_KeyInfoW {
427     sSignatureAlgorithmName: *mut SEC_WCHAR,
428     sEncryptAlgorithmName: *mut SEC_WCHAR,
429     KeySize: c_ulong,
430     SignatureAlgorithm: c_ulong,
431     EncryptAlgorithm: c_ulong,
432 }}
433 pub type PSecPkgContext_KeyInfoW = *mut SecPkgContext_KeyInfoW;
434 STRUCT!{struct SecPkgContext_AuthorityA {
435     sAuthorityName: *mut SEC_CHAR,
436 }}
437 pub type PSecPkgContext_AuthorityA = *mut SecPkgContext_AuthorityA;
438 STRUCT!{struct SecPkgContext_AuthorityW {
439     sAuthorityName: *mut SEC_WCHAR,
440 }}
441 pub type PSecPkgContext_AuthorityW = *mut SecPkgContext_AuthorityW;
442 STRUCT!{struct SecPkgContext_ProtoInfoA {
443     sProtocolName: *mut SEC_CHAR,
444     majorVersion: c_ulong,
445     minorVersion: c_ulong,
446 }}
447 pub type PSecPkgContext_ProtoInfoA = *mut SecPkgContext_ProtoInfoA;
448 STRUCT!{struct SecPkgContext_ProtoInfoW {
449     sProtocolName: *mut SEC_WCHAR,
450     majorVersion: c_ulong,
451     minorVersion: c_ulong,
452 }}
453 pub type PSecPkgContext_ProtoInfoW = *mut SecPkgContext_ProtoInfoW;
454 STRUCT!{struct SecPkgContext_PasswordExpiry {
455     tsPasswordExpires: TimeStamp,
456 }}
457 pub type PSecPkgContext_PasswordExpiry = *mut SecPkgContext_PasswordExpiry;
458 STRUCT!{struct SecPkgContext_LogoffTime {
459     tsLogoffTime: TimeStamp,
460 }}
461 pub type PSecPkgContext_LogoffTime = *mut SecPkgContext_LogoffTime;
462 STRUCT!{struct SecPkgContext_SessionKey {
463     SessionKeyLength: c_ulong,
464     SessionKey: *mut c_uchar,
465 }}
466 pub type PSecPkgContext_SessionKey = *mut SecPkgContext_SessionKey;
467 STRUCT!{struct SecPkgContext_NegoKeys {
468     KeyType: c_ulong,
469     KeyLength: c_ushort,
470     KeyValue: *mut c_uchar,
471     VerifyKeyType: c_ulong,
472     VerifyKeyLength: c_ushort,
473     VerifyKeyValue: *mut c_uchar,
474 }}
475 pub type PSecPkgContext_NegoKeys = *mut SecPkgContext_NegoKeys;
476 STRUCT!{struct SecPkgContext_PackageInfoW {
477     PackageInfo: PSecPkgInfoW,
478 }}
479 pub type PSecPkgContext_PackageInfoW = *mut SecPkgContext_PackageInfoW;
480 STRUCT!{struct SecPkgContext_PackageInfoA {
481     PackageInfo: PSecPkgInfoA,
482 }}
483 pub type PSecPkgContext_PackageInfoA = *mut SecPkgContext_PackageInfoA;
484 STRUCT!{struct SecPkgContext_UserFlags {
485     UserFlags: c_ulong,
486 }}
487 pub type PSecPkgContext_UserFlags = *mut SecPkgContext_UserFlags;
488 STRUCT!{struct SecPkgContext_Flags {
489     Flags: c_ulong,
490 }}
491 pub type PSecPkgContext_Flags = *mut SecPkgContext_Flags;
492 STRUCT!{struct SecPkgContext_NegotiationInfoA {
493     PackageInfo: PSecPkgInfoA,
494     NegotiationState: c_ulong,
495 }}
496 pub type PSecPkgContext_NegotiationInfoA = *mut SecPkgContext_NegotiationInfoA;
497 STRUCT!{struct SecPkgContext_NegotiationInfoW {
498     PackageInfo: PSecPkgInfoW,
499     NegotiationState: c_ulong,
500 }}
501 pub type PSecPkgContext_NegotiationInfoW = *mut SecPkgContext_NegotiationInfoW;
502 pub const SECPKG_NEGOTIATION_COMPLETE: c_ulong = 0;
503 pub const SECPKG_NEGOTIATION_OPTIMISTIC: c_ulong = 1;
504 pub const SECPKG_NEGOTIATION_IN_PROGRESS: c_ulong = 2;
505 pub const SECPKG_NEGOTIATION_DIRECT: c_ulong = 3;
506 pub const SECPKG_NEGOTIATION_TRY_MULTICRED: c_ulong = 4;
507 STRUCT!{struct SecPkgContext_NativeNamesW {
508     sClientName: SEC_WCHAR,
509     sServerName: SEC_WCHAR,
510 }}
511 pub type PSecPkgContext_NativeNamesW = *mut SecPkgContext_NativeNamesW;
512 STRUCT!{struct SecPkgContext_NativeNamesA {
513     sClientName: SEC_CHAR,
514     sServerName: SEC_CHAR,
515 }}
516 pub type PSecPkgContext_NativeNamesA = *mut SecPkgContext_NativeNamesA;
517 STRUCT!{struct SecPkgContext_CredentialNameW {
518     CredentialType: c_ulong,
519     sCredentialName: *mut SEC_WCHAR,
520 }}
521 pub type PSecPkgContext_CredentialNameW = *mut SecPkgContext_CredentialNameW;
522 STRUCT!{struct SecPkgContext_CredentialNameA {
523     CredentialType: c_ulong,
524     sCredentialName: *mut SEC_CHAR,
525 }}
526 pub type PSecPkgContext_CredentialNameA = *mut SecPkgContext_CredentialNameA;
527 STRUCT!{struct SecPkgContext_AccessToken {
528     AccessToken: *mut c_void,
529 }}
530 pub type PSecPkgContext_AccessToken = *mut SecPkgContext_AccessToken;
531 STRUCT!{struct SecPkgContext_TargetInformation {
532     MarshalledTargetInfoLength: c_ulong,
533     MarshalledTargetInfo: *mut c_uchar,
534 }}
535 pub type PSecPkgContext_TargetInformation = *mut SecPkgContext_TargetInformation;
536 STRUCT!{struct SecPkgContext_AuthzID {
537     AuthzIDLength: c_ulong,
538     AuthzID: *mut c_char,
539 }}
540 pub type PSecPkgContext_AuthzID = *mut SecPkgContext_AuthzID;
541 STRUCT!{struct SecPkgContext_Target {
542     TargetLength: c_ulong,
543     Target: *mut c_char,
544 }}
545 pub type PSecPkgContext_Target = *mut SecPkgContext_Target;
546 STRUCT!{struct SecPkgContext_ClientSpecifiedTarget {
547     sTargetName: *mut SEC_WCHAR,
548 }}
549 pub type PSecPkgContext_ClientSpecifiedTarget = *mut SecPkgContext_ClientSpecifiedTarget;
550 STRUCT!{struct SecPkgContext_Bindings {
551     BindingsLength: c_ulong,
552     Bindings: *mut SEC_CHANNEL_BINDINGS,
553 }}
554 pub type PSecPkgContext_Bindings = *mut SecPkgContext_Bindings;
555 ENUM!{enum SEC_APPLICATION_PROTOCOL_NEGOTIATION_STATUS {
556     SecApplicationProtocolNegotiationStatus_None,
557     SecApplicationProtocolNegotiationStatus_Success,
558     SecApplicationProtocolNegotiationStatus_SelectedClientOnly,
559 }}
560 pub type PSEC_APPLICATION_PROTOCOL_NEGOTIATION_STATUS =
561     *mut SEC_APPLICATION_PROTOCOL_NEGOTIATION_STATUS;
562 pub const MAX_PROTOCOL_ID_SIZE: usize = 0xff;
563 STRUCT!{struct SecPkgContext_ApplicationProtocol {
564     ProtoNegoStatus: SEC_APPLICATION_PROTOCOL_NEGOTIATION_STATUS,
565     ProtoNegoExt: SEC_APPLICATION_PROTOCOL_NEGOTIATION_EXT,
566     ProtocolIdSize: c_uchar,
567     ProtocolId: [c_uchar; MAX_PROTOCOL_ID_SIZE],
568 }}
569 pub type PSecPkgContext_ApplicationProtocol = *mut SecPkgContext_ApplicationProtocol;
570 FN!{stdcall SEC_GET_KEY_FN(
571     Arg: *mut c_void,
572     Principal: *mut c_void,
573     KeyVer: c_ulong,
574     Key: *mut *mut c_void,
575     Status: *mut SECURITY_STATUS,
576 ) -> ()}
577 pub const SECPKG_CONTEXT_EXPORT_RESET_NEW: c_ulong = 0x00000001;
578 pub const SECPKG_CONTEXT_EXPORT_DELETE_OLD: c_ulong = 0x00000002;
579 pub const SECPKG_CONTEXT_EXPORT_TO_KERNEL: c_ulong = 0x00000004;
580 extern "system" {
AcquireCredentialsHandleW( pszPrincipal: LPWSTR, pszPackage: LPWSTR, fCredentialUse: c_ulong, pvLogonId: *mut c_void, pAuthData: *mut c_void, pGetKeyFn: SEC_GET_KEY_FN, pvGetKeyArgument: *mut c_void, phCredential: PCredHandle, ptsExpiry: PTimeStamp, ) -> SECURITY_STATUS581     pub fn AcquireCredentialsHandleW(
582         pszPrincipal: LPWSTR,
583         pszPackage: LPWSTR,
584         fCredentialUse: c_ulong,
585         pvLogonId: *mut c_void,
586         pAuthData: *mut c_void,
587         pGetKeyFn: SEC_GET_KEY_FN,
588         pvGetKeyArgument: *mut c_void,
589         phCredential: PCredHandle,
590         ptsExpiry: PTimeStamp,
591     ) -> SECURITY_STATUS;
592 }
593 FN!{stdcall ACQUIRE_CREDENTIALS_HANDLE_FN_W(
594     *mut SEC_WCHAR,
595     *mut SEC_WCHAR,
596     c_ulong,
597     *mut c_void,
598     *mut c_void,
599     SEC_GET_KEY_FN,
600     *mut c_void,
601     PCredHandle,
602     PTimeStamp,
603 ) -> SECURITY_STATUS}
604 extern "system" {
AcquireCredentialsHandleA( pszPrincipal: LPSTR, pszPackage: LPSTR, fCredentialUse: c_ulong, pvLogonId: *mut c_void, pAuthData: *mut c_void, pGetKeyFn: SEC_GET_KEY_FN, pvGetKeyArgument: *mut c_void, phCredential: PCredHandle, ptsExpiry: PTimeStamp, ) -> SECURITY_STATUS605     pub fn AcquireCredentialsHandleA(
606         pszPrincipal: LPSTR,
607         pszPackage: LPSTR,
608         fCredentialUse: c_ulong,
609         pvLogonId: *mut c_void,
610         pAuthData: *mut c_void,
611         pGetKeyFn: SEC_GET_KEY_FN,
612         pvGetKeyArgument: *mut c_void,
613         phCredential: PCredHandle,
614         ptsExpiry: PTimeStamp,
615     ) -> SECURITY_STATUS;
616 }
617 FN!{stdcall ACQUIRE_CREDENTIALS_HANDLE_FN_A(
618     *mut SEC_CHAR,
619     *mut SEC_CHAR,
620     c_ulong,
621     *mut c_void,
622     *mut c_void,
623     SEC_GET_KEY_FN,
624     *mut c_void,
625     PCredHandle,
626     PTimeStamp,
627 ) -> SECURITY_STATUS}
628 extern "system" {
FreeCredentialsHandle( phCredential: PCredHandle, ) -> SECURITY_STATUS629     pub fn FreeCredentialsHandle(
630         phCredential: PCredHandle,
631     ) -> SECURITY_STATUS;
632 }
633 FN!{stdcall FREE_CREDENTIALS_HANDLE_FN(
634     PCredHandle,
635 ) -> SECURITY_STATUS}
636 extern "system" {
AddCredentialsW( hCredentials: PCredHandle, pszPrincipal: LPWSTR, pszPackage: LPWSTR, fCredentialUse: c_ulong, pAuthData: *mut c_void, pGetKeyFn: SEC_GET_KEY_FN, pvGetKeyArgument: *mut c_void, ptsExpiry: PTimeStamp, ) -> SECURITY_STATUS637     pub fn AddCredentialsW(
638         hCredentials: PCredHandle,
639         pszPrincipal: LPWSTR,
640         pszPackage: LPWSTR,
641         fCredentialUse: c_ulong,
642         pAuthData: *mut c_void,
643         pGetKeyFn: SEC_GET_KEY_FN,
644         pvGetKeyArgument: *mut c_void,
645         ptsExpiry: PTimeStamp,
646     ) -> SECURITY_STATUS;
647 }
648 FN!{stdcall ADD_CREDENTIALS_FN_W(
649     PCredHandle,
650     *mut SEC_WCHAR,
651     *mut SEC_WCHAR,
652     c_ulong,
653     *mut c_void,
654     SEC_GET_KEY_FN,
655     *mut c_void,
656     PTimeStamp,
657 ) -> SECURITY_STATUS}
658 extern "system" {
AddCredentialsA( hCredentials: PCredHandle, pszPrincipal: LPSTR, pszPackage: LPSTR, fCredentialUse: c_ulong, pAuthData: *mut c_void, pGetKeyFn: SEC_GET_KEY_FN, pvGetKeyArgument: *mut c_void, ptsExpiry: PTimeStamp, ) -> SECURITY_STATUS659     pub fn AddCredentialsA(
660         hCredentials: PCredHandle,
661         pszPrincipal: LPSTR,
662         pszPackage: LPSTR,
663         fCredentialUse: c_ulong,
664         pAuthData: *mut c_void,
665         pGetKeyFn: SEC_GET_KEY_FN,
666         pvGetKeyArgument: *mut c_void,
667         ptsExpiry: PTimeStamp,
668     ) -> SECURITY_STATUS;
669 }
670 FN!{stdcall ADD_CREDENTIALS_FN_A(
671     PCredHandle,
672     *mut SEC_CHAR,
673     *mut SEC_CHAR,
674     c_ulong,
675     *mut c_void,
676     SEC_GET_KEY_FN,
677     *mut c_void,
678     PTimeStamp,
679 ) -> SECURITY_STATUS}
680 extern "system" {
681     // pub fn spiCreateAsyncContext();
682     // pub fn SspiFreeAsyncContext();
683     // pub fn SspiReinitAsyncContext();
684     // pub fn SspiSetAsyncNotifyCallback();
685     // pub fn SspiAsyncContextRequiresNotify();
686     // pub fn SspiGetAsyncCallStatus();
687     // pub fn SspiAcquireCredentialsHandleAsyncW();
688     // pub fn SspiAcquireCredentialsHandleAsyncA();
689     // pub fn SspiInitializeSecurityContextAsyncW();
690     // pub fn SspiInitializeSecurityContextAsyncA();
691     // pub fn SspiAcceptSecurityContextAsync();
692     // pub fn SspiFreeCredentialsHandleAsync();
693     // pub fn SspiDeleteSecurityContextAsync();
ChangeAccountPasswordW( pszPackageName: *mut SEC_WCHAR, pszDomainName: *mut SEC_WCHAR, pszAccountName: *mut SEC_WCHAR, pszOldPassword: *mut SEC_WCHAR, pszNewPassword: *mut SEC_WCHAR, bImpersonating: BOOLEAN, dwReserved: c_ulong, pOutput: PSecBufferDesc, ) -> SECURITY_STATUS694     pub fn ChangeAccountPasswordW(
695         pszPackageName: *mut SEC_WCHAR,
696         pszDomainName: *mut SEC_WCHAR,
697         pszAccountName: *mut SEC_WCHAR,
698         pszOldPassword: *mut SEC_WCHAR,
699         pszNewPassword: *mut SEC_WCHAR,
700         bImpersonating: BOOLEAN,
701         dwReserved: c_ulong,
702         pOutput: PSecBufferDesc,
703     ) -> SECURITY_STATUS;
704 }
705 FN!{stdcall CHANGE_PASSWORD_FN_W(
706     *mut SEC_WCHAR,
707     *mut SEC_WCHAR,
708     *mut SEC_WCHAR,
709     *mut SEC_WCHAR,
710     *mut SEC_WCHAR,
711     BOOLEAN,
712     c_ulong,
713     PSecBufferDesc,
714 ) -> SECURITY_STATUS}
715 extern "system" {
ChangeAccountPasswordA( pszPackageName: *mut SEC_CHAR, pszDomainName: *mut SEC_CHAR, pszAccountName: *mut SEC_CHAR, pszOldPassword: *mut SEC_CHAR, pszNewPassword: *mut SEC_CHAR, bImpersonating: BOOLEAN, dwReserved: c_ulong, pOutput: PSecBufferDesc, ) -> SECURITY_STATUS716     pub fn ChangeAccountPasswordA(
717         pszPackageName: *mut SEC_CHAR,
718         pszDomainName: *mut SEC_CHAR,
719         pszAccountName: *mut SEC_CHAR,
720         pszOldPassword: *mut SEC_CHAR,
721         pszNewPassword: *mut SEC_CHAR,
722         bImpersonating: BOOLEAN,
723         dwReserved: c_ulong,
724         pOutput: PSecBufferDesc,
725     ) -> SECURITY_STATUS;
726 }
727 FN!{stdcall CHANGE_PASSWORD_FN_A(
728     *mut SEC_CHAR,
729     *mut SEC_CHAR,
730     *mut SEC_CHAR,
731     *mut SEC_CHAR,
732     *mut SEC_CHAR,
733     BOOLEAN,
734     c_ulong,
735     PSecBufferDesc,
736 ) -> SECURITY_STATUS}
737 extern "system" {
InitializeSecurityContextW( phCredential: PCredHandle, phContext: PCtxtHandle, pszTargetName: *mut SEC_WCHAR, fContextReq: c_ulong, Reserved1: c_ulong, TargetDataRep: c_ulong, pInput: PSecBufferDesc, Reserved2: c_ulong, phNewContext: PCtxtHandle, pOutput: PSecBufferDesc, pfContextAttr: *mut c_ulong, ptsExpiry: PTimeStamp, ) -> SECURITY_STATUS738     pub fn InitializeSecurityContextW(
739         phCredential: PCredHandle,
740         phContext: PCtxtHandle,
741         pszTargetName: *mut SEC_WCHAR,
742         fContextReq: c_ulong,
743         Reserved1: c_ulong,
744         TargetDataRep: c_ulong,
745         pInput: PSecBufferDesc,
746         Reserved2: c_ulong,
747         phNewContext: PCtxtHandle,
748         pOutput: PSecBufferDesc,
749         pfContextAttr: *mut c_ulong,
750         ptsExpiry: PTimeStamp,
751     ) -> SECURITY_STATUS;
752 }
753 // INITIALIZE_SECURITY_CONTEXT_FN_W
754 extern "system" {
InitializeSecurityContextA( phCredential: PCredHandle, phContext: PCtxtHandle, pszTargetName: *mut SEC_CHAR, fContextReq: c_ulong, Reserved1: c_ulong, TargetDataRep: c_ulong, pInput: PSecBufferDesc, Reserved2: c_ulong, phNewContext: PCtxtHandle, pOutput: PSecBufferDesc, pfContextAttr: *mut c_ulong, ptsExpiry: PTimeStamp, ) -> SECURITY_STATUS755     pub fn InitializeSecurityContextA(
756         phCredential: PCredHandle,
757         phContext: PCtxtHandle,
758         pszTargetName: *mut SEC_CHAR,
759         fContextReq: c_ulong,
760         Reserved1: c_ulong,
761         TargetDataRep: c_ulong,
762         pInput: PSecBufferDesc,
763         Reserved2: c_ulong,
764         phNewContext: PCtxtHandle,
765         pOutput: PSecBufferDesc,
766         pfContextAttr: *mut c_ulong,
767         ptsExpiry: PTimeStamp,
768     ) -> SECURITY_STATUS;
AcceptSecurityContext( phCredential: PCredHandle, phContext: PCtxtHandle, pInput: PSecBufferDesc, fContextReq: c_ulong, TargetDataRep: c_ulong, phNewContext: PCtxtHandle, pOutput: PSecBufferDesc, pfContextAttr: *mut c_ulong, ptsExpiry: PTimeStamp, ) -> SECURITY_STATUS769     pub fn AcceptSecurityContext(
770         phCredential: PCredHandle,
771         phContext: PCtxtHandle,
772         pInput: PSecBufferDesc,
773         fContextReq: c_ulong,
774         TargetDataRep: c_ulong,
775         phNewContext: PCtxtHandle,
776         pOutput: PSecBufferDesc,
777         pfContextAttr: *mut c_ulong,
778         ptsExpiry: PTimeStamp,
779     ) -> SECURITY_STATUS;
CompleteAuthToken( phContext: PCtxtHandle, pToken: PSecBufferDesc, ) -> SECURITY_STATUS780     pub fn CompleteAuthToken(
781         phContext: PCtxtHandle,
782         pToken: PSecBufferDesc,
783     ) -> SECURITY_STATUS;
ImpersonateSecurityContext( phContext: PCtxtHandle, ) -> SECURITY_STATUS784     pub fn ImpersonateSecurityContext(
785         phContext: PCtxtHandle,
786     ) -> SECURITY_STATUS;
RevertSecurityContext( phContext: PCtxtHandle, ) -> SECURITY_STATUS787     pub fn RevertSecurityContext(
788         phContext: PCtxtHandle,
789     ) -> SECURITY_STATUS;
QuerySecurityContextToken( phContext: PCtxtHandle, Token: *mut *mut c_void, ) -> SECURITY_STATUS790     pub fn QuerySecurityContextToken(
791         phContext: PCtxtHandle,
792         Token: *mut *mut c_void,
793     ) -> SECURITY_STATUS;
DeleteSecurityContext( phContext: PCtxtHandle, ) -> SECURITY_STATUS794     pub fn DeleteSecurityContext(
795         phContext: PCtxtHandle,
796     ) -> SECURITY_STATUS;
ApplyControlToken( phContext: PCtxtHandle, pInput: PSecBufferDesc, ) -> SECURITY_STATUS797     pub fn ApplyControlToken(
798         phContext: PCtxtHandle,
799         pInput: PSecBufferDesc,
800     ) -> SECURITY_STATUS;
QueryContextAttributesW( phContext: PCtxtHandle, ulAttribute: c_ulong, pBuffer: *mut c_void, ) -> SECURITY_STATUS801     pub fn QueryContextAttributesW(
802         phContext: PCtxtHandle,
803         ulAttribute: c_ulong,
804         pBuffer: *mut c_void,
805     ) -> SECURITY_STATUS;
806     // pub fn QueryContextAttributesExW();
QueryContextAttributesA( phContext: PCtxtHandle, ulAttribute: c_ulong, pBuffer: *mut c_void, ) -> SECURITY_STATUS807     pub fn QueryContextAttributesA(
808         phContext: PCtxtHandle,
809         ulAttribute: c_ulong,
810         pBuffer: *mut c_void,
811     ) -> SECURITY_STATUS;
812     // pub fn QueryContextAttributesExA();
SetContextAttributesW( phContext: PCtxtHandle, ulAttribute: c_ulong, pBuffer: *mut c_void, cbBuffer: c_ulong, ) -> SECURITY_STATUS813     pub fn SetContextAttributesW(
814         phContext: PCtxtHandle,
815         ulAttribute: c_ulong,
816         pBuffer: *mut c_void,
817         cbBuffer: c_ulong,
818     ) -> SECURITY_STATUS;
SetContextAttributesA( phContext: PCtxtHandle, ulAttribute: c_ulong, pBuffer: *mut c_void, cbBuffer: c_ulong, ) -> SECURITY_STATUS819     pub fn SetContextAttributesA(
820         phContext: PCtxtHandle,
821         ulAttribute: c_ulong,
822         pBuffer: *mut c_void,
823         cbBuffer: c_ulong,
824     ) -> SECURITY_STATUS;
QueryCredentialsAttributesW( phCredential: PCredHandle, ulAttribute: c_ulong, pBuffer: *mut c_void, ) -> SECURITY_STATUS825     pub fn QueryCredentialsAttributesW(
826         phCredential: PCredHandle,
827         ulAttribute: c_ulong,
828         pBuffer: *mut c_void,
829     ) -> SECURITY_STATUS;
830     // pub fn QueryCredentialsAttributesExW();
QueryCredentialsAttributesA( phCredential: PCredHandle, ulAttribute: c_ulong, pBuffer: *mut c_void, ) -> SECURITY_STATUS831     pub fn QueryCredentialsAttributesA(
832         phCredential: PCredHandle,
833         ulAttribute: c_ulong,
834         pBuffer: *mut c_void,
835     ) -> SECURITY_STATUS;
836     // pub fn QueryCredentialsAttributesExA();
SetCredentialsAttributesW( phCredential: PCredHandle, ulAttribute: c_ulong, pBuffer: *mut c_void, cbBuffer: c_ulong, ) -> SECURITY_STATUS837     pub fn SetCredentialsAttributesW(
838         phCredential: PCredHandle,
839         ulAttribute: c_ulong,
840         pBuffer: *mut c_void,
841         cbBuffer: c_ulong,
842     ) -> SECURITY_STATUS;
SetCredentialsAttributesA( phCredential: PCredHandle, ulAttribute: c_ulong, pBuffer: *mut c_void, cbBuffer: c_ulong, ) -> SECURITY_STATUS843     pub fn SetCredentialsAttributesA(
844         phCredential: PCredHandle,
845         ulAttribute: c_ulong,
846         pBuffer: *mut c_void,
847         cbBuffer: c_ulong,
848     ) -> SECURITY_STATUS;
FreeContextBuffer( pvContextBuffer: PVOID, ) -> SECURITY_STATUS849     pub fn FreeContextBuffer(
850         pvContextBuffer: PVOID,
851     ) -> SECURITY_STATUS;
MakeSignature( phContext: PCtxtHandle, fQOP: c_ulong, pMessage: PSecBufferDesc, MessageSeqNo: c_ulong, ) -> SECURITY_STATUS852     pub fn MakeSignature(
853         phContext: PCtxtHandle,
854         fQOP: c_ulong,
855         pMessage: PSecBufferDesc,
856         MessageSeqNo: c_ulong,
857     ) -> SECURITY_STATUS;
VerifySignature( phContext: PCtxtHandle, pMessage: PSecBufferDesc, MessageSeqNo: c_ulong, pfQOP: *mut c_ulong, ) -> SECURITY_STATUS858     pub fn VerifySignature(
859         phContext: PCtxtHandle,
860         pMessage: PSecBufferDesc,
861         MessageSeqNo: c_ulong,
862         pfQOP: *mut c_ulong,
863     ) -> SECURITY_STATUS;
EncryptMessage( phContext: PCtxtHandle, fQOP: c_ulong, pMessage: PSecBufferDesc, MessageSeqNo: c_ulong, ) -> SECURITY_STATUS864     pub fn EncryptMessage(
865         phContext: PCtxtHandle,
866         fQOP: c_ulong,
867         pMessage: PSecBufferDesc,
868         MessageSeqNo: c_ulong,
869     ) -> SECURITY_STATUS;
DecryptMessage( phContext: PCtxtHandle, pMessage: PSecBufferDesc, MessageSeqNo: c_ulong, pfQOP: *mut c_ulong, ) -> SECURITY_STATUS870     pub fn DecryptMessage(
871         phContext: PCtxtHandle,
872         pMessage: PSecBufferDesc,
873         MessageSeqNo: c_ulong,
874         pfQOP: *mut c_ulong,
875     ) -> SECURITY_STATUS;
EnumerateSecurityPackagesW( pcPackages: *mut c_ulong, ppPackageInfo: *mut PSecPkgInfoW, ) -> SECURITY_STATUS876     pub fn EnumerateSecurityPackagesW(
877         pcPackages: *mut c_ulong,
878         ppPackageInfo: *mut PSecPkgInfoW,
879     ) -> SECURITY_STATUS;
EnumerateSecurityPackagesA( pcPackages: *mut c_ulong, ppPackageInfo: *mut PSecPkgInfoA, ) -> SECURITY_STATUS880     pub fn EnumerateSecurityPackagesA(
881         pcPackages: *mut c_ulong,
882         ppPackageInfo: *mut PSecPkgInfoA,
883     ) -> SECURITY_STATUS;
QuerySecurityPackageInfoW( pszPackageName: LPWSTR, ppPackageInfo: *mut PSecPkgInfoW, ) -> SECURITY_STATUS884     pub fn QuerySecurityPackageInfoW(
885         pszPackageName: LPWSTR,
886         ppPackageInfo: *mut PSecPkgInfoW,
887     ) -> SECURITY_STATUS;
QuerySecurityPackageInfoA( pszPackageName: LPSTR, ppPackageInfo: *mut PSecPkgInfoA, ) -> SECURITY_STATUS888     pub fn QuerySecurityPackageInfoA(
889         pszPackageName: LPSTR,
890         ppPackageInfo: *mut PSecPkgInfoA,
891     ) -> SECURITY_STATUS;
892 }
893 ENUM!{enum SecDelegationType {
894     SecFull,
895     SecService,
896     SecTree,
897     SecDirectory,
898     SecObject,
899 }}
900 pub type PSecDelegationType = *mut SecDelegationType;
901 extern "system" {
902     // pub fn DelegateSecurityContext();
ExportSecurityContext( phContext: PCtxtHandle, fFlags: ULONG, pPackedContext: PSecBuffer, pToken: *mut *mut c_void, ) -> SECURITY_STATUS903     pub fn ExportSecurityContext(
904         phContext: PCtxtHandle,
905         fFlags: ULONG,
906         pPackedContext: PSecBuffer,
907         pToken: *mut *mut c_void,
908     ) -> SECURITY_STATUS;
ImportSecurityContextW( pszPackage: LPWSTR, pPackedContext: PSecBuffer, Token: *mut c_void, phContext: PCtxtHandle, ) -> SECURITY_STATUS909     pub fn ImportSecurityContextW(
910         pszPackage: LPWSTR,
911         pPackedContext: PSecBuffer,
912         Token: *mut c_void,
913         phContext: PCtxtHandle,
914     ) -> SECURITY_STATUS;
ImportSecurityContextA( pszPackage: LPSTR, pPackedContext: PSecBuffer, Token: *mut c_void, phContext: PCtxtHandle, ) -> SECURITY_STATUS915     pub fn ImportSecurityContextA(
916         pszPackage: LPSTR,
917         pPackedContext: PSecBuffer,
918         Token: *mut c_void,
919         phContext: PCtxtHandle,
920     ) -> SECURITY_STATUS;
921 // pub fn SecMakeSPN();
922 // pub fn SecMakeSPNEx();
923 // pub fn SecMakeSPNEx2();
924 // pub fn SecLookupAccountSid();
925 // pub fn SecLookupAccountName();
926 // pub fn SecLookupWellKnownSid();
927 }
928 extern "system" {
929     // pub fn InitSecurityInterfaceA();
930     // pub fn InitSecurityInterfaceW();
931     // pub fn SaslEnumerateProfilesA();
932     // pub fn SaslEnumerateProfilesW();
933     // pub fn SaslGetProfilePackageA();
934     // pub fn SaslGetProfilePackageW();
935     // pub fn SaslIdentifyPackageA();
936     // pub fn SaslIdentifyPackageW();
937     // pub fn SaslInitializeSecurityContextW();
938     // pub fn SaslInitializeSecurityContextA();
939     // pub fn SaslAcceptSecurityContext();
940     // pub fn SaslSetContextOption();
941     // pub fn SaslGetContextOption();
942 }
943 pub type PSEC_WINNT_AUTH_IDENTITY_OPAQUE = PVOID;
944 extern "system" {
SspiPromptForCredentialsW( pszTargetName: PCWSTR, pUiInfo: PCREDUI_INFOW, dwAuthError: c_ulong, pszPackage: PCWSTR, pInputAuthIdentity: PSEC_WINNT_AUTH_IDENTITY_OPAQUE, ppAuthIdentity: *mut PSEC_WINNT_AUTH_IDENTITY_OPAQUE, pfSave: *mut c_int, dwFlags: c_ulong, ) -> c_ulong945     pub fn SspiPromptForCredentialsW(
946         pszTargetName: PCWSTR,
947         pUiInfo: PCREDUI_INFOW,
948         dwAuthError: c_ulong,
949         pszPackage: PCWSTR,
950         pInputAuthIdentity: PSEC_WINNT_AUTH_IDENTITY_OPAQUE,
951         ppAuthIdentity: *mut PSEC_WINNT_AUTH_IDENTITY_OPAQUE,
952         pfSave: *mut c_int,
953         dwFlags: c_ulong,
954     ) -> c_ulong;
SspiPromptForCredentialsA( pszTargetName: PCSTR, pUiInfo: PCREDUI_INFOA, dwAuthError: c_ulong, pszPackage: PCSTR, pInputAuthIdentity: PSEC_WINNT_AUTH_IDENTITY_OPAQUE, ppAuthIdentity: *mut PSEC_WINNT_AUTH_IDENTITY_OPAQUE, pfSave: *mut c_int, dwFlags: c_ulong, ) -> c_ulong955     pub fn SspiPromptForCredentialsA(
956         pszTargetName: PCSTR,
957         pUiInfo: PCREDUI_INFOA,
958         dwAuthError: c_ulong,
959         pszPackage: PCSTR,
960         pInputAuthIdentity: PSEC_WINNT_AUTH_IDENTITY_OPAQUE,
961         ppAuthIdentity: *mut PSEC_WINNT_AUTH_IDENTITY_OPAQUE,
962         pfSave: *mut c_int,
963         dwFlags: c_ulong,
964     ) -> c_ulong;
965 }
966 STRUCT!{struct SEC_WINNT_AUTH_BYTE_VECTOR {
967     ByteArrayOffset: c_ulong,
968     ByteArrayLength: c_ushort,
969 }}
970 pub type PSEC_WINNT_AUTH_BYTE_VECTOR = *mut SEC_WINNT_AUTH_BYTE_VECTOR;
971 STRUCT!{struct SEC_WINNT_AUTH_DATA {
972     CredType: GUID,
973     CredData: SEC_WINNT_AUTH_BYTE_VECTOR,
974 }}
975 pub type PSEC_WINNT_AUTH_DATA = *mut SEC_WINNT_AUTH_DATA;
976 STRUCT!{struct SEC_WINNT_AUTH_PACKED_CREDENTIALS {
977     cbHeaderLength: c_ushort,
978     cbStructureLength: c_ushort,
979     AuthData: SEC_WINNT_AUTH_DATA,
980 }}
981 pub type PSEC_WINNT_AUTH_PACKED_CREDENTIALS = *mut SEC_WINNT_AUTH_PACKED_CREDENTIALS;
982 DEFINE_GUID!(SEC_WINNT_AUTH_DATA_TYPE_PASSWORD,
983     0x28bfc32f, 0x10f6, 0x4738, 0x98, 0xd1, 0x1a, 0xc0, 0x61, 0xdf, 0x71, 0x6a);
984 DEFINE_GUID!(SEC_WINNT_AUTH_DATA_TYPE_CERT,
985     0x235f69ad, 0x73fb, 0x4dbc, 0x82, 0x3, 0x6, 0x29, 0xe7, 0x39, 0x33, 0x9b);
986 STRUCT!{struct SEC_WINNT_AUTH_DATA_PASSWORD {
987     UnicodePassword: SEC_WINNT_AUTH_BYTE_VECTOR,
988 }}
989 pub type PSEC_WINNT_AUTH_DATA_PASSWORD = *mut SEC_WINNT_AUTH_DATA_PASSWORD;
990 DEFINE_GUID!(SEC_WINNT_AUTH_DATA_TYPE_CSP_DATA,
991     0x68fd9879, 0x79c, 0x4dfe, 0x82, 0x81, 0x57, 0x8a, 0xad, 0xc1, 0xc1, 0x0);
992 // GUID SEC_WINNT_AUTH_DATA_TYPE_SMARTCARD_CONTEXTS
993 STRUCT!{struct SEC_WINNT_AUTH_CERTIFICATE_DATA {
994     cbHeaderLength: c_ushort,
995     cbStructureLength: c_ushort,
996     Certificate: SEC_WINNT_AUTH_BYTE_VECTOR,
997 }}
998 pub type PSEC_WINNT_AUTH_CERTIFICATE_DATA = *mut SEC_WINNT_AUTH_CERTIFICATE_DATA;
999 STRUCT!{struct SEC_WINNT_CREDUI_CONTEXT_VECTOR {
1000     CredUIContextArrayOffset: ULONG,
1001     CredUIContextCount: USHORT,
1002 }}
1003 pub type PSEC_WINNT_CREDUI_CONTEXT_VECTOR = *mut SEC_WINNT_CREDUI_CONTEXT_VECTOR;
1004 STRUCT!{struct SEC_WINNT_AUTH_SHORT_VECTOR {
1005     ShortArrayOffset: ULONG,
1006     ShortArrayCount: USHORT,
1007 }}
1008 pub type PSEC_WINNT_AUTH_SHORT_VECTOR = *mut SEC_WINNT_AUTH_SHORT_VECTOR;
1009 extern "system" {
SspiGetCredUIContext( ContextHandle: HANDLE, CredType: *mut GUID, LogonId: *mut LUID, CredUIContexts: *mut PSEC_WINNT_CREDUI_CONTEXT_VECTOR, TokenHandle: *mut HANDLE, ) -> SECURITY_STATUS1010     pub fn SspiGetCredUIContext(
1011         ContextHandle: HANDLE,
1012         CredType: *mut GUID,
1013         LogonId: *mut LUID,
1014         CredUIContexts: *mut PSEC_WINNT_CREDUI_CONTEXT_VECTOR,
1015         TokenHandle: *mut HANDLE,
1016     ) -> SECURITY_STATUS;
SspiUpdateCredentials( ContextHandle: HANDLE, CredType: *mut GUID, FlatCredUIContextLength: ULONG, FlatCredUIContext: PUCHAR, ) -> SECURITY_STATUS1017     pub fn SspiUpdateCredentials(
1018         ContextHandle: HANDLE,
1019         CredType: *mut GUID,
1020         FlatCredUIContextLength: ULONG,
1021         FlatCredUIContext: PUCHAR,
1022     ) -> SECURITY_STATUS;
1023 }
1024 STRUCT!{struct CREDUIWIN_MARSHALED_CONTEXT {
1025     StructureType: GUID,
1026     cbHeaderLength: USHORT,
1027     LogonId: LUID,
1028     MarshaledDataType: GUID,
1029     MarshaledDataOffset: ULONG,
1030     MarshaledDataLength: USHORT,
1031 }}
1032 pub type PCREDUIWIN_MARSHALED_CONTEXT = *mut CREDUIWIN_MARSHALED_CONTEXT;
1033 STRUCT!{struct SEC_WINNT_CREDUI_CONTEXT {
1034     cbHeaderLength: USHORT,
1035     CredUIContextHandle: HANDLE,
1036     UIInfo: PCREDUI_INFOW,
1037     dwAuthError: ULONG,
1038     pInputAuthIdentity: PSEC_WINNT_AUTH_IDENTITY_OPAQUE,
1039     TargetName: PUNICODE_STRING,
1040 }}
1041 pub type PSEC_WINNT_CREDUI_CONTEXT = *mut SEC_WINNT_CREDUI_CONTEXT;
1042 // GUID CREDUIWIN_STRUCTURE_TYPE_SSPIPFC
1043 // GUID SSPIPFC_STRUCTURE_TYPE_CREDUI_CONTEXT
1044 extern "system" {
SspiUnmarshalCredUIContext( MarshaledCredUIContext: PUCHAR, MarshaledCredUIContextLength: ULONG, CredUIContext: *mut PSEC_WINNT_CREDUI_CONTEXT, ) -> SECURITY_STATUS1045     pub fn SspiUnmarshalCredUIContext(
1046         MarshaledCredUIContext: PUCHAR,
1047         MarshaledCredUIContextLength: ULONG,
1048         CredUIContext: *mut PSEC_WINNT_CREDUI_CONTEXT,
1049     ) -> SECURITY_STATUS;
1050     // pub fn SspiPrepareForCredRead();
1051     // pub fn SspiPrepareForCredWrite();
1052     // pub fn SspiEncryptAuthIdentity();
1053     // pub fn SspiEncryptAuthIdentityEx();
1054     // pub fn SspiDecryptAuthIdentity();
1055     // pub fn SspiDecryptAuthIdentityEx();
1056     // pub fn SspiIsAuthIdentityEncrypted();
1057     // pub fn SspiEncodeAuthIdentityAsStrings();
1058     // pub fn SspiValidateAuthIdentity();
1059     // pub fn SspiCopyAuthIdentity();
1060     // pub fn SspiFreeAuthIdentity();
1061     // pub fn SspiZeroAuthIdentity();
1062     // pub fn SspiLocalFree();
1063     // pub fn SspiEncodeStringsAsAuthIdentity();
1064     // pub fn SspiCompareAuthIdentities();
1065     // pub fn SspiMarshalAuthIdentity();
1066     // pub fn SspiUnmarshalAuthIdentity();
SspiIsPromptingNeeded( ErrorOrNtStatus: c_ulong, ) -> BOOLEAN1067     pub fn SspiIsPromptingNeeded(
1068         ErrorOrNtStatus: c_ulong,
1069     ) -> BOOLEAN;
1070     // pub fn SspiGetTargetHostName();
1071     // pub fn SspiExcludePackage();
1072     // pub fn AddSecurityPackageA();
1073     // pub fn AddSecurityPackageW();
1074     // pub fn DeleteSecurityPackageA();
1075     // pub fn DeleteSecurityPackageW();
1076 }
1077