Inhaltsverzeichnis

NativeCryptoProvider

Namespace: WvdS.System.Security.Cryptography.Providers

Provider crittografico basato su P/Invoke per applicazioni Server e Desktop. Comunica direttamente con OpenSSL 3.6 tramite Platform Invocation Services.

Panoramica

Il NativeCryptoProvider e il provider predefinito per:

Proprieta

Proprieta Tipo Descrizione
Name string "Native (P/Invoke)"
IsAvailable bool true se OpenSSL 3.6 e raggiungibile

Inizializzazione

using WvdS.System.Security.Cryptography.Providers;
 
// Creare provider
var provider = new NativeCryptoProvider();
 
// Inizializzare (carica OpenSSL)
await provider.InitializeAsync();
 
// Verificare disponibilita
if (provider.IsAvailable)
{
    Console.WriteLine($"Provider: {provider.Name}");
    Console.WriteLine($"OpenSSL: {provider.GetOpenSslVersion()}");
}

Operazioni ML-DSA

GenerateMlDsaKeyPairAsync

Genera una coppia di chiavi ML-DSA.

var (publicKey, privateKey) = await provider.GenerateMlDsaKeyPairAsync("ML-DSA-65");
 
// Algoritmi supportati:
// - "ML-DSA-44" (NIST Level 1)
// - "ML-DSA-65" (NIST Level 3, raccomandato)
// - "ML-DSA-87" (NIST Level 5)

SignMlDsaAsync

Firma dati con ML-DSA.

byte[] data = Encoding.UTF8.GetBytes("Dati importanti");
byte[] signature = await provider.SignMlDsaAsync(data, privateKey);

VerifyMlDsaAsync

Verifica una firma ML-DSA.

bool isValid = await provider.VerifyMlDsaAsync(data, signature, publicKey);

Operazioni ML-KEM

GenerateMlKemKeyPairAsync

Genera una coppia di chiavi ML-KEM.

var (publicKey, privateKey) = await provider.GenerateMlKemKeyPairAsync("ML-KEM-768");
 
// Algoritmi supportati:
// - "ML-KEM-512" (NIST Level 1)
// - "ML-KEM-768" (NIST Level 3, raccomandato)
// - "ML-KEM-1024" (NIST Level 5)

EncapsulateAsync

Incapsula un Shared Secret con la chiave pubblica.

var (sharedSecret, ciphertext) = await provider.EncapsulateAsync(recipientPublicKey);
 
// sharedSecret: 32 Bytes chiave simmetrica
// ciphertext: Da inviare al destinatario

DecapsulateAsync

Decapsula il Shared Secret.

byte[] sharedSecret = await provider.DecapsulateAsync(ciphertext, privateKey);

Operazioni certificati

CreateEphemeralCertificateAsync

Crea un certificato ML-DSA effimero.

var (pubKey, privKey) = await provider.GenerateMlDsaKeyPairAsync();
 
byte[] certBytes = await provider.CreateEphemeralCertificateAsync(
    "CN=Ephemeral Test",
    TimeSpan.FromHours(24),
    privKey);
 
var cert = new X509Certificate2(certBytes);

SignCertificateAsync

Firma dati TBS del certificato con ML-DSA.

byte[] tbsCertificate = GetTbsCertificate();
byte[] signedCert = await provider.SignCertificateAsync(tbsCertificate, privateKey);

Panoramica metodi

Metodo Parametri Ritorno
InitializeAsync() - Task
GetOpenSslVersion() - string
GenerateMlDsaKeyPairAsync string algorithm Task<(byte[], byte[])>
SignMlDsaAsync byte[] data, byte[] privateKey Task<byte[]>
VerifyMlDsaAsync byte[] data, byte[] signature, byte[] publicKey Task<bool>
GenerateMlKemKeyPairAsync string algorithm Task<(byte[], byte[])>
EncapsulateAsync byte[] publicKey Task<(byte[], byte[])>
DecapsulateAsync byte[] ciphertext, byte[] privateKey Task<byte[]>
CreateEphemeralCertificateAsync string subject, TimeSpan validity, byte[] privateKey Task<byte[]>
SignCertificateAsync byte[] tbsCertificate, byte[] privateKey Task<byte[]>

Configurazione percorso OpenSSL

// Impostare il percorso prima di InitializeAsync()
CryptoConfig.OpenSslPath = @"C:\OpenSSL\bin";
 
var provider = new NativeCryptoProvider();
await provider.InitializeAsync();

Percorsi di ricerca predefiniti:

Sistema operativo Percorsi
Windows .\, C:\OpenSSL\bin, PATH
Linux /usr/local/lib64, /usr/lib/x86_64-linux-gnu
macOS /opt/homebrew/lib, /usr/local/lib

Note sulle prestazioni

Prestazioni P/Invoke:
  • Esecuzione sincrona nel codice nativo
  • Wrapper Task per coerenza API con WasmCryptoProvider
  • Overhead minimo grazie all'accesso diretto alla memoria
  • Thread-safe grazie alla sincronizzazione interna di OpenSSL

Esempio completo

using WvdS.System.Security.Cryptography.Providers;
 
// 1. Inizializzare provider
var provider = new NativeCryptoProvider();
await provider.InitializeAsync();
 
Console.WriteLine($"OpenSSL: {provider.GetOpenSslVersion()}");
 
// 2. ML-KEM Key Exchange
var (alicePublic, alicePrivate) = await provider.GenerateMlKemKeyPairAsync();
var (bobPublic, bobPrivate) = await provider.GenerateMlKemKeyPairAsync();
 
// Alice incapsula per Bob
var (aliceSecret, ciphertext) = await provider.EncapsulateAsync(bobPublic);
 
// Bob decapsula
var bobSecret = await provider.DecapsulateAsync(ciphertext, bobPrivate);
 
// I Shared Secrets sono identici
Console.WriteLine($"Keys match: {aliceSecret.SequenceEqual(bobSecret)}");
 
// 3. Firma ML-DSA
var (sigPubKey, sigPrivKey) = await provider.GenerateMlDsaKeyPairAsync();
 
byte[] message = Encoding.UTF8.GetBytes("Messaggio importante");
byte[] signature = await provider.SignMlDsaAsync(message, sigPrivKey);
 
bool isValid = await provider.VerifyMlDsaAsync(message, signature, sigPubKey);
Console.WriteLine($"Signature valid: {isValid}");

Note di sicurezza

  • Richiede OpenSSL 3.6.0 o superiore con algoritmi PQ
  • Le chiavi private vengono mantenute nella memoria del processo
  • Le chiavi non vengono cancellate automaticamente alla chiusura dell'applicazione
  • Per massima sicurezza: cancellare le chiavi esplicitamente con CryptographicOperations.ZeroMemory

Vedi anche


Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional