sgcWebSockets peut fonctionner sans aucune bibliothèque OpenSSL. Deux réglages indépendants le permettent, tous deux construits sur les unités sgcCrypto en Object Pascal pur, livrées à partir de l'édition Standard.
iohNativeTLS est une valeur d'IOHandler. Il remplace OpenSSL pour les connexions d'un composant : TLS, QUIC et DTLS. Voir TLS natif.
sgcCryptoBackend est un commutateur d'exécution. Il sélectionne le backend de la cryptographie applicative, tout ce qui n'est pas une connexion : hachages, signatures, échange de clés et gestion des certificats.
Une application qui n'a besoin d'OpenSSL ni pour ses connexions ni pour le reste de sa cryptographie utilise les deux.
L'unité sgcBase_Helpers déclare la variable globale sgcCryptoBackend de type TsgcCryptoBackend :
cbOpenSSL (par défaut) : la cryptographie applicative s'exécute sur OpenSSL, comme dans les versions précédentes.
cbNative : elle s'exécute sur sgcCrypto et OpenSSL n'est jamais chargé pour elle.
cbAuto : OpenSSL est utilisé lorsqu'il peut être chargé, sgcCrypto lorsqu'il ne le peut pas. La vérification s'exécute une seule fois et le résultat est mis en cache.
Le commutateur est global, pas par composant. Définissez-le une seule fois au démarrage, avant la création de tout composant. sgcUseNativeCrypto retourne True lorsque le backend natif est utilisé. Le backend natif nécessite que les unités sgcCrypto soient compilées (SGC_CRYPTO). Sans elles, cbNative lève l'exception « Native crypto not available, sgcCrypto units are not compiled in ». Appelez sgcCheckNativeCrypto pour obtenir cette erreur dès le démarrage plutôt qu'au premier usage.
uses
sgcBase_Helpers;
begin
sgcCryptoBackend := cbNative;
sgcCheckNativeCrypto;
Application.Initialize;
...
Ces parties suivent le commutateur :
| Domaine | Ce qui s'exécute nativement |
| Fonctions de hachage et HMAC | Les fonctions de hachage et HMAC de sgcBase_Helpers, ainsi que sgcEncryptString / sgcDecryptString. |
| Signatures JWT, JWS | Signature et vérification HMAC, RSA, RSA-PSS, ECDSA et EdDSA (sgcSSL_RSA, sgcSSL_PS, sgcSSL_ES, sgcSSL_ED). sgcES_GetCurveFromPublicKey ne fonctionne que sur une clé OpenSSL et lève une exception sur le backend natif. |
| Certificats | Les fonctions utilitaires sgcSSL : conversion PEM et DER, chargement de certificat, URI de CRL et vérification de chaîne de certificats. |
| OAuth2 et DPoP | L'utilitaire JWK d'OAuth2, et la vérification de la preuve DPoP du serveur OAuth2 (ES256, ES384, ES512, RS256, RS384, RS512). Voir DPoP. |
| Amazon | AWS Signature V4, l'URL signée CloudFront, et l'authentification Signature V4 du client MQTT Amazon IoT, dont SignatureV4.OpenSSL_Options est alors ignoré. |
| Web Push | Le jeton VAPID ES256, l'échange de clés ECDH, HKDF et le chiffrement de charge utile AES-128-GCM. Seule une connexion https vers le service de push charge une bibliothèque TLS, via son IOHandler. |
| E2EE | L'échange de clés, AES-GCM et le générateur aléatoire. Les clés publiques circulent sur le fil au format PEM sur les deux backends ; les clés brutes sont toujours acceptées, si bien que des pairs sur des backends différents restent interopérables. |
| WebAuthn, SAML, OIDC | Les vérifications de certificat, de clé COSE et d'attestation de WebAuthn, ainsi que la vérification de signature XMLDSig utilisée par SAML et OIDC. |
| NTLM | Le code MD4 et DES de l'authentification NTLM. Il est natif dans toutes les compilations et ne nécessite plus aucune directive. |
| AEAD, KEM, HKDF | sgcSSL_AEAD (AES-128-GCM, AES-256-GCM, ChaCha20-Poly1305), sgcSSL_KEM (ML-KEM-768 et ECDH P-256) et sgcSSL_HKDF (désormais aussi avec sgcHKDF_MD_SHA384). ML-KEM-768 n'a pas besoin d'OpenSSL 3.5, et les clés utilisent les mêmes encodages qu'OpenSSL 3.5. Dans une compilation FIPS, ChaCha20-Poly1305 n'est pas disponible et lève une exception. |
| QUIC, DTLS, SRTP | La protection des paquets QUIC, le certificat DTLS et SRTP. Avec iohNativeTLS, ils sont déjà natifs par connexion, quel que soit le réglage du commutateur. |
sgcCryptoBackend ne change pas la connexion TLS d'un composant. Un composant qui conserve IOHandler = iohOpenSSL charge toujours OpenSSL lors de sa connexion.
La directive est désactivée par défaut et n'est plus nécessaire pour fonctionner sans OpenSSL. Sans elle, le code OpenSSL et le code natif sont tous deux compilés, et sgcCryptoBackend décide à l'exécution. Avec elle, le backend natif est forcé quel que soit ce que dit sgcCryptoBackend, et le code OpenSSL est retiré des unités de cryptographie applicative, ce qui réduit la taille de l'exécutable. Pour l'activer, ouvrez sgcVer.inc et retirez le point de la ligne
{.$DEFINE SGC_NATIVE_CRYPTO}
ou ajoutez SGC_NATIVE_CRYPTO aux définitions conditionnelles de votre projet. SGC_NATIVE_CRYPTO active aussi SGC_CRYPTO, les unités sgcCrypto dont il a besoin. DISABLE_SGC_NATIVE_CRYPTO la désactive à nouveau.
Les réglages nécessaires dépendent de ce que l'application utilise :
| Domaine | Réglages pour se passer d'OpenSSL |
| TLS sur TCP : WebSocket, HTTP/1, HTTP/2, TCP, MQTT et les autres protocoles | TLSOptions.IOHandler (client) ou SSLOptions.IOHandler (serveur) = iohNativeTLS. Voir TLS natif. |
| QUIC et HTTP/3 | IOHandler = iohNativeTLS. La poignée de main, la protection des paquets, la mise à jour de clé et le tag Retry sont tous natifs. Voir QUIC et HTTP/3. |
| DTLS et WebRTC | DTLSOptions.IOHandler = iohNativeTLS. La poignée de main, le certificat DTLS et les clés SRTP sont natifs. Voir DTLSOptions et WebRTC DTLS. |
| Cryptographie applicative : JWT, OAuth2, Web Push, AWS Signature V4, E2EE, WebAuthn, SAML et les autres domaines du premier tableau | sgcCryptoBackend := cbNative au démarrage, ou la directive SGC_NATIVE_CRYPTO. |
Les lignes iohNativeTLS ne nécessitent aucune directive ni aucun réglage de sgcCryptoBackend. Sélectionner iohNativeTLS dans une compilation sans les unités sgcCrypto lève une exception, il ne se replie jamais silencieusement sur OpenSSL.
Avec iohNativeTLS, la poignée de main TLS 1.3 et TLS 1.2 ainsi que la couche d'enregistrements s'exécutent sur le moteur natif. Cela fonctionne pour les clients et serveurs WebSocket, HTTP/1, HTTP/2 et TCP, et pour tout ce qui est construit dessus : MQTT, AMQP, STOMP et les autres protocoles, les composants API, les clients IoT (Certificate.IOHandler), la connexion amont du serveur proxy (Proxy.TLSOptions) et le client LDAP. Le certificat peut être au format PEM, DER ou un fichier .pfx / .p12.