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 * Tests for firmware image library. | 5 * Tests for firmware image library. |
6 */ | 6 */ |
7 | 7 |
8 #include <stdio.h> | 8 #include <stdio.h> |
9 #include <stdlib.h> | 9 #include <stdlib.h> |
10 | 10 |
(...skipping 27 matching lines...) Expand all Loading... |
38 "PublicKeyToRSA() algorithm"); | 38 "PublicKeyToRSA() algorithm"); |
39 RSAPublicKeyFree(rsa); | 39 RSAPublicKeyFree(rsa); |
40 } | 40 } |
41 } | 41 } |
42 | 42 |
43 | 43 |
44 static void VerifyDataTest(const VbPublicKey* public_key, | 44 static void VerifyDataTest(const VbPublicKey* public_key, |
45 const VbPrivateKey* private_key) { | 45 const VbPrivateKey* private_key) { |
46 | 46 |
47 const uint8_t test_data[] = "This is some test data to sign."; | 47 const uint8_t test_data[] = "This is some test data to sign."; |
| 48 const uint64_t test_size = sizeof(test_data); |
48 VbSignature* sig; | 49 VbSignature* sig; |
49 RSAPublicKey* rsa; | 50 RSAPublicKey* rsa; |
50 | 51 |
51 sig = CalculateSignature(test_data, sizeof(test_data), private_key); | 52 sig = CalculateSignature(test_data, test_size, private_key); |
52 rsa = PublicKeyToRSA(public_key); | 53 rsa = PublicKeyToRSA(public_key); |
53 TEST_NEQ(sig && rsa, 0, "VerifyData() prerequisites"); | 54 TEST_NEQ(sig && rsa, 0, "VerifyData() prerequisites"); |
54 if (!sig || !rsa) | 55 if (!sig || !rsa) |
55 return; | 56 return; |
56 | 57 |
57 TEST_EQ(VerifyData(test_data, sig, rsa), 0, "VerifyData() ok"); | 58 TEST_EQ(VerifyData(test_data, test_size, sig, rsa), 0, "VerifyData() ok"); |
58 | 59 |
59 sig->sig_size -= 16; | 60 sig->sig_size -= 16; |
60 TEST_EQ(VerifyData(test_data, sig, rsa), 1, "VerifyData() wrong sig size"); | 61 TEST_EQ(VerifyData(test_data, test_size, sig, rsa), 1, |
| 62 "VerifyData() wrong sig size"); |
61 sig->sig_size += 16; | 63 sig->sig_size += 16; |
62 | 64 |
| 65 TEST_EQ(VerifyData(test_data, test_size - 1, sig, rsa), 1, |
| 66 "VerifyData() input buffer too small"); |
| 67 |
63 GetSignatureData(sig)[0] ^= 0x5A; | 68 GetSignatureData(sig)[0] ^= 0x5A; |
64 TEST_EQ(VerifyData(test_data, sig, rsa), 1, "VerifyData() wrong sig"); | 69 TEST_EQ(VerifyData(test_data, test_size, sig, rsa), 1, |
| 70 "VerifyData() wrong sig"); |
65 | 71 |
66 RSAPublicKeyFree(rsa); | 72 RSAPublicKeyFree(rsa); |
67 Free(sig); | 73 Free(sig); |
68 } | 74 } |
69 | 75 |
70 | 76 |
71 static void VerifyDigestTest(const VbPublicKey* public_key, | 77 static void VerifyDigestTest(const VbPublicKey* public_key, |
72 const VbPrivateKey* private_key) { | 78 const VbPrivateKey* private_key) { |
73 | 79 |
74 const uint8_t test_data[] = "This is some other test data to sign."; | 80 const uint8_t test_data[] = "This is some other test data to sign."; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 VbKernelPreambleHeader *h; | 117 VbKernelPreambleHeader *h; |
112 RSAPublicKey* rsa; | 118 RSAPublicKey* rsa; |
113 unsigned hsize; | 119 unsigned hsize; |
114 | 120 |
115 /* Create a dummy signature */ | 121 /* Create a dummy signature */ |
116 VbSignature *body_sig = SignatureAlloc(56, 78); | 122 VbSignature *body_sig = SignatureAlloc(56, 78); |
117 | 123 |
118 rsa = PublicKeyToRSA(public_key); | 124 rsa = PublicKeyToRSA(public_key); |
119 hdr = CreateKernelPreamble(0x1234, 0x100000, 0x300000, 0x4000, body_sig, | 125 hdr = CreateKernelPreamble(0x1234, 0x100000, 0x300000, 0x4000, body_sig, |
120 0, private_key); | 126 0, private_key); |
121 TEST_NEQ(hdr && rsa, 0, "VerifyKernelPreamble2() prerequisites"); | 127 TEST_NEQ(hdr && rsa, 0, "VerifyKernelPreamble() prerequisites"); |
122 if (!hdr) | 128 if (!hdr) |
123 return; | 129 return; |
124 hsize = (unsigned) hdr->preamble_size; | 130 hsize = (unsigned) hdr->preamble_size; |
125 h = (VbKernelPreambleHeader*)Malloc(hsize + 16384); | 131 h = (VbKernelPreambleHeader*)Malloc(hsize + 16384); |
126 | 132 |
127 TEST_EQ(VerifyKernelPreamble2(hdr, hsize, rsa), 0, | 133 TEST_EQ(VerifyKernelPreamble(hdr, hsize, rsa), 0, |
128 "VerifyKernelPreamble2() ok using key"); | 134 "VerifyKernelPreamble() ok using key"); |
129 TEST_NEQ(VerifyKernelPreamble2(hdr, hsize - 1, rsa), 0, | 135 TEST_NEQ(VerifyKernelPreamble(hdr, hsize - 1, rsa), 0, |
130 "VerifyKernelPreamble2() size--"); | 136 "VerifyKernelPreamble() size--"); |
131 TEST_EQ(VerifyKernelPreamble2(hdr, hsize + 1, rsa), 0, | 137 TEST_EQ(VerifyKernelPreamble(hdr, hsize + 1, rsa), 0, |
132 "VerifyKernelPreamble2() size++"); | 138 "VerifyKernelPreamble() size++"); |
133 | 139 |
134 /* Care about major version but not minor */ | 140 /* Care about major version but not minor */ |
135 Memcpy(h, hdr, hsize); | 141 Memcpy(h, hdr, hsize); |
136 h->header_version_major++; | 142 h->header_version_major++; |
137 ReSignKernelPreamble(h, private_key); | 143 ReSignKernelPreamble(h, private_key); |
138 TEST_NEQ(VerifyKernelPreamble2(h, hsize, rsa), 0, | 144 TEST_NEQ(VerifyKernelPreamble(h, hsize, rsa), 0, |
139 "VerifyKernelPreamble2() major++"); | 145 "VerifyKernelPreamble() major++"); |
140 | 146 |
141 Memcpy(h, hdr, hsize); | 147 Memcpy(h, hdr, hsize); |
142 h->header_version_major--; | 148 h->header_version_major--; |
143 ReSignKernelPreamble(h, private_key); | 149 ReSignKernelPreamble(h, private_key); |
144 TEST_NEQ(VerifyKernelPreamble2(h, hsize, rsa), 0, | 150 TEST_NEQ(VerifyKernelPreamble(h, hsize, rsa), 0, |
145 "VerifyKernelPreamble2() major--"); | 151 "VerifyKernelPreamble() major--"); |
146 | 152 |
147 Memcpy(h, hdr, hsize); | 153 Memcpy(h, hdr, hsize); |
148 h->header_version_minor++; | 154 h->header_version_minor++; |
149 ReSignKernelPreamble(h, private_key); | 155 ReSignKernelPreamble(h, private_key); |
150 TEST_EQ(VerifyKernelPreamble2(h, hsize, rsa), 0, | 156 TEST_EQ(VerifyKernelPreamble(h, hsize, rsa), 0, |
151 "VerifyKernelPreamble2() minor++"); | 157 "VerifyKernelPreamble() minor++"); |
152 | 158 |
153 Memcpy(h, hdr, hsize); | 159 Memcpy(h, hdr, hsize); |
154 h->header_version_minor--; | 160 h->header_version_minor--; |
155 ReSignKernelPreamble(h, private_key); | 161 ReSignKernelPreamble(h, private_key); |
156 TEST_EQ(VerifyKernelPreamble2(h, hsize, rsa), 0, | 162 TEST_EQ(VerifyKernelPreamble(h, hsize, rsa), 0, |
157 "VerifyKernelPreamble2() minor--"); | 163 "VerifyKernelPreamble() minor--"); |
158 | 164 |
159 /* Check signature */ | 165 /* Check signature */ |
160 Memcpy(h, hdr, hsize); | 166 Memcpy(h, hdr, hsize); |
161 h->preamble_signature.sig_offset = hsize; | 167 h->preamble_signature.sig_offset = hsize; |
162 ReSignKernelPreamble(h, private_key); | 168 ReSignKernelPreamble(h, private_key); |
163 TEST_NEQ(VerifyKernelPreamble2(h, hsize, rsa), 0, | 169 TEST_NEQ(VerifyKernelPreamble(h, hsize, rsa), 0, |
164 "VerifyKernelPreamble2() sig off end"); | 170 "VerifyKernelPreamble() sig off end"); |
165 | 171 |
166 Memcpy(h, hdr, hsize); | 172 Memcpy(h, hdr, hsize); |
167 h->preamble_signature.sig_size--; | 173 h->preamble_signature.sig_size--; |
168 ReSignKernelPreamble(h, private_key); | 174 ReSignKernelPreamble(h, private_key); |
169 TEST_NEQ(VerifyKernelPreamble2(h, hsize, rsa), 0, | 175 TEST_NEQ(VerifyKernelPreamble(h, hsize, rsa), 0, |
170 "VerifyKernelPreamble2() sig too small"); | 176 "VerifyKernelPreamble() sig too small"); |
171 | 177 |
172 Memcpy(h, hdr, hsize); | 178 Memcpy(h, hdr, hsize); |
173 GetSignatureData(&h->body_signature)[0] ^= 0x34; | 179 GetSignatureData(&h->body_signature)[0] ^= 0x34; |
174 TEST_NEQ(VerifyKernelPreamble2(h, hsize, rsa), 0, | 180 TEST_NEQ(VerifyKernelPreamble(h, hsize, rsa), 0, |
175 "VerifyKernelPreamble2() sig mismatch"); | 181 "VerifyKernelPreamble() sig mismatch"); |
176 | 182 |
177 /* Check that we signed header and body sig */ | 183 /* Check that we signed header and body sig */ |
178 Memcpy(h, hdr, hsize); | 184 Memcpy(h, hdr, hsize); |
179 h->preamble_signature.data_size = 4; | 185 h->preamble_signature.data_size = 4; |
180 h->body_signature.sig_offset = 0; | 186 h->body_signature.sig_offset = 0; |
181 h->body_signature.sig_size = 0; | 187 h->body_signature.sig_size = 0; |
182 ReSignKernelPreamble(h, private_key); | 188 ReSignKernelPreamble(h, private_key); |
183 TEST_NEQ(VerifyKernelPreamble2(h, hsize, rsa), 0, | 189 TEST_NEQ(VerifyKernelPreamble(h, hsize, rsa), 0, |
184 "VerifyKernelPreamble2() didn't sign header"); | 190 "VerifyKernelPreamble() didn't sign header"); |
185 | 191 |
186 Memcpy(h, hdr, hsize); | 192 Memcpy(h, hdr, hsize); |
187 h->body_signature.sig_offset = hsize; | 193 h->body_signature.sig_offset = hsize; |
188 ReSignKernelPreamble(h, private_key); | 194 ReSignKernelPreamble(h, private_key); |
189 TEST_NEQ(VerifyKernelPreamble2(h, hsize, rsa), 0, | 195 TEST_NEQ(VerifyKernelPreamble(h, hsize, rsa), 0, |
190 "VerifyKernelPreamble2() body sig off end"); | 196 "VerifyKernelPreamble() body sig off end"); |
191 | 197 |
192 /* TODO: verify parser can support a bigger header. */ | 198 /* TODO: verify parser can support a bigger header. */ |
193 | 199 |
194 Free(h); | 200 Free(h); |
195 RSAPublicKeyFree(rsa); | 201 RSAPublicKeyFree(rsa); |
196 Free(hdr); | 202 Free(hdr); |
197 } | 203 } |
198 | 204 |
199 | 205 |
200 int main(int argc, char* argv[]) { | 206 int main(int argc, char* argv[]) { |
(...skipping 29 matching lines...) Expand all Loading... |
230 VerifyDigestTest(public_key, private_key); | 236 VerifyDigestTest(public_key, private_key); |
231 VerifyKernelPreambleTest(public_key, private_key); | 237 VerifyKernelPreambleTest(public_key, private_key); |
232 | 238 |
233 if (public_key) | 239 if (public_key) |
234 Free(public_key); | 240 Free(public_key); |
235 if (private_key) | 241 if (private_key) |
236 Free(private_key); | 242 Free(private_key); |
237 | 243 |
238 return error_code; | 244 return error_code; |
239 } | 245 } |
OLD | NEW |