Cryptographic flow

nRF5340 Product Specification

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


    
    uint8_t buf_dst[16] = { 0 };
    uint8_t buf_src[16] = { 0x81, 0x02, 0xF2, 0x40, 0xD5, 0xB9, 0x44, 0x59,
                            0xA2, 0xEB, 0x6F, 0xF2, 0x49, 0xF5, 0xEB, 0x94 };
   
    /* Enable CRYPTOCELL subsystem */
    NRF_CRYPTOCELL->ENABLE =  CRYPTOCELL_ENABLE_ENABLE_Enabled;

    /* Enable engine and DMA clock */
    NRF_CC_MISC->AES_CLK = CC_MISC_AES_CLK_ENABLE_Enable;
    NRF_CC_MISC->DMA_CLK = CC_MISC_DMA_CLK_ENABLE_Enable;

    /* Wait until crypto engine is Idle  */
    while (NRF_CC_CTL->CRYPTO_BUSY == CC_CTL_CRYPTO_BUSY_STATUS_Busy) { }

    /* Configure AES as cryptographic flow */
    NRF_CC_CTL->CRYPTO_CTL = CC_CTL_CRYPTO_CTL_MODE_AESActive;

    /* Configure AES engine control for decryption using ECB mode (default) */
    NRF_CC_AES->AES_CONTROL = CC_AES_AES_CONTROL_DEC_KEY0_Decrypt;

    /* Load the AES key value into the engine */
    NRF_CC_AES->AES_KEY_0[0] = 0x51515151;
    NRF_CC_AES->AES_KEY_0[1] = 0x52525252;
    NRF_CC_AES->AES_KEY_0[2] = 0x53535353;
    NRF_CC_AES->AES_KEY_0[3] = 0x54545454;

    /* Configure default init vector */
    NRF_CC_AES->AES_IV_0[0] = 0x0;
    NRF_CC_AES->AES_IV_0[1] = 0x0;
    NRF_CC_AES->AES_IV_0[2] = 0x0;
    NRF_CC_AES->AES_IV_0[3] = 0x0;

    /* Configure DMA output destination address */
    NRF_CC_DOUT->DST_MEM_ADDR = (uint32_t) buf_dst;
    NRF_CC_DOUT->DST_MEM_SIZE = (uint32_t) sizeof(buf_dst);

    /* 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 DOUT DMA interrupt */
    while(!(NRF_CC_HOST_RGF->IRR & CC_HOST_RGF_IRR_DOUT_TO_MEM_INT_Msk)) {}