Crypt-Rhash
view release on metacpan or search on metacpan
librhash/plug_openssl.c view on Meta::CPAN
#endif
#ifndef OPENSSL_NO_WHIRLPOOL
/* wrapping WHIRLPOOL_Final requires special attention. */
static void wrapWHIRLPOOL_Final(void* ctx, unsigned char* result)
{
/* must pass NULL as the result argument, otherwise ctx will be zeroed */
CALL_FINAL(WHIRLPOOL, NULL, ctx);
memcpy(result, ((WHIRLPOOL_CTX*)ctx)->H.c, 64);
}
#endif
rhash_info info_sslwhpl = { RHASH_WHIRLPOOL, 0, 64, "WHIRLPOOL", "whirlpool" };
/* The table of supported OpenSSL hash functions */
rhash_hash_info rhash_openssl_methods[] = {
{ &info_md4, sizeof(MD4_CTX), offsetof(MD4_CTX, A), HASH_INFO_METHODS(MD4) }, /* 128 bit */
{ &info_md5, sizeof(MD5_CTX), offsetof(MD5_CTX, A), HASH_INFO_METHODS(MD5) }, /* 128 bit */
{ &info_sha1, sizeof(SHA_CTX), offsetof(SHA_CTX, h0), HASH_INFO_METHODS(SHA1) }, /* 160 bit */
{ &info_sha224, sizeof(SHA256_CTX), offsetof(SHA256_CTX, h), HASH_INFO_METHODS(SHA224) }, /* 224 bit */
{ &info_sha256, sizeof(SHA256_CTX), offsetof(SHA256_CTX, h), HASH_INFO_METHODS(SHA256) }, /* 256 bit */
{ &info_sha384, sizeof(SHA512_CTX), offsetof(SHA512_CTX, h), HASH_INFO_METHODS(SHA384) }, /* 384 bit */
{ &info_sha512, sizeof(SHA512_CTX), offsetof(SHA512_CTX, h), HASH_INFO_METHODS(SHA512) }, /* 512 bit */
#ifndef OPENSSL_NO_RIPEMD
{ &info_rmd160, sizeof(RIPEMD160_CTX), offsetof(RIPEMD160_CTX, A), HASH_INFO_METHODS(RIPEMD160) }, /* 160 bit */
#else
{ 0, 0, 0, 0, 0, 0, 0},
#endif
#ifndef OPENSSL_NO_WHIRLPOOL
{ &info_sslwhpl, sizeof(WHIRLPOOL_CTX), offsetof(WHIRLPOOL_CTX, H.c), HASH_INFO_METHODS(WHIRLPOOL) }, /* 512 bit */
#endif
};
/* The rhash_openssl_hash_info static array initialized by rhash_plug_openssl() replaces
* rhash internal algorithms table. It is kept in an uninitialized-data segment
* taking no space in the executable. */
rhash_hash_info rhash_openssl_hash_info[RHASH_HASH_COUNT];
#ifdef OPENSSL_RUNTIME
#if (defined(_WIN32) || defined(__CYGWIN__)) /* __CYGWIN__ is also defined in MSYS */
# define GET_DLSYM(name) (void(*)(void))GetProcAddress(handle, name)
#else /* _WIN32 */
# define GET_DLSYM(name) dlsym(handle, name)
#endif /* _WIN32 */
#define LOAD_ADDR(n, name) \
p##name##_final = (os_fin_t)GET_DLSYM(#name "_Final"); \
rhash_openssl_methods[n].update = (pupdate_t)GET_DLSYM(#name "_Update"); \
rhash_openssl_methods[n].init = (rhash_openssl_methods[n].update && p##name##_final ? \
(pinit_t)GET_DLSYM(#name "_Init") : 0);
/**
* Load OpenSSL DLL at runtime, store pointers to functions of all
* supported hash algorithms.
*
* @return 1 on success, 0 if the library not found
*/
static int load_openssl_runtime(void)
{
#if defined(_WIN32) || defined(__CYGWIN__)
HMODULE handle;
/* suppress the error popup dialogs */
UINT oldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS);
SetErrorMode(oldErrorMode | SEM_FAILCRITICALERRORS);
#if defined(_WIN32)
handle = LoadLibraryA("libeay32.dll");
#elif defined(__MSYS__) /* MSYS also defines __CYGWIN__ */
handle = LoadLibraryA("msys-crypto-1.0.0.dll");
#elif defined(__CYGWIN__)
handle = LoadLibraryA("cygcrypto-1.0.0.dll");
#endif
SetErrorMode(oldErrorMode); /* restore error mode */
#else
static const char* libNames[] = {
"libcrypto.so",
"libcrypto.so.1.1",
"libcrypto.so.1.0.2",
"libcrypto.so.1.0.0",
"libcrypto.so.0.9.8",
};
void* handle = 0;
size_t i;
for (i = 0; !handle && i < (sizeof(libNames) / sizeof(*libNames)); i++)
handle = dlopen(libNames[i], RTLD_NOW);
#endif
if (handle == NULL) return 0; /* could not load OpenSSL */
LOAD_ADDR(0, MD4)
LOAD_ADDR(1, MD5);
LOAD_ADDR(2, SHA1);
LOAD_ADDR(3, SHA224);
LOAD_ADDR(4, SHA256);
LOAD_ADDR(5, SHA384);
LOAD_ADDR(6, SHA512);
#ifndef OPENSSL_NO_RIPEMD
LOAD_ADDR(7, RIPEMD160);
#endif
#ifndef OPENSSL_NO_WHIRLPOOL
LOAD_ADDR(8, WHIRLPOOL);
#endif
return 1;
}
#endif /* OPENSSL_RUNTIME */
/**
* Replace several RHash internal algorithms with the OpenSSL ones.
* It can replace MD4/MD5, SHA1/SHA2, RIPEMD, WHIRLPOOL.
*
* @return 1 on success, 0 if OpenSSL library not found
*/
int rhash_plug_openssl(void)
{
size_t i;
unsigned bit_index;
assert(rhash_info_size <= RHASH_HASH_COUNT); /* buffer-overflow protection */
if ( (rhash_openssl_hash_mask & RHASH_OPENSSL_SUPPORTED_HASHES) == 0) {
return 1; /* do not load OpenSSL */
}
( run in 0.796 second using v1.01-cache-2.11-cpan-364913b4093 )