SHA256 on Texas Instrument's Tiva C Series of Cortex M4 Microcontrollers: Software vs. Hardware

So I wrote code to perform SHA256 hashing on a single block on data using the TM4C129DNCPDT running off a 16 MHz Crystal. I performed the hashing first using software C code and then using the Tivaware Library function which make use of TM4C129x's "Hardware Accelerated Hash (SHA/MD5) advanced hash engine that supports SHA-1, SHA-2 or MD5 Hash computation".

I assigned 2 GPIOs for measuring the time taken for each method (the software one and the hardware one).
I toggled the GPIO before and after hashing for each of the two methods.
The Oscilloscope shows the pulses observed on the two GPIOs.

The results are as below:
Software SHA256: 1.216 milliseconds or 1216 microseconds.
SHA256 using Hardware Acceleration: 28 microseconds (4200% faster)

Amount of time take to perform SHA256 in Software (Channel 2) and
using Hardware Acceleration (Channel 1).



  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/shamd5.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include "sha256.h"

#ifdef DEBUG
void
__error__(char *pcFilename, uint32_t ui32Line)
{
}
#endif

//Output observable on UART0 115200 8-N-1
//SHA256 Software vs. Hardware comparison on TM4C129DNCPDT
//SHA256 Software Code taken from: http://www.spale.com/download/scrypt/scrypt1.0/
//Input Message (64 bytes): {0x72616e41, 0x696c616b, 0x20616b20, 0x6e6f6870, 0x61682065}
//Software SHA-256 Result: {0x568e2d32, 0x7113821c, 0xa5b5025a, 0xe3335ddd, 0x779bc58c, 0x5d0fc8ed, 0x98f48aef, 0xc0e6db2e}
//Hardware SHA-256 Result: {0x568e2d32, 0x7113821c, 0xa5b5025a, 0xe3335ddd, 0x779bc58c, 0x5d0fc8ed, 0x98f48aef, 0xc0e6db2e}

void ConfigureUART(void) {
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
    GPIOPinConfigure(GPIO_PA0_U0RX);
    GPIOPinConfigure(GPIO_PA1_U0TX);
    GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
    UARTStdioConfig(0, 115200, 16000000L);
}

int main(void) {
 uint8_t stringMessage[64] = "Anarkali ka phone hai. Anarkali ka phone hai. Anarkali ka phone.";
 uint32_t * g_ui32Message = (uint32_t *) stringMessage;

 sha256_context SW_ctx;
 unsigned char SW_sha256sumSW[32];
 uint32_t * SW_ui32SHA256Result = (uint32_t *)SW_sha256sumSW;

 uint32_t HW_ui32SHA256Result[8];

 FPULazyStackingEnable();
    SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |SYSCTL_OSC_MAIN);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_3);
    GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_2);
    GPIOPinWrite( GPIO_PORTD_BASE,GPIO_PIN_3,0);
    GPIOPinWrite( GPIO_PORTD_BASE,GPIO_PIN_2,0);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_CCM0); //Enable the CCM module.
 while(!SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) {
    } //Wait for the CCM module to be ready.

    ConfigureUART();
    UARTprintf("\nSHA256 Software vs. Hardware comparison on TM4C129DNCPDT\n");
    UARTprintf("SHA256 Software Code taken from: http://www.spale.com/download/scrypt/scrypt1.0/\n");

    UARTprintf("Input Message (64 bytes): {0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x}\n",
          g_ui32Message[0],
          g_ui32Message[1],
          g_ui32Message[2],
          g_ui32Message[3],
          g_ui32Message[4]);

    GPIOPinWrite( GPIO_PORTD_BASE,GPIO_PIN_3,GPIO_PIN_3);
    sha256_starts( &SW_ctx );
    sha256_update( &SW_ctx, (uint8 *) stringMessage, 64);
    sha256_finish( &SW_ctx, SW_sha256sumSW );
    GPIOPinWrite( GPIO_PORTD_BASE,GPIO_PIN_3,0);

    GPIOPinWrite( GPIO_PORTD_BASE,GPIO_PIN_2,GPIO_PIN_2);
 SHAMD5Reset(SHAMD5_BASE); //Reset the SHA/MD5 module before use.
    SHAMD5ConfigSet(SHAMD5_BASE, SHAMD5_ALGO_SHA256); //Configure the SHA/MD5 module.
    SHAMD5DataProcess(SHAMD5_BASE, g_ui32Message, 64, HW_ui32SHA256Result); //Generate the hash from the data.
    GPIOPinWrite( GPIO_PORTD_BASE,GPIO_PIN_2,0);

    UARTprintf("Software SHA-256 Result: {0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x}\n",
      SW_ui32SHA256Result[0],
      SW_ui32SHA256Result[1],
      SW_ui32SHA256Result[2],
      SW_ui32SHA256Result[3],
      SW_ui32SHA256Result[4],
      SW_ui32SHA256Result[5],
      SW_ui32SHA256Result[6],
      SW_ui32SHA256Result[7]);

    UARTprintf("Hardware SHA-256 Result: {0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x}\n",
      HW_ui32SHA256Result[0],
      HW_ui32SHA256Result[1],
      HW_ui32SHA256Result[2],
      HW_ui32SHA256Result[3],
      HW_ui32SHA256Result[4],
      HW_ui32SHA256Result[5],
      HW_ui32SHA256Result[6],
      HW_ui32SHA256Result[7]);
    while(1) {
    }
}


The complete Eclipse Workspace Project (Code Composer Studio 5.5) for this experiment can be downloaded from here.

Comments

Popular posts from this blog

Replacing the current sense resistor in Portable Chargers/Power Banks for powering low power DIY projects.

Interface USB Mouse to your Arduino using CH375B

Simple TCP client server sockets application using IPv6 and IPv6