Release 1.1.37.
[wine/gsoc-2012-control.git] / dlls / secur32 / wrapper.c
blob3d678a51493e5f66e3abe58d0291e43ccba76d86
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 = HeapAlloc(GetProcessHeap(), 0, sizeof(SecHandle));
46 if (newSec)
48 *newSec = *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 HeapFree(GetProcessHeap(), 0, 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;
250 SecurePackage *package = NULL;
251 PCredHandle cred = NULL;
252 PCredHandle ctxt = NULL;
254 TRACE("%p %p %s %d %d %d %p %d %p %p %p %p\n", phCredential, phContext,
255 debugstr_a(pszTargetName), fContextReq, Reserved1, TargetDataRep, pInput,
256 Reserved1, phNewContext, pOutput, pfContextAttr, ptsExpiry);
258 if (phContext)
260 package = (SecurePackage *)phContext->dwUpper;
261 ctxt = (PCtxtHandle)phContext->dwLower;
263 if (phCredential)
265 package = (SecurePackage *)phCredential->dwUpper;
266 cred = (PCredHandle)phCredential->dwLower;
269 if (package && package->provider)
271 if (package->provider->fnTableA.InitializeSecurityContextA)
273 CtxtHandle myCtxt;
275 if (phContext)
277 PCtxtHandle realCtxt = (PCtxtHandle)phContext->dwLower;
278 myCtxt.dwUpper = realCtxt->dwUpper;
279 myCtxt.dwLower = realCtxt->dwLower;
282 ret = package->provider->fnTableA.InitializeSecurityContextA(
283 cred, ctxt, pszTargetName, fContextReq,
284 Reserved1, TargetDataRep, pInput, Reserved2, phNewContext ? &myCtxt : NULL,
285 pOutput, pfContextAttr, ptsExpiry);
286 if ((ret == SEC_E_OK || ret == SEC_I_CONTINUE_NEEDED) &&
287 phNewContext && phNewContext != phContext)
289 SECURITY_STATUS ret2;
290 ret2 = SECUR32_makeSecHandle(phNewContext, package, &myCtxt);
291 if (ret2 != SEC_E_OK)
292 package->provider->fnTableA.DeleteSecurityContext(&myCtxt);
295 else
296 ret = SEC_E_UNSUPPORTED_FUNCTION;
298 else
299 ret = SEC_E_INVALID_HANDLE;
300 return ret;
303 /***********************************************************************
304 * InitializeSecurityContextW (SECUR32.@)
306 SECURITY_STATUS WINAPI InitializeSecurityContextW(
307 PCredHandle phCredential, PCtxtHandle phContext,
308 SEC_WCHAR *pszTargetName, ULONG fContextReq,
309 ULONG Reserved1, ULONG TargetDataRep, PSecBufferDesc pInput,
310 ULONG Reserved2, PCtxtHandle phNewContext, PSecBufferDesc pOutput,
311 ULONG *pfContextAttr, PTimeStamp ptsExpiry)
313 SECURITY_STATUS ret;
314 SecurePackage *package = NULL;
315 PCredHandle cred = NULL;
316 PCredHandle ctxt = NULL;
318 TRACE("%p %p %s %d %d %d %p %d %p %p %p %p\n", phCredential, phContext,
319 debugstr_w(pszTargetName), fContextReq, Reserved1, TargetDataRep, pInput,
320 Reserved1, phNewContext, pOutput, pfContextAttr, ptsExpiry);
322 if (phContext)
324 package = (SecurePackage *)phContext->dwUpper;
325 ctxt = (PCtxtHandle)phContext->dwLower;
327 if (phCredential)
329 package = (SecurePackage *)phCredential->dwUpper;
330 cred = (PCredHandle)phCredential->dwLower;
333 if (package && package->provider)
335 if (package->provider->fnTableW.InitializeSecurityContextW)
337 CtxtHandle myCtxt;
339 if (phContext)
341 PCtxtHandle realCtxt = (PCtxtHandle)phContext->dwLower;
342 myCtxt.dwUpper = realCtxt->dwUpper;
343 myCtxt.dwLower = realCtxt->dwLower;
346 ret = package->provider->fnTableW.InitializeSecurityContextW(
347 cred, ctxt, pszTargetName, fContextReq,
348 Reserved1, TargetDataRep, pInput, Reserved2, phNewContext ? &myCtxt : NULL,
349 pOutput, pfContextAttr, ptsExpiry);
350 if ((ret == SEC_E_OK || ret == SEC_I_CONTINUE_NEEDED) &&
351 phNewContext && phNewContext != phContext)
353 SECURITY_STATUS ret2;
354 ret2 = SECUR32_makeSecHandle(phNewContext, package, &myCtxt);
355 if (ret2 != SEC_E_OK)
356 package->provider->fnTableW.DeleteSecurityContext(&myCtxt);
359 else
360 ret = SEC_E_UNSUPPORTED_FUNCTION;
362 else
363 ret = SEC_E_INVALID_HANDLE;
364 return ret;
367 /***********************************************************************
368 * AcceptSecurityContext (SECUR32.@)
370 SECURITY_STATUS WINAPI AcceptSecurityContext(
371 PCredHandle phCredential, PCtxtHandle phContext, PSecBufferDesc pInput,
372 ULONG fContextReq, ULONG TargetDataRep, PCtxtHandle phNewContext,
373 PSecBufferDesc pOutput, ULONG *pfContextAttr, PTimeStamp ptsExpiry)
375 SECURITY_STATUS ret;
377 TRACE("%p %p %p %d %d %p %p %p %p\n", phCredential, phContext, pInput,
378 fContextReq, TargetDataRep, phNewContext, pOutput, pfContextAttr,
379 ptsExpiry);
380 if (phCredential)
382 SecurePackage *package = (SecurePackage *)phCredential->dwUpper;
383 PCredHandle cred = (PCredHandle)phCredential->dwLower;
385 if (package && package->provider)
387 if (package->provider->fnTableW.AcceptSecurityContext)
389 CtxtHandle myCtxt;
391 if(phContext)
393 PCtxtHandle realCtxt = (PCtxtHandle)phContext->dwLower;
394 TRACE("realCtx: %p\n", realCtxt);
395 myCtxt.dwUpper = realCtxt->dwUpper;
396 myCtxt.dwLower = realCtxt->dwLower;
399 ret = package->provider->fnTableW.AcceptSecurityContext(
400 cred, phContext ? &myCtxt : NULL, pInput, fContextReq,
401 TargetDataRep, &myCtxt, pOutput, pfContextAttr, ptsExpiry);
402 if (ret == SEC_E_OK || ret == SEC_I_CONTINUE_NEEDED)
404 SECURITY_STATUS ret2;
405 ret2 = SECUR32_makeSecHandle(phNewContext, package, &myCtxt);
406 if (ret2 != SEC_E_OK)
407 package->provider->fnTableW.DeleteSecurityContext(
408 &myCtxt);
411 else
412 ret = SEC_E_UNSUPPORTED_FUNCTION;
414 else
415 ret = SEC_E_INVALID_HANDLE;
417 else
418 ret = SEC_E_INVALID_HANDLE;
419 return ret;
422 /***********************************************************************
423 * CompleteAuthToken (SECUR32.@)
425 SECURITY_STATUS WINAPI CompleteAuthToken(PCtxtHandle phContext,
426 PSecBufferDesc pToken)
428 SECURITY_STATUS ret;
430 TRACE("%p %p\n", phContext, pToken);
431 if (phContext)
433 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
434 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
436 if (package && package->provider)
438 if (package->provider->fnTableW.CompleteAuthToken)
439 ret = package->provider->fnTableW.CompleteAuthToken(ctxt,
440 pToken);
441 else
442 ret = SEC_E_UNSUPPORTED_FUNCTION;
444 else
445 ret = SEC_E_INVALID_HANDLE;
447 else
448 ret = SEC_E_INVALID_HANDLE;
449 return ret;
452 /***********************************************************************
453 * DeleteSecurityContext (SECUR32.@)
455 SECURITY_STATUS WINAPI DeleteSecurityContext(PCtxtHandle phContext)
457 SECURITY_STATUS ret;
459 TRACE("%p\n", phContext);
460 if (phContext)
462 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
463 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
465 if (package && package->provider &&
466 package->provider->fnTableW.DeleteSecurityContext)
467 ret = package->provider->fnTableW.DeleteSecurityContext(ctxt);
468 else
469 ret = SEC_E_INVALID_HANDLE;
470 HeapFree(GetProcessHeap(), 0, ctxt);
472 else
473 ret = SEC_E_INVALID_HANDLE;
474 return ret;
477 /***********************************************************************
478 * ApplyControlToken (SECUR32.@)
480 SECURITY_STATUS WINAPI ApplyControlToken(PCtxtHandle phContext,
481 PSecBufferDesc pInput)
483 SECURITY_STATUS ret;
485 TRACE("%p %p\n", phContext, pInput);
486 if (phContext)
488 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
489 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
491 if (package && package->provider)
493 if (package->provider->fnTableW.ApplyControlToken)
494 ret = package->provider->fnTableW.ApplyControlToken(
495 ctxt, pInput);
496 else
497 ret = SEC_E_UNSUPPORTED_FUNCTION;
499 else
500 ret = SEC_E_INVALID_HANDLE;
502 else
503 ret = SEC_E_INVALID_HANDLE;
504 return ret;
507 /***********************************************************************
508 * QueryContextAttributesA (SECUR32.@)
510 SECURITY_STATUS WINAPI QueryContextAttributesA(PCtxtHandle phContext,
511 ULONG ulAttribute, void *pBuffer)
513 SECURITY_STATUS ret;
515 TRACE("%p %d %p\n", phContext, ulAttribute, pBuffer);
516 if (phContext)
518 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
519 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
521 if (package && package->provider)
523 if (package->provider->fnTableA.QueryContextAttributesA)
524 ret = package->provider->fnTableA.QueryContextAttributesA(
525 ctxt, ulAttribute, pBuffer);
526 else
527 ret = SEC_E_UNSUPPORTED_FUNCTION;
529 else
530 ret = SEC_E_INVALID_HANDLE;
532 else
533 ret = SEC_E_INVALID_HANDLE;
534 return ret;
537 /***********************************************************************
538 * QueryContextAttributesW (SECUR32.@)
540 SECURITY_STATUS WINAPI QueryContextAttributesW(PCtxtHandle phContext,
541 ULONG ulAttribute, void *pBuffer)
543 SECURITY_STATUS ret;
545 TRACE("%p %d %p\n", phContext, ulAttribute, pBuffer);
546 if (phContext)
548 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
549 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
551 if (package && package->provider)
553 if (package->provider->fnTableW.QueryContextAttributesW)
554 ret = package->provider->fnTableW.QueryContextAttributesW(
555 ctxt, ulAttribute, pBuffer);
556 else
557 ret = SEC_E_UNSUPPORTED_FUNCTION;
559 else
560 ret = SEC_E_INVALID_HANDLE;
562 else
563 ret = SEC_E_INVALID_HANDLE;
564 return ret;
567 /***********************************************************************
568 * ImpersonateSecurityContext (SECUR32.@)
570 SECURITY_STATUS WINAPI ImpersonateSecurityContext(PCtxtHandle phContext)
572 SECURITY_STATUS ret;
574 TRACE("%p\n", phContext);
575 if (phContext)
577 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
578 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
580 if (package && package->provider)
582 if (package->provider->fnTableW.ImpersonateSecurityContext)
583 ret = package->provider->fnTableW.ImpersonateSecurityContext(
584 ctxt);
585 else
586 ret = SEC_E_UNSUPPORTED_FUNCTION;
588 else
589 ret = SEC_E_INVALID_HANDLE;
591 else
592 ret = SEC_E_INVALID_HANDLE;
593 return ret;
596 /***********************************************************************
597 * RevertSecurityContext (SECUR32.@)
599 SECURITY_STATUS WINAPI RevertSecurityContext(PCtxtHandle phContext)
601 SECURITY_STATUS ret;
603 TRACE("%p\n", phContext);
604 if (phContext)
606 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
607 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
609 if (package && package->provider)
611 if (package->provider->fnTableW.RevertSecurityContext)
612 ret = package->provider->fnTableW.RevertSecurityContext(
613 ctxt);
614 else
615 ret = SEC_E_UNSUPPORTED_FUNCTION;
617 else
618 ret = SEC_E_INVALID_HANDLE;
620 else
621 ret = SEC_E_INVALID_HANDLE;
622 return ret;
625 /***********************************************************************
626 * MakeSignature (SECUR32.@)
628 SECURITY_STATUS WINAPI MakeSignature(PCtxtHandle phContext, ULONG fQOP,
629 PSecBufferDesc pMessage, ULONG MessageSeqNo)
631 SECURITY_STATUS ret;
633 TRACE("%p %d %p %d\n", phContext, fQOP, pMessage, MessageSeqNo);
634 if (phContext)
636 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
637 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
639 if (package && package->provider)
641 if (package->provider->fnTableW.MakeSignature)
642 ret = package->provider->fnTableW.MakeSignature(
643 ctxt, fQOP, pMessage, MessageSeqNo);
644 else
645 ret = SEC_E_UNSUPPORTED_FUNCTION;
647 else
648 ret = SEC_E_INVALID_HANDLE;
650 else
651 ret = SEC_E_INVALID_HANDLE;
652 return ret;
655 /***********************************************************************
656 * VerifySignature (SECUR32.@)
658 SECURITY_STATUS WINAPI VerifySignature(PCtxtHandle phContext,
659 PSecBufferDesc pMessage, ULONG MessageSeqNo, PULONG pfQOP)
661 SECURITY_STATUS ret;
663 TRACE("%p %p %d %p\n", phContext, pMessage, MessageSeqNo, pfQOP);
664 if (phContext)
666 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
667 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
669 if (package && package->provider)
671 if (package->provider->fnTableW.VerifySignature)
672 ret = package->provider->fnTableW.VerifySignature(
673 ctxt, pMessage, MessageSeqNo, pfQOP);
674 else
675 ret = SEC_E_UNSUPPORTED_FUNCTION;
677 else
678 ret = SEC_E_INVALID_HANDLE;
680 else
681 ret = SEC_E_INVALID_HANDLE;
682 return ret;
685 /***********************************************************************
686 * QuerySecurityPackageInfoA (SECUR32.@)
688 SECURITY_STATUS WINAPI QuerySecurityPackageInfoA(SEC_CHAR *pszPackageName,
689 PSecPkgInfoA *ppPackageInfo)
691 SECURITY_STATUS ret;
693 TRACE("%s %p\n", debugstr_a(pszPackageName), ppPackageInfo);
694 if (pszPackageName)
696 SecurePackage *package = SECUR32_findPackageA(pszPackageName);
698 if (package)
700 size_t bytesNeeded = sizeof(SecPkgInfoA);
701 int nameLen = 0, commentLen = 0;
703 if (package->infoW.Name)
705 nameLen = WideCharToMultiByte(CP_ACP, 0,
706 package->infoW.Name, -1, NULL, 0, NULL, NULL);
707 bytesNeeded += nameLen;
709 if (package->infoW.Comment)
711 commentLen = WideCharToMultiByte(CP_ACP, 0,
712 package->infoW.Comment, -1, NULL, 0, NULL, NULL);
713 bytesNeeded += commentLen;
715 *ppPackageInfo = HeapAlloc(GetProcessHeap(), 0, bytesNeeded);
716 if (*ppPackageInfo)
718 PSTR nextString = (PSTR)((PBYTE)*ppPackageInfo +
719 sizeof(SecPkgInfoA));
721 memcpy(*ppPackageInfo, &package->infoW, sizeof(package->infoW));
722 if (package->infoW.Name)
724 (*ppPackageInfo)->Name = nextString;
725 nextString += WideCharToMultiByte(CP_ACP, 0,
726 package->infoW.Name, -1, nextString, nameLen, NULL, NULL);
728 else
729 (*ppPackageInfo)->Name = NULL;
730 if (package->infoW.Comment)
732 (*ppPackageInfo)->Comment = nextString;
733 nextString += WideCharToMultiByte(CP_ACP, 0,
734 package->infoW.Comment, -1, nextString, commentLen, NULL,
735 NULL);
737 else
738 (*ppPackageInfo)->Comment = NULL;
739 ret = SEC_E_OK;
741 else
742 ret = SEC_E_INSUFFICIENT_MEMORY;
744 else
745 ret = SEC_E_SECPKG_NOT_FOUND;
747 else
748 ret = SEC_E_SECPKG_NOT_FOUND;
749 return ret;
752 /***********************************************************************
753 * QuerySecurityPackageInfoW (SECUR32.@)
755 SECURITY_STATUS WINAPI QuerySecurityPackageInfoW(SEC_WCHAR *pszPackageName,
756 PSecPkgInfoW *ppPackageInfo)
758 SECURITY_STATUS ret;
759 SecurePackage *package = SECUR32_findPackageW(pszPackageName);
761 TRACE("%s %p\n", debugstr_w(pszPackageName), ppPackageInfo);
762 if (package)
764 size_t bytesNeeded = sizeof(SecPkgInfoW);
765 int nameLen = 0, commentLen = 0;
767 if (package->infoW.Name)
769 nameLen = lstrlenW(package->infoW.Name) + 1;
770 bytesNeeded += nameLen * sizeof(WCHAR);
772 if (package->infoW.Comment)
774 commentLen = lstrlenW(package->infoW.Comment) + 1;
775 bytesNeeded += commentLen * sizeof(WCHAR);
777 *ppPackageInfo = HeapAlloc(GetProcessHeap(), 0, bytesNeeded);
778 if (*ppPackageInfo)
780 PWSTR nextString = (PWSTR)((PBYTE)*ppPackageInfo +
781 sizeof(SecPkgInfoW));
783 **ppPackageInfo = package->infoW;
784 if (package->infoW.Name)
786 (*ppPackageInfo)->Name = nextString;
787 lstrcpynW(nextString, package->infoW.Name, nameLen);
788 nextString += nameLen;
790 else
791 (*ppPackageInfo)->Name = NULL;
792 if (package->infoW.Comment)
794 (*ppPackageInfo)->Comment = nextString;
795 lstrcpynW(nextString, package->infoW.Comment, commentLen);
796 nextString += commentLen;
798 else
799 (*ppPackageInfo)->Comment = NULL;
800 ret = SEC_E_OK;
802 else
803 ret = SEC_E_INSUFFICIENT_MEMORY;
805 else
806 ret = SEC_E_SECPKG_NOT_FOUND;
807 return ret;
810 /***********************************************************************
811 * ExportSecurityContext (SECUR32.@)
813 SECURITY_STATUS WINAPI ExportSecurityContext(PCtxtHandle phContext,
814 ULONG fFlags, PSecBuffer pPackedContext, void **pToken)
816 SECURITY_STATUS ret;
818 TRACE("%p %d %p %p\n", phContext, fFlags, pPackedContext, pToken);
819 if (phContext)
821 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
822 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
824 if (package && package->provider)
826 if (package->provider->fnTableW.ExportSecurityContext)
827 ret = package->provider->fnTableW.ExportSecurityContext(
828 ctxt, fFlags, pPackedContext, pToken);
829 else
830 ret = SEC_E_UNSUPPORTED_FUNCTION;
832 else
833 ret = SEC_E_INVALID_HANDLE;
835 else
836 ret = SEC_E_INVALID_HANDLE;
837 return ret;
840 /***********************************************************************
841 * ImportSecurityContextA (SECUR32.@)
843 SECURITY_STATUS WINAPI ImportSecurityContextA(SEC_CHAR *pszPackage,
844 PSecBuffer pPackedContext, void *Token, PCtxtHandle phContext)
846 SECURITY_STATUS ret;
847 SecurePackage *package = SECUR32_findPackageA(pszPackage);
849 TRACE("%s %p %p %p\n", debugstr_a(pszPackage), pPackedContext, Token,
850 phContext);
851 if (package && package->provider)
853 if (package->provider->fnTableA.ImportSecurityContextA)
855 CtxtHandle myCtxt;
857 ret = package->provider->fnTableA.ImportSecurityContextA(
858 pszPackage, pPackedContext, Token, &myCtxt);
859 if (ret == SEC_E_OK)
861 ret = SECUR32_makeSecHandle(phContext, package, &myCtxt);
862 if (ret != SEC_E_OK)
863 package->provider->fnTableW.DeleteSecurityContext(&myCtxt);
866 else
867 ret = SEC_E_UNSUPPORTED_FUNCTION;
869 else
870 ret = SEC_E_SECPKG_NOT_FOUND;
871 return ret;
875 /***********************************************************************
876 * ImportSecurityContextW (SECUR32.@)
878 SECURITY_STATUS WINAPI ImportSecurityContextW(SEC_WCHAR *pszPackage,
879 PSecBuffer pPackedContext, void *Token, PCtxtHandle phContext)
881 SECURITY_STATUS ret;
882 SecurePackage *package = SECUR32_findPackageW(pszPackage);
884 TRACE("%s %p %p %p\n", debugstr_w(pszPackage), pPackedContext, Token,
885 phContext);
886 if (package && package->provider)
888 if (package->provider->fnTableW.ImportSecurityContextW)
890 CtxtHandle myCtxt;
892 ret = package->provider->fnTableW.ImportSecurityContextW(
893 pszPackage, pPackedContext, Token, &myCtxt);
894 if (ret == SEC_E_OK)
896 ret = SECUR32_makeSecHandle(phContext, package, &myCtxt);
897 if (ret != SEC_E_OK)
898 package->provider->fnTableW.DeleteSecurityContext(&myCtxt);
901 else
902 ret = SEC_E_UNSUPPORTED_FUNCTION;
904 else
905 ret = SEC_E_SECPKG_NOT_FOUND;
906 return ret;
909 /***********************************************************************
910 * AddCredentialsA (SECUR32.@)
912 SECURITY_STATUS WINAPI AddCredentialsA(PCredHandle hCredentials,
913 SEC_CHAR *pszPrincipal, SEC_CHAR *pszPackage, ULONG fCredentialUse,
914 void *pAuthData, SEC_GET_KEY_FN pGetKeyFn, void *pvGetKeyArgument,
915 PTimeStamp ptsExpiry)
917 SECURITY_STATUS ret;
919 TRACE("%p %s %s %d %p %p %p %p\n", hCredentials, debugstr_a(pszPrincipal),
920 debugstr_a(pszPackage), fCredentialUse, pAuthData, pGetKeyFn,
921 pvGetKeyArgument, ptsExpiry);
922 if (hCredentials)
924 SecurePackage *package = (SecurePackage *)hCredentials->dwUpper;
925 PCredHandle cred = (PCtxtHandle)hCredentials->dwLower;
927 if (package && package->provider)
929 if (package->provider->fnTableA.AddCredentialsA)
930 ret = package->provider->fnTableA.AddCredentialsA(
931 cred, pszPrincipal, pszPackage, fCredentialUse, pAuthData,
932 pGetKeyFn, pvGetKeyArgument, ptsExpiry);
933 else
934 ret = SEC_E_UNSUPPORTED_FUNCTION;
936 else
937 ret = SEC_E_INVALID_HANDLE;
939 else
940 ret = SEC_E_INVALID_HANDLE;
941 return ret;
944 /***********************************************************************
945 * AddCredentialsW (SECUR32.@)
947 SECURITY_STATUS WINAPI AddCredentialsW(PCredHandle hCredentials,
948 SEC_WCHAR *pszPrincipal, SEC_WCHAR *pszPackage, ULONG fCredentialUse,
949 void *pAuthData, SEC_GET_KEY_FN pGetKeyFn, void *pvGetKeyArgument,
950 PTimeStamp ptsExpiry)
952 SECURITY_STATUS ret;
954 TRACE("%p %s %s %d %p %p %p %p\n", hCredentials, debugstr_w(pszPrincipal),
955 debugstr_w(pszPackage), fCredentialUse, pAuthData, pGetKeyFn,
956 pvGetKeyArgument, ptsExpiry);
957 if (hCredentials)
959 SecurePackage *package = (SecurePackage *)hCredentials->dwUpper;
960 PCredHandle cred = (PCtxtHandle)hCredentials->dwLower;
962 if (package && package->provider)
964 if (package->provider->fnTableW.AddCredentialsW)
965 ret = package->provider->fnTableW.AddCredentialsW(
966 cred, pszPrincipal, pszPackage, fCredentialUse, pAuthData,
967 pGetKeyFn, pvGetKeyArgument, ptsExpiry);
968 else
969 ret = SEC_E_UNSUPPORTED_FUNCTION;
971 else
972 ret = SEC_E_INVALID_HANDLE;
974 else
975 ret = SEC_E_INVALID_HANDLE;
976 return ret;
979 /***********************************************************************
980 * QuerySecurityContextToken (SECUR32.@)
982 SECURITY_STATUS WINAPI QuerySecurityContextToken(PCtxtHandle phContext,
983 HANDLE *phToken)
985 SECURITY_STATUS ret;
987 TRACE("%p %p\n", phContext, phToken);
988 if (phContext)
990 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
991 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
993 if (package && package->provider)
995 if (package->provider->fnTableW.QuerySecurityContextToken)
996 ret = package->provider->fnTableW.QuerySecurityContextToken(
997 ctxt, phToken);
998 else
999 ret = SEC_E_UNSUPPORTED_FUNCTION;
1001 else
1002 ret = SEC_E_INVALID_HANDLE;
1004 else
1005 ret = SEC_E_INVALID_HANDLE;
1006 return ret;
1009 /***********************************************************************
1010 * EncryptMessage (SECUR32.@)
1012 SECURITY_STATUS WINAPI EncryptMessage(PCtxtHandle phContext, ULONG fQOP,
1013 PSecBufferDesc pMessage, ULONG MessageSeqNo)
1015 SECURITY_STATUS ret;
1017 TRACE("%p %d %p %d\n", phContext, fQOP, pMessage, MessageSeqNo);
1018 if (phContext)
1020 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
1021 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
1023 if (package && package->provider)
1025 if (package->provider->fnTableW.EncryptMessage)
1026 ret = package->provider->fnTableW.EncryptMessage(
1027 ctxt, fQOP, pMessage, MessageSeqNo);
1028 else
1029 ret = SEC_E_UNSUPPORTED_FUNCTION;
1031 else
1032 ret = SEC_E_INVALID_HANDLE;
1034 else
1035 ret = SEC_E_INVALID_HANDLE;
1036 return ret;
1039 /***********************************************************************
1040 * DecryptMessage (SECUR32.@)
1042 SECURITY_STATUS WINAPI DecryptMessage(PCtxtHandle phContext,
1043 PSecBufferDesc pMessage, ULONG MessageSeqNo, PULONG pfQOP)
1045 SECURITY_STATUS ret;
1047 TRACE("%p %p %d %p\n", phContext, pMessage, MessageSeqNo, pfQOP);
1048 if (phContext)
1050 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
1051 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
1053 if (package && package->provider)
1055 if (package->provider->fnTableW.DecryptMessage)
1056 ret = package->provider->fnTableW.DecryptMessage(
1057 ctxt, pMessage, MessageSeqNo, pfQOP);
1058 else
1059 ret = SEC_E_UNSUPPORTED_FUNCTION;
1061 else
1062 ret = SEC_E_INVALID_HANDLE;
1064 else
1065 ret = SEC_E_INVALID_HANDLE;
1066 return ret;
1069 /***********************************************************************
1070 * SetContextAttributesA (SECUR32.@)
1072 SECURITY_STATUS WINAPI SetContextAttributesA(PCtxtHandle phContext,
1073 ULONG ulAttribute, void *pBuffer, ULONG cbBuffer)
1075 SECURITY_STATUS ret;
1077 TRACE("%p %d %p %d\n", phContext, ulAttribute, pBuffer, cbBuffer);
1078 if (phContext)
1080 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
1081 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
1083 if (package && package->provider)
1085 if (package->provider->fnTableA.SetContextAttributesA)
1086 ret = package->provider->fnTableA.SetContextAttributesA(
1087 ctxt, ulAttribute, pBuffer, cbBuffer);
1088 else
1089 ret = SEC_E_UNSUPPORTED_FUNCTION;
1091 else
1092 ret = SEC_E_INVALID_HANDLE;
1094 else
1095 ret = SEC_E_INVALID_HANDLE;
1096 return ret;
1099 /***********************************************************************
1100 * SetContextAttributesW (SECUR32.@)
1102 SECURITY_STATUS WINAPI SetContextAttributesW(PCtxtHandle phContext,
1103 ULONG ulAttribute, void *pBuffer, ULONG cbBuffer)
1105 SECURITY_STATUS ret;
1107 TRACE("%p %d %p %d\n", phContext, ulAttribute, pBuffer, cbBuffer);
1108 if (phContext)
1110 SecurePackage *package = (SecurePackage *)phContext->dwUpper;
1111 PCtxtHandle ctxt = (PCtxtHandle)phContext->dwLower;
1113 if (package && package->provider)
1115 if (package->provider->fnTableW.SetContextAttributesW)
1116 ret = package->provider->fnTableW.SetContextAttributesW(
1117 ctxt, ulAttribute, pBuffer, cbBuffer);
1118 else
1119 ret = SEC_E_UNSUPPORTED_FUNCTION;
1121 else
1122 ret = SEC_E_INVALID_HANDLE;
1124 else
1125 ret = SEC_E_INVALID_HANDLE;
1126 return ret;