blob: 4e265caaea25e3f97fa623ebfd3f7ada8e29a492 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef DEVICE_FIDO_PRF_INPUT_H_
#define DEVICE_FIDO_PRF_INPUT_H_
#include <stdint.h>
#include <array>
#include <optional>
#include <vector>
#include "base/component_export.h"
#include "components/cbor/values.h"
namespace device {
// PRFInput contains salts for the hmac-secret or prf extension, potentially
// specific to a given credential ID.
struct COMPONENT_EXPORT(DEVICE_FIDO) PRFInput {
PRFInput();
PRFInput(const PRFInput&);
PRFInput(PRFInput&&);
PRFInput& operator=(const PRFInput&);
~PRFInput();
static std::optional<PRFInput> FromCBOR(const cbor::Value& v);
cbor::Value::MapValue ToCBOR() const;
// Hashes the inputs into the corresponding salts.
void HashInputsIntoSalts();
// Evaluates the HMAC using the provided salts.
static std::vector<uint8_t> EvaluateHMAC(
base::span<const uint8_t> hmac_key,
const std::array<uint8_t, 32>& hmac_salt1,
const std::optional<std::array<uint8_t, 32>>& hmac_salt2);
// Evaluates the HMAC using this input's salts.
std::vector<uint8_t> EvaluateHMAC(base::span<const uint8_t> hmac_key) const;
std::optional<std::vector<uint8_t>> credential_id;
// Input values are provided both unhashed (as `input1` and `input2`) and
// hashed (as `salt1` and `salt2`). Security keys use the hashed values but,
// e.g., iCloud Keychain needs unhashed values.
std::vector<uint8_t> input1;
std::array<uint8_t, 32> salt1;
std::optional<std::vector<uint8_t>> input2;
std::optional<std::array<uint8_t, 32>> salt2;
};
} // namespace device
#endif // DEVICE_FIDO_PRF_INPUT_H_