public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Marek Vasut <marex@denx.de>
To: Patrick DELAUNAY <patrick.delaunay@foss.st.com>, u-boot@lists.denx.de
Cc: Alexandru Gagniuc <mr.nuke.me@gmail.com>,
	Patrice Chotard <patrice.chotard@foss.st.com>
Subject: Re: [PATCH v2 1/4] ARM: stm32: Fix ECDSA authentication with Dcache enabled
Date: Wed, 7 Dec 2022 20:32:58 +0100	[thread overview]
Message-ID: <361145ae-c2fa-4f9e-cfcd-2357b204a8cf@denx.de> (raw)
In-Reply-To: <2ce07612-9539-46f2-9540-55adcbdcabe1@foss.st.com>

On 12/7/22 11:08, Patrick DELAUNAY wrote:
> Hi Marek,

Hello Patrick,

> Sorry for the delay.

No worries.

> I cross-check with ROM code team to understood this API limitation.

Thank you!

> On 12/6/22 23:49, Marek Vasut wrote:
>> In case Dcache is enabled while the ECDSA authentication function is
>> called via BootROM ROM API, the CRYP DMA might pick stale version of
>> data from DRAM. Disable Dcache around the BootROM call to avoid this
>> issue.
>>
>> Signed-off-by: Marek Vasut <marex@denx.de>
>> ---
>> Cc: Alexandru Gagniuc <mr.nuke.me@gmail.com>
>> Cc: Patrice Chotard <patrice.chotard@foss.st.com>
>> Cc: Patrick Delaunay <patrick.delaunay@foss.st.com>
>> ---
>> V2: - Initialize reenable_dcache variable
>> ---
>>   arch/arm/mach-stm32mp/ecdsa_romapi.c | 14 ++++++++++++++
>>   1 file changed, 14 insertions(+)
>>
>> diff --git a/arch/arm/mach-stm32mp/ecdsa_romapi.c 
>> b/arch/arm/mach-stm32mp/ecdsa_romapi.c
>> index a2f63ff879f..082178ce83f 100644
>> --- a/arch/arm/mach-stm32mp/ecdsa_romapi.c
>> +++ b/arch/arm/mach-stm32mp/ecdsa_romapi.c
>> @@ -63,6 +63,7 @@ static int romapi_ecdsa_verify(struct udevice *dev,
>>                      const void *hash, size_t hash_len,
>>                      const void *signature, size_t sig_len)
>>   {
>> +    bool reenable_dcache = false;
>>       struct ecdsa_rom_api rom;
>>       uint8_t raw_key[64];
>>       uint32_t rom_ret;
>> @@ -81,8 +82,21 @@ static int romapi_ecdsa_verify(struct udevice *dev,
>>       memcpy(raw_key + 32, pubkey->y, 32);
>>       stm32mp_rom_get_ecdsa_functions(&rom);
>> +
>> +    /*
>> +     * Disable D-cache before calling into BootROM, else CRYP DMA
>> +     * may fail to pick up the correct data.
>> +     */
>> +    if (dcache_status()) {
>> +        dcache_disable();
>> +        reenable_dcache = true;
>> +    }
>> +
>>       rom_ret = rom.ecdsa_verify_signature(hash, raw_key, signature, 
>> algo);
>> +    if (reenable_dcache)
>> +        dcache_enable();
>> +
>>       return rom_ret == ROM_API_SUCCESS ? 0 : -EPERM;
>>   }
> 
> 
> In fact, the ecdsa_verify_signature() don't use the HW (no DMA and no 
> use of CRYP IP )

Hmmm, what does the BootROM use CRYP for then ?
It is necessary to have MP15xC/F for the authenticated boot to work, but 
it seems the only difference there is the presence of CRYP. Or is there 
some BootROM fuse too ?

> It is only a SW library, integrated in ROM code and exported to avoid 
> the need
> 
> to include the same library in FSBL = TF-A, with size limitation (SYSRAM).
> 
> 
> This library don't need to deactivate the data cache, the only impact of 
> this deactivation it
> 
> is to reduce the execution performance....
> 
> 
> After cross-check, I think the only problem today it the U-Boot MMU 
> configuration of STM32MP15x
> 
> plaform: by default only the DDR is marked executable in U-Boot, all the 
> other region are
> 
> defined as DEVICE memory/not executable (DCACHE_OFF in mmu_setup).
> 
> 
> Deactivate the data cache only avoids the exception which occurs on jump 
> to NotExecutable region
> 
> because in U-Boot "dcache OFF" imply  "MMU off"  (see cache_enable in 
> ./arch/arm/lib/cache-cp15.c)
> 
> and with MMU deactivated the check on executable MMU tag is also 
> deactivated.
> 
> 
> I think the next patch is enough:
> 
> 
> #define STM32MP_ROM_BASE        U(0x00000000)
> 
> 
> static int romapi_ecdsa_verify(struct udevice *dev,
>                      const void *hash, size_t hash_len,
>                      const void *signature, size_t sig_len)
>   {
>       struct ecdsa_rom_api rom;
>       uint8_t raw_key[64];
>       uint32_t rom_ret;
> @@ -81,8 +82,21 @@ static int romapi_ecdsa_verify(struct udevice *dev,
>       memcpy(raw_key + 32, pubkey->y, 32);
> 
>       stm32mp_rom_get_ecdsa_functions(&rom);
> +
> +    /* mark executable the exported ROM code function: */
> +    mmu_set_region_dcache_behaviour(STM32MP_ROM_BASE, MMU_SECTION_SIZE, 
> DCACHE_DEFAULT_OPTION);
> +
>       rom_ret = rom.ecdsa_verify_signature(hash, raw_key, signature, algo);
> 
>       return rom_ret == ROM_API_SUCCESS ? 0 : -EPERM;
>   }

This indeed works, tested and sent V3.

> Sorry again for the first review, not complete...

Thank you for checking !

  reply	other threads:[~2022-12-07 19:33 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-06 22:49 [PATCH v2 1/4] ARM: stm32: Fix ECDSA authentication with Dcache enabled Marek Vasut
2022-12-06 22:49 ` [PATCH v2 2/4] ARM: stm32: Factor out save_boot_params Marek Vasut
2022-12-06 22:49 ` [PATCH v2 3/4] ARM: stm32: Pass ROM API table pointer to U-Boot proper Marek Vasut
2022-12-06 22:49 ` [PATCH v2 4/4] ARM: stm32: Make ECDSA authentication available to U-Boot Marek Vasut
2022-12-07 10:08 ` [PATCH v2 1/4] ARM: stm32: Fix ECDSA authentication with Dcache enabled Patrick DELAUNAY
2022-12-07 19:32   ` Marek Vasut [this message]
2022-12-12  9:40     ` Patrick DELAUNAY
2022-12-14 16:15       ` Marek Vasut

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=361145ae-c2fa-4f9e-cfcd-2357b204a8cf@denx.de \
    --to=marex@denx.de \
    --cc=mr.nuke.me@gmail.com \
    --cc=patrice.chotard@foss.st.com \
    --cc=patrick.delaunay@foss.st.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox