Как реализовать шифрование AES-GCM с помощью ядра Crypto API?

Привет, я работаю над стекируемой файловой системой 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;
}

person bawejakunal    schedule 11.01.2015    source источник
comment
Вы можете изучить этот поток: stackoverflow.com/ вопросы/13284986/ccm-aes-from-linux-kernel   -  person askb    schedule 11.01.2015
comment
@askb Я изучил это, в конце концов, это первый результат Google, но вы видите, что проблема в моем случае другая, потому что я должен реализовать ее через стекируемую файловую систему, так как мне обрабатывать IV и теги аутентификации в этом случае? Как хранить их вместе с зашифрованными данными и использовать позже для расшифровки. В данной ссылке эта часть не обрабатывается.   -  person bawejakunal    schedule 11.01.2015
comment
IV/SV должны генерироваться случайным образом. Тег аутентификации GCM может храниться с зашифрованным текстом в открытом виде и сам по себе не содержит никакой конфиденциальной информации. См.: crypto.stackexchange.com/questions/9478/   -  person askb    schedule 11.01.2015
comment
@askb Пожалуйста, посмотрите на мой текущий код, здесь я шифрую страницы памяти, поэтому тег шифрования, сгенерированный с помощью этого шифрования, определенно не может храниться на той же странице, поскольку это приведет к несогласованности данных, более того, я знаю, что IV может быть сгенерирован случайным образом, но это вообще не мой вопрос, я спрашиваю, как сохранить/сохранить этот IV, чтобы его можно было использовать в более поздний момент времени для расшифровки страницы памяти, поскольку реализация должна быть выполнена для файловая система, время расшифровки может быть любым в будущем   -  person bawejakunal    schedule 11.01.2015
comment
Я не знаком с wrapfs, но в качестве сквозной стекируемой FS вам может понадобиться понять, как данные/блоки сопоставляются со страницами. В большинстве случаев блоки на диске шифруются с дополнительным использованием таких функций, как расширенные атрибуты, в базовой файловой системе (например, ext4) для хранения дополнительной информации для каждой страницы, такой как теги аутентификации, HMAC и т. д. Если вы планируете чтобы зашифровать страницу (в ядре), как ваше приложение будет читать/писать эти страницы?   -  person askb    schedule 11.01.2015