2011-04-29 23 views
22

Estoy interesado principalmente en la implementación de SecRandomCopyBytes en iOS, si es diferente de la implementación de OS X. (I presumiría que lo hace, ya que un dispositivo móvil tiene más y más fuentes fácilmente disponibles de entropía que una computadora de escritorio.)¿Qué tan bueno es SecRandomCopyBytes?

¿Alguien tiene información sobre: ​​

  1. Dónde SecRandomCopyBytes obtiene la entropía de?
  2. ¿Qué tasa puede generar buenos números aleatorios?
  3. ¿Bloqueará o fallará de inmediato si no hay suficiente entropía disponible?
  4. ¿Cumple con FIPS 140-2 o se ha incluido en alguna otra certificación oficial?

La documentación no cubre estos puntos.

Solo he podido encontrar comentarios de decir que utiliza información de radios, brújula, acelerómetros y otras fuentes, pero no hay citas de personas que realmente representen a Apple.

Respuesta

18

/dev/random is fed by entropy from the SecurityServer. SecurityServer recolectando entropía del seguimiento de eventos del kernel (kdebug). El método se describe en el libro "Mac OS X Internals. A Systems Approach".Usted puede leer sobre él en línea, por ejemplo, en http://flylib.com/books/en/3.126.1.73/1/

el código fuente para la recogida de entropía está aquí: http://www.opensource.apple.com/source/securityd/securityd-40600/src/entropy.cpp

En el búfer entropía del núcleo xnu-1504.9.37 (última versión para OS X como de la escritura) se rellena en kernel_debug_internal(), usando solo información de tiempo. Este es el único lugar donde se escribe el búfer de entropía.

if (entropy_flag && (kdebug_enable & KDEBUG_ENABLE_ENTROPY)) { 
    if (kd_entropy_indx < kd_entropy_count) { 
     kd_entropy_buffer [ kd_entropy_indx] = mach_absolute_time(); 
     kd_entropy_indx++; 
    } 

    if (kd_entropy_indx == kd_entropy_count) { 
     /* 
     * Disable entropy collection 
     */ 
     kdebug_enable &= ~KDEBUG_ENABLE_ENTROPY; 
     kdebug_slowcheck &= ~SLOW_ENTROPY; 
    } 
} 
+0

¡Gracias! Estoy luchando para encontrar la implementación kernel 'syscall' que realmente recolecta la entropía en iOS: tengo la versión xnu kernel (1504.9.37) para el último OS X, pero no puedo encontrar qué versión (si es incluso fuente abierta) ? - pero presumiblemente debe ser) que usa iOS? – James

+0

Edité su respuesta para agregar mis hallazgos de XNU-1504.9.37 :) – James

+0

http://www.opensource.apple.com/source/xnu/xnu-1504.9.37/bsd/kern/kdebug.c – jm666

1

El SDK de iOS indica claramente que esta función utiliza la salida /dev/random para recuperar los datos aleatorios seguros. Como iOS es una versión portada de OSX que está en su núcleo un Free-BSD.

Si pesquisa para /dev/random y OSX se encuentran varios puestos que hubo (y mi ser es) un problema con respecto a la colección entropía en OSX:

http://www.mail-archive.com/[email protected]/msg00620.html

Por tanto, yo esperaría que /dev/random no funciona mejor que el de OSX.

+1

Interesante para leer acerca de/dev/random en OS X, sin embargo, agrega algunas dudas! – James

4
  1. De acuerdo con la iOS documentation, SecRandomCopyBytes es sólo un envoltorio para la /dev/random PRNG. En la mayoría de las implementaciones de Unix, este archivo es un PRNG de bloqueo; sin embargo, según this page y the documentation, /dev/random en OSX/iOS realmente funciona como /dev/urandom en la mayoría de las otras implementaciones de Unix, ya que nunca se bloquea.

  2. Dado que no bloquea, debe poder determinar rápidamente la frecuencia con la que genera números aleatorios con una simple prueba.

  3. Se supone que /dev/random intenta obtener entropía de tantas fuentes como sea posible. Por lo tanto, es completamente razonable creer que en iOS utiliza la radio y el acelerómetro como fuentes de entropía; sin embargo, no puedo encontrar ninguna fuente para esto, y el documentation solo indica que proviene de "las medidas de fluctuación aleatoria aleatoria del kernel".

  4. Parece que el iPhone es actualmente in the process de ser validado por FIPS 140-2.

Cuestiones relacionadas