¿Qué tan bueno es SecRandomCopyBytes?

Estoy principalmente interesado en la implementación de SecRandomCopyBytes en iOS , si difiere de la implementación de OS X. (Supongo que sí, ya que un dispositivo mobile tiene cada vez más fonts de entropía disponibles que una computadora de escritorio).

¿Alguien tiene información sobre:

  1. ¿De dónde se extrae la entropía SecRandomCopyBytes?
  2. ¿Qué velocidad puede generar buenos numbers aleatorios?
  3. ¿Bloqueará o fallará de inmediato si no hay suficiente entropía disponible?
  4. ¿Cumple FIPS 140-2 o ha sido incluido en cualquier otra certificación oficial?

La documentation no cubre estos puntos.

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

/ dev / random se alimenta de la entropía del SecurityServer. SecurityServer que recoge la entropía del seguimiento del evento del kernel (kdebug). El método se describe en el libro "Mac OS X Internals. A Systems Approach". Puede leerlo en línea, por ejemplo, en http://flylib.com/books/en/3.126.1.73/1/

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

En xnu-1504.9.37 (última versión para OS X como date de escritura), el búfer de entropía del kernel se rellena en kernel_debug_internal() , usando solo información de time. 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; } } 
  1. De acuerdo con la documentation de iOS , SecRandomCopyBytes es solo un contenedor para el /dev/random PRNG. En la mayoría de las implementaciones de Unix, este file es un PRNG de locking; sin embargo, de acuerdo con esta página y la documentation , /dev/random en OSX / iOS realmente funciona como /dev/urandom en la mayoría de las otras implementaciones de Unix, ya que nunca bloquea.

  2. Dado que no bloquea, debería poder determinar rápidamente la velocidad con la que genera numbers aleatorios mediante una testing simple.

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

  4. Parece que el iPhone está actualmente en process de ser validado por FIPS 140-2.

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

Si busca /dev/random y OSX, encuentra varias publicaciones que tenían (y que son) un problema con respecto a la colección de entropía en OSX:

http://www.mail-archive.com/cryptography@metzdowd.com/msg00620.html

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