Skip to content

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.

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());

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
}
}
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) { }
});