#ifndef DEVICE_FIDO_PIN_INTERNAL_H_
#define DEVICE_FIDO_PIN_INTERNAL_H_
#include <stdint.h>
#include <array>
#include <vector>
#include "base/component_export.h"
#include "base/containers/span.h"
#include "components/cbor/values.h"
#include "device/fido/fido_constants.h"
#include "device/fido/pin.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/boringssl/src/include/openssl/base.h"
namespace device {
namespace pin {
enum class Subcommand : uint8_t {
kGetRetries = 0x01,
kGetKeyAgreement = 0x02,
kSetPIN = 0x03,
kChangePIN = 0x04,
kGetPINToken = 0x05,
kGetUvToken = 0x06,
kGetUvRetries = 0x07,
kSetMinPINLength = 0x08,
kGetPinUvAuthTokenUsingPinWithPermissions = 0x09,
};
enum class RequestKey : int {
kProtocol = 0x01,
kSubcommand = 0x02,
kKeyAgreement = 0x03,
kPINAuth = 0x04,
kNewPINEnc = 0x05,
kPINHashEnc = 0x06,
kMinPINLength = 0x07,
kMinPINLengthRPIDs = 0x08,
kPermissions = 0x09,
kPermissionsRPID = 0x0A,
};
enum class ResponseKey : int {
kKeyAgreement = 1,
kPINToken = 2,
kRetries = 3,
kUvRetries = 5,
};
absl::optional<bssl::UniquePtr<EC_POINT>> PointFromKeyAgreementResponse(
const EC_GROUP* group,
const KeyAgreementResponse& response);
class COMPONENT_EXPORT(DEVICE_FIDO) Protocol {
public:
virtual ~Protocol() = default;
Protocol(Protocol&) = delete;
Protocol& operator=(Protocol&) = delete;
virtual std::array<uint8_t, kP256X962Length> Encapsulate(
const KeyAgreementResponse& peers_key,
std::vector<uint8_t>* out_shared_key) const = 0;
virtual std::vector<uint8_t> Encrypt(
base::span<const uint8_t> shared_key,
base::span<const uint8_t> plaintext) const = 0;
virtual std::vector<uint8_t> Decrypt(
base::span<const uint8_t> shared_key,
base::span<const uint8_t> ciphertext) const = 0;
virtual std::vector<uint8_t> Authenticate(
base::span<const uint8_t> key,
base::span<const uint8_t> data) const = 0;
virtual bool Verify(base::span<const uint8_t> key,
base::span<const uint8_t> data,
base::span<const uint8_t> signature) const = 0;
virtual std::vector<uint8_t> CalculateSharedKey(
const EC_KEY* key,
const EC_POINT* peers_key) const = 0;
protected:
Protocol() = default;
};
COMPONENT_EXPORT(DEVICE_FIDO)
const Protocol& ProtocolVersion(PINUVAuthProtocol protocol);
}
}
#endif