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.
4
5#include "crypto/secure_hash.h"
6
7#if defined(OPENSSL_IS_BORINGSSL)
8#include <openssl/mem.h>
9#else
10#include <openssl/crypto.h>
11#endif
12#include <openssl/sha.h>
13#include <stddef.h>
14
15#include "base/logging.h"
16#include "base/memory/ptr_util.h"
17#include "base/pickle.h"
18#include "crypto/openssl_util.h"
19
20namespace crypto {
21
22namespace {
23
24class SecureHashSHA256 : public SecureHash {
25 public:
26  SecureHashSHA256() {
27    SHA256_Init(&ctx_);
28  }
29
30  SecureHashSHA256(const SecureHashSHA256& other) {
31    memcpy(&ctx_, &other.ctx_, sizeof(ctx_));
32  }
33
34  ~SecureHashSHA256() override {
35    OPENSSL_cleanse(&ctx_, sizeof(ctx_));
36  }
37
38  void Update(const void* input, size_t len) override {
39    SHA256_Update(&ctx_, static_cast<const unsigned char*>(input), len);
40  }
41
42  void Finish(void* output, size_t len) override {
43    ScopedOpenSSLSafeSizeBuffer<SHA256_DIGEST_LENGTH> result(
44        static_cast<unsigned char*>(output), len);
45    SHA256_Final(result.safe_buffer(), &ctx_);
46  }
47
48  std::unique_ptr<SecureHash> Clone() const override {
49    return base::MakeUnique<SecureHashSHA256>(*this);
50  }
51
52  size_t GetHashLength() const override { return SHA256_DIGEST_LENGTH; }
53
54 private:
55  SHA256_CTX ctx_;
56};
57
58}  // namespace
59
60std::unique_ptr<SecureHash> SecureHash::Create(Algorithm algorithm) {
61  switch (algorithm) {
62    case SHA256:
63      return base::MakeUnique<SecureHashSHA256>();
64    default:
65      NOTIMPLEMENTED();
66      return nullptr;
67  }
68}
69
70}  // namespace crypto
71