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 SanglardSecureHash::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 SanglardSecureHash::SecureHash(const SecureHash& other) { 22*3f982cf4SFabien Sanglard *this = other; 23*3f982cf4SFabien Sanglard } 24*3f982cf4SFabien Sanglard operator =(const SecureHash & other)25*3f982cf4SFabien SanglardSecureHash& 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 Sanglardvoid 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 Sanglardvoid 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 Sanglardvoid 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 Sanglardvoid SecureHash::Finish(char* output) { 48*3f982cf4SFabien Sanglard Finish(reinterpret_cast<uint8_t*>(output)); 49*3f982cf4SFabien Sanglard } 50*3f982cf4SFabien Sanglard GetHashLength() const51*3f982cf4SFabien Sanglardsize_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