Some questions about fuses

jetson linux 36.3,refer to this document

and has some questions about fuses

1.for some fuse items,exp: oemK1, oemK2, SBK, stored in plain text in the configuration file, How to prevent the leakage of these keys,do you have any recommended practices? It is not only on the production line that equipment needs to be fused; R&D personnel also need to fuse equipment separately during the research and development process.

2.refer to Jetson-Orin-Fuse-Specification_DA, FUSE_KEYS_OEM_K1_0_TAG_0、FUSE_KEYS_OEM_K2_0_TAG_0、FUSE_KEYS_PSC_STATIC_OEM_0_0_0、FUSE_KEYS_PSC_STATIC_OEM_0_1_0, What are the functions of these fuse items, where are they used, and is it mandatory to perform fusing?

3.On the same device, the HUK changes before and after blowing the oemK1 fuse. Consequently, services derived from the HUK, such as secure storage, cannot decrypt content encrypted before the fuse was blown. Are there any solutions for this, and is there any way for the HUK to not depend on the oemK1?

— 🤖 This is an automated AI response. I’m here to help, but please verify important details! —

Based on the provided context, I will answer your questions about fuses on the Jetson Orin NX.

  1. To prevent the leakage of keys stored in plain text in the configuration file, the provided context does not offer specific recommendations. However, it is essential to handle these keys securely, especially during the production line and R&D process. It is recommended to follow best practices for secure key management, such as storing keys securely, limiting access to authorized personnel, and using secure protocols for key exchange.

  2. The provided context does not explicitly explain the functions of the fuse items FUSE_KEYS_OEM_K1_0_TAG_0, FUSE_KEYS_OEM_K2_0_TAG_0, FUSE_KEYS_PSC_STATIC_OEM_0_0_0, and FUSE_KEYS_PSC_STATIC_OEM_0_1_0. However, it mentions that OEM_K1 and OEM_K2 are used for generating the EKB (Encrypted Key Blob) image. The context also mentions that burning the OEM_K1 fuse changes the HUK (Hardware Unique Key), which affects services derived from the HUK, such as secure storage.

  3. According to the provided context, there is no clear solution to prevent the HUK from depending on the OEM_K1 fuse. The context states that burning the OEM_K1 fuse changes the HUK, which affects services derived from the HUK. However, it is recommended to follow the guidelines provided in the NVIDIA Jetson Linux Developer Guide for Secure Boot and fuse management to ensure secure key management and minimize potential issues.

In summary, while the provided context does not offer explicit answers to all your questions, it emphasizes the importance of secure key management and following best practices for handling sensitive information. It is essential to consult the NVIDIA Jetson Linux Developer Guide and other relevant documentation for more detailed information on fuse management and secure boot on the Jetson Orin NX.

— We support team will also look into your issue to have further suggestions soon. please stay tuned. —

hello baojifu,

>> Q1
you may refer to $OUT/Linux_for_Tegra/bootloader/README_Massfuse.txt.
here’s tool to create a massfuse blob, which able to fuse targets to enable secureboot without revealing any SBK or PKC key files.

>> Q2
please refer to Jetson Orin Fuse Specification for more details of those fuse variables.

>> Q3
we’ve address the similar issue that HUK will not depends-on EKB.
is it possible for moving forward to the latest JetPack 6.2.2/L4T 36.5.0 release version for verification?

hello JerryChang,

thanks for your reply

>> Q1

I have seen this, and try to generate a massfuse blob, but an error occured

command:

BOARDID=3701 BOARDSKU=0000 FAB=500 BOARDREV=J.0 FUSELEVEL=fuselevel_production  CHIPREV=1 CHIP_SKU=D0 ./nvmassfusegen.sh -i 0x23 --auth NS -X bootloader/fuse_t234_oemk1.xml jetson-orin-nano-devkit

error:

......
sed: -e expression #31, char 22: unknown option to `s'
failed.
*** Error: fusecmd.sh generation failed.

my device is jetson orin NX, and set the command’s target to jetson-orin-nano-devkit,I don’t know if the error is caused by an incorrect target specification.

>>Q2

I have read the document, but I am not sure if it is necessary to blow those fuse items, and if so, what values they should be blown to.

>>Q3

No, we just use Jetpack6.0/L4T 36.3,has no upgrade plan, Could you provide a patch based on L4T 36.3?

hello baojifu,

may I know what board authorization type you’re going to enabled?
please double check Burn Fuses with the Fuse Configuration file.
you may also refer to some of fuse configuration file samples.

unfortunately, we usually don’t back port changes.
please moving forward, just an FYI, NVIDIA JetPack™ 6.2.2, which includes security-related fixes.
see-also Release_Notes_r36.5.

Hi JerryChang,

I am not sure what exactly you mean by the board authorization type, we just use AGX orin and orin NX.

I have already check the Jetson Orin Fuse Specification, and I didn’t get an answer to my question.

I check the r36.5 optee source code, and the HUK is still depend on oemK1,and the releasenote has no relative info

hello baojifu,

for instance,
PKC for sign. if PKC is burned, then the KEYFILE users provide is for signing the images.
SBK for encryption. if SBK is burned, then the SBKFILE users provide is for encrypting the images.

Hi JerryChang,

I use the NS (No authentication) because I did not fuse the PKC or SBK

and the Q1 error, I have solved it,the reason is BOARDID and other args is wrong

pls help to answer the Q2 and Q3, thanks a lot

hello baojifu,

you should enable PKC+SBK+OEM_K1.
see-also Example Orin Fuse Configuration File to Program an ECDSA P-521 Key + SBK Key + OemK1 Key.

>> Q2
please point-out the fuse variables you’ll need more description.

>> Q3
HUK depends on EKB_RK, which on Orin is rooted in OEM_K1/OEM_K2.

Hi JerryChang,

>> Q1

is SBK mandatory to be enabled? what special components will be encrypted by SKB, I see ‘UEFI payload encryption’ will encrypt the initrd/kernel image/kernel dtb.

>> Q2

FUSE_KEYS_OEM_K1_0_TAG_0、FUSE_KEYS_OEM_K2_0_TAG_0、FUSE_KEYS_PSC_STATIC_OEM_0_0_0、FUSE_KEYS_PSC_STATIC_OEM_0_1_0,

>> Q3

Are there any fuse items that have already been blown when the chip leave nvida factory,for exp: ecid, and is the HUK derived based on such fuse items, so the HUK will never changed

Could you please answer these questions?

hello baojifu,

>> Q1
the bootloader binaries has authentication by PKC and decryption by SBK.
see-also.. $OUT/Linux_for_Tegra/bootloader/generic/cfg/flash_t234_qspi.xml for details.

>> Q2
there’re OEM_K1/K2 to derive a root key which is itself used to sign and encrypt the EKB.
FUSE_KEYS_OEM_K1_0_TAG_0 is the first word of the 128-bit authentication tag for the wrapped OEM_K1 fuse key, and it must typically be provisioned explicitly.
For PscOdmStatic, we recommend burning it to 0x60, which sets the purpose of:
– OEM_K1 to encryption. (see-also OEM_K1_PURPOSE=0x0)
– OEM_K2 to KDK(key derive key) (see-also OEM_K2_PURPOSE=0x6)

>> Q3
please refer to Jetson Orin Series Modules Fuse Update Field Services Bulletin.
there’s only the fuse value boot_security_info was burned (by manufacturing) to 0x1E0.

hello JerryChang,

>> Q2:

What the corresponding name(fuse name) should be specified for FUSE_KEYS_OEM_K1_0_TAG_0 in xml ?

<genericfuse MagicId="0x45535546" version="1.0.0">
    <!-- <fuse name="OdmId" size="8" value="0xFFFFFFFFFFFFFFFF"/> -->
    <!-- <fuse name="OdmInfo" size="4" value="0xFFFF"/> -->
    <!-- <fuse name="ArmJtagDisable" size="4" value="0x1"/> -->
    <!-- <fuse name="DebugAuthentication" size="4" value="0x1F"/> -->
    <!-- <fuse name="CcplexDfdAccessDisable" size="4" value="0x1"/> -->
    <!-- <fuse name="ReservedOdm0" size="4" value="0xFFFFFFFF"/> -->
    <!-- <fuse name="ReservedOdm1" size="4" value="0xFFFFFFFF"/> -->
    <!-- <fuse name="ReservedOdm2" size="4" value="0xFFFFFFFF"/> -->
    <!-- <fuse name="ReservedOdm3" size="4" value="0xFFFFFFFF"/> -->
    <!-- <fuse name="OdmLock" size="4" value="0xF"/> -->
    <!-- <fuse name="ReservedOdm4" size="4" value="0xFFFFFFFF"/> -->
    <!-- <fuse name="ReservedOdm5" size="4" value="0xFFFFFFFF"/> -->
    <!-- <fuse name="ReservedOdm6" size="4" value="0xFFFFFFFF"/> -->
    <!-- <fuse name="ReservedOdm7" size="4" value="0xFFFFFFFF"/> -->
    <!-- <fuse name="SecureProvisionInfo" size="4" value="0x3"/> -->
    <!-- <fuse name="OptInEnable" size="4" value="0x1"/> -->
    <!-- <fuse name="SwReserved" size="4" value="0xFFFFFF"/> -->
    <!-- <fuse name="BootDevInfo" size="4" value="0xFFFFFF"/> -->
    <!-- <fuse name="ZeroizeDis" size="4" value="0x1"/> -->
    <!-- <fuse name="PublicKeyHash" size="64" value="0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"/> -->
    <!-- <fuse name="PkcPubkeyHash1" size="64" value="0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"/> -->
    <!-- <fuse name="PkcPubkeyHash2" size="64" value="0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"/> -->
    <!-- <fuse name="EndorseKey" size="68" value="0x1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"/> -->
    <!-- <fuse name="SecureBootKey" size="32" value="0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"/> -->
    <!-- <fuse name="Kdk0" size="32" value="0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"/> -->
    <!-- <fuse name="PscOdmStatic" size="4" value="0xFFFFFFFF"/> -->
    <!-- <fuse name="OemK1" size="32" value="0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"/> -->
    <!-- <fuse name="OemK2" size="32" value="0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"/> -->
    <!-- <fuse name="BootSecurityInfo" size="4" value="0xFFFFFFFF"/> -->
    <!-- <fuse name="SecurityMode" size="4" value="0x1"/> -->
</genericfuse>

hello baojifu,

FUSE_KEYS_OEM_K1_0_TAG_0 corresponds to OemK1Tag in the Jetson fuse XML.
please have the case-sensitive XML fuse name,
for instance, <fuse name="OemK1Tag" size="16" value="0x..."/>

hello JerryChang,

>> Q2

What should the value of OemK1Tag be set to? Is it acceptable to set it to a 128-bit random value, or does it need to be calculated from OemK1 using an algorithm? I haven’t found any relevant information in any official NVIDIA documentation or forums.

hello JerryChang,

   Could you please answer  the above question?thanks

hello baojifu,

FYI, this is not supported.
OemK1Tag is used for the wrapped OEM_K1 fuse key. however, L4T does not support fuse key wrapping/unwrapping.