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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Антон Шмидт  
#1 Оставлено : 17 сентября 2019 г. 19:05:25(UTC)
Антон Шмидт

Статус: Новичок

Группы: Участники
Зарегистрирован: 09.09.2019(UTC)
Сообщений: 5
Российская Федерация

Добрый день, код, использующий CAPILite, не собирается под MacOS 10.13, clang++ (x86_64) - возникают ошибки - константы NTE_BAD_KEYSET, CRYPT_E_NO_KEY_PROPERTY, NTE_KEYSET_NOT_DEF и прочие не влезают в тип DWORD.

Код:

        DWORD lastError = GetLastError();
        switch(lastError)
        {
        case NTE_BAD_KEYSET:
            m_sLastError = QObject::tr("Ключевой контейнер не был открыт или не существует");
            break;
        case CRYPT_E_NO_KEY_PROPERTY:
            m_sLastError = QObject::tr("Не найдено закрытого ключа соответствующего выбранному сертификату");
            break;
        case 2148532334:
            m_sLastError = QObject::tr("Действие было отменено пользователем");
            break;
        case NTE_KEYSET_NOT_DEF:
            m_sLastError = QObject::tr("Ключевой контейнер, не существует.");
            break;
        default:
            m_sLastError = QObject::tr("Ошибка при инициализации криптографии");
        }


Вывод компилятора:
Код:

../../client/src/cryptplugin.cpp:2726:14: error: case value evaluates to -2146893802, which cannot be narrowed to type 'unsigned int' [-Wc++11-narrowing]
        case NTE_BAD_KEYSET:
             ^
/opt/cprocsp/include/cpcsp/CSP_WinError.h:18204:42: note: expanded from macro 'NTE_BAD_KEYSET'
#define NTE_BAD_KEYSET                   _HRESULT_TYPEDEF_(0x80090016L)
                                         ^
/opt/cprocsp/include/cpcsp/CSP_WinError.h:14116:32: note: expanded from macro '_HRESULT_TYPEDEF_'
#define _HRESULT_TYPEDEF_(_sc) ((HRESULT)_sc)


В Windows
Код:
typedef unsigned long DWORD, *PDWORD, *LPDWORD;


В CSP_WinDef.h из ru.cryptopro.csp-5.0.11455.dmg
Код:
typedef unsigned int       DWORD;	/* XXXX icc говорит, что с этим типом есть проблемы ???? */


Очевидно, icc прав, проблемы есть :)

Я верно понимаю, если я руками в header'е заменю объявление типа, то приложение рухнет, пытаясь работать с библиотекой, которая собрана с DWORD другого размера? Теперь только ждать новой сборки КриптоПро под MacOS?
Offline two_oceans  
#2 Оставлено : 18 сентября 2019 г. 8:12:00(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 394 раз в 366 постах
Добрый день. Если что я не сотрудник КриптоПро. Сам по себе размер переменной вроде бы совпадает иначе не оттранслировалось бы 0x80090016L в -2146893802, то есть с размером проблемы нет и приложение не рухнет.

Полагаю проблема скорее в том, что DWORD беззнаковый тип (unsigned, то есть отрицательные значения невозможны), а на case почему-то NTE_BAD_KEYSET как знаковый тип (signed, отрицательное значение -2146893802), поэтому наверно надо _HRESULT_TYPEDEF_ исправить на беззнаковый тип (на DWORD) вместо HRESULT (который похоже "внезапно" знаковый на Маке?) или исправить сам HRESULT словом unsigned. Другой вопрос, что если где-то в приложении сравнивается HRESULT с отрицательным значением, то там возникнет эта же проблема несовпадения диапазонов.

Отредактировано пользователем 18 сентября 2019 г. 8:13:04(UTC)  | Причина: Не указана

Offline KDA  
#3 Оставлено : 18 сентября 2019 г. 14:07:26(UTC)
KDA

Статус: Активный участник

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
Автор: two_oceans Перейти к цитате
вместо HRESULT (который похоже "внезапно" знаковый на Маке?)


Внезапно, на платформе Windows HRESULT тоже знаковый.


Автор: Антон Шмидт Перейти к цитате
Добрый день, код, использующий CAPILite, не собирается под MacOS 10.13, clang++ (x86_64) - возникают ошибки - константы NTE_BAD_KEYSET, CRYPT_E_NO_KEY_PROPERTY, NTE_KEYSET_NOT_DEF и прочие не влезают в тип DWORD.


Конечно, не влезают. Один тип знаковый, другой - нет.
Лечится достаточно просто, если x86/x64 и одинаковое количество бит
Код:

switch((HRESULT)lastError)) //если в case все HRESULT'ы


или наоборот
Код:

case (DWORD)NTE_XXX:

Отредактировано пользователем 18 сентября 2019 г. 14:33:43(UTC)  | Причина: Не указана

Offline Антон Шмидт  
#4 Оставлено : 19 сентября 2019 г. 11:37:35(UTC)
Антон Шмидт

Статус: Новичок

Группы: Участники
Зарегистрирован: 09.09.2019(UTC)
Сообщений: 5
Российская Федерация

Спасибо за помощь. При сборке под Unix (gcc 7.4.0) таких проблем не возникало, а с инструментами под MacOS пока еще не освоился :)
Offline KDA  
#5 Оставлено : 19 сентября 2019 г. 13:42:46(UTC)
KDA

Статус: Активный участник

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
Кажется, такое поведение - по стандарту
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.