Requisitos del sensor para la biometría segura
Microsoft aprovecha el Módulo de plataforma segura (TPM) 2.0 para asegurarse de que, en el hardware adecuado, el software (hasta el malware de nivel de kernel) no puede generar una autenticación biométrica válida si la biometría del usuario no se proporcionó en el momento de la autenticación.
Para ello, usamos autorizaciones basadas en sesión de TPM 2.0 y el sensor que realiza la extracción de características y la coincidencia en un entorno de ejecución de confianza. La primera vez que Windows Biometric Framework ve un sensor seguro (según lo notificado por la funcionalidad de sensor seguro), aprovisiona un secreto que se comparte entre el sensor biométrico seguro y el TPM. Ese secreto nunca se expone de nuevo al sistema operativo y es único para cada sensor.
Para realizar una autenticación, Windows Biometric Framework abre una sesión con el TPM y obtiene un valor nonce. El nonce se pasa al sensor seguro como parte de una operación de coincidencia segura. El sensor realiza la coincidencia en el entorno de ejecución de confianza y, si es correcto, calcula un HMAC sobre ese nonce y la identidad del usuario que se identificó.
El marco biométrico de Windows puede usar este HMAC para realizar operaciones criptográficas en el TPM para el usuario que se identificó. HMAC es de corta duración y expira después de unos segundos.
Con este protocolo, después del aprovisionamiento inicial, no se incluye ningún dato confidencial en el sistema operativo. Los secretos se mantienen mediante el TPM y el sensor seguro, y lo único que se expone durante la autenticación es el HMAC de corta duración.
Funcionalidad de sensor seguro
El sensor debe notificar la funcionalidad WINBIO_CAPABILITY_SECURE_SENSOR si admite los nuevos métodos del adaptador de motor en la versión 4.0 de la interfaz del adaptador del motor.
Para reclamar que un sensor es un sensor seguro, debe cumplir los siguientes requisitos:
- El motor coincidente del sensor debe aislarse del sistema operativo normal (por ejemplo, mediante un entorno de ejecución de confianza).
- El sensor debe admitir la entrada segura de muestras en el motor coincidente aislado; el contenido de los ejemplos nunca debe exponerse al sistema operativo normal
- El motor coincidente debe admitir la versión de credenciales seguras mediante la implementación de los nuevos métodos v4 que se describen a continuación.
- El sensor debe admitir la detección de ataques de presentación.
El valor WINBIO_CAPABILITY_SECURE_SENSOR se encuentra en la estructura WINBIO_CAPABILITIES . Este es un ejemplo de cómo definirlo.
#define WINBIO_CAPABILITY_SECURE_SENSOR ((WINBIO_CAPABILITIES)0x00000100)
Códigos de error
//
// MessageId: WINBIO_E_INVALID_KEY_IDENTIFIER
//
// MessageText:
//
// The key identifier is invalid.
//
#define WINBIO_E_INVALID_KEY_IDENTIFIER ((HRESULT)0x80098052L)
//
// MessageId: WINBIO_E_KEY_CREATION_FAILED
//
// MessageText:
//
// The key cannot be created.
//
#define WINBIO_E_KEY_CREATION_FAILED ((HRESULT)0x80098053L)
//
// MessageId: WINBIO_E_KEY_IDENTIFIER_BUFFER_TOO_SMALL
//
// MessageText:
//
// The key identifier buffer is too small.
//
#define WINBIO_E_KEY_IDENTIFIER_BUFFER_TOO_SMALL ((HRESULT)0x80098054L)
Interfaz del adaptador de motor v 4.0
La versión de la interfaz del adaptador del motor se ha incrementado a 4.0. Las funciones adicionales de la nueva interfaz permiten al sensor participar en TPM 2.0. Son las siguientes:
//
// Additional methods available in V4.0 and later
//
typedef HRESULT
(WINAPI *PIBIO_ENGINE_CREATE_KEY_FN)(
_Inout_ PWINBIO_PIPELINE Pipeline,
_In_reads_(KeySize) const UCHAR* Key,
_In_ SIZE_T KeySize,
_Out_writes_bytes_to_(KeyIdentifierSize, *ResultSize) PUCHAR KeyIdentifier,
_In_ SIZE_T KeyIdentifierSize,
_Out_ PSIZE_T ResultSize
);
typedef HRESULT
(WINAPI *PIBIO_ENGINE_IDENTIFY_FEATURE_SET_SECURE_FN)(
_Inout_ PWINBIO_PIPELINE Pipeline,
_In_reads_(NonceSize) const UCHAR* Nonce,
_In_ SIZE_T NonceSize,
_In_reads_(KeyIdentifierSize) const UCHAR* KeyIdentifier,
_In_ SIZE_T KeyIdentifierSize,
_Out_ PWINBIO_IDENTITY Identity,
_Out_ PWINBIO_BIOMETRIC_SUBTYPE SubFactor,
_Out_ PWINBIO_REJECT_DETAIL RejectDetail,
_Outptr_result_bytebuffer_(*AuthorizationSize) PUCHAR *Authorization,
_Out_ PSIZE_T AuthorizationSize
);
#define WINBIO_ENGINE_INTERFACE_VERSION_4 WINBIO_MAKE_INTERFACE_VERSION(4,0)
typedef struct _WINBIO_ENGINE_INTERFACE {
WINBIO_ADAPTER_INTERFACE_VERSION Version;
WINBIO_ADAPTER_TYPE Type;
SIZE_T Size;
GUID AdapterId;
PIBIO_ENGINE_ATTACH_FN Attach;
PIBIO_ENGINE_DETACH_FN Detach;
PIBIO_ENGINE_CLEAR_CONTEXT_FN ClearContext;
PIBIO_ENGINE_QUERY_PREFERRED_FORMAT_FN QueryPreferredFormat;
PIBIO_ENGINE_QUERY_INDEX_VECTOR_SIZE_FN QueryIndexVectorSize;
PIBIO_ENGINE_QUERY_HASH_ALGORITHMS_FN QueryHashAlgorithms;
PIBIO_ENGINE_SET_HASH_ALGORITHM_FN SetHashAlgorithm;
PIBIO_ENGINE_QUERY_SAMPLE_HINT_FN QuerySampleHint;
PIBIO_ENGINE_ACCEPT_SAMPLE_DATA_FN AcceptSampleData; // PROCESSES CURRENT BUFFER FROM PIPELINE AND GENERATES A FEATURE SET IN THE PIPELINE
PIBIO_ENGINE_EXPORT_ENGINE_DATA_FN ExportEngineData; // EXPORTS FEATURE SET OR TEMPLATE
PIBIO_ENGINE_VERIFY_FEATURE_SET_FN VerifyFeatureSet;
PIBIO_ENGINE_IDENTIFY_FEATURE_SET_FN IdentifyFeatureSet;
PIBIO_ENGINE_CREATE_ENROLLMENT_FN CreateEnrollment; // ATTACHES AN EMPTY ENROLLMENT TEMPLATE TO THE PIPELINE
PIBIO_ENGINE_UPDATE_ENROLLMENT_FN UpdateEnrollment; // CONVERTS CURRENT PIPELINE FEATURE SET INTO SOMETHING THAT CAN BE ADDED TO A TEMPLATE
PIBIO_ENGINE_GET_ENROLLMENT_STATUS_FN GetEnrollmentStatus; // QUERIES TEMPLATE ATTACHED TO THE PIPELINE TO SEE IF IT IS READY TO COMMIT
PIBIO_ENGINE_GET_ENROLLMENT_HASH_FN GetEnrollmentHash;
PIBIO_ENGINE_CHECK_FOR_DUPLICATE_FN CheckForDuplicate; // DETERMINES WHETHER TEMPLATE IS ALREADY ENROLLED
PIBIO_ENGINE_COMMIT_ENROLLMENT_FN CommitEnrollment;
PIBIO_ENGINE_DISCARD_ENROLLMENT_FN DiscardEnrollment;
PIBIO_ENGINE_CONTROL_UNIT_FN ControlUnit;
PIBIO_ENGINE_CONTROL_UNIT_PRIVILEGED_FN ControlUnitPrivileged;
#if (NTDDI_VERSION >= NTDDI_WIN8)
//
// V2.0 methods begin here...
//
PIBIO_ENGINE_NOTIFY_POWER_CHANGE_FN NotifyPowerChange;
PIBIO_ENGINE_RESERVED_1_FN Reserved_1;
#endif
#if (NTDDI_VERSION >= NTDDI_WINTHRESHOLD)
//
// V3.0 methods begin here...
//
PIBIO_ENGINE_PIPELINE_INIT_FN PipelineInit;
PIBIO_ENGINE_PIPELINE_CLEANUP_FN PipelineCleanup;
PIBIO_ENGINE_ACTIVATE_FN Activate;
PIBIO_ENGINE_DEACTIVATE_FN Deactivate;
PIBIO_ENGINE_QUERY_EXTENDED_INFO_FN QueryExtendedInfo;
PIBIO_ENGINE_IDENTIFY_ALL_FN IdentifyAll;
PIBIO_ENGINE_SET_ENROLLMENT_SELECTOR_FN SetEnrollmentSelector;
PIBIO_ENGINE_SET_ENROLLMENT_PARAMETERS_FN SetEnrollmentParameters;
PIBIO_ENGINE_QUERY_EXTENDED_ENROLLMENT_STATUS_FN QueryExtendedEnrollmentStatus;
PIBIO_ENGINE_REFRESH_CACHE_FN RefreshCache;
PIBIO_ENGINE_SELECT_CALIBRATION_FORMAT_FN SelectCalibrationFormat;
PIBIO_ENGINE_QUERY_CALIBRATION_DATA_FN QueryCalibrationData;
PIBIO_ENGINE_SET_ACCOUNT_POLICY_FN SetAccountPolicy;
#endif
#if (NTDDI_VERSION >= NTDDI_WIN10_RS1)
//
// V4.0 methods begin here...
//
PIBIO_ENGINE_CREATE_KEY_FN CreateKey;
PIBIO_ENGINE_IDENTIFY_FEATURE_SET_SECURE_FN IdentifyFeatureSetSecure;
#endif
} WINBIO_ENGINE_INTERFACE, *PWINBIO_ENGINE_INTERFACE;
Requisitos
Windows 10