gnupg 2.1.16 blocchi in attesa di entropia


9

Le versioni di gnupg dal 2.1.16 (attualmente 2.1.17) bloccano l'attesa dell'entropia solo alla prima invocazione .

Nota: questo non è un tentativo di generare una chiave, solo per decrittografare un file e avviare l'agente.

La prima volta che gpg-agent viene avviato, direttamente gpg2 file.gpgo usando un'applicazione come pass, appare pinentry e una volta che inserisco la mia passphrase e premo Entersi blocca per circa 15 secondi.

Tutte le chiamate successive, all'interno della finestra di default-cache-ttl, vengono eseguite immediatamente.

In esecuzione in --debug-allmodalità, il periodo in cui si verifica l'arresto si stampa 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
...

Ho installato rng-tools per integrare il pool di entropia:

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

e confrontato con una macchina con la stessa versione di gnupg che non aveva installato rng-tools o che aveva installato, non mostra alcun ritardo:

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

Quindi sembra che ci sia abbastanza entropia nel pool. Questo è stato testato su kernel 4.8.13 e 4.9.

Gpg usa un pool diverso? Come posso fornire un'entropia sufficiente o altrimenti eliminare il ritardo di 15 secondi all'avvio dell'agente?



1. Il registro di debug completo .


1
Hai installato rng-toolscome spiegato qui? serverfault.com/questions/214605/gpg-not-enough-entropy
aurelien

1
Sì, l'ho menzionato esplicitamente nella mia domanda. Se i nostri collegamenti fossero più accessibili , potresti aver notato :)
jasonwryan il

1
giusto @jasonwryan Ho perso quella riga: - /
aurelien il

Risposte:


2

Penso di sapere cosa sta succedendo. Nell'agente / gpg-agent.c di gnupg, questa funzione elabora i messaggi da 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
}

L'ultima parte con npth_usleep è stata aggiunta tra la 2.1.15 e la 2.1.17. Dato che questo è condizionatamente compilato se libgcrypt è precedente alla 1.8.0, la soluzione semplice sarebbe ricompilare gnupg contro libgcrypt 1.8.0 o successive ... sfortunatamente quella versione non sembra esistere ancora.

La cosa strana è che quel commento sulla lettura / dev / random di libgcrypt non è vero. Stracciare l'agente rivela che sta leggendo da / dev / urandom e usando il nuovo syscall getrandom (2), senza bloccare. Tuttavia, invia molti messaggi need_entropy, causando il blocco di npth_usleep. L'eliminazione di quelle righe risolve il problema.

Devo dire che npth sembra essere una specie di libreria multitasking cooperativa, e npth_usleep è probabilmente il suo modo di cedere, quindi potrebbe essere meglio ridurre in modo significativo quel ritardo, nel caso in cui libgcrypt decida di bloccare un giorno. (1ms non è evidente)


Bel lavoro. Quindi, fino al rilascio di libgcrypt 1.8.0 (attualmente sono in 1.7.5), ne sono bloccato. Sembra strano che l'effettiva quantità di entropia disponibile non influisca sul blocco.
Jasonwryan,

Sì, 1.7.5 è l'ultimo disponibile. Se sei disposto a patchare, è risolvibile rimuovendo 2 zeri. 4 per correggere il commento. :) A proposito, ho avuto lo stesso problema, non me ne sono proprio accorto.
stribika il

Ho notato solo perché stava interessando solo una delle mie macchine e quel tipo di varianza innesca davvero il mio disturbo ossessivo compulsivo. Vedrò se la patch aiuta. Saluti.
Jasonwryan,

Applicata questa patch e lo stesso blocco (need_entropy). Ugh!
Jasonwryan,

Sei sicuro che sia stata avviata la versione corretta di gpg-agent? Se fai affidamento su gpg per avviarlo, appare sempre nell'agente / usr / bin / gpg predefinito. Puoi avviarlo manualmente con killall gpg-agent; /path/to/gpg-agent --daemon.
stribika,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.