wined3d: Remove fake nvidia card in GetAdapterIdentifier.
[wine/dibdrv.git] / dlls / secur32 / wrapper.c
blob60203e2782ac61cfcb11ba20f5f0684268279af1
1 /* Copyright (C) 2004 Juan Lang
3 * Implements secur32 functions that forward to (wrap) an SSP's implementation.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include <stdarg.h>
20 #include "windef.h"
21 #include "winbase.h"
22 #include "winnls.h"
23 #include "sspi.h"
24 #include "secur32_priv.h"
26 #include "wine/debug.h"
28 WINE_DEFAULT_DEBUG_CHANNEL(secur32);
30 /* Tries to allocate a new SecHandle, into which it stores package (in
31 * phSec->dwUpper) and a copy of realHandle (allocated with SECUR32_ALLOC,
32 * and stored in phSec->dwLower). SecHandle is equivalent to both a
33 * CredHandle and a CtxtHandle.
35 static SECURITY_STATUS SECUR32_makeSecHandle(PSecHandle phSec,
36 SecurePackage *package, PSecHandle realHandle)
38 SECURITY_STATUS ret;
40 TRACE("%p %p %p\n", phSec, package, realHandle);
42 if (phSec && package && realHandle)
44 PSecHandle newSec = (PSecHandle)SECUR32_ALLOC(sizeof(SecHandle));
46 if (newSec)
48 memcpy(newSec, realHandle, sizeof(*realHandle));
49 phSec->dwUpper = (ULONG_PTR)package;
50 phSec->dwLower = (ULONG_PTR)newSec;
51 ret = SEC_E_OK;
53 else
54 ret = SEC_E_INSUFFICIENT_MEMORY;
56 else
57 ret = SEC_E_INVALID_HANDLE;
58 return ret;
61 /***********************************************************************
62 * AcquireCredentialsHandleA (SECUR32.@)
64 SECURITY_STATUS WINAPI AcquireCredentialsHandleA(
65 SEC_CHAR *pszPrincipal, SEC_CHAR *pszPackage, ULONG fCredentialsUse,
66 PLUID pvLogonID, PVOID pAuthData, SEC_GET_KEY_FN pGetKeyFn,
67 PVOID pvGetKeyArgument, PCredHandle phCredential, PTimeStamp ptsExpiry)
69 SECURITY_STATUS ret;
71 TRACE("%s %s %d %p %p %p %p %p %p\n", debugstr_a(pszPrincipal),
72 debugstr_a(pszPackage), fCredentialsUse, pvLogonID, pAuthData, pGetKeyFn,
73 pvGetKeyArgument, phCredential, ptsExpiry);
74 if (pszPackage)
76 SecurePackage *package = SECUR32_findPackageA(pszPackage);
78 if (package && package->provider)
80 if (package->provider->fnTableA.AcquireCredentialsHandleA)
82 CredHandle myCred;
84 ret = package->provider->fnTableA.AcquireCredentialsHandleA(
85 pszPrincipal, pszPackage, fCredentialsUse, pvLogonID,
86 pAuthData, pGetKeyFn, pvGetKeyArgument, &myCred,
87 ptsExpiry);
88 if (ret == SEC_E_OK)
90 ret = SECUR32_makeSecHandle(phCredential, package, &myCred);
91 if (ret != SEC_E_OK)
92 package->provider->fnTableW.FreeCredentialsHandle(
93 &myCred);
96 else
97 ret = SEC_E_UNSUPPORTED_FUNCTION;
99 else
100 ret = SEC_E_SECPKG_NOT_FOUND;
102 else
103 ret = SEC_E_SECPKG_NOT_FOUND;
104 return ret;
107 /***********************************************************************
108 * AcquireCredentialsHandleW (SECUR32.@)
110 SECURITY_STATUS WINAPI AcquireCredentialsHandleW(
111 SEC_WCHAR *pszPrincipal, SEC_WCHAR *pszPackage, ULONG fCredentialsUse,
112 PLUID pvLogonID, PVOID pAuthData, SEC_GET_KEY_FN pGetKeyFn,
113 PVOID pvGetKeyArgument, PCredHandle phCredential, PTimeStamp ptsExpiry)
115 SECURITY_STATUS ret;
117 TRACE("%s %s %d %p %p %p %p %p %p\n", debugstr_w(pszPrincipal),
118 debugstr_w(pszPackage), fCredentialsUse, pvLogonID, pAuthData, pGetKeyFn,
119 pvGetKeyArgument, phCredential, ptsExpiry);
120 if (pszPackage)
122 SecurePackage *package = SECUR32_findPackageW(pszPackage);
124 if (package && package->provider)
126 if (package->provider->fnTableW.AcquireCredentialsHandleW)
128 CredHandle myCred;
130 ret = package->provider->fnTableW.AcquireCredentialsHandleW(
131 pszPrincipal, pszPackage, fCredentialsUse, pvLogonID,
132 pAuthData, pGetKeyFn, pvGetKeyArgument, &myCred,
133 ptsExpiry);
134 if (ret == SEC_E_OK)
136 ret = SECUR32_makeSecHandle(phCredential, package, &myCred);
137 if (ret != SEC_E_OK)
138 package->provider->fnTableW.FreeCredentialsHandle(
139 &myCred);
142 else
143 ret = SEC_E_UNSUPPORTED_FUNCTION;
145 else
146 ret = SEC_E_SECPKG_NOT_FOUND;
148 else
149 ret = SEC_E_SECPKG_NOT_FOUND;
150 return ret;
153 /***********************************************************************
154 * FreeCredentialsHandle (SECUR32.@)
156 SECURITY_STATUS WINAPI FreeCredentialsHandle(
157 PCredHandle phCredential)
159 SECURITY_STATUS ret;
161 TRACE("%p\n", phCredential);
162 if (phCredential)
164 SecurePackage *package = (SecurePackage *)phCredential->dwUpper;
165 PCredHandle cred = (PCredHandle)phCredential->dwLower;
167 if (package && package->provider &&
168 package->provider->fnTableW.FreeCredentialsHandle)
169 ret = package->provider->fnTableW.FreeCredentialsHandle(cred);
170 else
171 ret = SEC_E_INVALID_HANDLE;
172 SECUR32_FREE(cred);
174 else
175 ret = SEC_E_INVALID_HANDLE;
176 return ret;
179 /***********************************************************************
180 * QueryCredentialsAttributesA (SECUR32.@)
182 SECURITY_STATUS WINAPI QueryCredentialsAttributesA(
183 PCredHandle phCredential, ULONG ulAttribute, void *pBuffer)
185 SECURITY_STATUS ret;
187 TRACE("%p %d %p\n", phCredential, ulAttribute, pBuffer);
188 if (phCredential)
190 SecurePackage *package = (SecurePackage *)phCredential->dwUpper;
191 PCredHandle cred = (PCredHandle)phCredential->dwLower;
193 if (package && package->provider)
195 if (package->provider->fnTableA.QueryCredentialsAttributesA)
196 ret = package->provider->fnTableA.QueryCredentialsAttributesA(
197 cred, ulAttribute, pBuffer);
198 else
199 ret = SEC_E_UNSUPPORTED_FUNCTION;
201 else
202 ret = SEC_E_INVALID_HANDLE;
204 else
205 ret = SEC_E_INVALID_HANDLE;
206 return ret;
209 /***********************************************************************
210 * QueryCredentialsAttributesW (SECUR32.@)
212 SECURITY_STATUS WINAPI QueryCredentialsAttributesW(
213 PCredHandle phCredential, ULONG ulAttribute, void *pBuffer)
215 SECURITY_STATUS ret;
217 TRACE("%p %d %p\n", phCredential, ulAttribute, pBuffer);
218 if (phCredential)
220 SecurePackage *package = (SecurePackage *)phCredential->dwUpper;
221 PCredHandle cred = (PCredHandle)phCredential->dwLower;
223 if (package && package->provider)
225 if (package->provider->fnTableW.QueryCredentialsAttributesW)
226 ret = package->provider->fnTableW.QueryCredentialsAttributesW(
227 cred, ulAttribute, pBuffer);
228 else
229 ret = SEC_E_UNSUPPORTED_FUNCTION;
231 else
232 ret = SEC_E_INVALID_HANDLE;
234 else
235 ret = SEC_E_INVALID_HANDLE;
236 return ret;
239 /***********************************************************************
240 * InitializeSecurityContextA (SECUR32.@)
242 SECURITY_STATUS WINAPI InitializeSecurityContextA(
243 PCredHandle phCredential, PCtxtHandle phContext,
244 SEC_CHAR *pszTargetName, ULONG fContextReq,
245 ULONG Reserved1, ULONG TargetDataRep, PSecBufferDesc pInput,
246 ULONG Reserved2, PCtxtHandle phNewContext, PSecBufferDesc pOutput,
247 ULONG *pfContextAttr, PTimeStamp ptsExpiry)
249 SECURITY_STATUS ret;
251 TRACE("%p %p %s %d %d %d %p %d %p %p %p %p\n", phCredential, phContext,
252 debugstr_a(pszTargetName), fContextReq, Reserved1, TargetDataRep, pInput,
253 Reserved1, phNewContext, pOutput, pfContextAttr, ptsExpiry);
254 if (phCredential)
256 SecurePackage *package = (SecurePackage *)phCredential->dwUpper;
257 PCredHandle cred = (PCredHandle)phCredential->dwLower;
259 if (package && package->provider)
261 if (package->provider->fnTableA.InitializeSecurityContextA)
263 CtxtHandle myCtxt;
265 if(phContext)
267 PCtxtHandle realCtxt = (PCtxtHandle)phContext->dwLower;
268 myCtxt.dwUpper = realCtxt->dwUpper;
269 myCtxt.dwLower = realCtxt->dwLower;
272 ret = package->provider->fnTableA.InitializeSecurityContextA(
273 cred, phContext ? &myCtxt : NULL, pszTargetName, fContextReq,
274 Reserved1, TargetDataRep, pInput, Reserved2, &myCtxt,
275 pOutput, pfContextAttr, ptsExpiry);
276 if (ret == SEC_E_OK || ret == SEC_I_CONTINUE_NEEDED)
278 SECURITY_STATUS ret2;
279 ret2 = SECUR32_makeSecHandle(phNewContext, package, &myCtxt);
280 if (ret2 != SEC_E_OK)
281 package->provider->fnTableW.DeleteSecurityContext(
282 &myCtxt);
285 else
286 ret = SEC_E_UNSUPPORTED_FUNCTION;
288 else
289 ret = SEC_E_INVALID_HANDLE;
291 else
292 ret = SEC_E_INVALID_HANDLE;
293 return ret;
296 /***********************************************************************
297 * InitializeSecurityContextW (SECUR32.@)
299 SECURITY_STATUS WINAPI InitializeSecurityContextW(
300 PCredHandle phCredential, PCtxtHandle phContext,
301 SEC_WCHAR *pszTargetName, ULONG fContextReq,
302 ULONG Reserved1, ULONG TargetDataRep, PSecBufferDesc pInput,
303 ULONG Reserved2, PCtxtHandle phNewContext, PSecBufferDesc pOutput,
304 ULONG *pfContextAttr, PTimeStamp ptsExpiry)
306 SECURITY_STATUS ret;
308 TRACE("%p %p %s %d %d %d %p %d %p %p %p %p\n", phCredential, phContext,
309 debugstr_w(pszTargetName), fContextReq, Reserved1, TargetDataRep, pInput,
310 Reserved1, phNewContext, pOutput, pfContextAttr, ptsExpiry);
311 if (phCredential)
313 SecurePackage *package = (SecurePackage *)phCredential->dwUpper;
314 PCredHandle cred = (PCredHandle)phCredential->dwLower;
316 if (package && package->provider)
318 if (package->provider->fnTableW.QueryCredentialsAttributesW)
320 CtxtHandle myCtxt;
322 if(phContext)
324 PCtxtHandle realCtxt = (PCtxtHandle)phContext->dwLower;
325 myCtxt.dwUpper = realCtxt->dwUpper;
326 myCtxt.dwLower = realCtxt->dwLower;
329 ret = package->provider->fnTableW.InitializeSecurityContextW(
330 cred, phContext ? &myCtxt : NULL, pszTargetName, fContextReq,
331 Reserved1, TargetDataRep, pInput, Reserved2, &myCtxt,
332 pOutput, pfContextAttr, ptsExpiry);
333 if (ret == SEC_E_OK || ret == SEC_I_CONTINUE_NEEDED)
335 SECURITY_STATUS ret2;
336 ret2 = SECUR32_makeSecHandle(phNewContext, package, &myCtxt);
337 if (ret2 != SEC_E_OK)
338 package->provider->fnTableW.DeleteSecurityContext(
339 &myCtxt);
342 else
343 ret = SEC_E_UNSUPPORTED_FUNCTION;
345 else
346 ret = SEC_E_INVALID_HANDLE;
348 else
349 ret = SEC_E_INVALID_HANDLE;
350 return ret;
353 /***********************************************************************
354 * AcceptSecurityContext (SECUR32.@)
356 SECURITY_STATUS WINAPI AcceptSecurityContext(
357 PCredHandle phCredential, PCtxtHandle phContext, PSecBufferDesc pInput,
358 ULONG fContextReq, ULONG TargetDataRep, PCtxtHandle phNewContext,
359 PSecBufferDesc pOutput, ULONG *pfContextAttr, PTimeStamp ptsExpiry)
361 SECURITY_STATUS ret;
363 TRACE("%p %p %p %d %d %p %p %p %p\n", phCredential, phContext, pInput,
364 fContextReq, TargetDataRep, phNewContext, pOutput, pfContextAttr,
365 ptsExpiry);
366 if (phCredential)
368 SecurePackage *package = (SecurePackage *)phCredential->dwUpper;
369 PCredHandle cred = (PCredHandle)phCredential->dwLower;
371 if (package && package->provider)
373 if (package->provider->fnTableW.AcceptSecurityContext)
375 CtxtHandle myCtxt;
377 if(phContext)
379 PCtxtHandle realCtxt = (PCtxtHandle)phContext->dwLower;
380 TRACE("realCtx: %p\n", realCtxt);
381 myCtxt.dwUpper = realCtxt->dwUpper;
382 myCtxt.dwLower = realCtxt->dwLower;
385 ret = package->provider->fnTableW.AcceptSecurityContext(
386 cred, phContext ? &myCtxt : NULL, pInput, fContextReq,
387 TargetDataRep, &myCtxt, pOutput, pfContextAttr, ptsExpiry);
388 if (ret == SEC_E_OK || ret == SEC_I_CONTINUE_NEEDED)
390 SECURITY_STATUS ret2;
391 ret2 = SECUR32_makeSecHandle(phNewContext, package, &myCtxt);
392 if (ret2 != SEC_E_OK)
393 package->provider->fnTableW.DeleteSecurityContext(
394 &myCtxt);
397 else
398 ret = SEC_E_UNSUPPORTED_FUNCTION;
400 else
401 ret = SEC_E_INVALID_HANDLE;
403 else
404 ret = SEC_E_INVALID_HANDLE;
405 return ret;
408 /***********************************************************************
409 * CompleteAuthToken (SECUR32.@)
411 SECURITY_STATUS WINAPI CompleteAuthToken(PCtxtHandle phContext,
412 PSecBufferDesc pToken)
414 SECURITY_STATUS ret;
416 TRACE("%p %p\n", phContext, pToken);
417 if (phContext)
419 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
420 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
422 if (package && package->provider)
424 if (package->provider->fnTableW.CompleteAuthToken)
425 ret = package->provider->fnTableW.CompleteAuthToken(ctxt,
426 pToken);
427 else
428 ret = SEC_E_UNSUPPORTED_FUNCTION;
430 else
431 ret = SEC_E_INVALID_HANDLE;
433 else
434 ret = SEC_E_INVALID_HANDLE;
435 return ret;
438 /***********************************************************************
439 * DeleteSecurityContext (SECUR32.@)
441 SECURITY_STATUS WINAPI DeleteSecurityContext(PCtxtHandle phContext)
443 SECURITY_STATUS ret;
445 TRACE("%p\n", phContext);
446 if (phContext)
448 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
449 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
451 if (package && package->provider &&
452 package->provider->fnTableW.DeleteSecurityContext)
453 ret = package->provider->fnTableW.DeleteSecurityContext(ctxt);
454 else
455 ret = SEC_E_INVALID_HANDLE;
456 SECUR32_FREE(ctxt);
458 else
459 ret = SEC_E_INVALID_HANDLE;
460 return ret;
463 /***********************************************************************
464 * ApplyControlToken (SECUR32.@)
466 SECURITY_STATUS WINAPI ApplyControlToken(PCtxtHandle phContext,
467 PSecBufferDesc pInput)
469 SECURITY_STATUS ret;
471 TRACE("%p %p\n", phContext, pInput);
472 if (phContext)
474 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
475 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
477 if (package && package->provider)
479 if (package->provider->fnTableW.ApplyControlToken)
480 ret = package->provider->fnTableW.ApplyControlToken(
481 ctxt, pInput);
482 else
483 ret = SEC_E_UNSUPPORTED_FUNCTION;
485 else
486 ret = SEC_E_INVALID_HANDLE;
488 else
489 ret = SEC_E_INVALID_HANDLE;
490 return ret;
493 /***********************************************************************
494 * QueryContextAttributesA (SECUR32.@)
496 SECURITY_STATUS WINAPI QueryContextAttributesA(PCtxtHandle phContext,
497 ULONG ulAttribute, void *pBuffer)
499 SECURITY_STATUS ret;
501 TRACE("%p %d %p\n", phContext, ulAttribute, pBuffer);
502 if (phContext)
504 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
505 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
507 if (package && package->provider)
509 if (package->provider->fnTableA.QueryContextAttributesA)
510 ret = package->provider->fnTableA.QueryContextAttributesA(
511 ctxt, ulAttribute, pBuffer);
512 else
513 ret = SEC_E_UNSUPPORTED_FUNCTION;
515 else
516 ret = SEC_E_INVALID_HANDLE;
518 else
519 ret = SEC_E_INVALID_HANDLE;
520 return ret;
523 /***********************************************************************
524 * QueryContextAttributesW (SECUR32.@)
526 SECURITY_STATUS WINAPI QueryContextAttributesW(PCtxtHandle phContext,
527 ULONG ulAttribute, void *pBuffer)
529 SECURITY_STATUS ret;
531 TRACE("%p %d %p\n", phContext, ulAttribute, pBuffer);
532 if (phContext)
534 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
535 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
537 if (package && package->provider)
539 if (package->provider->fnTableW.QueryContextAttributesW)
540 ret = package->provider->fnTableW.QueryContextAttributesW(
541 ctxt, ulAttribute, pBuffer);
542 else
543 ret = SEC_E_UNSUPPORTED_FUNCTION;
545 else
546 ret = SEC_E_INVALID_HANDLE;
548 else
549 ret = SEC_E_INVALID_HANDLE;
550 return ret;
553 /***********************************************************************
554 * ImpersonateSecurityContext (SECUR32.@)
556 SECURITY_STATUS WINAPI ImpersonateSecurityContext(PCtxtHandle phContext)
558 SECURITY_STATUS ret;
560 TRACE("%p\n", phContext);
561 if (phContext)
563 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
564 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
566 if (package && package->provider)
568 if (package->provider->fnTableW.ImpersonateSecurityContext)
569 ret = package->provider->fnTableW.ImpersonateSecurityContext(
570 ctxt);
571 else
572 ret = SEC_E_UNSUPPORTED_FUNCTION;
574 else
575 ret = SEC_E_INVALID_HANDLE;
577 else
578 ret = SEC_E_INVALID_HANDLE;
579 return ret;
582 /***********************************************************************
583 * RevertSecurityContext (SECUR32.@)
585 SECURITY_STATUS WINAPI RevertSecurityContext(PCtxtHandle phContext)
587 SECURITY_STATUS ret;
589 TRACE("%p\n", phContext);
590 if (phContext)
592 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
593 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
595 if (package && package->provider)
597 if (package->provider->fnTableW.RevertSecurityContext)
598 ret = package->provider->fnTableW.RevertSecurityContext(
599 ctxt);
600 else
601 ret = SEC_E_UNSUPPORTED_FUNCTION;
603 else
604 ret = SEC_E_INVALID_HANDLE;
606 else
607 ret = SEC_E_INVALID_HANDLE;
608 return ret;
611 /***********************************************************************
612 * MakeSignature (SECUR32.@)
614 SECURITY_STATUS WINAPI MakeSignature(PCtxtHandle phContext, ULONG fQOP,
615 PSecBufferDesc pMessage, ULONG MessageSeqNo)
617 SECURITY_STATUS ret;
619 TRACE("%p %d %p %d\n", phContext, fQOP, pMessage, MessageSeqNo);
620 if (phContext)
622 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
623 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
625 if (package && package->provider)
627 if (package->provider->fnTableW.MakeSignature)
628 ret = package->provider->fnTableW.MakeSignature(
629 ctxt, fQOP, pMessage, MessageSeqNo);
630 else
631 ret = SEC_E_UNSUPPORTED_FUNCTION;
633 else
634 ret = SEC_E_INVALID_HANDLE;
636 else
637 ret = SEC_E_INVALID_HANDLE;
638 return ret;
641 /***********************************************************************
642 * VerifySignature (SECUR32.@)
644 SECURITY_STATUS WINAPI VerifySignature(PCtxtHandle phContext,
645 PSecBufferDesc pMessage, ULONG MessageSeqNo, PULONG pfQOP)
647 SECURITY_STATUS ret;
649 TRACE("%p %p %d %p\n", phContext, pMessage, MessageSeqNo, pfQOP);
650 if (phContext)
652 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
653 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
655 if (package && package->provider)
657 if (package->provider->fnTableW.VerifySignature)
658 ret = package->provider->fnTableW.VerifySignature(
659 ctxt, pMessage, MessageSeqNo, pfQOP);
660 else
661 ret = SEC_E_UNSUPPORTED_FUNCTION;
663 else
664 ret = SEC_E_INVALID_HANDLE;
666 else
667 ret = SEC_E_INVALID_HANDLE;
668 return ret;
671 /***********************************************************************
672 * QuerySecurityPackageInfoA (SECUR32.@)
674 SECURITY_STATUS WINAPI QuerySecurityPackageInfoA(SEC_CHAR *pszPackageName,
675 PSecPkgInfoA *ppPackageInfo)
677 SECURITY_STATUS ret;
679 TRACE("%s %p\n", debugstr_a(pszPackageName), ppPackageInfo);
680 if (pszPackageName)
682 SecurePackage *package = SECUR32_findPackageA(pszPackageName);
684 if (package)
686 size_t bytesNeeded = sizeof(SecPkgInfoA);
687 int nameLen = 0, commentLen = 0;
689 if (package->infoW.Name)
691 nameLen = WideCharToMultiByte(CP_ACP, 0,
692 package->infoW.Name, -1, NULL, 0, NULL, NULL);
693 bytesNeeded += nameLen;
695 if (package->infoW.Comment)
697 commentLen = WideCharToMultiByte(CP_ACP, 0,
698 package->infoW.Comment, -1, NULL, 0, NULL, NULL);
699 bytesNeeded += commentLen;
701 *ppPackageInfo = (PSecPkgInfoA)SECUR32_ALLOC(bytesNeeded);
702 if (*ppPackageInfo)
704 PSTR nextString = (PSTR)((PBYTE)*ppPackageInfo +
705 sizeof(SecPkgInfoA));
707 memcpy(*ppPackageInfo, &package->infoW, sizeof(package->infoW));
708 if (package->infoW.Name)
710 (*ppPackageInfo)->Name = nextString;
711 nextString += WideCharToMultiByte(CP_ACP, 0,
712 package->infoW.Name, -1, nextString, nameLen, NULL, NULL);
714 else
715 (*ppPackageInfo)->Name = NULL;
716 if (package->infoW.Comment)
718 (*ppPackageInfo)->Comment = nextString;
719 nextString += WideCharToMultiByte(CP_ACP, 0,
720 package->infoW.Comment, -1, nextString, commentLen, NULL,
721 NULL);
723 else
724 (*ppPackageInfo)->Comment = NULL;
725 ret = SEC_E_OK;
727 else
728 ret = SEC_E_INSUFFICIENT_MEMORY;
730 else
731 ret = SEC_E_SECPKG_NOT_FOUND;
733 else
734 ret = SEC_E_SECPKG_NOT_FOUND;
735 return ret;
738 /***********************************************************************
739 * QuerySecurityPackageInfoW (SECUR32.@)
741 SECURITY_STATUS WINAPI QuerySecurityPackageInfoW(SEC_WCHAR *pszPackageName,
742 PSecPkgInfoW *ppPackageInfo)
744 SECURITY_STATUS ret;
745 SecurePackage *package = SECUR32_findPackageW(pszPackageName);
747 TRACE("%s %p\n", debugstr_w(pszPackageName), ppPackageInfo);
748 if (package)
750 size_t bytesNeeded = sizeof(SecPkgInfoW);
751 int nameLen = 0, commentLen = 0;
753 if (package->infoW.Name)
755 nameLen = lstrlenW(package->infoW.Name) + 1;
756 bytesNeeded += nameLen * sizeof(WCHAR);
758 if (package->infoW.Comment)
760 commentLen = lstrlenW(package->infoW.Comment) + 1;
761 bytesNeeded += commentLen * sizeof(WCHAR);
763 *ppPackageInfo = (PSecPkgInfoW)SECUR32_ALLOC(bytesNeeded);
764 if (*ppPackageInfo)
766 PWSTR nextString = (PWSTR)((PBYTE)*ppPackageInfo +
767 sizeof(SecPkgInfoW));
769 memcpy(*ppPackageInfo, &package->infoW, sizeof(package->infoW));
770 if (package->infoW.Name)
772 (*ppPackageInfo)->Name = nextString;
773 lstrcpynW(nextString, package->infoW.Name, nameLen);
774 nextString += nameLen;
776 else
777 (*ppPackageInfo)->Name = NULL;
778 if (package->infoW.Comment)
780 (*ppPackageInfo)->Comment = nextString;
781 lstrcpynW(nextString, package->infoW.Comment, commentLen);
782 nextString += commentLen;
784 else
785 (*ppPackageInfo)->Comment = NULL;
786 ret = SEC_E_OK;
788 else
789 ret = SEC_E_INSUFFICIENT_MEMORY;
791 else
792 ret = SEC_E_SECPKG_NOT_FOUND;
793 return ret;
796 /***********************************************************************
797 * ExportSecurityContext (SECUR32.@)
799 SECURITY_STATUS WINAPI ExportSecurityContext(PCtxtHandle phContext,
800 ULONG fFlags, PSecBuffer pPackedContext, void **pToken)
802 SECURITY_STATUS ret;
804 TRACE("%p %d %p %p\n", phContext, fFlags, pPackedContext, pToken);
805 if (phContext)
807 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
808 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
810 if (package && package->provider)
812 if (package->provider->fnTableW.ExportSecurityContext)
813 ret = package->provider->fnTableW.ExportSecurityContext(
814 ctxt, fFlags, pPackedContext, pToken);
815 else
816 ret = SEC_E_UNSUPPORTED_FUNCTION;
818 else
819 ret = SEC_E_INVALID_HANDLE;
821 else
822 ret = SEC_E_INVALID_HANDLE;
823 return ret;
826 /***********************************************************************
827 * ImportSecurityContextA (SECUR32.@)
829 SECURITY_STATUS WINAPI ImportSecurityContextA(SEC_CHAR *pszPackage,
830 PSecBuffer pPackedContext, void *Token, PCtxtHandle phContext)
832 SECURITY_STATUS ret;
833 SecurePackage *package = SECUR32_findPackageA(pszPackage);
835 TRACE("%s %p %p %p\n", debugstr_a(pszPackage), pPackedContext, Token,
836 phContext);
837 if (package && package->provider)
839 if (package->provider->fnTableA.ImportSecurityContextA)
841 CtxtHandle myCtxt;
843 ret = package->provider->fnTableA.ImportSecurityContextA(
844 pszPackage, pPackedContext, Token, &myCtxt);
845 if (ret == SEC_E_OK)
847 ret = SECUR32_makeSecHandle(phContext, package, &myCtxt);
848 if (ret != SEC_E_OK)
849 package->provider->fnTableW.DeleteSecurityContext(&myCtxt);
852 else
853 ret = SEC_E_UNSUPPORTED_FUNCTION;
855 else
856 ret = SEC_E_SECPKG_NOT_FOUND;
857 return ret;
861 /***********************************************************************
862 * ImportSecurityContextW (SECUR32.@)
864 SECURITY_STATUS WINAPI ImportSecurityContextW(SEC_WCHAR *pszPackage,
865 PSecBuffer pPackedContext, void *Token, PCtxtHandle phContext)
867 SECURITY_STATUS ret;
868 SecurePackage *package = SECUR32_findPackageW(pszPackage);
870 TRACE("%s %p %p %p\n", debugstr_w(pszPackage), pPackedContext, Token,
871 phContext);
872 if (package && package->provider)
874 if (package->provider->fnTableW.ImportSecurityContextW)
876 CtxtHandle myCtxt;
878 ret = package->provider->fnTableW.ImportSecurityContextW(
879 pszPackage, pPackedContext, Token, &myCtxt);
880 if (ret == SEC_E_OK)
882 ret = SECUR32_makeSecHandle(phContext, package, &myCtxt);
883 if (ret != SEC_E_OK)
884 package->provider->fnTableW.DeleteSecurityContext(&myCtxt);
887 else
888 ret = SEC_E_UNSUPPORTED_FUNCTION;
890 else
891 ret = SEC_E_SECPKG_NOT_FOUND;
892 return ret;
895 /***********************************************************************
896 * AddCredentialsA (SECUR32.@)
898 SECURITY_STATUS WINAPI AddCredentialsA(PCredHandle hCredentials,
899 SEC_CHAR *pszPrincipal, SEC_CHAR *pszPackage, ULONG fCredentialUse,
900 void *pAuthData, SEC_GET_KEY_FN pGetKeyFn, void *pvGetKeyArgument,
901 PTimeStamp ptsExpiry)
903 SECURITY_STATUS ret;
905 TRACE("%p %s %s %d %p %p %p %p\n", hCredentials, debugstr_a(pszPrincipal),
906 debugstr_a(pszPackage), fCredentialUse, pAuthData, pGetKeyFn,
907 pvGetKeyArgument, ptsExpiry);
908 if (hCredentials)
910 SecurePackage *package = (SecurePackage *)hCredentials->dwUpper;
911 PCredHandle cred = (PCtxtHandle)hCredentials->dwLower;
913 if (package && package->provider)
915 if (package->provider->fnTableA.AddCredentialsA)
916 ret = package->provider->fnTableA.AddCredentialsA(
917 cred, pszPrincipal, pszPackage, fCredentialUse, pAuthData,
918 pGetKeyFn, pvGetKeyArgument, ptsExpiry);
919 else
920 ret = SEC_E_UNSUPPORTED_FUNCTION;
922 else
923 ret = SEC_E_INVALID_HANDLE;
925 else
926 ret = SEC_E_INVALID_HANDLE;
927 return ret;
930 /***********************************************************************
931 * AddCredentialsW (SECUR32.@)
933 SECURITY_STATUS WINAPI AddCredentialsW(PCredHandle hCredentials,
934 SEC_WCHAR *pszPrincipal, SEC_WCHAR *pszPackage, ULONG fCredentialUse,
935 void *pAuthData, SEC_GET_KEY_FN pGetKeyFn, void *pvGetKeyArgument,
936 PTimeStamp ptsExpiry)
938 SECURITY_STATUS ret;
940 TRACE("%p %s %s %d %p %p %p %p\n", hCredentials, debugstr_w(pszPrincipal),
941 debugstr_w(pszPackage), fCredentialUse, pAuthData, pGetKeyFn,
942 pvGetKeyArgument, ptsExpiry);
943 if (hCredentials)
945 SecurePackage *package = (SecurePackage *)hCredentials->dwUpper;
946 PCredHandle cred = (PCtxtHandle)hCredentials->dwLower;
948 if (package && package->provider)
950 if (package->provider->fnTableW.AddCredentialsW)
951 ret = package->provider->fnTableW.AddCredentialsW(
952 cred, pszPrincipal, pszPackage, fCredentialUse, pAuthData,
953 pGetKeyFn, pvGetKeyArgument, ptsExpiry);
954 else
955 ret = SEC_E_UNSUPPORTED_FUNCTION;
957 else
958 ret = SEC_E_INVALID_HANDLE;
960 else
961 ret = SEC_E_INVALID_HANDLE;
962 return ret;
965 /***********************************************************************
966 * QuerySecurityContextToken (SECUR32.@)
968 SECURITY_STATUS WINAPI QuerySecurityContextToken(PCtxtHandle phContext,
969 HANDLE *phToken)
971 SECURITY_STATUS ret;
973 TRACE("%p %p\n", phContext, phToken);
974 if (phContext)
976 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
977 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
979 if (package && package->provider)
981 if (package->provider->fnTableW.QuerySecurityContextToken)
982 ret = package->provider->fnTableW.QuerySecurityContextToken(
983 ctxt, phToken);
984 else
985 ret = SEC_E_UNSUPPORTED_FUNCTION;
987 else
988 ret = SEC_E_INVALID_HANDLE;
990 else
991 ret = SEC_E_INVALID_HANDLE;
992 return ret;
995 /***********************************************************************
996 * EncryptMessage (SECUR32.@)
998 SECURITY_STATUS WINAPI EncryptMessage(PCtxtHandle phContext, ULONG fQOP,
999 PSecBufferDesc pMessage, ULONG MessageSeqNo)
1001 SECURITY_STATUS ret;
1003 TRACE("%p %d %p %d\n", phContext, fQOP, pMessage, MessageSeqNo);
1004 if (phContext)
1006 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
1007 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
1009 if (package && package->provider)
1011 if (package->provider->fnTableW.EncryptMessage)
1012 ret = package->provider->fnTableW.EncryptMessage(
1013 ctxt, fQOP, pMessage, MessageSeqNo);
1014 else
1015 ret = SEC_E_UNSUPPORTED_FUNCTION;
1017 else
1018 ret = SEC_E_INVALID_HANDLE;
1020 else
1021 ret = SEC_E_INVALID_HANDLE;
1022 return ret;
1025 /***********************************************************************
1026 * DecryptMessage (SECUR32.@)
1028 SECURITY_STATUS WINAPI DecryptMessage(PCtxtHandle phContext,
1029 PSecBufferDesc pMessage, ULONG MessageSeqNo, PULONG pfQOP)
1031 SECURITY_STATUS ret;
1033 TRACE("%p %p %d %p\n", phContext, pMessage, MessageSeqNo, pfQOP);
1034 if (phContext)
1036 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
1037 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
1039 if (package && package->provider)
1041 if (package->provider->fnTableW.DecryptMessage)
1042 ret = package->provider->fnTableW.DecryptMessage(
1043 ctxt, pMessage, MessageSeqNo, pfQOP);
1044 else
1045 ret = SEC_E_UNSUPPORTED_FUNCTION;
1047 else
1048 ret = SEC_E_INVALID_HANDLE;
1050 else
1051 ret = SEC_E_INVALID_HANDLE;
1052 return ret;
1055 /***********************************************************************
1056 * SetContextAttributesA (SECUR32.@)
1058 SECURITY_STATUS WINAPI SetContextAttributesA(PCtxtHandle phContext,
1059 ULONG ulAttribute, void *pBuffer, ULONG cbBuffer)
1061 SECURITY_STATUS ret;
1063 TRACE("%p %d %p %d\n", phContext, ulAttribute, pBuffer, cbBuffer);
1064 if (phContext)
1066 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
1067 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
1069 if (package && package->provider)
1071 if (package->provider->fnTableA.SetContextAttributesA)
1072 ret = package->provider->fnTableA.SetContextAttributesA(
1073 ctxt, ulAttribute, pBuffer, cbBuffer);
1074 else
1075 ret = SEC_E_UNSUPPORTED_FUNCTION;
1077 else
1078 ret = SEC_E_INVALID_HANDLE;
1080 else
1081 ret = SEC_E_INVALID_HANDLE;
1082 return ret;
1085 /***********************************************************************
1086 * SetContextAttributesW (SECUR32.@)
1088 SECURITY_STATUS WINAPI SetContextAttributesW(PCtxtHandle phContext,
1089 ULONG ulAttribute, void *pBuffer, ULONG cbBuffer)
1091 SECURITY_STATUS ret;
1093 TRACE("%p %d %p %d\n", phContext, ulAttribute, pBuffer, cbBuffer);
1094 if (phContext)
1096 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
1097 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
1099 if (package && package->provider)
1101 if (package->provider->fnTableW.SetContextAttributesW)
1102 ret = package->provider->fnTableW.SetContextAttributesW(
1103 ctxt, ulAttribute, pBuffer, cbBuffer);
1104 else
1105 ret = SEC_E_UNSUPPORTED_FUNCTION;
1107 else
1108 ret = SEC_E_INVALID_HANDLE;
1110 else
1111 ret = SEC_E_INVALID_HANDLE;
1112 return ret;