gnupg 2.1.16 はエントロピー待機を防ぎます。

gnupg 2.1.16 はエントロピー待機を防ぎます。

公開済みヌプグ2.1.16(現在2.1.17)からエントロピー待機遮断最初の通話のみ

注:これいいえファイルを復号化してエージェントを起動するためのキーを生成してみてください。

gpg2 file.gpggpg-agentを直接実行しても、同じアプリを使用しても、最初に実行するとpasspinentryが表示され、パスワードを入力してクリックするとEnter約15秒間停止します。

default-cache-ttl ウィンドウ内のすべての後続の呼び出しはすぐに実行されます。

modeで実行すると、停止--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ツールエントロピープールを補充します。

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

同じバージョンのgnupgを使用しているがrng-toolsを持たないシステムと比較してください。ハジド遅滞なくインストール済み:

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

F現れるプールはエントロピーで十分です。これはカーネル4.8.13と4.9でテストされました。

gpgは別のプールを使用しますか?十分なエントロピーを提供したり、エージェントの起動時に15秒の遅延を削除したりするにはどうすればよいですか?



1.中デバッグログの完了

答え1

何が起きているのか分かると思います。 gnupgのエージェント/ 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
}

最後の部分であるnpth_usleepが2.1.15と2.1.17の間に追加されました。 libgcryptが1.8.0より前のバージョンの場合、これは条件付きでコンパイルされるため、即時の修正はlibgcrypt 1.8.0以降でgnupgを再コンパイルすることです...残念ながらまだ存在していないようです。

奇妙なことに、/dev/randomを読み取るlibgcryptの説明が正しくありません。トレースエージェントはブロックせずに/ dev / urandomから読み込み、新しいgetrandom(2)システムコールを使用していることを発見しました。しかし、多くのneed_entropyメッセージが送信されるため、npth_usleepはブロックされます。この行を削除すると問題が解決します。

npthは一種の協力的なマルチタスクライブラリのようで、npth_usleepが送信される可能性が高いので、libgcryptがある日ブロックすることにした場合に備えて待ち時間を大幅に減らすことをお勧めします。 (1ms以内には不明)

関連情報