xref: /aosp_15_r20/external/openscreen/util/crypto/secure_hash.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard // Copyright 2019 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard 
5*3f982cf4SFabien Sanglard #ifndef UTIL_CRYPTO_SECURE_HASH_H_
6*3f982cf4SFabien Sanglard #define UTIL_CRYPTO_SECURE_HASH_H_
7*3f982cf4SFabien Sanglard 
8*3f982cf4SFabien Sanglard #include <stddef.h>
9*3f982cf4SFabien Sanglard 
10*3f982cf4SFabien Sanglard #include <memory>
11*3f982cf4SFabien Sanglard #include <string>
12*3f982cf4SFabien Sanglard 
13*3f982cf4SFabien Sanglard #include "openssl/base.h"
14*3f982cf4SFabien Sanglard #include "openssl/evp.h"
15*3f982cf4SFabien Sanglard #include "platform/base/macros.h"
16*3f982cf4SFabien Sanglard 
17*3f982cf4SFabien Sanglard namespace openscreen {
18*3f982cf4SFabien Sanglard 
19*3f982cf4SFabien Sanglard // A wrapper to calculate secure hashes incrementally, allowing to
20*3f982cf4SFabien Sanglard // be used when the full input is not known in advance. The end result will the
21*3f982cf4SFabien Sanglard // same as if we have the full input in advance.
22*3f982cf4SFabien Sanglard class SecureHash {
23*3f982cf4SFabien Sanglard  public:
24*3f982cf4SFabien Sanglard   explicit SecureHash(const EVP_MD* type);
25*3f982cf4SFabien Sanglard   SecureHash(const SecureHash& other);
26*3f982cf4SFabien Sanglard   SecureHash(SecureHash&& other);
27*3f982cf4SFabien Sanglard   SecureHash& operator=(const SecureHash& other);
28*3f982cf4SFabien Sanglard   SecureHash& operator=(SecureHash&& other);
29*3f982cf4SFabien Sanglard 
30*3f982cf4SFabien Sanglard   ~SecureHash();
31*3f982cf4SFabien Sanglard 
32*3f982cf4SFabien Sanglard   void Update(const uint8_t* input, size_t len);
33*3f982cf4SFabien Sanglard   void Finish(uint8_t* output);
34*3f982cf4SFabien Sanglard 
35*3f982cf4SFabien Sanglard   // Handy versions that do the kludgy casting to unsigned in the background.
36*3f982cf4SFabien Sanglard   void Update(const std::string& input);
37*3f982cf4SFabien Sanglard   void Finish(char* output);
38*3f982cf4SFabien Sanglard 
39*3f982cf4SFabien Sanglard   size_t GetHashLength() const;
40*3f982cf4SFabien Sanglard 
41*3f982cf4SFabien Sanglard  private:
42*3f982cf4SFabien Sanglard   bssl::UniquePtr<EVP_MD_CTX> ctx_ =
43*3f982cf4SFabien Sanglard       bssl::UniquePtr<EVP_MD_CTX>(EVP_MD_CTX_new());
44*3f982cf4SFabien Sanglard };
45*3f982cf4SFabien Sanglard 
46*3f982cf4SFabien Sanglard }  // namespace openscreen
47*3f982cf4SFabien Sanglard 
48*3f982cf4SFabien Sanglard #endif  // UTIL_CRYPTO_SECURE_HASH_H_
49