Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(93)

Side by Side Diff: src/platform/vboot_reference/vkernel/kernel_image.c

Issue 1732022: VBoot Reference: Make kernel_config a 4K byte block, and move it after the verified boot block. (Closed) Base URL: ssh://git@chromiumos-git/chromeos
Patch Set: Created 10 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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->options.cmd_line, 0, sizeof(image->options.cmd_line)); 32 Memset(image->kernel_config,
33 0,
34 sizeof(image->kernel_config));
33 image->config_signature = NULL; 35 image->config_signature = NULL;
34 image->kernel_signature = NULL; 36 image->kernel_signature = NULL;
35 image->kernel_data = NULL; 37 image->kernel_data = NULL;
36 } 38 }
37 return image; 39 return image;
38 } 40 }
39 41
40 void KernelImageFree(KernelImage* image) { 42 void KernelImageFree(KernelImage* image) {
41 if (image) { 43 if (image) {
42 Free(image->kernel_sign_key); 44 Free(image->kernel_sign_key);
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 return NULL; 131 return NULL;
130 } 132 }
131 133
132 /* Read key signature. */ 134 /* Read key signature. */
133 image->kernel_key_signature = (uint8_t*) Malloc(kernel_key_signature_len); 135 image->kernel_key_signature = (uint8_t*) Malloc(kernel_key_signature_len);
134 StatefulMemcpy(&st, image->kernel_key_signature, 136 StatefulMemcpy(&st, image->kernel_key_signature,
135 kernel_key_signature_len); 137 kernel_key_signature_len);
136 138
137 /* Read the kernel config. */ 139 /* Read the kernel config. */
138 StatefulMemcpy(&st, &image->kernel_version, FIELD_LEN(kernel_version)); 140 StatefulMemcpy(&st, &image->kernel_version, FIELD_LEN(kernel_version));
139 StatefulMemcpy(&st, &image->options.version, FIELD_LEN(options.version)); 141 StatefulMemcpy(&st, &image->kernel_len, FIELD_LEN(kernel_len));
140 StatefulMemcpy(&st, &image->options.cmd_line, FIELD_LEN(options.cmd_line));
141 StatefulMemcpy(&st, &image->options.kernel_len,
142 FIELD_LEN(options.kernel_len));
143 StatefulMemcpy(&st, &image->options.kernel_load_addr,
144 FIELD_LEN(options.kernel_load_addr));
145 StatefulMemcpy(&st, &image->options.kernel_entry_addr,
146 FIELD_LEN(options.kernel_entry_addr));
147 142
148 /* Read kernel config signature. */ 143 /* Read config and kernel signatures. */
149 image->config_signature = (uint8_t*) Malloc(kernel_signature_len); 144 image->config_signature = (uint8_t*) Malloc(kernel_signature_len);
150 StatefulMemcpy(&st, image->config_signature, kernel_signature_len); 145 StatefulMemcpy(&st, image->config_signature, kernel_signature_len);
151
152 image->kernel_signature = (uint8_t*) Malloc(kernel_signature_len); 146 image->kernel_signature = (uint8_t*) Malloc(kernel_signature_len);
153 StatefulMemcpy(&st, image->kernel_signature, kernel_signature_len); 147 StatefulMemcpy(&st, image->kernel_signature, kernel_signature_len);
154 148
155 image->kernel_data = (uint8_t*) Malloc(image->options.kernel_len); 149 /* Read kernel config command line and kernel image data. */
156 StatefulMemcpy(&st, image->kernel_data, image->options.kernel_len); 150 StatefulMemcpy(&st, image->kernel_config, FIELD_LEN(kernel_config));
151 image->kernel_data = (uint8_t*) Malloc(image->kernel_len);
152 StatefulMemcpy(&st, image->kernel_data, image->kernel_len);
157 153
158 if(st.overrun || st.remaining_len != 0) { /* Overrun or underrun. */ 154 if(st.overrun || st.remaining_len != 0) { /* Overrun or underrun. */
159 Free(kernel_buf); 155 Free(kernel_buf);
160 return NULL; 156 return NULL;
161 } 157 }
162 Free(kernel_buf); 158 Free(kernel_buf);
163 return image; 159 return image;
164 } 160 }
165 161
166 int GetKernelHeaderLen(const KernelImage* image) { 162 int GetKernelHeaderLen(const KernelImage* image) {
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 RSAProcessedKeySize(image->kernel_sign_algorithm)); 211 RSAProcessedKeySize(image->kernel_sign_algorithm));
216 StatefulMemcpy_r(&st, &image->header_checksum, FIELD_LEN(header_checksum)); 212 StatefulMemcpy_r(&st, &image->header_checksum, FIELD_LEN(header_checksum));
217 213
218 if (st.overrun || st.remaining_len != 0) { /* Underrun or Overrun. */ 214 if (st.overrun || st.remaining_len != 0) { /* Underrun or Overrun. */
219 Free(header_blob); 215 Free(header_blob);
220 return NULL; 216 return NULL;
221 } 217 }
222 return header_blob; 218 return header_blob;
223 } 219 }
224 220
225 int GetKernelConfigLen() { 221 int GetKernelConfigLen(const KernelImage* image) {
226 return (FIELD_LEN(kernel_version) + 222 return (FIELD_LEN(kernel_version) +
227 FIELD_LEN(options.version) + FIELD_LEN(options.cmd_line) + 223 FIELD_LEN(kernel_len) +
228 FIELD_LEN(options.kernel_len) + FIELD_LEN(options.kernel_load_addr) + 224 FIELD_LEN(kernel_config));
229 FIELD_LEN(options.kernel_entry_addr));
230 } 225 }
231 226
232 uint8_t* GetKernelConfigBlob(const KernelImage* image) { 227 uint8_t* GetKernelConfigBlob(const KernelImage* image) {
233 uint8_t* config_blob = NULL; 228 uint8_t* config_blob = NULL;
234 MemcpyState st; 229 MemcpyState st;
235 230
236 config_blob = (uint8_t*) Malloc(GetKernelConfigLen()); 231 config_blob = (uint8_t*) Malloc(GetKernelConfigLen(image));
237 st.remaining_len = GetKernelConfigLen(); 232 st.remaining_len = GetKernelConfigLen(image);
238 st.remaining_buf = config_blob; 233 st.remaining_buf = config_blob;
239 st.overrun = 0; 234 st.overrun = 0;
240 235
241 StatefulMemcpy_r(&st, &image->kernel_version, FIELD_LEN(kernel_version)); 236 StatefulMemcpy_r(&st, &image->kernel_version, FIELD_LEN(kernel_version));
242 StatefulMemcpy_r(&st, image->options.version, FIELD_LEN(options.version)); 237 StatefulMemcpy_r(&st, &image->kernel_len, FIELD_LEN(kernel_len));
243 StatefulMemcpy_r(&st, image->options.cmd_line, FIELD_LEN(options.cmd_line)); 238 StatefulMemcpy_r(&st, image->kernel_config, FIELD_LEN(kernel_config));
244 StatefulMemcpy_r(&st, &image->options.kernel_len, 239
245 FIELD_LEN(options.kernel_len));
246 StatefulMemcpy_r(&st, &image->options.kernel_load_addr,
247 FIELD_LEN(options.kernel_load_addr));
248 StatefulMemcpy_r(&st, &image->options.kernel_entry_addr,
249 FIELD_LEN(options.kernel_entry_addr));
250 if (st.overrun || st.remaining_len != 0) { /* Overrun or Underrun. */ 240 if (st.overrun || st.remaining_len != 0) { /* Overrun or Underrun. */
251 Free(config_blob); 241 Free(config_blob);
252 return NULL; 242 return NULL;
253 } 243 }
254 return config_blob; 244 return config_blob;
255 } 245 }
256 246
257 uint8_t* GetKernelBlob(const KernelImage* image, uint64_t* blob_len) { 247 uint8_t* GetKernelBlob(const KernelImage* image, uint64_t* blob_len) {
258 int kernel_key_signature_len; 248 int kernel_key_signature_len;
259 int kernel_signature_len; 249 int kernel_signature_len;
260 uint8_t* kernel_blob = NULL; 250 uint8_t* kernel_blob = NULL;
261 uint8_t* header_blob = NULL; 251 uint8_t* header_blob = NULL;
262 uint8_t* config_blob = NULL;
263 MemcpyState st; 252 MemcpyState st;
264 253
265 if (!image) 254 if (!image)
266 return NULL; 255 return NULL;
267 kernel_key_signature_len = siglen_map[image->firmware_sign_algorithm]; 256 kernel_key_signature_len = siglen_map[image->firmware_sign_algorithm];
268 kernel_signature_len = siglen_map[image->kernel_sign_algorithm]; 257 kernel_signature_len = siglen_map[image->kernel_sign_algorithm];
269 *blob_len = (FIELD_LEN(magic) + 258 *blob_len = (FIELD_LEN(magic) +
270 GetKernelHeaderLen(image) + 259 GetKernelHeaderLen(image) +
271 kernel_key_signature_len + 260 kernel_key_signature_len +
272 GetKernelConfigLen() + 261 GetKernelConfigLen(image) +
273 2 * kernel_signature_len + 262 2 * kernel_signature_len +
274 image->options.kernel_len); 263 image->kernel_len);
275 kernel_blob = (uint8_t*) Malloc(*blob_len); 264 kernel_blob = (uint8_t*) Malloc(*blob_len);
276 st.remaining_len = *blob_len; 265 st.remaining_len = *blob_len;
277 st.remaining_buf = kernel_blob; 266 st.remaining_buf = kernel_blob;
278 st.overrun = 0; 267 st.overrun = 0;
279 268
280 header_blob = GetKernelHeaderBlob(image); 269 header_blob = GetKernelHeaderBlob(image);
281 config_blob = GetKernelConfigBlob(image);
282 270
283 StatefulMemcpy_r(&st, image->magic, FIELD_LEN(magic)); 271 StatefulMemcpy_r(&st, image->magic, FIELD_LEN(magic));
284 StatefulMemcpy_r(&st, header_blob, GetKernelHeaderLen(image)); 272 StatefulMemcpy_r(&st, header_blob, GetKernelHeaderLen(image));
285 StatefulMemcpy_r(&st, image->kernel_key_signature, kernel_key_signature_len); 273 StatefulMemcpy_r(&st, image->kernel_key_signature, kernel_key_signature_len);
286 StatefulMemcpy_r(&st, config_blob, GetKernelConfigLen()); 274 /* Copy over kernel config blob (including signatures.) */
275 StatefulMemcpy_r(&st, &image->kernel_version, FIELD_LEN(kernel_version));
276 StatefulMemcpy_r(&st, &image->kernel_len, FIELD_LEN(kernel_len));
287 StatefulMemcpy_r(&st, image->config_signature, kernel_signature_len); 277 StatefulMemcpy_r(&st, image->config_signature, kernel_signature_len);
288 StatefulMemcpy_r(&st, image->kernel_signature, kernel_signature_len); 278 StatefulMemcpy_r(&st, image->kernel_signature, kernel_signature_len);
289 StatefulMemcpy_r(&st, image->kernel_data, image->options.kernel_len); 279 StatefulMemcpy_r(&st, image->kernel_config, FIELD_LEN(kernel_config));
280 StatefulMemcpy_r(&st, image->kernel_data, image->kernel_len);
290 281
291 Free(config_blob);
292 Free(header_blob); 282 Free(header_blob);
293 283
294 if (st.overrun || st.remaining_len != 0) { /* Underrun or Overrun. */ 284 if (st.overrun || st.remaining_len != 0) { /* Underrun or Overrun. */
295 Free(kernel_blob); 285 Free(kernel_blob);
296 return NULL; 286 return NULL;
297 } 287 }
298 return kernel_blob; 288 return kernel_blob;
299 } 289 }
300 290
301 int WriteKernelImage(const char* input_file, 291 int WriteKernelImage(const char* input_file,
(...skipping 16 matching lines...) Expand all
318 debug("Couldn't create kernel blob from KernelImage.\n"); 308 debug("Couldn't create kernel blob from KernelImage.\n");
319 return 0; 309 return 0;
320 } 310 }
321 if (!is_only_vblock) { 311 if (!is_only_vblock) {
322 if (blob_len != write(fd, kernel_blob, blob_len)) { 312 if (blob_len != write(fd, kernel_blob, blob_len)) {
323 debug("Couldn't write Kernel Image to file: %s\n", 313 debug("Couldn't write Kernel Image to file: %s\n",
324 input_file); 314 input_file);
325 success = 0; 315 success = 0;
326 } 316 }
327 } else { 317 } else {
328 /* Exclude the kernel_data. */ 318 /* Exclude kernel_config and kernel_data. */
329 int vblock_len = blob_len - image->options.kernel_len; 319 int vblock_len = blob_len - (image->kernel_len +
320 sizeof(image->kernel_config));
330 if (vblock_len != write(fd, kernel_blob, vblock_len)) { 321 if (vblock_len != write(fd, kernel_blob, vblock_len)) {
331 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",
332 input_file); 323 input_file);
333 success = 0; 324 success = 0;
334 } 325 }
335 } 326 }
336 Free(kernel_blob); 327 Free(kernel_blob);
337 close(fd); 328 close(fd);
338 return success; 329 return success;
339 } 330 }
340 331
341 void PrintKernelImage(const KernelImage* image) { 332 void PrintKernelImage(const KernelImage* image) {
342 if (!image) 333 if (!image)
343 return; 334 return;
344 335
345 /* Print header. */ 336 /* Print header. */
346 printf("Header Version = %d\n" 337 printf("Header Version = %d\n"
347 "Header Length = %d\n" 338 "Header Length = %d\n"
348 "Kernel Key Signature Algorithm = %s\n" 339 "Kernel Key Signature Algorithm = %s\n"
349 "Kernel Signature Algorithm = %s\n" 340 "Kernel Signature Algorithm = %s\n"
350 "Kernel Key Version = %d\n\n", 341 "Kernel Key Version = %d\n\n",
351 image->header_version, 342 image->header_version,
352 image->header_len, 343 image->header_len,
353 algo_strings[image->firmware_sign_algorithm], 344 algo_strings[image->firmware_sign_algorithm],
354 algo_strings[image->kernel_sign_algorithm], 345 algo_strings[image->kernel_sign_algorithm],
355 image->kernel_key_version); 346 image->kernel_key_version);
356 /* TODO(gauravsh): Output hash and key signature here? */ 347 /* TODO(gauravsh): Output hash and key signature here? */
357 /* Print preamble. */ 348 /* Print preamble. */
358 printf("Kernel Version = %d\n" 349 printf("Kernel Version = %d\n"
359 "Kernel Config Version = %d.%d\n"
360 "Kernel Config command line = \"%s\"\n" 350 "Kernel Config command line = \"%s\"\n"
361 "kernel Length = %" PRId64 "\n" 351 "kernel Length = %" PRId64 "\n",
362 "Kernel Load Address = %" PRId64 "\n"
363 "Kernel Entry Address = %" PRId64 "\n\n",
364 image->kernel_version, 352 image->kernel_version,
365 image->options.version[0], image->options.version[1], 353 image->kernel_config,
366 image->options.cmd_line, 354 image->kernel_len);
367 image->options.kernel_len,
368 image->options.kernel_load_addr,
369 image->options.kernel_entry_addr);
370 /* TODO(gauravsh): Output kernel signature here? */ 355 /* TODO(gauravsh): Output kernel signature here? */
371 } 356 }
372 357
373 358
374 int VerifyKernelImage(const RSAPublicKey* firmware_key, 359 int VerifyKernelImage(const RSAPublicKey* firmware_key,
375 const KernelImage* image, 360 const KernelImage* image,
376 const int dev_mode) { 361 const int dev_mode) {
377 RSAPublicKey* kernel_sign_key = NULL; 362 RSAPublicKey* kernel_sign_key = NULL;
378 uint8_t* header_digest = NULL; 363 uint8_t* header_digest = NULL;
379 uint8_t* config_digest = NULL; 364 uint8_t* config_digest = NULL;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
429 /* Get kernel signing key to verify the rest of the kernel. */ 414 /* Get kernel signing key to verify the rest of the kernel. */
430 kernel_sign_key_size = RSAProcessedKeySize(image->kernel_sign_algorithm); 415 kernel_sign_key_size = RSAProcessedKeySize(image->kernel_sign_algorithm);
431 kernel_sign_key = RSAPublicKeyFromBuf(image->kernel_sign_key, 416 kernel_sign_key = RSAPublicKeyFromBuf(image->kernel_sign_key,
432 kernel_sign_key_size); 417 kernel_sign_key_size);
433 kernel_signature_size = siglen_map[image->kernel_sign_algorithm]; 418 kernel_signature_size = siglen_map[image->kernel_sign_algorithm];
434 419
435 /* Verify kernel config signature. */ 420 /* Verify kernel config signature. */
436 DigestInit(&ctx, image->kernel_sign_algorithm); 421 DigestInit(&ctx, image->kernel_sign_algorithm);
437 DigestUpdate(&ctx, (uint8_t*) &image->kernel_version, 422 DigestUpdate(&ctx, (uint8_t*) &image->kernel_version,
438 FIELD_LEN(kernel_version)); 423 FIELD_LEN(kernel_version));
439 DigestUpdate(&ctx, (uint8_t*) image->options.version, 424 DigestUpdate(&ctx, (uint8_t*) &image->kernel_len,
440 FIELD_LEN(options.version)); 425 FIELD_LEN(kernel_len));
441 DigestUpdate(&ctx, (uint8_t*) image->options.cmd_line, 426 DigestUpdate(&ctx, (uint8_t*) image->kernel_config,
442 FIELD_LEN(options.cmd_line)); 427 FIELD_LEN(kernel_config));
443 DigestUpdate(&ctx, (uint8_t*) &image->options.kernel_len,
444 FIELD_LEN(options.kernel_len));
445 DigestUpdate(&ctx, (uint8_t*) &image->options.kernel_load_addr,
446 FIELD_LEN(options.kernel_load_addr));
447 DigestUpdate(&ctx, (uint8_t*) &image->options.kernel_entry_addr,
448 FIELD_LEN(options.kernel_entry_addr));
449 config_digest = DigestFinal(&ctx); 428 config_digest = DigestFinal(&ctx);
450 if (!RSAVerify(kernel_sign_key, image->config_signature, 429 if (!RSAVerify(kernel_sign_key, image->config_signature,
451 kernel_signature_size, image->kernel_sign_algorithm, 430 kernel_signature_size, image->kernel_sign_algorithm,
452 config_digest)) { 431 config_digest)) {
453 error_code = VERIFY_KERNEL_CONFIG_SIGNATURE_FAILED; 432 error_code = VERIFY_KERNEL_CONFIG_SIGNATURE_FAILED;
454 goto verify_failure; 433 goto verify_failure;
455 } 434 }
456 435
457 /* Verify kernel signature - kernel signature is computed on the contents 436 /* Verify kernel signature - kernel signature is computed on the contents
458 of kernel version + kernel options + kernel_data. */ 437 of kernel version + kernel options + kernel_data. */
459 DigestInit(&kernel_ctx, image->kernel_sign_algorithm); 438 DigestInit(&kernel_ctx, image->kernel_sign_algorithm);
460 DigestUpdate(&kernel_ctx, (uint8_t*) &image->kernel_version, 439 DigestUpdate(&kernel_ctx, (uint8_t*) &image->kernel_version,
461 FIELD_LEN(kernel_version)); 440 FIELD_LEN(kernel_version));
462 DigestUpdate(&kernel_ctx, (uint8_t*) image->options.version, 441 DigestUpdate(&kernel_ctx, (uint8_t*) &image->kernel_len,
463 FIELD_LEN(options.version)); 442 FIELD_LEN(kernel_len));
464 DigestUpdate(&kernel_ctx, (uint8_t*) image->options.cmd_line, 443 DigestUpdate(&kernel_ctx, (uint8_t*) image->kernel_config,
465 FIELD_LEN(options.cmd_line)); 444 FIELD_LEN(kernel_config));
466 DigestUpdate(&kernel_ctx, (uint8_t*) &image->options.kernel_len, 445 DigestUpdate(&kernel_ctx, image->kernel_data, image->kernel_len);
467 FIELD_LEN(options.kernel_len));
468 DigestUpdate(&kernel_ctx, (uint8_t*) &image->options.kernel_load_addr,
469 FIELD_LEN(options.kernel_load_addr));
470 DigestUpdate(&kernel_ctx, (uint8_t*) &image->options.kernel_entry_addr,
471 FIELD_LEN(options.kernel_entry_addr));
472 DigestUpdate(&kernel_ctx, image->kernel_data, image->options.kernel_len);
473 kernel_digest = DigestFinal(&kernel_ctx); 446 kernel_digest = DigestFinal(&kernel_ctx);
474 if (!RSAVerify(kernel_sign_key, image->kernel_signature, 447 if (!RSAVerify(kernel_sign_key, image->kernel_signature,
475 kernel_signature_size, image->kernel_sign_algorithm, 448 kernel_signature_size, image->kernel_sign_algorithm,
476 kernel_digest)) { 449 kernel_digest)) {
477 error_code = VERIFY_KERNEL_SIGNATURE_FAILED; 450 error_code = VERIFY_KERNEL_SIGNATURE_FAILED;
478 goto verify_failure; 451 goto verify_failure;
479 } 452 }
480 453
481 verify_failure: 454 verify_failure:
482 RSAPublicKeyFree(kernel_sign_key); 455 RSAPublicKeyFree(kernel_sign_key);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 int AddKernelSignature(KernelImage* image, 489 int AddKernelSignature(KernelImage* image,
517 const char* kernel_signing_key_file) { 490 const char* kernel_signing_key_file) {
518 uint8_t* config_blob = NULL; 491 uint8_t* config_blob = NULL;
519 uint8_t* config_signature = NULL; 492 uint8_t* config_signature = NULL;
520 uint8_t* kernel_signature = NULL; 493 uint8_t* kernel_signature = NULL;
521 uint8_t* kernel_buf; 494 uint8_t* kernel_buf;
522 int signature_len = siglen_map[image->kernel_sign_algorithm]; 495 int signature_len = siglen_map[image->kernel_sign_algorithm];
523 496
524 config_blob = GetKernelConfigBlob(image); 497 config_blob = GetKernelConfigBlob(image);
525 if (!(config_signature = SignatureBuf(config_blob, 498 if (!(config_signature = SignatureBuf(config_blob,
526 GetKernelConfigLen(), 499 GetKernelConfigLen(image),
527 kernel_signing_key_file, 500 kernel_signing_key_file,
528 image->kernel_sign_algorithm))) { 501 image->kernel_sign_algorithm))) {
529 debug("Could not compute signature on the kernel config.\n"); 502 debug("Could not compute signature on the kernel config.\n");
530 Free(config_blob); 503 Free(config_blob);
531 return 0; 504 return 0;
532 } 505 }
533 506
534 image->config_signature = (uint8_t*) Malloc(signature_len); 507 image->config_signature = (uint8_t*) Malloc(signature_len);
535 Memcpy(image->config_signature, config_signature, signature_len); 508 Memcpy(image->config_signature, config_signature, signature_len);
536 Free(config_signature); 509 Free(config_signature);
537 /* Kernel signature muse be calculated on the kernel version, options and 510 /* Kernel signature muse be calculated on the kernel version, options and
538 * kernel data to avoid splicing attacks. */ 511 * kernel data to avoid splicing attacks. */
539 kernel_buf = (uint8_t*) Malloc(GetKernelConfigLen() + 512 kernel_buf = (uint8_t*) Malloc(GetKernelConfigLen(image) +
540 image->options.kernel_len); 513 image->kernel_len);
541 Memcpy(kernel_buf, config_blob, GetKernelConfigLen()); 514 Memcpy(kernel_buf, config_blob, GetKernelConfigLen(image));
542 Memcpy(kernel_buf + GetKernelConfigLen(), image->kernel_data, 515 Memcpy(kernel_buf + GetKernelConfigLen(image), image->kernel_data,
543 image->options.kernel_len); 516 image->kernel_len);
544 if (!(kernel_signature = SignatureBuf(kernel_buf, 517 if (!(kernel_signature = SignatureBuf(kernel_buf,
545 GetKernelConfigLen() + 518 GetKernelConfigLen(image) +
546 image->options.kernel_len, 519 image->kernel_len,
547 kernel_signing_key_file, 520 kernel_signing_key_file,
548 image->kernel_sign_algorithm))) { 521 image->kernel_sign_algorithm))) {
549 Free(config_blob); 522 Free(config_blob);
550 Free(kernel_buf); 523 Free(kernel_buf);
551 debug("Could not compute signature on the kernel.\n"); 524 debug("Could not compute signature on the kernel.\n");
552 return 0; 525 return 0;
553 } 526 }
554 image->kernel_signature = (uint8_t*) Malloc(signature_len); 527 image->kernel_signature = (uint8_t*) Malloc(signature_len);
555 Memcpy(image->kernel_signature, kernel_signature, signature_len); 528 Memcpy(image->kernel_signature, kernel_signature, signature_len);
556 Free(kernel_signature); 529 Free(kernel_signature);
557 Free(kernel_buf); 530 Free(kernel_buf);
558 Free(config_blob); 531 Free(config_blob);
559 return 1; 532 return 1;
560 } 533 }
561 534
562 void PrintKernelEntry(kernel_entry* entry) { 535 void PrintKernelEntry(kernel_entry* entry) {
563 debug("Boot Priority = %d\n", entry->boot_priority); 536 debug("Boot Priority = %d\n", entry->boot_priority);
564 debug("Boot Tries Remaining = %d\n", entry->boot_tries_remaining); 537 debug("Boot Tries Remaining = %d\n", entry->boot_tries_remaining);
565 debug("Boot Success Flag = %d\n", entry->boot_success_flag); 538 debug("Boot Success Flag = %d\n", entry->boot_success_flag);
566 } 539 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698