RDRAND- und RDSEED-CPU-Funktionen jetzt verfügbar

Hallo allerseits!

Ich selbst mache keine Kryptographie, aber meine kleine Forschung kann sehr nützlich sein. Ich habe mich für die integrierten Prozessorfunktionen RDRAND und RDSEED entschieden. Der Delphi-Compiler hat eine nicht deklarierte Kennung angegeben. Hmm BMI, BMI2, AVX, AVX2 und sogar AVX-512 existieren seit langem, und die Delphianer entschieden sich für SSE4.2. Es spielt keine Rolle. Wir kompilieren den Code selbst.

Zuerst habe ich überprüft, ob diese Funktionen vom Prozessor unterstützt werden. Natürlich CPUID. Sie können die CPUID ab den ersten Pentium-Prozessoren verwenden. Ich hoffe, niemand denkt daran, CPUID auf einem 486-Computer auszuführen, da es noch nicht vorhanden war. RDRAND und RDSEED vor IvyBridge-Prozessoren existieren übrigens auch nicht.

function CPU_support_RDRAND: Boolean; asm mov rax, $01 cpuid test ecx, 40000000h // 30-  setne al end; function CPU_support_RDSEED: Boolean; asm mov rcx, 0 mov rax, $07 // №7 cpuid test ebx, 40000h // 18-  setne al end; 

Es stellte sich heraus, dass mein Core i7 G6950X Extreme diese Funktionen unterstützt. Also habe ich beschlossen, den Bytecode manuell zu kompilieren. Für erfahrene werde ich den Code REX und REX.W Präfixe geben. Möglicherweise möchten Sie das Ergebnis in ein anderes Register schreiben:

 const REX_RDRAND32: Byte = $F0; //(11b:REG, 110b:OPCODE, 000b:EAX) REX_RDSEED32: Byte = $F8; //(11b:REG, 111b:OPCODE, 000b:EAX) REX_W_RDRAND64: Byte = $48; //(11b:REG, 110b:OPCODE, 000b:RAX) REX_W_RDSEED64: Byte = $48; //(11b:REG, 111b:OPCODE, 000b:RAX) 

Funktionen können sowohl im 32-Bit-Modus als auch im 64-Bit-Modus ausgeführt werden. Deshalb habe ich beides gemacht und sogar in zwei Versionen. Das Ergebnis sind 4 Funktionen:

 function RDRand32: DWord; asm @Retry: db $0F, $C7, $F0 //RDRAND EAX (CF = 1    ) jnc @Retry end; function RDSeed32: DWord; asm @Retry: db $0F, $C7, $F8 //RDSEED EAX (CF = 1    ) jnc @Retry end; function RDRand64: QWord; asm .NOFRAME @Retry: db $48, $0F, $C7, $F0 //RDRAND RAX (CF = 1    ) jnc @Retry end; function RDSeed64: QWord; asm .NOFRAME @Retry: db $48, $0F, $C7, $F8 //RDSEED RAX (CF = 1    ) jnc @Retry end; 

Sie sind langsamer als die Bibliotheksfunktion Random. RDRand beträgt ungefähr 35% und RDSeed 50% oder mehr, aber die Qualität der Eindeutigkeit der generierten Werte ist viel höher. Diese Ressource enthält gute Artikel zu diesem Thema, aber meine Mission (Funktionen in Delphi verfügbar zu machen) wurde abgeschlossen. Ich habe es nicht in Lazarus getestet, aber es wird höchstwahrscheinlich ohne Änderungen funktionieren. Am Ende der Funktionsdeklaration müssen Sie nur den Sicherungswort-Assembler hinzufügen.

Hier ist der Quellcode für die Testkonsolenanwendung. Dort finden Sie einen Prototyp der Funktionen Random32 und Random64 basierend auf dem eingebauten Prozessor. Vielleicht haben Sie danach gesucht. Tschüss alle!

Source: https://habr.com/ru/post/de441392/


All Articles