Index: scripts/keygeneration/increment_kernel_subkey_and_key.sh |
diff --git a/scripts/keygeneration/increment_kernel_subkey_and_key.sh b/scripts/keygeneration/increment_kernel_subkey_and_key.sh |
new file mode 100755 |
index 0000000000000000000000000000000000000000..36d30c8cb32905516095e1f757610f450a049227 |
--- /dev/null |
+++ b/scripts/keygeneration/increment_kernel_subkey_and_key.sh |
@@ -0,0 +1,99 @@ |
+#!/bin/bash |
+# Copyright (c) 2011 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. |
+ |
+# Script to increment kernel subkey and datakey for firmware updates. |
+# Used when revving versions for a firmware update. |
+ |
+# Load common constants and variables. |
+. "$(dirname "$0")/common.sh" |
+ |
+# Abort on errors. |
+set -e |
+ |
+# File to read current versions from. |
+VERSION_FILE="key.versions" |
+ |
+# ARGS: <version_type> |
+get_version() { |
+ local version_type=$1 |
+ version=$(sed -n "s#^${version_type}=\(.*\)#\1#pg" ${VERSION_FILE}) |
+ echo $version |
+} |
+ |
+# Make backups of existing keys and keyblocks that will be revved. |
+# Backup format: |
+# for keys: <key_name>.v<version> |
+# for keyblocks: <keyblock_name>.v<datakey version>.v<subkey version> |
+# Args: SUBKEY_VERSION DATAKEY_VERSION |
+backup_existing_kernel_keys() { |
+ subkey_version=$1 |
+ datakey_version=$2 |
+ # --no-clobber to prevent accidentally overwriting existing |
+ # backups. |
+ mv --no-clobber kernel_subkey.vbprivk{,".v${subkey_version}"} |
+ mv --no-clobber kernel_subkey.vbpubk{,".v${subkey_version}"} |
+ mv --no-clobber kernel_data_key.vbprivk{,".v${datakey_version}"} |
+ mv --no-clobber kernel_data_key.vbpubk{,".v${datakey_version}"} |
+ mv --no-clobber kernel.keyblock{,".v${datakey_version}.v${subkey_version}"} |
+} |
+ |
+# Write new key version file with the updated key versions. |
+# Args: FIRMWARE_KEY_VERSION FIRMWARE_VERSION KERNEL_KEY_VERSION KERNEL_VERSION |
+write_updated_version_file() { |
+ local firmware_key_version=$1 |
+ local firmware_version=$2 |
+ local kernel_key_version=$3 |
+ local kernel_version=$4 |
+ |
+ cat > ${VERSION_FILE} <<EOF |
+firmware_key_version=${firmware_key_version} |
+firmware_version=${firmware_version} |
+kernel_key_version=${kernel_key_version} |
+kernel_version=${kernel_version} |
+EOF |
+} |
+ |
+ |
+main() { |
+ current_fkey_version=$(get_version "firmware_key_version") |
+ # Firmware version is the kernel subkey version. |
+ current_ksubkey_version=$(get_version "firmware_version") |
+ # Kernel data key version is the kernel key version. |
+ current_kdatakey_version=$(get_version "kernel_key_version") |
+ current_kernel_version=$(get_version "kernel_version") |
+ |
+ cat <<EOF |
+Current Firmware key version: ${current_fkey_version} |
+Current Firmware version: ${current_ksubkey_version} |
+Current Kernel key version: ${current_kdatakey_version} |
+Current Kernel version: ${current_kernel_version} |
+EOF |
+ |
+ backup_existing_kernel_keys $current_ksubkey_version $current_kdatakey_version |
+ |
+ new_ksubkey_version=$(( current_ksubkey_version + 1 )) |
+ new_kdatakey_version=$(( current_kdatakey_version + 1 )) |
+ |
+ if [ $new_kdatakey_version -gt 65535 ] || [ $new_kdatakey_version -gt 65535 ]; |
+ then |
+ echo "Version overflow!" |
+ exit 1 |
+ fi |
+ |
+ cat <<EOF |
+Generating new kernel subkey, data keys and new kernel keyblock. |
+ |
+New Firmware version (due to kernel subkey change): ${new_ksubkey_version}. |
+New Kernel key version (due to kernel datakey change): ${new_kdatakey_version}. |
+EOF |
+ make_pair kernel_subkey $KERNEL_SUBKEY_ALGOID $new_ksubkey_version |
+ make_pair kernel_data_key $KERNEL_DATAKEY_ALGOID $new_kdatakey_version |
+ make_keyblock kernel $KERNEL_KEYBLOCK_MODE kernel_data_key kernel_subkey |
+ |
+ write_updated_version_file $current_fkey_version $new_ksubkey_version \ |
+ $new_kdatakey_version $current_kernel_version |
+} |
+ |
+main $@ |