4 #pragma GCC system_header
15 #define SECPKG_CRED_INBOUND 1
16 #define SECPKG_CRED_OUTBOUND 2
17 #define SECPKG_CRED_BOTH (SECPKG_CRED_OUTBOUND|SECPKG_CRED_INBOUND)
18 #define SECPKG_CRED_ATTR_NAMES 1
20 #define SECPKG_FLAG_INTEGRITY 1
21 #define SECPKG_FLAG_PRIVACY 2
22 #define SECPKG_FLAG_TOKEN_ONLY 4
23 #define SECPKG_FLAG_DATAGRAM 8
24 #define SECPKG_FLAG_CONNECTION 16
25 #define SECPKG_FLAG_MULTI_REQUIRED 32
26 #define SECPKG_FLAG_CLIENT_ONLY 64
27 #define SECPKG_FLAG_EXTENDED_ERROR 128
28 #define SECPKG_FLAG_IMPERSONATION 256
29 #define SECPKG_FLAG_ACCEPT_WIN32_NAME 512
30 #define SECPKG_FLAG_STREAM 1024
32 #define SECPKG_ATTR_AUTHORITY 6
33 #define SECPKG_ATTR_CONNECTION_INFO 90
34 #define SECPKG_ATTR_ISSUER_LIST 80
35 #define SECPKG_ATTR_ISSUER_LIST_EX 89
36 #define SECPKG_ATTR_KEY_INFO 5
37 #define SECPKG_ATTR_LIFESPAN 2
38 #define SECPKG_ATTR_LOCAL_CERT_CONTEXT 84
39 #define SECPKG_ATTR_LOCAL_CRED 82
40 #define SECPKG_ATTR_NAMES 1
41 #define SECPKG_ATTR_PROTO_INFO 7
42 #define SECPKG_ATTR_REMOTE_CERT_CONTEXT 83
43 #define SECPKG_ATTR_REMOTE_CRED 81
44 #define SECPKG_ATTR_SIZES 0
45 #define SECPKG_ATTR_STREAM_SIZES 4
47 #define SECBUFFER_EMPTY 0
48 #define SECBUFFER_DATA 1
49 #define SECBUFFER_TOKEN 2
50 #define SECBUFFER_PKG_PARAMS 3
51 #define SECBUFFER_MISSING 4
52 #define SECBUFFER_EXTRA 5
53 #define SECBUFFER_STREAM_TRAILER 6
54 #define SECBUFFER_STREAM_HEADER 7
55 #define SECBUFFER_PADDING 9
56 #define SECBUFFER_STREAM 10
57 #define SECBUFFER_READONLY 0x80000000
58 #define SECBUFFER_ATTRMASK 0xf0000000
60 #define UNISP_NAME_A "Microsoft Unified Security Protocol Provider"
61 #define UNISP_NAME_W L"Microsoft Unified Security Protocol Provider"
62 #define SECBUFFER_VERSION 0
64 typedef UNICODE_STRING SECURITY_STRING, *PSECURITY_STRING;
66 typedef struct _SecHandle {
69 } SecHandle, *PSecHandle;
70 typedef struct _SecBuffer {
74 } SecBuffer, *PSecBuffer;
75 typedef SecHandle CredHandle;
76 typedef PSecHandle PCredHandle;
77 typedef SecHandle CtxtHandle;
78 typedef PSecHandle PCtxtHandle;
79 typedef struct _SECURITY_INTEGER {
80 unsigned long LowPart;
83 typedef SECURITY_INTEGER TimeStamp, *PTimeStamp;
84 typedef struct _SecBufferDesc {
88 } SecBufferDesc, *PSecBufferDesc;
89 typedef struct _SecPkgContext_StreamSizes {
92 ULONG cbMaximumMessage;
95 } SecPkgContext_StreamSizes, *PSecPkgContext_StreamSizes;
96 typedef struct _SecPkgContext_Sizes {
100 ULONG cbSecurityTrailer;
101 } SecPkgContext_Sizes, *PSecPkgContext_Sizes;
102 typedef struct _SecPkgContext_AuthorityW {
103 SEC_WCHAR* sAuthorityName;
104 } SecPkgContext_AuthorityW, *PSecPkgContext_AuthorityW;
105 typedef struct _SecPkgContext_AuthorityA {
106 SEC_CHAR* sAuthorityName;
107 } SecPkgContext_AuthorityA, *PSecPkgContext_AuthorityA;
108 typedef struct _SecPkgContext_KeyInfoW {
109 SEC_WCHAR* sSignatureAlgorithmName;
110 SEC_WCHAR* sEncryptAlgorithmName;
112 ULONG SignatureAlgorithm;
113 ULONG EncryptAlgorithm;
114 } SecPkgContext_KeyInfoW, *PSecPkgContext_KeyInfoW;
115 typedef struct _SecPkgContext_KeyInfoA {
116 SEC_CHAR* sSignatureAlgorithmName;
117 SEC_CHAR* sEncryptAlgorithmName;
119 ULONG SignatureAlgorithm;
120 ULONG EncryptAlgorithm;
121 } SecPkgContext_KeyInfoA, *PSecPkgContext_KeyInfoA;
122 typedef struct _SecPkgContext_LifeSpan {
125 } SecPkgContext_LifeSpan, *PSecPkgContext_LifeSpan;
126 typedef struct _SecPkgContext_NamesW {
127 SEC_WCHAR* sUserName;
128 } SecPkgContext_NamesW, *PSecPkgContext_NamesW;
129 typedef struct _SecPkgContext_NamesA {
131 } SecPkgContext_NamesA, *PSecPkgContext_NamesA;
132 typedef struct _SecPkgInfoW {
139 } SecPkgInfoW, *PSecPkgInfoW;
140 typedef struct _SecPkgInfoA {
147 } SecPkgInfoA, *PSecPkgInfoA;
148 /* supported only in win2k+, so it should be a PSecPkgInfoW */
149 /* PSDK does not say it has ANSI/Unicode versions */
150 typedef struct _SecPkgContext_PackageInfo {
151 PSecPkgInfoW PackageInfo;
152 } SecPkgContext_PackageInfo, *PSecPkgContext_PackageInfo;
153 typedef struct _SecPkgCredentials_NamesW {
154 SEC_WCHAR* sUserName;
155 } SecPkgCredentials_NamesW, *PSecPkgCredentials_NamesW;
156 typedef struct _SecPkgCredentials_NamesA {
158 } SecPkgCredentials_NamesA, *PSecPkgCredentials_NamesA;
160 /* TODO: missing type in SDK */
161 typedef void (*SEC_GET_KEY_FN)();
163 typedef SECURITY_STATUS (WINAPI *ENUMERATE_SECURITY_PACKAGES_FN_W)(PULONG,PSecPkgInfoW*);
164 typedef SECURITY_STATUS (WINAPI *ENUMERATE_SECURITY_PACKAGES_FN_A)(PULONG,PSecPkgInfoA*);
165 typedef SECURITY_STATUS (WINAPI *QUERY_CREDENTIALS_ATTRIBUTES_FN_W)(PCredHandle,ULONG,PVOID);
166 typedef SECURITY_STATUS (WINAPI *QUERY_CREDENTIALS_ATTRIBUTES_FN_A)(PCredHandle,ULONG,PVOID);
167 typedef SECURITY_STATUS (WINAPI *ACQUIRE_CREDENTIALS_HANDLE_FN_W)(SEC_WCHAR*,SEC_WCHAR*,ULONG,PLUID,PVOID,SEC_GET_KEY_FN,PVOID,PCredHandle,PTimeStamp);
168 typedef SECURITY_STATUS (WINAPI *ACQUIRE_CREDENTIALS_HANDLE_FN_A)(SEC_CHAR*,SEC_CHAR*,ULONG,PLUID,PVOID,SEC_GET_KEY_FN,PVOID,PCredHandle,PTimeStamp);
169 typedef SECURITY_STATUS (WINAPI *FREE_CREDENTIALS_HANDLE_FN)(PCredHandle);
170 typedef SECURITY_STATUS (WINAPI *INITIALIZE_SECURITY_CONTEXT_FN_W)(PCredHandle,PCtxtHandle,SEC_WCHAR*,ULONG,ULONG,ULONG,PSecBufferDesc,ULONG,PCtxtHandle,PSecBufferDesc,PULONG,PTimeStamp);
171 typedef SECURITY_STATUS (WINAPI *INITIALIZE_SECURITY_CONTEXT_FN_A)(PCredHandle,PCtxtHandle,SEC_CHAR*,ULONG,ULONG,ULONG,PSecBufferDesc,ULONG,PCtxtHandle,PSecBufferDesc,PULONG,PTimeStamp);
172 typedef SECURITY_STATUS (WINAPI *ACCEPT_SECURITY_CONTEXT_FN)(PCredHandle,PCtxtHandle,PSecBufferDesc,ULONG,ULONG,PCtxtHandle,PSecBufferDesc,PULONG,PTimeStamp);
173 typedef SECURITY_STATUS (WINAPI *COMPLETE_AUTH_TOKEN_FN)(PCtxtHandle,PSecBufferDesc);
174 typedef SECURITY_STATUS (WINAPI *DELETE_SECURITY_CONTEXT_FN)(PCtxtHandle);
175 typedef SECURITY_STATUS (WINAPI *APPLY_CONTROL_TOKEN_FN_W)(PCtxtHandle,PSecBufferDesc);
176 typedef SECURITY_STATUS (WINAPI *APPLY_CONTROL_TOKEN_FN_A)(PCtxtHandle,PSecBufferDesc);
177 typedef SECURITY_STATUS (WINAPI *QUERY_CONTEXT_ATTRIBUTES_FN_A)(PCtxtHandle,ULONG,PVOID);
178 typedef SECURITY_STATUS (WINAPI *QUERY_CONTEXT_ATTRIBUTES_FN_W)(PCtxtHandle,ULONG,PVOID);
179 typedef SECURITY_STATUS (WINAPI *IMPERSONATE_SECURITY_CONTEXT_FN)(PCtxtHandle);
180 typedef SECURITY_STATUS (WINAPI *REVERT_SECURITY_CONTEXT_FN)(PCtxtHandle);
181 typedef SECURITY_STATUS (WINAPI *MAKE_SIGNATURE_FN)(PCtxtHandle,ULONG,PSecBufferDesc,ULONG);
182 typedef SECURITY_STATUS (WINAPI *VERIFY_SIGNATURE_FN)(PCtxtHandle,PSecBufferDesc,ULONG,PULONG);
183 typedef SECURITY_STATUS (WINAPI *FREE_CONTEXT_BUFFER_FN)(PVOID);
184 typedef SECURITY_STATUS (WINAPI *QUERY_SECURITY_PACKAGE_INFO_FN_A)(SEC_CHAR*,PSecPkgInfoA*);
185 typedef SECURITY_STATUS (WINAPI *QUERY_SECURITY_CONTEXT_TOKEN_FN)(PCtxtHandle,HANDLE*);
186 typedef SECURITY_STATUS (WINAPI *QUERY_SECURITY_PACKAGE_INFO_FN_W)(SEC_WCHAR*,PSecPkgInfoW*);
187 typedef SECURITY_STATUS (WINAPI *ENCRYPT_MESSAGE_FN)(PCtxtHandle,ULONG,PSecBufferDesc,ULONG);
188 typedef SECURITY_STATUS (WINAPI *DECRYPT_MESSAGE_FN)(PCtxtHandle,PSecBufferDesc,ULONG,PULONG);
190 /* No, it really is FreeCredentialsHandle, see the thread beginning
191 * http://sourceforge.net/mailarchive/message.php?msg_id=4321080 for a
192 * discovery discussion. */
193 typedef struct _SECURITY_FUNCTION_TABLEW {
194 unsigned long dwVersion;
195 ENUMERATE_SECURITY_PACKAGES_FN_W EnumerateSecurityPackagesW;
196 QUERY_CREDENTIALS_ATTRIBUTES_FN_W QueryCredentialsAttributesW;
197 ACQUIRE_CREDENTIALS_HANDLE_FN_W AcquireCredentialsHandleW;
198 FREE_CREDENTIALS_HANDLE_FN FreeCredentialsHandle;
199 void SEC_FAR* Reserved2;
200 INITIALIZE_SECURITY_CONTEXT_FN_W InitializeSecurityContextW;
201 ACCEPT_SECURITY_CONTEXT_FN AcceptSecurityContext;
202 COMPLETE_AUTH_TOKEN_FN CompleteAuthToken;
203 DELETE_SECURITY_CONTEXT_FN DeleteSecurityContext;
204 APPLY_CONTROL_TOKEN_FN_W ApplyControlTokenW;
205 QUERY_CONTEXT_ATTRIBUTES_FN_W QueryContextAttributesW;
206 IMPERSONATE_SECURITY_CONTEXT_FN ImpersonateSecurityContext;
207 REVERT_SECURITY_CONTEXT_FN RevertSecurityContext;
208 MAKE_SIGNATURE_FN MakeSignature;
209 VERIFY_SIGNATURE_FN VerifySignature;
210 FREE_CONTEXT_BUFFER_FN FreeContextBuffer;
211 QUERY_SECURITY_PACKAGE_INFO_FN_W QuerySecurityPackageInfoW;
212 void SEC_FAR* Reserved3;
213 void SEC_FAR* Reserved4;
214 void SEC_FAR* Reserved5;
215 void SEC_FAR* Reserved6;
216 void SEC_FAR* Reserved7;
217 void SEC_FAR* Reserved8;
218 QUERY_SECURITY_CONTEXT_TOKEN_FN QuerySecurityContextToken;
219 ENCRYPT_MESSAGE_FN EncryptMessage;
220 DECRYPT_MESSAGE_FN DecryptMessage;
221 } SecurityFunctionTableW, *PSecurityFunctionTableW;
222 typedef struct _SECURITY_FUNCTION_TABLEA {
223 unsigned long dwVersion;
224 ENUMERATE_SECURITY_PACKAGES_FN_A EnumerateSecurityPackagesA;
225 QUERY_CREDENTIALS_ATTRIBUTES_FN_A QueryCredentialsAttributesA;
226 ACQUIRE_CREDENTIALS_HANDLE_FN_A AcquireCredentialsHandleA;
227 FREE_CREDENTIALS_HANDLE_FN FreeCredentialsHandle;
228 void SEC_FAR* Reserved2;
229 INITIALIZE_SECURITY_CONTEXT_FN_A InitializeSecurityContextA;
230 ACCEPT_SECURITY_CONTEXT_FN AcceptSecurityContext;
231 COMPLETE_AUTH_TOKEN_FN CompleteAuthToken;
232 DELETE_SECURITY_CONTEXT_FN DeleteSecurityContext;
233 APPLY_CONTROL_TOKEN_FN_A ApplyControlTokenA;
234 QUERY_CONTEXT_ATTRIBUTES_FN_A QueryContextAttributesA;
235 IMPERSONATE_SECURITY_CONTEXT_FN ImpersonateSecurityContext;
236 REVERT_SECURITY_CONTEXT_FN RevertSecurityContext;
237 MAKE_SIGNATURE_FN MakeSignature;
238 VERIFY_SIGNATURE_FN VerifySignature;
239 FREE_CONTEXT_BUFFER_FN FreeContextBuffer;
240 QUERY_SECURITY_PACKAGE_INFO_FN_A QuerySecurityPackageInfoA;
241 void SEC_FAR* Reserved3;
242 void SEC_FAR* Reserved4;
243 void SEC_FAR* Unknown1;
244 void SEC_FAR* Unknown2;
245 void SEC_FAR* Unknown3;
246 void SEC_FAR* Unknown4;
247 void SEC_FAR* Unknown5;
248 ENCRYPT_MESSAGE_FN EncryptMessage;
249 DECRYPT_MESSAGE_FN DecryptMessage;
250 } SecurityFunctionTableA, *PSecurityFunctionTableA;
251 typedef PSecurityFunctionTableA (WINAPI *INIT_SECURITY_INTERFACE_A)(VOID);
252 typedef PSecurityFunctionTableW (WINAPI *INIT_SECURITY_INTERFACE_W)(VOID);
254 SECURITY_STATUS WINAPI FreeCredentialsHandle(PCredHandle);
255 SECURITY_STATUS WINAPI EnumerateSecurityPackagesA(PULONG,PSecPkgInfoA*);
256 SECURITY_STATUS WINAPI EnumerateSecurityPackagesW(PULONG,PSecPkgInfoW*);
257 SECURITY_STATUS WINAPI AcquireCredentialsHandleA(SEC_CHAR*,SEC_CHAR*,ULONG,PLUID,PVOID,SEC_GET_KEY_FN,PVOID,PCredHandle,PTimeStamp);
258 SECURITY_STATUS WINAPI AcquireCredentialsHandleW(SEC_WCHAR*,SEC_WCHAR*,ULONG,PLUID,PVOID,SEC_GET_KEY_FN,PVOID,PCredHandle,PTimeStamp);
259 SECURITY_STATUS WINAPI AcceptSecurityContext(PCredHandle,PCtxtHandle,PSecBufferDesc,ULONG,ULONG,PCtxtHandle,PSecBufferDesc,PULONG,PTimeStamp);
260 SECURITY_STATUS WINAPI InitializeSecurityContextA(PCredHandle,PCtxtHandle,SEC_CHAR*,ULONG,ULONG,ULONG,PSecBufferDesc,ULONG,PCtxtHandle,PSecBufferDesc,PULONG,PTimeStamp);
261 SECURITY_STATUS WINAPI InitializeSecurityContextW(PCredHandle,PCtxtHandle,SEC_WCHAR*,ULONG,ULONG,ULONG,PSecBufferDesc,ULONG,PCtxtHandle,PSecBufferDesc,PULONG,PTimeStamp);
262 SECURITY_STATUS WINAPI FreeContextBuffer(PVOID);
263 SECURITY_STATUS WINAPI QueryContextAttributesA(PCtxtHandle,ULONG,PVOID);
264 SECURITY_STATUS WINAPI QueryContextAttributesW(PCtxtHandle,ULONG,PVOID);
265 SECURITY_STATUS WINAPI QueryCredentialsAttributesA(PCredHandle,ULONG,PVOID);
266 SECURITY_STATUS WINAPI QueryCredentialsAttributesW(PCredHandle,ULONG,PVOID);
267 #if (_WIN32_WINNT >= 0x0500)
268 SECURITY_STATUS WINAPI QuerySecurityContextToken(PCtxtHandle,HANDLE*);
270 SECURITY_STATUS WINAPI DecryptMessage(PCtxtHandle,PSecBufferDesc,ULONG,PULONG);
271 SECURITY_STATUS WINAPI EncryptMessage(PCtxtHandle,ULONG,PSecBufferDesc,ULONG);
272 SECURITY_STATUS WINAPI DeleteSecurityContext(PCtxtHandle);
273 SECURITY_STATUS WINAPI CompleteAuthToken(PCtxtHandle,PSecBufferDesc);
274 SECURITY_STATUS WINAPI ApplyControlTokenA(PCtxtHandle,PSecBufferDesc);
275 SECURITY_STATUS WINAPI ApplyControlTokenW(PCtxtHandle,PSecBufferDesc);
276 SECURITY_STATUS WINAPI ImpersonateSecurityContext(PCtxtHandle);
277 SECURITY_STATUS WINAPI RevertSecurityContext(PCtxtHandle);
278 SECURITY_STATUS WINAPI MakeSignature(PCtxtHandle,ULONG,PSecBufferDesc,ULONG);
279 SECURITY_STATUS WINAPI VerifySignature(PCtxtHandle,PSecBufferDesc,ULONG,PULONG);
280 SECURITY_STATUS WINAPI QuerySecurityPackageInfoA(SEC_CHAR*,PSecPkgInfoA*);
281 SECURITY_STATUS WINAPI QuerySecurityPackageInfoW(SEC_WCHAR*,PSecPkgInfoW*);
282 PSecurityFunctionTableA WINAPI InitSecurityInterfaceA(VOID);
283 PSecurityFunctionTableW WINAPI InitSecurityInterfaceW(VOID);
286 #define UNISP_NAME UNISP_NAME_W
287 #define SecPkgInfo SecPkgInfoW
288 #define PSecPkgInfo PSecPkgInfoW
289 #define SecPkgCredentials_Names SecPkgCredentials_NamesW
290 #define PSecPkgCredentials_Names PSecPkgCredentials_NamesW
291 #define SecPkgContext_Authority SecPkgContext_AuthorityW
292 #define PSecPkgContext_Authority PSecPkgContext_AuthorityW
293 #define SecPkgContext_KeyInfo SecPkgContext_KeyInfoW
294 #define PSecPkgContext_KeyInfo PSecPkgContext_KeyInfoW
295 #define SecPkgContext_Names SecPkgContext_NamesW
296 #define PSecPkgContext_Names PSecPkgContext_NamesW
297 #define SecurityFunctionTable SecurityFunctionTableW
298 #define PSecurityFunctionTable PSecurityFunctionTableW
299 #define AcquireCredentialsHandle AcquireCredentialsHandleW
300 #define EnumerateSecurityPackages EnumerateSecurityPackagesW
301 #define InitializeSecurityContext InitializeSecurityContextW
302 #define QueryContextAttributes QueryContextAttributesW
303 #define QueryCredentialsAttributes QueryCredentialsAttributesW
304 #define QuerySecurityPackageInfo QuerySecurityPackageInfoW
305 #define ApplyControlToken ApplyControlTokenW
306 #define ENUMERATE_SECURITY_PACKAGES_FN ENUMERATE_SECURITY_PACKAGES_FN_W
307 #define QUERY_CREDENTIALS_ATTRIBUTES_FN QUERY_CREDENTIALS_ATTRIBUTES_FN_W
308 #define ACQUIRE_CREDENTIALS_HANDLE_FN ACQUIRE_CREDENTIALS_HANDLE_FN_W
309 #define INITIALIZE_SECURITY_CONTEXT_FN INITIALIZE_SECURITY_CONTEXT_FN_W
310 #define APPLY_CONTROL_TOKEN_FN APPLY_CONTROL_TOKEN_FN_W
311 #define QUERY_CONTEXT_ATTRIBUTES_FN QUERY_CONTEXT_ATTRIBUTES_FN_W
312 #define QUERY_SECURITY_PACKAGE_INFO_FN QUERY_SECURITY_PACKAGE_INFO_FN_W
313 #define INIT_SECURITY_INTERFACE INIT_SECURITY_INTERFACE_W
315 #define UNISP_NAME UNISP_NAME_A
316 #define SecPkgInfo SecPkgInfoA
317 #define PSecPkgInfo PSecPkgInfoA
318 #define SecPkgCredentials_Names SecPkgCredentials_NamesA
319 #define PSecPkgCredentials_Names PSecPkgCredentials_NamesA
320 #define SecPkgContext_Authority SecPkgContext_AuthorityA
321 #define PSecPkgContext_Authority PSecPkgContext_AuthorityA
322 #define SecPkgContext_KeyInfo SecPkgContext_KeyInfoA
323 #define PSecPkgContext_KeyInfo PSecPkgContext_KeyInfoA
324 #define SecPkgContext_Names SecPkgContext_NamesA
325 #define PSecPkgContext_Names PSecPkgContext_NamesA
326 #define SecurityFunctionTable SecurityFunctionTableA
327 #define PSecurityFunctionTable PSecurityFunctionTableA
328 #define AcquireCredentialsHandle AcquireCredentialsHandleA
329 #define EnumerateSecurityPackages EnumerateSecurityPackagesA
330 #define InitializeSecurityContext InitializeSecurityContextA
331 #define QueryContextAttributes QueryContextAttributesA
332 #define QueryCredentialsAttributes QueryCredentialsAttributesA
333 #define QuerySecurityPackageInfo QuerySecurityPackageInfoA
334 #define ApplyControlToken ApplyControlTokenA
335 #define ENUMERATE_SECURITY_PACKAGES_FN ENUMERATE_SECURITY_PACKAGES_FN_A
336 #define QUERY_CREDENTIALS_ATTRIBUTES_FN QUERY_CREDENTIALS_ATTRIBUTES_FN_A
337 #define ACQUIRE_CREDENTIALS_HANDLE_FN ACQUIRE_CREDENTIALS_HANDLE_FN_A
338 #define INITIALIZE_SECURITY_CONTEXT_FN INITIALIZE_SECURITY_CONTEXT_FN_A
339 #define APPLY_CONTROL_TOKEN_FN APPLY_CONTROL_TOKEN_FN_A
340 #define QUERY_CONTEXT_ATTRIBUTES_FN QUERY_CONTEXT_ATTRIBUTES_FN_A
341 #define QUERY_SECURITY_PACKAGE_INFO_FN QUERY_SECURITY_PACKAGE_INFO_FN_A
342 #define INIT_SECURITY_INTERFACE INIT_SECURITY_INTERFACE_A