====== NativeCryptoProvider ====== **Namespace:** ''WvdS.System.Security.Cryptography.Providers'' P/Invoke-basierter Krypto-Provider für Server und Desktop-Anwendungen. Kommuniziert direkt mit OpenSSL 3.6 über Platform Invocation Services. ===== Übersicht ===== Der ''NativeCryptoProvider'' ist der Standard-Provider für: * Blazor Server * ASP.NET Core * Desktop-Anwendungen (Windows, Linux, macOS) * Konsolenanwendungen * Windows Services / Linux Daemons ===== Eigenschaften ===== ^ Eigenschaft ^ Typ ^ Beschreibung ^ | ''Name'' | string | ''%%"Native (P/Invoke)"%%'' | | ''IsAvailable'' | bool | ''true'' wenn OpenSSL 3.6 erreichbar | ===== Initialisierung ===== using WvdS.System.Security.Cryptography.Providers; // Provider erstellen var provider = new NativeCryptoProvider(); // Initialisieren (lädt OpenSSL) await provider.InitializeAsync(); // Prüfen ob verfügbar if (provider.IsAvailable) { Console.WriteLine($"Provider: {provider.Name}"); Console.WriteLine($"OpenSSL: {provider.GetOpenSslVersion()}"); } ===== ML-DSA Operationen ===== ==== GenerateMlDsaKeyPairAsync ==== Generiert ein ML-DSA Schlüsselpaar. var (publicKey, privateKey) = await provider.GenerateMlDsaKeyPairAsync("ML-DSA-65"); // Unterstützte Algorithmen: // - "ML-DSA-44" (NIST Level 1) // - "ML-DSA-65" (NIST Level 3, empfohlen) // - "ML-DSA-87" (NIST Level 5) ==== SignMlDsaAsync ==== Signiert Daten mit ML-DSA. byte[] data = Encoding.UTF8.GetBytes("Wichtige Daten"); byte[] signature = await provider.SignMlDsaAsync(data, privateKey); ==== VerifyMlDsaAsync ==== Verifiziert eine ML-DSA Signatur. bool isValid = await provider.VerifyMlDsaAsync(data, signature, publicKey); ===== ML-KEM Operationen ===== ==== GenerateMlKemKeyPairAsync ==== Generiert ein ML-KEM Schlüsselpaar. var (publicKey, privateKey) = await provider.GenerateMlKemKeyPairAsync("ML-KEM-768"); // Unterstützte Algorithmen: // - "ML-KEM-512" (NIST Level 1) // - "ML-KEM-768" (NIST Level 3, empfohlen) // - "ML-KEM-1024" (NIST Level 5) ==== EncapsulateAsync ==== Kapselt einen Shared Secret mit dem Public Key. var (sharedSecret, ciphertext) = await provider.EncapsulateAsync(recipientPublicKey); // sharedSecret: 32 Bytes symmetrischer Schlüssel // ciphertext: Zum Empfänger senden ==== DecapsulateAsync ==== Dekapselt den Shared Secret. byte[] sharedSecret = await provider.DecapsulateAsync(ciphertext, privateKey); ===== Zertifikat-Operationen ===== ==== CreateEphemeralCertificateAsync ==== Erstellt ein kurzlebiges ML-DSA Zertifikat. var (pubKey, privKey) = await provider.GenerateMlDsaKeyPairAsync(); byte[] certBytes = await provider.CreateEphemeralCertificateAsync( "CN=Ephemeral Test", TimeSpan.FromHours(24), privKey); var cert = new X509Certificate2(certBytes); ==== SignCertificateAsync ==== Signiert TBS-Zertifikatdaten mit ML-DSA. byte[] tbsCertificate = GetTbsCertificate(); byte[] signedCert = await provider.SignCertificateAsync(tbsCertificate, privateKey); ===== Methoden-Übersicht ===== ^ Methode ^ Parameter ^ Rückgabe ^ | ''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 | ===== OpenSSL-Pfad Konfiguration ===== // Vor InitializeAsync() den Pfad setzen CryptoConfig.OpenSslPath = @"C:\OpenSSL\bin"; var provider = new NativeCryptoProvider(); await provider.InitializeAsync(); **Standard-Suchpfade:** ^ Betriebssystem ^ Pfade ^ | Windows | ''%%.\%%'', ''%%C:\OpenSSL\bin%%'', ''%%PATH%%'' | | Linux | ''%%/usr/local/lib64%%'', ''%%/usr/lib/x86_64-linux-gnu%%'' | | macOS | ''%%/opt/homebrew/lib%%'', ''%%/usr/local/lib%%'' | ===== Performance-Hinweise ===== **P/Invoke Performance:** * Synchrone Ausführung im nativen Code * Task-Wrapper für API-Konsistenz mit WasmCryptoProvider * Minimaler Overhead durch direkten Speicherzugriff * Thread-sicher durch OpenSSL's interne Synchronisation ===== Vollständiges Beispiel ===== using WvdS.System.Security.Cryptography.Providers; // 1. Provider initialisieren 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 encapsulates für Bob var (aliceSecret, ciphertext) = await provider.EncapsulateAsync(bobPublic); // Bob decapsulates var bobSecret = await provider.DecapsulateAsync(ciphertext, bobPrivate); // Shared Secrets sind identisch Console.WriteLine($"Keys match: {aliceSecret.SequenceEqual(bobSecret)}"); // 3. ML-DSA Signatur var (sigPubKey, sigPrivKey) = await provider.GenerateMlDsaKeyPairAsync(); byte[] message = Encoding.UTF8.GetBytes("Wichtige Nachricht"); byte[] signature = await provider.SignMlDsaAsync(message, sigPrivKey); bool isValid = await provider.VerifyMlDsaAsync(message, signature, sigPubKey); Console.WriteLine($"Signature valid: {isValid}"); ===== Sicherheitshinweise ===== * Erfordert OpenSSL 3.6.0 oder höher mit PQ-Algorithmen * Private Keys werden im Prozessspeicher gehalten * Bei Anwendungsende werden Keys nicht automatisch gelöscht * Für höchste Sicherheit: Keys explizit mit ''CryptographicOperations.ZeroMemory'' löschen ===== Siehe auch ===== * [[.: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//