// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_CRYPTO_H_ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_CRYPTO_H_ #include "base/containers/span.h" #include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "third_party/blink/renderer/platform/wtf/hash_functions.h" #include "third_party/blink/renderer/platform/wtf/text/string_hasher.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" #include "third_party/blink/renderer/platform/wtf/vector.h" #include "third_party/boringssl/src/include/openssl/digest.h" namespace blink { static const size_t kMaxDigestSize = 64; typedef Vector DigestValue; enum HashAlgorithm { kHashAlgorithmSha1, kHashAlgorithmSha256, kHashAlgorithmSha384, kHashAlgorithmSha512 }; PLATFORM_EXPORT bool ComputeDigest(HashAlgorithm, const char* digestable, size_t length, DigestValue& digest_result); class PLATFORM_EXPORT Digestor { public: explicit Digestor(HashAlgorithm); ~Digestor(); bool has_failed() const { return has_failed_; } // Return false on failure. These do nothing once the |has_failed_| flag is // set. This object cannot be reused; do not update it after Finish. bool Update(base::span); bool UpdateUtf8(const String&, WTF::UTF8ConversionMode = WTF::kLenientUTF8Conversion); bool Finish(DigestValue&); private: bssl::ScopedEVP_MD_CTX digest_context_; bool has_failed_ = false; }; } // namespace blink namespace WTF { struct DigestValueHash { STATIC_ONLY(DigestValueHash); static unsigned GetHash(const blink::DigestValue& v) { return StringHasher::ComputeHash(v.data(), v.size()); } static bool Equal(const blink::DigestValue& a, const blink::DigestValue& b) { return a == b; } static const bool safe_to_compare_to_empty_or_deleted = true; }; template <> struct DefaultHash { STATIC_ONLY(DefaultHash); typedef DigestValueHash Hash; }; template <> struct DefaultHash { STATIC_ONLY(DefaultHash); typedef IntHash Hash; }; template <> struct HashTraits : UnsignedWithZeroKeyHashTraits { STATIC_ONLY(HashTraits); }; } // namespace WTF #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_CRYPTO_H_