Chromium Code Reviews| Index: delta_performer.cc |
| diff --git a/delta_performer.cc b/delta_performer.cc |
| index 54a69fb132f234dbb57088df09086ba8b64a4ca8..e841be1624b754c632b4e1d4f44cd2e3c4116a19 100644 |
| --- a/delta_performer.cc |
| +++ b/delta_performer.cc |
| @@ -569,10 +569,20 @@ bool DeltaPerformer::ExtractSignatureMessage( |
| return true; |
| } |
| +#define TEST_SET_TRUE_RET_TRUE(_var, _condition) \ |
| + do { \ |
| + if (!(_condition)) { \ |
| + LOG(ERROR) << "Non fatal public key verification: " << #_condition; \ |
| + (_var) = true; \ |
| + return true; \ |
| + } \ |
| + } while(0) |
| + |
| bool DeltaPerformer::VerifyPayload( |
| const string& public_key_path, |
| const std::string& update_check_response_hash, |
| - const uint64_t update_check_response_size) { |
| + const uint64_t update_check_response_size, |
| + bool* signature_failed) { |
| string key_path = public_key_path; |
| if (key_path.empty()) { |
| key_path = kUpdatePayloadPublicKeyPath; |
| @@ -593,21 +603,35 @@ bool DeltaPerformer::VerifyPayload( |
| LOG(WARNING) << "Not verifying signed delta payload -- missing public key."; |
| return true; |
| } |
| - TEST_AND_RETURN_FALSE(!signatures_message_data_.empty()); |
| + TEST_SET_TRUE_RET_TRUE(*signature_failed, !signatures_message_data_.empty()); |
|
petkov
2011/03/30 22:10:21
This doesn't check for signature_failed != NULL? E
adlr
2011/03/30 22:30:06
Fixed to accept NULL
|
| vector<char> signed_hash_data; |
| - TEST_AND_RETURN_FALSE(PayloadSigner::VerifySignature(signatures_message_data_, |
| - key_path, |
| - &signed_hash_data)); |
| + TEST_SET_TRUE_RET_TRUE(*signature_failed, PayloadSigner::VerifySignature( |
| + signatures_message_data_, |
| + key_path, |
| + &signed_hash_data)); |
| OmahaHashCalculator signed_hasher; |
| - TEST_AND_RETURN_FALSE(signed_hasher.SetContext(signed_hash_context_)); |
| - TEST_AND_RETURN_FALSE(signed_hasher.Finalize()); |
| + TEST_SET_TRUE_RET_TRUE(*signature_failed, |
| + signed_hasher.SetContext(signed_hash_context_)); |
| + TEST_SET_TRUE_RET_TRUE(*signature_failed, |
| + signed_hasher.Finalize()); |
| vector<char> hash_data = signed_hasher.raw_hash(); |
| PayloadSigner::PadRSA2048SHA256Hash(&hash_data); |
| - TEST_AND_RETURN_FALSE(!hash_data.empty()); |
| - TEST_AND_RETURN_FALSE(hash_data == signed_hash_data); |
| + TEST_SET_TRUE_RET_TRUE(*signature_failed, !hash_data.empty()); |
| + if (hash_data != signed_hash_data) { |
| + LOG(ERROR) << "Public key verificaion failed. This is non-fatal. " |
| + "Attached Signature:"; |
| + utils::HexDumpVector(signed_hash_data); |
| + LOG(ERROR) << "Computed Signature:"; |
| + utils::HexDumpVector(hash_data); |
| + if (signature_failed) { |
| + *signature_failed = true; |
| + } |
| + } |
| return true; |
| } |
| +#undef TEST_SET_TRUE_RET_TRUE |
| + |
| bool DeltaPerformer::GetNewPartitionInfo(uint64_t* kernel_size, |
| vector<char>* kernel_hash, |
| uint64_t* rootfs_size, |