====== std.crypto.sha256 — SHA-256 Hash ====== ''import std.crypto.sha256;'' SHA-256-Implementierung nach FIPS PUB 180-4 / RFC 6234. Gibt einen 32-Byte-Digest zurück. Keine externe Abhängigkeit, kein AES-NI oder SHA-NI — reine Lyx-Implementierung. → [[lyx_-_programmiersprache:units:crypto|std.crypto Paket]] · [[lyx_-_programmiersprache:units:crypto:rand|std.crypto.rand]] · [[lyx_-_programmiersprache:units:hash|std.hash]] ---- ===== Konstanten ===== Keine öffentlichen Konstanten. Der Digest ist immer 32 Bytes, der Hex-String immer 64 Zeichen + NUL (65 Bytes). ---- ===== Funktionen ===== ^ Funktion ^ Signatur ^ Beschreibung ^ | ''SHA256'' | ''(data: int64, len: int64, out: int64): void'' | Berechnet 32-Byte-Digest; schreibt ihn in ''out'' | | ''SHA256Hex'' | ''(data: int64, len: int64, out: int64): void'' | Wie SHA256, aber als 64-Zeichen Hex + NUL in ''out'' (65 Bytes) | | ''SHA256Str'' | ''(data: pchar, len: int64, out: int64): void'' | Convenience-Wrapper: ''pchar''-Eingabe statt ''int64'' | Alle drei Funktionen allozieren intern und geben keinen Fehlercode zurück — sie setzen voraus, dass ''out'' groß genug ist. ---- ===== Verwendung ===== ==== Einfacher Hash ==== import std.crypto.sha256; import std.alloc; import std.io; fn main(): int64 { var msg: pchar := "Hallo Welt"; var digest: int64 := alloc(32); SHA256(msg as int64, 10, digest); // Ausgabe als Hex var hex: int64 := alloc(65); SHA256Hex(msg as int64, 10, hex); PrintLn(hex as pchar); free(hex, 65); free(digest, 32); return 0; } ==== pchar-Wrapper ==== import std.crypto.sha256; import std.alloc; fn HashPassword(pw: pchar, pwLen: int64, outDigest: int64): void { SHA256Str(pw, pwLen, outDigest); } ==== Datei hashen (blockweise) ==== // SHA256 über mehrere Puffer: zweimal aufrufen geht NICHT direkt — // SHA256 ist ein One-Shot-Aufruf ohne Streaming-API. // Für große Daten: gesamten Inhalt in einen alloc-Puffer laden, dann SHA256 aufrufen. import std.crypto.sha256; import std.alloc; import std.fs; fn HashFile(path: pchar, outDigest: int64): int64 { var fd: int64 := OpenFile(path, 0); if (fd < 0) { return fd; } var size: int64 := FileSize(fd); if (size < 0) { CloseFile(fd); return size; } var buf: int64 := alloc(size); var r: int64 := ReadFile(fd, buf as pchar, size); CloseFile(fd); if (r < 0) { free(buf, size); return r; } SHA256(buf, size, outDigest); free(buf, size); return 0; } ---- ===== Hinweise ===== * **Kein Streaming**: SHA256 ist ein One-Shot-Aufruf. Für inkrementelle Verarbeitung muss der gesamte Input vorab im Speicher liegen. * **Puffergröße**: ''out'' muss mindestens 32 Bytes haben (SHA256), bzw. 65 Bytes (SHA256Hex inkl. NUL). * **Keine Hardware-Beschleunigung**: Diese Implementierung verwendet keine SHA-NI-Instruktionen. Für maximalen Durchsatz: externe optimierte Bibliothek via ''@extern''. * **Kryptografische Eignung**: SHA-256 ist kollisionsresistent und für digitale Signaturen geeignet. Für Passwort-Hashing → [[lyx_-_programmiersprache:units:hash|std.hash]] (Argon2id). * **Vergleich**: Digests immer mit konstantzeitlichem Vergleich prüfen, nicht mit direktem Byte-Vergleich (Timing-Angriffe). ---- Letzte Aktualisierung: 2026-06-05