指紋支払いに関する詳細処理


指紋支払いに関する詳細処理(QSEEを例に)
一.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
  • 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)
    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には支払いメーカーのことがあります.