hmac.h

来自「各种加密算法的集合」· C头文件 代码 · 共 70 行

H
70
字号
#ifndef CRYPTOPP_HMAC_H 
#define CRYPTOPP_HMAC_H 
 
#include "cryptlib.h" 
#include "misc.h" 
 
NAMESPACE_BEGIN(CryptoPP) 
 
// HMAC(K, text) = H(K XOR opad, H(K XOR ipad, text)) 
 
template <class T> class HMAC : public MessageAuthenticationCode 
{ 
public: 
	// put enums here for Metrowerks 4 
	enum {KEYLENGTH=16, MAX_KEYLENGTH=T::DATASIZE, DIGESTSIZE=T::DIGESTSIZE, DATASIZE=T::DATASIZE}; 
 
	HMAC(const byte *userKey, unsigned int keylength=KEYLENGTH); 
	void Update(const byte *input, unsigned int length); 
	void Final(byte *mac); 
	unsigned int DigestSize() const {return DIGESTSIZE;} 
 
private: 
	enum {IPAD=0x36, OPAD=0x5c}; 
 
	void Init(); 
 
	SecByteBlock k_ipad, k_opad; 
	T hash; 
}; 
 
template <class T> 
HMAC<T>::HMAC(const byte *userKey, unsigned int keylength) 
	: k_ipad(MAX_KEYLENGTH), k_opad(MAX_KEYLENGTH) 
{ 
	memset(k_ipad, IPAD, MAX_KEYLENGTH); 
	xorbuf(k_ipad, userKey, keylength); 
 
	memset(k_opad, OPAD, MAX_KEYLENGTH); 
	xorbuf(k_opad, userKey, keylength); 
 
	Init(); 
} 
 
template <class T> 
void HMAC<T>::Init() 
{ 
	hash.Update(k_ipad, MAX_KEYLENGTH); 
} 
 
template <class T> 
void HMAC<T>::Update(const byte *input, unsigned int length) 
{ 
	hash.Update(input, length); 
} 
 
template <class T> 
void HMAC<T>::Final(byte *mac) 
{ 
	hash.Final(mac); 
 
	hash.Update(k_opad, MAX_KEYLENGTH); 
	hash.Update(mac, DIGESTSIZE); 
	hash.Final(mac); 
	Init(); 
} 
 
NAMESPACE_END 
 
#endif 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?