| Index: delta_performer_unittest.cc
 | 
| diff --git a/delta_performer_unittest.cc b/delta_performer_unittest.cc
 | 
| index 4b273ccd8d8b9a53ad79724c9751ed054a3579de..cceffcf4cf9019b473cce0b279e804dbb9169c69 100755
 | 
| --- a/delta_performer_unittest.cc
 | 
| +++ b/delta_performer_unittest.cc
 | 
| @@ -100,21 +100,22 @@ enum SignatureTest {
 | 
|    kSignatureGenerator,  // Sign the payload at generation time.
 | 
|    kSignatureGenerated,  // Sign the payload after it's generated.
 | 
|    kSignatureGeneratedShell,  // Sign the generated payload through shell cmds.
 | 
| +  kSignatureGeneratedShellBadKey,  // Sign with a bad key through shell cmds.
 | 
|  };
 | 
|  
 | 
| -size_t GetSignatureSize() {
 | 
| +size_t GetSignatureSize(const string& private_key_path) {
 | 
|    const vector<char> data(1, 'x');
 | 
|    vector<char> hash;
 | 
|    EXPECT_TRUE(OmahaHashCalculator::RawHashOfData(data, &hash));
 | 
|    vector<char> signature;
 | 
|    EXPECT_TRUE(PayloadSigner::SignHash(hash,
 | 
| -                                      kUnittestPrivateKeyPath,
 | 
| +                                      private_key_path,
 | 
|                                        &signature));
 | 
|    return signature.size();
 | 
|  }
 | 
|  
 | 
|  void SignGeneratedPayload(const string& payload_path) {
 | 
| -  int signature_size = GetSignatureSize();
 | 
| +  int signature_size = GetSignatureSize(kUnittestPrivateKeyPath);
 | 
|    vector<char> hash;
 | 
|    ASSERT_TRUE(PayloadSigner::HashPayloadForSigning(payload_path,
 | 
|                                                     signature_size,
 | 
| @@ -130,12 +131,31 @@ void SignGeneratedPayload(const string& payload_path) {
 | 
|                                                   kUnittestPublicKeyPath));
 | 
|  }
 | 
|  
 | 
| -void SignGeneratedShellPayload(const string& payload_path) {
 | 
| -  int signature_size = GetSignatureSize();
 | 
| +void SignGeneratedShellPayload(SignatureTest signature_test,
 | 
| +                               const string& payload_path) {
 | 
| +  string private_key_path = kUnittestPrivateKeyPath;
 | 
| +  if (signature_test == kSignatureGeneratedShellBadKey) {
 | 
| +    ASSERT_TRUE(utils::MakeTempFile("/tmp/key.XXXXXX",
 | 
| +                                    &private_key_path,
 | 
| +                                    NULL));
 | 
| +  } else {
 | 
| +    ASSERT_EQ(kSignatureGeneratedShell, signature_test);
 | 
| +  }
 | 
| +  ScopedPathUnlinker key_unlinker(private_key_path);
 | 
| +  key_unlinker.set_should_remove(signature_test ==
 | 
| +                                 kSignatureGeneratedShellBadKey);
 | 
| +  // Generates a new private key that will not match the public key.
 | 
| +  if (signature_test == kSignatureGeneratedShellBadKey) {
 | 
| +    LOG(INFO) << "Generating a mismatched private key.";
 | 
| +    ASSERT_EQ(0,
 | 
| +              System(StringPrintf(
 | 
| +                  "/usr/bin/openssl genrsa -out %s 1024",
 | 
| +                  private_key_path.c_str())));
 | 
| +  }
 | 
| +  int signature_size = GetSignatureSize(private_key_path);
 | 
|    string hash_file;
 | 
|    ASSERT_TRUE(utils::MakeTempFile("/tmp/hash.XXXXXX", &hash_file, NULL));
 | 
|    ScopedPathUnlinker hash_unlinker(hash_file);
 | 
| -
 | 
|    ASSERT_EQ(0,
 | 
|              System(StringPrintf(
 | 
|                  "./delta_generator -in_file %s -signature_size %d "
 | 
| @@ -150,7 +170,7 @@ void SignGeneratedShellPayload(const string& payload_path) {
 | 
|    ASSERT_EQ(0,
 | 
|              System(StringPrintf(
 | 
|                  "/usr/bin/openssl rsautl -pkcs -sign -inkey %s -in %s -out %s",
 | 
| -                kUnittestPrivateKeyPath,
 | 
| +                private_key_path.c_str(),
 | 
|                  hash_file.c_str(),
 | 
|                  sig_file.c_str())));
 | 
|    ASSERT_EQ(0,
 | 
| @@ -160,11 +180,15 @@ void SignGeneratedShellPayload(const string& payload_path) {
 | 
|                  payload_path.c_str(),
 | 
|                  sig_file.c_str(),
 | 
|                  payload_path.c_str())));
 | 
| -  ASSERT_EQ(0,
 | 
| -            System(StringPrintf(
 | 
| -                "./delta_generator -in_file %s -public_key %s",
 | 
| -                payload_path.c_str(),
 | 
| -                kUnittestPublicKeyPath)));
 | 
| +  int verify_result =
 | 
| +      System(StringPrintf("./delta_generator -in_file %s -public_key %s",
 | 
| +                          payload_path.c_str(),
 | 
| +                          kUnittestPublicKeyPath));
 | 
| +  if (signature_test == kSignatureGeneratedShellBadKey) {
 | 
| +    ASSERT_NE(0, verify_result);
 | 
| +  } else {
 | 
| +    ASSERT_EQ(0, verify_result);
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  void DoSmallImageTest(bool full_kernel, bool full_rootfs, bool noop,
 | 
| @@ -289,8 +313,9 @@ void DoSmallImageTest(bool full_kernel, bool full_rootfs, bool noop,
 | 
|  
 | 
|    if (signature_test == kSignatureGenerated) {
 | 
|      SignGeneratedPayload(delta_path);
 | 
| -  } else if (signature_test == kSignatureGeneratedShell) {
 | 
| -    SignGeneratedShellPayload(delta_path);
 | 
| +  } else if (signature_test == kSignatureGeneratedShell ||
 | 
| +             signature_test == kSignatureGeneratedShellBadKey) {
 | 
| +    SignGeneratedShellPayload(signature_test, delta_path);
 | 
|    }
 | 
|  
 | 
|    // Read delta into memory.
 | 
| @@ -412,11 +437,18 @@ void DoSmallImageTest(bool full_kernel, bool full_rootfs, bool noop,
 | 
|                         strlen(new_data_string)));
 | 
|  
 | 
|    EXPECT_TRUE(utils::FileExists(kUnittestPublicKeyPath));
 | 
| -  EXPECT_EQ(signature_test != kSignatureNone,
 | 
| +  bool expect_verify_success =
 | 
| +      signature_test != kSignatureNone &&
 | 
| +      signature_test != kSignatureGeneratedShellBadKey;
 | 
| +  EXPECT_EQ(expect_verify_success,
 | 
|              performer.VerifyPayload(
 | 
|                  kUnittestPublicKeyPath,
 | 
|                  OmahaHashCalculator::OmahaHashOfData(delta),
 | 
|                  delta.size()));
 | 
| +  EXPECT_TRUE(performer.VerifyPayload(
 | 
| +      "/public/key/does/not/exists",
 | 
| +      OmahaHashCalculator::OmahaHashOfData(delta),
 | 
| +      delta.size()));
 | 
|  
 | 
|    uint64_t new_kernel_size;
 | 
|    vector<char> new_kernel_hash;
 | 
| @@ -469,6 +501,10 @@ TEST(DeltaPerformerTest, RunAsRootSmallImageSignGeneratedShellTest) {
 | 
|    DoSmallImageTest(false, false, false, kSignatureGeneratedShell);
 | 
|  }
 | 
|  
 | 
| +TEST(DeltaPerformerTest, RunAsRootSmallImageSignGeneratedShellBadKeyTest) {
 | 
| +  DoSmallImageTest(false, false, false, kSignatureGeneratedShellBadKey);
 | 
| +}
 | 
| +
 | 
|  TEST(DeltaPerformerTest, BadDeltaMagicTest) {
 | 
|    PrefsMock prefs;
 | 
|    DeltaPerformer performer(&prefs);
 | 
| 
 |