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() {
29 // SecureHash implementation:
30 virtual void Update(const void* input
, size_t len
) OVERRIDE
{
31 SHA256_Update(&ctx_
, static_cast<const unsigned char*>(input
), len
);
34 virtual void Finish(void* output
, size_t len
) OVERRIDE
{
35 SHA256_End(&ctx_
, static_cast<unsigned char*>(output
), NULL
,
36 static_cast<unsigned int>(len
));
39 virtual bool Serialize(Pickle
* pickle
) OVERRIDE
;
40 virtual bool Deserialize(PickleIterator
* data_iterator
) OVERRIDE
;
46 bool SecureHashSHA256NSS::Serialize(Pickle
* pickle
) {
50 if (!pickle
->WriteInt(kSecureHashVersion
) ||
51 !pickle
->WriteString(kSHA256Descriptor
) ||
52 !pickle
->WriteBytes(&ctx_
, sizeof(ctx_
))) {
59 bool SecureHashSHA256NSS::Deserialize(PickleIterator
* data_iterator
) {
61 if (!data_iterator
->ReadInt(&version
))
64 if (version
> kSecureHashVersion
)
65 return false; // We don't know how to deal with this.
68 if (!data_iterator
->ReadString(&type
))
71 if (type
!= kSHA256Descriptor
)
72 return false; // It's the wrong kind.
74 const char* data
= NULL
;
75 if (!data_iterator
->ReadBytes(&data
, sizeof(ctx_
)))
78 memcpy(&ctx_
, data
, sizeof(ctx_
));
85 SecureHash
* SecureHash::Create(Algorithm algorithm
) {
88 return new SecureHashSHA256NSS();