読み取りAPIガイド

LibJeIDは各種IDカード内のデータを読み取るための統一されたAPIを提供します。

基本的に以下の流れでカード内データの読み出します。

  1. 暗証番号の入力またはアクセスコントロールの開始
  2. readFiles()メソッドを呼び出しFilesオブジェクトの読み出し
  3. Filesオブジェクトから各種データを取得

目次

運転免許証

運転免許証は暗証番号1(PIN1)、暗証番号2(PIN2)を入力して各種データを読み取ります。

共通データ要素の読み出しに暗証番号の入力は必要ありません。

真正性検証を行うには、PIN1とPIN2の両方を入力する必要があります。

運転免許証の読み取り

運転免許証を読み取るJavaのサンプルコードです。

try {
    JeidReader reader = new JeidReader(nfcTag);
    DriverLicenseAP ap = reader.selectDriverLicenseAP();

    // 暗証番号1を入力
    try {
        ap.verifyPin1("XXXX");
    } catch (InvalidPinException e) {
        if (e.isBlocked()) {
            System.out.println("暗証番号1がブロックされています。");
        } else {
            System.out.println("暗証番号1が間違っています。残り回数: " + e.getCounter());
        }
        return;
    }

    // 暗証番号2を入力
    try {
        ap.verifyPin2("XXXX");
    } catch (InvalidPinException e) {
        if (e.isBlocked()) {
            System.out.println("暗証番号2がブロックされています。");
        } else {
            System.out.println("暗証番号2が間違っています。残り回数: " + e.getCounter());
        }
        return;
    }

    // Filesオブジェクトの読み出し
    DriverLicenseFiles files = ap.readFiles();

    // Filesオブジェクトから共通データ要素を取得
    DriverLicenseCommonData commonData = files.getCommonData();
    System.out.println(commonData.toString());

    // Filesオブジェクトから券面情報を取得
    DriverLicenseEntries entries = files.getEntries();
    System.out.println(entries.toString());

    // Filesオブジェクトから顔写真を取得
    DriverLicensePhoto photo = files.getPhoto();
} catch (IOException e) {
    System.out.println("読み取りエラー");
}

運転免許証を読み取るSwiftのサンプルコードです。

do {
    let reader = try JeidReader(tag)
    let ap = try reader.selectDL()

    // 暗証番号1を入力
    do {
        try ap.verifyPin1("XXXX")
    } catch let jeidError as JeidError {
        if case .invalidPin(let counter) = jeidError {
            if jeidError.isBlocked! {
                session.invalidate(errorMessage: "暗証番号1がブロックされています")
            } else {
                session.invalidate(errorMessage: "暗証番号1が間違っています。残り回数: \(counter)")
            }
            return
        }
    }

    // 暗証番号2を入力
    do {
        try ap.verifyPin2("XXXX")
    } catch let jeidError as JeidError {
        if case .invalidPin(let counter) = jeidError {
            if jeidError.isBlocked! {
                session.invalidate(errorMessage: "暗証番号2がブロックされています")
            } else {
                session.invalidate(errorMessage: "暗証番号2が間違っています。残り回数: \(counter)")
            }
            return
        }
    }

    // Filesオブジェクトの読み出し
    let files = try ap.readFiles()

    // Filesオブジェクトから共通データ要素を取得
    let commonData = try files.getCommonData()
    print(commonData.description)

    // Filesオブジェクトから券面情報を取得
    let entries = try files.getEntries()
    print(entries.description)

    // Filesオブジェクトから顔写真を取得
    let photo = try files.getPhoto()
    session.invalidate()
} catch {
    session.invalidate(errorMessage: "読み取りエラー")
}

マイナンバーカード

券面入力補助APの読み取り

マイナンバーカードの券面入力補助APを読み取るJavaのサンプルコードです。

try {
    String pin = "XXXX";
    JeidReader reader = new JeidReader(nfcTag);
    INTextAP ap = reader.selectINTextAP();

    // 暗証番号を入力
    try {
        ap.verifyPin(pin);
    } catch (InvalidPinException e) {
        if (e.isBlocked()) {
            System.out.println("暗証番号がブロックされています。");
        } else {
            System.out.println("暗証番号が間違っています。残り回数: " + e.getCounter());
        }
        return;
    }

    // Filesオブジェクトの読み出し
    INTextFiles files = ap.readFiles();

    // Filesオブジェクトから個人番号を取得
    INTextMyNumber mynumber = files.getMyNumber();
    System.out.println("マイナンバー: " + mynumber.getMyNumber());

    // Filesオブジェクトから4情報を取得
    INTextAttributes attrs = files.getAttributes();
    System.out.println("氏名    : " + attrs.getName());
    System.out.println("住所    : " + attrs.getAddr());
    System.out.println("生年月日  : " + attrs.getBirth());
    System.out.println("性別    : " + attrs.getSexString());
} catch(IOException e) {
    System.out.println("読み取りエラー");
}

マイナンバーカードの券面入力補助APを読み取るSwiftのサンプルコードです。

do {
    let reader = try JeidReader(tag)
    let ap = try reader.selectINText()

    // 暗証番号を入力
    do {
        try ap.verifyPin("XXXX")
    } catch let jeidError as JeidError {
        if case .invalidPin(let counter) = jeidError {
            if jeidError.isBlocked! {
                session.invalidate(errorMessage: "暗証番号がブロックされています")
            } else {
                session.invalidate(errorMessage: "暗証番号が間違っています。残り回数: \(counter)")
            }
            return
        }
    }

    // Filesオブジェクトの読み出し
    let files = try ap.readFiles()

    // Filesオブジェクトから個人番号を取得
    let mynumber = try files.getMyNumber()
    print("マイナンバー: " + mynumber.myNumber!)

    // Filesオブジェクトから4情報を取得
    let attrs = try files.getAttributes()
    print("氏名    : " + attrs.name!)
    print("住所    : " + attrs.address!)
    print("生年月日  : " + attrs.birthDate!)
    print("性別    : " + attrs.sexString!)
    session.invalidate()
} catch {
    session.invalidate(errorMessage: "読み取りエラー")
}

券面APの読み取り

マイナンバーカードの券面APを読み取るJavaのサンプルコードです。

try {
    String pin = "XXXX";
    JeidReader reader = new JeidReader(nfcTag);
    INVisualAP ap = reader.selectINVisualAP();

    // 暗証番号を入力
    try {
        ap.verifyPin(pin);
    } catch (InvalidPinException e) {
        if (e.isBlocked()) {
            System.out.println("PINがブロックされています。");
        } else {
            System.out.println("PINが間違っています。残り回数: " + e.getCounter());
        }
        return;
    }

    // Filesオブジェクトの読み出し
    INVisualFiles files = ap.readFiles();

    // Filesオブジェクトから個人番号(画像)を取得
    INVisualMyNumber myNumber = files.getMyNumber();

    // Filesオブジェクトから券面の表面を取得
    INVisualEntries entries = files.getEntries();
    System.out.println("生年月日  : " + entries.getBirth());
    System.out.println("性別    : " + entries.getSexString());
    System.out.println("有効期限  : " + entries.getExpire());
} catch(IOException e) {
    System.out.println("読み取りエラー");
}

マイナンバーカードの券面APを読み取るSwiftのサンプルコードです。

do {
    let reader = try JeidReader(tag)
    let ap = try reader.selectINVisual()

    // 暗証番号を入力
    do {
        try ap.verifyPin("XXXX")
    } catch let jeidError as JeidError {
        if case .invalidPin(let counter) = jeidError {
            if jeidError.isBlocked! {
                session.invalidate(errorMessage: "PINがブロックされています")
            } else {
                session.invalidate(errorMessage: "PINが間違っています。残り回数: \(counter)")
            }
            return
        }
    }

    // Filesオブジェクトの読み出し
    let files = try ap.readFiles()

    // Filesオブジェクトから個人番号(画像)を取得
    let mynumber = try files.getMyNumber()

    // Filesオブジェクトから券面の表面を取得
    let entries = try files.getEntries()
    print("生年月日  : " + entries.birthDate!)
    print("性別    : " + entries.sexString!)
    print("有効期限  : " + entries.expireDate!)
    session.invalidate()
} catch {
    session.invalidate(errorMessage: "読み取りエラー")
}

公的個人認証(製品版のみ)

try {
    // ユーザー認証用暗証番号
    String authPin = "XXXX";
    // デジタル署名用パスワード
    String signPin = "XXXXXXXX";

    JeidReader reader = new JeidReader(nfcTag);
    JPKIAP jpki = reader.selectJPKIAP();

    // ユーザー認証用証明書を取得
    JPKICertificate authCert = jpki.getAuthCert();

    // ユーザー認証用鍵で署名
    JPKISignature authSignature = jpki.getAuthSignature("SHA1withRSA");
    authSignature.update("hello".getBytes());
    byte[] signed = authSignature.sign(authPin);

    // デジタル署名用証明書を取得
    jpki.verifySignPin(signPin);
    JPKICertificate signCert = jpki.getSignCert();

    // デジタル署名用鍵で署名
    JPKISignature signSignature = jpki.getSignSignature("SHA1withRSA");
    signSignature.update("hello".getBytes());
    signed = signSignature.sign(signPin);
} catch (InvalidPinException e) {
    if (e.isBlocked()) {
        System.out.println("PINがブロックされています。");
    } else {
        System.out.println("PINが間違っています。残り回数: " + e.getCounter());
    }
} catch (IOException e) {
    System.out.println("読み取りエラー");
}

パスポート

パスポートの読み取り

try {
    // パスポート番号
    String passportNumber = "XXXXXXXXX";
    // 生年月日(YYMMDDの6桁)
    String birthDate = "YYYYYY";
    // 有効期限(YYMMDDの6桁)
    String expireDate = "ZZZZZZ";

    JeidReader reader = new JeidReader(nfcTag);
    PassportAP ap = reader.selectPassportAP();

    // EPMRZのインスタンスを生成
    EPMRZ mrz = new EPMRZ(passportNumber, birthDate, expireDate);

    // Basic Access Control用の鍵交換
    try {
        ap.startBAC(mrz);
    } catch (InvalidBACKeyException e) {
        System.out.println("旅券番号、生年月日または有効期限が間違っています");
        return;
    }

    // Filesオブジェクトの読み出し
    EPFiles files = ap.readFiles();

    // FilesオブジェクトからCommon Dataを取得
    EPCommonData commonData = files.getCommonData();
    System.out.println(commonData.toString());

    // FilesオブジェクトからData Group 1 (MRZの情報)を取得
    EPDataGroup1 dg1 = files.getDataGroup1();
    System.out.println(dg1.toString());

    // FilesオブジェクトからData Group 2 (顔写真)を取得
    EPDataGroup2 dg2 = files.getDataGroup2();
} catch (IOException e) {
    System.out.println("読み取りエラー");
}

在留カード

在留カードの読み取り

在留カードを読み取るJavaのサンプルコードです。

try {
    JeidReader reader = new JeidReader(nfcTag);
    ResidenceCardAP ap = reader.selectResidenceCardAP();

    // 在留カード番号または特別永住者証明書番号からRCKeyオブジェクトを生成
    RCKey rckey = new RCKey("XXXXXXXXXXXX");

    // アクセスコントロールの開始
    try {
        ap.startAC(rckey);
    } catch (InvalidACKeyException e) {
        System.out.println("在留カード番号または特別永住者証明書番号が間違っています");
        return;
    }

    // Filesオブジェクトの読み出し
    RCFiles files = ap.readFiles();

    // Filesオブジェクトから券面情報を取得
    RCCardEntries entries = files.getCardEntries();
    System.out.println(entries.toString());

} catch (Exception e) {
    System.out.println("読み取りエラー");
}

在留カードを読み取るSwiftのサンプルコードです。

do {
    let reader = try JeidReader(tag)
    let ap = try reader.selectRC()

    // 在留カード番号または特別永住者証明書番号からRCKeyオブジェクトを生成
    let rckey = try RCKey("XXXXXXXXXXXX")

    // アクセスコントロールの開始
    do {
        try ap.startAC(rckey)
    } catch JeidError.invalidKey {
        session.invalidate(errorMessage: "在留カード番号または特別永住者証明書番号が間違っています")
        return
    }

    // Filesオブジェクトの読み出し
    let files = try ap.readFiles()

    // Filesオブジェクトから共通データ要素を取得
    let commonData = try files.getCommonData()
    print(commonData.description)

    // Filesオブジェクトから券面情報を取得
    let entries = try files.getCardEntries()
    print(entries.description)

    // Filesオブジェクトから顔写真を取得
    let photo = try files.getPhoto()
    session.invalidate()
} catch {
    session.invalidate(errorMessage: "読み取りエラー")
}