cryptsetup后端安全与多线程?

时间:2015-05-31 02:57:26

标签: c linux multithreading cryptography luks

是否存在cryptsetup的加密后端,它既可以是线程安全的,也可以以线程安全的方式轻松使用(甚至可以轻松修改,最好以最小的努力),以便简单地测试密钥是否正确?

背景和我尝试的内容:

我开始测试是否可以修改cryptsetup的源代码,以便使用pthreads简单地测试多个密钥。这个崩溃了,我相信我最初使用过gcrypt。最后我尝试了cryptsetup稳定源中的所有后端,发现openssl和nettle似乎可以避免崩溃。

但是,我的测试不是很彻底,即使它(特别是nettle)没有崩溃,它似乎在使用线程时无法正常工作。当使用单个线程时,它始终有效,但增加线程数使得它越来越不可能无声地找不到正确的密钥。

这适用于强制LUKS设备。我知道pbkdf将它减慢到爬行速度。我也意识到即使KDF不存在,AES的密钥空间也不会耗尽。这只是为了以网络分布式和多线程方式实现它的乐趣。

我注意到cryptsetup(libdevmapper.c)的来源:

/*
 * libdevmapper is not context friendly, switch context on every DM call.
 * FIXME: this is not safe if called in parallel but neither is DM lib.
 */

但是,我可能没有正确使用它。

    if(!LUKS_open_key_with_hdr(CRYPT_ANY_SLOT, key, strlen(key), &cd->u.luks1.hdr, &vk, cd)) {
            return 0;
    }

每个工作线程都这样做。我只在工作线程启动之前调用crypt_init()和crypt_load()一次,并将它们自己的struct crypt_device的单独副本传递给它们。每次尝试都会在本地创建vk。这些密钥只是从具有互斥锁访问控制的单词列表中获取。我发现如果每个线程每次调用这些函数(crypt_init和crypt_load),它似乎更容易崩溃。

尝试开始删除和重写使用dmcrypt的代码是否完全不正确?在LUKS_endec_template()中,它将一个循环设备附加到加密设备,并创建一个dm设备,它最终提供给open(),然后它将fd提供给read_blockwise()。我的想法是简单地跳过所有这些,因为我不需要使用设备,除了验证密钥。但是,只是直接打开加密设备(并将其提供给read_blockwise())不起作用。

0 个答案:

没有答案