Vlákno názorů k článku Generátor náhodných čísel založený na instrukcích RDSEED a RDRAND od My name: - Tu sú vecné/logické chyby a nepresnosti v texte...

  • Článek je starý, nové názory již nelze přidávat.
  • 14. 8. 2025 0:12

    My name:

    Tu sú vecné/logické chyby a nepresnosti v texte (stručne, podľa tém):

    1. Popletené príznaky CPU

    Autor dvakrát nazýva CF „príznakom pretečenia“. CF je carry flag, pretečenie je OF. To je faktická chyba pri popise stavových príznakov x86.

    2. Správanie RDRAND pri zlyhaní

    Text tvrdí, že „ak inštrukcia neprebehne, register sa vynuluje a CF=0“. Architektúra x86 uvádza: CF=0 znamená, že sa nevrátila platná hodnota; obsah cieľového registra je nedefinovaný (nie garantovane nulový).

    Ak procesor inštrukciu nepodporuje, nedeje sa „vynulovanie“ – vyvolá sa #UD (invalid opcode). Preto je zle miešať „neúspech kvôli nedostupným dátam“ s „nepodporovanou inštrukciou“.

    3. Mylné tvrdenie o „reštarte po 511 cykloch“

    Pasáž „generátor je vždy po maximálne 511 cykloch reštartovaný“ je nesprávna. Intel DRNG používa CTR-DRBG, ktorý sa periodicky reseeduje podľa počtu vygenerovaných hodnôt, nie „taktovacích cyklov CPU“. Číslo 511/512 sa vzťahuje na počet výstupov (blokov) medzi reseedmi, nie cykly.

    4. „Jediný senzor tepelného šumu“ a „zdieľanie medzi všetkými jadrami“

    Text kategoricky tvrdí, že je k dispozícii iba jediný senzor a ten sa delí medzi všetky jadrá, preto je RDSEED „pomalý“. Intel dokumentácia popisuje viacstupňový hardvérový entropický reťazec a kondicionovanie; implementačné detaily (počet senzorov, per-core/per-package) nie sú takto zjednodušene garantované. Toto je prinajmenšom nepodložené zovšeobecnenie.

    5. „RDSEED vracia skutočne náhodné bity“

    Presnejšie: RDSEED vracia kondicionované full-entropy (FIPS/NIST) bity z hardvérového zdroja (po prechode cez kondicionér). Nazývať to bez kvalifikácie „skutočne náhodné“ je terminologicky nepresné; ide o výstup po kryptografickom spracovaní entropie.

    6. Detekcia a reakcia na nepodporované inštrukcie

    Časť o CPUID je OK (RDRAND = leaf 1 ECX bit 30), ale text neskôr naznačuje, že „ak nie je podporovaná“, jednoducho sa vráti nula/CF=0. Správne: ak sa pokúsite vykonať nepodporovanú inštrukciu bez kontroly CPUID, dostanete #UD.

    7. GCC builtins a prepínače

    Autor tvrdí, že je nutné -mrdrnd, inak builtins neexistujú. V praxi stačí aj -march=… s RDRAND (alebo cieľ so zahrnutou inštrukciou); -mrdrnd je jedna z ciest, nie jediná. Formulácia je príliš kategorická.

    8. Nesúlad „sekvencia bude vždy iná“

    „Prakticky isté, že nikdy nezískate rovnakú sekvenciu“ je prehnané. Pravdepodobnosť duplicity je zanedbateľná, nie nulová. Ide o logické zveličenie.

    9. Nesúlad názvov/typos

    Viackrát sa objaví preklep RDRND namiesto RDRAND.

    V kap. 16 sa testuje súbor random.bit, no predtým sa generoval random.bin. To je nekonzistentné.

    10. Chyby/nekorektnosti v ukážkovej ASM

    id_string: resb 8, no následne sa ukladá 12 bajtov (EBX, EDX, ECX) a tlačí sa 12 znakov buffer overflow.

    V poznámkach sa CF opäť volá „príznak pretečenia“.

    V časti s LOOP je síce upozornené na modifikáciu ECX a použitie push/pop, to je správne; inak OK.

    11. Kódovanie inštrukcie a tabuľka

    Tabuľka uvádza „NFx 0F C7 /6“ – označenie NFx nie je štandardná notácia; nepôsobí ako vecná chyba, ale mätie.

    12. Zámena „assembler“ vs. „vyššie jazyky“ pri RDRAND/privilegiách

    Veta „ak je podporovaná, malo by byť volanie úspešné (nevyžaduje privilégiá)“ je správna, ale následné zovšeobecnenie, že „ak prebehne v poriadku, CF=1; v opačnom prípade register vynulovaný“ je (opäť) nesprávne – viď body 2 a 3.

    13. Randomness testy – interpretácia

    Uvádza sa, že neprešiel iba random_excursi­on_test. SP 800-22 má známe limity a výsledky sa môžu podstatne líšiť podľa implementácie, veľkosti vzorky a endianity; autor to berie ako definitívny verdikt bez diskusie o parametroch (napr. --be prepínač, veľkosť okna), čo je metodologicky slabé.

    Porovnanie s xorshift32 je korektné, ale „horšie (podľa očakávania)“ bez kvantifikácie a diskusie o špecifikách testov je zjednodušené.

    Zhrnutie najdôležitejších faktických chýb:

    CF ≠ overflow flag (zásadná chyba).

    Pri CF=0 je hodnota nedefinovaná, nie nulová; nepodpora #UD.

    „511 cyklov“ je nesprávne; reseed sa viaže na počet výstupov, nie CPU cykly.

    ASM ukážka prepisuje 12 bajtov do 8-bajtového bufferu.

    Zovšeobecnenie o „jedinom senzore“ a absolútne tvrdenia o „skutočne náhodnom“ sú nepresné.

    Ináč skvelý článok :-)

  • 14. 8. 2025 8:55

    Pavel Tišnovský
    Zlatý podporovatel

    díky za feedback, zkusím to upravit

    Jinak RDRAND ovšem, pokud není připravený, nuluje výstupní registr.

  • 14. 8. 2025 9:09

    Pavel Tišnovský
    Zlatý podporovatel

    tak snad je většina opravena. Jinak tedy po XX letech práce v assembleru nazývat CF příznakem přetečení - to nevím na co jsem včera myslel :/ Asi za to může těch 30 stupňů v pokoji, jinak nevím, taková minela.

  • 14. 8. 2025 9:24

    cc

    NFx není nestandardní, je to jen nová notace, kterou intel začal používat.

    Příklad:

    NFx REX.W + 0F C7 /6 RDRAND r64

    V podstatě to říká, že tato instrukce nepoužívá F2/F3 prefix. Při použití toho prefixu buď #UD a nebo to bude jiná instrukce. Hold dochází instrukce a je potřeba definovat co se ještě dá použít a co už ne :)

    Stejně tak třeba NP (no-prefix), atd...

  • 14. 8. 2025 22:45

    atarist

    "„Prakticky isté, že nikdy nezískate rovnakú sekvenciu“ je prehnané. Pravdepodobnosť duplicity je zanedbateľná, nie nulová. Ide o logické zveličenie." - no on se generuje 256 bitovej seed. Takze dokonce by se dalo rict: je to prakticky jiste, mnohem (MNOHEM, o 2^128 vice) jistejsi, nez ze dostanete dva stejny UUID (o kterych se predpoklada, ze kolize prakticky nenastanou). Ja chapu slovo "prakticky jiste" jako ze s tim urcite neni zapotrebi pocitat.

  • 16. 8. 2025 7:46

    Noris

    Která AI to vygenerovala?