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