| OLD | NEW |
| 1 #!/bin/bash | 1 #!/bin/bash |
| 2 | 2 |
| 3 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 3 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
| 5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
| 6 | 6 |
| 7 # Sign the final build image using the "official" keys. | 7 # Sign the final build image using the "official" keys. |
| 8 # | 8 # |
| 9 # Prerequisite tools needed in the system path: | 9 # Prerequisite tools needed in the system path: |
| 10 # | 10 # |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 done | 45 done |
| 46 | 46 |
| 47 TYPE=$1 | 47 TYPE=$1 |
| 48 INPUT_IMAGE=$2 | 48 INPUT_IMAGE=$2 |
| 49 KEY_DIR=$3 | 49 KEY_DIR=$3 |
| 50 OUTPUT_IMAGE=$4 | 50 OUTPUT_IMAGE=$4 |
| 51 | 51 |
| 52 # Re-calculate rootfs hash, update rootfs and kernel command line. | 52 # Re-calculate rootfs hash, update rootfs and kernel command line. |
| 53 # Args: IMAGE KEYBLOCK PRIVATEKEY | 53 # Args: IMAGE KEYBLOCK PRIVATEKEY |
| 54 recalculate_rootfs_hash() { | 54 recalculate_rootfs_hash() { |
| 55 echo "Recalculating rootfs" |
| 55 local image=$1 # Input image. | 56 local image=$1 # Input image. |
| 56 local keyblock=$2 # Keyblock for re-generating signed kernel partition | 57 local keyblock=$2 # Keyblock for re-generating signed kernel partition |
| 57 local signprivate=$3 # Private key to use for signing. | 58 local signprivate=$3 # Private key to use for signing. |
| 58 | 59 |
| 59 # First, grab the existing kernel partition and get the kernel config. | 60 # First, grab the existing kernel partition and get the kernel config. |
| 60 temp_kimage=$(make_temp_file) | 61 temp_kimage=$(make_temp_file) |
| 61 extract_image_partition ${image} 2 ${temp_kimage} | 62 extract_image_partition ${image} 2 ${temp_kimage} |
| 62 local kernel_config=$(sudo dump_kernel_config ${temp_kimage}) | 63 local kernel_config=$(sudo dump_kernel_config ${temp_kimage}) |
| 63 local dm_config=$(echo $kernel_config | | 64 local dm_config=$(echo $kernel_config | |
| 64 sed -e 's/.*dm="\([^"]*\)".*/\1/g' | | 65 sed -e 's/.*dm="\([^"]*\)".*/\1/g' | |
| 65 cut -f2- -d,) | 66 cut -f2- -d,) |
| 66 # We extract dm=... portion of the config command line. Here's an example: | 67 # We extract dm=... portion of the config command line. Here's an example: |
| 67 # | 68 # |
| 68 # dm="0 2097152 verity ROOT_DEV HASH_DEV 2097152 1 \ | 69 # dm="0 2097152 verity ROOT_DEV HASH_DEV 2097152 1 \ |
| 69 # sha1 63b7ad16cb9db4b70b28593f825aa6b7825fdcf2" | 70 # sha1 63b7ad16cb9db4b70b28593f825aa6b7825fdcf2" |
| 70 # | 71 # |
| 71 | 72 |
| 72 if [ -z ${dm_config} ]; then | 73 if [ -z "${dm_config}" ]; then |
| 73 echo "WARNING: Couldn't grab dm_config. Aborting rootfs hash calculation" | 74 echo "WARNING: Couldn't grab dm_config. Aborting rootfs hash calculation" |
| 74 return | 75 return |
| 75 fi | 76 fi |
| 76 local rootfs_sectors=$(echo ${dm_config} | cut -f2 -d' ') | 77 local rootfs_sectors=$(echo ${dm_config} | cut -f2 -d' ') |
| 77 local root_dev=$(echo ${dm_config} | cut -f4 -d ' ') | 78 local root_dev=$(echo ${dm_config} | cut -f4 -d ' ') |
| 78 local hash_dev=$(echo ${dm_config} | cut -f5 -d ' ') | 79 local hash_dev=$(echo ${dm_config} | cut -f5 -d ' ') |
| 79 local verity_depth=$(echo ${dm_config} | cut -f7 -d' ') | 80 local verity_depth=$(echo ${dm_config} | cut -f7 -d' ') |
| 80 local verity_algorithm=$(echo ${dm_config} | cut -f8 -d' ') | 81 local verity_algorithm=$(echo ${dm_config} | cut -f8 -d' ') |
| 81 | 82 |
| 82 # Mount the rootfs and run the verity tool on it. | 83 # Mount the rootfs and run the verity tool on it. |
| (...skipping 18 matching lines...) Expand all Loading... |
| 101 dd if=${hash_image} of=${rootfs_img} bs=512 \ | 102 dd if=${hash_image} of=${rootfs_img} bs=512 \ |
| 102 seek=${rootfs_sectors} conv=notrunc | 103 seek=${rootfs_sectors} conv=notrunc |
| 103 | 104 |
| 104 # Re-calculate kernel partition signature and command line. | 105 # Re-calculate kernel partition signature and command line. |
| 105 local updated_kimage=$(make_temp_file) | 106 local updated_kimage=$(make_temp_file) |
| 106 vbutil_kernel --repack ${updated_kimage} \ | 107 vbutil_kernel --repack ${updated_kimage} \ |
| 107 --keyblock ${keyblock} \ | 108 --keyblock ${keyblock} \ |
| 108 --signprivate ${signprivate} \ | 109 --signprivate ${signprivate} \ |
| 109 --oldblob ${temp_kimage} \ | 110 --oldblob ${temp_kimage} \ |
| 110 --config ${temp_config} | 111 --config ${temp_config} |
| 111 | 112 |
| 112 replace_image_partition ${image} 2 ${updated_kimage} | 113 replace_image_partition ${image} 2 ${updated_kimage} |
| 113 replace_image_partition ${image} 3 ${rootfs_img} | 114 replace_image_partition ${image} 3 ${rootfs_img} |
| 114 } | 115 } |
| 115 | 116 |
| 116 # Extracts the firmware update binaries from the a firmware update | 117 # Extracts the firmware update binaries from the a firmware update |
| 117 # shell ball (generated by src/platform/firmware/pack_firmware.sh) | 118 # shell ball (generated by src/platform/firmware/pack_firmware.sh) |
| 118 # Args: INPUT_SCRIPT OUTPUT_DIR | 119 # Args: INPUT_SCRIPT OUTPUT_DIR |
| 119 get_firmwarebin_from_shellball() { | 120 get_firmwarebin_from_shellball() { |
| 120 local input=$1 | 121 local input=$1 |
| 121 local output_dir=$2 | 122 local output_dir=$2 |
| 122 uudecode -o - ${input} | tar -C ${output_dir} -zxf - 2>/dev/null || \ | 123 uudecode -o - ${input} | tar -C ${output_dir} -zxf - 2>/dev/null || \ |
| 123 echo "Extracting firmware autoupdate failed. | 124 echo "Extracting firmware autoupdate failed." && exit 1 |
| 124 Try re-running with FW_NOUPDATE=1." && exit 1 | |
| 125 } | 125 } |
| 126 | 126 |
| 127 # Re-sign the firmware AU payload inside the image rootfs with a new keys. | 127 # Re-sign the firmware AU payload inside the image rootfs with a new keys. |
| 128 # Args: IMAGE | 128 # Args: IMAGE |
| 129 resign_firmware_payload() { | 129 resign_firmware_payload() { |
| 130 local image=$1 | 130 local image=$1 |
| 131 | 131 |
| 132 # Grab firmware image from the autoupdate shellball. | 132 # Grab firmware image from the autoupdate shellball. |
| 133 local rootfs_dir=$(make_temp_dir) | 133 local rootfs_dir=$(make_temp_dir) |
| 134 mount_image_partition ${image} 3 ${rootfs_dir} | 134 mount_image_partition ${image} 3 ${rootfs_dir} |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 # Generate the factory install image. | 206 # Generate the factory install image. |
| 207 sign_for_factory_install() { | 207 sign_for_factory_install() { |
| 208 ${SCRIPT_DIR}/resign_image.sh ${INPUT_IMAGE} ${OUTPUT_IMAGE} \ | 208 ${SCRIPT_DIR}/resign_image.sh ${INPUT_IMAGE} ${OUTPUT_IMAGE} \ |
| 209 ${KEY_DIR}/recovery_kernel_data_key.vbprivk \ | 209 ${KEY_DIR}/recovery_kernel_data_key.vbprivk \ |
| 210 ${KEY_DIR}/installer_kernel.keyblock | 210 ${KEY_DIR}/installer_kernel.keyblock |
| 211 echo "Output signed factory install image to ${OUTPUT_IMAGE}" | 211 echo "Output signed factory install image to ${OUTPUT_IMAGE}" |
| 212 } | 212 } |
| 213 | 213 |
| 214 # Firmware payload signing hidden behind a flag until it actually makes | 214 # Firmware payload signing hidden behind a flag until it actually makes |
| 215 # it into the image. | 215 # it into the image. |
| 216 if [ ! "${FW_UPDATE}" == "1" ]; then | 216 if [ "${FW_UPDATE}" == "1" ]; then |
| 217 resign_firmware_payload ${INPUT_IMAGE} | 217 resign_firmware_payload ${INPUT_IMAGE} |
| 218 fi | 218 fi |
| 219 | 219 |
| 220 if [ "${TYPE}" == "ssd" ]; then | 220 if [ "${TYPE}" == "ssd" ]; then |
| 221 recalculate_rootfs_hash ${INPUT_IMAGE} \ | 221 recalculate_rootfs_hash ${INPUT_IMAGE} \ |
| 222 ${KEY_DIR}/kernel.keyblock \ | 222 ${KEY_DIR}/kernel.keyblock \ |
| 223 ${KEY_DIR}/kernel_data_key.vbprivk | 223 ${KEY_DIR}/kernel_data_key.vbprivk |
| 224 sign_for_ssd | 224 sign_for_ssd |
| 225 elif [ "${TYPE}" == "recovery" ]; then | 225 elif [ "${TYPE}" == "recovery" ]; then |
| 226 recalculate_rootfs_hash ${INPUT_IMAGE} \ | 226 recalculate_rootfs_hash ${INPUT_IMAGE} \ |
| 227 ${KEY_DIR}/recovery_kernel.keyblock \ | 227 ${KEY_DIR}/recovery_kernel.keyblock \ |
| 228 ${KEY_DIR}/recovery_kernel_data_key.vbprivk | 228 ${KEY_DIR}/recovery_kernel_data_key.vbprivk |
| 229 sign_for_recovery | 229 sign_for_recovery |
| 230 elif [ "${TYPE}" == "install" ]; then | 230 elif [ "${TYPE}" == "install" ]; then |
| 231 recalculate_rootfs_hash ${INPUT_IMAGE} \ | 231 recalculate_rootfs_hash ${INPUT_IMAGE} \ |
| 232 ${KEY_DIR}/installer_kernel.keyblock \ | 232 ${KEY_DIR}/installer_kernel.keyblock \ |
| 233 ${KEY_DIR}/recovery_kernel_data_key.vbprivk | 233 ${KEY_DIR}/recovery_kernel_data_key.vbprivk |
| 234 sign_for_factory_install | 234 sign_for_factory_install |
| 235 else | 235 else |
| 236 echo "Invalid type ${TYPE}" | 236 echo "Invalid type ${TYPE}" |
| 237 exit 1 | 237 exit 1 |
| 238 fi | 238 fi |
| OLD | NEW |