Intel® Stratix® 10 Device Security User Guide

ID 683642
Date 7/14/2023
Public
Document Table of Contents
Give Feedback

4.5. Security Setting Fuse Provisioning

Use the Intel® Quartus® Prime Programmer to examine device security setting fuses and write them to a text-based .fuse file as follows:
quartus_pgm -c 1 -m jtag -o "ei;programming_file.fuse;1SX280LH2”

Options

  • i: The Programmer loads the provision firmware helper image to the device.
  • e: The Programmer reads the fuse from the device and stores it in a .fuse file.

The .fuse file contains a list of fuse name-value pairs. The value specifies whether a fuse has been blown or the contents of the fuse field.

The following example shows the format of the .fuse file:
# Co-signed firmware                       = "Not blown" 
# Device not secure                        = "Not blown" 
# Disable HPS debug                        = "Not blown" 
# Disable Intrinsic ID PUF enrollment      = "Not blown" 
# Disable JTAG                             = "Not blown" 
# Disable PUF-wrapped encryption key       = "Not blown" 
# Disable owner encryption key in BBRAM    = "Not blown" 
# Disable owner encryption key in eFuses   = "Not blown" 
# Disable virtual eFuses                   = "Not blown" 
# Force SDM clock to internal oscillator   = "Not blown" 
# Force encryption key update              = "Not blown" 
# Intel key cancellation                   = "1" 
# Lock security eFuses                     = "Not blown" 
# Owner encryption key program done        = "Not blown" 
# Owner encryption key program start       = "Not blown" 
# Owner fuses                              = 
 "0x00000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000" 
# Owner key cancellation                   = "" 
# Owner public key hash                    = "" 
# Owner public key size                    = "" 
# QSPI start up delay                      = "10ms" 
# RMA Counter                              = "0" 
# SDMIO0 is I2C                            = "Not blown"
Modify the .fuse file to set your desired security setting fuses. A line that begins with # is treated as a comment line. To program a security setting fuse, remove the leading # and set the value to Blown. For example, to enable the Co-signed Firmware security setting fuse, modify the first line of the fuse file to the following:
Co-signed firmware = "Blown"

You may also allocate and program the Owner Fuses based on your requirements.

You may use the following command to perform a blank check, program, and verify the owner root public key:

quartus_pgm -c 1 -m jtag -o "ibpv;root0.qky"

Options

  • i: Loads the provision firmware helper image to the device.
  • b: Performs a blank check to verify the desired security setting fuses are not already blown.
  • p: Programs the fuse.
  • v: Verifies the programmed key on the device.

After programming the .qky file, you may examine the fuse info by checking the fuse info again to ensure both the owner public key hash and the owner public key size have non-zero values.

While the following fields are not writable through the .fuse file method, they are included during the examine operation output for verification:
  • Device not secure
  • Intel key cancellation
  • Owner encryption key program start
  • Owner encryption key program done
  • Owner key cancellation
  • Owner public key hash
  • Owner public key size
  • QSPI start up delay
  • RMA counter
  • SDMIO0 is I2C
Use the Intel® Quartus® Prime Programmer to program the .fuse file back to the device. If you add the i option, the Programmer automatically loads the provision firmware to program the security setting fuses.
//For physical (non-volatile) eFuses 
quartus_pgm -c 1 -m jtag -o "pi;programming_file.fuse" --non_volatile_key
//For virtual (volatile) eFuses 
quartus_pgm -c 1 -m jtag -o "pi;programming_file.fuse"
You may use the following command to verify if the device root key hash is the same as the .qky provided in the command:
quartus_pgm -c 1 -m jtag -o "v;root0_another.qky"

If the keys don't match, the Programmer fails with an Operation failed error message.