Статус: Участник
Группы: Участники
Зарегистрирован: 10.12.2012(UTC) Сообщений: 17
Поблагодарили: 3 раз в 2 постах
|
Добрый день! Делаю функционал проверки PKCS#7 подписи через КриптоПро CSP 3.6 с использованием компилятора FreePascal через CryptoAPI. На Windows все работает без проблем, на Linux аналогично пытаюсь использовать CapiLite, но еще на этапе загрузки библиотеки libcapi20.so получаю ошибку: Segmentation fault Код:
uses
Classes, SysUtils,
{$IFDEF FPC}, dynlibs{$ELSE}, Windows{$ENDIF}
const
{$IFDEF MSWINDOWS}
CRYPT32 = 'crypt32.dll';
ADVAPI32 = 'advapi32.dll';
{$ELSE}
CAPILITE2 = '/opt/cprocsp/lib/ia32/libcapi20.so.3.6.1';
{$ENDIF}
procedure TCryptoVerifyController.LoadLib;
function LoadProc(
const ALibHandle: {$IFDEF FPC}TLibHandle{$ELSE}THandle{$ENDIF};
const ALibName: string;
const AProcName: string): Pointer;
begin
{$IFDEF FPC}
Result := GetProcedureAddress(ALibHandle, AProcName);
{$ELSE}
Result := GetProcAddress(ALibHandle, PChar(AProcName));
{$ENDIF}
if Result = nil then
raise Exception.CreateFmt(
'Function %s not found in library %s', [AProcName, ALibName]);
end;
begin
{$IFDEF MSWINDOWS}
LibAdvHandle := LoadLibrary(ADVAPI32);
if {$IFDEF FPC}LibAdvHandle = 0{$ELSE}LibAdvHandle < 32{$ENDIF} then
raise Exception.CreateFmt('Library %s not found', [ADVAPI32]);
LibCryptHandle := LoadLibrary(CRYPT32);
if {$IFDEF FPC}LibCryptHandle = 0{$ELSE}LibCryptHandle < 32{$ENDIF} then
raise Exception.CreateFmt('Library %s not found', [CRYPT32]);
FCryptAcquireContext := LoadProc(LibAdvHandle, ADVAPI32, 'CryptAcquireContextW');
FCryptReleaseContext := LoadProc(LibAdvHandle, ADVAPI32, 'CryptReleaseContext');
FCryptVerifyDetachedMessageSignature := LoadProc(LibCryptHandle, CRYPT32, 'CryptVerifyDetachedMessageSignature');
FCertFreeCertificateContext := LoadProc(LibCryptHandle, CRYPT32, 'CertFreeCertificateContext');
FCertGetCertificateChain := LoadProc(LibCryptHandle, CRYPT32, 'CertGetCertificateChain');
FCertFreeCertificateChain := LoadProc(LibCryptHandle, CRYPT32, 'CertFreeCertificateChain');
FCryptGetMessageCertificates := LoadProc(LibCryptHandle, CRYPT32, 'CryptGetMessageCertificates');
FCertEnumCertificatesInStore := LoadProc(LibCryptHandle, CRYPT32, 'CertEnumCertificatesInStore');
FCertCloseStore := LoadProc(LibCryptHandle, CRYPT32, 'CertCloseStore');
{$ELSE}
LibCapiHandle := LoadLibrary(CAPILITE2);
if {$IFDEF FPC}LibCapiHandle = 0{$ELSE}LibCapiHandle < 32{$ENDIF} then
raise Exception.CreateFmt('Library %s not found', [CAPILITE2]);
FCryptAcquireContext := LoadProc(LibCapiHandle, CAPILITE2, 'CryptAcquireContextW');
FCryptReleaseContext := LoadProc(LibCapiHandle, CAPILITE2, 'CryptReleaseContext');
FCryptVerifyDetachedMessageSignature := LoadProc(LibCapiHandle, CAPILITE2, 'CryptVerifyDetachedMessageSignature');
FCertFreeCertificateContext := LoadProc(LibCapiHandle, CAPILITE2, 'CertFreeCertificateContext');
FCertGetCertificateChain := LoadProc(LibCapiHandle, CAPILITE2, 'CertGetCertificateChain');
FCertFreeCertificateChain := LoadProc(LibCapiHandle, CAPILITE2, 'CertFreeCertificateChain');
FCryptGetMessageCertificates := LoadProc(LibCapiHandle, CAPILITE2, 'CryptGetMessageCertificates');
FCertEnumCertificatesInStore := LoadProc(LibCapiHandle, CAPILITE2, 'CertEnumCertificatesInStore');
FCertCloseStore := LoadProc(LibCapiHandle, CAPILITE2, 'CertCloseStore');
{$ENDIF}
end;
Команда ltrace выдает: Код:
dlsym(0xb770e3d8, "sem_trywait") = 0x9bd790
dlsym(0xb770e3d8, "sem_post") = 0x9bd8d0
dlsym(0xb770e3d8, "sem_getvalue") = 0x9bd660
dlsym(0xb770e3d8, "pthread_mutexattr_settype") = 0x9ba630
dlopen("/opt/cprocsp/lib/ia32/libcapi20."..., 1 <unfinished ...>
--- SIGSEGV (Segmentation fault) ---
Access violation
Подскажите, в чем может быть проблема?
|