首页 > 解决方案 > Android 手机无法使用“android.se.omapi.Reader.isSecureElementPresent()”找到自定义 SIM 卡

问题描述

我发布这个问题是因为我找不到合适的地方来问这个问题。

我正在使用智能卡开发自定义安全元素。

我成功SEService连接并Reader使用seservice.getReaders().

但是,当我打电话时reader.isSecureElementPresent(),它会返回false

当我尝试使用普通 SIM 卡时,我可以找到安全元件,并true在我调用时返回reader.isSecureElementPresent()

所以我推断手机无法识别我的自定义 SIM 卡native smartcard。实际上,我的原生智能卡可以在普通读卡器上正常工作,并且该卡支持ISO/IEC 7816-4T=0 protocol.

当我尝试使用 aJava Card时,手机能够找到卡,并成功获取 ATR。

因此,手机无法识别native smartcardjavacard

isSecureElementPresent()在 Android 上通过方法找到安全元素是否有特定要求?

我查看了Open Mobile API 3.3,但对该方法没有足够的解释isSecureElementPresent()

我假设手机找不到我的原生智能卡,可能是因为GlobalPlatform Card SpecificationOpen Mobile API 3.3是由GlobalPlatform组织创建的,所以它没有实现。实际上 Java Card 支持GlobalPlatform Card Specification. 这就是为什么我这么认为的原因。

标签: androidgoogle-apismartcardjavacardglobalplatform

解决方案


这是一个有趣的问题,虽然我没有答案,但我可以指出一种方法来获取我已经使用过的一些信息。

2个猜测:

  • 你的 SE 没有 SIM 卡文件系统,不被识别为 UICC
  • 缺少运营商特权小程序(GP 安全元素访问规则),可能需要它

如果这没有帮助,这里是进一步研究的来源的链接:

http://aosp.opersys.com/xref/android-10.0.0_r39/xref/frameworks/base/core/java/android/se/omapi/Reader.java

http://aosp.opersys.com/xref/android-10.0.0_r39/xref/frameworks/base/core/java/android/se/omapi/ISecureElementReader.aidl

不幸的是,AIDL 是内部的。在这种情况下,我所做的是使用Magisk,然后使用edXposed框架。后者允许拦截系统调用,例如用于记录目的。我编写了一个示例项目来揭露无线电日志的响应 APDU。这可用于此建议和下一个建议。

在较低级别上,查看交换的 APDU 也应该很有帮助。这应该可以通过查看无线电日志来实现logcat -b radio *:V

最后,SIM 卡跟踪器也非常有用,可以查看手机如何与您的 SE 交互,例如查看 APDU。如果某些命令返回错误,则表明您已经找到了一个候选人。这应该使您可以完全控制比较接受的 UICC 和您的解决方案。

我已经成功使用了以前版本的SIMTrace,但在旧手机上。如果这不可用,请寻找替代品,或者您有一位可以将某些东西焊接在一起的工程师。


推荐阅读