====== 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//