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