xref: /aosp_15_r20/external/cronet/crypto/secure_hash.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "crypto/secure_hash.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include "base/memory/ptr_util.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/notreached.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/pickle.h"
12*6777b538SAndroid Build Coastguard Worker #include "crypto/openssl_util.h"
13*6777b538SAndroid Build Coastguard Worker #include "third_party/boringssl/src/include/openssl/mem.h"
14*6777b538SAndroid Build Coastguard Worker #include "third_party/boringssl/src/include/openssl/sha.h"
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker namespace crypto {
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker namespace {
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker class SecureHashSHA256 : public SecureHash {
21*6777b538SAndroid Build Coastguard Worker  public:
SecureHashSHA256()22*6777b538SAndroid Build Coastguard Worker   SecureHashSHA256() {
23*6777b538SAndroid Build Coastguard Worker     // Ensure that CPU features detection is performed before using
24*6777b538SAndroid Build Coastguard Worker     // BoringSSL. This will enable hw accelerated implementations.
25*6777b538SAndroid Build Coastguard Worker     EnsureOpenSSLInit();
26*6777b538SAndroid Build Coastguard Worker     SHA256_Init(&ctx_);
27*6777b538SAndroid Build Coastguard Worker   }
28*6777b538SAndroid Build Coastguard Worker 
SecureHashSHA256(const SecureHashSHA256 & other)29*6777b538SAndroid Build Coastguard Worker   SecureHashSHA256(const SecureHashSHA256& other) {
30*6777b538SAndroid Build Coastguard Worker     memcpy(&ctx_, &other.ctx_, sizeof(ctx_));
31*6777b538SAndroid Build Coastguard Worker   }
32*6777b538SAndroid Build Coastguard Worker 
~SecureHashSHA256()33*6777b538SAndroid Build Coastguard Worker   ~SecureHashSHA256() override {
34*6777b538SAndroid Build Coastguard Worker     OPENSSL_cleanse(&ctx_, sizeof(ctx_));
35*6777b538SAndroid Build Coastguard Worker   }
36*6777b538SAndroid Build Coastguard Worker 
Update(const void * input,size_t len)37*6777b538SAndroid Build Coastguard Worker   void Update(const void* input, size_t len) override {
38*6777b538SAndroid Build Coastguard Worker     SHA256_Update(&ctx_, static_cast<const unsigned char*>(input), len);
39*6777b538SAndroid Build Coastguard Worker   }
40*6777b538SAndroid Build Coastguard Worker 
Finish(void * output,size_t len)41*6777b538SAndroid Build Coastguard Worker   void Finish(void* output, size_t len) override {
42*6777b538SAndroid Build Coastguard Worker     ScopedOpenSSLSafeSizeBuffer<SHA256_DIGEST_LENGTH> result(
43*6777b538SAndroid Build Coastguard Worker         static_cast<unsigned char*>(output), len);
44*6777b538SAndroid Build Coastguard Worker     SHA256_Final(result.safe_buffer(), &ctx_);
45*6777b538SAndroid Build Coastguard Worker   }
46*6777b538SAndroid Build Coastguard Worker 
Clone() const47*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<SecureHash> Clone() const override {
48*6777b538SAndroid Build Coastguard Worker     return std::make_unique<SecureHashSHA256>(*this);
49*6777b538SAndroid Build Coastguard Worker   }
50*6777b538SAndroid Build Coastguard Worker 
GetHashLength() const51*6777b538SAndroid Build Coastguard Worker   size_t GetHashLength() const override { return SHA256_DIGEST_LENGTH; }
52*6777b538SAndroid Build Coastguard Worker 
53*6777b538SAndroid Build Coastguard Worker  private:
54*6777b538SAndroid Build Coastguard Worker   SHA256_CTX ctx_;
55*6777b538SAndroid Build Coastguard Worker };
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker class SecureHashSHA512 : public SecureHash {
58*6777b538SAndroid Build Coastguard Worker  public:
SecureHashSHA512()59*6777b538SAndroid Build Coastguard Worker   SecureHashSHA512() {
60*6777b538SAndroid Build Coastguard Worker     // Ensure that CPU features detection is performed before using
61*6777b538SAndroid Build Coastguard Worker     // BoringSSL. This will enable hw accelerated implementations.
62*6777b538SAndroid Build Coastguard Worker     EnsureOpenSSLInit();
63*6777b538SAndroid Build Coastguard Worker     SHA512_Init(&ctx_);
64*6777b538SAndroid Build Coastguard Worker   }
65*6777b538SAndroid Build Coastguard Worker 
SecureHashSHA512(const SecureHashSHA512 & other)66*6777b538SAndroid Build Coastguard Worker   SecureHashSHA512(const SecureHashSHA512& other) {
67*6777b538SAndroid Build Coastguard Worker     memcpy(&ctx_, &other.ctx_, sizeof(ctx_));
68*6777b538SAndroid Build Coastguard Worker   }
69*6777b538SAndroid Build Coastguard Worker 
~SecureHashSHA512()70*6777b538SAndroid Build Coastguard Worker   ~SecureHashSHA512() override { OPENSSL_cleanse(&ctx_, sizeof(ctx_)); }
71*6777b538SAndroid Build Coastguard Worker 
Update(const void * input,size_t len)72*6777b538SAndroid Build Coastguard Worker   void Update(const void* input, size_t len) override {
73*6777b538SAndroid Build Coastguard Worker     SHA512_Update(&ctx_, static_cast<const unsigned char*>(input), len);
74*6777b538SAndroid Build Coastguard Worker   }
75*6777b538SAndroid Build Coastguard Worker 
Finish(void * output,size_t len)76*6777b538SAndroid Build Coastguard Worker   void Finish(void* output, size_t len) override {
77*6777b538SAndroid Build Coastguard Worker     ScopedOpenSSLSafeSizeBuffer<SHA512_DIGEST_LENGTH> result(
78*6777b538SAndroid Build Coastguard Worker         static_cast<unsigned char*>(output), len);
79*6777b538SAndroid Build Coastguard Worker     SHA512_Final(result.safe_buffer(), &ctx_);
80*6777b538SAndroid Build Coastguard Worker   }
81*6777b538SAndroid Build Coastguard Worker 
Clone() const82*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<SecureHash> Clone() const override {
83*6777b538SAndroid Build Coastguard Worker     return std::make_unique<SecureHashSHA512>(*this);
84*6777b538SAndroid Build Coastguard Worker   }
85*6777b538SAndroid Build Coastguard Worker 
GetHashLength() const86*6777b538SAndroid Build Coastguard Worker   size_t GetHashLength() const override { return SHA512_DIGEST_LENGTH; }
87*6777b538SAndroid Build Coastguard Worker 
88*6777b538SAndroid Build Coastguard Worker  private:
89*6777b538SAndroid Build Coastguard Worker   SHA512_CTX ctx_;
90*6777b538SAndroid Build Coastguard Worker };
91*6777b538SAndroid Build Coastguard Worker 
92*6777b538SAndroid Build Coastguard Worker }  // namespace
93*6777b538SAndroid Build Coastguard Worker 
Create(Algorithm algorithm)94*6777b538SAndroid Build Coastguard Worker std::unique_ptr<SecureHash> SecureHash::Create(Algorithm algorithm) {
95*6777b538SAndroid Build Coastguard Worker   switch (algorithm) {
96*6777b538SAndroid Build Coastguard Worker     case SHA256:
97*6777b538SAndroid Build Coastguard Worker       return std::make_unique<SecureHashSHA256>();
98*6777b538SAndroid Build Coastguard Worker     case SHA512:
99*6777b538SAndroid Build Coastguard Worker       return std::make_unique<SecureHashSHA512>();
100*6777b538SAndroid Build Coastguard Worker     default:
101*6777b538SAndroid Build Coastguard Worker       NOTIMPLEMENTED();
102*6777b538SAndroid Build Coastguard Worker       return nullptr;
103*6777b538SAndroid Build Coastguard Worker   }
104*6777b538SAndroid Build Coastguard Worker }
105*6777b538SAndroid Build Coastguard Worker 
106*6777b538SAndroid Build Coastguard Worker }  // namespace crypto
107