Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Рисунок 1. Драйвер не загружен
Драйвер после загрузки перехватывает системный вызов sys_gost, и все обращения МВ к функции sys_gost будут обслуживаться драйвером. Однако если ключевые данные не введены в БКИ, драйвер также не будет выполнять криптопреобразований, возвращая МВ нулевое значение (рис. 2).
Рисунок 2. Драйвер загружен. Ключевая информация не введена
Только после того, как МКД осуществит запись ключевой информации в БКИ, входные данные, передаваемые драйверу, поступают на вход БКП. Ключевая информация предварительно формируется модулем генерации ключевых данных (рис. 3).
Рисунок 3. Драйвер загружен. Ключевая информация введена
Сразу отметим, что операции загрузки драйвера и записи в него ключевых данных являются привилегированными. Выполнить их может только администратор системы, имеющий права root. Таким образом выполняется требование по ограничению доступа персонала к ключевой информации.
Реализация СКЗИ
Системный вызов sys_gost
Как было сказано выше, в состав ядра ОС Linux дополнительно вводится новый системный вызов sys_gost. Механизм системных вызовов был рассмотрен в статье «Перехват системных вызовов в ОС Linux» [1].
Добавим запись о системном вызове sys_gost() в таблицу системных вызовов sys_call_table (файл /usr/src/linux/arch/i386/kernel/entry.S):
ENTRY(sys_call_table)
.
.
.
.long SYMBOL_NAME(sys_gost)
/* 226. Новый системный вызов! */
Наш системный вызов имеет порядковый номер 226. Добавим его в заголовочный файл /usr/src/linux/include/asm-i386/unistd.h, в котором содержится перечень всех системных вызовов ядра и макросы для работы с ними:
#define __NR_gost 226 /* Новый системный вызов! */
В файл /usr/include/bits/syscall.h добавим запись:
#define SYS_gost __NR_gost
Теперь осталось написать код, реализующий системный вызов sys_gost(). Вот как он выглядит:
asmlinkage int sys_gost(char * block, size_t count, int flag)
{
return 0;
}
Этот код мы добавим в файл /usr/src/linux/fs/open.c.
Как мы видим, системный вызов sys_gost принимает три параметра: указатель на буфер с данными char *buf, размер буфера off_t count и флаг int flag. Третий параметр flag служит для информирования о начале/завершении выполнения операции криптопреобразования.
Для того чтобы процесс (модуль МВ) мог обратиться к данному системному вызову, в каталоге /usr/include/ создадим заголовочный файл gost.h следующего содержания:
#include <sys/types.h>
#include <linux/unistd.h>
#define E_START 1
#define E_STOP 0
static inline _syscall3(int,gost,char *,buf,off_t,count,int,flag)
Здесь E_START и E_STOP – флаги, информирующие о начале/завершении операции криптографического преобразования. Макрос _syscall3 сообщает компилятору, что он должен сделать, встретив в исходном тексте программы обращение к системному вызову sys_gost. Этот макрос определен в файле /usr/src/linux/include/asm-i386/unistd.h: