/* */ #ifndef _D_MESSAGE_DIGEST_H_ #define _D_MESSAGE_DIGEST_H_ #include "common.h" #ifdef ENABLE_SSL #define MAX_MD_LENGTH (16+20) #ifdef HAVE_LIBSSL #include #endif // HAVE_LIBSSL #ifdef HAVE_LIBGCRYPT #include #endif // HAVE_LIBGCRYPT class MessageDigestContext { public: #ifdef HAVE_LIBSSL typedef const EVP_MD* DigestAlgo; # define DIGEST_ALGO_MD5 EVP_md5() # define DIGEST_ALGO_SHA1 EVP_sha1() #endif // HAVE_LIBSSL #ifdef HAVE_LIBGCRYPT typedef int32_t DigestAlgo; # define DIGEST_ALGO_MD5 GCRY_MD_MD5 # define DIGEST_ALGO_SHA1 GCRY_MD_SHA1 #endif // HAVE_LIBGCRYPT private: #ifdef HAVE_LIBSSL EVP_MD_CTX ctx; #endif // HAVE_LIBSSL #ifdef HAVE_LIBGCRYPT gcry_md_hd_t ctx; #endif // HAVE_LIBGCRYPT DigestAlgo algo; public: MessageDigestContext(): algo(DIGEST_ALGO_SHA1) {} MessageDigestContext(DigestAlgo algo): algo(algo) {} ~MessageDigestContext() { digestFree(); } #if defined(HAVE_OLD_LIBSSL) void digestInit() {EVP_DigestInit(&ctx, algo);} void digestReset() {EVP_DigestInit(&ctx, algo);} void digestUpdate(const void* data, int32_t length) {EVP_DigestUpdate(&ctx, data, length);} void digestFinal(unsigned char* md) { int32_t len; EVP_DigestFinal(&ctx, md, (uint32_t*)&len); } void digestFree() {/*empty*/} int32_t digestLength() const { return digestLength(algo); } static int32_t digestLength(DigestAlgo algo) { return EVP_MD_size(algo); } #elif defined(HAVE_LIBSSL) void digestInit() { EVP_MD_CTX_init(&ctx); digestReset(); } void digestReset() { EVP_DigestInit_ex(&ctx, algo, 0); } void digestUpdate(const void* data, int32_t length) { EVP_DigestUpdate(&ctx, data, length); } void digestFinal(unsigned char* md) { int32_t len; EVP_DigestFinal_ex(&ctx, md, (uint32_t*)&len); } void digestFree() { EVP_MD_CTX_cleanup(&ctx); } int32_t digestLength() const { return digestLength(algo); } static int32_t digestLength(DigestAlgo algo) { return EVP_MD_size(algo); } #elif defined(HAVE_LIBGCRYPT) void digestInit() { gcry_md_open(&ctx, algo, 0); } void digestReset() { gcry_md_reset(ctx); } void digestUpdate(const void* data, int32_t length) { gcry_md_write(ctx, data, length); } void digestFinal(unsigned char* md) { gcry_md_final(ctx); memcpy(md, gcry_md_read(ctx, 0), gcry_md_get_algo_dlen(algo)); } void digestFree() { gcry_md_close(ctx); } int32_t digestLength() const { return digestLength(algo); } static int digestLength(DigestAlgo algo) { return gcry_md_get_algo_dlen(algo); } #endif // HAVE_LIBGCRYPT }; typedef SharedHandle MessageDigestContextHandle; #endif // ENABLE_SSL #endif // _D_MESSAGE_DIGEST_H_