xref: /aosp_15_r20/external/libchrome/crypto/secure_hash.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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