diff options
author | ahendrickson@chromium.org <ahendrickson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-19 16:54:13 +0000 |
---|---|---|
committer | ahendrickson@chromium.org <ahendrickson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-19 16:54:13 +0000 |
commit | 02c28d22e674ead77e50520c350b1da082f0ca63 (patch) | |
tree | e5a6829766c9fe908ace1a82261475eb03314440 /crypto/secure_hash_openssl.cc | |
parent | af00649ce4a4e34be81b489e7d14e08473d75988 (diff) | |
download | chromium_src-02c28d22e674ead77e50520c350b1da082f0ca63.zip chromium_src-02c28d22e674ead77e50520c350b1da082f0ca63.tar.gz chromium_src-02c28d22e674ead77e50520c350b1da082f0ca63.tar.bz2 |
Added serialization to SecureHash.
These will be used to resume hash generation when a download is interrupted and later resumed.
BUG=None.
TEST=SecureHashTest.TestSerialization
Review URL: http://codereview.chromium.org/8588057
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@110842 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'crypto/secure_hash_openssl.cc')
-rw-r--r-- | crypto/secure_hash_openssl.cc | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/crypto/secure_hash_openssl.cc b/crypto/secure_hash_openssl.cc index 8e2f128..098bf27 100644 --- a/crypto/secure_hash_openssl.cc +++ b/crypto/secure_hash_openssl.cc @@ -8,14 +8,19 @@ #include "base/basictypes.h" #include "base/logging.h" +#include "base/pickle.h" #include "crypto/openssl_util.h" namespace crypto { namespace { +const char kSHA256Descriptor[] = "OpenSSL"; + class SecureHashSHA256OpenSSL : public SecureHash { public: + static const int kSecureHashVersion = 1; + SecureHashSHA256OpenSSL() { SHA256_Init(&ctx_); } @@ -34,10 +39,54 @@ class SecureHashSHA256OpenSSL : public SecureHash { SHA256_Final(result.safe_buffer(), &ctx_); } + virtual bool Serialize(Pickle* pickle); + virtual bool Deserialize(void** data_iterator, Pickle* pickle); + private: SHA256_CTX ctx_; }; +bool SecureHashSHA256OpenSSL::Serialize(Pickle* pickle) { + if (!pickle) + return false; + + if (!pickle->WriteInt(kSecureHashVersion) || + !pickle->WriteString(kSHA256Descriptor) || + !pickle->WriteBytes(&ctx_, sizeof(ctx_))) { + return false; + } + + return true; +} + +bool SecureHashSHA256OpenSSL::Deserialize(void** data_iterator, + Pickle* pickle) { + if (!pickle) + return false; + + int version; + if (!pickle->ReadInt(data_iterator, &version)) + return false; + + if (version > kSecureHashVersion) + return false; // We don't know how to deal with this. + + std::string type; + if (!pickle->ReadString(data_iterator, &type)) + return false; + + if (type != kSHA256Descriptor) + return false; // It's the wrong kind. + + const char* data = NULL; + if (!pickle->ReadBytes(data_iterator, &data, sizeof(ctx_))) + return false; + + memcpy(&ctx_, data, sizeof(ctx_)); + + return true; +} + } // namespace SecureHash* SecureHash::Create(Algorithm algorithm) { |