//***************************************************************************** // //! main - populate the parameters from predefines Test Vector or User //! //! \param None //! //! \return None // //***************************************************************************** void main() { unsigned int uiConfig,uiHashLength,uiDataLength; unsigned char *puiKey1,*puiData,*puiResult; unsigned int u8count; #ifndef USER_INPUT unsigned char *puiTempExpResult; #endif // // Initialize board configurations BoardInit(); // // Configuring UART for Receiving input and displaying output // 1. PinMux setting // 2. Initialize UART // 3. Displaying Banner // PinMuxConfig(); InitTerm(); DisplayBanner(APP_NAME); // // Enable the module . // MAP_PRCMPeripheralClkEnable(PRCM_DTHE, PRCM_RUN_MODE_CLK); // // Enable interrupts. // MAP_SHAMD5IntRegister(SHAMD5_BASE, SHAMD5IntHandler); #ifdef USER_INPUT while(FOREVER) { // // Read values either from User or from Vector based on macro USER_INPUT // defined or not // // // Read the values from the user over uart and Populate the variables // puiData=ReadFromUser(&uiConfig,&uiHashLength,&puiKey1,&uiDataLength, &puiResult); if(puiData==NULL) { continue; } #else // // Load Default values // UART_PRINT("Running Keyed Hashing HMAC_MD5\n\r\n\r"); UART_PRINT("loading default values\n\r\n\r"); uiHMAC=1; puiData= LoadDefaultValues(SHAMD5_ALGO_HMAC_MD5,&uiConfig,&uiHashLength, &puiKey1,&uiDataLength,&puiResult); UART_PRINT("Data Length (in Bytes) %d\n\r\n\r",uiDataLength); #endif // // Generate Hash Value // UART_PRINT("\n\rHashing in Progress... \n\r"); GenerateHash(uiConfig,puiKey1,puiData,puiResult,uiDataLength); UART_PRINT("Hash Value is generated\n\r"); // // Display/Verify Result // #ifdef USER_INPUT // // Display Hash Value Generated // UART_PRINT("\n\r The Hash Value in Hex is: 0x%02x",*puiResult); for(u8count=0; u8count<(uiHashLength/4); u8count++) { UART_PRINT("%02x",*(puiResult+u8count)); } UART_PRINT("\n\r"); } //end while(FOREVER) #else // // Comapre Hash Generated and expected values from predefined vector // UART_PRINT("Hash Length (in Bytes) %d\n\r\n\r",uiHashLength); UART_PRINT("\n\r Computed Hash Value in Hex is: "); for(u8count=0; u8count<uiHashLength; u8count++) { UART_PRINT("%02x",*(puiResult+u8count)); } UART_PRINT("\n\r"); puiTempExpResult = (unsigned char *)g_psHMACShaMD5TestVectors.puiExpectedHash; UART_PRINT("\n\r Expected Hash Value in Hex is: "); for(u8count=0; u8count<uiHashLength; u8count++) { UART_PRINT("%02x",*(puiTempExpResult+u8count)); } UART_PRINT("\n\r"); if(memcmp(puiResult,g_psHMACShaMD5TestVectors.puiExpectedHash,uiHashLength)==0) { UART_PRINT("\n\r Hashing verified successfully"); } else { UART_PRINT("\n\r Error in Hashing computation"); } while(FOREVER); #endif }
int ComputeSHA(const char *sourceFile, uint8_t *resultHash) { long sfileHandle = -1; unsigned long sToken = 0; long retVal = 0; unsigned long bytesRead = 0; unsigned long readsize = 0; uint8_t buffer[BLOCKSIZE]; SlFsFileInfo_t sFileInfo; UART_PRINT("\r\nStarted comuting hash\r\n"); //Enable MD5SHA module PRCMPeripheralClkEnable(PRCM_DTHE, PRCM_RUN_MODE_CLK); MAP_SHAMD5IntRegister(SHAMD5_BASE, SHAMD5IntHandler); //reset modul PRCMPeripheralReset(PRCM_DTHE); //clear flags g_bContextReadyFlag = false; g_bInputReadyFlag = false; //Enable Interrupts SHAMD5IntEnable(SHAMD5_BASE, SHAMD5_INT_CONTEXT_READY | SHAMD5_INT_PARTHASH_READY | SHAMD5_INT_INPUT_READY | SHAMD5_INT_OUTPUT_READY); //wait for context ready flag. while (!g_bContextReadyFlag) ; //Configure SHA/MD5 module SHAMD5ConfigSet(SHAMD5_BASE, SHAMD5_ALGO_SHA1); // get file size retVal = sl_FsGetInfo((unsigned char *) sourceFile, sToken, &sFileInfo); if (retVal < 0) { // File Doesn't exit create a new of 45 KB file UART_PRINT("Error during opening the source file\r\n"); return -1; } // open the source file for reading retVal = sl_FsOpen((unsigned char *) sourceFile, FS_MODE_OPEN_READ, &sToken, &sfileHandle); if (retVal < 0) { UART_PRINT("Error during opening the source file\r\n"); return -1; } SHAMD5DataLengthSet(SHAMD5_BASE, (uint32_t) sFileInfo.FileLen); // Copy the files from temporary file to original file // If user file has checksum which can be used to verify the temporary // file then file should be verified before copying while (bytesRead < sFileInfo.FileLen) { if ((sFileInfo.FileLen - bytesRead) > BLOCKSIZE) readsize = BLOCKSIZE; else readsize = (sFileInfo.FileLen - bytesRead); memset(buffer, 0, sizeof(buffer)); retVal = sl_FsRead(sfileHandle, bytesRead, (unsigned char *) buffer, readsize); if (retVal < 0) { // Error close the file and delete the temporary file retVal = sl_FsClose(sfileHandle, 0, 0, 0); UART_PRINT("Error during reading the file\r\n"); return -1; } SHAMD5DataWrite(SHAMD5_BASE, buffer); bytesRead += readsize; } // Close the opened files retVal = sl_FsClose(sfileHandle, 0, 0, 0); if (retVal < 0) { // Error close the file and delete the temporary file UART_PRINT("Error during close the file\r\n"); return -1; } UART_PRINT("Hash successfully\r\n"); SHAMD5ResultRead(SHAMD5_BASE, resultHash); return 0; }