added optional use of openssl instead of public domain sha-1 implementation, ticket #13

This commit is contained in:
Arvid Norberg 2007-04-15 04:30:52 +00:00
parent 2f5e1ff6b2
commit 8cb1f9f899
3 changed files with 39 additions and 24 deletions

View File

@ -30,6 +30,10 @@ feature.compose <dht-support>on : ;
feature.compose <dht-support>off : <define>TORRENT_DISABLE_DHT ;
feature.compose <dht-support>logging : <define>TORRENT_DHT_VERBOSE_LOGGING ;
feature openssl : off on : composite propagated symmetric link-incompatible ;
feature.compose <openssl>off : ;
feature.compose <openssl>on : <define>TORRENT_USE_OPENSSL ;
SOURCES =
allocate_resources.cpp
alert.cpp
@ -56,7 +60,6 @@ SOURCES =
tracker_manager.cpp
http_tracker_connection.cpp
udp_tracker_connection.cpp
sha1.cpp
metadata_transfer.cpp
upnp.cpp
ut_pex.cpp
@ -117,6 +120,7 @@ if [ os.name ] = NT
DEFINES += WIN32 ;
}
lib openssl_lib : : <name>crypto ;
project torrent
@ -173,5 +177,7 @@ lib torrent
:
<dht-support>on:<source>src/$(KADEMLIA_SOURCES)
<dht-support>logging:<source>src/$(KADEMLIA_SOURCES)
<openssl>off:<source>src/sha1.cpp
<openssl>on:<library>openssl_lib
;

View File

@ -40,17 +40,25 @@ POSSIBILITY OF SUCH DAMAGE.
#include "libtorrent/config.hpp"
#include "zlib.h"
#ifdef TORRENT_USE_OPENSSL
extern "C"
{
#include <openssl/sha.h>
}
#else
// from sha1.cpp
struct TORRENT_EXPORT SHA1_CTX
struct TORRENT_EXPORT SHA_CTX
{
boost::uint32_t state[5];
boost::uint32_t count[2];
boost::uint8_t buffer[64];
};
TORRENT_EXPORT void SHA1Init(SHA1_CTX* context);
TORRENT_EXPORT void SHA1Update(SHA1_CTX* context, boost::uint8_t const* data, boost::uint32_t len);
TORRENT_EXPORT void SHA1Final(SHA1_CTX* context, boost::uint8_t* digest);
TORRENT_EXPORT void SHA1_Init(SHA_CTX* context);
TORRENT_EXPORT void SHA1_Update(SHA_CTX* context, boost::uint8_t const* data, boost::uint32_t len);
TORRENT_EXPORT void SHA1_Final(boost::uint8_t* digest, SHA_CTX* context);
#endif
namespace libtorrent
{
@ -79,33 +87,33 @@ namespace libtorrent
{
public:
hasher() { SHA1Init(&m_context); }
hasher() { SHA1_Init(&m_context); }
hasher(const char* data, int len)
{
SHA1Init(&m_context);
SHA1_Init(&m_context);
assert(data != 0);
assert(len > 0);
SHA1Update(&m_context, reinterpret_cast<unsigned char const*>(data), len);
SHA1_Update(&m_context, reinterpret_cast<unsigned char const*>(data), len);
}
void update(const char* data, int len)
{
assert(data != 0);
assert(len > 0);
SHA1Update(&m_context, reinterpret_cast<unsigned char const*>(data), len);
SHA1_Update(&m_context, reinterpret_cast<unsigned char const*>(data), len);
}
sha1_hash final()
{
sha1_hash digest;
SHA1Final(&m_context, digest.begin());
SHA1_Final(digest.begin(), &m_context);
return digest;
}
void reset() { SHA1Init(&m_context); }
void reset() { SHA1_Init(&m_context); }
private:
SHA1_CTX m_context;
SHA_CTX m_context;
};
}

View File

@ -25,16 +25,16 @@ using boost::uint8_t;
#include "libtorrent/config.hpp"
struct TORRENT_EXPORT SHA1_CTX
struct TORRENT_EXPORT SHA_CTX
{
uint32_t state[5];
uint32_t count[2];
uint8_t buffer[64];
};
TORRENT_EXPORT void SHA1Init(SHA1_CTX* context);
TORRENT_EXPORT void SHA1Update(SHA1_CTX* context, uint8_t const* data, uint32_t len);
TORRENT_EXPORT void SHA1Final(SHA1_CTX* context, uint8_t* digest);
TORRENT_EXPORT void SHA1_Init(SHA_CTX* context);
TORRENT_EXPORT void SHA1_Update(SHA_CTX* context, uint8_t const* data, uint32_t len);
TORRENT_EXPORT void SHA1_Final(uint8_t* digest, SHA_CTX* context);
namespace
{
@ -125,7 +125,7 @@ namespace
a = b = c = d = e = 0;
}
void SHAPrintContext(SHA1_CTX *context, char *msg)
void SHAPrintContext(SHA_CTX *context, char *msg)
{
using namespace std;
printf("%s (%d,%d) %x %x %x %x %x\n"
@ -136,7 +136,7 @@ namespace
}
template <class BlkFun>
void internal_update(SHA1_CTX* context, uint8_t const* data, uint32_t len)
void internal_update(SHA_CTX* context, uint8_t const* data, uint32_t len)
{
using namespace std;
uint32_t i, j; // JHB
@ -176,7 +176,7 @@ namespace
// SHA1Init - Initialize new context
void SHA1Init(SHA1_CTX* context)
void SHA1_Init(SHA_CTX* context)
{
// SHA1 initialization constants
context->state[0] = 0x67452301;
@ -190,7 +190,7 @@ void SHA1Init(SHA1_CTX* context)
// Run your data through this.
void SHA1Update(SHA1_CTX* context, uint8_t const* data, uint32_t len)
void SHA1_Update(SHA_CTX* context, uint8_t const* data, uint32_t len)
{
#if defined __BIG_ENDIAN__
internal_update<big_endian_blk0>(context, data, len);
@ -209,7 +209,7 @@ void SHA1Update(SHA1_CTX* context, uint8_t const* data, uint32_t len)
// Add padding and return the message digest.
void SHA1Final(SHA1_CTX* context, uint8_t* digest)
void SHA1_Final(uint8_t* digest, SHA_CTX* context)
{
uint8_t finalcount[8];
@ -221,10 +221,10 @@ void SHA1Final(SHA1_CTX* context, uint8_t* digest)
>> ((3-(i & 3)) * 8) ) & 255);
}
SHA1Update(context, (uint8_t const*)"\200", 1);
SHA1_Update(context, (uint8_t const*)"\200", 1);
while ((context->count[0] & 504) != 448)
SHA1Update(context, (uint8_t const*)"\0", 1);
SHA1Update(context, finalcount, 8); // Should cause a SHA1Transform()
SHA1_Update(context, (uint8_t const*)"\0", 1);
SHA1_Update(context, finalcount, 8); // Should cause a SHA1Transform()
for (uint32_t i = 0; i < 20; ++i)
{
@ -301,6 +301,7 @@ By Arvid Norberg <arvidn@sourceforge.net>
4- using anonymous namespace to avoid external
linkage on internal functions
5- using standard C++ includes
6- made API compatible with openssl
still 100% PD
*/