首页 文章

使用VIA的挂锁哈希引擎进行流式SHA计算?

提问于
浏览
0

是否可以通过将块提供给 rep xsha1 指令来计算SHA1哈希值?

VIA的Padlock programming guide显示了计算文件SHA1哈希值的示例,但它在调用哈希指令之前将整个文件加载到内存中 .
我也没有看到任何关于在块中计算SHA哈希的信息 . 可以假设,因为你需要初始化输出缓冲区值,只需简单地再次调用 rep xsha1 而不重新初始化它们就可以工作,但是在测试之后,如果重要的话,这不会给它提供64字节的块 .

我不知道SHA1散列如何工作的内部结构,但我猜测有一个完成步骤,如果以块的形式加载数据,你需要以某种方式停止硬件 .

有谁知道在块中计算SHA1哈希的有效方法?

2 回答

  • 0

    取决于CPU . 在VIA Nano及更高版本中,您可以在执行REP XSHA1 / 256指令之前通过将EAX设置为FFFFFFFF来执行部分哈希 - 并且CPU将不执行最终填充(因此您可以简单地将块提供到哈希中,就像您一样通常使用散列函数) . 在较旧的模型(直到C7)上,不存在这种可能性,必须在散列指令之前将EAX设置为零,并且执行完整散列(即,包括最终填充) .

    我成功地实现了上面提到的黑客攻击(在Windows上)并且它已经工作[在VIA Nano上测试,但EAX = 0,但无法访问旧的CPU] . 但是,是的,这里存在性能损失,因此您不希望在代码中提供微小的块 . 我建议将小块缓冲到一个更大的缓冲区,比如几千字节,然后再执行“中断的哈希” . 如果您使用的数据少于此数据,则最好回退到普通的x86代码 .

    由于我无法对其他帖子发表评论/回复,以下是对以下评论的回复:

    我担心我无法分享我的代码,但我建议google for“PadlockSDK_3.1_Release_20090121.zip”这是包含相关功能的官方Via源(例如在PadlockSDK_3.1_Release_20090121 \ PadlockSDK_3.1_build20081128 \ sdk \ src中 - 有asm_partial_sha1_op3()函数的程序集实现 .

  • 0

    好吧,我发现了这个:http://www.logix.cz/michal/devel/padlock/phe_sum.xp

    PHE将其当前状态保存到每个进程切换的内存中,以及运行期间发生的任何页面错误 . 此状态包括散列的字节数和可用作后续轮次的初始值的中间结果 . 到现在为止还挺好 . 唯一剩下的问题是如何在我们需要的地方触发上下文切换或页面错误 . 解决方案:mmap(2)两个或多个页面,mprotect(2)最后一个拒绝所有访问(PROT_NONE) . 这会在我们需要的地方创建一个无法访问的内存 . 现在,我们将所有输入数据放在此障碍之前,并参与PHE . 但是我们会告诉它散列比我们放入缓冲区的数据略多一些 . 有了这些说明,PHE将处理我们所有的输入并尝试散列更多 . 此时它会触及保护区域,触发异常,将当前中间状态保存到内存中并调用异常处理程序(嗯,不完全也不完全按此顺序排列,没关系;-) . 无论如何,异常处理程序跳过PHE指令(hacky hack,EIP = 4 ;-)并返回 .

    聪明的黑客,但我不知道这样做的性能损失 .

    做一些测试,似乎它永远不会完成如果文件大于输入缓冲区,即黑客似乎不适合我,所以它似乎相当脆弱,虽然理论听起来没问题 .

    所以我从've found, there'开始并没有特别理想的方式来提供 xsha1 . (在没有能够很好地提供大量数据的情况下获得硬件加速哈希支持似乎有点无意义)

相关问题