This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

problem to adding AES encription to secure DFU SDK15.0

Hi!

nRF52832, SDK15, SD6.0.0, S132

I try to use secure_bootloader from SDK15 examples. All works.

Now I need encrypt my firmware with AES. I already made it on a SDK13- works fine. 

Now after encrypt .bin file in the dfu.zip package, I try to decrypt it in the bootloader project. For that I in a file 

nrf_dfu_req_handler.c in a on_data_obj_write_request() function insert my decode function:

static void on_data_obj_write_request(nrf_dfu_request_t * p_req, nrf_dfu_response_t * p_res)
{
    NRF_LOG_DEBUG("Handle NRF_DFU_OP_OBJECT_WRITE (data)");

    if (!nrf_dfu_validation_init_cmd_present())
    {
        /* Can't accept data because DFU isn't initialized by init command. */
        p_res->result = NRF_DFU_RES_CODE_OPERATION_NOT_PERMITTED;
        return;
    }

    uint32_t const data_object_offset = s_dfu_settings.progress.firmware_image_offset -
                                        s_dfu_settings.progress.firmware_image_offset_last;

    if ((p_req->write.len + data_object_offset) > s_dfu_settings.progress.data_object_size)
    {
        /* Can't accept data because too much data has been received. */
        NRF_LOG_ERROR("Write request too long");
        p_res->result = NRF_DFU_RES_CODE_INVALID_PARAMETER;
        return;
    }

    uint32_t const write_addr = m_firmware_start_addr + s_dfu_settings.write_offset;

    ASSERT(p_req->callback.write);
    
                // az
                for (int i = 0; i < p_req->write.len; i+=16)
                {
                    AES128_ECB_decrypt (p_req->write.p_data + i, key, p_req->write.p_data + i); 
                }
                
    ret_code_t ret =
        nrf_dfu_flash_store(write_addr, p_req->write.p_data, p_req->write.len, p_req->callback.write);

    if (ret != NRF_SUCCESS)
    {
        /* When nrf_dfu_flash_store() fails because there is no space in the queue,
         * stop processing the request so that the peer can detect a CRC error
         * and retransmit this object. Remember to manually free the buffer !
         */
        p_req->callback.write((void*)p_req->write.p_data);
        return;
    }

    /* Update the CRC of the firmware image. */
    s_dfu_settings.write_offset                   += p_req->write.len;
    s_dfu_settings.progress.firmware_image_offset += p_req->write.len;
    s_dfu_settings.progress.firmware_image_crc     =
        crc32_compute(p_req->write.p_data, p_req->write.len, &s_dfu_settings.progress.firmware_image_crc);

    /* This is only used when the PRN is triggered and the 'write' message
     * is answered with a CRC message and these field are copied into the response.
     */
    p_res->write.crc    = s_dfu_settings.progress.firmware_image_crc;
    p_res->write.offset = s_dfu_settings.progress.firmware_image_offset;
}

AES128_ECB_decrypt().....

One more- this function works fine with same syntax on the SDK13.

But in the SDK13 after that I write another CRC and it works.

Now on SDK15 when I try to update via smartphone, I see error on the smartphone - ERROC CRC.

Also I have RTT log of it:

 0> <debug> nrf_dfu_req_handler:  
 0> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_CRC_GET (data)
 0> <debug> nrf_dfu_req_handler: Offset:2928, CRC:0xA907DD27
 0> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
 0> <debug> app: Shutting down transports (found: 1)
 0> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_CREATE (data)
 0> <debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x00039000, len=1 pages), queue usage: 0
 0> <debug> nrf_dfu_req_handler: Creating object with size: 4096. Offset: 0x00000000, CRC: 0x00000000
 0> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
 0> <debug> nrf_dfu_ble: Buffer 0x20005EB8 acquired, len 244 (244)
 0> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
 0> <debug> nrf_dfu_flash: Flash erase success: addr=0x00039000, pending 0
 0> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00039000, src=0x20005EB8, len=244 bytes), queue usage: 0
 0> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
 0> <debug> nrf_dfu_flash: Flash write success: addr=0x00039000, pending 0
 0> <debug> nrf_dfu_ble: Freeing buffer 0x20005EB8
 0> <debug> nrf_dfu_ble: Buffer 0x20005EB8 acquired, len 244 (244)
 0> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
 0> <debug> nrf_dfu_ble: Buffer 0x20005FAC acquired, len 244 (244)
 0> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000390F4, src=0x20005EB8, len=244 bytes), queue usage: 0
 0> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
 0> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
 0> <debug> nrf_dfu_ble: Buffer 0x20006194 acquired, len 244 (244)
 0> <debug> nrf_dfu_flash: Flash write success: addr=0x000390F4, pending 0
 0> <debug> nrf_dfu_ble: Freeing buffer 0x20005EB8
 0> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000391E8, src=0x20005FAC, len=244 bytes), queue usage: 0
 0> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
 0> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
 0> <debug> nrf_dfu_ble: Buffer 0x20005EB8 acquired, len 244 (244)
 0> <debug> nrf_dfu_flash: Flash write success: addr=0x000391E8, pending 0
 0> <debug> nrf_dfu_ble: Freeing buffer 0x20005FAC
 0> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000392DC, src=0x20006194, len=244 bytes), queue usage: 0
 0> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
 0> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
 0> <debug> nrf_dfu_ble: Buffer 0x20005FAC acquired, len 244 (244)
 0> <debug> nrf_dfu_ble: Buffer 0x20006288 acquired, len 244 (244)
 0> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000393D0, src=0x20005EB8, len=244 bytes), queue usage: 1
 0> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
 0> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
 0> <debug> nrf_dfu_flash: Flash write success: addr=0x000392DC, pending 1
 0> <debug> nrf_dfu_ble: Freeing buffer 0x20006194
 0> <debug> nrf_dfu_ble: Buffer 0x20006194 acquired, len 244 (244)
 0> <debug> nrf_dfu_flash: Flash write success: addr=0x000393D0, pending 0
 0> <debug> nrf_dfu_ble: Freeing buffer 0x20005EB8
 0> <debug> nrf_dfu_ble: Buffer 0x20005EB8 acquired, len 244 (244)
 0> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000394C4, src=0x20005FAC, len=244 bytes), queue usage: 0
 0> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
 0> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
 0> <debug> nrf_dfu_flash: Flash write success: addr=0x000394C4, pending 0
 0> <debug> nrf_dfu_ble: Freeing buffer 0x20005FAC
 0> <debug> nrf_dfu_ble: Buffer 0x20005FAC acquired, len 244 (244)
 0> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000395B8, src=0x20006288, len=244 bytes), queue usage: 0
 0> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
 0> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
 0> <debug> nrf_dfu_ble: Buffer 0x200060A0 acquired, len 244 (244)
 0> <debug> nrf_dfu_flash: Flash write success: addr=0x000395B8, pending 0
 0> <debug> nrf_dfu_ble: Freeing buffer 0x20006288
 0> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000396AC, src=0x20006194, len=244 bytes), queue usage: 0
 0> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
 0> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
 0> <debug> nrf_dfu_ble: Buffer 0x20006288 acquired, len 244 (244)
 0> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000397A0, src=0x20005EB8, len=244 bytes), queue usage: 1
 0> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
 0> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
 0> <debug> nrf_dfu_flash: Flash write success: addr=0x000396AC, pending 1
 0> <debug> nrf_dfu_ble: Freeing buffer 0x20006194
 0> <debug> nrf_dfu_flash: Flash write success: addr=0x000397A0, pending 0
 0> <debug> nrf_dfu_ble: Freeing buffer 0x20005EB8
 0> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00039894, src=0x20005FAC, len=244 bytes), queue usage: 0
 0> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
 0> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
 0> <debug> nrf_dfu_flash: Flash write success: addr=0x00039894, pending 0
 0> <debug> nrf_dfu_ble: Freeing buffer 0x20005FAC
 0> x200060A0, len=244 bytes), queue usage: 0
 0> a)
 0> <debug> nrf_dfu_ble: Advertising...
 0> <info> nrf_bootloader_wdt: Internal feed

In wich place of bootloader should I clear or replace CRC ? I just want to reject this verification from bootloader.  

Related