/
githubmirror
/
xmlsec
Обзор
Документация
Войти
/
githubmirror
/
xmlsec
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/openssl/crypto.c
893 строки
34 KB
lsh123
(xmlsec-core) Separate user vs system callback to allow setting callback before initialization (#1150)
27 апр 2026, 23:02
Не верифицирован
27 апр 2026, 23:02
4c6227a
Код
Авторство
О чём код?
/** * XML Security Library (http://www.aleksey.com/xmlsec). * * This is free software; see the Copyright file in the source distribution for precise wording. * * Copyright (C) 2002-2026 Aleksey Sanin <aleksey@aleksey.com>. All Rights Reserved. */ /** * @addtogroup xmlsec_openssl_crypto * @brief Crypto key dat and transforms implementation for OpenSSL. * Implementation of keys and tranforms for OpenSSL. */ #include "globals.h" #include <string.h> #include <xmlsec/xmlsec.h> #include <xmlsec/dl.h> #include <xmlsec/errors.h> #include <xmlsec/keys.h> #include <xmlsec/keysmngr.h> #include <xmlsec/private.h> #include <xmlsec/transforms.h> #include <openssl/x509.h> #include <openssl/evp.h> #include <openssl/rand.h> #include <xmlsec/openssl/app.h> #include <xmlsec/openssl/crypto.h> #include <xmlsec/openssl/evp.h> #include <xmlsec/openssl/x509.h> #include "openssl_compat.h" #include "../cast_helpers.h" static int xmlSecOpenSSLErrorsInit (void); static void xmlSecOpenSSLErrorsShutdown (void); static xmlSecCryptoDLFunctionsPtr gXmlSecOpenSSLFunctions = NULL; static xmlChar* gXmlSecOpenSSLTrustedCertsFolder = NULL; #if !defined(XMLSEC_OPENSSL_API_300) && !defined(OPENSSL_IS_BORINGSSL) && !defined(OPENSSL_IS_AWSLC) && !defined(OPENSSL_NO_ERR) #define XMLSEC_OPENSSL_ERRORS_FUNCTION 0 static int gXmlSecOpenSSLErrorsLib = 0; static char gXmlSecOpenSSLErrorsLibName[] = "xmlsec lib"; static char gXmlSecOpenSSLErrorsDefault[] = "xmlsec routines"; static ERR_STRING_DATA xmlSecOpenSSLStrLib[2]; static ERR_STRING_DATA xmlSecOpenSSLStrDefReason[2]; static ERR_STRING_DATA xmlSecOpenSSLStrReasons[XMLSEC_ERRORS_MAX_NUMBER + 1]; #endif /* !defined(XMLSEC_OPENSSL_API_300) && !defined(OPENSSL_IS_BORINGSSL) && !defined(OPENSSL_NO_ERR) */ /** * @brief Gets the xmlsec-openssl functions table. * @details Gets the pointer to xmlsec-openssl functions table. * @return the xmlsec-openssl functions table or NULL if an error occurs. */ xmlSecCryptoDLFunctionsPtr xmlSecCryptoGetFunctions_openssl(void) { static xmlSecCryptoDLFunctions functions; if(gXmlSecOpenSSLFunctions != NULL) { return(gXmlSecOpenSSLFunctions); } memset(&functions, 0, sizeof(functions)); gXmlSecOpenSSLFunctions = &functions; /****************************************************************************** * * Crypto Init/shutdown * *****************************************************************************/ gXmlSecOpenSSLFunctions->cryptoInit = xmlSecOpenSSLInit; gXmlSecOpenSSLFunctions->cryptoShutdown = xmlSecOpenSSLShutdown; gXmlSecOpenSSLFunctions->cryptoKeysMngrInit = xmlSecOpenSSLKeysMngrInit; /****************************************************************************** * * Key data ids * *****************************************************************************/ #ifndef XMLSEC_NO_AES gXmlSecOpenSSLFunctions->keyDataAesGetKlass = xmlSecOpenSSLKeyDataAesGetKlass; #endif /* XMLSEC_NO_AES */ #ifndef XMLSEC_NO_CAMELLIA gXmlSecOpenSSLFunctions->keyDataCamelliaGetKlass = xmlSecOpenSSLKeyDataCamelliaGetKlass; #endif /* XMLSEC_NO_CAMELLIA */ #ifndef XMLSEC_NO_CHACHA20 gXmlSecOpenSSLFunctions->keyDataChaCha20GetKlass = xmlSecOpenSSLKeyDataChaCha20GetKlass; #endif /* XMLSEC_NO_CHACHA20 */ #ifndef XMLSEC_NO_CONCATKDF gXmlSecOpenSSLFunctions->keyDataConcatKdfGetKlass = xmlSecOpenSSLKeyDataConcatKdfGetKlass; #endif /* XMLSEC_NO_CONCATKDF */ #ifndef XMLSEC_NO_DES gXmlSecOpenSSLFunctions->keyDataDesGetKlass = xmlSecOpenSSLKeyDataDesGetKlass; #endif /* XMLSEC_NO_DES */ #ifndef XMLSEC_NO_DH gXmlSecOpenSSLFunctions->keyDataDhGetKlass = xmlSecOpenSSLKeyDataDhGetKlass; #endif /* XMLSEC_NO_DH */ #ifndef XMLSEC_NO_DSA gXmlSecOpenSSLFunctions->keyDataDsaGetKlass = xmlSecOpenSSLKeyDataDsaGetKlass; #endif /* XMLSEC_NO_DSA */ #ifndef XMLSEC_NO_EC gXmlSecOpenSSLFunctions->keyDataEcGetKlass = xmlSecOpenSSLKeyDataEcGetKlass; #endif /* XMLSEC_NO_EC */ #ifndef XMLSEC_NO_GOST gXmlSecOpenSSLFunctions->keyDataGost2001GetKlass = xmlSecOpenSSLKeyDataGost2001GetKlass; #endif /* XMLSEC_NO_GOST */ #ifndef XMLSEC_NO_GOST2012 gXmlSecOpenSSLFunctions->keyDataGostR3410_2012_256GetKlass = xmlSecOpenSSLKeyDataGostR3410_2012_256GetKlass; gXmlSecOpenSSLFunctions->keyDataGostR3410_2012_512GetKlass = xmlSecOpenSSLKeyDataGostR3410_2012_512GetKlass; #endif /* XMLSEC_NO_GOST2012 */ #ifndef XMLSEC_NO_HMAC gXmlSecOpenSSLFunctions->keyDataHmacGetKlass = xmlSecOpenSSLKeyDataHmacGetKlass; #endif /* XMLSEC_NO_HMAC */ #ifndef XMLSEC_NO_PBKDF2 gXmlSecOpenSSLFunctions->keyDataPbkdf2GetKlass = xmlSecOpenSSLKeyDataPbkdf2GetKlass; #endif /* XMLSEC_NO_PBKDF2 */ #ifndef XMLSEC_NO_HKDF gXmlSecOpenSSLFunctions->keyDataHkdfGetKlass = xmlSecOpenSSLKeyDataHkdfGetKlass; #endif /* XMLSEC_NO_HKDF */ #ifndef XMLSEC_NO_RSA gXmlSecOpenSSLFunctions->keyDataRsaGetKlass = xmlSecOpenSSLKeyDataRsaGetKlass; #endif /* XMLSEC_NO_RSA */ #ifndef XMLSEC_NO_MLDSA gXmlSecOpenSSLFunctions->keyDataMLDSAGetKlass = xmlSecOpenSSLKeyDataMLDSAGetKlass; #endif /* XMLSEC_NO_MLDSA */ #ifndef XMLSEC_NO_MLKEM gXmlSecOpenSSLFunctions->keyDataMLKEMGetKlass = xmlSecOpenSSLKeyDataMLKEMGetKlass; #endif /* XMLSEC_NO_MLKEM */ #ifndef XMLSEC_NO_SLHDSA gXmlSecOpenSSLFunctions->keyDataSLHDSAGetKlass = xmlSecOpenSSLKeyDataSLHDSAGetKlass; #endif /* XMLSEC_NO_SLHDSA */ #ifndef XMLSEC_NO_EDDSA gXmlSecOpenSSLFunctions->keyDataEdDSAGetKlass = xmlSecOpenSSLKeyDataEdDSAGetKlass; #endif /* XMLSEC_NO_EDDSA */ #ifndef XMLSEC_NO_XDH gXmlSecOpenSSLFunctions->keyDataXdhGetKlass = xmlSecOpenSSLKeyDataXdhGetKlass; #endif /* XMLSEC_NO_XDH */ #ifndef XMLSEC_NO_X509 gXmlSecOpenSSLFunctions->keyDataX509GetKlass = xmlSecOpenSSLKeyDataX509GetKlass; gXmlSecOpenSSLFunctions->keyDataRawX509CertGetKlass = xmlSecOpenSSLKeyDataRawX509CertGetKlass; #endif /* XMLSEC_NO_X509 */ gXmlSecOpenSSLFunctions->keyDataDEREncodedKeyValueGetKlass = xmlSecOpenSSLKeyDataDEREncodedKeyValueGetKlass; /****************************************************************************** * * Key data store ids * *****************************************************************************/ #ifndef XMLSEC_NO_X509 gXmlSecOpenSSLFunctions->x509StoreGetKlass = xmlSecOpenSSLX509StoreGetKlass; #endif /* XMLSEC_NO_X509 */ /****************************************************************************** * * Crypto transforms ids * *****************************************************************************/ /* AES */ #ifndef XMLSEC_NO_AES gXmlSecOpenSSLFunctions->transformAes128CbcGetKlass = xmlSecOpenSSLTransformAes128CbcGetKlass; gXmlSecOpenSSLFunctions->transformAes192CbcGetKlass = xmlSecOpenSSLTransformAes192CbcGetKlass; gXmlSecOpenSSLFunctions->transformAes256CbcGetKlass = xmlSecOpenSSLTransformAes256CbcGetKlass; gXmlSecOpenSSLFunctions->transformAes128GcmGetKlass = xmlSecOpenSSLTransformAes128GcmGetKlass; gXmlSecOpenSSLFunctions->transformAes192GcmGetKlass = xmlSecOpenSSLTransformAes192GcmGetKlass; gXmlSecOpenSSLFunctions->transformAes256GcmGetKlass = xmlSecOpenSSLTransformAes256GcmGetKlass; gXmlSecOpenSSLFunctions->transformKWAes128GetKlass = xmlSecOpenSSLTransformKWAes128GetKlass; gXmlSecOpenSSLFunctions->transformKWAes192GetKlass = xmlSecOpenSSLTransformKWAes192GetKlass; gXmlSecOpenSSLFunctions->transformKWAes256GetKlass = xmlSecOpenSSLTransformKWAes256GetKlass; #endif /* XMLSEC_NO_AES */ /* CAMELLIA */ #ifndef XMLSEC_NO_CAMELLIA gXmlSecOpenSSLFunctions->transformCamellia128CbcGetKlass = xmlSecOpenSSLTransformCamellia128CbcGetKlass; gXmlSecOpenSSLFunctions->transformCamellia192CbcGetKlass = xmlSecOpenSSLTransformCamellia192CbcGetKlass; gXmlSecOpenSSLFunctions->transformCamellia256CbcGetKlass = xmlSecOpenSSLTransformCamellia256CbcGetKlass; gXmlSecOpenSSLFunctions->transformKWCamellia128GetKlass = xmlSecOpenSSLTransformKWCamellia128GetKlass; gXmlSecOpenSSLFunctions->transformKWCamellia192GetKlass = xmlSecOpenSSLTransformKWCamellia192GetKlass; gXmlSecOpenSSLFunctions->transformKWCamellia256GetKlass = xmlSecOpenSSLTransformKWCamellia256GetKlass; #endif /* XMLSEC_NO_CAMELLIA */ /* CHACHA20 */ #ifndef XMLSEC_NO_CHACHA20 gXmlSecOpenSSLFunctions->transformChaCha20GetKlass = xmlSecOpenSSLTransformChaCha20GetKlass; gXmlSecOpenSSLFunctions->transformChaCha20Poly1305GetKlass = xmlSecOpenSSLTransformChaCha20Poly1305GetKlass; #endif /* XMLSEC_NO_CHACHA20 */ /* CONCATKDF */ #ifndef XMLSEC_NO_CONCATKDF gXmlSecOpenSSLFunctions->transformConcatKdfGetKlass = xmlSecOpenSSLTransformConcatKdfGetKlass; #endif /* XMLSEC_NO_CONCATKDF */ /* DES */ #ifndef XMLSEC_NO_DES gXmlSecOpenSSLFunctions->transformDes3CbcGetKlass = xmlSecOpenSSLTransformDes3CbcGetKlass; gXmlSecOpenSSLFunctions->transformKWDes3GetKlass = xmlSecOpenSSLTransformKWDes3GetKlass; #endif /* XMLSEC_NO_DES */ /* DH */ #ifndef XMLSEC_NO_DH gXmlSecOpenSSLFunctions->transformDhEsGetKlass = xmlSecOpenSSLTransformDhEsGetKlass; #endif /* XMLSEC_NO_DH */ /* DSA */ #ifndef XMLSEC_NO_DSA #ifndef XMLSEC_NO_SHA1 gXmlSecOpenSSLFunctions->transformDsaSha1GetKlass = xmlSecOpenSSLTransformDsaSha1GetKlass; #endif /* XMLSEC_NO_SHA1 */ #ifndef XMLSEC_NO_SHA256 gXmlSecOpenSSLFunctions->transformDsaSha256GetKlass = xmlSecOpenSSLTransformDsaSha256GetKlass; #endif /* XMLSEC_NO_SHA256 */ #endif /* XMLSEC_NO_DSA */ /* ECDSA */ #ifndef XMLSEC_NO_EC gXmlSecOpenSSLFunctions->transformEcdhGetKlass = xmlSecOpenSSLTransformEcdhGetKlass; #ifndef XMLSEC_NO_RIPEMD160 gXmlSecOpenSSLFunctions->transformEcdsaRipemd160GetKlass = xmlSecOpenSSLTransformEcdsaRipemd160GetKlass; #endif /* XMLSEC_NO_RIPEMD160 */ #ifndef XMLSEC_NO_SHA1 gXmlSecOpenSSLFunctions->transformEcdsaSha1GetKlass = xmlSecOpenSSLTransformEcdsaSha1GetKlass; #endif /* XMLSEC_NO_SHA1 */ #ifndef XMLSEC_NO_SHA224 gXmlSecOpenSSLFunctions->transformEcdsaSha224GetKlass = xmlSecOpenSSLTransformEcdsaSha224GetKlass; #endif /* XMLSEC_NO_SHA224 */ #ifndef XMLSEC_NO_SHA256 gXmlSecOpenSSLFunctions->transformEcdsaSha256GetKlass = xmlSecOpenSSLTransformEcdsaSha256GetKlass; #endif /* XMLSEC_NO_SHA256 */ #ifndef XMLSEC_NO_SHA384 gXmlSecOpenSSLFunctions->transformEcdsaSha384GetKlass = xmlSecOpenSSLTransformEcdsaSha384GetKlass; #endif /* XMLSEC_NO_SHA384 */ #ifndef XMLSEC_NO_SHA512 gXmlSecOpenSSLFunctions->transformEcdsaSha512GetKlass = xmlSecOpenSSLTransformEcdsaSha512GetKlass; #endif /* XMLSEC_NO_SHA512 */ #ifndef XMLSEC_NO_SHA3 gXmlSecOpenSSLFunctions->transformEcdsaSha3_224GetKlass = xmlSecOpenSSLTransformEcdsaSha3_224GetKlass; gXmlSecOpenSSLFunctions->transformEcdsaSha3_256GetKlass = xmlSecOpenSSLTransformEcdsaSha3_256GetKlass; gXmlSecOpenSSLFunctions->transformEcdsaSha3_384GetKlass = xmlSecOpenSSLTransformEcdsaSha3_384GetKlass; gXmlSecOpenSSLFunctions->transformEcdsaSha3_512GetKlass = xmlSecOpenSSLTransformEcdsaSha3_512GetKlass; #endif /* XMLSEC_NO_SHA3 */ #endif /* XMLSEC_NO_EC */ /* XDH */ #ifndef XMLSEC_NO_XDH gXmlSecOpenSSLFunctions->transformX25519GetKlass = xmlSecOpenSSLTransformX25519GetKlass; gXmlSecOpenSSLFunctions->transformX448GetKlass = xmlSecOpenSSLTransformX448GetKlass; #endif /* XMLSEC_NO_XDH */ /* GOST */ #ifndef XMLSEC_NO_GOST gXmlSecOpenSSLFunctions->transformGost2001GostR3411_94GetKlass = xmlSecOpenSSLTransformGost2001GostR3411_94GetKlass; gXmlSecOpenSSLFunctions->transformGostR3411_94GetKlass = xmlSecOpenSSLTransformGostR3411_94GetKlass; #endif /* XMLSEC_NO_GOST */ #ifndef XMLSEC_NO_GOST2012 gXmlSecOpenSSLFunctions->transformGostR3411_2012_256GetKlass = xmlSecOpenSSLTransformGostR3411_2012_256GetKlass; gXmlSecOpenSSLFunctions->transformGostR3411_2012_512GetKlass = xmlSecOpenSSLTransformGostR3411_2012_512GetKlass; gXmlSecOpenSSLFunctions->transformGostR3410_2012GostR3411_2012_256GetKlass = xmlSecOpenSSLTransformGostR3410_2012GostR3411_2012_256GetKlass; gXmlSecOpenSSLFunctions->transformGostR3410_2012GostR3411_2012_512GetKlass = xmlSecOpenSSLTransformGostR3410_2012GostR3411_2012_512GetKlass; #endif /* XMLSEC_NO_GOST2012 */ /* HMAC */ #ifndef XMLSEC_NO_HMAC #ifndef XMLSEC_NO_MD5 gXmlSecOpenSSLFunctions->transformHmacMd5GetKlass = xmlSecOpenSSLTransformHmacMd5GetKlass; #endif /* XMLSEC_NO_MD5 */ #ifndef XMLSEC_NO_RIPEMD160 gXmlSecOpenSSLFunctions->transformHmacRipemd160GetKlass = xmlSecOpenSSLTransformHmacRipemd160GetKlass; #endif /* XMLSEC_NO_RIPEMD160 */ #ifndef XMLSEC_NO_SHA1 gXmlSecOpenSSLFunctions->transformHmacSha1GetKlass = xmlSecOpenSSLTransformHmacSha1GetKlass; #endif /* XMLSEC_NO_SHA1 */ #ifndef XMLSEC_NO_SHA224 gXmlSecOpenSSLFunctions->transformHmacSha224GetKlass = xmlSecOpenSSLTransformHmacSha224GetKlass; #endif /* XMLSEC_NO_SHA224 */ #ifndef XMLSEC_NO_SHA256 gXmlSecOpenSSLFunctions->transformHmacSha256GetKlass = xmlSecOpenSSLTransformHmacSha256GetKlass; #endif /* XMLSEC_NO_SHA256 */ #ifndef XMLSEC_NO_SHA384 gXmlSecOpenSSLFunctions->transformHmacSha384GetKlass = xmlSecOpenSSLTransformHmacSha384GetKlass; #endif /* XMLSEC_NO_SHA384 */ #ifndef XMLSEC_NO_SHA512 gXmlSecOpenSSLFunctions->transformHmacSha512GetKlass = xmlSecOpenSSLTransformHmacSha512GetKlass; #endif /* XMLSEC_NO_SHA512 */ #endif /* XMLSEC_NO_HMAC */ /* MD5 */ #ifndef XMLSEC_NO_MD5 gXmlSecOpenSSLFunctions->transformMd5GetKlass = xmlSecOpenSSLTransformMd5GetKlass; #endif /* XMLSEC_NO_MD5 */ /* ML-DSA */ #ifndef XMLSEC_NO_MLDSA gXmlSecOpenSSLFunctions->transformMLDSA44GetKlass = xmlSecOpenSSLTransformMLDSA44GetKlass; gXmlSecOpenSSLFunctions->transformMLDSA65GetKlass = xmlSecOpenSSLTransformMLDSA65GetKlass; gXmlSecOpenSSLFunctions->transformMLDSA87GetKlass = xmlSecOpenSSLTransformMLDSA87GetKlass; #endif /* XMLSEC_NO_MLDSA */ /* ML-KEM */ #ifndef XMLSEC_NO_MLKEM gXmlSecOpenSSLFunctions->transformMLKEM512GetKlass = xmlSecOpenSSLTransformMLKEM512GetKlass; gXmlSecOpenSSLFunctions->transformMLKEM768GetKlass = xmlSecOpenSSLTransformMLKEM768GetKlass; gXmlSecOpenSSLFunctions->transformMLKEM1024GetKlass = xmlSecOpenSSLTransformMLKEM1024GetKlass; #endif /* XMLSEC_NO_MLKEM */ /* PBKDF2 */ #ifndef XMLSEC_NO_PBKDF2 gXmlSecOpenSSLFunctions->transformPbkdf2GetKlass = xmlSecOpenSSLTransformPbkdf2GetKlass; #endif /* XMLSEC_NO_PBKDF2 */ /* HKDF */ #ifndef XMLSEC_NO_HKDF gXmlSecOpenSSLFunctions->transformHkdfGetKlass = xmlSecOpenSSLTransformHkdfGetKlass; #endif /* XMLSEC_NO_HKDF */ /* RIPEMD160 */ #ifndef XMLSEC_NO_RIPEMD160 gXmlSecOpenSSLFunctions->transformRipemd160GetKlass = xmlSecOpenSSLTransformRipemd160GetKlass; #endif /* XMLSEC_NO_RIPEMD160 */ /* RSA */ #ifndef XMLSEC_NO_RSA #ifndef XMLSEC_NO_MD5 gXmlSecOpenSSLFunctions->transformRsaMd5GetKlass = xmlSecOpenSSLTransformRsaMd5GetKlass; #endif /* XMLSEC_NO_MD5 */ #ifndef XMLSEC_NO_RIPEMD160 gXmlSecOpenSSLFunctions->transformRsaRipemd160GetKlass = xmlSecOpenSSLTransformRsaRipemd160GetKlass; #endif /* XMLSEC_NO_RIPEMD160 */ #ifndef XMLSEC_NO_SHA1 gXmlSecOpenSSLFunctions->transformRsaSha1GetKlass = xmlSecOpenSSLTransformRsaSha1GetKlass; #endif /* XMLSEC_NO_SHA1 */ #ifndef XMLSEC_NO_SHA224 gXmlSecOpenSSLFunctions->transformRsaSha224GetKlass = xmlSecOpenSSLTransformRsaSha224GetKlass; #endif /* XMLSEC_NO_SHA224 */ #ifndef XMLSEC_NO_SHA256 gXmlSecOpenSSLFunctions->transformRsaSha256GetKlass = xmlSecOpenSSLTransformRsaSha256GetKlass; #endif /* XMLSEC_NO_SHA256 */ #ifndef XMLSEC_NO_SHA384 gXmlSecOpenSSLFunctions->transformRsaSha384GetKlass = xmlSecOpenSSLTransformRsaSha384GetKlass; #endif /* XMLSEC_NO_SHA384 */ #ifndef XMLSEC_NO_SHA512 gXmlSecOpenSSLFunctions->transformRsaSha512GetKlass = xmlSecOpenSSLTransformRsaSha512GetKlass; #endif /* XMLSEC_NO_SHA512 */ #ifndef XMLSEC_NO_SHA1 gXmlSecOpenSSLFunctions->transformRsaPssSha1GetKlass = xmlSecOpenSSLTransformRsaPssSha1GetKlass; #endif /* XMLSEC_NO_SHA1 */ #ifndef XMLSEC_NO_SHA224 gXmlSecOpenSSLFunctions->transformRsaPssSha224GetKlass = xmlSecOpenSSLTransformRsaPssSha224GetKlass; #endif /* XMLSEC_NO_SHA224 */ #ifndef XMLSEC_NO_SHA256 gXmlSecOpenSSLFunctions->transformRsaPssSha256GetKlass = xmlSecOpenSSLTransformRsaPssSha256GetKlass; #endif /* XMLSEC_NO_SHA256 */ #ifndef XMLSEC_NO_SHA384 gXmlSecOpenSSLFunctions->transformRsaPssSha384GetKlass = xmlSecOpenSSLTransformRsaPssSha384GetKlass; #endif /* XMLSEC_NO_SHA384 */ #ifndef XMLSEC_NO_SHA512 gXmlSecOpenSSLFunctions->transformRsaPssSha512GetKlass = xmlSecOpenSSLTransformRsaPssSha512GetKlass; #endif /* XMLSEC_NO_SHA512 */ #ifndef XMLSEC_NO_SHA3 gXmlSecOpenSSLFunctions->transformRsaPssSha3_224GetKlass = xmlSecOpenSSLTransformRsaPssSha3_224GetKlass; gXmlSecOpenSSLFunctions->transformRsaPssSha3_256GetKlass = xmlSecOpenSSLTransformRsaPssSha3_256GetKlass; gXmlSecOpenSSLFunctions->transformRsaPssSha3_384GetKlass = xmlSecOpenSSLTransformRsaPssSha3_384GetKlass; gXmlSecOpenSSLFunctions->transformRsaPssSha3_512GetKlass = xmlSecOpenSSLTransformRsaPssSha3_512GetKlass; #endif /* XMLSEC_NO_SHA3 */ #ifndef XMLSEC_NO_RSA_PKCS15 gXmlSecOpenSSLFunctions->transformRsaPkcs1GetKlass = xmlSecOpenSSLTransformRsaPkcs1GetKlass; #endif /* XMLSEC_NO_RSA_PKCS15 */ #ifndef XMLSEC_NO_RSA_OAEP gXmlSecOpenSSLFunctions->transformRsaOaepGetKlass = xmlSecOpenSSLTransformRsaOaepGetKlass; gXmlSecOpenSSLFunctions->transformRsaOaepEnc11GetKlass = xmlSecOpenSSLTransformRsaOaepEnc11GetKlass; #endif /* XMLSEC_NO_RSA_OAEP */ #endif /* XMLSEC_NO_RSA */ /* SLH-DSA */ #ifndef XMLSEC_NO_SLHDSA gXmlSecOpenSSLFunctions->transformSLHDSA_SHA2_128fGetKlass = xmlSecOpenSSLTransformSLHDSA_SHA2_128fGetKlass; gXmlSecOpenSSLFunctions->transformSLHDSA_SHA2_128sGetKlass = xmlSecOpenSSLTransformSLHDSA_SHA2_128sGetKlass; gXmlSecOpenSSLFunctions->transformSLHDSA_SHA2_192fGetKlass = xmlSecOpenSSLTransformSLHDSA_SHA2_192fGetKlass; gXmlSecOpenSSLFunctions->transformSLHDSA_SHA2_192sGetKlass = xmlSecOpenSSLTransformSLHDSA_SHA2_192sGetKlass; gXmlSecOpenSSLFunctions->transformSLHDSA_SHA2_256fGetKlass = xmlSecOpenSSLTransformSLHDSA_SHA2_256fGetKlass; gXmlSecOpenSSLFunctions->transformSLHDSA_SHA2_256sGetKlass = xmlSecOpenSSLTransformSLHDSA_SHA2_256sGetKlass; #endif /* XMLSEC_NO_SLHDSA */ #ifndef XMLSEC_NO_EDDSA gXmlSecOpenSSLFunctions->transformEdDSAEd25519GetKlass = xmlSecOpenSSLTransformEdDSAEd25519GetKlass; gXmlSecOpenSSLFunctions->transformEdDSAEd25519ctxGetKlass = xmlSecOpenSSLTransformEdDSAEd25519ctxGetKlass; gXmlSecOpenSSLFunctions->transformEdDSAEd25519phGetKlass = xmlSecOpenSSLTransformEdDSAEd25519phGetKlass; gXmlSecOpenSSLFunctions->transformEdDSAEd448GetKlass = xmlSecOpenSSLTransformEdDSAEd448GetKlass; gXmlSecOpenSSLFunctions->transformEdDSAEd448phGetKlass = xmlSecOpenSSLTransformEdDSAEd448phGetKlass; #endif /* XMLSEC_NO_EDDSA */ /* SHA */ #ifndef XMLSEC_NO_SHA1 gXmlSecOpenSSLFunctions->transformSha1GetKlass = xmlSecOpenSSLTransformSha1GetKlass; #endif /* XMLSEC_NO_SHA1 */ #ifndef XMLSEC_NO_SHA224 gXmlSecOpenSSLFunctions->transformSha224GetKlass = xmlSecOpenSSLTransformSha224GetKlass; #endif /* XMLSEC_NO_SHA224 */ #ifndef XMLSEC_NO_SHA256 gXmlSecOpenSSLFunctions->transformSha256GetKlass = xmlSecOpenSSLTransformSha256GetKlass; #endif /* XMLSEC_NO_SHA256 */ #ifndef XMLSEC_NO_SHA384 gXmlSecOpenSSLFunctions->transformSha384GetKlass = xmlSecOpenSSLTransformSha384GetKlass; #endif /* XMLSEC_NO_SHA384 */ #ifndef XMLSEC_NO_SHA512 gXmlSecOpenSSLFunctions->transformSha512GetKlass = xmlSecOpenSSLTransformSha512GetKlass; #endif /* XMLSEC_NO_SHA512 */ #ifndef XMLSEC_NO_SHA3 gXmlSecOpenSSLFunctions->transformSha3_224GetKlass = xmlSecOpenSSLTransformSha3_224GetKlass; gXmlSecOpenSSLFunctions->transformSha3_256GetKlass = xmlSecOpenSSLTransformSha3_256GetKlass; gXmlSecOpenSSLFunctions->transformSha3_384GetKlass = xmlSecOpenSSLTransformSha3_384GetKlass; gXmlSecOpenSSLFunctions->transformSha3_512GetKlass = xmlSecOpenSSLTransformSha3_512GetKlass; #endif /* XMLSEC_NO_SHA3 */ /****************************************************************************** * * High-level routines for the xmlsec command-line utility * *****************************************************************************/ gXmlSecOpenSSLFunctions->cryptoAppInit = xmlSecOpenSSLAppInit; gXmlSecOpenSSLFunctions->cryptoAppShutdown = xmlSecOpenSSLAppShutdown; gXmlSecOpenSSLFunctions->cryptoAppDefaultKeysMngrInit = xmlSecOpenSSLAppDefaultKeysMngrInit; gXmlSecOpenSSLFunctions->cryptoAppDefaultKeysMngrAdoptKey = xmlSecOpenSSLAppDefaultKeysMngrAdoptKey; gXmlSecOpenSSLFunctions->cryptoAppDefaultKeysMngrVerifyKey = xmlSecOpenSSLAppDefaultKeysMngrVerifyKey; gXmlSecOpenSSLFunctions->cryptoAppDefaultKeysMngrLoad = xmlSecOpenSSLAppDefaultKeysMngrLoad; gXmlSecOpenSSLFunctions->cryptoAppDefaultKeysMngrSave = xmlSecOpenSSLAppDefaultKeysMngrSave; #ifndef XMLSEC_NO_X509 gXmlSecOpenSSLFunctions->cryptoAppKeysMngrCertLoad = xmlSecOpenSSLAppKeysMngrCertLoad; gXmlSecOpenSSLFunctions->cryptoAppKeysMngrCertLoadMemory = xmlSecOpenSSLAppKeysMngrCertLoadMemory; gXmlSecOpenSSLFunctions->cryptoAppKeysMngrCrlLoad = xmlSecOpenSSLAppKeysMngrCrlLoad; gXmlSecOpenSSLFunctions->cryptoAppKeysMngrCrlLoadAndVerify = xmlSecOpenSSLAppKeysMngrCrlLoadAndVerify; gXmlSecOpenSSLFunctions->cryptoAppKeysMngrCrlLoadMemory = xmlSecOpenSSLAppKeysMngrCrlLoadMemory; gXmlSecOpenSSLFunctions->cryptoAppPkcs12Load = xmlSecOpenSSLAppPkcs12Load; gXmlSecOpenSSLFunctions->cryptoAppPkcs12LoadMemory = xmlSecOpenSSLAppPkcs12LoadMemory; gXmlSecOpenSSLFunctions->cryptoAppKeyCertLoad = xmlSecOpenSSLAppKeyCertLoad; gXmlSecOpenSSLFunctions->cryptoAppKeyCertLoadMemory = xmlSecOpenSSLAppKeyCertLoadMemory; #endif /* XMLSEC_NO_X509 */ gXmlSecOpenSSLFunctions->cryptoAppKeyLoadEx = xmlSecOpenSSLAppKeyLoadEx; gXmlSecOpenSSLFunctions->cryptoAppKeyLoadMemory = xmlSecOpenSSLAppKeyLoadMemory; gXmlSecOpenSSLFunctions->cryptoAppDefaultPwdCallback = (void*)xmlSecOpenSSLAppGetDefaultPwdCallback(); return(gXmlSecOpenSSLFunctions); } /** * @brief Initializes the OpenSSL crypto engine. * @details XMLSec library specific crypto engine initialization. * @return 0 on success or a negative value otherwise. */ int xmlSecOpenSSLInit (void) { /* Check loaded xmlsec library version */ if(xmlSecCheckVersionExact() != 1) { xmlSecInternalError("xmlSecCheckVersionExact", NULL); return(-1); } if(xmlSecOpenSSLErrorsInit() < 0) { xmlSecInternalError("xmlSecOpenSSLErrorsInit", NULL); return(-1); } /* register our klasses */ if(xmlSecCryptoDLFunctionsRegisterKeyDataAndTransforms(xmlSecCryptoGetFunctions_openssl()) < 0) { xmlSecInternalError("xmlSecCryptoDLFunctionsRegisterKeyDataAndTransforms", NULL); return(-1); } return(0); } /** * @brief XMLSec library specific crypto engine shutdown. * @return 0 on success or a negative value otherwise. */ int xmlSecOpenSSLShutdown(void) { xmlSecOpenSSLSetDefaultTrustedCertsFolder(NULL); xmlSecOpenSSLErrorsShutdown(); return(0); } /** * @brief Adds OpenSSL specific key data stores. * @details Adds OpenSSL specific key data stores in keys manager. * @param mngr the pointer to keys manager. * @return 0 on success or a negative value otherwise. */ int xmlSecOpenSSLKeysMngrInit(xmlSecKeysMngrPtr mngr) { #ifndef XMLSEC_NO_X509 int ret; xmlSecAssert2(mngr != NULL, -1); /* create x509 store if needed */ if(xmlSecKeysMngrGetDataStore(mngr, xmlSecOpenSSLX509StoreId) == NULL) { xmlSecKeyDataStorePtr x509Store; x509Store = xmlSecKeyDataStoreCreate(xmlSecOpenSSLX509StoreId); if(x509Store == NULL) { xmlSecInternalError("xmlSecKeyDataStoreCreate(xmlSecOpenSSLX509StoreId)", NULL); return(-1); } ret = xmlSecKeysMngrAdoptDataStore(mngr, x509Store); if(ret < 0) { xmlSecInternalError("xmlSecKeysMngrAdoptDataStore", NULL); xmlSecKeyDataStoreDestroy(x509Store); return(-1); } } #else /* XMLSEC_NO_X509 */ xmlSecAssert2(mngr != NULL, -1); #endif /* XMLSEC_NO_X509 */ return(0); } #if defined(XMLSEC_OPENSSL_API_300) #define XMLSEC_OPENSSL_RAND_BYTES_STRENGTH 0 int xmlSecOpenSSLGenerateRandomBytes(xmlSecByte* buffer, xmlSecSize size) { int ret; xmlSecAssert2(buffer != NULL, -1); xmlSecAssert2(size > 0, -1); /* get random data */ ret = RAND_priv_bytes_ex(xmlSecOpenSSLGetLibCtx(), buffer, size, XMLSEC_OPENSSL_RAND_BYTES_STRENGTH); if(ret != 1) { xmlSecOpenSSLError2("RAND_priv_bytes_ex", NULL, "size=" XMLSEC_SIZE_FMT, size); return(-1); } /* done */ return(0); } #else /* XMLSEC_OPENSSL_API_300 */ int xmlSecOpenSSLGenerateRandomBytes(xmlSecByte* buffer, xmlSecSize size) { xmlSecOpenSSLSizeT num; int ret; xmlSecAssert2(buffer != NULL, -1); xmlSecAssert2(size > 0, -1); XMLSEC_OPENSSL_SAFE_CAST_SIZE_TO_SIZE_T(size, num, return(-1), NULL); /* get random data */ ret = RAND_priv_bytes(buffer, num); if(ret != 1) { xmlSecOpenSSLError2("RAND_priv_bytes", NULL, "size=" XMLSEC_SIZE_FMT, size); return(-1); } /* done */ return(0); } #endif /* XMLSEC_OPENSSL_API_300 */ /** * @brief Generates random bytes into @p buffer. * @details Generates @p size random bytes and puts result in @p buffer. * @param buffer the destination buffer. * @param size the numer of bytes to generate. * @return 0 on success or a negative value otherwise. */ int xmlSecOpenSSLGenerateRandom(xmlSecBufferPtr buffer, xmlSecSize size) { int ret; xmlSecAssert2(buffer != NULL, -1); xmlSecAssert2(size > 0, -1); ret = xmlSecBufferSetSize(buffer, size); if(ret < 0) { xmlSecInternalError2("xmlSecBufferSetSize", NULL, "size=" XMLSEC_SIZE_FMT, size); return(-1); } /* get random data */ ret = xmlSecOpenSSLGenerateRandomBytes(xmlSecBufferGetData(buffer), xmlSecBufferGetSize(buffer)); if(ret < 0) { xmlSecInternalError2("xmlSecOpenSSLGenerateRandomBytes", NULL, "size =" XMLSEC_SIZE_FMT, size); return(-1); } /* done */ return(0); } /** * @brief The errors reporting callback function. * @param file the error location file name (__FILE__ macro). * @param line the error location line number (__LINE__ macro). * @param func the error location function name (__FUNCTION__ macro). * @param errorObject the error specific error object * @param errorSubject the error specific error subject. * @param reason the error code. * @param msg the additional error message. * */ void xmlSecOpenSSLErrorsDefaultCallback(const char* file, int line, const char* func, const char* errorObject, const char* errorSubject, int reason, const char* msg) { #if !defined(XMLSEC_OPENSSL_API_300) && !defined(OPENSSL_IS_BORINGSSL) && !defined(OPENSSL_IS_AWSLC) && !defined(OPENSSL_NO_ERR) ERR_put_error(gXmlSecOpenSSLErrorsLib, XMLSEC_OPENSSL_ERRORS_FUNCTION, reason, file, line); #endif /* !defined(XMLSEC_OPENSSL_API_300) && !defined(OPENSSL_IS_BORINGSSL) && !defined(OPENSSL_NO_ERR) */ xmlSecErrorsDefaultCallback(file, line, func, errorObject, errorSubject, reason, msg); } static int xmlSecOpenSSLErrorsInit(void) { #if !defined(XMLSEC_OPENSSL_API_300) && !defined(OPENSSL_IS_BORINGSSL) && !defined(OPENSSL_IS_AWSLC) && !defined(OPENSSL_NO_ERR) xmlSecSize pos; /* get XMLSec library id */ gXmlSecOpenSSLErrorsLib = ERR_get_next_error_library(); /* initialize xmlsec lib name array */ memset(xmlSecOpenSSLStrLib, 0, sizeof(xmlSecOpenSSLStrLib)); xmlSecOpenSSLStrLib[0].error = ERR_PACK(gXmlSecOpenSSLErrorsLib, 0, 0); xmlSecOpenSSLStrLib[0].string = gXmlSecOpenSSLErrorsLibName; /* initialize xmlsec default error array */ memset(xmlSecOpenSSLStrDefReason, 0, sizeof(xmlSecOpenSSLStrDefReason)); xmlSecOpenSSLStrDefReason[0].error = ERR_PACK(gXmlSecOpenSSLErrorsLib, XMLSEC_OPENSSL_ERRORS_FUNCTION, 0); xmlSecOpenSSLStrDefReason[0].string = gXmlSecOpenSSLErrorsDefault; /* initialize reasons array */ memset(xmlSecOpenSSLStrReasons, 0, sizeof(xmlSecOpenSSLStrReasons)); for(pos = 0; (pos < XMLSEC_ERRORS_MAX_NUMBER) && (xmlSecErrorsGetMsg(pos) != NULL); ++pos) { xmlSecOpenSSLStrReasons[pos].error = ERR_PACK(gXmlSecOpenSSLErrorsLib, XMLSEC_OPENSSL_ERRORS_FUNCTION, xmlSecErrorsGetCode(pos)); xmlSecOpenSSLStrReasons[pos].string = xmlSecErrorsGetMsg(pos); } /* load xmlsec strings in OpenSSL */ ERR_load_strings(gXmlSecOpenSSLErrorsLib, xmlSecOpenSSLStrLib); /* define xmlsec lib name */ ERR_load_strings(gXmlSecOpenSSLErrorsLib, xmlSecOpenSSLStrDefReason); /* define default reason */ ERR_load_strings(gXmlSecOpenSSLErrorsLib, xmlSecOpenSSLStrReasons); #endif /* !defined(XMLSEC_OPENSSL_API_300) && !defined(OPENSSL_IS_BORINGSSL) && !defined(OPENSSL_NO_ERR) */ /* and set default errors callback for xmlsec to us */ xmlSecErrorsSetSystemCallback(xmlSecOpenSSLErrorsDefaultCallback); return(0); } static void xmlSecOpenSSLErrorsShutdown(void) { /* remove callback */ xmlSecErrorsSetSystemCallback(xmlSecErrorsDefaultCallback); #if !defined(XMLSEC_OPENSSL_API_300) && !defined(OPENSSL_IS_BORINGSSL) && !defined(OPENSSL_IS_AWSLC) && !defined(OPENSSL_NO_ERR) /* unload xmlsec strings from OpenSSL */ ERR_unload_strings(gXmlSecOpenSSLErrorsLib, xmlSecOpenSSLStrLib); ERR_unload_strings(gXmlSecOpenSSLErrorsLib, xmlSecOpenSSLStrDefReason); ERR_unload_strings(gXmlSecOpenSSLErrorsLib, xmlSecOpenSSLStrReasons); #endif /* !defined(XMLSEC_OPENSSL_API_300) && !defined(OPENSSL_IS_BORINGSSL) && !defined(OPENSSL_NO_ERR) */ } /** * @brief Sets the default trusted certs folder. * @param path the default trusted certs path. * @return 0 on success or a negative value if an error occurs. */ int xmlSecOpenSSLSetDefaultTrustedCertsFolder(const xmlChar* path) { if(gXmlSecOpenSSLTrustedCertsFolder != NULL) { xmlFree(gXmlSecOpenSSLTrustedCertsFolder); gXmlSecOpenSSLTrustedCertsFolder = NULL; } if(path != NULL) { gXmlSecOpenSSLTrustedCertsFolder = xmlStrdup(BAD_CAST path); if(gXmlSecOpenSSLTrustedCertsFolder == NULL) { xmlSecStrdupError(BAD_CAST path, NULL); return(-1); } } return(0); } /** * @brief Gets the default trusted certs folder. * @return the default trusted cert folder. */ const xmlChar* xmlSecOpenSSLGetDefaultTrustedCertsFolder(void) { return(gXmlSecOpenSSLTrustedCertsFolder); } #ifdef XMLSEC_OPENSSL_API_300 static OSSL_LIB_CTX* gXmlSecOpenSSLLibCtx = NULL; /** * @param libctx the OSSL_LIB_CTX object to be used by xmlsec-openssl * or NULL to use default. * * Sets the OSSL_LIB_CTX object to be used by xmlsec-openssl. The caller is * responsible for lifetime of this object. * * @return 0 on success or a negative value if an error occurs. */ int xmlSecOpenSSLSetLibCtx(OSSL_LIB_CTX* libctx) { gXmlSecOpenSSLLibCtx = libctx; return(0); } /** * @brief Gets the current OSSL_LIB_CTX object to be used by xmlsec-openssl or * NULL if the default one is used. * * @return the current OSSL_LIB_CTX object or NULL if default is used. */ OSSL_LIB_CTX* xmlSecOpenSSLGetLibCtx(void) { return(gXmlSecOpenSSLLibCtx); } #endif /* XMLSEC_OPENSSL_API_300 */ /****************************************************************************** * * BIO helpers * *****************************************************************************/ /** * @brief Creates a memory BIO for OpenSSL 3.0. * @details Creates a memory BIO using xmlSecOpenSSLGetLibCtx() for OpenSSL 3.0. * @return the pointer to BIO object or NULL if an error occurs. */ BIO* xmlSecOpenSSLCreateMemBio(void) { BIO* bio = NULL; bio = BIO_new_ex(xmlSecOpenSSLGetLibCtx(), BIO_s_mem()); if(bio == NULL) { xmlSecOpenSSLError("BIO_new_ex(BIO_s_mem())", NULL); return(NULL); } return(bio); } /** * @brief Creates a read-only memory BIO using xmlSecOpenSSLGetLibCtx() for * @param buf the data * @param bufSize the data size * * OpenSSL 3.0 containing @p len bytes of data from @p buf. * * @return the pointer to BIO object or NULL if an error occurs/ */ BIO* xmlSecOpenSSLCreateMemBufBio(const xmlSecByte *buf, xmlSecSize bufSize) { BIO* bio = NULL; int bufLen; xmlSecAssert2(buf != NULL, NULL); XMLSEC_SAFE_CAST_SIZE_TO_INT(bufSize, bufLen, return(NULL), NULL); bio = BIO_new_mem_buf((const void*)buf, bufLen); if(bio == NULL) { xmlSecOpenSSLError2("BIO_new_mem_buf", NULL, "dataSize=%d", bufLen); return(NULL); } return(bio); } /** * @brief Creates a read-only file BIO using xmlSecOpenSSLGetLibCtx() for * @param path the file path * * OpenSSL 3.0. * * @return the pointer to BIO object or NULL if an error occurs/ */ BIO* xmlSecOpenSSLCreateReadFileBio(const char* path) { BIO* bio = NULL; xmlSecAssert2(path != NULL, NULL); bio = BIO_new_ex(xmlSecOpenSSLGetLibCtx(), BIO_s_file()); if(bio == NULL) { xmlSecOpenSSLError("BIO_new_ex(BIO_s_file())", NULL); return(NULL); } if(BIO_read_filename(bio, path) != 1) { xmlSecOpenSSLError2("BIO_read_filename", NULL, "path=%s", xmlSecErrorsSafeString(path)); BIO_free_all(bio); return(NULL); } return(bio); }