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 "base/logging.h"
8 #include "base/pickle.h"
9 #include "crypto/third_party/nss/chromium-blapi.h"
10 #include "crypto/third_party/nss/chromium-sha256.h"
16 const char kSHA256Descriptor
[] = "NSS";
18 class SecureHashSHA256NSS
: public SecureHash
{
20 static const int kSecureHashVersion
= 1;
22 SecureHashSHA256NSS() {
26 ~SecureHashSHA256NSS() override
{ memset(&ctx_
, 0, sizeof(ctx_
)); }
28 // SecureHash implementation:
29 void Update(const void* input
, size_t len
) override
{
30 SHA256_Update(&ctx_
, static_cast<const unsigned char*>(input
), len
);
33 void Finish(void* output
, size_t len
) override
{
34 SHA256_End(&ctx_
, static_cast<unsigned char*>(output
), NULL
,
35 static_cast<unsigned int>(len
));
38 bool Serialize(base::Pickle
* pickle
) override
;
39 bool Deserialize(base::PickleIterator
* data_iterator
) override
;
45 bool SecureHashSHA256NSS::Serialize(base::Pickle
* pickle
) {
49 if (!pickle
->WriteInt(kSecureHashVersion
) ||
50 !pickle
->WriteString(kSHA256Descriptor
) ||
51 !pickle
->WriteBytes(&ctx_
, sizeof(ctx_
))) {
58 bool SecureHashSHA256NSS::Deserialize(base::PickleIterator
* data_iterator
) {
60 if (!data_iterator
->ReadInt(&version
))
63 if (version
> kSecureHashVersion
)
64 return false; // We don't know how to deal with this.
67 if (!data_iterator
->ReadString(&type
))
70 if (type
!= kSHA256Descriptor
)
71 return false; // It's the wrong kind.
73 const char* data
= NULL
;
74 if (!data_iterator
->ReadBytes(&data
, sizeof(ctx_
)))
77 memcpy(&ctx_
, data
, sizeof(ctx_
));
84 SecureHash
* SecureHash::Create(Algorithm algorithm
) {
87 return new SecureHashSHA256NSS();