Примеры последовательности вызовов и типового кода
D.1 Простая последовательность вызовов
БиоАПИ может поддерживать большое разнообразие биометрических технологий и устройств, так же как и методов аутентификации, однако иногда приложению требуется использование только небольшого подмножества вызовов функций для выполнения верификации. В данном разделе указана последовательность вызовов, необходимых для выполнения данного типа верификации.
D.1.1 Инициализация
Сначала необходимо инициализировать инфраструктуру БиоАПИ. Это осуществляется путем вызова функции BioAPI_lnit Приложение должно определить, с какой версией спецификации БиоАПИ оно совместимо.
void function 1() { | ||||||||
BioAPI_VERSION bioVersion; | ||||||||
BioAPI_RETURN bioReturn; | ||||||||
#define BioAPI_MAJOR | (2) | |||||||
#define BioAPI_MINOR | (0) | |||||||
bioVersion. Major = BioAPI_MAJOR; | ||||||||
bioVersion.Minor = BioAPI_MINOR; | ||||||||
bioReturn = BioAPI_lnit(&bioVersion); | ||||||||
if(BioAPI_OK != bioReturn) | ||||||||
{ | ||||||||
if(BioAPIERR_INCOMPATIBLE_VERSION == bioReturn) | ||||||||
{ | ||||||||
printf("This application is not compatible with the installed version of the BioAPI\n"); | ||||||||
} | ||||||||
else | ||||||||
{ | ||||||||
printf("BioAPI Error Code: %d\n", bioReturn); | ||||||||
} | ||||||||
} | ||||||||
} |
D.1.2 Загрузка и присоединение ПБУ
Если приложение знает УУИД ПБУ, который необходимо использовать, то для подготовки ПБУ к использованию функциями БиоАПИ необходимо только вызвать функции BioAPI_BSP_BSPLoad и BioAPI_BSPAttach.
Функция BioAPI_BSPAttach возвращает дескриптор, который будет использоваться при последующих вызовах функций БиоАПИ.
typedef struct SensorDetectionContext { | |||||||||
BioAPI_UNIT_ID unitID; | |||||||||
BioAPI_BOOL foundSensor; | |||||||||
} SensorDetectionContext; | |||||||||
BioAPI_RETURN BioAPI SensorDetectionEventHandler( | |||||||||
const BioAPI_UUID *BSPUuid, | |||||||||
BioAPI_UNIT_ID UnitID, | |||||||||
void* AppNotifyCallbackCtx, | |||||||||
const BioAPI_UNIT_SCHEMA *UnitSchema, | |||||||||
BioAPI_EVENT EventType) { | |||||||||
SensorDetectionContext *context = | |||||||||
(SensorDetectionContext *) AppNotifyCallbackCtx; | |||||||||
if (EventType == BioAPI_NOTIFY_INSERT && | |||||||||
UnitSchema != NULL && | |||||||||
UnitSchema->UnitCategory == BioAPI_CATEGORY_SENSOR && | |||||||||
!context->foundSensor) | |||||||||
{ /* использование первого обнаруженного устройства */ | |||||||||
context->unitlD = UnitID; | |||||||||
context->foundSensor = BioAPI TRUE; | |||||||||
} | |||||||||
return BioAPI_OK; | |||||||||
} | |||||||||
int function2 () { | |||||||||
/* | Предполагается, что ПБУ выгружается перед возвратом данной функции, в ином случае он оставит незадействованный указатель на контекст от БиоАПИ */ | ||||||||
BioAPI_VERSION Version; | |||||||||
BioAPI_RETURN bioReturn; | |||||||||
BioAPI_UUID uuid; | |||||||||
BioAPI_UNIT_LIST_ELEMENT UnitList[1]; | |||||||||
BioAPI_HANDLE BSPHandle; | |||||||||
#define BioAPI_MAJOR | (2) | ||||||||
#define BioAPI_MINOR | (0) | ||||||||
SensorDetectionContext context; | |||||||||
context.unitID = 0; | |||||||||
context.foundSensor = BioAPI_FALSE; | |||||||||
bioReturn = BioAPI_BSPLoad(&uuid, | |||||||||
SensorDetectionEventHandler, | |||||||||
&context); | |||||||||
if(BioAPI_OK != bioReturn) | |||||||||
{ | |||||||||
printf("BioAPI Error Code: %d\n", bioReturn); | |||||||||
return 0; | |||||||||
} | |||||||||
if (context.foundSensor) { | |||||||||
Version = (BioAPI_VERSION)((BioAPI_MAJOR << 4) | BioAPI_MINOR); | |||||||||
UnitList[0].UnitCategory = BioAPI_CATEGORY_SENSOR; | |||||||||
UnitList[0].Unitld = context.unitID; | |||||||||
bioReturn = BioAPI_BSPAttach(&uuid, | |||||||||
Version, | |||||||||
UnitList, | |||||||||
1, | |||||||||
&BSPHandle); | |||||||||
if(BioAPI_OK != bioReturn) | |||||||||
{ | |||||||||
printff("BioAPI_Error Code: %d\n", bioReturn); | |||||||||
BioAPI_BSPUnload (&uuid, SensorDetectionEventHandler, &context); | |||||||||
return 0; | |||||||||
} | |||||||||
} | |||||||||
return 0; | |||||||||
} |
D.1.3 Регистрация субъекта
После подключения ПБУ проводится регистрация биометрических данных субъекта. Это осуществляется путем однократного вызова функции BioAPI_Enroll.
int function3() { | ||||||
BioAPI_RETURN bioReturn; | ||||||
BioAPI_HANDLE BSPHandle; | ||||||
BioAPI_BIR_HANDLE EnrolledTemplate; | ||||||
bioReturn = BioAPI_Enroll(BSPHandle, | ||||||
BioAPI_PURPOSE_ENROLL_FOR_VERIFICATION_ONLY, | ||||||
BioAPI_NO_SUBTYPE_AVAILABLE, | ||||||
NULL, | ||||||
NULL, | ||||||
&EnrolledTemplate, | ||||||
NULL, | ||||||
-1, | ||||||
NULL, | ||||||
NULL); | ||||||
if(bioReturn != BioAPI_OK) | ||||||
{ | ||||||
printf("BioAPI Error Code: %d\n", bioReturn); | ||||||
return 0; | ||||||
} | ||||||
return 0; | ||||||
} |
Как только шаблон будет возвращен, он может быть помещен в хранилище данных для последующего извлечения и верификации (см. D.2).
D.1.4 Выполнение верификации
Для верификации необходимо выполнить несколько вызовов. Если ПБУ поддерживает функцию BioAPI_VerifyMatch, последовательность вызовов будет более сложной и приложение должно получать данные, создавать шаблон и проводить верификацию поэтапно. В противном случае приложение может просто вызвать функцию BioAPI_Verify.
int function4() { | |||||||||||||||
BioAPI_RETURN bioReturn; | |||||||||||||||
BioAPI_HANDLE BSPHandle; | |||||||||||||||
BioAPI_BSP_SCHEMA *CurrSchema; | |||||||||||||||
BioAPI_BIR_HANDLE EnrolledTemplate, CapturedTemplate, ProcessedBir; | |||||||||||||||
BioAPI_INPUT_BIR birEnroll, birCapture, InputBirProcessed; | |||||||||||||||
BioAPI_BIR_HEADER birHeader; | |||||||||||||||
int MaxFMR, Achieved FMR; | |||||||||||||||
BioAPI_BOOL bResponse; | |||||||||||||||
// Определение поддержки функции BioAPI_VerifyMatch ПБУ проводится | |||||||||||||||
// проверкой operations mask | |||||||||||||||
if(CurrSchema->Operations & BioAPI_VERIFYMATCH) | |||||||||||||||
{ | |||||||||||||||
if((bioReturn = BioAPI_Capture(BSPHandle, | |||||||||||||||
BioAPI_PURPOSE_VERIFY, | |||||||||||||||
BioAPI_NO_SUBTYPE_AVAILABLE, | |||||||||||||||
NULL, | |||||||||||||||
&CapturedTemplate, | |||||||||||||||
-1, | |||||||||||||||
NULL)) != BioAPI_OK) | |||||||||||||||
{ | |||||||||||||||
printf("BioAPI Error Code: %d\n", bioReturn); | |||||||||||||||
return 0; | |||||||||||||||
} | |||||||||||||||
if((bioReturn = BioAPI_GetHeaderFromHandle(BSPHandle, | |||||||||||||||
CapturedTemplate, | |||||||||||||||
&birHeader)) != BioAPI_OK) | |||||||||||||||
{ | |||||||||||||||
printf("BioAPI Error Code: %d\n", bioReturn); | |||||||||||||||
return 0; | |||||||||||||||
} | |||||||||||||||
birEnroll.Form = BioAPI_BIR_HANDLE_INPUT; | |||||||||||||||
birEnroll.InputBIR.BIRinBSP = &EnrolledTemplate; | |||||||||||||||
if(birHeader.Type_& BioAPI_BIR_DATA_TYPE_INTERMEDIATE) | |||||||||||||||
{ | |||||||||||||||
birCapture.Form = BioAPI_BIR_HANDLE_INPUT; | |||||||||||||||
birCapture.InputBIR.BIRinBSP = &CapturedTemplate; | |||||||||||||||
if((bioReturn = BioAPI_Process( BSPHandle, | |||||||||||||||
&birCapture, | |||||||||||||||
NULL, | |||||||||||||||
&ProcessedBir)) != BioAPI_OK) | |||||||||||||||
{ | |||||||||||||||
printf("BioAPI Error Code: %d\n", bioReturn); | |||||||||||||||
return 0; | |||||||||||||||
} | |||||||||||||||
MaxFMR =1; | |||||||||||||||
InputBirProcessed.Form = BioAPI_BIR_HANDLE_INPUT; | |||||||||||||||
InputBirProcessed.InputBIR.BIRinBSP = &ProcessedBir; | |||||||||||||||
} | |||||||||||||||
else | |||||||||||||||
{ | |||||||||||||||
MaxFMR =1; | |||||||||||||||
InputBirProcessed.Form = BioAPI_BIR_HANDLE_INPUT; | |||||||||||||||
InputBirProcessed.InputBIR.BIRinBSP = &CapturedTemplate; | |||||||||||||||
} | |||||||||||||||
bioReturn = BioAPI_VerifyMatch( BSPHandle, | |||||||||||||||
MaxFMR, | |||||||||||||||
&lnputBirProcessed, | |||||||||||||||
&birEnroll, | |||||||||||||||
NULL, | |||||||||||||||
&bResponse, | |||||||||||||||
&AchievedFMR, | |||||||||||||||
NULL); | |||||||||||||||
} | |||||||||||||||
else // Просто вызываем BioAPI_Verify | |||||||||||||||
{ | |||||||||||||||
MaxFMR = 1; | |||||||||||||||
bioReturn = BioAPI_Verify( BSPHandle, | |||||||||||||||
MaxFMR, | |||||||||||||||
&birEnroll, | |||||||||||||||
BioAPI_NO_SUBTYPE_AVAILABLE, | |||||||||||||||
NULL, | |||||||||||||||
&bResponse, | |||||||||||||||
&AchievedFMR, | |||||||||||||||
NULL, | |||||||||||||||
-1, | |||||||||||||||
NULL); | |||||||||||||||
} | |||||||||||||||
if(bioReturn != BioAPI_OK) | |||||||||||||||
{ | |||||||||||||||
printf("BioAPI Error Code: %d\n", bioReturn); | |||||||||||||||
return 0; | |||||||||||||||
} | |||||||||||||||
if(bResponse == BioAPI_TRUE) | |||||||||||||||
{ | |||||||||||||||
printf("Match\n"); | |||||||||||||||
} | |||||||||||||||
else | |||||||||||||||
{ | |||||||||||||||
printf("No Match\n"); | |||||||||||||||
} | |||||||||||||||
return 0; | |||||||||||||||
} |
D.1.5 Отсоединение и выгрузка ПБУ
Как только приложение закончит использование ПБУ, оно его отсоединяет и выгружает.