blob: 3d89edb85677f0bb4d86b99af1d3669e916f61c6 [file] [log] [blame]
/* -------------------------------------------------------------------------------------------------------------------@udN
* °æÈ¨ËùÓÐ(C)2012, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
*
* ÎÄ ¼þ Ãû: drv_hash.c
*
------------------------------------------------------------------------------------------------------------*/
#include "drv_hash.h"
#include <sdio.h>
/**-------------------------------------------------------------------------------------------------------------------@n
*Hash_set_len ¹¦ÄÜÏêÊö:
½«ÏûÏ¢³¤¶ÈÒÔbitΪµ¥Î»ÅäÖõ½³¤¶È¼Ä´æÆ÷ÖÐ
--------------------------------------------------------------
×¢Òâ:
±¾º¯Êý¿¼Âǵ½¼ÆËãhashµÄÊý¾Ý³¤¶ÈÒ»°ã¶¼Êǰ´byte´«È룬ÇÒ×ÜÁ¿²»»á³¬¹ý4G byte£¬
Òò´Ë¼ò»¯Á˺¯Êý¹¦ÄÜ¡£
byte_Len ×ÜÊý²»Äܳ¬¹ý4G£¬·ñÔò¸Ãº¯ÊýÐèÒªÖØÐÂÐ޸ġ£
*--------------------------------------------------------------------------------------------------------------------*/
static void hash_SetLen(u32 byte_Len)
{
REG32(HASH_LENGTH0) = byte_Len<<3;
REG32(HASH_LENGTH1) = byte_Len>>29;
REG32(HASH_LENGTH2) = 0;
REG32(HASH_LENGTH3) = 0;
}
#ifdef HASH_CODE_SUPPORT_ALL
static void hash_SetHmacKey(u32* pHmacKey, u32* HmacKey_len)
{
u32 udI;
for(udI=0;udI<32;udI++)
{
//¼Ä´æÆ÷¸ßµØÖ·´æ·ÅµÍλÊý¾Ý£¬Êý¾Ý´æ·ÅÊǵ͵ØÖ··Å¸ßλÊý¾Ý
if(udI<(32-HmacKey_len))
REG32(HASH_HMACKEY+udI*4) = 0;
else
REG32(HASH_HMACKEY+udI*4) = pHmacKey[udI-(32-HmacKey_len)];
}
}
#endif
/* ·µ»Øhash ¼ÆËã½á¹ûºÍ½á¹ûµÄ³¤¶È£¬³¤¶Èµ¥Î»ÊÇword */
static void hash_GetResult(u32 udMode, u32* HashResult, u32* ResultLen)
{
u32 udI, udResultLen=0;
#ifdef HASH_CODE_SUPPORT_ALL
switch(udMode)
{
case HASH_MODE_MD5:
case HASH_MODE_HMAC_MD5:
udResultLen = 4; /* 4*4bytes = 128bit*/
break;
case HASH_MODE_SHA1:
case HASH_MODE_HMAC_SHA1:
udResultLen = 5; /* 160 bit */
break;
case HASH_MODE_SHA224:
case HASH_MODE_HMAC_SHA224:
udResultLen = 7; /* 224 bit */
break;
case HASH_MODE_SHA256:
case HASH_MODE_HMAC_SHA256:
udResultLen = 8; /* 256 bit */
break;
case HASH_MODE_SHA384:
case HASH_MODE_HMAC_SHA384:
udResultLen = 12; /* 384 bit */
break;
case HASH_MODE_SHA512:
case HASH_MODE_HMAC_SHA512:
udResultLen = 16; /* 512 bit */
break;
default:
break;
}
#else
udResultLen = 4;
#endif
*ResultLen = udResultLen;
for(udI=0;udI<udResultLen;udI++) //hash¼ÆËãÖ§³Ö128bitÊý¾Ý
{
//¼Ä´æÆ÷µÍµØÖ·´æ·Åresult µÄ¸ßλ
HashResult[udI] = REG32(HASH_RESULT+(16-udResultLen+udI)*4);
}
}
/**-------------------------------------------------------------------------------------------------------------------@n
* @brief HASHÄ£¿éÇý¶¯½Ó¿Ú
*
* ¹¦ÄÜÏêÊö:
* - Hash_Computeº¯ÊýÊôÓÚ½Ó¿Úº¯Êý, Æä¹¦ÄÜÊÇ:
* - HASHÄ£¿éÇý¶¯½Ó¿Ú
*
* ²ÎÊý¸ÅÊö:
input:
udMode--------hashģʽ
udBigEndian----´óС¶Ë¸ñʽ
ploadAddr------¼ÆËãhashµÄÔ´Êý¾ÝÖ¸Õë
loadLen--------Ô´Êý¾Ý³¤¶È
pHmacKey------HMACģʽϵÄÃÜÔ¿
HmacKey_len---ÃÜÔ¿³¤¶È
output:
HashResult-----hash¼ÆËã½á¹û
ResultLen------hash½á¹ûµÄ³¤¶È
* ·µ »Ø Öµ: 0:³É¹¦ 1:ʧ°Ü
*--------------------------------------------------------------------------------------------------------------------*/
u32 Hash_Calculate(u32 udMode, u32 udBigEndian, u32* ploadAddr, u32 loadLen, u32* pHmacKey, u32* HmacKey_len, u32* HashResult, u32* ResultLen)
{
u32 udMessageLen_word;
u32 udI;
if((loadLen == 0) || (ploadAddr == NULL) || (HashResult == NULL) )
{
return 1;
}
//config hash mode and enable module
REG32(HASH_CONTROL) = (udMode<<4)|(udBigEndian<<12)|1;
hash_SetLen(loadLen);
#ifdef HASH_CODE_SUPPORT_ALL
//write HMAC key
if(udMode&0x10)
{
hash_SetHmacKey(pHmacKey, HmacKey_len);
}
#endif
REG32(HASH_START) = 1;//Hash_Start
//start write message data into fifo
udMessageLen_word = (loadLen+3)/4;
for(udI=0;udI<udMessageLen_word;udI++)
{
REG32(HASH_DATA) = ploadAddr[udI];
}
while(REG32(HASH_START) & 0x1); /* if cal busy, continue to wait*/
//read Result
hash_GetResult(udMode, HashResult, ResultLen);
REG32(HASH_CONTROL) = 0;//Hash_DisableModule;
return 0;
}
/** @} */