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

Side by Side Diff: tests/vboot_common2_tests.c

Issue 2745007: Major refactoring of structures, with unit tests. (Closed) Base URL: ssh://gitrw.chromium.org/vboot_reference.git
Patch Set: Implemented LoadFirmware2() Created 10 years, 6 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
(Empty)
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
3 * found in the LICENSE file.
4 *
5 * Tests for firmware image library.
6 */
7
8 #include <stdio.h>
9 #include <stdlib.h>
10
11 #include "cryptolib.h"
12 #include "file_keys.h"
13 #include "firmware_image.h"
14 #include "host_common.h"
15 #include "test_common.h"
16 #include "utility.h"
17 #include "vboot_common.h"
18
19
20 static void VerifyPublicKeyToRSA(const VbPublicKey* orig_key) {
21
22 RSAPublicKey *rsa;
23 VbPublicKey *key = PublicKeyAlloc(orig_key->key_size, 0, 0);
24
25 PublicKeyCopy(key, orig_key);
26 key->algorithm = kNumAlgorithms;
27 TEST_EQ((size_t)PublicKeyToRSA(key), 0,
28 "PublicKeyToRSA() invalid algorithm");
29
30 PublicKeyCopy(key, orig_key);
31 key->key_size -= 1;
32 TEST_EQ((size_t)PublicKeyToRSA(key), 0,
33 "PublicKeyToRSA() invalid size");
34
35 rsa = PublicKeyToRSA(orig_key);
36 TEST_NEQ((size_t)rsa, 0, "PublicKeyToRSA() ok");
37 if (rsa) {
38 TEST_EQ(rsa->algorithm, key->algorithm, "PublicKeyToRSA() algorithm");
39 RSAPublicKeyFree(rsa);
40 }
41 }
42
43
44 static void VerifyDataTest(const VbPublicKey* public_key,
45 const VbPrivateKey* private_key) {
46
47 const uint8_t test_data[] = "This is some test data to sign.";
48 VbSignature *sig;
49 RSAPublicKey *rsa;
50
51 sig = CalculateSignature(test_data, sizeof(test_data), private_key);
52 rsa = PublicKeyToRSA(public_key);
53 TEST_NEQ(sig && rsa, 0, "VerifyData() prerequisites");
54 if (!sig || !rsa)
55 return;
56
57 TEST_EQ(VerifyData(test_data, sig, rsa), 0, "VerifyData() ok");
58
59 sig->sig_size -= 16;
60 TEST_EQ(VerifyData(test_data, sig, rsa), 1, "VerifyData() wrong sig size");
61 sig->sig_size += 16;
62
63 GetSignatureData(sig)[0] ^= 0x5A;
64 TEST_EQ(VerifyData(test_data, sig, rsa), 1, "VerifyData() wrong sig");
65
66 RSAPublicKeyFree(rsa);
67 Free(sig);
68 }
69
70
71 static void ReSignKernelPreamble(VbKernelPreambleHeader *h,
72 const VbPrivateKey *key) {
73 VbSignature *sig = CalculateSignature((const uint8_t*)h,
74 h->preamble_signature.data_size, key);
75
76 SignatureCopy(&h->preamble_signature, sig);
77 Free(sig);
78 }
79
80
81 static void VerifyKernelPreambleTest(const VbPublicKey* public_key,
82 const VbPrivateKey* private_key) {
83
84 VbKernelPreambleHeader *hdr;
85 VbKernelPreambleHeader *h;
86 RSAPublicKey* rsa;
87 uint64_t hsize;
88
89 /* Create a dummy signature */
90 VbSignature *body_sig = SignatureAlloc(56, 78);
91
92 rsa = PublicKeyToRSA(public_key);
93 hdr = CreateKernelPreamble(0x1234, 0x100000, 0x300000, 0x4000, body_sig,
94 private_key);
95 TEST_NEQ(hdr && rsa, 0, "VerifyKernelPreamble2() prerequisites");
96 if (!hdr)
97 return;
98 hsize = hdr->preamble_size;
99 h = (VbKernelPreambleHeader*)Malloc(hsize + 16384);
100
101 TEST_EQ(VerifyKernelPreamble2(hdr, hsize, rsa), 0,
102 "VerifyKernelPreamble2() ok using key");
103 TEST_NEQ(VerifyKernelPreamble2(hdr, hsize-1, rsa), 0,
104 "VerifyKernelPreamble2() size");
105
106 /* Care about major version but not minor */
107 Memcpy(h, hdr, hsize);
108 h->header_version_major++;
109 ReSignKernelPreamble(h, private_key);
110 TEST_NEQ(VerifyKernelPreamble2(h, hsize, rsa), 0,
111 "VerifyKernelPreamble2() major++");
112
113 Memcpy(h, hdr, hsize);
114 h->header_version_major--;
115 ReSignKernelPreamble(h, private_key);
116 TEST_NEQ(VerifyKernelPreamble2(h, hsize, rsa), 0,
117 "VerifyKernelPreamble2() major--");
118
119 Memcpy(h, hdr, hsize);
120 h->header_version_minor++;
121 ReSignKernelPreamble(h, private_key);
122 TEST_EQ(VerifyKernelPreamble2(h, hsize, rsa), 0,
123 "VerifyKernelPreamble2() minor++");
124
125 Memcpy(h, hdr, hsize);
126 h->header_version_minor--;
127 ReSignKernelPreamble(h, private_key);
128 TEST_EQ(VerifyKernelPreamble2(h, hsize, rsa), 0,
129 "VerifyKernelPreamble2() minor--");
130
131 /* Check signature */
132 Memcpy(h, hdr, hsize);
133 h->preamble_signature.sig_offset = hsize;
134 ReSignKernelPreamble(h, private_key);
135 TEST_NEQ(VerifyKernelPreamble2(h, hsize, rsa), 0,
136 "VerifyKernelPreamble2() sig off end");
137
138 Memcpy(h, hdr, hsize);
139 h->preamble_signature.sig_size--;
140 ReSignKernelPreamble(h, private_key);
141 TEST_NEQ(VerifyKernelPreamble2(h, hsize, rsa), 0,
142 "VerifyKernelPreamble2() sig too small");
143
144 Memcpy(h, hdr, hsize);
145 GetSignatureData(&h->body_signature)[0] ^= 0x34;
146 TEST_NEQ(VerifyKernelPreamble2(h, hsize, rsa), 0,
147 "VerifyKernelPreamble2() sig mismatch");
148
149 /* Check that we signed header and body sig */
150 Memcpy(h, hdr, hsize);
151 h->preamble_signature.data_size = 4;
152 h->body_signature.sig_offset = 0;
153 h->body_signature.sig_size = 0;
154 ReSignKernelPreamble(h, private_key);
155 TEST_NEQ(VerifyKernelPreamble2(h, hsize, rsa), 0,
156 "VerifyKernelPreamble2() didn't sign header");
157
158 Memcpy(h, hdr, hsize);
159 h->body_signature.sig_offset = hsize;
160 ReSignKernelPreamble(h, private_key);
161 TEST_NEQ(VerifyKernelPreamble2(h, hsize, rsa), 0,
162 "VerifyKernelPreamble2() body sig off end");
163
164 /* TODO: verify parser can support a bigger header. */
165
166 Free(h);
167 RSAPublicKeyFree(rsa);
168 Free(hdr);
169 }
170
171
172 int main(int argc, char* argv[]) {
173 VbPrivateKey* private_key = NULL;
174 VbPublicKey* public_key = NULL;
175 int key_algorithm;
176
177 int error_code = 0;
178
179 if(argc != 4) {
180 fprintf(stderr, "Usage: %s <key_algorithm> <key> <processed pubkey>"
181 " <signing key> <processed signing key>\n", argv[0]);
182 return -1;
183 }
184
185 /* Read verification keys and create a test image. */
186 key_algorithm = atoi(argv[1]);
187
188 private_key = PrivateKeyRead(argv[2], key_algorithm);
189 if (!private_key) {
190 fprintf(stderr, "Error reading private_key");
191 return 1;
192 }
193
194 public_key = PublicKeyRead(argv[3], key_algorithm, 1);
195 if (!public_key) {
196 fprintf(stderr, "Error reading public_key");
197 return 1;
198 }
199
200 VerifyPublicKeyToRSA(public_key);
201 VerifyDataTest(public_key, private_key);
202 VerifyKernelPreambleTest(public_key, private_key);
203
204 if (public_key)
205 Free(public_key);
206 if (private_key)
207 Free(private_key);
208
209 return error_code;
210 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698