1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #include "crypto/secure_hash.h"
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker #if defined(OPENSSL_IS_BORINGSSL)
8*635a8641SAndroid Build Coastguard Worker #include <openssl/mem.h>
9*635a8641SAndroid Build Coastguard Worker #else
10*635a8641SAndroid Build Coastguard Worker #include <openssl/crypto.h>
11*635a8641SAndroid Build Coastguard Worker #endif
12*635a8641SAndroid Build Coastguard Worker #include <openssl/sha.h>
13*635a8641SAndroid Build Coastguard Worker #include <stddef.h>
14*635a8641SAndroid Build Coastguard Worker
15*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
16*635a8641SAndroid Build Coastguard Worker #include "base/memory/ptr_util.h"
17*635a8641SAndroid Build Coastguard Worker #include "base/pickle.h"
18*635a8641SAndroid Build Coastguard Worker #include "crypto/openssl_util.h"
19*635a8641SAndroid Build Coastguard Worker
20*635a8641SAndroid Build Coastguard Worker namespace crypto {
21*635a8641SAndroid Build Coastguard Worker
22*635a8641SAndroid Build Coastguard Worker namespace {
23*635a8641SAndroid Build Coastguard Worker
24*635a8641SAndroid Build Coastguard Worker class SecureHashSHA256 : public SecureHash {
25*635a8641SAndroid Build Coastguard Worker public:
SecureHashSHA256()26*635a8641SAndroid Build Coastguard Worker SecureHashSHA256() {
27*635a8641SAndroid Build Coastguard Worker SHA256_Init(&ctx_);
28*635a8641SAndroid Build Coastguard Worker }
29*635a8641SAndroid Build Coastguard Worker
SecureHashSHA256(const SecureHashSHA256 & other)30*635a8641SAndroid Build Coastguard Worker SecureHashSHA256(const SecureHashSHA256& other) {
31*635a8641SAndroid Build Coastguard Worker memcpy(&ctx_, &other.ctx_, sizeof(ctx_));
32*635a8641SAndroid Build Coastguard Worker }
33*635a8641SAndroid Build Coastguard Worker
~SecureHashSHA256()34*635a8641SAndroid Build Coastguard Worker ~SecureHashSHA256() override {
35*635a8641SAndroid Build Coastguard Worker OPENSSL_cleanse(&ctx_, sizeof(ctx_));
36*635a8641SAndroid Build Coastguard Worker }
37*635a8641SAndroid Build Coastguard Worker
Update(const void * input,size_t len)38*635a8641SAndroid Build Coastguard Worker void Update(const void* input, size_t len) override {
39*635a8641SAndroid Build Coastguard Worker SHA256_Update(&ctx_, static_cast<const unsigned char*>(input), len);
40*635a8641SAndroid Build Coastguard Worker }
41*635a8641SAndroid Build Coastguard Worker
Finish(void * output,size_t len)42*635a8641SAndroid Build Coastguard Worker void Finish(void* output, size_t len) override {
43*635a8641SAndroid Build Coastguard Worker ScopedOpenSSLSafeSizeBuffer<SHA256_DIGEST_LENGTH> result(
44*635a8641SAndroid Build Coastguard Worker static_cast<unsigned char*>(output), len);
45*635a8641SAndroid Build Coastguard Worker SHA256_Final(result.safe_buffer(), &ctx_);
46*635a8641SAndroid Build Coastguard Worker }
47*635a8641SAndroid Build Coastguard Worker
Clone() const48*635a8641SAndroid Build Coastguard Worker std::unique_ptr<SecureHash> Clone() const override {
49*635a8641SAndroid Build Coastguard Worker return std::make_unique<SecureHashSHA256>(*this);
50*635a8641SAndroid Build Coastguard Worker }
51*635a8641SAndroid Build Coastguard Worker
GetHashLength() const52*635a8641SAndroid Build Coastguard Worker size_t GetHashLength() const override { return SHA256_DIGEST_LENGTH; }
53*635a8641SAndroid Build Coastguard Worker
54*635a8641SAndroid Build Coastguard Worker private:
55*635a8641SAndroid Build Coastguard Worker SHA256_CTX ctx_;
56*635a8641SAndroid Build Coastguard Worker };
57*635a8641SAndroid Build Coastguard Worker
58*635a8641SAndroid Build Coastguard Worker } // namespace
59*635a8641SAndroid Build Coastguard Worker
Create(Algorithm algorithm)60*635a8641SAndroid Build Coastguard Worker std::unique_ptr<SecureHash> SecureHash::Create(Algorithm algorithm) {
61*635a8641SAndroid Build Coastguard Worker switch (algorithm) {
62*635a8641SAndroid Build Coastguard Worker case SHA256:
63*635a8641SAndroid Build Coastguard Worker return std::make_unique<SecureHashSHA256>();
64*635a8641SAndroid Build Coastguard Worker default:
65*635a8641SAndroid Build Coastguard Worker NOTIMPLEMENTED();
66*635a8641SAndroid Build Coastguard Worker return nullptr;
67*635a8641SAndroid Build Coastguard Worker }
68*635a8641SAndroid Build Coastguard Worker }
69*635a8641SAndroid Build Coastguard Worker
70*635a8641SAndroid Build Coastguard Worker } // namespace crypto
71