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

Side by Side Diff: src/platform/vboot_reference/tests/firmware_verify_benchmark.c

Issue 1079009: Vboot Reference: Add kernel image verification benchmark. (Closed)
Patch Set: Review fixes. Created 10 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
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 * Timing benchmark for verifying a firmware image. 5 * Timing benchmark for verifying a firmware image.
6 */ 6 */
7 7
8 #include <stdio.h> 8 #include <stdio.h>
9 #include <stdlib.h> 9 #include <stdlib.h>
10 10
11 #include "file_keys.h" 11 #include "file_keys.h"
12 #include "firmware_image.h" 12 #include "firmware_image.h"
13 #include "padding.h" 13 #include "padding.h"
14 #include "rsa_utility.h" 14 #include "rsa_utility.h"
15 #include "timer_utils.h" 15 #include "timer_utils.h"
16 #include "utility.h" 16 #include "utility.h"
17 17
18 #define FILE_NAME_SIZE 128 18 #define FILE_NAME_SIZE 128
19 #define NUM_OPERATIONS 100 /* Number of verify operations to time. */ 19 #define NUM_OPERATIONS 100 /* Number of verify operations to time. */
20
20 #define FIRMWARE_SIZE_SMALL 512000 21 #define FIRMWARE_SIZE_SMALL 512000
21 #define FIRMWARE_SIZE_MEDIUM 1024000 22 #define FIRMWARE_SIZE_MEDIUM 1024000
22 #define FIRMWARE_SIZE_LARGE 4096000 23 #define FIRMWARE_SIZE_LARGE 4096000
24 const uint64_t g_firmware_sizes_to_test[] = {
25 FIRMWARE_SIZE_SMALL,
26 FIRMWARE_SIZE_MEDIUM,
27 FIRMWARE_SIZE_LARGE
28 };
29 const char* g_firmware_size_labels[] = {
30 "small",
31 "medium",
32 "large"
33 };
34 #define NUM_SIZES_TO_TEST (sizeof(g_firmware_sizes_to_test) / \
35 sizeof(g_firmware_sizes_to_test[0]))
23 36
24 uint8_t* GenerateTestFirmwareBlob(int algorithm, 37 uint8_t* GenerateTestFirmwareBlob(int algorithm,
25 int firmware_len, 38 int firmware_len,
26 const uint8_t* firmware_sign_key, 39 const uint8_t* firmware_sign_key,
27 const char* root_key_file, 40 const char* root_key_file,
28 const char* firmware_sign_key_file) { 41 const char* firmware_sign_key_file) {
29 FirmwareImage* image = FirmwareImageNew(); 42 FirmwareImage* image = FirmwareImageNew();
30 uint8_t* firmware_blob = NULL; 43 uint8_t* firmware_blob = NULL;
31 uint64_t firmware_blob_len = 0; 44 uint64_t firmware_blob_len = 0;
32 45
(...skipping 29 matching lines...) Expand all
62 fprintf(stderr, "Couldn't create firmware and preamble signature.\n"); 75 fprintf(stderr, "Couldn't create firmware and preamble signature.\n");
63 FirmwareImageFree(image); 76 FirmwareImageFree(image);
64 return NULL; 77 return NULL;
65 } 78 }
66 firmware_blob = GetFirmwareBlob(image, &firmware_blob_len); 79 firmware_blob = GetFirmwareBlob(image, &firmware_blob_len);
67 FirmwareImageFree(image); 80 FirmwareImageFree(image);
68 return firmware_blob; 81 return firmware_blob;
69 } 82 }
70 83
71 int SpeedTestAlgorithm(int algorithm) { 84 int SpeedTestAlgorithm(int algorithm) {
72 int i, key_size, error_code = 0; 85 int i, j, key_size, error_code = 0;
73 ClockTimerState ct; 86 ClockTimerState ct;
74 double msecs; 87 double msecs;
75 uint64_t len; 88 uint64_t len;
76 uint8_t* firmware_sign_key = NULL; 89 uint8_t* firmware_sign_key = NULL;
77 uint8_t* root_key_blob = NULL; 90 uint8_t* root_key_blob = NULL;
78 char firmware_sign_key_file[FILE_NAME_SIZE]; 91 char firmware_sign_key_file[FILE_NAME_SIZE];
79 char file_name[FILE_NAME_SIZE]; 92 char file_name[FILE_NAME_SIZE];
80 char* sha_strings[] = { /* Maps algorithm->SHA algorithm. */ 93 char* sha_strings[] = { /* Maps algorithm->SHA algorithm. */
81 "sha1", "sha256", "sha512", /* RSA-1024 */ 94 "sha1", "sha256", "sha512", /* RSA-1024 */
82 "sha1", "sha256", "sha512", /* RSA-2048 */ 95 "sha1", "sha256", "sha512", /* RSA-2048 */
83 "sha1", "sha256", "sha512", /* RSA-4096 */ 96 "sha1", "sha256", "sha512", /* RSA-4096 */
84 "sha1", "sha256", "sha512", /* RSA-8192 */ 97 "sha1", "sha256", "sha512", /* RSA-8192 */
85 }; 98 };
86 /* Test for three different firmware sizes. */ 99 uint8_t* firmware_blobs[NUM_SIZES_TO_TEST];
87 uint8_t* firmware_blob_small = NULL; 100 for (i = 0; i < NUM_SIZES_TO_TEST; ++i)
88 uint8_t* firmware_blob_medium = NULL; 101 firmware_blobs[i] = NULL;
89 uint8_t* firmware_blob_large = NULL;
90 102
91 key_size = siglen_map[algorithm] * 8; /* in bits. */ 103 key_size = siglen_map[algorithm] * 8; /* in bits. */
92 snprintf(firmware_sign_key_file, FILE_NAME_SIZE, "testkeys/key_rsa%d.pem", 104 snprintf(firmware_sign_key_file, FILE_NAME_SIZE, "testkeys/key_rsa%d.pem",
93 key_size); 105 key_size);
94 106
95 snprintf(file_name, FILE_NAME_SIZE, "testkeys/key_rsa%d.keyb", key_size); 107 snprintf(file_name, FILE_NAME_SIZE, "testkeys/key_rsa%d.keyb", key_size);
96 firmware_sign_key = BufferFromFile(file_name, &len); 108 firmware_sign_key = BufferFromFile(file_name, &len);
97 if (!firmware_sign_key) { 109 if (!firmware_sign_key) {
98 fprintf(stderr, "Couldn't read pre-processed firmware signing key.\n"); 110 fprintf(stderr, "Couldn't read pre-processed firmware signing key.\n");
99 error_code = 1; 111 error_code = 1;
100 goto cleanup; 112 goto cleanup;
101 } 113 }
102 114
103 /* Generate test images. */ 115 /* Generate test images. */
104 firmware_blob_small = GenerateTestFirmwareBlob(algorithm, 116 for (i = 0; i < NUM_SIZES_TO_TEST; ++i) {
105 FIRMWARE_SIZE_SMALL, 117 firmware_blobs[i] = GenerateTestFirmwareBlob(algorithm,
118 g_firmware_sizes_to_test[i],
106 firmware_sign_key, 119 firmware_sign_key,
107 "testkeys/key_rsa8192.pem", 120 "testkeys/key_rsa8192.pem",
108 firmware_sign_key_file); 121 firmware_sign_key_file);
109 firmware_blob_medium = GenerateTestFirmwareBlob(algorithm, 122 if (!firmware_blobs[i]) {
110 FIRMWARE_SIZE_MEDIUM, 123 fprintf(stderr, "Couldn't generate test firmware images.\n");
111 firmware_sign_key, 124 error_code = 1;
112 "testkeys/key_rsa8192.pem", 125 goto cleanup;
113 firmware_sign_key_file); 126 }
114 firmware_blob_large = GenerateTestFirmwareBlob(algorithm,
115 FIRMWARE_SIZE_LARGE,
116 firmware_sign_key,
117 "testkeys/key_rsa8192.pem",
118 firmware_sign_key_file);
119 if (!firmware_blob_small || !firmware_blob_medium || !firmware_blob_large) {
120 fprintf(stderr, "Couldn't generate test firmware images.\n");
121 error_code = 1;
122 goto cleanup;
123 } 127 }
124 128
129 /* Get pre-processed key used for verification. */
125 root_key_blob = BufferFromFile("testkeys/key_rsa8192.keyb", &len); 130 root_key_blob = BufferFromFile("testkeys/key_rsa8192.keyb", &len);
126 if (!root_key_blob) { 131 if (!root_key_blob) {
127 fprintf(stderr, "Couldn't read pre-processed rootkey.\n"); 132 fprintf(stderr, "Couldn't read pre-processed rootkey.\n");
128 error_code = 1; 133 error_code = 1;
129 goto cleanup; 134 goto cleanup;
130 } 135 }
131 136
132 /* Small.*/ 137 /* Now run the timing tests. */
133 StartTimer(&ct); 138 for (i = 0; i < NUM_SIZES_TO_TEST; ++i) {
134 for (i = 0; i < NUM_OPERATIONS; ++i) { 139 StartTimer(&ct);
135 if (VERIFY_FIRMWARE_SUCCESS != 140 for (j = 0; j < NUM_OPERATIONS; ++j) {
136 VerifyFirmware(root_key_blob, firmware_blob_small, 0)) 141 if (VERIFY_FIRMWARE_SUCCESS !=
137 fprintf(stderr, "Warning: Firmware Verification Failed.\n"); 142 VerifyFirmware(root_key_blob, firmware_blobs[i], 0))
143 fprintf(stderr, "Warning: Firmware Verification Failed.\n");
144 }
145 StopTimer(&ct);
146 msecs = (float) GetDurationMsecs(&ct) / NUM_OPERATIONS;
147 fprintf(stderr,
148 "# Firmware (%s, Algo = %s):"
149 "\t%.02f ms/verification\n",
150 g_firmware_size_labels[i],
151 algo_strings[algorithm],
152 msecs);
153 fprintf(stdout, "ms_firmware_%s_rsa%d_%s:%.02f\n",
154 g_firmware_size_labels[i],
155 key_size,
156 sha_strings[algorithm],
157 msecs);
138 } 158 }
139 StopTimer(&ct);
140 msecs = (float) GetDurationMsecs(&ct) / NUM_OPERATIONS;
141 fprintf(stderr,
142 "# Firmware (Small, Algo = %s):"
143 "\t%.02f ms/verification\n",
144 algo_strings[algorithm], msecs);
145 fprintf(stdout, "ms_firmware_sm_rsa%d_%s:%.02f\n",
146 key_size,
147 sha_strings[algorithm],
148 msecs);
149
150 /* Medium. */
151 StartTimer(&ct);
152 for (i = 0; i < NUM_OPERATIONS; ++i) {
153 if (VERIFY_FIRMWARE_SUCCESS !=
154 VerifyFirmware(root_key_blob, firmware_blob_medium, 0))
155 fprintf(stderr, "Warning: Firmware Verification Failed.\n");
156 }
157 StopTimer(&ct);
158 msecs = (float) GetDurationMsecs(&ct) / NUM_OPERATIONS;
159 fprintf(stderr,
160 "# Firmware (Medium, Algo = %s):"
161 "\t%.02f ms/verification\n",
162 algo_strings[algorithm], msecs);
163 fprintf(stdout, "ms_firmware_med_rsa%d_%s:%.02f\n",
164 key_size,
165 sha_strings[algorithm],
166 msecs);
167
168
169 /* Large */
170 StartTimer(&ct);
171 for (i = 0; i < NUM_OPERATIONS; ++i) {
172 if (VERIFY_FIRMWARE_SUCCESS !=
173 VerifyFirmware(root_key_blob, firmware_blob_large, 0))
174 fprintf(stderr, "Warning: Firmware Verification Failed.\n");
175 }
176 StopTimer(&ct);
177 msecs = (float) GetDurationMsecs(&ct) / NUM_OPERATIONS;
178 fprintf(stderr,
179 "# Firmware (Large, Algorithm = %s):"
180 "\t%.02f ms/verification\n",
181 algo_strings[algorithm], msecs);
182 fprintf(stdout, "ms_firmware_large_rsa%d_%s:%.02f\n",
183 key_size,
184 sha_strings[algorithm],
185 msecs);
186 159
187 cleanup: 160 cleanup:
161 for (i = 0; i < NUM_SIZES_TO_TEST; i++)
162 Free(firmware_blobs[i]);
188 Free(root_key_blob); 163 Free(root_key_blob);
189 Free(firmware_blob_large);
190 Free(firmware_blob_medium);
191 Free(firmware_blob_small);
192 return error_code; 164 return error_code;
193 } 165 }
194 166
195 167
196 int main(int argc, char* argv[]) { 168 int main(int argc, char* argv[]) {
197 int i, error_code = 0; 169 int i, error_code = 0;
198 for (i = 0; i < kNumAlgorithms; ++i) { 170 for (i = 0; i < kNumAlgorithms; ++i) {
199 if (0 != (error_code = SpeedTestAlgorithm(i))) 171 if (0 != (error_code = SpeedTestAlgorithm(i)))
200 return error_code; 172 return error_code;
201 } 173 }
202 return 0; 174 return 0;
203 } 175 }
OLDNEW
« no previous file with comments | « src/platform/vboot_reference/tests/Makefile ('k') | src/platform/vboot_reference/tests/kernel_image_tests.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698