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.
→ std.crypto Paket · std.crypto.rand · 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:
outmuss 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 → std.hash (Argon2id).
- Vergleich: Digests immer mit konstantzeitlichem Vergleich prüfen, nicht mit direktem Byte-Vergleich (Timing-Angriffe).
Letzte Aktualisierung: 2026-06-05
