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 # Helper script that generates the signed kernel image | 7 # Helper script that generates the signed kernel image |
8 | 8 |
9 . "$(dirname "$0")/common.sh" | 9 . "$(dirname "$0")/common.sh" |
10 | 10 |
11 get_default_board | 11 get_default_board |
12 | 12 |
13 # Flags. | 13 # Flags. |
14 DEFINE_string arch "x86" \ | 14 DEFINE_string arch "x86" \ |
15 "The boot architecture: arm or x86. (Default: x86)" | 15 "The boot architecture: arm or x86. (Default: x86)" |
16 DEFINE_string to "/tmp/vmlinuz.image" \ | 16 DEFINE_string to "/tmp/vmlinuz.image" \ |
17 "The path to the kernel image to be created. (Default: /tmp/vmlinuz.image)" | 17 "The path to the kernel image to be created. (Default: /tmp/vmlinuz.image)" |
| 18 DEFINE_string hd_vblock "/tmp/vmlinuz_hd.vblock" \ |
| 19 "The path to the installed kernel's vblock (Default: /tmp/vmlinuz_hd.vblock)" |
18 DEFINE_string vmlinuz "vmlinuz" \ | 20 DEFINE_string vmlinuz "vmlinuz" \ |
19 "The path to the kernel (Default: vmlinuz)" | 21 "The path to the kernel (Default: vmlinuz)" |
20 DEFINE_string working_dir "/tmp/vmlinuz.working" \ | 22 DEFINE_string working_dir "/tmp/vmlinuz.working" \ |
21 "Working directory for in-progress files. (Default: /tmp/vmlinuz.working)" | 23 "Working directory for in-progress files. (Default: /tmp/vmlinuz.working)" |
22 DEFINE_boolean keep_work ${FLAGS_FALSE} \ | 24 DEFINE_boolean keep_work ${FLAGS_FALSE} \ |
23 "Keep temporary files (*.keyblock, *.vbpubk). (Default: false)" | 25 "Keep temporary files (*.keyblock, *.vbpubk). (Default: false)" |
24 DEFINE_string keys_dir "${SRC_ROOT}/platform/vboot_reference/tests/testkeys" \ | 26 DEFINE_string keys_dir "${SRC_ROOT}/platform/vboot_reference/tests/testkeys" \ |
25 "Directory with the RSA signing keys. (Defaults to test keys)" | 27 "Directory with the RSA signing keys. (Defaults to test keys)" |
26 # Note, to enable verified boot, the caller would manually pass: | 28 # Note, to enable verified boot, the caller would manually pass: |
27 # --boot_args='dm="... /dev/sd%D%P /dev/sd%D%P ..." \ | 29 # --boot_args='dm="... /dev/sd%D%P /dev/sd%D%P ..." \ |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 rootwait | 125 rootwait |
124 ro | 126 ro |
125 noresume | 127 noresume |
126 noswap | 128 noswap |
127 i915.modeset=1 | 129 i915.modeset=1 |
128 loglevel=7 | 130 loglevel=7 |
129 cros_secure | 131 cros_secure |
130 EOF | 132 EOF |
131 WORK="${WORK} ${FLAGS_working_dir}/config.txt" | 133 WORK="${WORK} ${FLAGS_working_dir}/config.txt" |
132 | 134 |
133 | 135 # We sign the image with the recovery_key, because this is what goes onto the |
134 # FIX: The .vbprivk files are not encrypted, so we shouldn't just leave them | 136 # USB key. We can only boot from the USB drive in recovery mode. |
135 # lying around as a general thing. | |
136 | |
137 # Wrap the kernel data keypair, used for the kernel body | |
138 vbutil_key \ | |
139 --pack "${FLAGS_working_dir}/kernel_data_key.vbpubk" \ | |
140 --key "${FLAGS_keys_dir}/key_rsa2048.keyb" \ | |
141 --version 1 \ | |
142 --algorithm 4 | |
143 WORK="${WORK} ${FLAGS_working_dir}/kernel_data_key.vbpubk" | |
144 | |
145 vbutil_key \ | |
146 --pack "${FLAGS_working_dir}/kernel_data_key.vbprivk" \ | |
147 --key "${FLAGS_keys_dir}/key_rsa2048.pem" \ | |
148 --algorithm 4 | |
149 WORK="${WORK} ${FLAGS_working_dir}/kernel_data_key.vbprivk" | |
150 | |
151 | |
152 # Wrap the kernel subkey pair, used for the kernel's keyblock | |
153 vbutil_key \ | |
154 --pack "${FLAGS_working_dir}/kernel_subkey.vbpubk" \ | |
155 --key "${FLAGS_keys_dir}/key_rsa4096.keyb" \ | |
156 --version 1 \ | |
157 --algorithm 8 | |
158 WORK="${WORK} ${FLAGS_working_dir}/kernel_subkey.vbpubk" | |
159 | |
160 vbutil_key \ | |
161 --pack "${FLAGS_working_dir}/kernel_subkey.vbprivk" \ | |
162 --key "${FLAGS_keys_dir}/key_rsa4096.pem" \ | |
163 --algorithm 8 | |
164 WORK="${WORK} ${FLAGS_working_dir}/kernel_subkey.vbprivk" | |
165 | |
166 | |
167 # Create the kernel keyblock, containing the kernel data key | |
168 vbutil_keyblock \ | |
169 --pack "${FLAGS_working_dir}/kernel.keyblock" \ | |
170 --datapubkey "${FLAGS_working_dir}/kernel_data_key.vbpubk" \ | |
171 --signprivate "${FLAGS_working_dir}/kernel_subkey.vbprivk" \ | |
172 --flags 15 | |
173 WORK="${WORK} ${FLAGS_working_dir}/kernel.keyblock" | |
174 | |
175 # Verify the keyblock. | |
176 vbutil_keyblock \ | |
177 --unpack "${FLAGS_working_dir}/kernel.keyblock" \ | |
178 --signpubkey "${FLAGS_working_dir}/kernel_subkey.vbpubk" | |
179 | |
180 # TODO: We should sign the kernel blob using the recovery root key and | |
181 # recovery kernel data key instead (to create the recovery image), and then | |
182 # re-sign it this way for the install image. But we'll want to keep the | |
183 # install vblock separate, so we can just copy that part over separately when | |
184 # we install it instead of the whole kernel blob. | |
185 | 137 |
186 # Create and sign the kernel blob | 138 # Create and sign the kernel blob |
187 vbutil_kernel \ | 139 vbutil_kernel \ |
188 --pack "${FLAGS_to}" \ | 140 --pack "${FLAGS_to}" \ |
189 --keyblock "${FLAGS_working_dir}/kernel.keyblock" \ | 141 --keyblock "${FLAGS_keys_dir}/recovery_kernel.keyblock" \ |
190 --signprivate "${FLAGS_working_dir}/kernel_data_key.vbprivk" \ | 142 --signprivate "${FLAGS_keys_dir}/recovery_kernel_data_key.vbprivk" \ |
191 --version 1 \ | 143 --version 1 \ |
192 --config "${FLAGS_working_dir}/config.txt" \ | 144 --config "${FLAGS_working_dir}/config.txt" \ |
193 --bootloader /lib64/bootstub/bootstub.efi \ | 145 --bootloader /lib64/bootstub/bootstub.efi \ |
194 --vmlinuz "${FLAGS_vmlinuz}" | 146 --vmlinuz "${FLAGS_vmlinuz}" |
195 | 147 |
196 # And verify it. | 148 # And verify it. |
197 vbutil_kernel \ | 149 vbutil_kernel \ |
198 --verify "${FLAGS_to}" \ | 150 --verify "${FLAGS_to}" \ |
199 --signpubkey "${FLAGS_working_dir}/kernel_subkey.vbpubk" | 151 --signpubkey "${FLAGS_keys_dir}/recovery_key.vbpubk" |
| 152 |
| 153 |
| 154 # Now we re-sign the same image using the normal keys. This is the kernel |
| 155 # image that is put on the hard disk by the installer. Note: To save space on |
| 156 # the USB image, we're only emitting the new verfication block, and the |
| 157 # installer just replaces that part of the hard disk's kernel partition. |
| 158 vbutil_kernel \ |
| 159 --repack "${FLAGS_hd_vblock}" \ |
| 160 --vblockonly \ |
| 161 --keyblock "${FLAGS_keys_dir}/kernel.keyblock" \ |
| 162 --signprivate "${FLAGS_keys_dir}/kernel_data_key.vbprivk" \ |
| 163 --oldblob "${FLAGS_to}" |
| 164 |
| 165 |
| 166 # To verify it, we have to replace the vblock from the original image. |
| 167 tempfile=$(mktemp) |
| 168 trap "rm -f $tempfile" EXIT |
| 169 cat "${FLAGS_hd_vblock}" > $tempfile |
| 170 dd if="${FLAGS_to}" bs=65536 skip=1 >> $tempfile |
| 171 |
| 172 vbutil_kernel \ |
| 173 --verify $tempfile \ |
| 174 --signpubkey "${FLAGS_keys_dir}/kernel_subkey.vbpubk" |
| 175 |
| 176 rm -f $tempfile |
| 177 trap - EXIT |
200 | 178 |
201 elif [[ "${FLAGS_arch}" = "arm" ]]; then | 179 elif [[ "${FLAGS_arch}" = "arm" ]]; then |
202 # FIXME: For now, ARM just uses the unsigned kernel by itself. | 180 # FIXME: For now, ARM just uses the unsigned kernel by itself. |
203 cp -f "${FLAGS_vmlinuz}" "${FLAGS_to}" | 181 cp -f "${FLAGS_vmlinuz}" "${FLAGS_to}" |
204 else | 182 else |
205 error "Unknown arch: ${FLAGS_arch}" | 183 error "Unknown arch: ${FLAGS_arch}" |
206 fi | 184 fi |
207 | 185 |
208 set +e # cleanup failure is a-ok | 186 set +e # cleanup failure is a-ok |
209 | 187 |
210 if [[ ${FLAGS_keep_work} -eq ${FLAGS_FALSE} ]]; then | 188 if [[ ${FLAGS_keep_work} -eq ${FLAGS_FALSE} ]]; then |
211 info "Cleaning up temporary files: ${WORK}" | 189 info "Cleaning up temporary files: ${WORK}" |
212 rm ${WORK} | 190 rm ${WORK} |
213 rmdir ${FLAGS_working_dir} | 191 rmdir ${FLAGS_working_dir} |
214 fi | 192 fi |
215 | 193 |
216 info "Kernel partition image emitted: ${FLAGS_to}" | 194 info "Kernel partition image emitted: ${FLAGS_to}" |
217 | 195 |
218 if [[ -f ${FLAGS_rootfs_hash} ]]; then | 196 if [[ -f ${FLAGS_rootfs_hash} ]]; then |
219 info "Root filesystem hash emitted: ${FLAGS_rootfs_hash}" | 197 info "Root filesystem hash emitted: ${FLAGS_rootfs_hash}" |
220 fi | 198 fi |
OLD | NEW |