NFC chip reading
The chip on Turkish ID cards and passports is read with PassportReader. Accessing the chip needs the document’s serial number, date of birth and expiry date; take them from the document capture result (CapturedModel) and let the user confirm them.
1. Turn on reader mode
Section titled “1. Turn on reader mode”NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);adapter.enableReaderMode(this, this::onTagDiscovered, NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_NFC_B, null);Add the BouncyCastle provider when the app starts:
Security.addProvider(new BouncyCastleProvider());2. Get a nonce and read the chip
Section titled “2. Get a nonce and read the chip”When the document is detected, get a transaction-specific nonce from Prove ID for active authentication and read the chip:
void onTagDiscovered(Tag tag) { IsoDep isoDep = IsoDep.get(tag);
ServerCall.generateNonce(new GenerateNonceInputModel(transactionId), new TechsignServiceListener<GenerateNonceReturnModel>() { @Override public void onSuccess(GenerateNonceReturnModel data) { readChip(isoDep, data.getNonce()); }
@Override public void onFailure(Exception e) { } });}
void readChip(IsoDep isoDep, String nonce) { isoDep.setTimeout(60000); try { // From the document capture (let the user confirm them) SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy"); String serialNumber = capturedModel.getSno(); Date birthDate = format.parse(capturedModel.getBdat()); Date expireDate = format.parse(capturedModel.getEdat());
PassportReader reader = new PassportReader(this, new LocalNFCCommandTransmitter(isoDep)); reader.read(serialNumber, birthDate, expireDate, nonce, new PassportReaderCallback() { @Override public void result(PassportModel chip) { // Send the chip data for validation (below) }
@Override public void progress(NFCOperationType type, double progress) { // AUTHENTICATION, DG1, DG15, DG2 }
@Override public void error(Exception e) { // See Errors } }); } catch (ParseException e) { // Dates must be dd.MM.yyyy }}3. Validate the chip data
Section titled “3. Validate the chip data”IDValidationModel validation = new IDValidationModel( chip.getDg1(), chip.getDg2(), chip.getSod(), chip.getDg11(), chip.getDg12(), chip.getDg14(), chip.getDg15(), chip.getNonce(), chip.getSignedData());
ServerCall.validateAndSave(new ValidationInputModel(validation, "IDCARD", transactionId), new TechsignServiceListener<SaveIdReturnModel>() { @Override public void onSuccess(SaveIdReturnModel result) { ControlEntryModel[] controls = result.getControlResults(); }
@Override public void onFailure(Exception e) { } });