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 virtual ~SecureHashSHA256NSS() {
27 memset(&ctx_
, 0, sizeof(ctx_
));
30 // SecureHash implementation:
31 virtual void Update(const void* input
, size_t len
) OVERRIDE
{
32 SHA256_Update(&ctx_
, static_cast<const unsigned char*>(input
), len
);
35 virtual void Finish(void* output
, size_t len
) OVERRIDE
{
36 SHA256_End(&ctx_
, static_cast<unsigned char*>(output
), NULL
,
37 static_cast<unsigned int>(len
));
40 virtual bool Serialize(Pickle
* pickle
) OVERRIDE
;
41 virtual bool Deserialize(PickleIterator
* data_iterator
) OVERRIDE
;
47 bool SecureHashSHA256NSS::Serialize(Pickle
* pickle
) {
51 if (!pickle
->WriteInt(kSecureHashVersion
) ||
52 !pickle
->WriteString(kSHA256Descriptor
) ||
53 !pickle
->WriteBytes(&ctx_
, sizeof(ctx_
))) {
60 bool SecureHashSHA256NSS::Deserialize(PickleIterator
* data_iterator
) {
62 if (!data_iterator
->ReadInt(&version
))
65 if (version
> kSecureHashVersion
)
66 return false; // We don't know how to deal with this.
69 if (!data_iterator
->ReadString(&type
))
72 if (type
!= kSHA256Descriptor
)
73 return false; // It's the wrong kind.
75 const char* data
= NULL
;
76 if (!data_iterator
->ReadBytes(&data
, sizeof(ctx_
)))
79 memcpy(&ctx_
, data
, sizeof(ctx_
));
86 SecureHash
* SecureHash::Create(Algorithm algorithm
) {
89 return new SecureHashSHA256NSS();