| Index: chrome/browser/download/base_file.cc | 
| =================================================================== | 
| --- chrome/browser/download/base_file.cc	(revision 70630) | 
| +++ chrome/browser/download/base_file.cc	(working copy) | 
| @@ -7,6 +7,8 @@ | 
| #include "base/file_util.h" | 
| #include "base/logging.h" | 
| #include "base/stringprintf.h" | 
| +#include "base/third_party/nss/blapi.h" | 
| +#include "base/third_party/nss/sha256.h" | 
| #include "net/base/file_stream.h" | 
| #include "net/base/net_errors.h" | 
| #include "chrome/browser/browser_thread.h" | 
| @@ -30,7 +32,9 @@ | 
| referrer_url_(referrer_url), | 
| file_stream_(file_stream), | 
| bytes_so_far_(received_bytes), | 
| -      power_save_blocker_(true) { | 
| +      power_save_blocker_(true), | 
| +      calculate_hash_(false), | 
| +      sha_context_(NULL) { | 
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 
| } | 
|  | 
| @@ -41,8 +45,16 @@ | 
| Close(); | 
| } | 
|  | 
| -bool BaseFile::Initialize() { | 
| +bool BaseFile::Initialize(bool calculate_hash) { | 
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 
| + | 
| +  calculate_hash_ = calculate_hash; | 
| + | 
| +  if (calculate_hash_) { | 
| +    sha_context_.reset(new SHA256Context); | 
| +    SHA256_Begin(sha_context_.get()); | 
| +  } | 
| + | 
| if (!full_path_.empty() || | 
| download_util::CreateTemporaryFileForDownload(&full_path_)) | 
| return Open(); | 
| @@ -63,7 +75,16 @@ | 
|  | 
| // TODO(phajdan.jr): handle errors on file writes. http://crbug.com/58355 | 
| size_t written = file_stream_->Write(data, data_len, NULL); | 
| -  return (written == data_len); | 
| +  if (written != data_len) | 
| +    return false; | 
| + | 
| +  if (calculate_hash_) { | 
| +    SHA256_Update(sha_context_.get(), | 
| +                  reinterpret_cast<const unsigned char*>(data), | 
| +                  data_len); | 
| +  } | 
| + | 
| +  return true; | 
| } | 
|  | 
| bool BaseFile::Rename(const FilePath& new_path, bool is_final_rename) { | 
| @@ -139,9 +160,21 @@ | 
|  | 
| void BaseFile::Finish() { | 
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 
| + | 
| +  if (calculate_hash_) | 
| +    SHA256_End(sha_context_.get(), sha256_hash_, NULL, kSha256HashLen); | 
| + | 
| Close(); | 
| } | 
|  | 
| +bool BaseFile::GetSha256Hash(std::string* hash) { | 
| +  if (!calculate_hash_ || in_progress()) | 
| +    return false; | 
| +  hash->assign(reinterpret_cast<const char*>(sha256_hash_), | 
| +               sizeof(sha256_hash_)); | 
| +  return true; | 
| +} | 
| + | 
| void BaseFile::AnnotateWithSourceInformation() { | 
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 
| #if defined(OS_WIN) | 
|  |