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 generating and manipulating a verified boot kernel image. | 5 * Functions for generating and manipulating a verified boot kernel image. |
6 * (Userland portion) | 6 * (Userland portion) |
7 */ | 7 */ |
8 | 8 |
9 #include "kernel_image.h" | 9 #include "kernel_image.h" |
10 | 10 |
(...skipping 11 matching lines...) Expand all Loading... |
22 | 22 |
23 /* Macro to determine the size of a field structure in the KernelImage | 23 /* Macro to determine the size of a field structure in the KernelImage |
24 * structure. */ | 24 * structure. */ |
25 #define FIELD_LEN(field) (sizeof(((KernelImage*)0)->field)) | 25 #define FIELD_LEN(field) (sizeof(((KernelImage*)0)->field)) |
26 | 26 |
27 KernelImage* KernelImageNew(void) { | 27 KernelImage* KernelImageNew(void) { |
28 KernelImage* image = (KernelImage*) Malloc(sizeof(KernelImage)); | 28 KernelImage* image = (KernelImage*) Malloc(sizeof(KernelImage)); |
29 if (image) { | 29 if (image) { |
30 image->kernel_sign_key = NULL; | 30 image->kernel_sign_key = NULL; |
31 image->kernel_key_signature = NULL; | 31 image->kernel_key_signature = NULL; |
32 Memset(image->kernel_config, | 32 image->preamble_signature = NULL; |
33 0, | |
34 sizeof(image->kernel_config)); | |
35 image->config_signature = NULL; | |
36 image->kernel_signature = NULL; | 33 image->kernel_signature = NULL; |
37 image->kernel_data = NULL; | 34 image->kernel_data = NULL; |
38 } | 35 } |
39 return image; | 36 return image; |
40 } | 37 } |
41 | 38 |
42 void KernelImageFree(KernelImage* image) { | 39 void KernelImageFree(KernelImage* image) { |
43 if (image) { | 40 if (image) { |
44 Free(image->kernel_sign_key); | 41 Free(image->kernel_sign_key); |
45 Free(image->kernel_key_signature); | 42 Free(image->kernel_key_signature); |
46 Free(image->config_signature); | 43 Free(image->preamble_signature); |
47 Free(image->kernel_signature); | 44 Free(image->kernel_signature); |
48 Free(image->kernel_data); | 45 Free(image->kernel_data); |
49 Free(image); | 46 Free(image); |
50 } | 47 } |
51 } | 48 } |
52 | 49 |
53 KernelImage* ReadKernelImage(const char* input_file) { | 50 KernelImage* ReadKernelImage(const char* input_file) { |
54 uint64_t file_size; | 51 uint64_t file_size; |
55 int image_len = 0; /* Total size of the kernel image. */ | 52 int image_len = 0; /* Total size of the kernel image. */ |
56 int header_len = 0; | 53 int header_len = 0; |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 debug("Invalid kernel header checksum!\n"); | 126 debug("Invalid kernel header checksum!\n"); |
130 Free(kernel_buf); | 127 Free(kernel_buf); |
131 return NULL; | 128 return NULL; |
132 } | 129 } |
133 | 130 |
134 /* Read key signature. */ | 131 /* Read key signature. */ |
135 image->kernel_key_signature = (uint8_t*) Malloc(kernel_key_signature_len); | 132 image->kernel_key_signature = (uint8_t*) Malloc(kernel_key_signature_len); |
136 StatefulMemcpy(&st, image->kernel_key_signature, | 133 StatefulMemcpy(&st, image->kernel_key_signature, |
137 kernel_key_signature_len); | 134 kernel_key_signature_len); |
138 | 135 |
139 /* Read the kernel config. */ | 136 /* Read the kernel preamble. */ |
140 StatefulMemcpy(&st, &image->kernel_version, FIELD_LEN(kernel_version)); | 137 StatefulMemcpy(&st, &image->kernel_version, FIELD_LEN(kernel_version)); |
141 StatefulMemcpy(&st, &image->kernel_len, FIELD_LEN(kernel_len)); | 138 StatefulMemcpy(&st, &image->kernel_len, FIELD_LEN(kernel_len)); |
| 139 StatefulMemcpy(&st, &image->bootloader_offset, FIELD_LEN(bootloader_offset)); |
| 140 StatefulMemcpy(&st, &image->bootloader_size, FIELD_LEN(bootloader_size)); |
| 141 StatefulMemcpy(&st, &image->padded_header_size, |
| 142 FIELD_LEN(padded_header_size)); |
142 | 143 |
143 /* Read config and kernel signatures. */ | 144 /* Read config and kernel signatures. */ |
144 image->config_signature = (uint8_t*) Malloc(kernel_signature_len); | 145 image->preamble_signature = (uint8_t*) Malloc(kernel_signature_len); |
145 StatefulMemcpy(&st, image->config_signature, kernel_signature_len); | 146 StatefulMemcpy(&st, image->preamble_signature, kernel_signature_len); |
146 image->kernel_signature = (uint8_t*) Malloc(kernel_signature_len); | 147 image->kernel_signature = (uint8_t*) Malloc(kernel_signature_len); |
147 StatefulMemcpy(&st, image->kernel_signature, kernel_signature_len); | 148 StatefulMemcpy(&st, image->kernel_signature, kernel_signature_len); |
148 | 149 |
149 /* Read kernel config command line and kernel image data. */ | 150 /* Read kernel image data. */ |
150 StatefulMemcpy(&st, image->kernel_config, FIELD_LEN(kernel_config)); | |
151 image->kernel_data = (uint8_t*) Malloc(image->kernel_len); | 151 image->kernel_data = (uint8_t*) Malloc(image->kernel_len); |
152 StatefulMemcpy(&st, image->kernel_data, image->kernel_len); | 152 StatefulMemcpy(&st, image->kernel_data, image->kernel_len); |
153 | 153 |
154 if(st.overrun || st.remaining_len != 0) { /* Overrun or underrun. */ | 154 if(st.overrun || st.remaining_len != 0) { /* Overrun or underrun. */ |
155 Free(kernel_buf); | 155 Free(kernel_buf); |
156 return NULL; | 156 return NULL; |
157 } | 157 } |
158 Free(kernel_buf); | 158 Free(kernel_buf); |
159 return image; | 159 return image; |
160 } | 160 } |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 RSAProcessedKeySize(image->kernel_sign_algorithm)); | 211 RSAProcessedKeySize(image->kernel_sign_algorithm)); |
212 StatefulMemcpy_r(&st, &image->header_checksum, FIELD_LEN(header_checksum)); | 212 StatefulMemcpy_r(&st, &image->header_checksum, FIELD_LEN(header_checksum)); |
213 | 213 |
214 if (st.overrun || st.remaining_len != 0) { /* Underrun or Overrun. */ | 214 if (st.overrun || st.remaining_len != 0) { /* Underrun or Overrun. */ |
215 Free(header_blob); | 215 Free(header_blob); |
216 return NULL; | 216 return NULL; |
217 } | 217 } |
218 return header_blob; | 218 return header_blob; |
219 } | 219 } |
220 | 220 |
221 int GetKernelConfigLen(const KernelImage* image) { | 221 uint8_t* GetKernelPreambleBlob(const KernelImage* image) { |
222 return (FIELD_LEN(kernel_version) + | 222 uint8_t* preamble_blob = NULL; |
223 FIELD_LEN(kernel_len) + | |
224 FIELD_LEN(kernel_config)); | |
225 } | |
226 | |
227 uint8_t* GetKernelConfigBlob(const KernelImage* image) { | |
228 uint8_t* config_blob = NULL; | |
229 MemcpyState st; | 223 MemcpyState st; |
230 | 224 |
231 config_blob = (uint8_t*) Malloc(GetKernelConfigLen(image)); | 225 preamble_blob = (uint8_t*) Malloc(GetKernelPreambleLen()); |
232 st.remaining_len = GetKernelConfigLen(image); | 226 st.remaining_len = GetKernelPreambleLen(); |
233 st.remaining_buf = config_blob; | 227 st.remaining_buf = preamble_blob; |
234 st.overrun = 0; | 228 st.overrun = 0; |
235 | 229 |
236 StatefulMemcpy_r(&st, &image->kernel_version, FIELD_LEN(kernel_version)); | 230 StatefulMemcpy_r(&st, &image->kernel_version, FIELD_LEN(kernel_version)); |
237 StatefulMemcpy_r(&st, &image->kernel_len, FIELD_LEN(kernel_len)); | 231 StatefulMemcpy_r(&st, &image->kernel_len, FIELD_LEN(kernel_len)); |
238 StatefulMemcpy_r(&st, image->kernel_config, FIELD_LEN(kernel_config)); | 232 StatefulMemcpy_r(&st, &image->bootloader_offset, FIELD_LEN(bootloader_offset))
; |
| 233 StatefulMemcpy_r(&st, &image->bootloader_size, FIELD_LEN(bootloader_size)); |
| 234 StatefulMemcpy_r(&st, &image->padded_header_size, |
| 235 FIELD_LEN(padded_header_size)); |
239 | 236 |
240 if (st.overrun || st.remaining_len != 0) { /* Overrun or Underrun. */ | 237 if (st.overrun || st.remaining_len != 0) { /* Overrun or Underrun. */ |
241 Free(config_blob); | 238 Free(preamble_blob); |
242 return NULL; | 239 return NULL; |
243 } | 240 } |
244 return config_blob; | 241 return preamble_blob; |
245 } | 242 } |
246 | 243 |
247 uint8_t* GetKernelBlob(const KernelImage* image, uint64_t* blob_len) { | 244 uint8_t* GetKernelBlob(const KernelImage* image, uint64_t* blob_len) { |
248 int kernel_key_signature_len; | 245 int kernel_key_signature_len; |
249 int kernel_signature_len; | 246 int kernel_signature_len; |
250 uint8_t* kernel_blob = NULL; | 247 uint8_t* kernel_blob = NULL; |
251 uint8_t* header_blob = NULL; | 248 uint8_t* header_blob = NULL; |
252 MemcpyState st; | 249 MemcpyState st; |
253 | 250 |
254 if (!image) | 251 if (!image) |
255 return NULL; | 252 return NULL; |
256 kernel_key_signature_len = siglen_map[image->firmware_sign_algorithm]; | 253 kernel_key_signature_len = siglen_map[image->firmware_sign_algorithm]; |
257 kernel_signature_len = siglen_map[image->kernel_sign_algorithm]; | 254 kernel_signature_len = siglen_map[image->kernel_sign_algorithm]; |
258 *blob_len = (FIELD_LEN(magic) + | 255 *blob_len = (FIELD_LEN(magic) + |
259 GetKernelHeaderLen(image) + | 256 GetKernelHeaderLen(image) + |
260 kernel_key_signature_len + | 257 kernel_key_signature_len + |
261 GetKernelConfigLen(image) + | 258 GetKernelPreambleLen() + |
262 2 * kernel_signature_len + | 259 2 * kernel_signature_len + |
263 image->kernel_len); | 260 image->kernel_len); |
264 kernel_blob = (uint8_t*) Malloc(*blob_len); | 261 kernel_blob = (uint8_t*) Malloc(*blob_len); |
265 st.remaining_len = *blob_len; | 262 st.remaining_len = *blob_len; |
266 st.remaining_buf = kernel_blob; | 263 st.remaining_buf = kernel_blob; |
267 st.overrun = 0; | 264 st.overrun = 0; |
268 | 265 |
269 header_blob = GetKernelHeaderBlob(image); | 266 header_blob = GetKernelHeaderBlob(image); |
270 | 267 |
271 StatefulMemcpy_r(&st, image->magic, FIELD_LEN(magic)); | 268 StatefulMemcpy_r(&st, image->magic, FIELD_LEN(magic)); |
272 StatefulMemcpy_r(&st, header_blob, GetKernelHeaderLen(image)); | 269 StatefulMemcpy_r(&st, header_blob, GetKernelHeaderLen(image)); |
273 StatefulMemcpy_r(&st, image->kernel_key_signature, kernel_key_signature_len); | 270 StatefulMemcpy_r(&st, image->kernel_key_signature, kernel_key_signature_len); |
274 /* Copy over kernel config blob (including signatures.) */ | 271 /* Copy over kernel preamble blob (including signatures.) */ |
275 StatefulMemcpy_r(&st, &image->kernel_version, FIELD_LEN(kernel_version)); | 272 StatefulMemcpy_r(&st, &image->kernel_version, FIELD_LEN(kernel_version)); |
276 StatefulMemcpy_r(&st, &image->kernel_len, FIELD_LEN(kernel_len)); | 273 StatefulMemcpy_r(&st, &image->kernel_len, FIELD_LEN(kernel_len)); |
277 StatefulMemcpy_r(&st, image->config_signature, kernel_signature_len); | 274 StatefulMemcpy_r(&st, &image->bootloader_offset, |
| 275 FIELD_LEN(bootloader_offset)); |
| 276 StatefulMemcpy_r(&st, &image->bootloader_size, FIELD_LEN(bootloader_size)); |
| 277 StatefulMemcpy_r(&st, &image->padded_header_size, |
| 278 FIELD_LEN(padded_header_size)); |
| 279 StatefulMemcpy_r(&st, image->preamble_signature, kernel_signature_len); |
278 StatefulMemcpy_r(&st, image->kernel_signature, kernel_signature_len); | 280 StatefulMemcpy_r(&st, image->kernel_signature, kernel_signature_len); |
279 StatefulMemcpy_r(&st, image->kernel_config, FIELD_LEN(kernel_config)); | |
280 StatefulMemcpy_r(&st, image->kernel_data, image->kernel_len); | 281 StatefulMemcpy_r(&st, image->kernel_data, image->kernel_len); |
281 | 282 |
282 Free(header_blob); | 283 Free(header_blob); |
283 | 284 |
284 if (st.overrun || st.remaining_len != 0) { /* Underrun or Overrun. */ | 285 if (st.overrun || st.remaining_len != 0) { /* Underrun or Overrun. */ |
285 Free(kernel_blob); | 286 Free(kernel_blob); |
286 return NULL; | 287 return NULL; |
287 } | 288 } |
288 return kernel_blob; | 289 return kernel_blob; |
289 } | 290 } |
(...skipping 18 matching lines...) Expand all Loading... |
308 debug("Couldn't create kernel blob from KernelImage.\n"); | 309 debug("Couldn't create kernel blob from KernelImage.\n"); |
309 return 0; | 310 return 0; |
310 } | 311 } |
311 if (!is_only_vblock) { | 312 if (!is_only_vblock) { |
312 if (blob_len != write(fd, kernel_blob, blob_len)) { | 313 if (blob_len != write(fd, kernel_blob, blob_len)) { |
313 debug("Couldn't write Kernel Image to file: %s\n", | 314 debug("Couldn't write Kernel Image to file: %s\n", |
314 input_file); | 315 input_file); |
315 success = 0; | 316 success = 0; |
316 } | 317 } |
317 } else { | 318 } else { |
318 /* Exclude kernel_config and kernel_data. */ | 319 /* Exclude kernel_data. */ |
319 int vblock_len = blob_len - (image->kernel_len + | 320 int vblock_len = blob_len - (image->kernel_len); |
320 sizeof(image->kernel_config)); | |
321 if (vblock_len != write(fd, kernel_blob, vblock_len)) { | 321 if (vblock_len != write(fd, kernel_blob, vblock_len)) { |
322 debug("Couldn't write Kernel Image Verification block to file: %s\n", | 322 debug("Couldn't write Kernel Image Verification block to file: %s\n", |
323 input_file); | 323 input_file); |
324 success = 0; | 324 success = 0; |
325 } | 325 } |
326 } | 326 } |
327 Free(kernel_blob); | 327 Free(kernel_blob); |
328 close(fd); | 328 close(fd); |
329 return success; | 329 return success; |
330 } | 330 } |
331 | 331 |
332 void PrintKernelImage(const KernelImage* image) { | 332 void PrintKernelImage(const KernelImage* image) { |
333 if (!image) | 333 if (!image) |
334 return; | 334 return; |
335 | 335 |
336 /* Print header. */ | 336 /* Print header. */ |
337 printf("Header Version = %d\n" | 337 printf("Header Version = %d\n" |
338 "Header Length = %d\n" | 338 "Header Length = %d\n" |
339 "Kernel Key Signature Algorithm = %s\n" | 339 "Kernel Key Signature Algorithm = %s\n" |
340 "Kernel Signature Algorithm = %s\n" | 340 "Kernel Signature Algorithm = %s\n" |
341 "Kernel Key Version = %d\n\n", | 341 "Kernel Key Version = %d\n\n", |
342 image->header_version, | 342 image->header_version, |
343 image->header_len, | 343 image->header_len, |
344 algo_strings[image->firmware_sign_algorithm], | 344 algo_strings[image->firmware_sign_algorithm], |
345 algo_strings[image->kernel_sign_algorithm], | 345 algo_strings[image->kernel_sign_algorithm], |
346 image->kernel_key_version); | 346 image->kernel_key_version); |
347 /* TODO(gauravsh): Output hash and key signature here? */ | 347 /* TODO(gauravsh): Output hash and key signature here? */ |
348 /* Print preamble. */ | 348 /* Print preamble. */ |
349 printf("Kernel Version = %d\n" | 349 printf("Kernel Version = %d\n" |
350 "Kernel Config command line = \"%s\"\n" | 350 "kernel Length = %" PRId64 "\n" |
351 "kernel Length = %" PRId64 "\n", | 351 "Bootloader Offset = %" PRId64 "\n" |
| 352 "Bootloader Size = %" PRId64 "\n" |
| 353 "Padded Header Size = %" PRId64 "\n", |
352 image->kernel_version, | 354 image->kernel_version, |
353 image->kernel_config, | 355 image->kernel_len, |
354 image->kernel_len); | 356 image->bootloader_offset, |
| 357 image->bootloader_size, |
| 358 image->padded_header_size); |
355 /* TODO(gauravsh): Output kernel signature here? */ | 359 /* TODO(gauravsh): Output kernel signature here? */ |
356 } | 360 } |
357 | 361 |
358 | 362 |
359 int VerifyKernelImage(const RSAPublicKey* firmware_key, | 363 int VerifyKernelImage(const RSAPublicKey* firmware_key, |
360 const KernelImage* image, | 364 const KernelImage* image, |
361 const int dev_mode) { | 365 const int dev_mode) { |
362 RSAPublicKey* kernel_sign_key = NULL; | 366 RSAPublicKey* kernel_sign_key = NULL; |
363 uint8_t* header_digest = NULL; | 367 uint8_t* header_digest = NULL; |
364 uint8_t* config_digest = NULL; | 368 uint8_t* preamble_digest = NULL; |
365 uint8_t* kernel_digest = NULL; | 369 uint8_t* kernel_digest = NULL; |
366 int kernel_sign_key_size; | 370 int kernel_sign_key_size; |
367 int kernel_signature_size; | 371 int kernel_signature_size; |
368 int error_code = 0; | 372 int error_code = 0; |
369 DigestContext ctx; | 373 DigestContext ctx; |
370 DigestContext kernel_ctx; | 374 DigestContext kernel_ctx; |
371 if (!image) | 375 if (!image) |
372 return VERIFY_KERNEL_INVALID_IMAGE; | 376 return VERIFY_KERNEL_INVALID_IMAGE; |
373 | 377 |
374 /* Verify kernel key signature on the key header if we | 378 /* Verify kernel key signature on the key header if we |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 goto verify_failure; | 414 goto verify_failure; |
411 } | 415 } |
412 } | 416 } |
413 | 417 |
414 /* Get kernel signing key to verify the rest of the kernel. */ | 418 /* Get kernel signing key to verify the rest of the kernel. */ |
415 kernel_sign_key_size = RSAProcessedKeySize(image->kernel_sign_algorithm); | 419 kernel_sign_key_size = RSAProcessedKeySize(image->kernel_sign_algorithm); |
416 kernel_sign_key = RSAPublicKeyFromBuf(image->kernel_sign_key, | 420 kernel_sign_key = RSAPublicKeyFromBuf(image->kernel_sign_key, |
417 kernel_sign_key_size); | 421 kernel_sign_key_size); |
418 kernel_signature_size = siglen_map[image->kernel_sign_algorithm]; | 422 kernel_signature_size = siglen_map[image->kernel_sign_algorithm]; |
419 | 423 |
420 /* Verify kernel config signature. */ | 424 /* Verify kernel preamble signature. */ |
421 DigestInit(&ctx, image->kernel_sign_algorithm); | 425 DigestInit(&ctx, image->kernel_sign_algorithm); |
422 DigestUpdate(&ctx, (uint8_t*) &image->kernel_version, | 426 DigestUpdate(&ctx, (uint8_t*) &image->kernel_version, |
423 FIELD_LEN(kernel_version)); | 427 FIELD_LEN(kernel_version)); |
424 DigestUpdate(&ctx, (uint8_t*) &image->kernel_len, | 428 DigestUpdate(&ctx, (uint8_t*) &image->kernel_len, |
425 FIELD_LEN(kernel_len)); | 429 FIELD_LEN(kernel_len)); |
426 DigestUpdate(&ctx, (uint8_t*) image->kernel_config, | 430 DigestUpdate(&ctx, (uint8_t*) &image->bootloader_offset, |
427 FIELD_LEN(kernel_config)); | 431 FIELD_LEN(bootloader_offset)); |
428 config_digest = DigestFinal(&ctx); | 432 DigestUpdate(&ctx, (uint8_t*) &image->bootloader_size, |
429 if (!RSAVerify(kernel_sign_key, image->config_signature, | 433 FIELD_LEN(bootloader_size)); |
| 434 DigestUpdate(&ctx, (uint8_t*) &image->padded_header_size, |
| 435 FIELD_LEN(padded_header_size)); |
| 436 preamble_digest = DigestFinal(&ctx); |
| 437 if (!RSAVerify(kernel_sign_key, image->preamble_signature, |
430 kernel_signature_size, image->kernel_sign_algorithm, | 438 kernel_signature_size, image->kernel_sign_algorithm, |
431 config_digest)) { | 439 preamble_digest)) { |
432 error_code = VERIFY_KERNEL_CONFIG_SIGNATURE_FAILED; | 440 error_code = VERIFY_KERNEL_PREAMBLE_SIGNATURE_FAILED; |
433 goto verify_failure; | 441 goto verify_failure; |
434 } | 442 } |
435 | 443 |
436 /* Verify kernel signature - kernel signature is computed on the contents | 444 /* Verify kernel signature - kernel signature is computed on the contents |
437 of kernel version + kernel options + kernel_data. */ | 445 of kernel version + kernel options + kernel_data. */ |
438 DigestInit(&kernel_ctx, image->kernel_sign_algorithm); | 446 DigestInit(&kernel_ctx, image->kernel_sign_algorithm); |
439 DigestUpdate(&kernel_ctx, (uint8_t*) &image->kernel_version, | 447 DigestUpdate(&kernel_ctx, (uint8_t*) &image->kernel_version, |
440 FIELD_LEN(kernel_version)); | 448 FIELD_LEN(kernel_version)); |
441 DigestUpdate(&kernel_ctx, (uint8_t*) &image->kernel_len, | 449 DigestUpdate(&kernel_ctx, (uint8_t*) &image->kernel_len, |
442 FIELD_LEN(kernel_len)); | 450 FIELD_LEN(kernel_len)); |
443 DigestUpdate(&kernel_ctx, (uint8_t*) image->kernel_config, | 451 DigestUpdate(&kernel_ctx, (uint8_t*) &image->bootloader_offset, |
444 FIELD_LEN(kernel_config)); | 452 FIELD_LEN(bootloader_offset)); |
445 DigestUpdate(&kernel_ctx, image->kernel_data, image->kernel_len); | 453 DigestUpdate(&kernel_ctx, (uint8_t*) &image->bootloader_size, |
| 454 FIELD_LEN(bootloader_size)); |
| 455 DigestUpdate(&kernel_ctx, (uint8_t*) &image->padded_header_size, |
| 456 FIELD_LEN(padded_header_size)); |
| 457 DigestUpdate(&kernel_ctx, (uint8_t*) image->kernel_data, |
| 458 image->kernel_len); |
446 kernel_digest = DigestFinal(&kernel_ctx); | 459 kernel_digest = DigestFinal(&kernel_ctx); |
447 if (!RSAVerify(kernel_sign_key, image->kernel_signature, | 460 if (!RSAVerify(kernel_sign_key, image->kernel_signature, |
448 kernel_signature_size, image->kernel_sign_algorithm, | 461 kernel_signature_size, image->kernel_sign_algorithm, |
449 kernel_digest)) { | 462 kernel_digest)) { |
450 error_code = VERIFY_KERNEL_SIGNATURE_FAILED; | 463 error_code = VERIFY_KERNEL_SIGNATURE_FAILED; |
451 goto verify_failure; | 464 goto verify_failure; |
452 } | 465 } |
453 | 466 |
454 verify_failure: | 467 verify_failure: |
455 RSAPublicKeyFree(kernel_sign_key); | 468 RSAPublicKeyFree(kernel_sign_key); |
456 Free(kernel_digest); | 469 Free(kernel_digest); |
457 Free(config_digest); | 470 Free(preamble_digest); |
458 Free(header_digest); | 471 Free(header_digest); |
459 return error_code; | 472 return error_code; |
460 } | 473 } |
461 | 474 |
462 const char* VerifyKernelErrorString(int error) { | 475 const char* VerifyKernelErrorString(int error) { |
463 return kVerifyKernelErrors[error]; | 476 return kVerifyKernelErrors[error]; |
464 } | 477 } |
465 | 478 |
466 int AddKernelKeySignature(KernelImage* image, const char* firmware_key_file) { | 479 int AddKernelKeySignature(KernelImage* image, const char* firmware_key_file) { |
467 uint8_t* header_blob = NULL; | 480 uint8_t* header_blob = NULL; |
(...skipping 13 matching lines...) Expand all Loading... |
481 } | 494 } |
482 image->kernel_key_signature = Malloc(signature_len); | 495 image->kernel_key_signature = Malloc(signature_len); |
483 Memcpy(image->kernel_key_signature, signature, signature_len); | 496 Memcpy(image->kernel_key_signature, signature, signature_len); |
484 Free(signature); | 497 Free(signature); |
485 Free(header_blob); | 498 Free(header_blob); |
486 return 1; | 499 return 1; |
487 } | 500 } |
488 | 501 |
489 int AddKernelSignature(KernelImage* image, | 502 int AddKernelSignature(KernelImage* image, |
490 const char* kernel_signing_key_file) { | 503 const char* kernel_signing_key_file) { |
491 uint8_t* config_blob = NULL; | 504 uint8_t* preamble_blob = NULL; |
492 uint8_t* config_signature = NULL; | 505 uint8_t* preamble_signature = NULL; |
493 uint8_t* kernel_signature = NULL; | 506 uint8_t* kernel_signature = NULL; |
494 uint8_t* kernel_buf; | 507 uint8_t* kernel_buf; |
495 int signature_len = siglen_map[image->kernel_sign_algorithm]; | 508 int signature_len = siglen_map[image->kernel_sign_algorithm]; |
496 | 509 |
497 config_blob = GetKernelConfigBlob(image); | 510 preamble_blob = GetKernelPreambleBlob(image); |
498 if (!(config_signature = SignatureBuf(config_blob, | 511 if (!(preamble_signature = SignatureBuf(preamble_blob, |
499 GetKernelConfigLen(image), | 512 GetKernelPreambleLen(), |
500 kernel_signing_key_file, | 513 kernel_signing_key_file, |
501 image->kernel_sign_algorithm))) { | 514 image->kernel_sign_algorithm))) { |
502 debug("Could not compute signature on the kernel config.\n"); | 515 debug("Could not compute signature on the kernel preamble.\n"); |
503 Free(config_blob); | 516 Free(preamble_blob); |
504 return 0; | 517 return 0; |
505 } | 518 } |
506 | 519 |
507 image->config_signature = (uint8_t*) Malloc(signature_len); | 520 image->preamble_signature = (uint8_t*) Malloc(signature_len); |
508 Memcpy(image->config_signature, config_signature, signature_len); | 521 Memcpy(image->preamble_signature, preamble_signature, signature_len); |
509 Free(config_signature); | 522 Free(preamble_signature); |
510 /* Kernel signature muse be calculated on the kernel version, options and | 523 /* Kernel signature muse be calculated on the kernel version, options and |
511 * kernel data to avoid splicing attacks. */ | 524 * kernel data to avoid splicing attacks. */ |
512 kernel_buf = (uint8_t*) Malloc(GetKernelConfigLen(image) + | 525 kernel_buf = (uint8_t*) Malloc(GetKernelPreambleLen() + |
513 image->kernel_len); | 526 image->kernel_len); |
514 Memcpy(kernel_buf, config_blob, GetKernelConfigLen(image)); | 527 Memcpy(kernel_buf, preamble_blob, GetKernelPreambleLen()); |
515 Memcpy(kernel_buf + GetKernelConfigLen(image), image->kernel_data, | 528 Memcpy(kernel_buf + GetKernelPreambleLen(), image->kernel_data, |
516 image->kernel_len); | 529 image->kernel_len); |
517 if (!(kernel_signature = SignatureBuf(kernel_buf, | 530 if (!(kernel_signature = SignatureBuf(kernel_buf, |
518 GetKernelConfigLen(image) + | 531 GetKernelPreambleLen() + |
519 image->kernel_len, | 532 image->kernel_len, |
520 kernel_signing_key_file, | 533 kernel_signing_key_file, |
521 image->kernel_sign_algorithm))) { | 534 image->kernel_sign_algorithm))) { |
522 Free(config_blob); | 535 Free(preamble_blob); |
523 Free(kernel_buf); | 536 Free(kernel_buf); |
524 debug("Could not compute signature on the kernel.\n"); | 537 debug("Could not compute signature on the kernel.\n"); |
525 return 0; | 538 return 0; |
526 } | 539 } |
527 image->kernel_signature = (uint8_t*) Malloc(signature_len); | 540 image->kernel_signature = (uint8_t*) Malloc(signature_len); |
528 Memcpy(image->kernel_signature, kernel_signature, signature_len); | 541 Memcpy(image->kernel_signature, kernel_signature, signature_len); |
529 Free(kernel_signature); | 542 Free(kernel_signature); |
530 Free(kernel_buf); | 543 Free(kernel_buf); |
531 Free(config_blob); | 544 Free(preamble_blob); |
532 return 1; | 545 return 1; |
533 } | 546 } |
534 | 547 |
535 void PrintKernelEntry(kernel_entry* entry) { | 548 void PrintKernelEntry(kernel_entry* entry) { |
536 debug("Boot Priority = %d\n", entry->boot_priority); | 549 debug("Boot Priority = %d\n", entry->boot_priority); |
537 debug("Boot Tries Remaining = %d\n", entry->boot_tries_remaining); | 550 debug("Boot Tries Remaining = %d\n", entry->boot_tries_remaining); |
538 debug("Boot Success Flag = %d\n", entry->boot_success_flag); | 551 debug("Boot Success Flag = %d\n", entry->boot_success_flag); |
539 } | 552 } |
OLD | NEW |