diff options
Diffstat (limited to 'Swiften/StringCodecs/HMAC.h')
| -rw-r--r-- | Swiften/StringCodecs/HMAC.h | 25 | 
1 files changed, 17 insertions, 8 deletions
diff --git a/Swiften/StringCodecs/HMAC.h b/Swiften/StringCodecs/HMAC.h index 438a3a7..cf0abfe 100644 --- a/Swiften/StringCodecs/HMAC.h +++ b/Swiften/StringCodecs/HMAC.h @@ -12,16 +12,25 @@  namespace Swift {  	namespace HMAC_Detail { -		static const unsigned int B = 64; +		template<typename KeyType> struct KeyWrapper; +		template<> struct KeyWrapper<ByteArray> { +			ByteArray wrap(const ByteArray& hash) const { +				return hash; +			} +		}; +		template<> struct KeyWrapper<SafeByteArray> { +			SafeByteArray wrap(const ByteArray& hash) const { +				return createSafeByteArray(hash); +			} +		}; -		template<typename Hash, typename KeyType> +		template<typename Hash, typename KeyType, int BlockSize>  		static ByteArray getHMAC(const KeyType& key, const ByteArray& data) { -			assert(key.size() <= B);  			Hash hash;  			// Create the padded key -			KeyType paddedKey(key); -			paddedKey.resize(B, 0x0); +			KeyType paddedKey(key.size() <= BlockSize ? key : KeyWrapper<KeyType>().wrap(hash(key))); +			paddedKey.resize(BlockSize, 0x0);  			// Create the first value  			KeyType x(paddedKey); @@ -41,17 +50,17 @@ namespace Swift {  		}  	}; -	template<typename Hash> +	template<typename Hash, int BlockSize>  	class HMAC {  		private:  		public:  			ByteArray operator()(const ByteArray& key, const ByteArray& data) const { -				return HMAC_Detail::getHMAC<Hash,ByteArray>(key, data); +				return HMAC_Detail::getHMAC<Hash,ByteArray,BlockSize>(key, data);  			}  			ByteArray operator()(const SafeByteArray& key, const ByteArray& data) const { -				return HMAC_Detail::getHMAC<Hash,SafeByteArray>(key, data); +				return HMAC_Detail::getHMAC<Hash,SafeByteArray,BlockSize>(key, data);  			}  	};  }  | 
 Swift