Интерфейс "КриптоПро CSP 5.0" уровня ядра в Linux реализован в модуле ядра drvcsp.ko. Этот модуль запускается из инициализационных командных файлов операционной системы (см. /etc/modules.conf).
Для Linux способ связывания - ссылка на символы. Точки входа, предоставляемые drvcsp.ko представлены в таблице:
Точка входа |
---|
CPCCreateProvider |
CPCGetDefaultConfig |
CPCInitMemoryLF |
Адреса остальных функций интерфейса получаются путём вызова CPCCreateProvider.
Для работы с данными функциями достаточно объявить их прототипы:#include "wincspc.h" #include "wincspc_int.h"
В ОС Linux модули ядра не обладают бинарной совместимостью и, соответственно, привязаны к конкретной версии ядра ОС. Поэтому модуль ядра поставляется в виде пакета .src.rpm. Такой тип пакета позволяет собрать модуль для нужной версии ядра. Для его установки следует при помощи rpmbuild собрать из .src.rpm пакета обычный .rpm пакет, а затем установить его. Подробнее этот процесс описан в разделе "Установка дистрибутива ПО СКЗИ" руководства администратора безопасности Linux.
Так как наличие средств отладки и разработки на системах, в которых эксплуатируется СКЗИ "КриптоПро CSP 5.0", недопустимо, администратор (разработчик ПКЗИ) должен собрать пакет типа rpm на специальном выделенном рабочем месте и обеспечивать его доверенную установку в целевую систему.
Для Intel Pentium (i386/i586/i686/amd) ядро Linux обычно поддерживает размер стека равный 2*4Кб. "КриптоПро CSP 5.0" уровня ядра требуется максимум 3Кб (обычно менее 2Кб).
Для Intel EM64T (x86_64/x64/amd64) ядро Linux обычно поддерживает размер стека равный 2*8Кб. "КриптоПро CSP 5.0" уровня ядра требуется максимум 5Кб (обычно менее 4Кб).
В функции CPCCreateProvider проверяется лицензия, которая должна быть передана в структуре CPC_CONFIG_. При отсутствии или искажении лицензии функция вернёт ошибку.
Обычно следует использовать функцию CPCGetDefaultConfig, которая возвращает конфигурацию по умолчанию, в частности, лицензию "КриптоПро CSP 5.0" установленную стандартным образом (примечание: после установки новой лицензии следует перезагрузить модуль drvcsp.ko).
Данный пример демонстрирует способ вызов функции CPCCreateProvider.
Включаем определение типа wchar_t и др., согласно ISO/IEC 9899.
#include <stddef.h>
Подключаем требуемые файлы Linux DDK и Крипто-Про DDK. #include "drtcsp_io.h" #include "reader/tchar.h" #include "reader/support.h" #include "wincspc.h" #include "wincspc_int.h" #include "lfmm.h" #include "lfmm_int.h"Подготавливаем данные для вызова CPCCreateProvider:
CPC_CONFIG CSPConfig; CPCGetDefaultConfig(&CSPConfig, NULL); CSPConfig.logConfig.name=_TEXT(MODNAME);Заполняем структуры менеджера памяти. В данном случае используем безблокировочный менеджер памяти, т.е. инициализируем его структуры данных и вызываем CPCInitMemoryLF
CPCInitMemoryLF(&CSPConfig.pArena,&lfmmConfig);
Инициализируем CPCCreateProvider HCRYPTMODULE hCSP; CPCCreateProvider(&hCSP,&Config);
При использовании на уровне ядра ОС ПКЗИ должно предоставить функции управления памятью и синхронизации соответствующие фактическому уровню исполнения.
Т.к. в ядре ОС Linux, в общем случае, ожидающие блокировки невозможны, рекомендуется использовать безблокировочный менеджер памяти, не заполнять lockFuncs и открывать контексты с флагом CRYPT_NOSERIALIZE. В этом случае ПКЗИ должно учитывать, что в следующих случаях результат будет не определён:
В ядре Linux не требуется настраивать примитивы синхронизации interlockedFuncs, т.к. процессоры Intel Pentium/EM64T имеют соответствующие встроенные команды.
Для разработки и отладки ПКЗИ уровня ядра ОС на уровне приложений предназначена библиотека libcpcdrv_emul.a. Сборка, отладка, а так же измерение фактического максимального размера стека осуществляется обычным образом. Измерения фактически использованного размера памяти в безблокировочном менеджере осуществляется функцией CPC_StatMemory.