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