====== NativeCryptoProvider ======
**Namespace:** ''WvdS.System.Security.Cryptography.Providers''
P/Invoke-osnovan kriptografski ponudnik za strežnike in namizne aplikacije. Komunicira neposredno z OpenSSL 3.6 preko Platform Invocation Services.
===== Pregled =====
''NativeCryptoProvider'' je privzeti ponudnik za:
* Blazor Server
* ASP.NET Core
* Namizne aplikacije (Windows, Linux, macOS)
* Konzolne aplikacije
* Windows Services / Linux Daemons
===== Lastnosti =====
^ Lastnost ^ Tip ^ Opis ^
| ''Name'' | string | ''%%"Native (P/Invoke)"%%'' |
| ''IsAvailable'' | bool | ''true'' če je OpenSSL 3.6 dosegljiv |
===== Inicializacija =====
using WvdS.System.Security.Cryptography.Providers;
// Ustvarjanje ponudnika
var provider = new NativeCryptoProvider();
// Inicializacija (naloži OpenSSL)
await provider.InitializeAsync();
// Preverjanje razpoložljivosti
if (provider.IsAvailable)
{
Console.WriteLine($"Ponudnik: {provider.Name}");
Console.WriteLine($"OpenSSL: {provider.GetOpenSslVersion()}");
}
===== Operacije ML-DSA =====
==== GenerateMlDsaKeyPairAsync ====
Generira ML-DSA par ključev.
var (publicKey, privateKey) = await provider.GenerateMlDsaKeyPairAsync("ML-DSA-65");
// Podprti algoritmi:
// - "ML-DSA-44" (NIST Level 1)
// - "ML-DSA-65" (NIST Level 3, priporočeno)
// - "ML-DSA-87" (NIST Level 5)
==== SignMlDsaAsync ====
Podpiše podatke z ML-DSA.
byte[] data = Encoding.UTF8.GetBytes("Pomembni podatki");
byte[] signature = await provider.SignMlDsaAsync(data, privateKey);
==== VerifyMlDsaAsync ====
Preveri ML-DSA podpis.
bool isValid = await provider.VerifyMlDsaAsync(data, signature, publicKey);
===== Operacije ML-KEM =====
==== GenerateMlKemKeyPairAsync ====
Generira ML-KEM par ključev.
var (publicKey, privateKey) = await provider.GenerateMlKemKeyPairAsync("ML-KEM-768");
// Podprti algoritmi:
// - "ML-KEM-512" (NIST Level 1)
// - "ML-KEM-768" (NIST Level 3, priporočeno)
// - "ML-KEM-1024" (NIST Level 5)
==== EncapsulateAsync ====
Enkapsulira skupno skrivnost z javnim ključem.
var (sharedSecret, ciphertext) = await provider.EncapsulateAsync(recipientPublicKey);
// sharedSecret: 32 bajtov simetrični ključ
// ciphertext: Pošlji prejemniku
==== DecapsulateAsync ====
Dekapsulira skupno skrivnost.
byte[] sharedSecret = await provider.DecapsulateAsync(ciphertext, privateKey);
===== Operacije s certifikati =====
==== CreateEphemeralCertificateAsync ====
Ustvari kratkoživ ML-DSA certifikat.
var (pubKey, privKey) = await provider.GenerateMlDsaKeyPairAsync();
byte[] certBytes = await provider.CreateEphemeralCertificateAsync(
"CN=Efemerni test",
TimeSpan.FromHours(24),
privKey);
var cert = new X509Certificate2(certBytes);
==== SignCertificateAsync ====
Podpiše TBS-podatke certifikata z ML-DSA.
byte[] tbsCertificate = GetTbsCertificate();
byte[] signedCert = await provider.SignCertificateAsync(tbsCertificate, privateKey);
===== Pregled metod =====
^ Metoda ^ Parametri ^ Vrnjeno ^
| ''InitializeAsync()'' | - | Task |
| ''GetOpenSslVersion()'' | - | string |
| ''GenerateMlDsaKeyPairAsync'' | string algorithm | Task<(byte[], byte[])> |
| ''SignMlDsaAsync'' | byte[] data, byte[] privateKey | Task |
| ''VerifyMlDsaAsync'' | byte[] data, byte[] signature, byte[] publicKey | Task |
| ''GenerateMlKemKeyPairAsync'' | string algorithm | Task<(byte[], byte[])> |
| ''EncapsulateAsync'' | byte[] publicKey | Task<(byte[], byte[])> |
| ''DecapsulateAsync'' | byte[] ciphertext, byte[] privateKey | Task |
| ''CreateEphemeralCertificateAsync'' | string subject, TimeSpan validity, byte[] privateKey | Task |
| ''SignCertificateAsync'' | byte[] tbsCertificate, byte[] privateKey | Task |
===== Konfiguracija poti OpenSSL =====
// Pred InitializeAsync() nastavite pot
CryptoConfig.OpenSslPath = @"C:\OpenSSL\bin";
var provider = new NativeCryptoProvider();
await provider.InitializeAsync();
**Privzete iskalne poti:**
^ Operacijski sistem ^ Poti ^
| Windows | ''%%.\%%'', ''%%C:\OpenSSL\bin%%'', ''%%PATH%%'' |
| Linux | ''%%/usr/local/lib64%%'', ''%%/usr/lib/x86_64-linux-gnu%%'' |
| macOS | ''%%/opt/homebrew/lib%%'', ''%%/usr/local/lib%%'' |
===== Nasveti glede zmogljivosti =====
**Zmogljivost P/Invoke:**
* Sinhrona izvedba v izvorni kodi
* Task-ovoj za konsistenco API-ja z WasmCryptoProvider
* Minimalni stroški zaradi neposrednega dostopa do pomnilnika
* Nitno-varno preko notranje sinhronizacije OpenSSL
===== Popoln primer =====
using WvdS.System.Security.Cryptography.Providers;
// 1. Inicializacija ponudnika
var provider = new NativeCryptoProvider();
await provider.InitializeAsync();
Console.WriteLine($"OpenSSL: {provider.GetOpenSslVersion()}");
// 2. ML-KEM izmenjava ključev
var (alicePublic, alicePrivate) = await provider.GenerateMlKemKeyPairAsync();
var (bobPublic, bobPrivate) = await provider.GenerateMlKemKeyPairAsync();
// Alice enkapsulira za Boba
var (aliceSecret, ciphertext) = await provider.EncapsulateAsync(bobPublic);
// Bob dekapsulira
var bobSecret = await provider.DecapsulateAsync(ciphertext, bobPrivate);
// Skupni skrivnosti sta enaki
Console.WriteLine($"Ključi se ujemajo: {aliceSecret.SequenceEqual(bobSecret)}");
// 3. ML-DSA podpis
var (sigPubKey, sigPrivKey) = await provider.GenerateMlDsaKeyPairAsync();
byte[] message = Encoding.UTF8.GetBytes("Pomembno sporočilo");
byte[] signature = await provider.SignMlDsaAsync(message, sigPrivKey);
bool isValid = await provider.VerifyMlDsaAsync(message, signature, sigPubKey);
Console.WriteLine($"Podpis veljaven: {isValid}");
===== Varnostni nasveti =====
* Zahteva OpenSSL 3.6.0 ali novejši s PQ-algoritmi
* Zasebni ključi so shranjeni v pomnilniku procesa
* Ob koncu aplikacije ključi niso samodejno izbrisani
* Za najvišjo varnost: Ključe eksplicitno izbrišite s ''CryptographicOperations.ZeroMemory''
===== Glej tudi =====
* [[.:start|Providers Namespace]]
* [[.:icryptoprovider|ICryptoProvider]]
* [[.:wasmcryptoprovider|WasmCryptoProvider]]
* [[.:cryptoproviderfactory|CryptoProviderFactory]]
* [[..:interop:opensslinterop|OpenSslInterop]]
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//