diff options
Diffstat (limited to 'crypto/secure_hash_default.cc')
-rw-r--r-- | crypto/secure_hash_default.cc | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/crypto/secure_hash_default.cc b/crypto/secure_hash_default.cc index d85754a..6607dfe 100644 --- a/crypto/secure_hash_default.cc +++ b/crypto/secure_hash_default.cc @@ -5,6 +5,7 @@ #include "crypto/secure_hash.h" #include "base/logging.h" +#include "base/pickle.h" #include "crypto/third_party/nss/chromium-blapi.h" #include "crypto/third_party/nss/chromium-sha256.h" @@ -12,8 +13,12 @@ namespace crypto { namespace { +const char kSHA256Descriptor[] = "NSS"; + class SecureHashSHA256NSS : public SecureHash { public: + static const int kSecureHashVersion = 1; + SecureHashSHA256NSS() { SHA256_Begin(&ctx_); } @@ -30,10 +35,53 @@ class SecureHashSHA256NSS : public SecureHash { static_cast<unsigned int>(len)); } + virtual bool Serialize(Pickle* pickle); + virtual bool Deserialize(void** data_iterator, Pickle* pickle); + private: SHA256Context ctx_; }; +bool SecureHashSHA256NSS::Serialize(Pickle* pickle) { + if (!pickle) + return false; + + if (!pickle->WriteInt(kSecureHashVersion) || + !pickle->WriteString(kSHA256Descriptor) || + !pickle->WriteBytes(&ctx_, sizeof(ctx_))) { + return false; + } + + return true; +} + +bool SecureHashSHA256NSS::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) { |