Problem verifying DFU init package signature in custom background DFU

Hi

I am currently developing a custom dfu in my app in background through LTE communication. I am working with nRF5 SDK 17.0.2, softdevice s132 7.2.0 and nRF52832.

I'm using nrfutil to generate dfu package .zip. The version of nrfutil I'm using seems to be v6 (from command "nrfutil list" because "nrfutil version" is unknown command")

So far I've used nrf_dfu_req_handler module to make dfu requests with the following sequence complying with DFU protocol : 

  • Call nrf_dfu_req_handler_init() to init module
  • MTU GET request
  • CREATE OBJECT request
  • WRITE command for Init Packet
  • Compare CRC and EXECUTE request

At this point the validation fails with error code 0x8542 (NRF_ERROR_CRYPTO_ECDSA_INVALID_SIGNATURE). See the following logs : 

<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_EXECUTE (command)
<debug> nrf_dfu_validation: PB: Init packet data len: 65
<info> nrf_dfu_validation: Signature required. Checking signature.
<info> nrf_dfu_validation: Calculating hash (len: 65)
<info> nrf_dfu_validation: Verify signature
<error> nrf_dfu_validation: Signature failed (err_code: 0x8542)
<debug> nrf_dfu_validation: Signature:
<debug> nrf_dfu_validation:  5F 39 76 57 79 A3 B0 4E|_9vWy..N
<debug> nrf_dfu_validation:  08 FC 08 4D A4 EB 8C 9E|...M....
<debug> nrf_dfu_validation:  EB 5F AC 12 DE FA 7D E7|._....}.
<debug> nrf_dfu_validation:  2F 96 B9 68 51 47 00 B5|/..hQG..
<debug> nrf_dfu_validation:  BC AB F7 3B 49 9C 6E 72|...;I.nr
<debug> nrf_dfu_validation:  28 FD 73 C2 76 69 71 07|(.s.viq.
<debug> nrf_dfu_validation:  9A 82 94 4D F9 9D DB 37|...M...7
<debug> nrf_dfu_validation:  63 87 96 CF C6 3F 9D 91|c....?..
<debug> nrf_dfu_validation: Hash:
<debug> nrf_dfu_validation:  CA 29 E5 7E D4 2A 75 9E|.).~.*u.
<debug> nrf_dfu_validation:  A8 E8 7B 24 09 F6 50 58|..{$	.PX
<debug> nrf_dfu_validation:  DF 7A 22 0F 96 28 10 A1|.z"..(..
<debug> nrf_dfu_validation:  A1 A1 32 F2 D0 A5 DE E3|..2.....
<debug> nrf_dfu_validation: Public Key:
<debug> nrf_dfu_validation:  2E 90 78 A1 CB 77 FF 6B|..x..w.k
<debug> nrf_dfu_validation:  F9 14 72 25 E6 35 13 20|..r%.5. 
<debug> nrf_dfu_validation:  59 17 F4 D2 70 64 A2 3E|Y...pd.>
<debug> nrf_dfu_validation:  80 EC EE B0 5B 96 30 19|....[.0.
<debug> nrf_dfu_validation:  DF 79 F0 8B 14 D2 29 71|.y....)q
<debug> nrf_dfu_validation:  4E 35 C5 D0 84 5B 54 DC|N5...[T.
<debug> nrf_dfu_validation:  2B 0B FA 7E CD 8D 54 E0|+..~..T.
<debug> nrf_dfu_validation:  C0 97 E1 9B C5 48 B6 50|.....H.P
<warning> nrf_dfu_validation: Prevalidation failed.
<debug> nrf_dfu_validation: Init command:
<debug> nrf_dfu_validation:  08 90 4E 10 34 1A 02 81|..N.4...
<debug> nrf_dfu_validation:  02 20 00 28 00 30 00 38|. .(.0.8
<debug> nrf_dfu_validation:  D0 EF 13 42 24 08 03 12|...B$...
<debug> nrf_dfu_validation:  20 D6 B5 00 AC 42 06 6A| ....B.j
<debug> nrf_dfu_validation:  0A 72 1B 86 0D 5E 7B 21|.r...^{!
<debug> nrf_dfu_validation:  1F DC 32 83 8A E8 DC F0|..2.....
<debug> nrf_dfu_validation:  EC 30 5A E4 48 64 18 93|.0Z.Hd..
<debug> nrf_dfu_validation:  F0 48 00 52 04 08 01 12|.H.R....
<debug> nrf_dfu_validation:  00                     |.       
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x5
<error> app: Request 4 returned error 5!
<info> app: NRF_DFU_EVT_DFU_FAILED

I have displayed the signature of the package .zip I generated with nrfutil by typing : 

nrfutil pkg display [filename.zip]

and it corresponds to the signature in the logs but with first and last halves switched.

How do I solve this issue ?

Also in the logs above there is a line "nrf_dfu_validation: PB: Init packet data len: 65". However the init packet I write with WRITE request is 142 bytes long. The write request response confirms that size (=offset) of 142 bytes. I wonder if this has something to do with my issue above.

Parents Reply
  • Hi Vidar,

    Sorry for the delay of my response but I still struggle trying to debug the secure bootloader. As advised on a different devzone thread with similar issue, I've tried to lower the optimisation level and to reallocate memory section for the bigger bootloader generated. However I did not manage to get either debug or logs. Mayby I'll open a thread later on if I still need to debug the bootloader.

    Anyway I finally found the cause of my problem. The file dfu_public_key.c included in my app project was not the same as the dfu_public_key.c used by my bootloader which I also used to generate my zip packages. The intern I got the project from created its own public key trying to implement a custom dfu. Slight smile

    Thanks for helping me and for your responsiveness !

    BR

Children
  • This is why debugging crypto services can be hard at times Slight smile Anyway I am glad to hear that it works now. Thank you for updating the ticket.

    Adding logging to the "release" bootloader can be a bit cumbersome as it does not include the logger dependencies by default. Nor does it have enough flash allocated to it. This is why I usually try to just debug the bootloader with optimizations enabled and without logging first. The screenshot I posted earlier that showed the paramaters passed to uECC verify was with optimizations enabled. 

Related