NFC SDK Release Notes

Release Notes

The Daon NFC SDK can read and verify electronic passports and travel cards that comply with the ICAO specifications for Machine Readable Travel Documents.

Sizing

The table below contains the universal binary sizes based on building a basic application with a specific feature supported.

Architecture

NFC

armeabi-v7a

0.1 MB

arm64-v8a

0.1 MB

NFC SDK v1.4.28

Preview

November 2026

What's Changed

  • Improved PACE master-file selection and chip-file reads for certain response errors.

  • Added support for ISO 39794 face-image records alongside ISO 19794, with fallback between representations.

  • Improved RSA active authentication and MRZ/BAC handling.

  • File-read progress now reflects bytes delivered to the SDK, including cached bytes, rather than APDU events.

Dependency Upgrades

  • JMRTD: 0.8.7 → 0.8.9

  • Scuba smartcards: 0.0.20 → 0.0.21 (transitive)

  • Bouncy Castle bcprov-jdk18on and bcutil-jdk18on: 1.85 → 1.86 (transitive)

Transitive versions shown are those declared by JMRTD; your application may resolve different versions.

API and Behavior Changes

  • Added NFCReader.pause() to suspend foreground dispatch without cancelling an active read. disable() still cancels it; automatic lifecycle handling continues to call disable() on pause.

  • enable() now registers dispatch only when the activity is RESUMED. In manual mode, use an ON_RESUME lifecycle observer: calling it from the activity's onResume() can be too early on Android 10 and later.

  • Starting a new read now cancels an active read, whose callback receives TagError.ERROR_CANCELLED.

  • MRZRecognizer.processBAC() validates OCR line formats more strictly while accepting missing TD1/TD3 composite check digits.

  • No existing public SDK method signatures were removed or changed.

  • For direct JMRTD users: org.jmrtd.lds.EFDIRInfo was removed, and ASN1Util() is no longer publicly constructible.

Upgrade Notes for Integrators

Update any explicit org.jmrtd:jmrtd dependency to 0.8.9 and avoid forcing older transitive dependency versions.

Physical-device qualification remains necessary for BAC/PACE fallback, large DG2 reads, JPEG 2000 portraits, and RSA/EC active authentication.

NFC SDK v1.4.23

August 2026

What's Changed

  • Eliminated known CVEs.

  • Dependency updates:

  • JMRTD 0.8.6 → 0.8.7 - Improved passport compatibility by updating the JMRTD dependency.

  • OpenJPEG 2.2.0 → 2.5.4 - Rebuilt the native components with Android NDK r28 to support 16 KB memory page sizes and meet Google Play compatibility requirements.

  • Dependency cleanup:

    • Removed the explicit org.bouncycastle:bcprov-jdk18on:1.84 dependency. Bouncy Castle is already provided transitively by JMRTD, so the explicit dependency was redundant and could cause recurring version conflicts.

    • Removed the com.github.mhshams:jnbis dependency.

  • Reduced overall library size through dependency optimizations.

Upgrade Notes for Integrators

  • Remove any explicit org.bouncycastle:bcprov-jdk18on dependency from your project, along with any Bouncy Castle exclusion rules added to work around dependency conflicts.

  • Remove any com.github.mhshams:jnbis dependency from your project.

  • If your build fails due to a duplicate META-INF/LICENSE.md, add the following to your Android configuration:

android {
packaging {
resources {
excludes += ['META-INF/LICENSE.md']
}
}
}

NFC SDK v1.4.15

July 2026

What's Changed

This release focuses on broader ePassport compatibility, faster scans, more accurate failure reporting, and several robustness/security hardening fixes.

Document Compatibility Fixes

  • Improved German ePassport support - Fixed an issue that could prevent some German passports from completing access-control authentication, improving read reliability and compatibility.

  • Improved compatibility with passports that advertise multiple PACE configurations - The reader now evaluates all supported PACE options when establishing a secure session, improving compatibility with certain German, UK, and other ePassports.

  • Improved Serbian ePassport support (issue code 309) - Fixed an issue in Passive Authentication that could prevent successful verification on some Serbian passports.

Behavior Changes

  • Accurate authentication failure reporting - Failures are now classified instead of being reported as an MRZ mismatch:

    • Wrong MRZ / rejected key → ERROR_NO_ACCESS.

    • Lost tag / I/O / unresponsive chip → ERROR_CONNECTION_LOST.

    • PACE on a BAC-only document → ERROR_PACE_NOT_SUPPORTED.

  • Faster failure detection - The reader now reports authentication failures immediately with the correct error instead of performing additional fallback operations that could delay the result.

  • Improved read isolation between sessions - Reader configuration is now reset for each scan, preventing settings from a previous read from affecting subsequent document reads.

  • More reliable authentication status reporting - Card access success and failure events now accurately reflect the outcome of the authentication process.

  • Improved NFC communication reliability - Increased NFC communication timeouts to better accommodate slower documents and devices.

  • Enhanced Active Authentication compatibility - Signature algorithms are now automatically detected from document data, improving interoperability across a wider range of ePassports.

Performance

  • Extended-length APDU reading — when both the chip and the reader support it, data groups are read in larger chunks, cutting NFC round-trips and noticeably speeding up large files. The reader falls back to normal APDUs when unsupported.

New Public APIs

  • TagError.ERROR_CONNECTION_LOST (0x0A0C) — The chip connection was lost mid-read (an I/O failure).

  • TagError.ERROR_PACE_NOT_SUPPORTED (0x0A2C) — PACE was attempted on a document that does not support it.

NFC SDK v1.4.5

April 2026

Breaking API Changes

  • NFCAnalyticsReaderConfiguration has been made internal and is no longer accessible as part of the public API. Customers that were referencing this class directly must remove this reference.

Improvements

Maven Repository Distribution

  • The Daon NFC SDK is now available as a standard Maven dependency. It can be added directly to a project using your preferred build tool by declaring the Daon Maven repository and adding the SDK as a dependency — no additional setup or manual file management is required. This makes it easier to keep the SDK up to date and simplifies integration into new projects.

New Jetpack Compose Sample App

  • A new sample application has been added to demonstrate how to integrate the NFC SDK using Jetpack Compose — Android's modern UI toolkit. The sample app showcases a complete NFC scanning flow, including a scan screen with an animated indicator that provides real-time visual feedback during scanning, distinct icons for each scan state (idle, scanning, success, failure), a result screen displaying the data read from the document, and full support for dark and light themes. The implementation follows modern Android architecture best practices and includes automated tests to verify correct behavior.

    The source code for this sample is publicly accessible here: https://github.com/daoninc/nfc-sdk-android

Improved Scan Reliability

  • The NFC scanning process has been made more reliable when a scan is stopped or interrupted. If scanning is cancelled while a read is in progress, the process now stops cleanly and immediately, ensuring resources are freed and the application returns to a consistent state without any lingering background activity.

Dependency Version Catalog

  • All third-party library versions used by the SDK are now managed through a centralized Gradle version catalog (gradle/libs.versions.toml). Instead of hardcoding version strings scattered across individual build.gradle files, all versions are declared once in the catalog and referenced by alias throughout the project.

To use the version catalog in your own project, declare it in your settings.gradle:

dependencyResolutionManagement {
versionCatalogs {
libs {
from(files("gradle/libs.versions.toml"))
}
}
}

Any version of the library can then be reference by its alias in your build.grade:

dependencies {
implementation libs.androidx.appcompat
implementation libs.bouncycastle.bcprov
implementation libs.jmrtd
}

And override or pin a specific version by referencing the versions block:

dependencies {
implementation libs.androidx.appcompat // version is managed in libs.versions.toml
}

This approach makes it easy to audit and update dependency versions in a single place, and ensures consistency across all modules in the project.

Bug Fixes

Issue ID

Description

OBM-4212

Resolved an issue where scanning restarted automatically without user interaction by adding state validation checks.

OBM-4216

Fixed a potential crash occurring in multi-window environments.

OBM-4217

Improved scan reliability when scanning is stopped mid-read.

Library Updates

Library

v1.3.53

v1.4.5

AndroidX AppCompat

1.4.1

1.7.1

Jetpack Compose BOM

-

2024.12.01 (new — sample app)

MockK

-

.13.12 (new — sample app tests)