• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
13 namespace crypto {
14 
15 namespace {
16 
17 class SecureHashSHA256OpenSSL : public SecureHash {
18  public:
SecureHashSHA256OpenSSL()19   SecureHashSHA256OpenSSL() {
20     SHA256_Init(&ctx_);
21   }
22 
~SecureHashSHA256OpenSSL()23   virtual ~SecureHashSHA256OpenSSL() {
24     OPENSSL_cleanse(&ctx_, sizeof(ctx_));
25   }
26 
Update(const void * input,size_t len)27   virtual void Update(const void* input, size_t len) {
28     SHA256_Update(&ctx_, static_cast<const unsigned char*>(input), len);
29   }
30 
Finish(void * output,size_t len)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 
Create(Algorithm algorithm)43 SecureHash* 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