Привет, я работаю над стекируемой файловой системой WrapFS и пытаюсь реализовать на ней шифр AES-GCM для шифрования хранимых данных. в базовой файловой системе. У меня большие проблемы с обработкой режима GCM для AES на уровне ядра. Однако мне удалось реализовать AES в режиме CTR, и код для него прилагается ниже. Может ли кто-нибудь указать мне в правильном направлении, как изменить его на AES-GCM?
Я посмотрел на эту ссылку, но это мало помогло. Я ищу две вещи: 1.) Как хранить теги аутентификации вместе с зашифрованными данными в записанных файлах и 2.) Как обрабатывать IV AES-GCM путем отправки и получения из нижней файловой системы.
Спасибо
int decrypt_encrypt_page(struct page *src_page,
struct page *dst_page,
char *key,
int key_len,
int encrypt)
{
int ret = 0;
struct scatterlist src_sg, dst_sg;
struct crypto_blkcipher *tfm;
struct blkcipher_desc desc;
sg_init_table(&src_sg, 1);
sg_init_table(&dst_sg, 1);
sg_set_page(&src_sg, src_page, PAGE_SIZE, 0);
sg_set_page(&dst_sg, dst_page, PAGE_SIZE, 0);
tfm = crypto_alloc_blkcipher(default_algo, 0, 0);
if (IS_ERR(tfm)) {
printk(KERN_ERR "failed to load transform for %s: %ld\n",
default_algo,
PTR_ERR(tfm));
ret = IS_ERR(tfm);
goto out;
}
desc.tfm = tfm;
desc.flags = 0;
ret = crypto_blkcipher_setkey(tfm, key, key_len);
if (ret) {
printk(KERN_ERR "setkey() failed flags=%x\n",
crypto_blkcipher_get_flags(tfm));
goto out;
}
if (encrypt)
ret = crypto_blkcipher_encrypt(&desc, &dst_sg, &src_sg, PAGE_SIZE);
else
ret = crypto_blkcipher_decrypt(&desc, &dst_sg, &src_sg, PAGE_SIZE);
if (ret)
printk(KERN_INFO "Some error occured while encrypting.\n");
out:
crypto_free_blkcipher(tfm);
return ret;
}