Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline arkinform  
#1 Оставлено : 10 декабря 2012 г. 22:00:22(UTC)
arkinform

Статус: Участник

Группы: Участники
Зарегистрирован: 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


Подскажите, в чем может быть проблема?
Offline Татьяна  
#2 Оставлено : 10 декабря 2012 г. 22:20:23(UTC)
Татьяна

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.02.2008(UTC)
Сообщений: 1,491
Откуда: Крипто-Про

Поблагодарили: 40 раз в 37 постах
Здравствуйте.
dlopen -- системная функция, она в любом случае не должна вызывать SegFault, даже если библиотека "плохая". В трассе немного странно выглядит первый параметр фукнции dlopen: "/opt/cprocsp/lib/ia32/libcapi20.". Это просто обрезано ".so" при выводе трассы или действительно имя не полное?

Чтобы проверить, все ли зависимости нашей библиотеки удовлетворены, выполните пожалуйста

ldd -r /opt/cprocsp/lib/ia32/libcapi20.so
Татьяна
ООО Крипто-Про
Offline arkinform  
#3 Оставлено : 11 декабря 2012 г. 15:43:10(UTC)
arkinform

Статус: Участник

Группы: Участники
Зарегистрирован: 10.12.2012(UTC)
Сообщений: 17

Поблагодарили: 3 раз в 2 постах
В логе ltrace просто обрезан длинный путь, по факту передается правильный полный путь /opt/cprocsp/lib/ia32/libcapi20.so
При этом пробовал загружать библиотеку libcapi10.so - загружается нормально, проблема именно при загрузке libcapi20.so
ldd тоже проверял, вроде все правильно, вот лог.

Код:

ldd -r /opt/cprocsp/lib/ia32/libcapi20.so

linux-gate.so.1 =>  (0x00640000)
libcpext.so.3 => /opt/cprocsp/lib/ia32/libcpext.so.3 (0x003a7000)
libcapi10.so.3 => /opt/cprocsp/lib/ia32/libcapi10.so.3 (0x001c3000)
libasn1data.so.3 => /opt/cprocsp/lib/ia32/libasn1data.so.3 (0x00b34000)
librdrsup.so.3 => /opt/cprocsp/lib/ia32/librdrsup.so.3 (0x00110000)
libdl.so.2 => /lib/libdl.so.2 (0x00847000)
libpthread.so.0 => /lib/libpthread.so.0 (0x0012f000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x001d5000)
libm.so.6 => /lib/libm.so.6 (0x00798000)
libc.so.6 => /lib/libc.so.6 (0x00409000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x0014a000)
/lib/ld-linux.so.2 (0x007f2000)


Операционная система: Linux Centos 6.3 x32

Отредактировано пользователем 11 декабря 2012 г. 15:44:23(UTC)  | Причина: Не указана

Offline Татьяна  
#4 Оставлено : 11 декабря 2012 г. 18:59:21(UTC)
Татьяна

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.02.2008(UTC)
Сообщений: 1,491
Откуда: Крипто-Про

Поблагодарили: 40 раз в 37 постах
А из программы на C библиотека libcapi20.so открывается?
В системном журнале что-нибудь есть?
Татьяна
ООО Крипто-Про
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.