sgcWebSockets kan volledig zonder OpenSSL-bibliotheek draaien. Twee onafhankelijke instellingen maken dat mogelijk, en beide zijn gebouwd op de pure Pascal sgcCrypto-units, die vanaf de Standard-editie worden meegeleverd.
iohNativeTLS is een IOHandler-waarde. Deze vervangt OpenSSL voor de verbindingen van een component: TLS, QUIC en DTLS. Zie Native TLS.
sgcCryptoBackend is een runtimeschakelaar. Deze selecteert de backend van de applicatiecryptografie, alles wat geen verbinding is: hashes, handtekeningen, sleuteluitwisseling en certificaatverwerking.
Een applicatie die noch OpenSSL voor haar verbindingen, noch voor haar overige cryptografie nodig heeft, gebruikt beide.
De unit sgcBase_Helpers declareert de globale variabele sgcCryptoBackend van het type TsgcCryptoBackend:
cbOpenSSL (standaard): de applicatiecryptografie draait op OpenSSL, zoals in eerdere versies.
cbNative: deze draait op sgcCrypto en OpenSSL wordt er nooit voor geladen.
cbAuto: OpenSSL wordt gebruikt wanneer het kan worden geladen, sgcCrypto wanneer dat niet kan. De controle draait eenmalig en het resultaat wordt gecachet.
De schakelaar is globaal, niet per component. Stel deze eenmalig in bij het opstarten, voordat er componenten worden aangemaakt. sgcUseNativeCrypto geeft True terug wanneer de native backend wordt gebruikt. De native backend vereist dat de sgcCrypto-units zijn meegecompileerd (SGC_CRYPTO). Zonder deze geeft cbNative de uitzondering "Native crypto not available, sgcCrypto units are not compiled in". Roep sgcCheckNativeCrypto aan om deze fout al bij het opstarten te krijgen in plaats van bij het eerste gebruik.
uses
sgcBase_Helpers;
begin
sgcCryptoBackend := cbNative;
sgcCheckNativeCrypto;
Application.Initialize;
...
Deze onderdelen volgen de schakelaar:
| Gebied | Wat native draait |
| Hash- en HMAC-hulpfuncties | De hash- en HMAC-functies van sgcBase_Helpers, en sgcEncryptString / sgcDecryptString. |
| JWT, JWS-handtekeningen | HMAC-, RSA-, RSA-PSS-, ECDSA- en EdDSA-ondertekening en -verificatie (sgcSSL_RSA, sgcSSL_PS, sgcSSL_ES, sgcSSL_ED). sgcES_GetCurveFromPublicKey werkt alleen op een OpenSSL-sleutel en geeft een fout op de native backend. |
| Certificaten | De sgcSSL-hulpfuncties: PEM- en DER-conversie, certificaat laden, CRL-URI en certificaatketenverificatie. |
| OAuth2 en DPoP | De OAuth2 JWK-hulpfunctie, en de DPoP-proofcontrole van de OAuth2-server (ES256, ES384, ES512, RS256, RS384, RS512). Zie DPoP. |
| Amazon | AWS Signature V4, de CloudFront signed URL, en de Signature V4-authenticatie van de Amazon IoT MQTT-client, waarvan SignatureV4.OpenSSL_Options dan wordt genegeerd. |
| Web Push | Het VAPID ES256-token, de ECDH-sleuteluitwisseling, HKDF en de AES-128-GCM-payloadversleuteling. Alleen een https-verbinding naar de pushdienst laadt een TLS-bibliotheek, via de eigen IOHandler. |
| E2EE | Sleuteluitwisseling, AES-GCM en de random-generator. De publieke sleutels gaan op beide backends als PEM over de lijn, raw sleutels worden nog steeds geaccepteerd, zodat peers op verschillende backends onderling werken. |
| WebAuthn, SAML, OIDC | De WebAuthn-certificaat-, COSE-sleutel- en attestatiecontroles, en de XMLDSig-handtekeningcontrole die door SAML en OIDC wordt gebruikt. |
| NTLM | De MD4- en DES-code van NTLM-authenticatie. Deze is native in elke build en heeft geen define meer nodig. |
| AEAD, KEM, HKDF | sgcSSL_AEAD (AES-128-GCM, AES-256-GCM, ChaCha20-Poly1305), sgcSSL_KEM (ML-KEM-768 en ECDH P-256) en sgcSSL_HKDF (nu ook met sgcHKDF_MD_SHA384). ML-KEM-768 heeft geen OpenSSL 3.5 nodig, en de sleutels gebruiken dezelfde coderingen als OpenSSL 3.5. In een FIPS-build is ChaCha20-Poly1305 niet beschikbaar en geeft het een fout. |
| QUIC, DTLS, SRTP | Pakketbescherming van QUIC, het DTLS-certificaat en SRTP. Met iohNativeTLS zijn deze al native per verbinding, ongeacht wat de schakelaar zegt. |
sgcCryptoBackend wijzigt de TLS-verbinding van een component niet. Een component die IOHandler = iohOpenSSL behoudt, laadt nog steeds OpenSSL wanneer deze verbinding maakt.
De define staat standaard uit en is niet langer nodig om zonder OpenSSL te draaien. Zonder de define worden zowel de OpenSSL- als de native code meegecompileerd en beslist sgcCryptoBackend tijdens de uitvoering. Met de define wordt de native backend afgedwongen, ongeacht wat sgcCryptoBackend zegt, en wordt de OpenSSL-code uit de applicatiecryptografie-units verwijderd, zodat de executable kleiner is. Om deze in te schakelen, opent u sgcVer.inc en verwijdert u de punt uit de regel
{.$DEFINE SGC_NATIVE_CRYPTO}
of voegt u SGC_NATIVE_CRYPTO toe aan de voorwaardelijke definities van uw project. SGC_NATIVE_CRYPTO schakelt ook SGC_CRYPTO in, de sgcCrypto-units die het nodig heeft. DISABLE_SGC_NATIVE_CRYPTO schakelt het weer uit.
Welke instellingen u nodig heeft, hangt af van wat de applicatie gebruikt:
| Gebied | Instellingen voor geen OpenSSL |
| TLS over TCP: WebSocket, HTTP/1, HTTP/2, TCP, MQTT en de andere protocollen | TLSOptions.IOHandler (client) of SSLOptions.IOHandler (server) = iohNativeTLS. Zie Native TLS. |
| QUIC en HTTP/3 | IOHandler = iohNativeTLS. De handshake, de pakketbescherming, de sleutelvernieuwing en de Retry-tag zijn allemaal native. Zie QUIC en HTTP/3. |
| DTLS en WebRTC | DTLSOptions.IOHandler = iohNativeTLS. De handshake, het DTLS-certificaat en de SRTP-sleutels zijn native. Zie DTLSOptions en WebRTC DTLS. |
| Applicatiecryptografie: JWT, OAuth2, Web Push, Amazon Signature V4, E2EE, WebAuthn, SAML en de andere gebieden van de eerste tabel | sgcCryptoBackend := cbNative bij het opstarten, of de SGC_NATIVE_CRYPTO-define. |
De iohNativeTLS-rijen hebben geen define en geen sgcCryptoBackend-instelling nodig. Het selecteren van iohNativeTLS in een build zonder de sgcCrypto-units geeft een uitzondering, het valt nooit stilzwijgend terug op OpenSSL.
Met iohNativeTLS draaien de TLS 1.3- en TLS 1.2-handshake en de recordlaag op de native engine. Het werkt voor de WebSocket-, HTTP/1-, HTTP/2- en TCP-clients en -servers, en voor alles dat daarop is gebouwd: MQTT, AMQP, STOMP en de andere protocollen, de API-componenten, de IoT-clients (Certificate.IOHandler), de upstream-verbinding van de proxyserver (Proxy.TLSOptions) en de LDAP-client. Het certificaat mag PEM, DER of een .pfx-/.p12-bestand zijn.