123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- #!/bin/bash -e
- # Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
- # Use of this source code is governed by a BSD-style license that can be
- # found in the LICENSE file.
- #
- # Check args first.
- if [ "$#" -lt "1" ]; then
- cat <<EOF 1>&2
- Usage: ${0##*/} BASENAME [ALG]
- This creates BASENAME.vbpubk and BASENAME.vbprivk pairs for use in signing
- developer files. This also creates a BASENAME.keyblock file containing the
- BASENAME.vbpubk, which can be used to sign a developer kernel.
- If specified, ALG is one of:
- 0 = RSA1024 with SHA1
- 1 = RSA1024 with SHA256
- 2 = RSA1024 with SHA512
- 3 = RSA2048 with SHA1
- 4 = RSA2048 with SHA256
- 5 = RSA2048 with SHA512
- 6 = RSA4096 with SHA1
- 7 = RSA4096 with SHA256
- 8 = RSA4096 with SHA512
- 9 = RSA8192 with SHA1
- 10 = RSA8192 with SHA256
- 11 = RSA8192 with SHA512
- If ALG is not specified, a default value will be used.
- EOF
- exit 1
- fi
- # Compute the key length assuming the sizes shown above.
- function alg_to_keylen {
- echo $(( 1 << (10 + ($1 / 3)) ))
- }
- # Emit .vbpubk and .vbprivk using given basename and algorithm.
- function make_pair {
- local base=$1
- local alg=$2
- local len=$(alg_to_keylen $alg)
- # make the RSA keypair
- openssl genrsa -F4 -out "${base}_${len}.pem" $len
- # create a self-signed certificate
- openssl req -batch -new -x509 -key "${base}_${len}.pem" \
- -out "${base}_${len}.crt"
- # generate pre-processed RSA public key
- dumpRSAPublicKey -cert "${base}_${len}.crt" > "${base}_${len}.keyb"
- # wrap the public key
- futility vbutil_key \
- --pack "${base}.vbpubk" \
- --key "${base}_${len}.keyb" \
- --version 1 \
- --algorithm $alg
- # wrap the private key
- futility vbutil_key \
- --pack "${base}.vbprivk" \
- --key "${base}_${len}.pem" \
- --algorithm $alg
- # remove intermediate files
- rm -f "${base}_${len}.pem" "${base}_${len}.crt" "${base}_${len}.keyb"
- }
- # First create the .vbpubk and .vbprivk pair.
- make_pair "$1" "${2:-4}"
- # Now create a .keyblock to hold our .vbpubk. Since it's for developer use, it
- # won't be signed, just checksummed. Developer kernels can only be run in
- # non-recovery mode with the developer switch enabled, but it won't hurt us to
- # turn on all the flags bits anyway.
- futility vbutil_keyblock --pack "$1.keyblock" \
- --datapubkey "$1.vbpubk" --flags 15
|