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

에프나타나다수영장에는 엔트로피가 충분합니다. 이는 커널 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 안에는 명확하지 않음)

관련 정보