| 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 |