如何使用内核Crypto API实现AES-GCM加密?

时间:2015-01-11 05:18:01

标签: encryption linux-kernel cryptography aes-gcm

您好我正在处理可堆叠文件系统WrapFS并尝试在其上实施AES-GCM密码来加密存储在底层文件系统中的数据。我在处理内核级AES的GCM模式时遇到了重大麻烦。但是我在CTR模式下成功实现了AES,下面附有相同的代码。有人能指出我如何将其修改为AES-GCM吗?

我看了link,但这并没有多大帮助。 我正在寻找两件事: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;
}

0 个答案:

没有答案