| OLD | NEW | 
|---|
| (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 } | 
| OLD | NEW | 
|---|