1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "crypto/secure_hash.h"
7 #include <openssl/mem.h>
8 #include <openssl/sha.h>
10 #include "base/basictypes.h"
11 #include "base/logging.h"
12 #include "base/pickle.h"
13 #include "crypto/openssl_util.h"
19 const char kSHA256Descriptor
[] = "OpenSSL";
21 class SecureHashSHA256OpenSSL
: public SecureHash
{
23 static const int kSecureHashVersion
= 1;
25 SecureHashSHA256OpenSSL() {
29 ~SecureHashSHA256OpenSSL() override
{
30 OPENSSL_cleanse(&ctx_
, sizeof(ctx_
));
33 void Update(const void* input
, size_t len
) override
{
34 SHA256_Update(&ctx_
, static_cast<const unsigned char*>(input
), len
);
37 void Finish(void* output
, size_t len
) override
{
38 ScopedOpenSSLSafeSizeBuffer
<SHA256_DIGEST_LENGTH
> result(
39 static_cast<unsigned char*>(output
), len
);
40 SHA256_Final(result
.safe_buffer(), &ctx_
);
43 bool Serialize(Pickle
* pickle
) override
;
44 bool Deserialize(PickleIterator
* data_iterator
) override
;
50 bool SecureHashSHA256OpenSSL::Serialize(Pickle
* pickle
) {
54 if (!pickle
->WriteInt(kSecureHashVersion
) ||
55 !pickle
->WriteString(kSHA256Descriptor
) ||
56 !pickle
->WriteBytes(&ctx_
, sizeof(ctx_
))) {
63 bool SecureHashSHA256OpenSSL::Deserialize(PickleIterator
* data_iterator
) {
68 if (!data_iterator
->ReadInt(&version
))
71 if (version
> kSecureHashVersion
)
72 return false; // We don't know how to deal with this.
75 if (!data_iterator
->ReadString(&type
))
78 if (type
!= kSHA256Descriptor
)
79 return false; // It's the wrong kind.
81 const char* data
= NULL
;
82 if (!data_iterator
->ReadBytes(&data
, sizeof(ctx_
)))
85 memcpy(&ctx_
, data
, sizeof(ctx_
));
92 SecureHash
* SecureHash::Create(Algorithm algorithm
) {
95 return new SecureHashSHA256OpenSSL();
102 } // namespace crypto