xref: /aosp_15_r20/external/libchrome/crypto/secure_hash.h (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 #ifndef CRYPTO_SECURE_HASH_H_
6*635a8641SAndroid Build Coastguard Worker #define CRYPTO_SECURE_HASH_H_
7*635a8641SAndroid Build Coastguard Worker 
8*635a8641SAndroid Build Coastguard Worker #include <stddef.h>
9*635a8641SAndroid Build Coastguard Worker 
10*635a8641SAndroid Build Coastguard Worker #include <memory>
11*635a8641SAndroid Build Coastguard Worker 
12*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
13*635a8641SAndroid Build Coastguard Worker #include "crypto/crypto_export.h"
14*635a8641SAndroid Build Coastguard Worker 
15*635a8641SAndroid Build Coastguard Worker namespace crypto {
16*635a8641SAndroid Build Coastguard Worker 
17*635a8641SAndroid Build Coastguard Worker // A wrapper to calculate secure hashes incrementally, allowing to
18*635a8641SAndroid Build Coastguard Worker // be used when the full input is not known in advance. The end result will the
19*635a8641SAndroid Build Coastguard Worker // same as if we have the full input in advance.
20*635a8641SAndroid Build Coastguard Worker class CRYPTO_EXPORT SecureHash {
21*635a8641SAndroid Build Coastguard Worker  public:
22*635a8641SAndroid Build Coastguard Worker   enum Algorithm {
23*635a8641SAndroid Build Coastguard Worker     SHA256,
24*635a8641SAndroid Build Coastguard Worker   };
~SecureHash()25*635a8641SAndroid Build Coastguard Worker   virtual ~SecureHash() {}
26*635a8641SAndroid Build Coastguard Worker 
27*635a8641SAndroid Build Coastguard Worker   static std::unique_ptr<SecureHash> Create(Algorithm type);
28*635a8641SAndroid Build Coastguard Worker 
29*635a8641SAndroid Build Coastguard Worker   virtual void Update(const void* input, size_t len) = 0;
30*635a8641SAndroid Build Coastguard Worker   virtual void Finish(void* output, size_t len) = 0;
31*635a8641SAndroid Build Coastguard Worker   virtual size_t GetHashLength() const = 0;
32*635a8641SAndroid Build Coastguard Worker 
33*635a8641SAndroid Build Coastguard Worker   // Create a clone of this SecureHash. The returned clone and this both
34*635a8641SAndroid Build Coastguard Worker   // represent the same hash state. But from this point on, calling
35*635a8641SAndroid Build Coastguard Worker   // Update()/Finish() on either doesn't affect the state of the other.
36*635a8641SAndroid Build Coastguard Worker   virtual std::unique_ptr<SecureHash> Clone() const = 0;
37*635a8641SAndroid Build Coastguard Worker 
38*635a8641SAndroid Build Coastguard Worker  protected:
SecureHash()39*635a8641SAndroid Build Coastguard Worker   SecureHash() {}
40*635a8641SAndroid Build Coastguard Worker 
41*635a8641SAndroid Build Coastguard Worker  private:
42*635a8641SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(SecureHash);
43*635a8641SAndroid Build Coastguard Worker };
44*635a8641SAndroid Build Coastguard Worker 
45*635a8641SAndroid Build Coastguard Worker }  // namespace crypto
46*635a8641SAndroid Build Coastguard Worker 
47*635a8641SAndroid Build Coastguard Worker #endif  // CRYPTO_SECURE_HASH_H_
48