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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline miser  
#1 Оставлено : 14 марта 2013 г. 15:39:07(UTC)
miser

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

Группы: Участники
Зарегистрирован: 14.03.2011(UTC)
Сообщений: 153
Мужчина
Откуда: Санкт-Петербург

Сказал «Спасибо»: 1 раз
Поблагодарили: 7 раз в 5 постах
Разрабатывал C код под Win32. Решил попробовать свои силы в Linux Ubuntu.
Сразу пошли непонятные проблемы.

Из примеров догадался, что для Linux надо указать параметр -DUNIX

В сценарии setenv.sh есть некий алгоритм для заполнения системной переменной SIZEOF_VOID_P.
Неужели, в C нельзя было сделать так
Код:

#include <limits.h>
#if ( __WORDSIZE == 64 )
#   define SIZEOF_VOID_P 8
#else
#   define SIZEOF_VOID_P 4
#endif

Пример подсмотрен отсюда: http://stackoverflow.com...define-for-64-bit-in-gcc


И еще одно недопонимание технического прогресса. На большинстве Linux систем, текущая кодировка UTF-8.
Все исходники из lsb-cprocsp-devel-3.6.1-4.noarch.rpm идут в кодировке Windows-1251.
Так специально было задумано?
Можно было прогнать исходники через программу iconv и положить в дистрибутив.
Offline Serge3leo  
#2 Оставлено : 15 марта 2013 г. 17:04:34(UTC)
Serge3leo

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

Группы: Участники
Зарегистрирован: 28.01.2008(UTC)
Сообщений: 40
Мужчина
Откуда: Москва

Поблагодарили: 3 раз в 2 постах
Спасибо за замечания, мы работаем над этими проблемами при подготовке будущих версий CSP.

Автор: miser Перейти к цитате
Разрабатывал C код под Win32. Решил попробовать свои силы в Linux Ubuntu.
...
Неужели, в C нельзя было сделать так
Код:
#if ( __WORDSIZE == 64 )

Пример подсмотрен отсюда: http://stackoverflow.com...define-for-64-bit-in-gcc

Для многих Linux так будет работать. Однако подозреваю, что найдутся такие Linux в которых использование `__WORDSIZE' не будет корректным. Вероятно, недокументированный макрос __WORDSIZE компилятора gcc равняется стандартному макросу POSIX `WORD_BIT', который определяет количество бит в типе int.

Поэтому, если Ваш компилятор соответствует стандартам C99, C11 или C++11 (или Ваша платформа соответствует IEEE Std 1003.1, 2003 или выше), я бы рекомендовал использовать макрос `UINTPTR_MAX' из <stdint.h>. Например, что-то в духе:
Код:
#include <stdint.h>
#define SIZEOF_VOID_P (UINTPTR_MAX+0 > 0xffffffffUL ? 8 : 4)
...
#if SIZEOF_VOID_P == 4


Автор: miser Перейти к цитате
Все исходники из lsb-cprocsp-devel-3.6.1-4.noarch.rpm идут в кодировке Windows-1251.
Так специально было задумано?

Исторически сложилось, раньше так всем было удобнее разрабатывать кроссплатформенный код. Конечно, сейчас все компиляторы уже совместимы с UTF-8, но "cl привет.cpp" с последующим "привет.exe" напечатает "привет" не всегда :)

Отредактировано пользователем 15 марта 2013 г. 17:08:23(UTC)  | Причина: Не указана

Offline miser  
#3 Оставлено : 16 марта 2013 г. 10:24:46(UTC)
miser

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

Группы: Участники
Зарегистрирован: 14.03.2011(UTC)
Сообщений: 153
Мужчина
Откуда: Санкт-Петербург

Сказал «Спасибо»: 1 раз
Поблагодарили: 7 раз в 5 постах
Обнаружил ошибку работы функции CryptGetHashParam в версии R3 для Linux amd64.

Берем пример /opt/cprocsp/src/doxygen/CSP/CreatingHash/CreatingHash.c
Код:

    //--------------------------------------------------------------------
    // Получение параметра объекта функции хеширования.
    CryptGetHashParam(hHash, HP_HASHSIZE, NULL, &cbHash, 0);
    printf("CryptGetHashParam size:%d <> %d\n", cbHash, GR3411LEN);

    cbHash = GR3411LEN;
    if(!CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0))

Результат на экране:
CryptGetHashParam size:4 <> 64

Исправьте, пожалуйста.
Функция должна возвращать честный размер, 64 байта.

http://msdn.microsoft.co...p/aa379947(v=vs.85).aspx
Цитата:

HP_HASHSIZE
Hash value size
DWORD value indicating the number of bytes in the hash value. This value will vary depending on the hash algorithm. Applications must retrieve this value just before the HP_HASHVAL value so the correct amount of memory can be allocated.
Offline Максим Коллегин  
#4 Оставлено : 16 марта 2013 г. 15:57:49(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,415
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 728 раз в 629 постах
) 4 - это размер дворда, содержащего длину. Вызовите не с NULL.
Знания в базе знаний, поддержка в центре поддержки
Offline miser  
#5 Оставлено : 26 марта 2013 г. 9:14:34(UTC)
miser

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

Группы: Участники
Зарегистрирован: 14.03.2011(UTC)
Сообщений: 153
Мужчина
Откуда: Санкт-Петербург

Сказал «Спасибо»: 1 раз
Поблагодарили: 7 раз в 5 постах
Милые сердцу ошибки :)

Ошибка номер раз:
Цитата:

v$ /opt/cprocsp/bin/amd64/cpverify
...
Calculate hash value for the given filename.
cpverify.exe -mk filename

Нет у меня файла cpverify.exe под Linux.

Ошибка номер два:
Цитата:

$ /opt/cprocsp/sbin/amd64/cpconfig -hardware reader -view
...
Nick name: HDIMAGE
Connect name:
Reader name: ��������� ������� �� ������� ����

cpconfig пишет сообщения на Windows-1251.
Даже в MS VisualC++ можно писать программы в Unicode или UTF-8 ( L"Привет" ), и в консоли (CP-866) будет текст отображаться русскими буквами.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.