ervu-sign-module/src/utils/capi.h

250 lines
7.3 KiB
C

#ifndef CAPI_H_INCLUDED
#define CAPI_H_INCLUDED
#define SIZEOF_VOID_P (UINTPTR_MAX+0 > 0xffffffffUL ? 8 : 4)
typedef struct library_s library_t;
#include <stdarg.h>
#include <cades.h>
#include <stdbool.h>
#define DECLARE_FN(api, type, name, args) typedef WINAPI type (*name ## _FN) args
DECLARE_FN(WINBASEAPI, DWORD, GET_LAST_ERROR, (void));
DECLARE_FN(WINADVAPI, BOOL, CRYPT_RELEASE_CONTEXT, (HCRYPTPROV hProv, DWORD dwFlags));
DECLARE_FN(WINCRYPT32API,
BOOL,
CRYPT_SIGN_MESSAGE,
(IN PCRYPT_SIGN_MESSAGE_PARA pSignPara,
IN BOOL fDetachedSignature,
IN DWORD cToBeSigned,
IN const BYTE *rgpbToBeSigned[],
IN DWORD rgcbToBeSigned[],
OUT BYTE *pbSignedBlob,
IN OUT DWORD *pcbSignedBlob));
DECLARE_FN(WINCRYPT32API,
BOOL,
CERT_FREE_CERTIFICATE_CONTEXT,
(IN PCCERT_CONTEXT pCertContext));
DECLARE_FN(WINCRYPT32API,
BOOL,
CERT_GET_CERTIFICATE_CONTEXT_PROPERTY,
(IN PCCERT_CONTEXT pCertContext,
IN DWORD dwPropId,
OUT void *pvData,
IN OUT DWORD *pcbData));
DECLARE_FN(WINCRYPT32API,
BOOL,
CERT_SET_CERTIFICATE_CONTEXT_PROPERTY,
(IN PCCERT_CONTEXT pCertContext,
IN DWORD dwPropId,
IN DWORD dwFlags,
IN const void *pvData));
DECLARE_FN(WINCRYPT32API,
PCCERT_CONTEXT,
CERT_FIND_CERTIFICATE_IN_STORE,
(IN HCERTSTORE hCertStore,
IN DWORD dwCertEncodingType,
IN DWORD dwFindFlags,
IN DWORD dwFindType,
IN const void *pvFindPara,
IN PCCERT_CONTEXT pPrevCertContext));
DECLARE_FN(WINCRYPT32API,
HCERTSTORE,
CERT_OPEN_STORE,
(IN LPCSTR lpszStoreProvider,
IN DWORD dwEncodingType,
IN HCRYPTPROV hCryptProv,
IN DWORD dwFlags,
IN const void *pvPara));
DECLARE_FN(WINCRYPT32API,
BOOL,
CERT_CLOSE_STORE,
(IN HCERTSTORE hCertStore,
DWORD dwFlags));
DECLARE_FN(WINCRYPT32API,
BOOL,
CRYPT_ACQUIRE_CERTIFICATE_PRIVATE_KEY,
(IN PCCERT_CONTEXT pCert,
IN DWORD dwFlags,
IN void *pvReserved,
OUT HCRYPTPROV *phCryptProv,
OUT OPTIONAL DWORD *pdwKeySpec,
OUT OPTIONAL BOOL *pfCallerFreeProv));
DECLARE_FN(WINADVAPI,
BOOL,
CRYPT_CREATE_HASH,
(HCRYPTPROV hProv,
ALG_ID Algid,
HCRYPTKEY hKey,
DWORD dwFlags,
HCRYPTHASH *phHash));
DECLARE_FN(WINADVAPI,
BOOL,
CRYPT_HASH_DATA,
(HCRYPTHASH hHash,
CONST BYTE *pbData,
DWORD dwDataLen,
DWORD dwFlags));
DECLARE_FN (WINADVAPI,
BOOL,
CRYPT_DESTROY_HASH,
(HCRYPTHASH hHash));
DECLARE_FN(WINADVAPI,
BOOL,
CRYPT_SIGN_HASH_A,
(HCRYPTHASH hHash,
DWORD dwKeySpec,
LPCSTR szDescription,
DWORD dwFlags,
BYTE *pbSignature,
DWORD *pdwSigLen));
DECLARE_FN(WINADVAPI,
BOOL,
CRYPT_SIGN_HASH_W,
(HCRYPTHASH hHash,
DWORD dwKeySpec,
LPCWSTR szDescription,
DWORD dwFlags,
BYTE *pbSignature,
DWORD *pdwSigLen));
DECLARE_FN(WINADVAPI,
BOOL,
CRYPT_VERIFY_SIGNATURE_A,
(HCRYPTHASH hHash,
CONST BYTE *pbSignature,
DWORD dwSigLen,
HCRYPTKEY hPubKey,
LPCSTR szDescription,
DWORD dwFlags));
DECLARE_FN(WINADVAPI,
BOOL,
CRYPT_VERIFY_SIGNATURE_W,
(HCRYPTHASH hHash,
CONST BYTE *pbSignature,
DWORD dwSigLen,
HCRYPTKEY hPubKey,
LPCWSTR szDescription,
DWORD dwFlags));
DECLARE_FN(WINADVAPI,
BOOL,
CRYPT_ACQUIRE_CONTEXT_A,
(HCRYPTPROV *phProv,
LPCSTR pszContainer,
LPCSTR pszProvider,
DWORD dwProvType,
DWORD dwFlags));
DECLARE_FN(WINADVAPI,
BOOL,
CRYPT_ACQUIRE_CONTEXT_W,
(HCRYPTPROV *phProv,
LPCSTR pszContainer,
LPCSTR pszProvider,
DWORD dwProvType,
DWORD dwFlags));
DECLARE_FN(WINADVAPI,
BOOL,
CRYPT_IMPORT_PUBLIC_KEY_INFO,
(HCRYPTPROV hCryptProv,
DWORD dwCertEncodingType,
PCERT_PUBLIC_KEY_INFO pInfo,
HCRYPTKEY *phKey));
DECLARE_FN(WINADVAPI,
BOOL,
CRYPT_DESTROY_KEY,
(HCRYPTKEY hKey));
DECLARE_FN(WINADVAPI,
BOOL,
CERT_GET_CERTIFICATE_CHAIN,
(HCERTCHAINENGINE hChainEngine,
PCCERT_CONTEXT pCertContext,
LPFILETIME pTime,
HCERTSTORE hAdditionalStore,
PCERT_CHAIN_PARA pChainPara,
DWORD dwFlags,
LPVOID pvReserved,
PCCERT_CHAIN_CONTEXT* ppChainContext));
DECLARE_FN(WINADVAPI,
BOOL,
CERT_VERIFY_CERTIFICATE_CHAIN_POLICY,
(LPCSTR pszPolicyOID,
PCCERT_CHAIN_CONTEXT pChainContext,
PCERT_CHAIN_POLICY_PARA pPolicyPara,
PCERT_CHAIN_POLICY_STATUS pPolicyStatus));
DECLARE_FN(WINADVAPI,
VOID,
CERT_FREE_CERTIFICATE_CHAIN,
(PCCERT_CHAIN_CONTEXT pChainContext));
DECLARE_FN(WINADVAPI,
BOOL,
CRYPT_GEN_RANDOM,
(HCRYPTPROV hProv,
DWORD dwLen,
BYTE *pbBuffer));
#ifdef UNICODE
#define CRYPT_SIGN_HASH_FN CRYPT_SIGN_HASH_W_FN
#define CRYPT_VERIFY_SIGNATURE_FN CRYPT_VERIFY_SIGNATURE_W_FN
#define CRYPT_ACQUIRE_CONTEXT_FN CRYPT_ACQUIRE_CONTEXT_W_FN
#else
#define CRYPT_SIGN_HASH_FN CRYPT_SIGN_HASH_A_FN
#define CRYPT_VERIFY_SIGNATURE_FN CRYPT_VERIFY_SIGNATURE_A_FN
#define CRYPT_ACQUIRE_CONTEXT_FN CRYPT_ACQUIRE_CONTEXT_A_FN
#endif // !UNICODE
typedef struct {
CRYPT_SIGN_MESSAGE_FN CryptSignMessage;
CERT_FREE_CERTIFICATE_CONTEXT_FN CertFreeCertificateContext;
CERT_OPEN_STORE_FN CertOpenStore;
CERT_CLOSE_STORE_FN CertCloseStore;
GET_LAST_ERROR_FN GetLastError;
CRYPT_ACQUIRE_CERTIFICATE_PRIVATE_KEY_FN CryptAcquireCertificatePrivateKey;
CRYPT_CREATE_HASH_FN CryptCreateHash;
CRYPT_HASH_DATA_FN CryptHashData;
CRYPT_SIGN_HASH_FN CryptSignHash;
CRYPT_DESTROY_HASH_FN CryptDestroyHash;
CRYPT_RELEASE_CONTEXT_FN CryptReleaseContext;
CERT_FIND_CERTIFICATE_IN_STORE_FN CertFindCertificateInStore;
CERT_GET_CERTIFICATE_CONTEXT_PROPERTY_FN CertGetCertificateContextProperty;
CERT_SET_CERTIFICATE_CONTEXT_PROPERTY_FN CertSetCertificateContextProperty;
CRYPT_VERIFY_SIGNATURE_FN CryptVerifySignature;
CRYPT_ACQUIRE_CONTEXT_FN CryptAcquireContext;
CRYPT_IMPORT_PUBLIC_KEY_INFO_FN CryptImportPublicKeyInfo;
CRYPT_DESTROY_KEY_FN CryptDestroyKey;
CERT_GET_CERTIFICATE_CHAIN_FN CertGetCertificateChain;
CERT_VERIFY_CERTIFICATE_CHAIN_POLICY_FN CertVerifyCertificateChainPolicy;
CERT_FREE_CERTIFICATE_CHAIN_FN CertFreeCertificateChain;
CRYPT_GEN_RANDOM_FN CryptGenRandom;
} capi_function_list_t;
bool capi_function_list_init(library_t *lib, capi_function_list_t *fl);
#endif // CAPI_H_INCLUDED