1// Copyright (c) 2011 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#include <openssl/ssl.h>
8
9#include "base/basictypes.h"
10#include "base/logging.h"
11#include "crypto/openssl_util.h"
12
13namespace crypto {
14
15namespace {
16
17class SecureHashSHA256OpenSSL : public SecureHash {
18 public:
19  SecureHashSHA256OpenSSL() {
20    SHA256_Init(&ctx_);
21  }
22
23  virtual ~SecureHashSHA256OpenSSL() {
24    OPENSSL_cleanse(&ctx_, sizeof(ctx_));
25  }
26
27  virtual void Update(const void* input, size_t len) {
28    SHA256_Update(&ctx_, static_cast<const unsigned char*>(input), len);
29  }
30
31  virtual void Finish(void* output, size_t len) {
32    ScopedOpenSSLSafeSizeBuffer<SHA256_DIGEST_LENGTH> result(
33        static_cast<unsigned char*>(output), len);
34    SHA256_Final(result.safe_buffer(), &ctx_);
35  }
36
37 private:
38  SHA256_CTX ctx_;
39};
40
41}  // namespace
42
43SecureHash* SecureHash::Create(Algorithm algorithm) {
44  switch (algorithm) {
45    case SHA256:
46      return new SecureHashSHA256OpenSSL();
47    default:
48      NOTIMPLEMENTED();
49      return NULL;
50  }
51}
52
53}  // namespace crypto
54