Иcпользуем CryptoApi ядра Linux для шифрования

TuxПоиск хороших примеров работы с cryptoapi ядра Linux, ни к чему хорошему не привел. Потому потратив вечерок на изучение исходников ядра решил закрепить материал, может кому-то пригодится.

В сети достаточно примеров по использованию Crypto API для хеширования данных и совсем немного(в основном на stackoverflow) по шифрованию данных, хороший, рабочий пример пришлось собирать по кусочкам. Итак начнем.

Первое что нам понадобится это включить заголовочные файлы:

#include <linux/crypto.h>
#include <linux/scatterlist.h>

А файл crypto.h я бы настоятельно рекомендовал открыть и заглядывать в случае возникновения вопросов. Теперь мы можем инициализировать необходимые нам структуры:

struct crypto_blkcipher * blk;
struct blkcipher_desc desc;
struct scatterlist sg[2];

Основная структура здесь это crypto_blkcipher которая является контекстом шифратора, в то время как blkcipher_desc — всего лишь обертка надcrypto_blkcipher , в чем мы убедимся дальше. Структура scatterlist используется для работы с буферами данных. Далее мы инициализируем crypto_blkcipherнужным нам алгоритмом, в данном случае алгоритм шифрования AES в режимеXTS.

blk = crypto_alloc_blkcipher("xts(aes)", 0, 0);
if ( IS_ERR(blk) )
{
	printk(KERN_ALERT "Failed to initialize AES cipher. n");
	return -1;
}

После инициализации контекста можно установить ключ и вектор инициализации.

crypto_blkcipher_setkey(blk, key, key_len);

crypto_blkcipher_set_iv(blk, iv, iv_len);

Входной и выходной буфер функция шифрования принимает в формате struct scatterlist, которые мы сейчас и инициализируем:

sg_init_one(&sg[0],src,src_len);

sg_init_one(&sg[1],dst,dst_len);

Дело осталось за малым, инициализировать дескриптор и зашифровать данные:

desc.tfm = blk;
desc.flags = 0;

if(crypto_blkcipher_encrypt(&desc, &sg[1], &sg[0], src_len)) {
    printk(KERN_ALERT "Failed to encrypt. n");
}

 

Готовый для сборки пример можно найти на github.

dreamway89

dreamway89 wrote 29 posts

Post navigation


Добавить комментарий

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>