OLD | NEW |
1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
2 * Use of this source code is governed by a BSD-style license that can be | 2 * Use of this source code is governed by a BSD-style license that can be |
3 * found in the LICENSE file. | 3 * found in the LICENSE file. |
4 * | 4 * |
5 * Functions for verifying a verified boot firmware image. | 5 * Functions for verifying a verified boot firmware image. |
6 * (Firmware Portion) | 6 * (Firmware Portion) |
7 */ | 7 */ |
8 | 8 |
9 #include "firmware_image_fw.h" | 9 #include "firmware_image_fw.h" |
10 | 10 |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 return VERIFY_FIRMWARE_PREAMBLE_SIGNATURE_FAILED; | 108 return VERIFY_FIRMWARE_PREAMBLE_SIGNATURE_FAILED; |
109 | 109 |
110 Memcpy(&len, preamble_blob + FIELD_LEN(firmware_version), | 110 Memcpy(&len, preamble_blob + FIELD_LEN(firmware_version), |
111 sizeof(len)); | 111 sizeof(len)); |
112 *firmware_len = len; | 112 *firmware_len = len; |
113 return 0; | 113 return 0; |
114 } | 114 } |
115 | 115 |
116 int VerifyFirmwareData(RSAPublicKey* firmware_sign_key, | 116 int VerifyFirmwareData(RSAPublicKey* firmware_sign_key, |
117 const uint8_t* preamble_start, | 117 const uint8_t* preamble_start, |
118 const uint8_t* firmware_data_start, | 118 const uint8_t* firmware_data, |
119 uint64_t firmware_len, | 119 uint64_t firmware_len, |
120 int algorithm) { | 120 int algorithm) { |
121 int signature_len = siglen_map[algorithm]; | 121 int signature_len = siglen_map[algorithm]; |
122 uint8_t* digest; | 122 int preamble_len = (FIELD_LEN(firmware_version) + |
| 123 FIELD_LEN(firmware_len) + |
| 124 FIELD_LEN(preamble));; |
| 125 uint8_t* digest = NULL; |
| 126 const uint8_t* firmware_signature = NULL; |
123 DigestContext ctx; | 127 DigestContext ctx; |
124 | 128 |
125 /* Since the firmware signature is over the preamble and the firmware data, | 129 /* Since the firmware signature is over the preamble and the firmware data, |
126 * which does not form a contiguous region of memory, we calculate the | 130 * which does not form a contiguous region of memory, we calculate the |
127 * message digest ourselves. */ | 131 * message digest ourselves. */ |
128 DigestInit(&ctx, algorithm); | 132 DigestInit(&ctx, algorithm); |
129 DigestUpdate(&ctx, preamble_start, | 133 DigestUpdate(&ctx, preamble_start, preamble_len); |
130 (FIELD_LEN(firmware_version) + | 134 DigestUpdate(&ctx, firmware_data, firmware_len); |
131 FIELD_LEN(firmware_len) + | |
132 FIELD_LEN(preamble))); | |
133 DigestUpdate(&ctx, firmware_data_start + signature_len, firmware_len); | |
134 digest = DigestFinal(&ctx); | 135 digest = DigestFinal(&ctx); |
| 136 /* Firmware signature is at the end of preamble and preamble signature. */ |
| 137 firmware_signature = preamble_start + preamble_len + signature_len; |
135 if (!RSAVerifyBinaryWithDigest_f( | 138 if (!RSAVerifyBinaryWithDigest_f( |
136 NULL, firmware_sign_key, /* Key to use. */ | 139 NULL, firmware_sign_key, /* Key to use. */ |
137 digest, /* Digest of the data to verify. */ | 140 digest, /* Digest of the data to verify. */ |
138 firmware_data_start, /* Expected Signature */ | 141 firmware_signature, /* Expected Signature */ |
139 algorithm)) { | 142 algorithm)) { |
140 Free(digest); | 143 Free(digest); |
141 return VERIFY_FIRMWARE_SIGNATURE_FAILED; | 144 return VERIFY_FIRMWARE_SIGNATURE_FAILED; |
142 } | 145 } |
143 Free(digest); | 146 Free(digest); |
144 return 0; | 147 return 0; |
145 } | 148 } |
146 | 149 |
147 int VerifyFirmware(const uint8_t* root_key_blob, | 150 int VerifyFirmware(const uint8_t* root_key_blob, |
| 151 const uint8_t* verification_header_blob, |
148 const uint8_t* firmware_blob) { | 152 const uint8_t* firmware_blob) { |
149 int error_code = 0; | 153 int error_code = 0; |
150 int algorithm; /* Signing key algorithm. */ | 154 int algorithm; /* Signing key algorithm. */ |
151 RSAPublicKey* firmware_sign_key = NULL; | 155 RSAPublicKey* firmware_sign_key = NULL; |
152 int firmware_sign_key_len, signature_len, header_len; | 156 int firmware_sign_key_len, signature_len, header_len; |
153 uint64_t firmware_len; | 157 uint64_t firmware_len; |
154 const uint8_t* header_ptr = NULL; /* Pointer to header. */ | 158 const uint8_t* header_ptr = NULL; /* Pointer to header. */ |
155 const uint8_t* firmware_sign_key_ptr = NULL; /* Pointer to signing key. */ | 159 const uint8_t* firmware_sign_key_ptr = NULL; /* Pointer to signing key. */ |
156 const uint8_t* preamble_ptr = NULL; /* Pointer to preamble block. */ | 160 const uint8_t* preamble_ptr = NULL; /* Pointer to preamble block. */ |
157 const uint8_t* firmware_ptr = NULL; /* Pointer to firmware signature/data. */ | |
158 | 161 |
159 /* Note: All the offset calculations are based on struct FirmwareImage which | 162 /* Note: All the offset calculations are based on struct FirmwareImage which |
160 * is defined in include/firmware_image.h. */ | 163 * is defined in include/firmware_image_fw.h. */ |
161 | 164 |
162 /* Compare magic bytes. */ | 165 /* Compare magic bytes. */ |
163 if (SafeMemcmp(firmware_blob, FIRMWARE_MAGIC, FIRMWARE_MAGIC_SIZE)) | 166 if (SafeMemcmp(verification_header_blob, FIRMWARE_MAGIC, |
| 167 FIRMWARE_MAGIC_SIZE)) { |
| 168 debug("Wrong Firmware Magic.\n"); |
164 return VERIFY_FIRMWARE_WRONG_MAGIC; | 169 return VERIFY_FIRMWARE_WRONG_MAGIC; |
165 header_ptr = firmware_blob + FIRMWARE_MAGIC_SIZE; | 170 } |
| 171 header_ptr = verification_header_blob + FIRMWARE_MAGIC_SIZE; |
166 | 172 |
167 /* Only continue if header verification succeeds. */ | 173 /* Only continue if header verification succeeds. */ |
168 if ((error_code = VerifyFirmwareHeader(root_key_blob, header_ptr, | 174 if ((error_code = VerifyFirmwareHeader(root_key_blob, header_ptr, |
169 &algorithm, &header_len))) | 175 &algorithm, &header_len))) { |
| 176 debug("Couldn't verify Firmware header.\n"); |
170 return error_code; /* AKA jump to revovery. */ | 177 return error_code; /* AKA jump to revovery. */ |
171 | 178 } |
172 /* Parse signing key into RSAPublicKey structure since it is required multiple | 179 /* Parse signing key into RSAPublicKey structure since it is required multiple |
173 * times. */ | 180 * times. */ |
174 firmware_sign_key_len = RSAProcessedKeySize(algorithm); | 181 firmware_sign_key_len = RSAProcessedKeySize(algorithm); |
175 firmware_sign_key_ptr = header_ptr + (FIELD_LEN(header_len) + | 182 firmware_sign_key_ptr = header_ptr + (FIELD_LEN(header_len) + |
176 FIELD_LEN(firmware_sign_algorithm) + | 183 FIELD_LEN(firmware_sign_algorithm) + |
177 FIELD_LEN(firmware_key_version)); | 184 FIELD_LEN(firmware_key_version)); |
178 firmware_sign_key = RSAPublicKeyFromBuf(firmware_sign_key_ptr, | 185 firmware_sign_key = RSAPublicKeyFromBuf(firmware_sign_key_ptr, |
179 firmware_sign_key_len); | 186 firmware_sign_key_len); |
180 signature_len = siglen_map[algorithm]; | 187 signature_len = siglen_map[algorithm]; |
181 | 188 |
182 /* Only continue if preamble verification succeeds. */ | 189 /* Only continue if preamble verification succeeds. */ |
183 preamble_ptr = (header_ptr + header_len + | 190 preamble_ptr = (header_ptr + header_len + |
184 FIELD_LEN(firmware_key_signature)); | 191 FIELD_LEN(firmware_key_signature)); |
185 if ((error_code = VerifyFirmwarePreamble(firmware_sign_key, preamble_ptr, | 192 if ((error_code = VerifyFirmwarePreamble(firmware_sign_key, preamble_ptr, |
186 algorithm, | 193 algorithm, |
187 &firmware_len))) { | 194 &firmware_len))) { |
188 RSAPublicKeyFree(firmware_sign_key); | 195 RSAPublicKeyFree(firmware_sign_key); |
189 debug("Couldn't verify Firmware preamble.\n"); | 196 debug("Couldn't verify Firmware preamble.\n"); |
190 return error_code; /* AKA jump to recovery. */ | 197 return error_code; /* AKA jump to recovery. */ |
191 } | 198 } |
192 /* Only continue if firmware data verification succeeds. */ | |
193 firmware_ptr = (preamble_ptr + | |
194 (FIELD_LEN(firmware_version) + /* Skip the preamble. */ | |
195 FIELD_LEN(firmware_len) + | |
196 FIELD_LEN(preamble)) + | |
197 signature_len); | |
198 | 199 |
199 if ((error_code = VerifyFirmwareData(firmware_sign_key, preamble_ptr, | 200 if ((error_code = VerifyFirmwareData(firmware_sign_key, preamble_ptr, |
200 firmware_ptr, | 201 firmware_blob, |
201 firmware_len, | 202 firmware_len, |
202 algorithm))) { | 203 algorithm))) { |
203 RSAPublicKeyFree(firmware_sign_key); | 204 RSAPublicKeyFree(firmware_sign_key); |
204 debug("Couldn't verify Firmware data.\n"); | 205 debug("Couldn't verify Firmware data.\n"); |
205 return error_code; /* AKA jump to recovery. */ | 206 return error_code; /* AKA jump to recovery. */ |
206 } | 207 } |
207 | 208 |
208 RSAPublicKeyFree(firmware_sign_key); | 209 RSAPublicKeyFree(firmware_sign_key); |
209 return 0; /* Success! */ | 210 return VERIFY_FIRMWARE_SUCCESS; /* Success! */ |
210 } | 211 } |
211 | 212 |
212 uint32_t GetLogicalFirmwareVersion(uint8_t* firmware_blob) { | 213 uint32_t GetLogicalFirmwareVersion(uint8_t* verification_header_blob) { |
213 uint16_t firmware_key_version; | 214 uint16_t firmware_key_version; |
214 uint16_t firmware_version; | 215 uint16_t firmware_version; |
215 uint16_t firmware_sign_algorithm; | 216 uint16_t firmware_sign_algorithm; |
216 int firmware_sign_key_len; | 217 int firmware_sign_key_len; |
217 Memcpy(&firmware_sign_algorithm, | 218 Memcpy(&firmware_sign_algorithm, |
218 firmware_blob + (FIELD_LEN(magic) + /* Offset to field. */ | 219 verification_header_blob + (FIELD_LEN(magic) + /* Offset to field. */ |
219 FIELD_LEN(header_len)), | 220 FIELD_LEN(header_len)), |
220 sizeof(firmware_sign_algorithm)); | 221 sizeof(firmware_sign_algorithm)); |
221 Memcpy(&firmware_key_version, | 222 Memcpy(&firmware_key_version, |
222 firmware_blob + (FIELD_LEN(magic) + /* Offset to field. */ | 223 verification_header_blob + (FIELD_LEN(magic) + /* Offset to field. */ |
223 FIELD_LEN(header_len) + | 224 FIELD_LEN(header_len) + |
224 FIELD_LEN(firmware_sign_algorithm)), | 225 FIELD_LEN(firmware_sign_algorithm)), |
225 sizeof(firmware_key_version)); | 226 sizeof(firmware_key_version)); |
226 if (firmware_sign_algorithm >= kNumAlgorithms) | 227 if (firmware_sign_algorithm >= kNumAlgorithms) |
227 return 0; | 228 return 0; |
228 firmware_sign_key_len = RSAProcessedKeySize(firmware_sign_algorithm); | 229 firmware_sign_key_len = RSAProcessedKeySize(firmware_sign_algorithm); |
229 Memcpy(&firmware_version, | 230 Memcpy(&firmware_version, |
230 firmware_blob + (FIELD_LEN(magic) + /* Offset to field. */ | 231 verification_header_blob + (FIELD_LEN(magic) + /* Offset to field. */ |
231 FIELD_LEN(header_len) + | 232 FIELD_LEN(header_len) + |
232 FIELD_LEN(firmware_key_version) + | 233 FIELD_LEN(firmware_key_version) + |
233 firmware_sign_key_len + | 234 firmware_sign_key_len + |
234 FIELD_LEN(header_checksum) + | 235 FIELD_LEN(header_checksum) + |
235 FIELD_LEN(firmware_key_signature)), | 236 FIELD_LEN(firmware_key_signature)), |
236 sizeof(firmware_version)); | 237 sizeof(firmware_version)); |
237 return CombineUint16Pair(firmware_key_version, firmware_version); | 238 return CombineUint16Pair(firmware_key_version, firmware_version); |
238 } | 239 } |
239 | 240 |
240 int VerifyFirmwareDriver_f(uint8_t* root_key_blob, | 241 int VerifyFirmwareDriver_f(uint8_t* root_key_blob, |
| 242 uint8_t* verification_headerA, |
241 uint8_t* firmwareA, | 243 uint8_t* firmwareA, |
| 244 uint8_t* verification_headerB, |
242 uint8_t* firmwareB) { | 245 uint8_t* firmwareB) { |
243 /* Contains the logical firmware version (32-bit) which is calculated as | 246 /* Contains the logical firmware version (32-bit) which is calculated as |
244 * (firmware_key_version << 16 | firmware_version) where | 247 * (firmware_key_version << 16 | firmware_version) where |
245 * [firmware_key_version] [firmware_version] are both 16-bit. | 248 * [firmware_key_version] [firmware_version] are both 16-bit. |
246 */ | 249 */ |
247 uint32_t firmwareA_lversion, firmwareB_lversion; | 250 uint32_t firmwareA_lversion, firmwareB_lversion; |
248 uint8_t firmwareA_is_verified = 0; /* Whether firmwareA verify succeeded. */ | 251 uint8_t firmwareA_is_verified = 0; /* Whether firmwareA verify succeeded. */ |
249 uint32_t min_lversion; /* Minimum of firmware A and firmware lversion. */ | 252 uint32_t min_lversion; /* Minimum of firmware A and firmware lversion. */ |
250 uint32_t stored_lversion; /* Stored logical version in the TPM. */ | 253 uint32_t stored_lversion; /* Stored logical version in the TPM. */ |
251 | 254 |
252 /* Initialize the TPM since we'll be reading the rollback indices. */ | 255 /* Initialize the TPM since we'll be reading the rollback indices. */ |
253 SetupTPM(); | 256 SetupTPM(); |
254 | 257 |
255 /* We get the key versions by reading directly from the image blobs without | 258 /* We get the key versions by reading directly from the image blobs without |
256 * any additional (expensive) sanity checking on the blob since it's faster to | 259 * any additional (expensive) sanity checking on the blob since it's faster to |
257 * outright reject a firmware with an older firmware key version. A malformed | 260 * outright reject a firmware with an older firmware key version. A malformed |
258 * or corrupted firmware blob will still fail when VerifyFirmware() is called | 261 * or corrupted firmware blob will still fail when VerifyFirmware() is called |
259 * on it. | 262 * on it. |
260 */ | 263 */ |
261 firmwareA_lversion = GetLogicalFirmwareVersion(firmwareA); | 264 firmwareA_lversion = GetLogicalFirmwareVersion(verification_headerA); |
262 firmwareB_lversion = GetLogicalFirmwareVersion(firmwareB); | 265 firmwareB_lversion = GetLogicalFirmwareVersion(verification_headerB); |
263 min_lversion = Min(firmwareA_lversion, firmwareB_lversion); | 266 min_lversion = Min(firmwareA_lversion, firmwareB_lversion); |
264 stored_lversion = CombineUint16Pair(GetStoredVersion(FIRMWARE_KEY_VERSION), | 267 stored_lversion = CombineUint16Pair(GetStoredVersion(FIRMWARE_KEY_VERSION), |
265 GetStoredVersion(FIRMWARE_VERSION)); | 268 GetStoredVersion(FIRMWARE_VERSION)); |
266 /* Always try FirmwareA first. */ | 269 /* Always try FirmwareA first. */ |
267 if (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, firmwareA)) | 270 if (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, |
| 271 verification_headerA, |
| 272 firmwareA)) |
268 firmwareA_is_verified = 1; | 273 firmwareA_is_verified = 1; |
269 if (firmwareA_is_verified && (stored_lversion < firmwareA_lversion)) { | 274 if (firmwareA_is_verified && (stored_lversion < firmwareA_lversion)) { |
270 /* Stored version may need to be updated but only if FirmwareB | 275 /* Stored version may need to be updated but only if FirmwareB |
271 * is successfully verified and has a logical version greater than | 276 * is successfully verified and has a logical version greater than |
272 * the stored logical version. */ | 277 * the stored logical version. */ |
273 if (stored_lversion < firmwareB_lversion) { | 278 if (stored_lversion < firmwareB_lversion) { |
274 if (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, firmwareB)) { | 279 if (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, |
| 280 verification_headerB, |
| 281 firmwareB)) { |
275 WriteStoredVersion(FIRMWARE_KEY_VERSION, | 282 WriteStoredVersion(FIRMWARE_KEY_VERSION, |
276 (uint16_t) (min_lversion >> 16)); | 283 (uint16_t) (min_lversion >> 16)); |
277 WriteStoredVersion(FIRMWARE_VERSION, | 284 WriteStoredVersion(FIRMWARE_VERSION, |
278 (uint16_t) (min_lversion & 0x00FFFF)); | 285 (uint16_t) (min_lversion & 0x00FFFF)); |
279 stored_lversion = min_lversion; /* Update stored version as it's used | 286 stored_lversion = min_lversion; /* Update stored version as it's used |
280 * later. */ | 287 * later. */ |
281 } | 288 } |
282 } | 289 } |
283 } | 290 } |
284 /* Lock Firmware TPM rollback indices from further writes. */ | 291 /* Lock Firmware TPM rollback indices from further writes. */ |
(...skipping 21 matching lines...) Expand all Loading... |
306 if (firmwareA_is_verified) { | 313 if (firmwareA_is_verified) { |
307 if (stored_lversion <= firmwareA_lversion) | 314 if (stored_lversion <= firmwareA_lversion) |
308 return BOOT_FIRMWARE_A_CONTINUE; | 315 return BOOT_FIRMWARE_A_CONTINUE; |
309 } else { | 316 } else { |
310 /* If FirmwareA was not valid, then we skipped over the | 317 /* If FirmwareA was not valid, then we skipped over the |
311 * check to update the rollback indices and a Verify of FirmwareB wasn't | 318 * check to update the rollback indices and a Verify of FirmwareB wasn't |
312 * attempted. | 319 * attempted. |
313 * If FirmwareB is not a rollback, then we attempt to do the verification. | 320 * If FirmwareB is not a rollback, then we attempt to do the verification. |
314 */ | 321 */ |
315 if (stored_lversion <= firmwareB_lversion && | 322 if (stored_lversion <= firmwareB_lversion && |
316 (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, firmwareB))) | 323 (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, |
| 324 verification_headerB, |
| 325 firmwareB))) |
317 return BOOT_FIRMWARE_B_CONTINUE; | 326 return BOOT_FIRMWARE_B_CONTINUE; |
318 } | 327 } |
319 /* D'oh: No bootable firmware. */ | 328 /* D'oh: No bootable firmware. */ |
320 return BOOT_FIRMWARE_RECOVERY_CONTINUE; | 329 return BOOT_FIRMWARE_RECOVERY_CONTINUE; |
321 } | 330 } |
OLD | NEW |