00001 
00002 
00003 
00004 
00005 
00006 
00007 #pragma once
00008 
00009 #ifdef SWIFTEN_PLATFORM_WIN32
00010 #include "SHA1_Windows.h"
00011 #else
00012 
00013 #include <vector>
00014 #include <boost/cstdint.hpp>
00015 
00016 #include <Swiften/Base/API.h>
00017 #include <Swiften/Base/ByteArray.h>
00018 #include <Swiften/Base/SafeByteArray.h>
00019 
00020 namespace Swift {
00021   class SWIFTEN_API SHA1 {
00022     public:
00023       SHA1();
00024 
00025       SHA1& update(const std::vector<unsigned char>& data);
00026       std::vector<unsigned char> getHash() const;
00027 
00033       static ByteArray getHash(const ByteArray& data);
00034       static ByteArray getHash(const SafeByteArray& data);
00035 
00036       ByteArray operator()(const SafeByteArray& data) {
00037         return getHash(data);
00038       }
00039 
00040       ByteArray operator()(const ByteArray& data) {
00041         return getHash(data);
00042       }
00043 
00044     private:
00045       typedef struct {
00046           boost::uint32_t state[5];
00047           boost::uint32_t count[2];
00048           boost::uint8_t buffer[64];
00049       } CTX;
00050       static void Init(CTX* context);
00051       static void Transform(boost::uint32_t state[5], boost::uint8_t buffer[64]);
00052       static void Update(CTX* context, boost::uint8_t* data, unsigned int len);
00053       static void Final(boost::uint8_t digest[20], CTX* context);
00054 
00055       template<typename Container> static ByteArray getHashInternal(const Container& input);
00056 
00057     private:
00058       CTX context;
00059   };
00060 }
00061 
00062 #endif