RSA-Signaturen nach PKCS#1 v1.5 mit SHA-256 — gedacht für das Signieren von JWTs gegenüber Cloud-Diensten (std.cloud.gcp nutzt sie für Google-Service-Account-Schlüssel).
Diese Unit ist die einzige Krypto-Unit mit einer externen Abhängigkeit. Sie bindetlibcrypto.so.3(OpenSSL 3) per FFI ein und bricht damit dasZero-External-Dependencies-Prinzip der übrigen Standardbibliothek. Ohne installiertes OpenSSL 3 lässt sich ein Programm, das sie importiert, nicht ausführen.
Wo es geht, die eigenen Implementierungen vorziehen:std.crypto.ecc(ECDSA secp256k1),std.crypto.x25519oderstd.crypto.pqc.mldsa. RSA ist hier, weil Gegenstellen es verlangen — nicht, weil es die bessere Wahl wäre.
Autor: Andreas Röne
Copyright: 2024-2026 Andreas Röne
→ std.crypto · std.cloud.gcp · Standard Library
| Signatur | Beschreibung |
|---|---|
RSAKeyLoad(pem: int64, pemLen: int64): int64 | Privaten Schlüssel aus PEM-Bytes laden. Liefert einen Schlüssel-Handle (EVP_PKEY*) oder 0 bei Fehler. pemLen = -1 für nullterminierte Eingabe |
RSAKeyBits(key: int64): int64 | Schlüssellänge in Bit (2048, 4096, …); 0 bei ungültigem Handle |
RSASign(key, data, dataLen, sig, sigLenOut): int64 | Signiert dataLen Bytes ab data. sig muss RSAKeyBits(key)/8 Bytes fassen; sigLenOut zeigt auf ein int64, das die tatsächliche Signaturlänge aufnimmt. Liefert 1 bei Erfolg, 0 sonst |
RSAKeyFree(key: int64) | Schlüssel freigeben |
import std.io;
import std.fs;
import std.crypto.rsa;
fn main(): int64 {
var pem: pchar := alloc(4096) as pchar;
var pemLen: int64 := ReadFile("service-account.pem"c, pem, 4095);
var key: int64 := RSAKeyLoad(pem as int64, pemLen);
if (key == 0) {
PrintLn("Schluessel konnte nicht geladen werden");
return 1;
}
var bits: int64 := RSAKeyBits(key);
var sig: int64 := alloc(bits / 8);
var lenOut: int64 := alloc(8);
var daten: pchar := "der zu signierende Text"c;
if (RSASign(key, daten as int64, 23, sig, lenOut) == 1) {
PrintLn(IntToStr(peek64(lenOut))); // Signaturlaenge in Bytes
}
RSAKeyFree(key);
return 0;
}
RSAVerify-Gegenstelle gibt es nicht — die Unit ist auf den Client-Fall zugeschnitten, in dem man selbst signiert und die Gegenseite prüft.RSAKeyLoad liest über PEM_read_bio_PrivateKey; öffentliche Schlüssel und Zertifikate werden nicht geladen.0 übergeben, ein verschlüsselter Schlüssel liefert also 0.Letzte Aktualisierung: 2026-08-11