rec*_*uze 3 cryptography sha1 digest linux-kernel
我正在尝试在Linux内核中计算整数数组的SHA1.我曾经走过crypto.c/ crypto.h和security/integrity/ima/ima_crypto.c,但我无法弄清楚如何init,然后update将SHA1计算机.有人可以指点我如何去做这个教程或指南吗?
Vil*_*ray 10
在Documentation/crypto/api-intro.txt中对linux加密api有一个很好的介绍.还可以查看fs/ecryptfs/crypto.c,了解如何使用这些函数的实际示例.
这里有一个快速摘要,但是为了让你开始:
创建一些局部变量:
struct scatterlist sg;
struct hash_desc desc;
char *plaintext = "plaintext goes here";
size_t len = strlen(plaintext);
u8 hashval[20];
Run Code Online (Sandbox Code Playgroud)
struct scatterlist用于以crypto.h函数可以理解的格式保存明文,而a struct hash_desc用于配置散列.plaintext保存我们的明文字符串,同时保存我们明文hashval的哈希值.len保持明文字符串的长度.请注意,虽然我在此示例中使用ASCII明文,但您也可以传递整数数组 - 只需存储总内存大小len并用plaintext整数数组替换每个实例:
int myarr[4] = { 1, 3, 3, 7 };
size_t len = sizeof(myarr);
Run Code Online (Sandbox Code Playgroud)
但请注意:int元素的大小通常大于一个字节,因此在int数组中存储整数值将不具有与数组相同的内部表示char- 您可能最终将空字节作为值之间的填充.
此外,如果您的目的是散列整数的ASCII表示,则必须首先将数组中的值转换为字符串字符序列(可能使用sprintf).
初始化sg和desc:
sg_init_one(&sg, plaintext, len);
desc.tfm = crypto_alloc_hash("sha1", 0, CRYPTO_ALG_ASYNC);
Run Code Online (Sandbox Code Playgroud)
注意"sha1"传递给crypto_alloc_hash; 这可以设置"md5"为MD5散列或任何其他支持的字符串,以便使用相应的散列方法.
现在使用三个函数调用执行散列:
crypto_hash_init(&desc);
crypto_hash_update(&desc, &sg, len);
crypto_hash_final(&desc, hashval);
Run Code Online (Sandbox Code Playgroud)
crypto_hash_init根据提供的配置哈希引擎struct hash_desc.crypto_hash_update 在明文上执行实际的散列方法.crypto_hash_final将哈希值复制到字符数组中.免费分配的内存由desc.tfm:
crypto_free_hash(desc.tfm);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3937 次 |
| 最近记录: |