613 lines
13 KiB
C
613 lines
13 KiB
C
/***********************************************************************
|
|
*
|
|
* Copyright (C) 2005-2006 Novell, Inc. Inc. All Rights Reserved.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; version 2.1
|
|
* of the License.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Library Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, Novell, Inc.
|
|
*
|
|
* To contact Novell about this file by physical or electronic mail,
|
|
* you may find current contact information at www.novell.com.
|
|
*
|
|
***********************************************************************/
|
|
|
|
|
|
|
|
#include "nsscs_idk.h"
|
|
#include "sscs_lldefs.h"
|
|
#include "sscs_cache.h"
|
|
|
|
#define INITGUID
|
|
#include <objbase.h>
|
|
//#include "walletdef.h"
|
|
#include "sscs_win_secretstoredef.h"
|
|
|
|
static PIVerifiedAccessSS pIAccess = NULL;
|
|
static PISecretStore pISecretStore = NULL;
|
|
|
|
/* ######################################################################## */
|
|
/* ############################### STUBS HERE ############################# */
|
|
/* ######################################################################## */
|
|
|
|
/*
|
|
* NAME - sscs_CacheOpenSecretStore
|
|
*
|
|
* DESCRIPTION
|
|
*
|
|
*
|
|
*/
|
|
void * sscs_CacheOpenSecretStore
|
|
(
|
|
void *secretStoreID,
|
|
unsigned long ssFlags,
|
|
void *reserved
|
|
)
|
|
{ /* beginning of the call */
|
|
/* ########################## DECLARATIONS START HERE ######################### */
|
|
|
|
NCSTATUS status;
|
|
SCHANDLE *hSC = malloc(sizeof(SCHANDLE));
|
|
|
|
/* ############################## CODE STARTS HERE ############################ */
|
|
|
|
CoInitialize(NULL);
|
|
status = CoCreateInstance(
|
|
(REFCLSID)&CLSID_SecretStoreClientService,
|
|
NULL,
|
|
CLSCTX_SERVER,
|
|
(REFIID)&IID_VerifyAccessSS_1,
|
|
(void **)&pIAccess);
|
|
|
|
|
|
if (status == NC_STATUS_SUCCESS)
|
|
{
|
|
status = pIAccess->lpVtbl->QuerySecureInterface(
|
|
pIAccess,
|
|
GetModuleHandle(NULL),
|
|
(PGUID)&IID_SSCS,
|
|
(void **)&pISecretStore);
|
|
|
|
|
|
pIAccess->lpVtbl->Release(pIAccess);
|
|
|
|
}
|
|
else if(status == REGDB_E_CLASSNOTREG)
|
|
{
|
|
OutputDebugString("SecretStore: Class not Registered");
|
|
}
|
|
else if (status == CLASS_E_NOAGGREGATION )
|
|
{
|
|
OutputDebugString("SecretStore: Class no aggregation");
|
|
}
|
|
else if (status == E_NOINTERFACE)
|
|
{
|
|
OutputDebugString("SecretStore: No Interface");
|
|
}
|
|
|
|
if (status != NC_STATUS_SUCCESS)
|
|
{
|
|
CoUninitialize();
|
|
return 0;
|
|
}
|
|
|
|
|
|
status = pISecretStore->lpVtbl->CacheOpenSecretStore (
|
|
pISecretStore,
|
|
secretStoreID,
|
|
ssFlags,
|
|
hSC,
|
|
NULL
|
|
);
|
|
|
|
if (status != NC_STATUS_SUCCESS)
|
|
{
|
|
CoUninitialize();
|
|
return 0;
|
|
}
|
|
else
|
|
return((void*)hSC);
|
|
|
|
/* ############################### CODE ENDS HERE ############################# */
|
|
} //* sscs_CacheOpenSecretStore
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
* NAME - sscs_CacheCloseSecretStore
|
|
*
|
|
* DESCRIPTION
|
|
*
|
|
*
|
|
*/
|
|
int sscs_CacheCloseSecretStore
|
|
(
|
|
void *ssHandle,
|
|
unsigned long ssFlags,
|
|
void *reserved
|
|
)
|
|
{ /* beginning of the call */
|
|
/* ########################## DECLARATIONS START HERE ######################### */
|
|
|
|
NCSTATUS status;
|
|
SCHANDLE hSC = (SCHANDLE)ssHandle;
|
|
|
|
/* ############################## CODE STARTS HERE ############################ */
|
|
|
|
status = pISecretStore->lpVtbl->CacheCloseSecretStore (
|
|
pISecretStore,
|
|
0,
|
|
ssFlags,
|
|
reserved);
|
|
|
|
pISecretStore->lpVtbl->Release(pISecretStore);
|
|
CoUninitialize();
|
|
|
|
return status;
|
|
|
|
/* ############################### CODE ENDS HERE ############################# */
|
|
} //* sscs_CacheCloseSecretStore
|
|
|
|
|
|
/*
|
|
* NAME - sscs_CacheRemoveSecretStore
|
|
*
|
|
* DESCRIPTION
|
|
*
|
|
*
|
|
*/
|
|
int sscs_CacheRemoveSecretStore
|
|
(
|
|
void *ssHandle,
|
|
unsigned long ssFlags,
|
|
void *reserved
|
|
)
|
|
{ /* beginning of the call */
|
|
/* ########################## DECLARATIONS START HERE ######################### */
|
|
|
|
NCSTATUS status;
|
|
SCHANDLE hSC = (SCHANDLE)ssHandle;
|
|
|
|
/* ############################## CODE STARTS HERE ############################ */
|
|
|
|
status = pISecretStore->lpVtbl->CacheRemoveSecretStore (
|
|
pISecretStore,
|
|
&hSC,
|
|
ssFlags,
|
|
reserved);
|
|
|
|
return status;
|
|
|
|
/* ############################### CODE ENDS HERE ############################# */
|
|
} //* sscs_CacheRemoveSecretStore
|
|
|
|
|
|
|
|
/*
|
|
* NAME - sscs_CacheEnumerateKeychainIDs
|
|
*
|
|
* DESCRIPTION
|
|
*
|
|
*
|
|
*/
|
|
int sscs_CacheEnumerateKeychainIDs
|
|
(
|
|
void *ssHandle,
|
|
unsigned long ssFlags,
|
|
SSCS_SRCH_KEY_T *searchKey,
|
|
SSCS_KEYCHAIN_ID_LIST_T *kcIDList,
|
|
void *reserved
|
|
)
|
|
{ /* beginning of the call */
|
|
/* ########################## DECLARATIONS START HERE ######################### */
|
|
|
|
NCSTATUS status;
|
|
SCHANDLE hSC = (SCHANDLE)ssHandle;
|
|
|
|
/* ############################## CODE STARTS HERE ############################ */
|
|
|
|
status = pISecretStore->lpVtbl->CacheEnumerateKeyChainIDs (
|
|
pISecretStore,
|
|
0,
|
|
ssFlags,
|
|
searchKey,
|
|
kcIDList,
|
|
reserved);
|
|
|
|
return status;
|
|
|
|
/* ############################### CODE ENDS HERE ############################# */
|
|
} //* sscs_CacheEnumerateKeychainIDs
|
|
|
|
|
|
/*
|
|
* NAME - sscs_CacheAddKeychain
|
|
*
|
|
* DESCRIPTION
|
|
*
|
|
*
|
|
*/
|
|
int sscs_CacheAddKeychain
|
|
(
|
|
void *ssHandle,
|
|
unsigned long ssFlags,
|
|
SSCS_KEYCHAIN_ID_T *keyChainID,
|
|
void *reserved
|
|
)
|
|
{ /* beginning of the call */
|
|
/* ########################## DECLARATIONS START HERE ######################### */
|
|
|
|
NCSTATUS status = 0;
|
|
SCHANDLE hSC = (SCHANDLE)ssHandle;
|
|
|
|
/* ############################## CODE STARTS HERE ############################ */
|
|
|
|
status = pISecretStore->lpVtbl->CacheAddKeyChain(
|
|
pISecretStore,
|
|
0, // session
|
|
ssFlags, // flags
|
|
keyChainID, // keychainID
|
|
reserved);
|
|
|
|
return(status);
|
|
|
|
/* ############################### CODE ENDS HERE ############################# */
|
|
} //* sscs_CacheAddKeychain
|
|
|
|
|
|
|
|
/*
|
|
* NAME - sscs_CacheRemoveKeychain
|
|
*
|
|
* DESCRIPTION
|
|
*
|
|
*
|
|
*/
|
|
int sscs_CacheRemoveKeychain
|
|
(
|
|
void *ssHandle,
|
|
unsigned long ssFlags,
|
|
SSCS_KEYCHAIN_ID_T *keyChainID,
|
|
void *reserved
|
|
)
|
|
{
|
|
/* ########################## DECLARATIONS START HERE ######################### */
|
|
|
|
NCSTATUS status = 0;
|
|
SCHANDLE hSC = (SCHANDLE)ssHandle;
|
|
|
|
/* ############################## CODE STARTS HERE ############################ */
|
|
|
|
status = pISecretStore->lpVtbl->CacheRemoveKeyChain(
|
|
pISecretStore,
|
|
0, // session
|
|
ssFlags, // flags
|
|
keyChainID, // keychainID
|
|
reserved);
|
|
|
|
return(status);
|
|
|
|
/* ############################### CODE ENDS HERE ############################# */
|
|
} //* sscs_CacheRemoveKeychain
|
|
|
|
|
|
|
|
/*
|
|
* NAME - sscs_CacheEnumerateSecretIDs
|
|
*
|
|
* DESCRIPTION
|
|
*
|
|
*
|
|
*/
|
|
int sscs_CacheEnumerateSecretIDs
|
|
(
|
|
void *ssHandle,
|
|
unsigned long ssFlags,
|
|
SSCS_KEYCHAIN_ID_T *keyChainID,
|
|
SSCS_SRCH_KEY_T *searchKey,
|
|
SSCS_SECRET_ID_LIST_T *secretIDList,
|
|
void *reserved
|
|
)
|
|
{
|
|
/* ########################## DECLARATIONS START HERE ######################### */
|
|
|
|
NCSTATUS status = 0;
|
|
SCHANDLE hSC = (SCHANDLE)ssHandle;
|
|
|
|
/* ############################## CODE STARTS HERE ############################ */
|
|
|
|
status = pISecretStore->lpVtbl->CacheEnumerateSecretIDs(
|
|
pISecretStore,
|
|
0, // session
|
|
ssFlags, // flags
|
|
keyChainID, // keychainID
|
|
searchKey,
|
|
secretIDList,
|
|
reserved);
|
|
|
|
return(status);
|
|
|
|
/* ############################### CODE ENDS HERE ############################# */
|
|
} //* sscs_CacheEnumerateSecretIDs
|
|
|
|
|
|
|
|
/*
|
|
* NAME - sscs_CacheReadSecret
|
|
*
|
|
* DESCRIPTION
|
|
*
|
|
*
|
|
*/
|
|
int sscs_CacheReadSecret
|
|
(
|
|
void *ssHandle,
|
|
unsigned long ssFlags,
|
|
SSCS_KEYCHAIN_ID_T *keyChainID,
|
|
SSCS_SECRET_ID_T *secredID,
|
|
SSCS_SECRET_T *secretData,
|
|
SSCS_PASSWORD_T *epPassword,
|
|
unsigned int *bytesRequired,
|
|
void *reserved
|
|
)
|
|
{
|
|
/* ########################## DECLARATIONS START HERE ######################### */
|
|
|
|
NCSTATUS status = 0;
|
|
SCHANDLE hSC = (SCHANDLE)ssHandle;
|
|
|
|
/* ############################## CODE STARTS HERE ############################ */
|
|
|
|
status = pISecretStore->lpVtbl->CacheReadSecret(
|
|
pISecretStore,
|
|
0, // session
|
|
ssFlags, // flags
|
|
keyChainID, // keychainID
|
|
secredID,
|
|
secretData,
|
|
epPassword,
|
|
bytesRequired,
|
|
reserved);
|
|
|
|
return(status);
|
|
|
|
/* ############################### CODE ENDS HERE ############################# */
|
|
} //* sscs_CacheReadSecret
|
|
|
|
|
|
|
|
/*
|
|
* NAME - sscs_CacheWriteSecret
|
|
*
|
|
* DESCRIPTION
|
|
*
|
|
*
|
|
*/
|
|
int sscs_CacheWriteSecret
|
|
(
|
|
void *ssHandle,
|
|
unsigned long ssFlags,
|
|
SSCS_KEYCHAIN_ID_T *keyChainID,
|
|
SSCS_SECRET_ID_T *secredID,
|
|
SSCS_SECRET_T *secretData,
|
|
SSCS_PASSWORD_T *epPassword,
|
|
void *reserved
|
|
)
|
|
{
|
|
/* ########################## DECLARATIONS START HERE ######################### */
|
|
|
|
NCSTATUS status = 0;
|
|
SCHANDLE hSC = (SCHANDLE)ssHandle;
|
|
|
|
/* ############################## CODE STARTS HERE ############################ */
|
|
|
|
status = pISecretStore->lpVtbl->CacheWriteSecret(
|
|
pISecretStore,
|
|
0, // session
|
|
ssFlags, // flags
|
|
keyChainID, // keychainID
|
|
secredID,
|
|
secretData,
|
|
epPassword,
|
|
reserved);
|
|
|
|
return(status);
|
|
|
|
/* ############################### CODE ENDS HERE ############################# */
|
|
} //* sscs_CacheWriteSecret
|
|
|
|
|
|
|
|
/*
|
|
* NAME - sscs_CacheRemoveSecret
|
|
*
|
|
* DESCRIPTION
|
|
*
|
|
*
|
|
*/
|
|
int sscs_CacheRemoveSecret
|
|
(
|
|
void *ssHandle,
|
|
unsigned long ssFlags,
|
|
SSCS_KEYCHAIN_ID_T *keyChainID,
|
|
SSCS_SECRET_ID_T *secredID,
|
|
SSCS_PASSWORD_T *epPassword,
|
|
void *reserved
|
|
)
|
|
{
|
|
/* ########################## DECLARATIONS START HERE ######################### */
|
|
|
|
NCSTATUS status = 0;
|
|
SCHANDLE hSC = (SCHANDLE)ssHandle;
|
|
|
|
/* ############################## CODE STARTS HERE ############################ */
|
|
|
|
status = pISecretStore->lpVtbl->CacheRemoveSecret(
|
|
pISecretStore,
|
|
0, // session
|
|
ssFlags, // flags
|
|
keyChainID, // keychainID
|
|
secredID,
|
|
epPassword,
|
|
reserved);
|
|
|
|
return(status);
|
|
|
|
/* ############################### CODE ENDS HERE ############################# */
|
|
} //* sscs_CacheRemoveSecret
|
|
|
|
|
|
|
|
/*
|
|
* NAME - sscs_CacheGetSecretStoreInfo
|
|
*
|
|
* DESCRIPTION
|
|
*
|
|
*
|
|
*/
|
|
int sscs_CacheGetSecretStoreInfo
|
|
(
|
|
void *ssHandle,
|
|
unsigned long ssFlags,
|
|
SSCS_SECRETSTORE_INFO_T *ssInfo,
|
|
void *reserved
|
|
)
|
|
{
|
|
/* ########################## DECLARATIONS START HERE ######################### */
|
|
|
|
NCSTATUS status = 0;
|
|
SCHANDLE hSC = (SCHANDLE)ssHandle;
|
|
|
|
/* ############################## CODE STARTS HERE ############################ */
|
|
|
|
status = pISecretStore->lpVtbl->CacheGetSecretStoreInfo(
|
|
pISecretStore,
|
|
0, // session
|
|
ssFlags, // flags
|
|
ssInfo, //
|
|
reserved);
|
|
|
|
return(status);
|
|
|
|
/* ############################### CODE ENDS HERE ############################# */
|
|
} //* sscs_CacheGetSecretStoreInfo
|
|
|
|
|
|
|
|
/*
|
|
* NAME - sscs_GetKeychainInfo
|
|
*
|
|
* DESCRIPTION
|
|
*
|
|
*
|
|
*/
|
|
int sscs_GetKeychainInfo
|
|
(
|
|
void *ssHandle,
|
|
unsigned long ssFlags,
|
|
SSCS_KEYCHAIN_ID_T *keyChainID,
|
|
SSCS_KEYCHAIN_INFO_T *kcInfo,
|
|
void *reserved
|
|
)
|
|
{
|
|
/* ########################## DECLARATIONS START HERE ######################### */
|
|
|
|
NCSTATUS status = 0;
|
|
SCHANDLE hSC = (SCHANDLE)ssHandle;
|
|
|
|
/* ############################## CODE STARTS HERE ############################ */
|
|
|
|
status = pISecretStore->lpVtbl->CacheGetKeychainInfo(
|
|
pISecretStore,
|
|
0, // session
|
|
ssFlags, // flags
|
|
keyChainID, //
|
|
kcInfo,
|
|
reserved);
|
|
|
|
return(status);
|
|
|
|
/* ############################### CODE ENDS HERE ############################# */
|
|
} //* sscs_GetKeychainInfo
|
|
|
|
|
|
|
|
/*
|
|
* NAME - sscs_LockCache
|
|
*
|
|
* DESCRIPTION
|
|
*
|
|
*
|
|
*/
|
|
int sscs_LockCache
|
|
(
|
|
void *ssHandle,
|
|
unsigned long ssFlags,
|
|
void *reserved
|
|
)
|
|
{
|
|
/* ########################## DECLARATIONS START HERE ######################### */
|
|
|
|
NCSTATUS status = 0;
|
|
SCHANDLE hSC = (SCHANDLE)ssHandle;
|
|
|
|
/* ############################## CODE STARTS HERE ############################ */
|
|
|
|
status = pISecretStore->lpVtbl->LockCache(
|
|
pISecretStore,
|
|
0, // session
|
|
ssFlags, // flags
|
|
reserved);
|
|
|
|
return(status);
|
|
|
|
/* ############################### CODE ENDS HERE ############################# */
|
|
} //* sscs_LockCache
|
|
|
|
|
|
/*
|
|
* NAME - sscs_UnlockCache
|
|
*
|
|
* DESCRIPTION
|
|
*
|
|
*
|
|
*/
|
|
int sscs_UnlockCache
|
|
(
|
|
void *ssHandle,
|
|
unsigned long ssFlags,
|
|
SSCS_PASSCODE_T *passcode,
|
|
void *reserved
|
|
)
|
|
{
|
|
/* ########################## DECLARATIONS START HERE ######################### */
|
|
|
|
NCSTATUS status = 0;
|
|
SCHANDLE hSC = (SCHANDLE)ssHandle;
|
|
|
|
/* ############################## CODE STARTS HERE ############################ */
|
|
|
|
status = pISecretStore->lpVtbl->UnLockCache(
|
|
pISecretStore,
|
|
0, // session
|
|
ssFlags, // flags
|
|
passcode,
|
|
reserved);
|
|
|
|
return(status);
|
|
|
|
/* ############################### CODE ENDS HERE ############################# */
|
|
} //* sscs_UnlockCache
|
|
|
|
|