#ifndef __BASECSP_CAPI__H__ #define __BASECSP_CAPI__H__ #include #include "cardmod.h" #include "datacach.h" #include "csplib.h" #include "sccache.h" #include "resource.h" #ifdef __cplusplus extern "C" { #endif // // Maximum length card ATR that we'll handle in the Base CSP // #define cbATR_BUFFER 32 // // Maximum length pin that we'll handle // #define cchMAX_PIN_LENGTH 8 // // Registry Information // #define wszREG_DEFAULT_KEY_LEN L"DefaultPrivateKeyLenBits" #define wszREG_REQUIRE_CARD_KEY_GEN L"RequireOnCardPrivateKeyGen" typedef struct _REG_CONFIG_VALUES { LPWSTR wszValueName; DWORD dwDefValue; } REG_CONFIG_VALUES, *PREG_CONFIG_VALUES; static REG_CONFIG_VALUES RegConfigValues [] = { { wszREG_DEFAULT_KEY_LEN, 1024 }, { wszREG_REQUIRE_CARD_KEY_GEN, 0 } }; typedef struct _CSP_REG_SETTINGS { DWORD cDefaultPrivateKeyLenBits; BOOL fRequireOnCardPrivateKeyGen; } CSP_REG_SETTINGS, *PCSP_REG_SETTINGS; DWORD WINAPI RegConfigAddEntries( IN HKEY hKey); DWORD WINAPI RegConfigGetSettings( IN OUT PCSP_REG_SETTINGS pRegSettings); // // General Wrappers // DWORD CountCharsInMultiSz( IN LPWSTR mwszStrings); // Display Strings typedef struct _CSP_STRING { LPWSTR wszString; DWORD dwResource; } CSP_STRING, *PCSP_STRING; enum CSP_STRINGS_INDEX { StringNewPinMismatch, StringPinMessageBoxTitle, StringWrongPin, StringPinRetries }; typedef struct _CSP_STATE { CRITICAL_SECTION cs; DWORD dwRefCount; CACHEHANDLE hCache; HMODULE hCspModule; } CSP_STATE, *PCSP_STATE; // // Type: CONTAINER_MAP_RECORD // // This structure describes the format of the Base CSP's container map file, // stored on the card. This is well-known logical file wszCONTAINER_MAP_FILE. // The file consists of zero or more of these records. // #define MAX_CONTAINER_NAME_LEN 40 // This flag is set in the CONTAINER_MAP_RECORD bFlags member if the // corresponding container is valid and currently exists on the card. // If the container is deleted, its bFlags field must be cleared. #define CONTAINER_MAP_VALID_CONTAINER 1 // This flag is set in the CONTAINER_MAP_RECORD bFlags // member if the corresponding container is the default container on the card. #define CONTAINER_MAP_DEFAULT_CONTAINER 2 typedef struct _CONTAINER_MAP_RECORD { WCHAR wszGuid [MAX_CONTAINER_NAME_LEN]; BYTE bFlags; WORD wSigKeySizeBits; WORD wKeyExchangeKeySizeBits; } CONTAINER_MAP_RECORD, *PCONTAINER_MAP_RECORD; // // Type: CARD_CACHE_FILE_FORMAT // // This struct is used as the file format of the cache file, // as stored on the card. // #define CARD_CACHE_FILE_CURRENT_VERSION 1 typedef struct _CARD_CACHE_FILE_FORMAT { BYTE bVersion; BYTE bPinsFreshness; WORD wContainersFreshness; WORD wFilesFreshness; } CARD_CACHE_FILE_FORMAT, *PCARD_CACHE_FILE_FORMAT; // // Type: CARD_STATE // #define CARD_STATE_CURRENT_VERSION 1 typedef struct _CARD_STATE { DWORD dwVersion; PCARD_DATA pCardData; HMODULE hCardModule; PFN_CARD_ACQUIRE_CONTEXT pfnCardAcquireContext; WCHAR wszSerialNumber[MAX_PATH]; PINCACHE_HANDLE hPinCache; // This flag is set every time the pin is successfully presented // to the card. If the flag is set when EndTransaction is called on the // card, the card will be deauthenticated (or Reset) and the flag cleared. // Otherwise, EndTransaction will simply leave the card. BOOL fAuthenticated; // A copy of the card cache file is kept in the CARD_STATE. The cache // file need only be read from the card once per transaction, although // it must also be updated on card writes. CARD_CACHE_FILE_FORMAT CacheFile; BOOL fCacheFileValid; CRITICAL_SECTION cs; BOOL fInitializedCS; CACHEHANDLE hCache; CACHEHANDLE hCacheCardModuleData; PFN_SCARD_CACHE_LOOKUP_ITEM pfnCacheLookup; PFN_SCARD_CACHE_ADD_ITEM pfnCacheAdd; HMODULE hWinscard; } CARD_STATE, *PCARD_STATE; // // Type: CARD_MATCH_DATA // #define CARD_MATCH_TYPE_READER_AND_CONTAINER 1 #define CARD_MATCH_TYPE_SERIAL_NUMBER 2 typedef struct _CARD_MATCH_DATA { // // Input parameters. // PCSP_STATE pCspState; DWORD dwCtxFlags; DWORD dwMatchType; DWORD dwUIFlags; DWORD cchMatchedReader; DWORD cchMatchedCard; DWORD cchMatchedSerialNumber; DWORD dwShareMode; DWORD dwPreferredProtocols; // Used in Reader and Container match requests LPWSTR pwszReaderName; LPWSTR pwszContainerName; BOOL fFreeContainerName; // Used in Serial Number match requests LPWSTR pwszSerialNumber; // // Internal parameters // PCARD_STATE pCardState; // Will be set when the current thread holds the transaction on the matched // card. This allows us to reduce the number of transactions required to // find a matching card (and complete the CryptAcquireContext call), // which reduces the number of times we have to read the cache file. // // The transaction will always be released before the select card check // callback returns. BOOL fTransacted; // // Output parameters // // Result of successful Card Search is // a valid, matching CARD_STATE structure. SCARDCONTEXT hSCardCtx; SCARDHANDLE hSCard; BYTE bContainerIndex; PCARD_STATE pUIMatchedCardState; WCHAR wszMatchedReader[MAX_PATH]; WCHAR wszMatchedCard[MAX_PATH]; DWORD dwActiveProtocol; // Result of an unsuccessful Card Search is that this // should be set to an appropriate error code. DWORD dwError; } CARD_MATCH_DATA, *PCARD_MATCH_DATA; DWORD FindCard( IN OUT PCARD_MATCH_DATA pCardMatchData); // // Defines for Card Specific Modules // // This value should be passed to // // SCardSetCardTypeProviderName // SCardGetCardTypeProviderName // // in order to query and set the Card Specific Module to be used // for a given card. #define SCARD_PROVIDER_CARD_MODULE 0x80000001 // // Defines for Card Interface Layer operations // // // Function: InitializeCardState // DWORD InitializeCardState(PCARD_STATE pCardState); // // Function: DeleteCardState // void DeleteCardState(PCARD_STATE pCardState); // // Function: InitializeCardData // DWORD InitializeCardData(PCARD_DATA pCardData); // // Function: IntializeCspCaching // DWORD InitializeCspCaching(IN OUT PCARD_STATE pCardState); // // Function: CleanupCardData // void CleanupCardData(PCARD_DATA pCardData); // // Function: ValidateReconnectCardHandle // DWORD ValidateCardHandle( IN PCARD_STATE pCardState, IN BOOL fMayReleaseContextHandle, OUT OPTIONAL BOOL *pfFlushPinCache); // // Function: CspBeginTransaction // DWORD CspBeginTransaction( IN PCARD_STATE pCardState); // // Function: CspEndTransaction // DWORD CspEndTransaction( IN PCARD_STATE pCardState); // // Function: CspQueryCapabilities // DWORD WINAPI CspQueryCapabilities( IN PCARD_STATE pCardState, IN OUT PCARD_CAPABILITIES pCardCapabilities); // // Function: CspDeleteContainer // DWORD WINAPI CspDeleteContainer( IN PCARD_STATE pCardState, IN BYTE bContainerIndex, IN DWORD dwReserved); // // Function: CspCreateContainer // DWORD WINAPI CspCreateContainer( IN PCARD_STATE pCardState, IN BYTE bContainerIndex, IN DWORD dwFlags, IN DWORD dwKeySpec, IN DWORD dwKeySize, IN PBYTE pbKeyData); // // Function: CspGetContainerInfo // DWORD WINAPI CspGetContainerInfo( IN PCARD_STATE pCardState, IN BYTE bContainerIndex, IN DWORD dwFlags, IN OUT PCONTAINER_INFO pContainerInfo); // // Function: CspRemoveCachedPin // void WINAPI CspRemoveCachedPin( IN PCARD_STATE pCardState, IN LPWSTR pwszUserId); // // Function: CspChangeAuthenticator // DWORD WINAPI CspChangeAuthenticator( IN PCARD_STATE pCardState, IN LPWSTR pwszUserId, IN PBYTE pbCurrentAuthenticator, IN DWORD cbCurrentAuthenticator, IN PBYTE pbNewAuthenticator, IN DWORD cbNewAuthenticator, IN DWORD cRetryCount, OUT OPTIONAL PDWORD pcAttemptsRemaining); // // Function: CspSubmitPin // DWORD WINAPI CspSubmitPin( IN PCARD_STATE pCardState, IN LPWSTR pwszUserId, IN PBYTE pbPin, IN DWORD cbPin, OUT OPTIONAL PDWORD pcAttemptsRemaining); // // Function: CspCreateFile // DWORD WINAPI CspCreateFile( IN PCARD_STATE pCardState, IN LPWSTR pwszFileName, IN CARD_FILE_ACCESS_CONDITION AccessCondition); // // Function: CspReadFile // DWORD WINAPI CspReadFile( IN PCARD_STATE pCardState, IN LPWSTR pwszFileName, IN DWORD dwFlags, OUT PBYTE *ppbData, OUT PDWORD pcbData); // // Function: CspWriteFile // DWORD WINAPI CspWriteFile( IN PCARD_STATE pCardState, IN LPWSTR pwszFileName, IN DWORD dwFlags, IN PBYTE pbData, IN DWORD cbData); // // Function: CspDeleteFile // DWORD WINAPI CspDeleteFile( IN PCARD_STATE pCardState, IN DWORD dwReserved, IN LPWSTR pwszFileName); // // Function: CspEnumFiles // DWORD WINAPI CspEnumFiles( IN PCARD_STATE pCardState, IN DWORD dwFlags, IN OUT LPWSTR *pmwszFileName); // // Function: CspQueryFreeSpace // DWORD WINAPI CspQueryFreeSpace( IN PCARD_STATE pCardState, IN DWORD dwFlags, OUT PCARD_FREE_SPACE_INFO pCardFreeSpaceInfo); // // Function: CspPrivateKeyDecrypt // DWORD WINAPI CspPrivateKeyDecrypt( IN PCARD_STATE pCardState, IN PCARD_PRIVATE_KEY_DECRYPT_INFO pInfo); // // Function: CspQueryKeySizes // DWORD WINAPI CspQueryKeySizes( IN PCARD_STATE pCardState, IN DWORD dwKeySpec, IN DWORD dwReserved, OUT PCARD_KEY_SIZES pKeySizes); // // Container Map Functions // DWORD ContainerMapEnumContainers( IN PCARD_STATE pCardState, OUT PBYTE pcContainers, OUT OPTIONAL LPWSTR *mwszContainers); DWORD ContainerMapFindContainer( IN PCARD_STATE pCardState, IN OUT PCONTAINER_MAP_RECORD pContainer, OUT OPTIONAL PBYTE pbContainerIndex); DWORD ContainerMapGetDefaultContainer( IN PCARD_STATE pCardState, OUT PCONTAINER_MAP_RECORD pContainer, OUT OPTIONAL PBYTE pbContainerIndex); DWORD ContainerMapSetDefaultContainer( IN PCARD_STATE pCardState, IN LPWSTR pwszContainerGuid); DWORD ContainerMapAddContainer( IN PCARD_STATE pCardState, IN LPWSTR pwszContainerGuid, IN DWORD cKeySizeBits, IN DWORD dwKeySpec, IN BOOL fGetNameOnly, OUT PBYTE pbContainerIndex); DWORD ContainerMapDeleteContainer( IN PCARD_STATE pCardState, IN LPWSTR pwszContainerGuid, OUT PBYTE pbContainerIndex); // // UI Functions // typedef struct _CSP_PROMPT_FOR_PIN_INFO { IN LPWSTR wszUser; OUT LPWSTR wszPin; } CSP_PROMPT_FOR_PIN_INFO, *PCSP_PROMPT_FOR_PIN_INFO; DWORD WINAPI CspPromptForPin( IN OUT PCSP_PROMPT_FOR_PIN_INFO pInfo); #ifdef __cplusplus } #endif #endif