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

Side by Side Diff: utility/load_kernel_test.c

Issue 6626045: Pass VbSharedData between LoadFirmware() and LoadKernel() (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/vboot_reference.git@master
Patch Set: Fixes from code review. Created 9 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « utility/load_firmware_test.c ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 5
6 /* Routines for verifying a file's signature. Useful in testing the core 6 /* Routines for verifying a file's signature. Useful in testing the core
7 * RSA verification implementation. 7 * RSA verification implementation.
8 */ 8 */
9 9
10 #include <inttypes.h> /* For PRIu64 macro */ 10 #include <inttypes.h> /* For PRIu64 macro */
11 #include <stdio.h> 11 #include <stdio.h>
12 #include <stdlib.h> 12 #include <stdlib.h>
13 #include <string.h> 13 #include <string.h>
14 #include <sys/types.h> 14 #include <sys/types.h>
15 #include <unistd.h> 15 #include <unistd.h>
16 16
17 #include "load_firmware_fw.h"
17 #include "load_kernel_fw.h" 18 #include "load_kernel_fw.h"
18 #include "boot_device.h" 19 #include "boot_device.h"
20 #include "gbb_header.h"
19 #include "host_common.h" 21 #include "host_common.h"
20 #include "rollback_index.h" 22 #include "rollback_index.h"
21 #include "utility.h" 23 #include "utility.h"
24 #include "vboot_common.h"
22 #include "vboot_kernel.h" 25 #include "vboot_kernel.h"
23 26
24 #define LBA_BYTES 512 27 #define LBA_BYTES 512
25 #define KERNEL_BUFFER_SIZE 0xA00000 28 #define KERNEL_BUFFER_SIZE 0xA00000
26 29
27 /* Global variables for stub functions */ 30 /* Global variables for stub functions */
28 static LoadKernelParams lkp; 31 static LoadKernelParams lkp;
29 static VbNvContext vnc; 32 static VbNvContext vnc;
30 static FILE *image_file = NULL; 33 static FILE *image_file = NULL;
31 34
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 return 1; 73 return 1;
71 } 74 }
72 return 0; 75 return 0;
73 } 76 }
74 77
75 78
76 /* Main routine */ 79 /* Main routine */
77 int main(int argc, char* argv[]) { 80 int main(int argc, char* argv[]) {
78 81
79 const char* image_name; 82 const char* image_name;
83 uint64_t key_size;
84 uint8_t* key_blob = NULL;
85 VbSharedDataHeader* shared;
86 GoogleBinaryBlockHeader* gbb;
80 int rv, c, argsleft; 87 int rv, c, argsleft;
81 int errorcnt = 0; 88 int errorcnt = 0;
82 char *e = 0; 89 char *e = 0;
83 90
84 Memset(&lkp, 0, sizeof(LoadKernelParams)); 91 Memset(&lkp, 0, sizeof(LoadKernelParams));
85 lkp.bytes_per_lba = LBA_BYTES; 92 lkp.bytes_per_lba = LBA_BYTES;
86 lkp.boot_flags = BOOT_FLAG_RECOVERY; 93 lkp.boot_flags = BOOT_FLAG_RECOVERY;
87 Memset(&vnc, 0, sizeof(VbNvContext)); 94 Memset(&vnc, 0, sizeof(VbNvContext));
88 lkp.nv_context = &vnc; 95 lkp.nv_context = &vnc;
89 96
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 BOOT_FLAG_DEVELOPER); 136 BOOT_FLAG_DEVELOPER);
130 fprintf(stderr, " %" PRIu64 " = recovery mode on\n", 137 fprintf(stderr, " %" PRIu64 " = recovery mode on\n",
131 BOOT_FLAG_RECOVERY); 138 BOOT_FLAG_RECOVERY);
132 return 1; 139 return 1;
133 } 140 }
134 141
135 image_name = argv[optind]; 142 image_name = argv[optind];
136 143
137 /* Read header signing key blob */ 144 /* Read header signing key blob */
138 if (argsleft > 1) { 145 if (argsleft > 1) {
139 uint64_t key_size; 146 key_blob = ReadFile(argv[optind+1], &key_size);
140 lkp.header_sign_key_blob = ReadFile(argv[optind+1], &key_size); 147 if (!key_blob) {
141 if (!lkp.header_sign_key_blob) {
142 fprintf(stderr, "Unable to read key file %s\n", argv[optind+1]); 148 fprintf(stderr, "Unable to read key file %s\n", argv[optind+1]);
143 return 1; 149 return 1;
144 } 150 }
151 printf("Read %" PRIu64 " bytes of key from %s\n", key_size, argv[optind+1]);
145 } 152 }
146 /* Need to skip the address check, since we're putting it somewhere on the 153
154 /* Initialize the GBB */
155 lkp.gbb_size = sizeof(GoogleBinaryBlockHeader) + key_size;
156 lkp.gbb_data = (void*)Malloc(lkp.gbb_size);
157 gbb = (GoogleBinaryBlockHeader*)lkp.gbb_data;
158 Memset(gbb, 0, lkp.gbb_size);
159 Memcpy(gbb->signature, GBB_SIGNATURE, GBB_SIGNATURE_SIZE);
160 gbb->major_version = GBB_MAJOR_VER;
161 gbb->minor_version = GBB_MINOR_VER;
162 gbb->header_size = sizeof(GoogleBinaryBlockHeader);
163 /* Fill in the given key, if any, for both root and recovery */
164 if (key_blob) {
165 gbb->rootkey_offset = gbb->header_size;
166 gbb->rootkey_size = key_size;
167 Memcpy((uint8_t*)gbb + gbb->rootkey_offset, key_blob, key_size);
168
169 gbb->recovery_key_offset = gbb->rootkey_offset;
170 gbb->recovery_key_size = key_size;
171 }
172
173 /* Initialize the shared data area */
174 lkp.shared_data_blob = Malloc(LOAD_FIRMWARE_SHARED_DATA_REC_SIZE);
175 lkp.shared_data_size = LOAD_FIRMWARE_SHARED_DATA_REC_SIZE;
176 shared = (VbSharedDataHeader*)lkp.shared_data_blob;
177 if (0 != VbSharedDataInit(shared, lkp.shared_data_size)) {
178 fprintf(stderr, "Unable to init shared data\n");
179 return 1;
180 }
181 /* Copy in the key blob, if any */
182 if (key_blob) {
183 if (0 != VbSharedDataSetKernelKey(shared, (VbPublicKey*)key_blob)) {
184 fprintf(stderr, "Unable to set key in shared data\n");
185 return 1;
186 }
187 }
188
189 /* Free the key blob, now that we're done with it */
190 Free(key_blob);
191
192 /* Needs to skip the address check, since we're putting it somewhere on the
147 * heap instead of its actual target address in the firmware. */ 193 * heap instead of its actual target address in the firmware. */
148 lkp.boot_flags |= BOOT_FLAG_SKIP_ADDR_CHECK; 194 lkp.boot_flags |= BOOT_FLAG_SKIP_ADDR_CHECK;
149 195
150 /* If the boot flags are for developer mode, non-recovery, add the dev-type 196 /* If the boot flags are for developer mode, non-recovery, add the dev-type
151 * firmware bit. LoadKernel() masks off the developer bit if the dev 197 * firmware bit. LoadKernel() masks off the developer bit if the dev
152 * firmware bit is absent, to keep normal firmware from verifying dev 198 * firmware bit is absent, to keep normal firmware from verifying dev
153 * kernels. */ 199 * kernels. */
154 if ((lkp.boot_flags & BOOT_FLAG_DEVELOPER) 200 if ((lkp.boot_flags & BOOT_FLAG_DEVELOPER)
155 && !(lkp.boot_flags & BOOT_FLAG_RECOVERY)) { 201 && !(lkp.boot_flags & BOOT_FLAG_RECOVERY)) {
156 lkp.boot_flags |= BOOT_FLAG_DEV_FIRMWARE; 202 lkp.boot_flags |= BOOT_FLAG_DEV_FIRMWARE;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 lkp.partition_guid[12], 250 lkp.partition_guid[12],
205 lkp.partition_guid[13], 251 lkp.partition_guid[13],
206 lkp.partition_guid[14], 252 lkp.partition_guid[14],
207 lkp.partition_guid[15]); 253 lkp.partition_guid[15]);
208 } 254 }
209 255
210 fclose(image_file); 256 fclose(image_file);
211 Free(lkp.kernel_buffer); 257 Free(lkp.kernel_buffer);
212 return rv != LOAD_KERNEL_SUCCESS; 258 return rv != LOAD_KERNEL_SUCCESS;
213 } 259 }
OLDNEW
« no previous file with comments | « utility/load_firmware_test.c ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698