From 0a525477e35468830b36ac51872800971c9f81dc Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Thu, 9 May 2013 02:32:12 +0000 Subject: [PATCH] use apple's common crypto for sha-1 and add missing source file --- include/libtorrent/config.hpp | 16 +++- include/libtorrent/hasher.hpp | 9 +++ src/hasher.cpp | 135 ++++++++++++++++++++++++++++++++++ 3 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 src/hasher.cpp diff --git a/include/libtorrent/config.hpp b/include/libtorrent/config.hpp index 346b6c0d7..8d3f22e60 100644 --- a/include/libtorrent/config.hpp +++ b/include/libtorrent/config.hpp @@ -183,7 +183,17 @@ POSSIBILITY OF SUCH DAMAGE. #define TORRENT_USE_ICONV 0 #define TORRENT_USE_LOCALE 0 #define TORRENT_CLOSE_MAY_BLOCK 1 -#endif + +#include + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1070 +#ifdef TORRENT_USE_OPENSSL +#define TORRENT_USE_COMMONCRYPTO 1 +#endif // TORRENT_USE_OPENSSL +#endif // MAC_OS_X_VERSION_MIN_REQUIRED + +#endif // __APPLE__ + #else // FreeBSD has a reasonable iconv signature #define TORRENT_ICONV_ARG (const char**) @@ -397,6 +407,10 @@ inline int snprintf(char* buf, int len, char const* fmt, ...) #define TORRENT_DEPRECATED_PREFIX #endif +#ifndef TORRENT_USE_COMMONCRYPTO +#define TORRENT_USE_COMMONCRYPTO 0 +#endif + #ifndef TORRENT_DEPRECATED #define TORRENT_DEPRECATED #endif diff --git a/include/libtorrent/hasher.hpp b/include/libtorrent/hasher.hpp index e48450baf..a0806b6ed 100644 --- a/include/libtorrent/hasher.hpp +++ b/include/libtorrent/hasher.hpp @@ -41,11 +41,18 @@ POSSIBILITY OF SUCH DAMAGE. #ifdef TORRENT_USE_GCRYPT #include + +#elif TORRENT_USE_COMMONCRYPTO + +#include + #elif defined TORRENT_USE_OPENSSL + extern "C" { #include } + #else // from sha1.cpp namespace libtorrent @@ -93,6 +100,8 @@ namespace libtorrent #ifdef TORRENT_USE_GCRYPT gcry_md_hd_t m_context; +#elif TORRENT_USE_COMMONCRYPTO + CC_SHA1_CTX m_context; #elif defined TORRENT_USE_OPENSSL SHA_CTX m_context; #else diff --git a/src/hasher.cpp b/src/hasher.cpp new file mode 100644 index 000000000..4d1322770 --- /dev/null +++ b/src/hasher.cpp @@ -0,0 +1,135 @@ +/* + +Copyright (c) 2003-2012, Arvid Norberg +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution. + * Neither the name of the author nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include "libtorrent/hasher.hpp" + +namespace libtorrent +{ + hasher::hasher() + { +#ifdef TORRENT_USE_GCRYPT + gcry_md_open(&m_context, GCRY_MD_SHA1, 0); +#elif TORRENT_USE_COMMONCRYPTO + CC_SHA1_Init(&m_context); +#elif defined TORRENT_USE_OPENSSL + SHA1_Init(&m_context); +#else + SHA1_init(&m_context); +#endif + } + + hasher::hasher(const char* data, int len) + { + TORRENT_ASSERT(data != 0); + TORRENT_ASSERT(len > 0); +#ifdef TORRENT_USE_GCRYPT + gcry_md_open(&m_context, GCRY_MD_SHA1, 0); + gcry_md_write(m_context, data, len); +#elif TORRENT_USE_COMMONCRYPTO + CC_SHA1_Init(&m_context); + CC_SHA1_Update(&m_context, reinterpret_cast(data), len); +#elif defined TORRENT_USE_OPENSSL + SHA1_Init(&m_context); + SHA1_Update(&m_context, reinterpret_cast(data), len); +#else + SHA1_init(&m_context); + SHA1_update(&m_context, reinterpret_cast(data), len); +#endif + } + +#ifdef TORRENT_USE_GCRYPT + hasher::hasher(hasher const& h) + { + gcry_md_copy(&m_context, h.m_context); + } + + hasher& hasher::operator=(hasher const& h) + { + gcry_md_close(m_context); + gcry_md_copy(&m_context, h.m_context); + return *this; + } +#endif + + void hasher::update(const char* data, int len) + { + TORRENT_ASSERT(data != 0); + TORRENT_ASSERT(len > 0); +#ifdef TORRENT_USE_GCRYPT + gcry_md_write(m_context, data, len); +#elif TORRENT_USE_COMMONCRYPTO + CC_SHA1_Update(&m_context, reinterpret_cast(data), len); +#elif defined TORRENT_USE_OPENSSL + SHA1_Update(&m_context, reinterpret_cast(data), len); +#else + SHA1_update(&m_context, reinterpret_cast(data), len); +#endif + } + + sha1_hash hasher::final() + { + sha1_hash digest; +#ifdef TORRENT_USE_GCRYPT + gcry_md_final(m_context); + digest.assign((const char*)gcry_md_read(m_context, 0)); +#elif TORRENT_USE_COMMONCRYPTO + CC_SHA1_Final(digest.begin(), &m_context); +#elif defined TORRENT_USE_OPENSSL + SHA1_Final(digest.begin(), &m_context); +#else + SHA1_final(digest.begin(), &m_context); +#endif + return digest; + } + + void hasher::reset() + { +#ifdef TORRENT_USE_GCRYPT + gcry_md_reset(m_context); +#elif TORRENT_USE_COMMONCRYPTO + CC_SHA1_Init(&m_context); +#elif defined TORRENT_USE_OPENSSL + SHA1_Init(&m_context); +#else + SHA1_init(&m_context); +#endif + } + +#ifdef TORRENT_USE_GCRYPT + hasher::~hasher() + { + gcry_md_close(m_context); + } +#endif + +} +