Create AST2600 OTP image

Andrew Jeffery andrew at aj.id.au
Fri Dec 17 09:43:39 AEDT 2021


Hi Jamin,

On Thu, 16 Dec 2021, at 17:11, Jamin Lin wrote:
> Hi OpenBMC team
>
> I have some questions about OTP image creation in OpenBMC. To support 
> AST2600 RoT(Root of Trust, AST2600 ROM code verified SPL), users should 
> program "A public key" in OTP and uses "A private key" with SPL image 
> to create signature and place it in SPL.
> The SOCESEC tool help user to create OTP and SPL images for AST2600 
> secure boot support.
> The following are my questions and solutions
>
>   1.  There was a socsec-sign.bbclass in OpenBMC and it is used for SPL 
> image generation with SOCSEC tool. Do you agree if I modify 
> socsec-sign.bbclass to create OTP image?

I'm not convinced on this one. While the OTP configuration and the 
output of the socsec signing process are tightly coupled they involve 
separate processes. Off the top of my head, the fact that socsec and 
otptool are separate utilities suggests to me that they should use 
separate bbclasses in the build process.

>
> If no, I will try to use solution 2.
>

This is the path you should follow - I have some comments below.

>
>
>   1.  I will create a new recipe to create OTP image and this recipe 
> will be placed in meta-aspeed/recipes-aspeed/otp/otp.bb

Okay.

>
> To successfully build the OTP and SPL images, we should create the 
> key-pair one for OTP(public key) and another for SPL(private key).
>
> Do you have any suggestion to place these keys in where?
>
>   1.  So far, we placed both private key and public keys here, 
> https://github.com/openbmc/openbmc/tree/master/meta-aspeed/recipes-bsp/u-boot/files
>
> How to get the public key in OTP recipe? It seems I need to place 
> public key, 
> https://github.com/openbmc/openbmc/blob/master/meta-aspeed/recipes-bsp/u-boot/files/rsa_pub_oem_dss_key.pem
>
> in meta-aspeed/recipes-aspeed/otp/files and private key in u-boot, 
> https://github.com/openbmc/openbmc/blob/master/meta-aspeed/recipes-bsp/u-boot/files/rsa_oem_dss_key.pem

We might need a separate recipe e.g. called 'aspeed-ast2600-rot-keys', 
and move the files you've pointed to above into that recipe. From there 
both the OTP and u-boot recipes can depend on 'aspeed-ast2600-rot-keys' 
to gain access to the files.

>
>   1.  The socsec tool settings should be consistent. For example: If 
> user set the algorithm "RSA4096_SHA512" in SPL, it is required to use 
> the corresponding *.json config in OTP.
>
> https://github.com/openbmc/openbmc/blob/master/meta-aspeed/classes/socsec-sign.bbclass#L8

Yes, but maybe this creates too many headaches to enforce? We'd have to 
parse the json and line it up with SOCSEC_SIGN_ALGO in the recipe. It 
seems much easier if we just do a `socsec verify ...` once we've 
generated all the artefacts, feeding in the OTP image we've also built 
through the otptool bbclass. If the verification fails then the build 
fails and someone can look at what happened.

>
> By default, it set SOCSEC_SIGN_ALGO ?= "RSA4096_SHA512" to create SPL, 
> it is required to use 
> https://github.com/AspeedTech-BMC/openbmc/blob/aspeed-master/meta-aspeed-sdk/recipes-aspeed/security/aspeed-secure-config/configs/ast2600/security/otp/evbA3_RSA4096_SHA512.json 
> for OTP image generation.

This isn't true. How I want this to work is that each platform provides 
its own OTP json configuration, and the otptool bbclass consumes that 
to produce the OTP image.

Platform designers should have the freedom to pick their own 
platform-specific OTP settings with respect to e.g. the ABR, boot 
source fallback, secureboot etc features. There's no point generating 
the cartesian product of configurations out of the box, it would just 
be confusing and a *huge* amount of noise.

I've cooked up a platform-specific config for our p10bmc systems for 
instance, and was planning on integrating that into the OpenBMC tree.

>
>   How to share the environment variable between u-boot and otp recipes?
>
>   Do you prefer to add "SOCSEC_SIGN_ALGO" in machine configuration 
> file, so this variable can be recognized between otp and u-boot recipes.
>
>   Do you have any suggestion?

It should be set by the platform config and so should be available to 
any recipe executed in the build process, included e.g. an otptool 
recipe. Platform bitbake configs shouldn't rely on any particular 
default value being set in socsec-sign bbclass for SOCSEC_SIGN_ALGO (we 
might change the default in the future - then any platforms relying on 
a particular default value would break).

>
>   1.  How to trigger the build process to build create OTP image if 
> user only issues "bitbake obmc-phosphor-image"?
>
> https://github.com/AspeedTech-BMC/openbmc/blob/aspeed-master/meta-aspeed-sdk/classes/image_types_phosphor_aspeed.bbclass#L84
>
> Our solution set the do_generate_static_tar task dependencies. So, 
> build process create the otp image first, then run 
> do_generate_static_tar task.

You probably want to add it as a dependency of u-boot. This way the 
socsec-sign bbclass can implement the functionality to run `socsec 
verify ...` with the OTP blob as its last step, triggered from the 
u-boot recipe.

>
> Do you have any suggestion? Do I need to modify this bbclass, 
> https://github.com/openbmc/openbmc/blob/master/meta-phosphor/classes/image_types_phosphor.bbclass 

No, I don't expect so.

Andrew


More information about the openbmc mailing list