2016-04-04 10 views
2

Linux und BSD bietet eine schöne Schnittstelle zum RNG vom Kernel verwendet werden:get_random_bytes() gleichwertig in Solaris

void get_random_bytes(void *buf, int nbytes); 

seit einem KMD kann nicht einfach eine Gerätedatei öffnen. Ich kann jedoch in Solaris 'Kernel functions for drivers nichts Ähnliches finden.

Wie soll ein Kernel-Modul in Solaris CS-Zufallszahlen erhalten (d. H. Diejenigen, die Sie in usermode von /dev/urandom erhalten)?

+1

Es gibt eine gute Diskussion von Solaris-Kernel Erzeugung von Zufallszahlen hier: https: //blogs.oracle.com/darren/entry/solaris_random_number_generation Der alte OpenSolaris Quellcode für die Kernelfunktionen 'random_get_pseudo_bytes()', 'random_get_bytes()' und 'random_get_blocking_bytes()' kann hier gefunden werden: http: // src .illumos.org/source/xref/illumos-tor/usr/src/uts/common/krypto/api/kcf_random.C# 1100 –

+0

@AndrewHenle Danke! Sehr hilfreich. – mtijanic

+0

@AndrewHenle Sie sollten Ihren Kommentar wahrscheinlich zu einer Antwort machen. – jlliagre

Antwort

2

Aufbauend auf meinen Kommentar oben, gibt es eine gute Diskussion von Solaris-Kernel Erzeugung von Zufallszahlen hier: https://blogs.oracle.com/darren/entry/solaris_random_number_generation

Es gibt einen einzigen Kernel-Modul (random) für die Implementierung sowohl die /dev/random und/dev/U-Geräte. Die beiden primären Einstiegspunkte sind rnd_read() und rnd_write() für die Wartung von read (2) und write (2) System Aufrufe jeweils.

rnd_read() ruft entweder kcf_rnd_get_bytes() oder kcf_rnd_get_pseudo_bytes(), je nach Geräteknoten welken ist eine Instanz von /dev/random oder/dev/urandom sind. Im FIPS-Modus, wenn /dev/random hat für nonblocking geöffnet liest (weder O_NBLOCK noch O_NDELAY gesetzt), wird der rnd_read Anruf fips_random_get_bytes() aufrufen Es gibt eine Obergrenze für die maximale Anzahl von Bytes, die in übertragen werden können ein einzelner Lesevorgang, MAXRETBYTES_RANDOM (1040) bzw. MAXRETBYTES_URANDOM (128 * 1040).

...

1,2 Schnittstelle im Kernel-Space

Der KCF-Modul eine API für Zufall in Kernel KCF Konsumenten zur Verfügung stellt. Es implementiert die oben genannten Funktionen, die genannt werden, um die Lese (2)/Schreib (2) -Aufrufe zu bedienen, und stellt außerdem die Schnittstellen für Kernel-Konsumenten bereit, um auf die Random- und Urandompools zuzugreifen.

und

5,0 Zufälligkeit zur Schlüsselerzeugung

für asymmetrische Schlüsselerzeugung innerhalb des Kernel eine spezielle random_get_nzero_bytes() API ist provided.It unterscheidet sich von random_get_bytes() in zwei Wege, ruft zuerst die random_get_bytes_fips140() -Funktion, die erst zurück, wenn alle FIPS 140-2 Initialisierung abgeschlossen ist. Die Funktion random_get_bytes() muss etwas früher verfügbar sein, da einige sehr frühe Kernel-Funktionen es benötigen (insbesondere das Einrichten des VM-Systems und wenn ZFS irgendwelche Schreibvorgänge als Teil des Mountens des Root-Dateisystems durchführen muss). Zweitens stellt es sicher, dass keine Bytes in der Ausgabe den Wert 0 haben, diese werden durch frisch extrahierte zusätzliche zufällige Bytes ersetzt, es wird fortgesetzt, bis die gesamte angeforderte Länge vollständig aus nicht null Bytes gemacht wird.

ein entsprechendes random_get_nzero_pseduo_bytes() ist auch für Fälle vorhanden waren wir in anderen zufälligen Sequenzen, wie Sitzungsschlüssel, Nonces und Cookies nicht 0 Byte wollen.

Die alte Quelle Opensolaris-Code für den Kernel-Funktionen random_get_pseudo_bytes(), random_get_bytes() und random_get_blocking_bytes() sind hier zu finden: http://src.illumos.org/source/xref/illumos-gate/usr/src/uts/common/crypto/api/kcf_random.c#1100