İçeriğe geç

NFC çip okuma

T.C. kimlik kartı ve pasaportlardaki çip, PassportReader ile okunur. Çipe erişmek için belgenin seri numarası, doğum tarihi ve son geçerlilik tarihi gerekir; bunları belge tarama sonucundan (CapturedModel) alıp kullanıcıya onaylatabilirsiniz.

NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);
adapter.enableReaderMode(this, this::onTagDiscovered,
NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_NFC_B,
null);

Uygulama başlarken BouncyCastle sağlayıcısını ekleyin:

Security.addProvider(new BouncyCastleProvider());

Belge algılandığında, aktif kimlik doğrulama için Prove ID’den işleme özel bir nonce alıp çipi okuyun:

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 {
// Belge taramasından gelen bilgiler (kullanıcıya onaylatın)
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) {
// Çip verisini doğrulamaya gönderin (aşağıda)
}
@Override
public void progress(NFCOperationType type, double progress) {
// AUTHENTICATION, DG1, DG15, DG2
}
@Override
public void error(Exception e) {
// Bkz. Hatalar
}
});
} catch (ParseException e) {
// Tarih biçimi dd.MM.yyyy olmalı
}
}
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) { }
});