gnupg 2.1.16 blok menunggu entropi

9

Pers rilis gnupg dari 2.1.16 (saat ini 2.1.17) blok menunggu entropi hanya pada doa pertama .

Catatan: ini bukan upaya untuk menghasilkan kunci, hanya untuk mendekripsi file dan memulai agen.

Pertama kali gpg-agent dimulai, baik secara langsung dengan gpg2 file.gpgatau menggunakan aplikasi seperti pass, pinentry muncul dan begitu saya memasukkan frasa sandi saya dan menekannya Enterhang sekitar 15s.

Semua panggilan berikutnya, dalam jendela default-cache-ttl, dieksekusi segera.

Berjalan dalam --debug-allmode, periode di mana hang terjadi mencetak 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
...

Saya menginstal rng-tools untuk melengkapi kumpulan entropi:

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

dan dibandingkan dengan mesin dengan versi yang sama dari gnupg yang tidak memiliki RNG-alat atau haveged diinstal, bahwa pameran ada penundaan:

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

Jadi tampaknya ada cukup entropi di kolam renang. Ini diuji pada kernel 4.8.13 dan 4.9.

Apakah gpg menggunakan kolam yang berbeda? Bagaimana saya bisa memberikan entropi yang cukup, atau menghilangkan penundaan 15 saat memulai agen?



1. Log debug penuh .

jasonwryan
sumber
1
Sudahkah Anda menginstalnya rng-toolsseperti yang dijelaskan di sini? serverfault.com/questions/214605/gpg-not-enough-entropy
aurelien
1
Ya, saya menyebutkannya secara eksplisit dalam pertanyaan saya. Jika tautan kami lebih mudah diakses , Anda mungkin telah memperhatikan :)
jasonwryan
1
right @jasonwryan Saya melewatkan baris itu: - /
aurelien

Jawaban:

2

Saya rasa saya tahu apa yang sedang terjadi. Di agen gnupg / gpg-agent.c, fungsi ini memproses pesan dari 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
}

Bagian terakhir dengan npth_usleep ditambahkan antara 2.1.15 dan 2.1.17. Karena ini dikompilasi secara kondisional jika libgcrypt lebih tua dari 1.8.0, perbaikan langsung akan mengkompilasi ulang gnupg terhadap libgcrypt 1.8.0 atau yang lebih baru ... sayangnya versi itu tampaknya belum ada.

Yang aneh adalah, bahwa komentar tentang libgcrypt reading / dev / random tidak benar. Mengganti agen menunjukkan pembacaan dari / dev / urandom dan menggunakan syscall getrandom (2) baru, tanpa memblokir. Namun ia mengirim banyak pesan need_entropy, menyebabkan npth_usleep diblokir. Menghapus garis-garis itu memperbaiki masalah.

Saya harus menyebutkan bahwa npth tampaknya semacam perpustakaan multitasking kooperatif, dan npth_usleep mungkin adalah cara untuk menghasilkan, jadi mungkin lebih baik untuk secara signifikan mengurangi penundaan itu, kalau-kalau libgcrypt memutuskan untuk memblokir suatu hari. (1ms tidak terlihat)

stribika
sumber
Kerja bagus. Jadi, sampai libgcrypt 1.8.0 dirilis (saat ini saya menggunakan 1.7.5), saya terjebak dengannya. Tampaknya aneh bahwa jumlah aktual entropi yang tersedia tidak ada kaitannya dengan pemblokiran.
jasonwryan
Ya, 1.7.5 adalah yang terbaru yang tersedia. Jika Anda ingin menambal, itu bisa diperbaiki dengan menghapus 2 nol. 4 untuk memperbaiki komentar. :) Btw saya punya masalah yang sama, saya hanya tidak benar-benar memperhatikan.
stribika
Saya hanya memperhatikan karena itu hanya mempengaruhi salah satu mesin saya, dan varian semacam itu benar-benar memicu OCD saya. Saya akan melihat apakah tambalan itu membantu. Bersulang.
jasonwryan
Menerapkan tambalan ini dan pemblokiran yang sama (need_entropy). Ugh!
jasonwryan
Apakah Anda yakin versi gpg-agent yang tepat sudah dimulai? Jika Anda mengandalkan gpg untuk memulainya, selalu terlihat di agen default / usr / bin / gpg. Anda dapat memulainya secara manual dengan killall gpg-agent; /path/to/gpg-agent --daemon.
stribika