blob: 92ff22a083165fa882315f193e3796b026b3dd70 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef DEVICE_FIDO_BIO_ENROLLMENT_H_
#define DEVICE_FIDO_BIO_ENROLLMENT_H_
#include "base/component_export.h"
#include "base/optional.h"
#include "components/cbor/values.h"
#include "device/fido/fido_constants.h"
#include "device/fido/pin.h"
namespace device {
// This file defines structures and values required to interact with
// an authenticator that supports authenticatorBioEnrollment (0x09,
// or vendor-specific 0x40). This command currently exists in the
// pre-standardization CTAP2.1 specification, section 5.7.
// TODO(martinkr) add link to standard when published
enum class BioEnrollmentRequestKey : uint8_t {
kModality = 0x01,
kSubCommand = 0x02,
kSubCommandParams = 0x03,
kPinProtocol = 0x04,
kPinAuth = 0x05,
kGetModality = 0x06
};
enum class BioEnrollmentModality : uint8_t {
kFingerprint = 0x01,
kMin = kFingerprint,
kMax = kFingerprint
};
enum class BioEnrollmentFingerprintKind : uint8_t {
kTouch = 0x01,
kSwipe = 0x02,
kMin = kTouch,
kMax = kSwipe
};
enum class BioEnrollmentSubCommand : uint8_t {
kEnrollBegin = 0x01,
kEnrollCaptureNextSample = 0x02,
kCancelCurrentEnrollment = 0x03,
kEnumerateEnrollments = 0x04,
kSetFriendlyName = 0x05,
kRemoveEnrollment = 0x06,
kGetFingerprintSensorInfo = 0x07,
kMin = kEnrollBegin,
kMax = kGetFingerprintSensorInfo
};
enum class BioEnrollmentSubCommandParam : uint8_t {
kTemplateId = 0x01,
kTemplateFriendlyName = 0x02,
kTimeoutMilliseconds = 0x03
};
enum class BioEnrollmentResponseKey : uint8_t {
kModality = 0x01,
kFingerprintKind = 0x02,
kMaxCaptureSamplesRequiredForEnroll = 0x03,
kTemplateId = 0x04,
kLastEnrollSampleStatus = 0x05,
kRemainingSamples = 0x06,
kTemplateInfos = 0x07
};
enum class BioEnrollmentTemplateInfoParam : uint8_t {
kTemplateId = 0x01,
kTemplateFriendlyName = 0x02
};
enum class BioEnrollmentSampleStatus : uint8_t {
kGood = 0x00,
kTooHigh = 0x01,
kTooLow = 0x02,
kTooLeft = 0x03,
kTooRight = 0x04,
kTooFast = 0x05,
kTooSlow = 0x06,
kPoorQuality = 0x07,
kTooSkewed = 0x08,
kTooShort = 0x09,
kMergeFailure = 0x0A,
kExists = 0x0B,
kDatabaseFull = 0x0C,
kNoUserActivity = 0x0D,
kNoUserPresenceTransition = 0x0E,
kMin = kGood,
kMax = kNoUserPresenceTransition
};
template <typename T>
static base::Optional<T> ToBioEnrollmentEnum(uint8_t v) {
// Check if enum-class is in range...
if (v < static_cast<int>(T::kMin) || v > static_cast<int>(T::kMax)) {
// ...to avoid possible undefined behavior (casting from int to enum).
return base::nullopt;
}
return static_cast<T>(v);
}
struct BioEnrollmentRequest {
enum Version {
kDefault,
kPreview,
};
static BioEnrollmentRequest ForGetModality(Version);
static BioEnrollmentRequest ForGetSensorInfo(Version);
static BioEnrollmentRequest ForEnrollBegin(
Version,
const pin::TokenResponse& pin_token);
static BioEnrollmentRequest ForEnrollNextSample(
Version,
const pin::TokenResponse& pin_token,
std::vector<uint8_t> template_id);
static BioEnrollmentRequest ForCancel(Version);
static BioEnrollmentRequest ForEnumerate(Version,
const pin::TokenResponse& token);
static BioEnrollmentRequest ForRename(Version,
const pin::TokenResponse& token,
std::vector<uint8_t> id,
std::string name);
static BioEnrollmentRequest ForDelete(Version,
const pin::TokenResponse& token,
std::vector<uint8_t> id);
Version version;
base::Optional<BioEnrollmentModality> modality;
base::Optional<BioEnrollmentSubCommand> subcommand;
base::Optional<cbor::Value::MapValue> params;
base::Optional<uint8_t> pin_protocol;
base::Optional<std::vector<uint8_t>> pin_auth;
base::Optional<bool> get_modality;
BioEnrollmentRequest(BioEnrollmentRequest&&);
BioEnrollmentRequest& operator=(BioEnrollmentRequest&&);
~BioEnrollmentRequest();
private:
BioEnrollmentRequest(Version);
};
struct COMPONENT_EXPORT(DEVICE_FIDO) BioEnrollmentResponse {
static base::Optional<BioEnrollmentResponse> Parse(
const base::Optional<cbor::Value>& cbor_response);
BioEnrollmentResponse();
BioEnrollmentResponse(BioEnrollmentResponse&&);
BioEnrollmentResponse& operator=(BioEnrollmentResponse&&) = default;
~BioEnrollmentResponse();
bool operator==(const BioEnrollmentResponse&) const;
base::Optional<BioEnrollmentModality> modality;
base::Optional<BioEnrollmentFingerprintKind> fingerprint_kind;
base::Optional<uint8_t> max_samples_for_enroll;
base::Optional<std::vector<uint8_t>> template_id;
base::Optional<BioEnrollmentSampleStatus> last_status;
base::Optional<uint8_t> remaining_samples;
base::Optional<std::map<std::vector<uint8_t>, std::string>> template_infos;
};
COMPONENT_EXPORT(DEVICE_FIDO)
std::pair<CtapRequestCommand, base::Optional<cbor::Value>>
AsCTAPRequestValuePair(const BioEnrollmentRequest& request);
} // namespace device
#endif // DEVICE_FIDO_BIO_ENROLLMENT_H_