| // 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_PINWEAVER_H_ | |
| #define LIBHWSEC_FUZZED_PINWEAVER_H_ | |
| #include <algorithm> | |
| #include <optional> | |
| #include <type_traits> | |
| #include <vector> | |
| #include <brillo/secure_blob.h> | |
| #include <fuzzer/FuzzedDataProvider.h> | |
| #include "libhwsec/backend/pinweaver.h" | |
| #include "libhwsec/fuzzed/basic_objects.h" | |
| namespace hwsec { | |
| template <> | |
| struct FuzzedObject<PinWeaver::CredentialTreeResult> { | |
| PinWeaver::CredentialTreeResult operator()( | |
| FuzzedDataProvider& provider) const { | |
| return PinWeaver::CredentialTreeResult{ | |
| .error = FuzzedObject<PinWeaver::CredentialTreeResult::ErrorCode>()( | |
| provider), | |
| .new_root = FuzzedObject<brillo::Blob>()(provider), | |
| .new_cred_metadata = | |
| FuzzedObject<std::optional<brillo::Blob>>()(provider), | |
| .new_mac = FuzzedObject<std::optional<brillo::Blob>>()(provider), | |
| .he_secret = | |
| FuzzedObject<std::optional<brillo::SecureBlob>>()(provider), | |
| .reset_secret = | |
| FuzzedObject<std::optional<brillo::SecureBlob>>()(provider), | |
| .server_nonce = FuzzedObject<std::optional<brillo::Blob>>()(provider), | |
| .iv = FuzzedObject<std::optional<brillo::Blob>>()(provider), | |
| .encrypted_he_secret = | |
| FuzzedObject<std::optional<brillo::Blob>>()(provider), | |
| }; | |
| } | |
| }; | |
| template <> | |
| struct FuzzedObject<PinWeaver::GetLogResult::LogEntry> { | |
| PinWeaver::GetLogResult::LogEntry operator()( | |
| FuzzedDataProvider& provider) const { | |
| return PinWeaver::GetLogResult::LogEntry{ | |
| .type = FuzzedObject<PinWeaver::GetLogResult::LogEntryType>()(provider), | |
| .label = FuzzedObject<uint64_t>()(provider), | |
| .root = FuzzedObject<brillo::Blob>()(provider), | |
| .mac = FuzzedObject<brillo::Blob>()(provider), | |
| }; | |
| } | |
| }; | |
| template <> | |
| struct FuzzedObject<PinWeaver::GetLogResult> { | |
| PinWeaver::GetLogResult operator()(FuzzedDataProvider& provider) const { | |
| return PinWeaver::GetLogResult{ | |
| .root_hash = FuzzedObject<brillo::Blob>()(provider), | |
| .log_entries = | |
| FuzzedObject<std::vector<PinWeaver::GetLogResult::LogEntry>>()( | |
| provider), | |
| }; | |
| } | |
| }; | |
| template <> | |
| struct FuzzedObject<PinWeaver::ReplayLogOperationResult> { | |
| PinWeaver::ReplayLogOperationResult operator()( | |
| FuzzedDataProvider& provider) const { | |
| return PinWeaver::ReplayLogOperationResult{ | |
| .new_cred_metadata = FuzzedObject<brillo::Blob>()(provider), | |
| .new_mac = FuzzedObject<brillo::Blob>()(provider), | |
| }; | |
| } | |
| }; | |
| template <> | |
| struct FuzzedObject<PinWeaver::PinWeaverEccPoint> { | |
| PinWeaver::PinWeaverEccPoint operator()(FuzzedDataProvider& provider) const { | |
| PinWeaver::PinWeaverEccPoint result; | |
| auto bytes = provider.ConsumeBytes<uint8_t>(PinWeaverEccPointSize); | |
| std::copy_n(std::begin(bytes), bytes.size(), std::begin(result.x)); | |
| bytes = provider.ConsumeBytes<uint8_t>(PinWeaverEccPointSize); | |
| std::copy_n(std::begin(bytes), bytes.size(), std::begin(result.y)); | |
| return result; | |
| } | |
| }; | |
| } // namespace hwsec | |
| #endif // LIBHWSEC_FUZZED_PINWEAVER_H_ |