gnupg 2.1.16等待熵的块

杰森·沃扬

从2.1.16(当前为2.1.17)发布的gnupg仅在首次调用时等待熵

注意:这不是尝试生成密钥,只是为了解密文件并启动代理。

第一次启动gpg-agent时,无论是直接使用gpg2 file.gpg还是使用诸如的应用程序pass,pinentry都会出现,并且一旦我输入密码并点击Enter它,它就会挂起15秒钟左右。

在default-cache-ttl窗口中的所有后续调用将立即执行。

--debug-all模式下运行,挂起的时间段将打印1

gpg: DBG: chan_6 <- S PROGRESS need_entropy X 30 120
gpg: DBG: chan_6 <- S PROGRESS need_entropy X 120 120
gpg: DBG: chan_6 <- S PROGRESS need_entropy X 30 120
gpg: DBG: chan_6 <- S PROGRESS need_entropy X 120 120
gpg: DBG: chan_6 <- S PROGRESS need_entropy X 30 120
...

我安装了rng-tools来补充熵池:

cat /proc/sys/kernel/random/entropy_avail 
4094

并与没有安装rng-tools或没有安装过ghgn的具有相同gnupg版本的计算机相比,该计算机没有延迟:

cat /proc/sys/kernel/random/entropy_avail
3783

因此,池中似乎有足够的熵。这在内核4.8.13和4.9上进行了测试。

gpg是否使用其他池?启动代理时,如何提供足够的熵,或者消除15s的延迟?



1.完整的调试日志

斯特里比卡

我想我知道发生了什么事。在gnupg的agent / gpg-agent.c中,此函数处理来自libgcrypt的消息。

/* This is our callback function for gcrypt progress messages.  It is
   set once at startup and dispatches progress messages to the
   corresponding threads of the agent.  */
static void 
agent_libgcrypt_progress_cb (void *data, const char *what, int printchar,
                             int current, int total)
{
  struct progress_dispatch_s *dispatch;
  npth_t mytid = npth_self ();

  (void)data;

  for (dispatch = progress_dispatch_list; dispatch; dispatch = dispatch->next)
    if (dispatch->ctrl && dispatch->tid == mytid)
      break;
  if (dispatch && dispatch->cb)
    dispatch->cb (dispatch->ctrl, what, printchar, current, total);

  /* Libgcrypt < 1.8 does not know about nPth and thus when it reads
   * from /dev/random this will block the process.  To mitigate this
   * problem we take a short nap when Libgcrypt tells us that it needs
   * more entropy.  This way other threads have chance to run.  */
#if GCRYPT_VERSION_NUMBER < 0x010800 /* 1.8.0 */
  if (what && !strcmp (what, "need_entropy"))
    npth_usleep (100000); /* 100ms */
#endif
}

在2.1.15和2.1.17之间添加了最后一个带有npth_usleep的部分。由于如果libgcrypt早于1.8.0,则可以有条件地对其进行编译,因此直接解决方案是针对libgcrypt 1.8.0或更高版本重新编译gnupg。不幸的是,该版本似乎还不存在。

奇怪的是,关于libgcrypt读取/ dev / random的评论是不正确的。跟踪代理可显示它正在从/ dev / urandom中读取并使用新的getrandom(2)syscall,而不会阻塞。但是,它确实发送了许多need_entropy消息,导致npth_usleep阻塞。删除这些行可解决此问题。

我应该提到,npth似乎是某种协作式多任务库,并且npth_usleep可能是它的产生方式,因此最好是大幅减少该延迟,以防万一libgcrypt决定阻止某天。(1ms不太明显)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

gnupg 2.1.16等待熵的块

来自分类Dev

GnuPG 1和GnuPG 2是否彼此兼容?

来自分类Dev

我可以看到相同的密钥同时使用GnuPG 2和GnuPG 1吗?

来自分类Dev

Gnupg gpg2想法

来自分类Dev

Gnupg gpg2想法

来自分类Dev

如何使用posix-threads使thread2等待c中的thread1

来自分类Dev

1块(16字节)的Java AES-128加密返回2块(32字节)作为输出

来自分类Dev

GnuPG加密不适用于进程错误代码2

来自分类Dev

GNUPG2突然抛出“构建密钥数组错误:没有这样的文件或目录”

来自分类Dev

为什么GnuPG 2和gpg-connect-agent失败并显示“ ERR 67108983 No SmartCard daemon”?

来自分类Dev

等待 2 个方法而不是 1 个

来自分类Dev

如何将我的公共GnuPG钥匙串导出到一个块中?

来自分类Dev

快速乘法模2 ^ 16 +1

来自分类Dev

如何用GnuPG modern替换GnuPG stable?

来自分类Dev

gnupg加密PHP

来自分类Dev

解密GnuPG加密的文件

来自分类Dev

停电后gnupg损坏

来自分类Dev

使用GnuPG加密目录?

来自分类Dev

如何安全卸载gnupg?

来自分类Dev

如何安装GnuPG 2.0?

来自分类Dev

GnuPG错误版本2.0.14

来自分类Dev

gnupg for OSX上的PHP

来自分类Dev

从AWS Lambda访问GNUPG

来自分类Dev

网络问题-gnupg

来自分类Dev

Behat + Selenium 2等待页面加载

来自分类Dev

角度2等待同步方法

来自分类Dev

Angular2等待HttpPost响应

来自分类Dev

离子2等待http响应

来自分类Dev

执行command1 时如何让command2 等待command1 退出?命令2?