From 384270f57bd203114c61c856d47500556c87db4f Mon Sep 17 00:00:00 2001 From: septs Date: Tue, 1 Apr 2025 18:39:43 +0800 Subject: [PATCH 1/3] fix: usb isd-r aid fallback --- .../openeuicc/core/DefaultEuiccChannelManager.kt | 12 ++++++------ .../im/angry/openeuicc/core/usb/UsbApduInterface.kt | 2 +- .../main/java/im/angry/openeuicc/util/StringUtils.kt | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelManager.kt b/app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelManager.kt index 74ec285..5a22629 100644 --- a/app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelManager.kt +++ b/app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelManager.kt @@ -55,7 +55,7 @@ open class DefaultEuiccChannelManager( parseIsdrAidList(appContainer.preferenceRepository.isdrAidListFlow.first()) return isdrAidList.firstNotNullOfOrNull { - Log.i(TAG, "Opening channel, trying ISDR AID ${it.encodeHex()}") + Log.i(TAG, "Opening channel, trying ISD-R AID: ${it.encodeHex()}") openFn(it)?.let { channel -> if (channel.valid) { @@ -277,11 +277,11 @@ open class DefaultEuiccChannelManager( ) try { val channel = tryOpenChannelFirstValidAid { - euiccChannelFactory.tryOpenUsbEuiccChannel( - device, - iface, - it - ) + try { + euiccChannelFactory.tryOpenUsbEuiccChannel(device, iface, it) + } catch (_: IllegalArgumentException) { + null + } } if (channel != null && channel.lpa.valid) { usbChannel = channel diff --git a/app-common/src/main/java/im/angry/openeuicc/core/usb/UsbApduInterface.kt b/app-common/src/main/java/im/angry/openeuicc/core/usb/UsbApduInterface.kt index 31ba333..107395f 100644 --- a/app-common/src/main/java/im/angry/openeuicc/core/usb/UsbApduInterface.kt +++ b/app-common/src/main/java/im/angry/openeuicc/core/usb/UsbApduInterface.kt @@ -53,7 +53,7 @@ class UsbApduInterface( "A9088100820101830107".decodeHex(), le = null, ) - transmitApduByChannel(terminalCapabilities, 0,) + transmitApduByChannel(terminalCapabilities, 0) } override fun disconnect() { diff --git a/app-common/src/main/java/im/angry/openeuicc/util/StringUtils.kt b/app-common/src/main/java/im/angry/openeuicc/util/StringUtils.kt index 9f993a3..99cf0b3 100644 --- a/app-common/src/main/java/im/angry/openeuicc/util/StringUtils.kt +++ b/app-common/src/main/java/im/angry/openeuicc/util/StringUtils.kt @@ -36,6 +36,7 @@ fun formatFreeSpace(size: Int): String = fun parseIsdrAidList(s: String): List = s.split('\n').map(String::trim).filter { !it.startsWith('#') } .map(String::trim) + .filter(String::isNotEmpty) .mapNotNull { try { it.decodeHex() From b090bb007cf33327e4d51de23f58f2e95b567c49 Mon Sep 17 00:00:00 2001 From: septs Date: Tue, 1 Apr 2025 20:39:12 +0800 Subject: [PATCH 2/3] fix: usb isd-r aid fallback --- .../im/angry/openeuicc/core/DefaultEuiccChannelManager.kt | 6 +----- .../java/im/angry/openeuicc/core/usb/UsbApduInterface.kt | 6 +++--- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelManager.kt b/app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelManager.kt index 5a22629..0f6e6b3 100644 --- a/app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelManager.kt +++ b/app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelManager.kt @@ -277,11 +277,7 @@ open class DefaultEuiccChannelManager( ) try { val channel = tryOpenChannelFirstValidAid { - try { - euiccChannelFactory.tryOpenUsbEuiccChannel(device, iface, it) - } catch (_: IllegalArgumentException) { - null - } + euiccChannelFactory.tryOpenUsbEuiccChannel(device, iface, it) } if (channel != null && channel.lpa.valid) { usbChannel = channel diff --git a/app-common/src/main/java/im/angry/openeuicc/core/usb/UsbApduInterface.kt b/app-common/src/main/java/im/angry/openeuicc/core/usb/UsbApduInterface.kt index 107395f..8511a0e 100644 --- a/app-common/src/main/java/im/angry/openeuicc/core/usb/UsbApduInterface.kt +++ b/app-common/src/main/java/im/angry/openeuicc/core/usb/UsbApduInterface.kt @@ -70,12 +70,12 @@ class UsbApduInterface( transmitApduByChannel(req, 0) } catch (e: Exception) { e.printStackTrace() - return -1 + return 0 } if (!isSuccessResponse(resp)) { Log.d(TAG, "OPEN LOGICAL CHANNEL failed: ${resp.encodeHex()}") - return -1 + return 0 } val channelId = resp[0].toInt() @@ -87,7 +87,7 @@ class UsbApduInterface( if (!isSuccessResponse(selectAidResp)) { Log.d(TAG, "Select DF failed : ${selectAidResp.encodeHex()}") - return -1 + return 0 } channels.add(channelId) From e31200d1422387d88b3d4f437b783c26ce8c6d0d Mon Sep 17 00:00:00 2001 From: septs Date: Tue, 1 Apr 2025 21:18:20 +0800 Subject: [PATCH 3/3] fix: usb isd-r aid fallback --- .../core/DefaultEuiccChannelFactory.kt | 39 ++++++++++++------- .../core/DefaultEuiccChannelManager.kt | 6 +-- .../openeuicc/core/usb/UsbApduInterface.kt | 2 +- .../im/angry/openeuicc/util/StringUtils.kt | 13 +++---- 4 files changed, 31 insertions(+), 29 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelFactory.kt b/app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelFactory.kt index b249675..74dd881 100644 --- a/app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelFactory.kt +++ b/app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelFactory.kt @@ -60,7 +60,7 @@ open class DefaultEuiccChannelFactory(protected val context: Context) : EuiccCha Log.i(DefaultEuiccChannelManager.TAG, "Is OMAPI channel, setting MSS to 60") it.lpa.setEs10xMss(60) } - } catch (e: IllegalArgumentException) { + } catch (_: IllegalArgumentException) { // Failed Log.w( DefaultEuiccChannelManager.TAG, @@ -80,20 +80,29 @@ open class DefaultEuiccChannelFactory(protected val context: Context) : EuiccCha if (bulkIn == null || bulkOut == null) return null val conn = usbManager.openDevice(usbDevice) ?: return null if (!conn.claimInterface(usbInterface, true)) return null - return EuiccChannelImpl( - context.getString(R.string.usb), - FakeUiccPortInfoCompat(FakeUiccCardInfoCompat(EuiccChannelManager.USB_CHANNEL_ID)), - intrinsicChannelName = usbDevice.productName, - UsbApduInterface( - conn, - bulkIn, - bulkOut, - context.preferenceRepository.verboseLoggingFlow - ), - isdrAid, - context.preferenceRepository.verboseLoggingFlow, - context.preferenceRepository.ignoreTLSCertificateFlow, - ) + try { + return EuiccChannelImpl( + context.getString(R.string.usb), + FakeUiccPortInfoCompat(FakeUiccCardInfoCompat(EuiccChannelManager.USB_CHANNEL_ID)), + intrinsicChannelName = usbDevice.productName, + UsbApduInterface( + conn, + bulkIn, + bulkOut, + context.preferenceRepository.verboseLoggingFlow + ), + isdrAid, + context.preferenceRepository.verboseLoggingFlow, + context.preferenceRepository.ignoreTLSCertificateFlow, + ) + } catch (_: IllegalArgumentException) { + // Failed + Log.w( + DefaultEuiccChannelManager.TAG, + "USB APDU interface unavailable for ${usbDevice.vendorId}:${usbDevice.productId}." + ) + } + return null } override fun cleanup() { diff --git a/app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelManager.kt b/app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelManager.kt index 74ec285..ac9ba08 100644 --- a/app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelManager.kt +++ b/app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelManager.kt @@ -277,11 +277,7 @@ open class DefaultEuiccChannelManager( ) try { val channel = tryOpenChannelFirstValidAid { - euiccChannelFactory.tryOpenUsbEuiccChannel( - device, - iface, - it - ) + euiccChannelFactory.tryOpenUsbEuiccChannel(device, iface, it) } if (channel != null && channel.lpa.valid) { usbChannel = channel diff --git a/app-common/src/main/java/im/angry/openeuicc/core/usb/UsbApduInterface.kt b/app-common/src/main/java/im/angry/openeuicc/core/usb/UsbApduInterface.kt index 31ba333..107395f 100644 --- a/app-common/src/main/java/im/angry/openeuicc/core/usb/UsbApduInterface.kt +++ b/app-common/src/main/java/im/angry/openeuicc/core/usb/UsbApduInterface.kt @@ -53,7 +53,7 @@ class UsbApduInterface( "A9088100820101830107".decodeHex(), le = null, ) - transmitApduByChannel(terminalCapabilities, 0,) + transmitApduByChannel(terminalCapabilities, 0) } override fun disconnect() { diff --git a/app-common/src/main/java/im/angry/openeuicc/util/StringUtils.kt b/app-common/src/main/java/im/angry/openeuicc/util/StringUtils.kt index 9f993a3..079853e 100644 --- a/app-common/src/main/java/im/angry/openeuicc/util/StringUtils.kt +++ b/app-common/src/main/java/im/angry/openeuicc/util/StringUtils.kt @@ -34,15 +34,12 @@ fun formatFreeSpace(size: Int): String = * If none is found, at least EUICC_DEFAULT_ISDR_AID is returned */ fun parseIsdrAidList(s: String): List = - s.split('\n').map(String::trim).filter { !it.startsWith('#') } + s.split('\n') .map(String::trim) - .mapNotNull { - try { - it.decodeHex() - } catch (_: IllegalArgumentException) { - null - } - } + .filter { !it.startsWith('#') } + .map(String::trim) + .filter(String::isNotEmpty) + .mapNotNull { runCatching(it::decodeHex).getOrNull() } .ifEmpty { listOf(EUICC_DEFAULT_ISDR_AID.decodeHex()) } fun String.prettyPrintJson(): String {