====== WasmCryptoProvider ======
**Namespace:** ''WvdS.System.Security.Cryptography.Providers''
JavaScript Interop-basierter Krypto-Provider für Blazor WebAssembly. Kommuniziert über ''IJSRuntime'' mit ''openssl.wasm''.
===== Übersicht =====
Der ''WasmCryptoProvider'' ermöglicht Post-Quantum Kryptographie in Blazor WebAssembly Anwendungen durch:
* JavaScript Interop zu WebAssembly-kompiliertem OpenSSL
* Vollständig asynchrone API (erforderlich für JS Interop)
* Identische Funktionalität wie ''NativeCryptoProvider''
===== Architektur =====
Blazor WebAssembly
│
▼
┌─────────────────┐
│ WasmCrypto- │
│ Provider │
│ (C#) │
└────────┬────────┘
│ IJSRuntime.InvokeAsync
▼
┌─────────────────┐
│ wvds-crypto.js │
│ (JavaScript) │
└────────┬────────┘
│
▼
┌─────────────────┐
│ openssl.wasm │
│ (WebAssembly) │
└─────────────────┘
===== Eigenschaften =====
^ Eigenschaft ^ Typ ^ Beschreibung ^
| ''Name'' | string | ''%%"WASM (JS Interop)"%%'' |
| ''IsAvailable'' | bool | ''true'' wenn initialisiert |
===== Dependency Injection =====
// Program.cs (Blazor WebAssembly)
builder.Services.AddScoped(sp =>
new WasmCryptoProvider(sp.GetRequiredService()));
===== Initialisierung =====
@inject ICryptoProvider CryptoProvider
@code {
protected override async Task OnInitializedAsync()
{
await CryptoProvider.InitializeAsync();
if (CryptoProvider.IsAvailable)
{
var version = CryptoProvider.GetOpenSslVersion();
Console.WriteLine($"OpenSSL WASM: {version}");
}
}
}
===== Erforderliche JS/WASM Dateien =====
In ''wwwroot/index.html'':
===== ML-DSA und ML-KEM =====
Die Methoden sind identisch mit ''NativeCryptoProvider'':
// ML-KEM
var (publicKey, privateKey) = await provider.GenerateMlKemKeyPairAsync("ML-KEM-768");
var (sharedSecret, ciphertext) = await provider.EncapsulateAsync(recipientPublicKey);
byte[] sharedSecret = await provider.DecapsulateAsync(ciphertext, privateKey);
// ML-DSA
var (sigPub, sigPriv) = await provider.GenerateMlDsaKeyPairAsync("ML-DSA-65");
byte[] signature = await provider.SignMlDsaAsync(data, sigPriv);
bool isValid = await provider.VerifyMlDsaAsync(data, signature, sigPub);
===== Zusätzliche WASM-spezifische Methoden =====
==== Key Derivation ====
^ Methode ^ Beschreibung ^
| ''Pbkdf2Async'' | PBKDF2 über Web Crypto API |
| ''Pbkdf2WithPqSaltAsync'' | PBKDF2 mit PQ-verstärktem Salt |
| ''Argon2idAsync'' | Memory-hard KDF via OpenSSL WASM |
| ''HkdfDeriveKeyAsync'' | HKDF Extract + Expand |
| ''DeriveHybridKeyAsync'' | Kombiniert klassisch + PQ Secret |
==== Stream/Chunked Encryption ====
^ Methode ^ Beschreibung ^
| ''EncryptChunkedAsync'' | Chunked AES-GCM Verschlüsselung |
| ''DecryptChunkedAsync'' | Chunked AES-GCM Entschlüsselung |
| ''EncryptStreamWithPqKeyAsync'' | ML-KEM + chunked Encryption |
| ''DecryptStreamWithPqKeyAsync'' | ML-KEM + chunked Decryption |
==== Utility ====
^ Methode ^ Beschreibung ^
| ''RandomBytesAsync'' | Kryptographisch sichere Zufallszahlen via Web Crypto API |
| ''CreateHybridSignatureAsync'' | Hybride Signatur erstellen |
| ''DeriveTls13KeysAsync'' | TLS 1.3 Key Schedule |
===== Sicherheitshinweise =====
* **Erfordert .NET 8.0+** mit Blazor WebAssembly
* Browser-Speicher ist weniger sicher als Server-Speicher
* Private Keys sollten nicht langfristig im Browser gespeichert werden
* Für sensible Operationen: Server-seitige Verarbeitung bevorzugen
* ''openssl.wasm'' und ''wvds-crypto.js'' müssen korrekt geladen sein
**Best Practices für Browser-Krypto:**
* Ephemere Keys für Session-basierte Verschlüsselung verwenden
* Sensible Private Keys auf Server belassen
* IndexedDB/localStorage nicht für unverschlüsselte Keys verwenden
* CSP-Header korrekt konfigurieren für WASM
===== Siehe auch =====
* [[.:start|Providers Namespace]]
* [[.:icryptoprovider|ICryptoProvider]]
* [[.:nativecryptoprovider|NativeCryptoProvider]]
* [[de:int:pqcrypt:developer:integration|Integration Guide]]
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//