xref: /aosp_15_r20/external/gsc-utils/tpm_generated/secure_hash.cc (revision 4f2df630800bdcf1d4f0decf95d8a1cb87344f5f)
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