如何在Linux内核中计算数组的SHA1

时间:2013-05-31 15:55:55

标签: linux-kernel cryptography sha1 digest

我正在尝试在Linux内核中计算整数数组的SHA1。我已经浏览过crypto.c / crypto.hsecurity/integrity/ima/ima_crypto.c,但我无法弄清楚如何init然后update SHA1计算机。有人可以指点我如何去做这个教程或指南吗?

1 个答案:

答案 0 :(得分:10)

Documentation/crypto/api-intro.txt中的linux加密api有一个很好的介绍。另请查看fs/ecryptfs/crypto.c以获取有关如何使用这些函数的实际示例。

这里有一个快速摘要,但是为了让你开始:

第1步:声明

创建一些局部变量:

struct scatterlist sg;
struct hash_desc desc;
char *plaintext = "plaintext goes here";
size_t len = strlen(plaintext);
u8 hashval[20];
  • struct scatterlist用于以crypto.h函数可以理解的格式保存您的明文,而struct hash_desc用于配置散列。
  • 变量plaintext保存我们的纯文本字符串,而hashval将保留我们明文的哈希值。
  • 最后,len保留明文字符串的长度。

请注意,虽然我在此示例中使用ASCII明文,但您也可以传递整数数组 - 只需将总内存大小存储在len中并替换{{1}的每个实例1}}使用整数数组:

plaintext

但请注意:int myarr[4] = { 1, 3, 3, 7 }; size_t len = sizeof(myarr); 元素的大小通常大于一个字节,因此在int数组中存储整数值不会与{{1}具有相同的内部表示数组 - 你可能最终得到空字节作为值之间的填充。

此外,如果您的目的是散列整数的ASCII表示,您必须先将数组中的值转换为字符串字符序列(可能使用int

第2步:初始化

初始化charsprintf

sg

请注意,desc已传递给sg_init_one(&sg, plaintext, len); desc.tfm = crypto_alloc_hash("sha1", 0, CRYPTO_ALG_ASYNC); ;对于MD5哈希或任何其他支持的字符串,可以将其设置为"sha1",以便使用相应的哈希方法。

第3步:哈希

现在使用三个函数调用执行散列:

crypto_alloc_hash
  • "md5"根据提供的crypto_hash_init(&desc); crypto_hash_update(&desc, &sg, len); crypto_hash_final(&desc, hashval); 配置哈希引擎。
  • crypto_hash_init在明文上执行实际的哈希方法。
  • 最后,struct hash_desc将哈希值复制到字符数组中。

第4步:清理

crypto_hash_update保留的免费分配内存:

crypto_hash_final

另见

  

how to use CryptoAPI in the linux kernel 2.6