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] = { 0x18, 0x35, 0x9B, 0x75, 0x18, 0x6F, 0x33, 0xBE,
                            0x22, 0x0A, 0x3D, 0xB7, 0x66, 0xFD, 0x98, 0x35 };
  
    /* Enable CRYPTOCELL subsystem */
    NRF_CRYPTOCELL->ENABLE = CRYPTOCELL_ENABLE_ENABLE_Enabled;

    /* Enable engine and DMA clock */
    NRF_CC_MISC->CHACHA_CLK = CC_MISC_CHACHA_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 CHACHA as cryptographic flow */
    NRF_CC_CTL->CRYPTO_CTL = CC_CTL_CRYPTO_CTL_MODE_ChaChaActive;
  
    /* Configure testing NONCE */
    NRF_CC_CHACHA->CHACHA_IV[0] = 0xBBBBAAAA;
    NRF_CC_CHACHA->CHACHA_IV[1] = 0x22221111;
  
    /* Load the CHACHA test key value into the engine */
    NRF_CC_CHACHA->CHACHA_KEY[0] = 0x51515151;
    NRF_CC_CHACHA->CHACHA_KEY[1] = 0x52525252;
    NRF_CC_CHACHA->CHACHA_KEY[2] = 0x53535353;
    NRF_CC_CHACHA->CHACHA_KEY[3] = 0x54545454;
    NRF_CC_CHACHA->CHACHA_KEY[4] = 0x51515151;
    NRF_CC_CHACHA->CHACHA_KEY[5] = 0x52525252;
    NRF_CC_CHACHA->CHACHA_KEY[6] = 0x53535353;
    NRF_CC_CHACHA->CHACHA_KEY[7] = 0x54545454;
  
    /* Configure CHACHA mode - using default (0x0), adding new message init */
    NRF_CC_CHACHA->CHACHA_CONTROL =
      (CC_CHACHA_CHACHA_CONTROL_INIT_Enable <<
       CC_CHACHA_CHACHA_CONTROL_INIT_Pos);
  
    /* 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)) {}