| // 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_FUZZED_RECOVERY_CRYPTO_H_ |
| #define LIBHWSEC_FUZZED_RECOVERY_CRYPTO_H_ |
| |
| #include <optional> |
| #include <string> |
| #include <type_traits> |
| |
| #include <brillo/secure_blob.h> |
| #include <fuzzer/FuzzedDataProvider.h> |
| #include <libhwsec-foundation/crypto/elliptic_curve.h> |
| |
| #include "libhwsec/backend/recovery_crypto.h" |
| #include "libhwsec/fuzzed/basic_objects.h" |
| |
| namespace hwsec { |
| |
| template <> |
| struct FuzzedObject<EncryptEccPrivateKeyResponse> { |
| EncryptEccPrivateKeyResponse operator()(FuzzedDataProvider& provider) const { |
| return EncryptEccPrivateKeyResponse{ |
| .encrypted_own_priv_key = FuzzedObject<brillo::Blob>()(provider), |
| .extended_pcr_bound_own_priv_key = |
| FuzzedObject<brillo::Blob>()(provider), |
| }; |
| } |
| }; |
| |
| template <> |
| struct FuzzedObject<RecoveryCryptoRsaKeyPair> { |
| RecoveryCryptoRsaKeyPair operator()(FuzzedDataProvider& provider) const { |
| return RecoveryCryptoRsaKeyPair{ |
| .encrypted_rsa_private_key = FuzzedObject<brillo::Blob>()(provider), |
| .rsa_public_key_spki_der = FuzzedObject<brillo::Blob>()(provider), |
| }; |
| } |
| }; |
| |
| template <> |
| struct FuzzedObject<BN_CTX&> { |
| BN_CTX& operator()(FuzzedDataProvider& provider) const { |
| using hwsec_foundation::CreateBigNumContext; |
| using hwsec_foundation::ScopedBN_CTX; |
| static ScopedBN_CTX context = CreateBigNumContext(); |
| CHECK(context.get()); |
| return *context; |
| } |
| }; |
| |
| template <> |
| struct FuzzedObject<BN_CTX*> { |
| BN_CTX* operator()(FuzzedDataProvider& provider) const { |
| if (provider.ConsumeBool()) { |
| return nullptr; |
| } |
| return &FuzzedObject<BN_CTX&>()(provider); |
| } |
| }; |
| |
| template <> |
| struct FuzzedObject<const hwsec_foundation::EllipticCurve&> { |
| const hwsec_foundation::EllipticCurve& operator()( |
| FuzzedDataProvider& provider) const { |
| enum class FuzzCurve { |
| k256, |
| k384, |
| k521, |
| kMaxValue = k521, |
| }; |
| |
| using hwsec_foundation::EllipticCurve; |
| |
| static std::optional<EllipticCurve> ec_256 = |
| EllipticCurve::Create(EllipticCurve::CurveType::kPrime256, |
| &FuzzedObject<BN_CTX&>()(provider)); |
| static std::optional<EllipticCurve> ec_384 = |
| EllipticCurve::Create(EllipticCurve::CurveType::kPrime384, |
| &FuzzedObject<BN_CTX&>()(provider)); |
| static std::optional<EllipticCurve> ec_521 = |
| EllipticCurve::Create(EllipticCurve::CurveType::kPrime521, |
| &FuzzedObject<BN_CTX&>()(provider)); |
| |
| switch (provider.ConsumeEnum<FuzzCurve>()) { |
| case FuzzCurve::k256: |
| CHECK(ec_256.has_value()); |
| return *ec_256; |
| case FuzzCurve::k384: |
| CHECK(ec_384.has_value()); |
| return *ec_384; |
| case FuzzCurve::k521: |
| CHECK(ec_521.has_value()); |
| return *ec_521; |
| } |
| } |
| }; |
| |
| template <> |
| struct FuzzedObject<crypto::ScopedEC_KEY> { |
| crypto::ScopedEC_KEY operator()(FuzzedDataProvider& provider) const { |
| if (provider.ConsumeBool()) { |
| return nullptr; |
| } |
| |
| const hwsec_foundation::EllipticCurve& ec = |
| FuzzedObject<const hwsec_foundation::EllipticCurve&>()(provider); |
| return ec.GenerateKey(FuzzedObject<BN_CTX*>()(provider)); |
| } |
| }; |
| |
| template <> |
| struct FuzzedObject<EncryptEccPrivateKeyRequest> { |
| EncryptEccPrivateKeyRequest operator()(FuzzedDataProvider& provider) const { |
| return EncryptEccPrivateKeyRequest{ |
| .ec = FuzzedObject<const hwsec_foundation::EllipticCurve&>()(provider), |
| .own_key_pair = FuzzedObject<crypto::ScopedEC_KEY>()(provider), |
| .auth_value = |
| FuzzedObject<std::optional<brillo::SecureBlob>>()(provider), |
| .current_user = FuzzedObject<std::string>()(provider), |
| }; |
| } |
| }; |
| |
| template <> |
| struct FuzzedObject<GenerateDhSharedSecretRequest> { |
| GenerateDhSharedSecretRequest operator()(FuzzedDataProvider& provider) const { |
| return GenerateDhSharedSecretRequest{ |
| .ec = FuzzedObject<const hwsec_foundation::EllipticCurve&>()(provider), |
| .encrypted_own_priv_key = FuzzedObject<brillo::Blob>()(provider), |
| .extended_pcr_bound_own_priv_key = |
| FuzzedObject<brillo::Blob>()(provider), |
| .auth_value = |
| FuzzedObject<std::optional<brillo::SecureBlob>>()(provider), |
| .current_user = FuzzedObject<std::string>()(provider), |
| .others_pub_point = FuzzedObject<crypto::ScopedEC_POINT>()(provider), |
| }; |
| } |
| }; |
| |
| } // namespace hwsec |
| |
| #endif // LIBHWSEC_FUZZED_RECOVERY_CRYPTO_H_ |