| Index: src/platform/vboot_reference/README
|
| diff --git a/src/platform/vboot_reference/README b/src/platform/vboot_reference/README
|
| index fda6aaf4d900d952fecfb63253bdabae11f8f7c7..94d6b2ed45d0271ca482fdfeb3e1684883758b96 100644
|
| --- a/src/platform/vboot_reference/README
|
| +++ b/src/platform/vboot_reference/README
|
| @@ -56,3 +56,81 @@ VerifyKernel()) are required. The functions that work on Firmware and
|
| Kernel images (e.g. VerifyFirmwareImage()) are only useful for
|
| user-land utilities that manipulate signed firmware and kernel images.
|
|
|
| +
|
| +----------
|
| +Generating a signed firmware image:
|
| +----------
|
| +
|
| +* Step 1: Generate RSA root and signing keys.
|
| +
|
| +# Root key is always 8192 bits.
|
| +$ openssl genrsa -F4 -out root_key.pem 8192
|
| +
|
| +# Signing key can be between 1024-8192 bits.
|
| +$ openssl genrsa -F4 -out signing_key.pem <1024|2048|4096|8192>
|
| +
|
| +Note: The -F4 option must be specified to generate RSA keys with
|
| + a public exponent of 65535. RSA keys with 3 as a public
|
| + exponent (the default) won't work.
|
| +
|
| +* Step 2: Generate pre-processed public versions of the above keys using
|
| + utils/dumpRSAPublicKey
|
| +
|
| +# dumpRSAPublicKey expects an x509 certificate as input.
|
| +$ openssl req -batch -new -x509 -key root_key.pem -out root_key.crt
|
| +$ openssl req -batch -new -x509 -key signing_key.pem -out signing_key.crt
|
| +$ utils/dumpRSAPublicKey root_key.crt > root_key.keyb
|
| +$ utils/dumpRSAPublicKey signing_key.crt > signing_key.keyb
|
| +
|
| +At this point we have all the requisite keys needed to generate a signed
|
| +firmware image.
|
| +
|
| +.pem RSA Public/Private Key Pair
|
| +.crt X509 Key Certificate
|
| +.keyb Pre-processed RSA Public Key
|
| +
|
| +
|
| +* Step 3: Use utils/firmware_utility to generate a signed firmare blob.
|
| +
|
| +$ utils/firmware_utility --generate \
|
| + --root_key root_key.pem \
|
| + --firmware_sign_key signing_key.pem \
|
| + --firmware_sign_key_pub signing_key.keyb \
|
| + --firmware_sign_algorithm <algoid> \
|
| + --firmware_key_version 1 \
|
| + --firmware_version 1 \
|
| + --in <firmware blob file> \
|
| + --out <output file>
|
| +
|
| +Where <algoid> is based on the signature algorithm to use for firmware
|
| +signining. The list of <algoid> specifications can be output by running
|
| +'utils/firmware_utility' without any arguments.
|
| +
|
| +Note: --firmware_key_version and --firmware_version are part of a signed
|
| + image and are used to prevent rollbacks to older version. For testing,
|
| + they can just be set valid values.
|
| +
|
| +
|
| +* Step 4: Verify that this image verifies.
|
| +
|
| +$ utils/firmware_utility --verify \
|
| + --in <signed firmware image>
|
| + --root_key_pub root_key.keyb
|
| +Verification SUCCESS.
|
| +
|
| +
|
| +Note: The verification functions expects a pointer to the
|
| + pre-processed public root key as input. For testing purposes,
|
| + root_key.keyb can be stored in RW part of the firmware. For the
|
| + final firmware, this will be a fixed public key which cannot be
|
| + changed and must be stored in RO firmware.
|
| +
|
| +----------
|
| +Generating a signed kernel image:
|
| +----------
|
| +
|
| +The steps for generating a signed kernel image are similar to that of
|
| +a firmware image. Since verification is chained - RO firmware verifies
|
| +RW firmware which verifies the kernel, only the keys change. An additional
|
| +kernel signing key must be generated. The firmware signing generated above
|
| +is the root key equivalent for signed kernel images.
|
|
|