指紋支払いに関する詳細処理
6148 ワード
指紋支払いに関する詳細処理(QSEEを例に)
一.AuthToken処理
1.AuthToken形式及び定義(CA側はTA側と同じ)
AuthToken format
2.Keymaster TAからAuth Token key Fingerprint HAL Openの場合、Fingerprint HAL(以降HALと略す)はKeymasterにKEYMASTER_を送信するGET_AUTH_TOKEN_KEYコマンドは、返された暗号化キーを取得します. HALは、指紋TA(以降、TAと略す)にコマンドを送信、Keymaterから取得した暗号化キーyをメモリデータ共有方式でTAに送信. TA使用qsee_decapsulate_inter_app_Message()メソッドは、keyを暗号化することによってKeymaster TAの復号key を取得する. TA authenticateの時、自分でTokenを作成してQSEEのqsee_を呼び出すhmac()メソッド、QSEE_を使用HMAC_SHA 256型アルゴリズムはtokenを暗号化し、他のTA(Keymaster TA、Gatekeeper TA、bio TA) に共有する.
二.Fingerprint HALとFingerprint TAの詳細処理
1.pre_Enroll()メソッド:
TA側はchallengeを作成して保存し、TAはこのchallengeをHALに返信し、pre_Enrollメソッドでは、このchalleng値を直接returnします.
2.enroll(...,const hw_auth_token_t*hat,...)メソッド:
Enrollの場合、システムは1つのtokenをFingerprint HALに伝え、HAL層はこのtokenをTA側に伝える必要があり、TAは以下の関連処理を行う.
1).TA側はtokenの中のchallengeについてpre_Enrollの場合、TAが保存しているchallengeの値を比較します.
2).TA側会は、keymaster TAから得られた暗号化keyに基づいてqsee_hmac()メソッド、QSEE_を使用HMAC_SHA 256タイプのHMAC暗号化は、2つのhmac配列の内容が一致しているかどうかを比較し、一致しない場合はenrollプロセスを中断し、直接returnを削除します.
3.user_id問題:
user_idはenrollの時にシステムがfingerprint HAL層に伝えたもので、HAL層はこの値をfingerprint TAに伝えて指紋テンプレートとバインドする必要があり、enrollの時にシステムが伝えたuser_idがいくらであればauthenticateが成功した後にシステムのuser_に返信しますidはいくらですか.
1).user_id enroll完了後に指紋テンプレートを生成する場合、指紋テンプレートにバインドされます.2)指紋照合に成功した後、user_を取得するid,この値をTAが作成したTokenのuser_に割り当てるid要素.
3).TAはTokenをHMAアルゴリズムで暗号化します.
4).TAはuser_を含むidのTokenはfingerprint Halに渡され,Halからシステムにコールバックされる.
4.authenticator_id問題:
enrollが正常に完了した後、指紋テンプレートを生成するデータベースidに基づいてauthenticator_を生成する必要があります.id、authenticatorを生成するidは2つの場所で使用されます.
1).この値はfingerprint Halに返信する必要があります.get_authenticator_id()メソッドでは、直接戻ります.
2).指紋照合に成功した後、TAでTokenを作成し、この値をTokenのauthenticator_に割り当てます.id要素.
3).TAはTokenをHMAアルゴリズムで暗号化します.
4).TAはauthenticatorを含むidのTokenはfingerprint Halに渡され,Halからシステムにコールバックされる.
5.operation_id問題:
この値は重要です.支払いのbioインタフェースがこの値を使用するため、使用手順は次のとおりです.
1).authenticate(...,uint 64_t operation_id,...)の場合、システムはこの値をfingerprint HALに渡し、Hal層はこの値をfingerprint TAに渡す必要がある.
2).指紋照合に成功した後、TAでTokenを作成し、この値をTokenのchallenge要素に割り当てます.
3).TAはTokenをHMACアルゴリズムで暗号化する
4)bioインタフェースset_を呼び出すauth_result()、このoperation_idはbioインタフェースに渡される.
三.支付宝、微信支付
これを支払うには、指紋リストインタフェースとマッチングに成功したインタフェースの2つのインタフェースを実現する必要があります.
1).指紋リストインタフェースは、初期化、指紋テンプレートの追加、更新、削除時に呼び出す必要があります.具体的には参照コードが必要です.
2).照合に成功したインタフェース(上のset_auth_resultである)は、指紋照合に成功した後、TAがToken HMAC暗号化を行った後に呼び出す必要がある
この2つのインタフェースは最終的にbio APIを呼び出すbio_である.set_auth_result()メソッド.私たちの指紋メーカーは、前の詳細を実現するだけで、上の2つのインタフェースとすればいいです.残りはプラットフォームで、TEEには支払いメーカーのことがあります.
一.AuthToken処理
1.AuthToken形式及び定義(CA側はTA側と同じ)
AuthToken format
typedef struct __attribute__((__packed__)) {
uint8_t version; // Current version is 0
uint64_t challenge;
uint64_t user_id; // secure user ID, not Android user ID
uint64_t authenticator_id; // secure authenticator ID
uint32_t authenticator_type; // hw_authenticator_type_t, in network order
uint64_t timestamp; // in network order
uint8_t hmac[32];
} hw_auth_token_t;
Version : token
Challenge: preEnroll 64 , enroll
User SID : id, android user id
Athenticator ID:
Authenticator Type:0x00 Gatekeeper,0x01 Fingerprint
Timestamp:
AuthToken HMAC key: key SHA-256 , hmac , 。
2.Keymaster TAからAuth Token key
retval = QSEEcom_start_app(&keymaster_handle,
OXI_KEYMASTER_APP_PATH,
OXI_KEYMASTER_APP_NAME,
shared_buffer_zise);
km_get_auth_token_req_t* command = (km_get_auth_token_req_t*)
keymaster_handle->ion_sbuffer;
uint32_t command_length = QSEECOM_ALIGN(sizeof(km_get_auth_token_req_t*));
km_get_auth_token_rsp_t* response = (km_get_auth_token_rsp_t*)
(keymaster_handle->ion_sbuffer+command_length);
command->cmd_id = KEYMASTER_GET_AUTH_TOKEN_KEY;
command->auth_type = HW_AUTH_FINGERPRINT;
uint32_t response_length = shared_buffer_zise-command_length;
retval = QSEEcom_send_cmd(keymaster_handle,
command,
command_length,
response,
response_length);
二.Fingerprint HALとFingerprint TAの詳細処理
1.pre_Enroll()メソッド:
TA側はchallengeを作成して保存し、TAはこのchallengeをHALに返信し、pre_Enrollメソッドでは、このchalleng値を直接returnします.
2.enroll(...,const hw_auth_token_t*hat,...)メソッド:
Enrollの場合、システムは1つのtokenをFingerprint HALに伝え、HAL層はこのtokenをTA側に伝える必要があり、TAは以下の関連処理を行う.
1).TA側はtokenの中のchallengeについてpre_Enrollの場合、TAが保存しているchallengeの値を比較します.
2).TA側会は、keymaster TAから得られた暗号化keyに基づいてqsee_hmac()メソッド、QSEE_を使用HMAC_SHA 256タイプのHMAC暗号化は、2つのhmac配列の内容が一致しているかどうかを比較し、一致しない場合はenrollプロセスを中断し、直接returnを削除します.
// token->challenge preEnroll g_challenge
if (token && token->challenge == g_challenge) {
g_user_id = token->user_id;
} else {
LOGE(LOG_TAG "[%s] invalid or null auth token", __func__);
}
// token
if (token && token->version != cmd->data.enroll.system_auth_token_version) {
LOGE(LOG_TAG "[%s] invalid hat version code detected", __func__);
err = ERROR_INVALID_HAT_VERSION;
break;
}
// authenticator_type
if (token && (token->authenticator_type & GF_HW_AUTH_FINGERPRINT)) {
LOGE(LOG_TAG "[%s] invalid challenge detected", __func__);
err = ERROR_INVALID_CHALLENGE;
break;
}
/*token , hmac , key hmac*/
cpl_memcpy(&hat, token, sizeof(gf_hw_auth_token_t));
cpl_memset(&(hat.hmac), 0, hmac_len);
generate_hmac(&hat);
/* hmac token hmac , enroll , IC */
if (0 != cpl_memcmp(hat.hmac, token->hmac, hmac_len)) {
LOGE(LOG_TAG "[%s] token authenticate failed", __func__);
err = ERROR_UNTRUSTED_ENROLL;
break;
}
3.user_id問題:
user_idはenrollの時にシステムがfingerprint HAL層に伝えたもので、HAL層はこの値をfingerprint TAに伝えて指紋テンプレートとバインドする必要があり、enrollの時にシステムが伝えたuser_idがいくらであればauthenticateが成功した後にシステムのuser_に返信しますidはいくらですか.
1).user_id enroll完了後に指紋テンプレートを生成する場合、指紋テンプレートにバインドされます.2)指紋照合に成功した後、user_を取得するid,この値をTAが作成したTokenのuser_に割り当てるid要素.
3).TAはTokenをHMAアルゴリズムで暗号化します.
4).TAはuser_を含むidのTokenはfingerprint Halに渡され,Halからシステムにコールバックされる.
4.authenticator_id問題:
enrollが正常に完了した後、指紋テンプレートを生成するデータベースidに基づいてauthenticator_を生成する必要があります.id、authenticatorを生成するidは2つの場所で使用されます.
1).この値はfingerprint Halに返信する必要があります.get_authenticator_id()メソッドでは、直接戻ります.
2).指紋照合に成功した後、TAでTokenを作成し、この値をTokenのauthenticator_に割り当てます.id要素.
3).TAはTokenをHMAアルゴリズムで暗号化します.
4).TAはauthenticatorを含むidのTokenはfingerprint Halに渡され,Halからシステムにコールバックされる.
5.operation_id問題:
この値は重要です.支払いのbioインタフェースがこの値を使用するため、使用手順は次のとおりです.
1).authenticate(...,uint 64_t operation_id,...)の場合、システムはこの値をfingerprint HALに渡し、Hal層はこの値をfingerprint TAに渡す必要がある.
2).指紋照合に成功した後、TAでTokenを作成し、この値をTokenのchallenge要素に割り当てます.
3).TAはTokenをHMACアルゴリズムで暗号化する
4)bioインタフェースset_を呼び出すauth_result()、このoperation_idはbioインタフェースに渡される.
int32_t set_auth_result(boolean result, uint64_t finger_id, uint64_t operation_id)
{
int32_t status = 0;
bio_result bio_res;
BIO_ERROR_CODE bio_err;
bio_res.method = BIO_FINGERPRINT_MATCHING;
bio_res.result = result;
bio_res.user_id = BIO_NA;
if (bio_res.result) {
bio_res.user_entity_id = finger_id;
bio_res.transaction_id = operation_id;//session_id
} else {
bio_res.user_entity_id = BIO_NA;
bio_res.transaction_id = BIO_NA;
}
if ((bio_err = bio_set_auth_result(&bio_res, NULL)) != BIO_NO_ERROR) {
status = -1;
}
return status;
}
三.支付宝、微信支付
これを支払うには、指紋リストインタフェースとマッチングに成功したインタフェースの2つのインタフェースを実現する必要があります.
1).指紋リストインタフェースは、初期化、指紋テンプレートの追加、更新、削除時に呼び出す必要があります.具体的には参照コードが必要です.
2).照合に成功したインタフェース(上のset_auth_resultである)は、指紋照合に成功した後、TAがToken HMAC暗号化を行った後に呼び出す必要がある
この2つのインタフェースは最終的にbio APIを呼び出すbio_である.set_auth_result()メソッド.私たちの指紋メーカーは、前の詳細を実現するだけで、上の2つのインタフェースとすればいいです.残りはプラットフォームで、TEEには支払いメーカーのことがあります.