| // Copyright 2022 The ChromiumOS Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef LIBHWSEC_BACKEND_DIGEST_ALGORITHMS_H_ |
| #define LIBHWSEC_BACKEND_DIGEST_ALGORITHMS_H_ |
| |
| #include <brillo/secure_blob.h> |
| #include <openssl/evp.h> |
| |
| #include "libhwsec/status.h" |
| |
| namespace hwsec { |
| |
| enum class DigestAlgorithm { |
| kNoDigest, |
| kMd5, |
| kSha1, |
| kSha224, |
| kSha256, |
| kSha384, |
| kSha512, |
| kMaxValue = kSha512, |
| }; |
| |
| struct ParsedDigestInfo { |
| DigestAlgorithm algorithm; |
| brillo::Blob blob; |
| }; |
| |
| inline constexpr size_t GetDigestLength(DigestAlgorithm algo) { |
| switch (algo) { |
| case DigestAlgorithm::kNoDigest: |
| return 0; |
| case DigestAlgorithm::kMd5: |
| return 16; |
| case DigestAlgorithm::kSha1: |
| return 20; |
| case DigestAlgorithm::kSha224: |
| return 28; |
| case DigestAlgorithm::kSha256: |
| return 32; |
| case DigestAlgorithm::kSha384: |
| return 48; |
| case DigestAlgorithm::kSha512: |
| return 64; |
| } |
| } |
| |
| inline constexpr const EVP_MD* GetOpenSSLDigest(DigestAlgorithm algo) { |
| switch (algo) { |
| case DigestAlgorithm::kNoDigest: |
| return nullptr; |
| case DigestAlgorithm::kMd5: |
| return EVP_md5(); |
| case DigestAlgorithm::kSha1: |
| return EVP_sha1(); |
| case DigestAlgorithm::kSha224: |
| return EVP_sha224(); |
| case DigestAlgorithm::kSha256: |
| return EVP_sha256(); |
| case DigestAlgorithm::kSha384: |
| return EVP_sha384(); |
| case DigestAlgorithm::kSha512: |
| return EVP_sha512(); |
| } |
| } |
| |
| // Parse the matched digest info from the blob. |
| std::optional<ParsedDigestInfo> ParseDigestInfo(const brillo::Blob& input); |
| |
| StatusOr<brillo::Blob> GetDigestAlgorithmEncoding(DigestAlgorithm algo); |
| StatusOr<brillo::Blob> DigestData(DigestAlgorithm algo, brillo::Blob data); |
| |
| } // namespace hwsec |
| |
| #endif // LIBHWSEC_BACKEND_DIGEST_ALGORITHMS_H_ |