xref: /aosp_15_r20/external/openscreen/util/crypto/secure_hash.cc (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 #include "util/crypto/secure_hash.h"
6*3f982cf4SFabien Sanglard 
7*3f982cf4SFabien Sanglard #include <stddef.h>
8*3f982cf4SFabien Sanglard 
9*3f982cf4SFabien Sanglard #include <cstring>
10*3f982cf4SFabien Sanglard 
11*3f982cf4SFabien Sanglard #include "openssl/mem.h"
12*3f982cf4SFabien Sanglard #include "util/crypto/openssl_util.h"
13*3f982cf4SFabien Sanglard #include "util/osp_logging.h"
14*3f982cf4SFabien Sanglard 
15*3f982cf4SFabien Sanglard namespace openscreen {
16*3f982cf4SFabien Sanglard 
SecureHash(const EVP_MD * type)17*3f982cf4SFabien Sanglard SecureHash::SecureHash(const EVP_MD* type) {
18*3f982cf4SFabien Sanglard   EVP_DigestInit(ctx_.get(), type);
19*3f982cf4SFabien Sanglard }
20*3f982cf4SFabien Sanglard 
SecureHash(const SecureHash & other)21*3f982cf4SFabien Sanglard SecureHash::SecureHash(const SecureHash& other) {
22*3f982cf4SFabien Sanglard   *this = other;
23*3f982cf4SFabien Sanglard }
24*3f982cf4SFabien Sanglard 
operator =(const SecureHash & other)25*3f982cf4SFabien Sanglard SecureHash& SecureHash::operator=(const SecureHash& other) {
26*3f982cf4SFabien Sanglard   EVP_MD_CTX_copy_ex(this->ctx_.get(), other.ctx_.get());
27*3f982cf4SFabien Sanglard   return *this;
28*3f982cf4SFabien Sanglard }
29*3f982cf4SFabien Sanglard 
30*3f982cf4SFabien Sanglard SecureHash::SecureHash(SecureHash&& other) = default;
31*3f982cf4SFabien Sanglard SecureHash& SecureHash::operator=(SecureHash&& other) = default;
32*3f982cf4SFabien Sanglard 
33*3f982cf4SFabien Sanglard SecureHash::~SecureHash() = default;
34*3f982cf4SFabien Sanglard 
Update(const uint8_t * input,size_t len)35*3f982cf4SFabien Sanglard void SecureHash::Update(const uint8_t* input, size_t len) {
36*3f982cf4SFabien Sanglard   EVP_DigestUpdate(ctx_.get(), input, len);
37*3f982cf4SFabien Sanglard }
38*3f982cf4SFabien Sanglard 
Finish(uint8_t * output)39*3f982cf4SFabien Sanglard void SecureHash::Finish(uint8_t* output) {
40*3f982cf4SFabien Sanglard   EVP_DigestFinal(ctx_.get(), output, nullptr);
41*3f982cf4SFabien Sanglard }
42*3f982cf4SFabien Sanglard 
Update(const std::string & input)43*3f982cf4SFabien Sanglard void SecureHash::Update(const std::string& input) {
44*3f982cf4SFabien Sanglard   Update(reinterpret_cast<const uint8_t*>(input.data()), input.length());
45*3f982cf4SFabien Sanglard }
46*3f982cf4SFabien Sanglard 
Finish(char * output)47*3f982cf4SFabien Sanglard void SecureHash::Finish(char* output) {
48*3f982cf4SFabien Sanglard   Finish(reinterpret_cast<uint8_t*>(output));
49*3f982cf4SFabien Sanglard }
50*3f982cf4SFabien Sanglard 
GetHashLength() const51*3f982cf4SFabien Sanglard size_t SecureHash::GetHashLength() const {
52*3f982cf4SFabien Sanglard   return EVP_MD_CTX_size(ctx_.get());
53*3f982cf4SFabien Sanglard }
54*3f982cf4SFabien Sanglard 
55*3f982cf4SFabien Sanglard }  // namespace openscreen
56