КриптоПро CSP  

Особенности использования интерфейса уровня ядра в OC Linux

Общее описание

Интерфейс "КриптоПро 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

При использовании на уровне ядра ОС ПКЗИ должно предоставить функции управления памятью и синхронизации соответствующие фактическому уровню исполнения.

Т.к. в ядре ОС Linux, в общем случае, ожидающие блокировки невозможны, рекомендуется использовать безблокировочный менеджер памяти, не заполнять lockFuncs и открывать контексты с флагом CRYPT_NOSERIALIZE. В этом случае ПКЗИ должно учитывать, что в следующих случаях результат будет не определён:

Операции в разных контекстах и/или над разными объектами можно выполнять "параллельно", в том числе при обработке аппаратных или программных прерываний.

В ядре Linux не требуется настраивать примитивы синхронизации interlockedFuncs, т.к. процессоры Intel Pentium/EM64T имеют соответствующие встроенные команды.

Регрессионное тестирование ПКЗИ уровня ядра ОС

Для разработки и отладки ПКЗИ уровня ядра ОС на уровне приложений предназначена библиотека libcpcdrv_emul.a. Сборка, отладка, а так же измерение фактического максимального размера стека осуществляется обычным образом. Измерения фактически использованного размера памяти в безблокировочном менеджере осуществляется функцией CPC_StatMemory.