mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
203 lines
3.9 KiB
203 lines
3.9 KiB
/*++
|
|
|
|
Copyright (C) 1996, 1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
nt5wrap.cpp
|
|
|
|
Abstract:
|
|
|
|
Client side CryptXXXData calls.
|
|
|
|
Client funcs are preceeded by "CS" == Client Side
|
|
Server functions are preceeded by "SS" == Server Side
|
|
|
|
Author:
|
|
|
|
Scott Field (sfield) 14-Aug-97
|
|
|
|
Revisions:
|
|
|
|
Todds 04-Sep-97 Ported to .dll
|
|
Matt Thomlinson (mattt) 09-Oct-97 Moved to common area for link by crypt32
|
|
philh 03-Dec-97 Added I_CertProtectFunction
|
|
philh 29-Sep-98 Renamed I_CertProtectFunction to
|
|
I_CertCltProtectFunction.
|
|
I_CertProtectFunction was moved to
|
|
..\ispu\pki\certstor\protroot.cpp
|
|
petesk 25-Jan-00 Moved to keysvc
|
|
|
|
--*/
|
|
|
|
|
|
|
|
#include <windows.h>
|
|
#include <wincrypt.h>
|
|
#include <cryptui.h>
|
|
#include "unicode.h"
|
|
#include "waitsvc.h"
|
|
#include "certprot.h"
|
|
|
|
// midl generated files
|
|
|
|
#include "keyrpc.h"
|
|
#include "lenroll.h"
|
|
#include "keysvc.h"
|
|
#include "keysvcc.h"
|
|
#include "cerrpc.h"
|
|
|
|
|
|
|
|
// fwds
|
|
RPC_STATUS CertBindA(
|
|
unsigned char **pszBinding,
|
|
RPC_BINDING_HANDLE *phBind
|
|
);
|
|
|
|
|
|
RPC_STATUS CertUnbindA(
|
|
unsigned char **pszBinding,
|
|
RPC_BINDING_HANDLE *phBind
|
|
);
|
|
|
|
|
|
|
|
|
|
BOOL
|
|
WINAPI
|
|
I_CertCltProtectFunction(
|
|
IN DWORD dwFuncId,
|
|
IN DWORD dwFlags,
|
|
IN OPTIONAL LPCWSTR pwszIn,
|
|
IN OPTIONAL BYTE *pbIn,
|
|
IN DWORD cbIn,
|
|
OUT OPTIONAL BYTE **ppbOut,
|
|
OUT OPTIONAL DWORD *pcbOut
|
|
)
|
|
{
|
|
BOOL fResult;
|
|
DWORD dwRetVal;
|
|
RPC_BINDING_HANDLE h = NULL;
|
|
unsigned char *pszBinding;
|
|
RPC_STATUS RpcStatus;
|
|
|
|
HANDLE hEvent = NULL;
|
|
|
|
BYTE *pbSSOut = NULL;
|
|
DWORD cbSSOut = 0;
|
|
BYTE rgbIn[1];
|
|
|
|
if (NULL == pwszIn)
|
|
pwszIn = L"";
|
|
if (NULL == pbIn) {
|
|
pbIn = rgbIn;
|
|
cbIn = 0;
|
|
}
|
|
|
|
if (!FIsWinNT5()) {
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
goto ErrorReturn;
|
|
}
|
|
|
|
RpcStatus = CertBindA(&pszBinding, &h);
|
|
if (RpcStatus != RPC_S_OK) {
|
|
SetLastError(RpcStatus);
|
|
goto ErrorReturn;
|
|
}
|
|
|
|
|
|
__try {
|
|
dwRetVal = SSCertProtectFunction(
|
|
h,
|
|
dwFuncId,
|
|
dwFlags,
|
|
pwszIn,
|
|
pbIn,
|
|
cbIn,
|
|
&pbSSOut,
|
|
&cbSSOut
|
|
);
|
|
} __except(EXCEPTION_EXECUTE_HANDLER) {
|
|
dwRetVal = GetExceptionCode();
|
|
}
|
|
|
|
CertUnbindA(&pszBinding, &h);
|
|
|
|
if (ERROR_SUCCESS != dwRetVal) {
|
|
if (RPC_S_UNKNOWN_IF == dwRetVal)
|
|
dwRetVal = ERROR_CALL_NOT_IMPLEMENTED;
|
|
SetLastError(dwRetVal);
|
|
goto ErrorReturn;
|
|
}
|
|
|
|
fResult = TRUE;
|
|
CommonReturn:
|
|
if (ppbOut)
|
|
*ppbOut = pbSSOut;
|
|
else if (pbSSOut)
|
|
midl_user_free(pbSSOut);
|
|
|
|
if (pcbOut)
|
|
*pcbOut = cbSSOut;
|
|
|
|
return fResult;
|
|
|
|
ErrorReturn:
|
|
fResult = FALSE;
|
|
goto CommonReturn;
|
|
}
|
|
|
|
|
|
|
|
static RPC_STATUS CertBindA(unsigned char **pszBinding, RPC_BINDING_HANDLE *phBind)
|
|
{
|
|
RPC_STATUS status;
|
|
static BOOL fDone = FALSE;
|
|
|
|
//
|
|
// wait for the service to be available before attempting bind
|
|
//
|
|
|
|
WaitForCryptService(L"CryptSvc", &fDone);
|
|
|
|
|
|
status = RpcStringBindingComposeA(
|
|
NULL,
|
|
(unsigned char*)KEYSVC_LOCAL_PROT_SEQ,
|
|
NULL,
|
|
(unsigned char*)KEYSVC_LOCAL_ENDPOINT,
|
|
NULL,
|
|
(unsigned char * *)pszBinding
|
|
);
|
|
|
|
|
|
if (status)
|
|
{
|
|
return(status);
|
|
}
|
|
|
|
status = RpcBindingFromStringBindingA(*pszBinding, phBind);
|
|
|
|
return status;
|
|
}
|
|
|
|
|
|
|
|
static RPC_STATUS CertUnbindA(unsigned char **pszBinding, RPC_BINDING_HANDLE *phBind)
|
|
{
|
|
RPC_STATUS status;
|
|
|
|
status = RpcStringFreeA(pszBinding);
|
|
|
|
if (status)
|
|
{
|
|
return(status);
|
|
}
|
|
|
|
RpcBindingFree(phBind);
|
|
|
|
return RPC_S_OK;
|
|
}
|
|
|
|
|