====== WasmCryptoProvider ======
**Namespace:** ''WvdS.System.Security.Cryptography.Providers''
Provider crittografico basato su JavaScript Interop per Blazor WebAssembly. Comunica tramite ''IJSRuntime'' con ''openssl.wasm''.
===== Panoramica =====
Il ''WasmCryptoProvider'' abilita la crittografia post-quantum in applicazioni Blazor WebAssembly attraverso:
* JavaScript Interop verso OpenSSL compilato in WebAssembly
* API completamente asincrona (richiesta per JS Interop)
* Funzionalita identica a ''NativeCryptoProvider''
===== Architettura =====
Blazor WebAssembly
|
v
+-----------------+
| WasmCrypto- |
| Provider |
| (C#) |
+--------+--------+
| IJSRuntime.InvokeAsync
v
+-----------------+
| wvds-crypto.js |
| (JavaScript) |
+--------+--------+
|
v
+-----------------+
| openssl.wasm |
| (WebAssembly) |
+-----------------+
===== Proprieta =====
^ Proprieta ^ Tipo ^ Descrizione ^
| ''Name'' | string | ''%%"WASM (JS Interop)"%%'' |
| ''IsAvailable'' | bool | ''true'' se inizializzato |
===== Dependency Injection =====
// Program.cs (Blazor WebAssembly)
builder.Services.AddScoped(sp =>
new WasmCryptoProvider(sp.GetRequiredService()));
===== Inizializzazione =====
@inject ICryptoProvider CryptoProvider
@code {
protected override async Task OnInitializedAsync()
{
await CryptoProvider.InitializeAsync();
if (CryptoProvider.IsAvailable)
{
var version = CryptoProvider.GetOpenSslVersion();
Console.WriteLine($"OpenSSL WASM: {version}");
}
}
}
===== File JS/WASM richiesti =====
In ''wwwroot/index.html'':
===== ML-DSA e ML-KEM =====
I metodi sono identici a ''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);
===== Metodi aggiuntivi specifici WASM =====
==== Key Derivation ====
^ Metodo ^ Descrizione ^
| ''Pbkdf2Async'' | PBKDF2 via Web Crypto API |
| ''Pbkdf2WithPqSaltAsync'' | PBKDF2 con salt rafforzato PQ |
| ''Argon2idAsync'' | KDF memory-hard via OpenSSL WASM |
| ''HkdfDeriveKeyAsync'' | HKDF Extract + Expand |
| ''DeriveHybridKeyAsync'' | Combina secret classico + PQ |
==== Cifratura Stream/Chunked ====
^ Metodo ^ Descrizione ^
| ''EncryptChunkedAsync'' | Cifratura AES-GCM a chunk |
| ''DecryptChunkedAsync'' | Decifratura AES-GCM a chunk |
| ''EncryptStreamWithPqKeyAsync'' | ML-KEM + cifratura chunked |
| ''DecryptStreamWithPqKeyAsync'' | ML-KEM + decifratura chunked |
==== Utility ====
^ Metodo ^ Descrizione ^
| ''RandomBytesAsync'' | Numeri casuali crittograficamente sicuri via Web Crypto API |
| ''CreateHybridSignatureAsync'' | Creare firma ibrida |
| ''DeriveTls13KeysAsync'' | Key Schedule TLS 1.3 |
===== Note sulla sicurezza =====
* **Richiede .NET 8.0+** con Blazor WebAssembly
* La memoria del browser e meno sicura della memoria del server
* Le chiavi private non dovrebbero essere memorizzate a lungo termine nel browser
* Per operazioni sensibili: preferire elaborazione lato server
* ''openssl.wasm'' e ''wvds-crypto.js'' devono essere caricati correttamente
**Best Practice per crittografia nel browser:**
* Usare chiavi effimere per cifratura basata su sessione
* Mantenere chiavi private sensibili sul server
* Non usare IndexedDB/localStorage per chiavi non cifrate
* Configurare correttamente gli header CSP per WASM
===== Vedi anche =====
* [[.:start|Namespace Providers]]
* [[.:icryptoprovider|ICryptoProvider]]
* [[.:nativecryptoprovider|NativeCryptoProvider]]
* [[..:..:..:..:developer:integration|Guida all'integrazione]]
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//