Статус: Активный участник
Группы: Участники
Зарегистрирован: 14.03.2011(UTC) Сообщений: 152 Откуда: Санкт-Петербург Сказал «Спасибо»: 1 раз Поблагодарили: 7 раз в 5 постах
|
Окружение: Ubuntu 15.04 x64, CryptoPro CSP 4.0, Java 1.6/1.7/1.8 При не настроенном провайдере происходит падение на уровне XOrg X11 Window. Код:
wchar_t* wcsProvider = L"Phoenix-CS PKCS11 GOST R 34.10-2001 Cryptographic Service Provider";
wchar_t* wcsContainer = NULL;
if(!CryptAcquireContextW(&hProv, wcsContainer, wcsProvider, type, flags)) {
DWORD lastError = GetLastError();
LPTSTR lpMsgBuf = NULL;
DWORD dwFormatFlags =
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_IGNORE_INSERTS;
DWORD langID = 0;
// пробуем получить текст из системы (kernel32.dll)
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL, errorCode, langID, (LPTSTR)&lpMsgBuf, 0, NULL);
fprintf(stderr, "lastError:%X, message: %s\n", lastError, lpMsgBuf);
LocalFree(lpMsgBuf);
}
Выдается ошибка: errorCode: 8009001D message: Provider DLL failed to initialize correctly. Самое интересное начинается дальше. В Java машине, при закрытии диалогового окна происходит падение AWT окна Цитата: авг 06, 2015 4:05:15 PM com.myapp.auth.LoginPromptDlg close SEVERE: close ret:1 авг 06, 2015 4:05:15 PM com.myapp.ui.OKCancelDlg close SEVERE: hide dialog авг 06, 2015 4:05:15 PM com.myapp.ui.OKCancelDlg close SEVERE: dispose dialog авг 06, 2015 4:05:15 PM com.myapp.ui.OKCancelDlg close SEVERE: return close The program 'java' received an X Window System error. This probably reflects a bug in the program. The error was 'BadWindow (invalid Window parameter)'. (Details: serial 8966 error_code 3 request_code 20 minor_code 0) (Note to programmers: normally, X errors are reported asynchronously; that is, you will receive the error a while after causing it. To debug your program, run it with the --sync command line option to change this behavior. You can then get a meaningful backtrace from your debugger if you break on the gdk_x_error() function.)
Java код: Код:
// LoginPromptDlg
@Override
protected void close(int retStatus) {
log.severe("close ret:" + retStatus);
super.close(retStatus);
}
// OKCancelDlg
protected void close(int retStatus) {
returnStatus = retStatus;
if(isVisible()) {
log.severe("hide dialog");
setVisible(false);
log.severe("dispose dialog");
dispose();
log.severe("return close");
}
}
Добавляем проверку на имя провайдера Код:
if(!wcscmp(L"Phoenix-CS PKCS11 GOST R 34.10-2001 Cryptographic Service Provider", wcsProvider)) {
if(!CryptAcquireContextW(&hProv, wcsContainer, wcsProvider, type, flags)) {
...
}
}
Данный провайдер не инициализируется. В Java AWT ошибки нет. Да, провайдер инициализируется до создания и отображения первого диалогового окна LoginPromptDlg.
|