#ifndef DEVICE_FIDO_AUTHENTICATOR_DATA_H_
#define DEVICE_FIDO_AUTHENTICATOR_DATA_H_
#include <stdint.h>
#include <array>
#include <optional>
#include <string>
#include <string_view>
#include <vector>
#include "base/component_export.h"
#include "base/containers/span.h"
#include "base/numerics/safe_conversions.h"
#include "components/cbor/values.h"
#include "device/fido/attested_credential_data.h"
#include "device/fido/fido_constants.h"
namespace device {
class COMPONENT_EXPORT(DEVICE_FIDO) AuthenticatorData {
public:
enum class Flag : uint8_t {
kTestOfUserPresence = 1u << 0,
kTestOfUserVerification = 1u << 2,
kBackupEligible = 1u << 3,
kBackupState = 1u << 4,
kAttestation = 1u << 6,
kExtensionDataIncluded = 1u << 7,
};
static std::optional<AuthenticatorData> DecodeAuthenticatorData(
base::span<const uint8_t> auth_data);
AuthenticatorData(base::span<const uint8_t, kRpIdHashLength> rp_id_hash,
uint8_t flags,
base::span<const uint8_t, kSignCounterLength> sign_counter,
std::optional<AttestedCredentialData> data,
std::optional<cbor::Value> extensions = std::nullopt);
AuthenticatorData(
base::span<const uint8_t, kRpIdHashLength> rp_id_hash,
bool user_present,
bool user_verified,
bool backup_eligible,
bool backup_state,
uint32_t sign_counter,
std::optional<AttestedCredentialData> attested_credential_data,
std::optional<cbor::Value> extensions);
AuthenticatorData(AuthenticatorData&& other);
AuthenticatorData& operator=(AuthenticatorData&& other);
AuthenticatorData(const AuthenticatorData&) = delete;
AuthenticatorData& operator=(const AuthenticatorData&) = delete;
~AuthenticatorData();
bool DeleteDeviceAaguid();
bool EraseExtension(std::string_view name);
std::vector<uint8_t> SerializeToByteArray() const;
std::vector<uint8_t> GetCredentialId() const;
const std::optional<AttestedCredentialData>& attested_data() const {
return attested_data_;
}
const std::optional<cbor::Value>& extensions() const { return extensions_; }
const std::array<uint8_t, kRpIdHashLength>& application_parameter() const {
return application_parameter_;
}
uint8_t flags() const { return flags_; }
bool obtained_user_presence() const {
return flags_ & base::strict_cast<uint8_t>(Flag::kTestOfUserPresence);
}
bool obtained_user_verification() const {
return flags_ & base::strict_cast<uint8_t>(Flag::kTestOfUserVerification);
}
bool attestation_credential_included() const {
return flags_ & base::strict_cast<uint8_t>(Flag::kAttestation);
}
bool extension_data_included() const {
return flags_ & base::strict_cast<uint8_t>(Flag::kExtensionDataIncluded);
}
bool backup_eligible() const {
return flags_ & base::strict_cast<uint8_t>(Flag::kBackupEligible);
}
bool backup_state() const {
return flags_ & base::strict_cast<uint8_t>(Flag::kBackupState);
}
base::span<const uint8_t, kSignCounterLength> counter() const {
return counter_;
}
private:
void ValidateAuthenticatorDataStateOrCrash();
uint8_t flags_;
std::array<uint8_t, kRpIdHashLength> application_parameter_;
std::array<uint8_t, kSignCounterLength> counter_;
std::optional<AttestedCredentialData> attested_data_;
std::optional<cbor::Value> extensions_;
};
}
#endif