0

您好我正在开发一个可堆叠的文件系统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;
}
4

0 回答 0