Comment vérifier si openssl ou cryptopp est installé et utiliser la bibliothèque qui existe réellement dans le système (est installée)?

J’ai écrit une fonction qui chiffre / déchiffre un tampon (2 versions de la même fonction – premièrement, avec cryptopp, deuxièmement – avec openssl).

Je voudrais faire quelque chose comme ça:

#if defined OPENSSL run_aes_openssl(...); #elif defined CRYPTOPP run_aes_crytopp(...); #else error(...); #end 

C’est possible?

Ce n’est pas si simple. Pour savoir qu’une macro est définie, vous devez inclure l’en-tête qui définit cette macro. Et C n’a rien de tel que “include foo.h si elle existe”; il doit exister sinon il y a une erreur de compilation.

Normalement, cela serait sortingé par un script que vous exécutez avant la compilation. Votre script vérifie les emplacements tels que /usr/include , /usr/local/include , etc., pour voir si les en-têtes OpenSSL sont présents; et puis il génère un Makefile qui contient dans CFLAGS -DHAVE_OPENSSL . Ensuite, votre code peut vérifier cette macro.

C’est un peu un peu hullabaloo. Pour simplifier les choses, vous pourriez demander à l’utilisateur de modifier manuellement un fichier, par exemple, dissortingbuez votre projet avec quelque chose appelé user_config.h que l’utilisateur est supposé éditer avant la compilation, pour spécifier l’endroit où OpenSSL est placé. bientôt.

Il existe un système prédéfini appelé GNU Autoconf qui contient un script qui vérifie votre système pour tout ce qui est sous le soleil. Cela a ses avantages et ses inconvénients. cela simplifie les choses pour les utilisateurs qui téléchargent votre code source, mais il est volumineux et peut être un travail difficile pour vous-même.

Comment vérifier si openssl ou cryptopp est installé et utiliser la bibliothèque qui existe réellement dans le système (est installée)?

Si votre application a été créée sur le système sur lequel elle s’exécute, le code que vous avez affiché est correct. Vraisemblablement, le système de construction détectera OpenSSL et Crypto ++. Si les deux sont disponibles, il semble que votre code favorise OpenSSL.

Si votre application est construite ailleurs et doit être dlopen à l’exécution, vous aurez besoin de dlopen , dlsym , dlclose et d’amis.

Dans le cas de la vérification à l’exécution, il est probablement préférable de créer une table de répartition et d’appeler à travers. Par exemple, vous pourriez avoir une table avec des pointeurs de fonction vers vos run_aes_openssl , run_aes_crytopp , etc. run_aes_crytopp .

Au démarrage, vous dlopen la table en fonction des résultats de dlopen . Si vous trouvez OpenSSL, vous remplissez votre table avec l’engrenage OpenSSL. Si vous trouvez Crypto ++, vous remplissez votre table avec l’engrenage Crypto ++.


C ++ peut être pénible à utiliser avec dlopen et ses amis à cause des mutilations de noms. Pire encore, les différences entre les dissortingbutions et les versions des bibliothèques d’exécution sont différentes. Par exemple, voici une fonction permettant de générer une clé RSA privée:

 RSA::PrivateKey key; key.GenerateRandomWithKeySize(prng, 1024); 

Et voici les noms de fonction correspondants sur Mac OS X. Debian et Red Hat seront probablement différents.

 $ nm cryptopp-test.exe | grep -i GenerateRandom | grep -i RSA 00000001000c7d80 T __ZN8CryptoPP21InvertibleRSAFunction14GenerateRandomERNS_21RandomNumberGeneratorERKNS_14NameValuePairsE 00000001000c8eb0 T __ZThn120_N8CryptoPP21InvertibleRSAFunction14GenerateRandomERNS_21RandomNumberGeneratorERKNS_14NameValuePairsE