您好我正在开发一个可堆叠的文件系统WrapFS并尝试在其上实现 AES-GCM 密码以加密存储在底层文件系统中的数据。我在内核级别处理 AES 的 GCM 模式时遇到了很大的麻烦。但是,我成功地在 CTR 模式下实现了 AES,下面附上了相同的代码。有人可以为我指出如何将其修改为 AES-GCM 的正确方向吗?
我查看了此链接,但这并没有太大帮助。我正在寻找两件事:1.)如何将身份验证标签与加密数据一起存储在写入的文件中,以及 2.)如何通过向较低文件系统发送和接收来处理 AES-GCM 的 IV。
谢谢
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;
}