BOOL (FARPROC *ProvVerifyImage)(LPCSTR lpszImage, BYTE *pSigData); BYTE bSignature[72]; // "ProvVerifyImage" has been set to "pVTable->FuncVerifyImage" // within the CPAcquireContext function. // Load the C:\Winnt40\System32\signature.sig file into the // bSignature buffer. During development, this file is created // with the Sign.exe utility. ... // Verify the signature on the C:\Winnt40\System32\Signature.dll file. if(RCRYPT_FAILED(ProvVerifyImage("c:\\winnt40\\system32\\signature.dll", bSignature)) { SetLastError(NTE_BAD_SIGNATURE); return CRYPT_FAILED; } // Load the DLL with the LoadLib function, then acquire pointers to // the member functions with the GetProcAddress function. ...
typedef struct _VTABLEPROVSTRUC {
DWORD Version;
CRYPT_VERIFY_IMAGE_A FuncVerifyImage;
CRYPT_RETURN_HWND FuncReturnhWnd;
DWORD dwProvType;
BYTE * pbContextInfo;
DWORD cbContextInfo;
LPSTR pszProvName; } VTABLEPROVSTRUC, *PVTABLEPROVSTRUC;
Указатель на структуру VTABLEPROVSTRUC доступен только во врема вызова функции CPAcquireContext. Если члены структуры необходимы для дальнейшей работы, необходимо произвести копирование значений. Скопированные указатели на функции, содержащиеся в струкруре и сами функции, могут быть использованы до тех пор пока не закрылась сессия с криптопровайдером. Все дополнительные модули (DLL), которые использует криптопровайдер могут быть подписаны, как и основной модуль. Перд загрузкой дополнительны модулей с использованием функции LoadLib, можно проверить подпись дополнительных модулей. Криптопровайдер может производить такую проверку, используя указатель на функцию FuncVerifyImage, как показано в следующем примере: