Cryptographic flow

nRF5340 Product Specification

The following section describe a simple cryptographic flow for this engine.


    
    uint8_t buf_src[32] =  {
          0xFA,0xFA,0xFA,0xFA,0xFA,0xFA,0xFA,0xFA,
          0xFA,0xFA,0xFA,0xFA,0xFA,0xFA,0xFA,0xFA,
          0xFA,0xFA,0xFA,0xFA,0xFA,0xFA,0xFA,0xFA,
          0xFA,0xFA,0xFA,0xFA,0xFA,0xFA,0xFA,0xFA };

    /* Enable CRYPTOCELL subsystem */
    NRF_CRYPTOCELL->ENABLE = CRYPTOCELL_ENABLE_ENABLE_Enabled;

    /* Enable engine and DMA clock */
    NRF_CC_MISC->HASH_CLK = CC_MISC_HASH_CLK_ENABLE_Enable;
    NRF_CC_MISC->DMA_CLK = CC_MISC_DMA_CLK_ENABLE_Enable;

    /* Wait until hash engine is Idle  */
    while (NRF_CC_CTL->HASH_BUSY == CC_CTL_HASH_BUSY_STATUS_Busy) {}

    /* Clear all interrupts */
    NRF_CC_HOST_RGF->ICR = 0xFFFFFFFF;

    /* Configure HASH as cryptographic flow */
    NRF_CC_CTL->CRYPTO_CTL = CC_CTL_CRYPTO_CTL_MODE_HashActive;

    /* Configure engine for SHA256 */
    NRF_CC_HASH->HASH_CONTROL = CC_HASH_HASH_CONTROL_MODE_SHA256;
    
    /* Enable automatic HW padding */
    NRF_CC_HASH->HASH_PAD = CC_HASH_HASH_PAD_ENABLE_Enable;
    NRF_CC_HASH->HASH_PAD_AUTO = CC_HASH_HASH_PAD_AUTO_HWPAD_Enable;

    /* Configure initial SHA256 values */
    NRF_CC_HASH->HASH_H[7] = 0x5BE0CD19;
    NRF_CC_HASH->HASH_H[6] = 0x1F83D9AB;
    NRF_CC_HASH->HASH_H[5] = 0x9B05688C;
    NRF_CC_HASH->HASH_H[4] = 0x510E527F;
    NRF_CC_HASH->HASH_H[3] = 0xA54FF53A;
    NRF_CC_HASH->HASH_H[2] = 0x3C6EF372;
    NRF_CC_HASH->HASH_H[1] = 0xBB67AE85;
    NRF_CC_HASH->HASH_H[0] = 0x6A09E667;

    /* Configure DMA input source address to start the cryptographic operation */
    NRF_CC_DIN->SRC_MEM_ADDR = (uint32_t) buf_src;
    NRF_CC_DIN->SRC_MEM_SIZE = (uint32_t) sizeof(buf_src);

    /* Wait on DIN DMA interrupt indicating data has been fetched */
    while(!(NRF_CC_HOST_RGF->IRR & CC_HOST_RGF_IRR_MEM_TO_DIN_INT_Msk)) {}

    /* Wait until hash engine is Idle */
    while (NRF_CC_CTL->HASH_BUSY == CC_CTL_HASH_BUSY_STATUS_Busy) {}

    /* Calculated SHA256 digest now available in 
    NRF_CC_HASH->HASH_H[0] to NRF_CC_HASH->HASH_H[7]  */