鴻蒙OS 訪問(wèn)SE安全單元

2020-09-18 14:58 更新

場(chǎng)景介紹

應(yīng)用或者其他模塊可以通過(guò)接口完成以下功能:

  1. 獲取安全單元的個(gè)數(shù)和名稱。
  2. 判斷安全單元是否在位。
  3. 在指定安全單元上打開(kāi)基礎(chǔ)通道。
  4. 在指定安全單元上打開(kāi)邏輯通道。
  5. 發(fā)送 APDU(Application Protocol Data Unit)數(shù)據(jù)到安全單元上。

接口說(shuō)明

類名 接口名 功能描述
SEService SEService() 創(chuàng)建一個(gè)安全單元服務(wù)的實(shí)例。
isConnected() 查詢安全單元服務(wù)是否已連接。
shutdown() 關(guān)閉安全單元服務(wù)。
getReaders() 獲取全部安全單元。
getVersion() 獲得安全單元服務(wù)的版本。
OnCallback 用于回調(diào)的內(nèi)部類,用于定義回調(diào)接口。在服務(wù)連接成功后,回調(diào)該接口通知應(yīng)用。
Reader getName() 獲取安全單元的名稱。
isSecureElementPresent() 檢查安全單元是否在位。
openSession() 打開(kāi)當(dāng)前安全單元上的 session。
closeSession() 關(guān)閉當(dāng)前安全單元上的所有 session。
Session openBasicChannel(Aid aid) 打開(kāi)基礎(chǔ)通道。
openLogicalChannel(Aid aid) 創(chuàng)建邏輯通道。
getATR() 獲得重設(shè)安全單元指令的響應(yīng)。
closeSessionChannels() 關(guān)閉當(dāng)前 session的所有通道。
Channel isClosed() 判斷通道是否關(guān)閉。
isBasicChannel() 判斷是否是基礎(chǔ)通道。
transmit(byte[] command) 發(fā)送指令到安全單元。
getSelectResponse() 獲得應(yīng)用程序選擇指令的響應(yīng)。
closeChannel() 關(guān)閉通道。
Aid Aid(byte[] aid, int offset, int length) 構(gòu)造一個(gè) AID 類的實(shí)例。
isAidValid() 查詢AID是否有效。
getAidBytes() 獲取AID的字節(jié)數(shù)組形式的值。

開(kāi)發(fā)步驟

  1. 調(diào)用 SEService 類的構(gòu)造函數(shù),創(chuàng)建一個(gè)安全單元服務(wù)的實(shí)例,用于訪問(wèn)安全單元。

  1. 調(diào)用 isConnected() 接口,查詢安全單元服務(wù)的連接狀態(tài)。

  1. 調(diào)用 getReaders() 接口,獲取本機(jī)的全部安全單元。

  1. 調(diào)用 Reader 類的 openSession() 接口打開(kāi) Session,返回一個(gè)打開(kāi)的 Session 實(shí)例。

  1. 調(diào)用 Session 類的 openBasicChannel(Aid aid) 接口打開(kāi)基礎(chǔ)通道,或者調(diào)用 openLogicalChannel(Aid aid) 接口打開(kāi)邏輯通道,返回一個(gè)打開(kāi)通道 Channel 實(shí)例。

  1. 調(diào)用 Channel 類的 transmit(byte[] command),發(fā)送 APDU 到安全單元。

  1. 調(diào)用 Channel 類的 closeChannel() 接口關(guān)閉通道。

  1. 調(diào)用 Session 類的 closeSessionChannels() 接口關(guān)閉 Session 的所有通道。

  1. 調(diào)用 Reader 類的 closeSessions() 接口關(guān)閉安全單元的所有 Session。

  1. 調(diào)用 SEService 類的 shutdown() 接口關(guān)閉安全單元服務(wù)。

    private class AppServiceConnectedCallback implements SEService.OnCallback {
        @Override
        public void serviceConnected() {
            // 應(yīng)用自實(shí)現(xiàn)
        }
    }
    // 創(chuàng)建安全單元服務(wù)實(shí)例
    SEService sEService = new SEService(context, new AppServiceConnectedCallback());
    // 查詢安全單元服務(wù)的連接狀態(tài)
    boolean isConnected = sEService.isConnected();

     
    // 獲取本機(jī)的全部安全單元,并獲取指定的安全單元eSE
    Reader[] elements = sEService.getReaders();
    Reader eSe = null;
    for (int i = 0; i < elements.length; i++) {
        if ("eSE".equals(elements[i].getName())) {
            eSe = elements[i];
            break;
        }
    }

     
    // 查詢安全單元是否在位
    boolean isPresent = eSe.isSecureElementPresent();

     
    // 打開(kāi)Session
    Optional<Session> optionalSession = eSe.openSession();
    Session session = optionalSession.orElse(null);

     
    // 打開(kāi)通道
    if (eSe != null) {
        byte[] aidValue = new byte[]{(byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04, (byte)0x05};
        // 創(chuàng)建Aid實(shí)例
        Aid aid = new Aid(aidValue, 0, aidValue.length); 
        // 打開(kāi)基礎(chǔ)通道
        Optional<Channel> optionalChannel = session.openBasicChannel(aid);
        Channel basicChannel = optionalChannel.orElse(null);
        // 打開(kāi)邏輯通道
        optionalChannel = session.openLogicalChannel(aid);
        Channel logicalChannel = optionalChannel.orElse(null);

     
        // 發(fā)送指令給安全單元,返回值為安全單元對(duì)指令的響應(yīng)
        byte[] resp = logicalChannel.transmit(new byte[]{(byte)0x00, (byte)0xa4, (byte)0x00, (byte)0x00, (byte)0x02, (byte)0x00, (byte)0x00});

     
        // 關(guān)閉通道資源
        basicChannel.closeChannel()
        logicalChannel.closeChannel(); 
    }

     
    // 關(guān)閉Session資源
    session.close();

     
    // 關(guān)閉安全單元資源
    eSe.closeSessions();

     
    // 關(guān)閉安全單元服務(wù)資源sEService.shutdown();
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)