Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)
type name(type1 arg1,type2 arg2,type3 arg3)
{
long __res;
__asm__ volatile ("int $0x80"
: "=a" (__res)
: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)),
"d" ((long)(arg3)));
__syscall_return(type,__res);
}
Таким образом, системный вызов sys_gost будет выполняться стандартным для всех системных вызовов способом: аргументы вызова загружаются в регистры процессора, а затем вызывается программное прерывание int $0x80. Конструкция __NR_##name трансформируется в порядковый номер системного вызова name, и этот номер загружается в регистр EAX.
После внесения всех изменений ядро необходимо перекомпилировать.
Драйвер
Задача драйвера – перехватить системный вызов sys_gost, принять ключи и начать выполнение операций криптографического преобразования блоков данных, поступающих от МВ. Драйвер является символьным (байт-ориентированным) устройством. Создадим для него файл устройства следующей командой:
mknod /dev/gost c 69 0
Заголовочные файлы и переменные
Для работы нам понадобятся следующие header-файлы:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/slab.h>
#include <linux/fs.h>
#include <sys/syscall.h>
#include <asm/uaccess.h>
#include "gost_var.h"
#define GOST_MAJOR 69 – старший номер устройства
Переменные:
int key_enable = 0; – флаг наличия ключевой информации в БКИ
int key_init = 0; – флаг инициализации ключевой информации
struct key_info {
char key_d[64];
__u32 X[8];
char sp[8];
} keys;
В соответствии с рис. 2 и 3, структура struct key_info keys является БКИ. В ней будет храниться ключевая информация. Назначение полей структуры struct key_info:
n char key_d[64] – буфер для хранения долговременного ключа;
n __u32 X[8] – буфер для хранения сеансового ключа;
n char sp[8] – буфер для хранения синхропосылки.
В файле gost_var.h определены переменные, необходимые для реализации алгоритма ГОСТ 28147-89. Файл имеет следующее содержание: