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 !
next prev parent 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