| // Copyright 2020 The Chromium OS 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 HWSEC_TEST_UTILS_COMMON_ATTESTATION_CRYPTO_H_ |
| #define HWSEC_TEST_UTILS_COMMON_ATTESTATION_CRYPTO_H_ |
| |
| #include <string> |
| |
| #include <attestation/proto_bindings/attestation_ca.pb.h> |
| #include <base/optional.h> |
| #include <crypto/scoped_openssl_types.h> |
| |
| namespace hwsec_test_utils { |
| namespace attestation_crypto { |
| |
| // A functional interface that derives a input seed to the pair of AES and HMAC |
| // key. |
| class KeyDeriverBase { |
| public: |
| KeyDeriverBase() = default; |
| ~KeyDeriverBase() = default; |
| |
| // Not copyable or movable. |
| KeyDeriverBase(const KeyDeriverBase&) = delete; |
| KeyDeriverBase(KeyDeriverBase&&) = delete; |
| KeyDeriverBase& operator=(const KeyDeriverBase&) = delete; |
| KeyDeriverBase& operator=(KeyDeriverBase&&) = delete; |
| |
| virtual std::string ToAesKey(const std::string& seed) const = 0; |
| virtual std::string ToHmacKey(const std::string& seed) const = 0; |
| }; |
| |
| // |KeyDeriverDirect| returns the input |seed| as the AES key and HMAC key |
| // directly. |
| class KeyDeriverDirect : public KeyDeriverBase { |
| public: |
| KeyDeriverDirect() = default; |
| ~KeyDeriverDirect() = default; |
| |
| // Not copyable or movable. |
| KeyDeriverDirect(const KeyDeriverDirect&) = delete; |
| KeyDeriverDirect(KeyDeriverDirect&&) = delete; |
| KeyDeriverDirect& operator=(const KeyDeriverDirect&) = delete; |
| KeyDeriverDirect& operator=(KeyDeriverDirect&&) = delete; |
| |
| // Overrides. |
| std::string ToAesKey(const std::string& seed) const override; |
| std::string ToHmacKey(const std::string& seed) const override; |
| }; |
| |
| // Derives a seed to AES and HMAC key with Sha256(HEADER||seed), where the |
| // HEADER is "ENCRYPT"/"HMAC", respectively. |
| class KeyDeriverSha256WithHeader : public KeyDeriverBase { |
| public: |
| KeyDeriverSha256WithHeader() = default; |
| ~KeyDeriverSha256WithHeader() = default; |
| |
| // Not copyable or movable. |
| KeyDeriverSha256WithHeader(const KeyDeriverSha256WithHeader&) = delete; |
| KeyDeriverSha256WithHeader(KeyDeriverSha256WithHeader&&) = delete; |
| KeyDeriverSha256WithHeader& operator=(const KeyDeriverSha256WithHeader&) = |
| delete; |
| KeyDeriverSha256WithHeader& operator=(KeyDeriverSha256WithHeader&&) = delete; |
| |
| // Overrides. |
| std::string ToAesKey(const std::string& seed) const override; |
| std::string ToHmacKey(const std::string& seed) const override; |
| }; |
| |
| // Indicates the success of an operation or the failure case of an operation. |
| enum class ReturnStatus { |
| kSuccess, |
| kUnwrapKey, |
| kDecrypt, |
| kHmac, |
| kFailure, |
| }; |
| |
| // Decrypts the seed from |encrypted_data_proto| and derive it to the AES and |
| // the HMAC key. Then, decrypts the data in |encrypted_data_proto| and set the |
| // decrypted result to |decrypted|. In case of any error, returns the |
| // corresponding |ReturnStatus|. Otherwise, returns |kSuccess|. The |
| // implementation hardcodes the encryption algorithm to AES-256 with CBC cipher |
| // mode and the digest algorithm for HMAC to sha512, for that is the only case |
| // used in attestation. |
| ReturnStatus Decrypt(const attestation::EncryptedData& encrypted_data_proto, |
| const crypto::ScopedEVP_PKEY& key, |
| const KeyDeriverBase& key_derivation, |
| std::string* decrypted); |
| |
| } // namespace attestation_crypto |
| |
| } // namespace hwsec_test_utils |
| |
| #endif // HWSEC_TEST_UTILS_COMMON_ATTESTATION_CRYPTO_H_ |