Les fonctions CPU RDRAND et RDSEED sont désormais disponibles

Bonjour Ă  tous!

Je ne fais pas moi-mĂȘme de cryptographie, mais mes petites recherches peuvent trĂšs bien ĂȘtre utiles. J'ai dĂ©cidĂ© de m'occuper des fonctions de processeur intĂ©grĂ©es RDRAND et RDSEED. Le compilateur Delphi a dĂ©clarĂ© un identificateur non dĂ©clarĂ©. Hmm BMI, BMI2, AVX, AVX2 et mĂȘme AVX-512 existent depuis longtemps et Delphians a optĂ© pour SSE4.2. Peu importe. Nous compilons le code nous-mĂȘmes.

J'ai d'abord vérifié le support de ces fonctions par le processeur. Bien sûr, CPUID. Vous pouvez utiliser CPUID à partir des premiers processeurs Pentium. J'espÚre que personne ne pense à exécuter CPUID sur une machine 486, car il n'y est pas encore. Soit dit en passant, les processeurs RDRAND et RDSEED avant IvyBridge n'existent pas non plus.

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; 

Il s'est avĂ©rĂ© que mon Core i7 G6950X Extreme prend en charge ces fonctionnalitĂ©s. Alors j'ai dĂ©cidĂ© de compiler le bytecode manuellement. Pour les expĂ©rimentĂ©s je donnerai les prĂ©fixes REX et REX.W. Vous voudrez peut-ĂȘtre Ă©crire le rĂ©sultat dans un registre diffĂ©rent:

 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) 

Les fonctions peuvent fonctionner Ă  la fois en mode 32 bits et en mode 64 bits. Par consĂ©quent, j'ai fait les deux, et mĂȘme en deux versions. Le rĂ©sultat est 4 fonctions:

 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; 

Leur vitesse est plus lente que la fonction de bibliothĂšque Random. RDRand est d'environ 35% et RDSeed est de 50% ou plus, mais la qualitĂ© de l'unicitĂ© des valeurs gĂ©nĂ©rĂ©es est beaucoup plus Ă©levĂ©e. Il existe de bons articles Ă  ce sujet sur cette ressource, mais ma mission (rendre les fonctions disponibles dans Delphi) est terminĂ©e. Je ne l'ai pas testĂ© dans Lazarus, mais cela fonctionnera trĂšs probablement sans aucun changement. À la fin de la dĂ©claration de fonction, il vous suffit d'ajouter l'assembleur de mots de sauvegarde.

Voici le code source de l'application console de test. Vous y trouverez un prototype des fonctions Random32 et Random64 basĂ© sur le processeur intĂ©grĂ©. C'est peut-ĂȘtre ce que vous cherchiez. Salut tout le monde!

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


All Articles