123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 |
- #include "stm32f4xx_hash.h"
- #define SHA1BUSY_TIMEOUT ((uint32_t) 0x00010000)
-
- ErrorStatus HASH_SHA1(uint8_t *Input, uint32_t Ilen, uint8_t Output[20])
- {
- HASH_InitTypeDef SHA1_HASH_InitStructure;
- HASH_MsgDigest SHA1_MessageDigest;
- __IO uint16_t nbvalidbitsdata = 0;
- uint32_t i = 0;
- __IO uint32_t counter = 0;
- uint32_t busystatus = 0;
- ErrorStatus status = SUCCESS;
- uint32_t inputaddr = (uint32_t)Input;
- uint32_t outputaddr = (uint32_t)Output;
-
- nbvalidbitsdata = 8 * (Ilen % 4);
-
- HASH_DeInit();
-
- SHA1_HASH_InitStructure.HASH_AlgoSelection = HASH_AlgoSelection_SHA1;
- SHA1_HASH_InitStructure.HASH_AlgoMode = HASH_AlgoMode_HASH;
- SHA1_HASH_InitStructure.HASH_DataType = HASH_DataType_8b;
- HASH_Init(&SHA1_HASH_InitStructure);
-
- HASH_SetLastWordValidBitsNbr(nbvalidbitsdata);
-
- for(i=0; i<Ilen; i+=4)
- {
- HASH_DataIn(*(uint32_t*)inputaddr);
- inputaddr+=4;
- }
-
- HASH_StartDigest();
-
- do
- {
- busystatus = HASH_GetFlagStatus(HASH_FLAG_BUSY);
- counter++;
- }while ((counter != SHA1BUSY_TIMEOUT) && (busystatus != RESET));
- if (busystatus != RESET)
- {
- status = ERROR;
- }
- else
- {
-
- HASH_GetDigest(&SHA1_MessageDigest);
- *(uint32_t*)(outputaddr) = __REV(SHA1_MessageDigest.Data[0]);
- outputaddr+=4;
- *(uint32_t*)(outputaddr) = __REV(SHA1_MessageDigest.Data[1]);
- outputaddr+=4;
- *(uint32_t*)(outputaddr) = __REV(SHA1_MessageDigest.Data[2]);
- outputaddr+=4;
- *(uint32_t*)(outputaddr) = __REV(SHA1_MessageDigest.Data[3]);
- outputaddr+=4;
- *(uint32_t*)(outputaddr) = __REV(SHA1_MessageDigest.Data[4]);
- }
- return status;
- }
- ErrorStatus HMAC_SHA1(uint8_t *Key, uint32_t Keylen, uint8_t *Input,
- uint32_t Ilen, uint8_t Output[20])
- {
- HASH_InitTypeDef SHA1_HASH_InitStructure;
- HASH_MsgDigest SHA1_MessageDigest;
- __IO uint16_t nbvalidbitsdata = 0;
- __IO uint16_t nbvalidbitskey = 0;
- uint32_t i = 0;
- __IO uint32_t counter = 0;
- uint32_t busystatus = 0;
- ErrorStatus status = SUCCESS;
- uint32_t keyaddr = (uint32_t)Key;
- uint32_t inputaddr = (uint32_t)Input;
- uint32_t outputaddr = (uint32_t)Output;
-
- nbvalidbitsdata = 8 * (Ilen % 4);
-
- nbvalidbitskey = 8 * (Keylen % 4);
-
- HASH_DeInit();
-
- SHA1_HASH_InitStructure.HASH_AlgoSelection = HASH_AlgoSelection_SHA1;
- SHA1_HASH_InitStructure.HASH_AlgoMode = HASH_AlgoMode_HMAC;
- SHA1_HASH_InitStructure.HASH_DataType = HASH_DataType_8b;
- if(Keylen > 64)
- {
-
- SHA1_HASH_InitStructure.HASH_HMACKeyType = HASH_HMACKeyType_LongKey;
- }
- else
- {
-
- SHA1_HASH_InitStructure.HASH_HMACKeyType = HASH_HMACKeyType_ShortKey;
- }
- HASH_Init(&SHA1_HASH_InitStructure);
-
- HASH_SetLastWordValidBitsNbr(nbvalidbitskey);
-
- for(i=0; i<Keylen; i+=4)
- {
- HASH_DataIn(*(uint32_t*)keyaddr);
- keyaddr+=4;
- }
-
- HASH_StartDigest();
-
- do
- {
- busystatus = HASH_GetFlagStatus(HASH_FLAG_BUSY);
- counter++;
- }while ((counter != SHA1BUSY_TIMEOUT) && (busystatus != RESET));
- if (busystatus != RESET)
- {
- status = ERROR;
- }
- else
- {
-
- HASH_SetLastWordValidBitsNbr(nbvalidbitsdata);
-
- for(i=0; i<Ilen; i+=4)
- {
- HASH_DataIn(*(uint32_t*)inputaddr);
- inputaddr+=4;
- }
-
- HASH_StartDigest();
-
- counter =0;
- do
- {
- busystatus = HASH_GetFlagStatus(HASH_FLAG_BUSY);
- counter++;
- }while ((counter != SHA1BUSY_TIMEOUT) && (busystatus != RESET));
- if (busystatus != RESET)
- {
- status = ERROR;
- }
- else
- {
-
- HASH_SetLastWordValidBitsNbr(nbvalidbitskey);
-
- keyaddr = (uint32_t)Key;
- for(i=0; i<Keylen; i+=4)
- {
- HASH_DataIn(*(uint32_t*)keyaddr);
- keyaddr+=4;
- }
-
- HASH_StartDigest();
-
- counter =0;
- do
- {
- busystatus = HASH_GetFlagStatus(HASH_FLAG_BUSY);
- counter++;
- }while ((counter != SHA1BUSY_TIMEOUT) && (busystatus != RESET));
- if (busystatus != RESET)
- {
- status = ERROR;
- }
- else
- {
-
- HASH_GetDigest(&SHA1_MessageDigest);
- *(uint32_t*)(outputaddr) = __REV(SHA1_MessageDigest.Data[0]);
- outputaddr+=4;
- *(uint32_t*)(outputaddr) = __REV(SHA1_MessageDigest.Data[1]);
- outputaddr+=4;
- *(uint32_t*)(outputaddr) = __REV(SHA1_MessageDigest.Data[2]);
- outputaddr+=4;
- *(uint32_t*)(outputaddr) = __REV(SHA1_MessageDigest.Data[3]);
- outputaddr+=4;
- *(uint32_t*)(outputaddr) = __REV(SHA1_MessageDigest.Data[4]);
- }
- }
- }
- return status;
- }
-
-
-
-
|