blob: f4b6d0795e9e3e95875ba82a7ee16d5953745e27 [file] [edit]
// 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_