通过Android USB主机与智能卡读卡器通信

2024-03-22

我正在尝试向智能卡发送命令。我用一个金雅拓 IDBridge CT30(PC TWIN 读卡器) http://www.smartcardfocus.com/images/content/GEMTR.jpg and a ID桥K30 http://cartesapuce-discount.com/76-371-thickbox/lecteur-de-cartes-a-puce-usb-gempc-tr.jpg通过 USB 连接到 Android 设备。

我尝试通过 USB 发送 SELECT APDU 命令:

boolean claim = openedConnection.claimInterface(usbInterface, true);
byte[] data = new byte[]{
        (byte) 0x00, (byte) 0xA4, (byte) 0x04, (byte) 0x0C,
        (byte) 0x07, (byte) 0xA0, (byte) 0x00, (byte) 0x00,
        (byte) 0x01, (byte) 0x18, (byte) 0x45, (byte) 0x4E};

之后我收到了答复:

final int dataTransferred = this.openedConnection.bulkTransfer(endPointOut, data, data.length, TIMEOUT_MS);
if(!(dataTransferred == 0 || dataTransferred == data.length)) {
    throw new Exception("Error durring sending command [" + dataTransferred + " ; " + data.length + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}

final byte[] responseBuffer = new byte[endPointIn.getMaxPacketSize()];
final int dataTransferred = this.openedConnection.bulkTransfer(this.endPointIn, responseBuffer, responseBuffer.length, TIMEOUT_MS);
Console.writeLine("USB Retrieve: " + dataTransferred + " " + responseBuffer.length);
if(dataTransferred >= 0){
    return responseBuffer;
}
throw new Exception("Error durring receinving response [" + dataTransferred + "]");

那个答案是

0x00 0x00 0x00 0x00 0x00 0xA0 0x00 0x41 0x03 0x00

但是,我应该得到一个答案0x90 0x00根据测试项目在这里 http://labs.a-trust.at/developer/ShowSource.aspx?id=114.

我究竟做错了什么?有谁能够帮助我?我使用正确的方法吗?我没有使用默认的包类javax.smartcardio。我使用 USB 接口类(例如USB设备 https://developer.android.com/reference/android/hardware/usb/UsbDevice.html) 直接地。


您的读卡器设备通过 USB 接口使用 CCID。您不能简单地通过批量输出端点发送 APDU(智能卡命令)并期望通过批量输入端点接收响应 APDU。相反,您需要实现 CCID 设备类协议(请参阅USB 设备类规范 http://www.usb.org/developers/docs/devclass_docs/)。步骤是这样的:

  1. 发送PC_to_RDR_IccPowerOn命令激活卡。
    
    
    62 00000000 00 00 00 0000 
    |  |        |  |  |  |    |
    |  |        |  |  |  |    \--> Empty data field
    |  |        |  |  |  \-------> Unused, set to 0x0000
    |  |        |  |  \----------> Power select: 0x00 indicates automatic selection
    |  |        |  \-------------> Sequence number (increment for each command)
    |  |        \----------------> Slot number (seems to be zero for your device)
    |  \-------------------------> Length of data field (LSB first)
    \----------------------------> Message type: 0x62 indicates PC_to_RDR_IccPowerOn
      
  2. 通过 RDR_to_PC_DataBlock 接收 ATR。
    
    
    80 18000000 00 00 00 00 00 3BBF11008131FE45455041000000000000000000000000F1 
    |  |        |  |  |  |  |  |
    |  |        |  |  |  |  |  \--> Data field: ATR
    |  |        |  |  |  |  \-----> Level parameter
    |  |        |  |  |  \--------> Error register (should be zero on success)
    |  |        |  |  \-----------> Status register (should be zero on success)
    |  |        |  \--------------> Sequence number (matches the sequence number of the command)
    |  |        \-----------------> Slot number (matches the slot number of the command)
    |  \--------------------------> Length of data field (LSB first)
    \-----------------------------> Message type: 0x80 indicates RDR_to_PC_DataBlock
      
  3. 发送命令 APDU 封装在 PC_to_RDR_XfrBlock 命令中
    
    
    6F 0C000000 00 01 00 0000 00A4040C07A000000118454E
    |  |        |  |  |  |    |
    |  |        |  |  |  |    \--> Data field: Command APDU
    |  |        |  |  |  \-------> Level parameter (0x0000 for normal length APDUs)
    |  |        |  |  \----------> Block waiting timeout
    |  |        |  \-------------> Sequence number (increment for each command)
    |  |        \----------------> Slot number (seems to be zero for your device)
    |  \-------------------------> Length of data field (LSB first)
    \----------------------------> Message type: 0x6F indicates PC_to_RDR_XfrBlock
      
  4. 通过 RDR_to_PC_DataBlock 接收响应 APDU。
    
    
    80 02000000 00 01 00 00 00 9000 
    |  |        |  |  |  |  |  |
    |  |        |  |  |  |  |  \--> Data field: Response APDU
    |  |        |  |  |  |  \-----> Level parameter
    |  |        |  |  |  \--------> Error register (should be zero on success)
    |  |        |  |  \-----------> Status register (should be zero on success)
    |  |        |  \--------------> Sequence number (matches the sequence number of the command)
    |  |        \-----------------> Slot number (matches the slot number of the command)
    |  \--------------------------> Length of data field (LSB first)
    \-----------------------------> Message type: 0x80 indicates RDR_to_PC_DataBlock
      
  5. 对每个 APDU 交换重复步骤 3 和 4(不要忘记增加序列号)。

由于 ATR 指示 T=1 作为第一个协议,因此您可能需要将 APDU 包装为 T=1 TPDU(取决于读卡器配置)。第一个 APDU 的 I 块看起来像:



00 00 0C 00A4040C07A000000118454E 15
|  |  |  |                        |
|  |  |  |                        \--> LRC (due to missing TC in ATR): XOR checksum over all other bytes
|  |  |  \---------------------------> INF: APDU
|  |  \------------------------------> LEN: length of INF field
|  \---------------------------------> PCB: toggle between 0x00 and 0x40 for every other I-block
\------------------------------------> NAD: node addressing
  

因此,您的 PC_to_RDR_XfrBlock 命令如下所示:



6F 10000000 00 01 00 0000  00 00 0C 00A4040C07A000000118454E 15
  

然后,您将收到包含在 I 块或 R 或​​ S 块中的答案,表明需要进行一些特殊/错误处理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过Android USB主机与智能卡读卡器通信 的相关文章

  • Android TelecomManager 中的 addIncomingCall 没有执行任何操作

    我正在尝试使用本机 Android 来电 UI 我有一个连接服务 并且我已经成功注册了一个电话帐户 但在我调用方法 addNewIncomingCall 后什么也没有发生 对我所缺少的有什么想法吗 显现
  • 用于 Kotlin 中单元测试的 BuildConfigField 模拟

    我正在尝试尽可能多地涵盖Kotlin Android 库我遇到了有关自定义 BuildConfig 变量的问题 更广为人知的是buildConfigField 我想模拟这个变量来测试两者true and false values 从 Gra
  • 音频流的最佳实践

    我正在编写一个应用程序来播放远程服务器的音频 我尝试了多种方法来实现流音频 但它们对我来说都不够好 这就是我尝试过的 幼稚地使用 MediaPlayer 就像是 MediaPlayer player new MediaPlayer play
  • 我无法再在后台应用程序中接收任何 FCM 消息

    当应用程序处于后台时 我无法再在应用程序中接收任何数据消息 请注意 直到最近它在我的应用程序中都运行良好 也许在我的开发环境最近更新后它停止工作了 我不能说 所以我尝试用快速入门 android 项目 https github com fi
  • 如何在不使用 Firebase 控制台的情况下发送 Firebase 云消息通知?

    我从新的 Google 通知服务开始 Firebase Cloud Messaging 感谢这段代码https github com firebase quickstart android tree master messaging htt
  • 当我单击“完成”键时,Android OnEditorActionListener() actionId 给出 0

    我创建了一个键盘 当用户输入数字时 它会输入特定的 EditText 但是当用户单击Done关键 它没有去setOnEditorActionListener但它关闭了键盘 这是我的代码 final EditText txtQty new E
  • 蓝牙 BLE Android 以最大吞吐量写入外设

    我们公司开发了一个具有蓝牙 BLE 的硬件单元 并且我们在 Nexus 7 2013 中有一个服务应用程序 我们希望使用它向该单元发送固件文件 文件最大可达 500kb BT芯片是德州仪器CC2540 我浏览了大量的页面 并扫描了 Stac
  • 如何在Android中的DataBinding的ViewModel类中获取R.string

    我目前正在使用databinding对于我的 Android 应用程序项目 我想设置error留言在我的CustomTextView from R string txtOldPassWordError并从另一个名为的类中进行设置ViewMo
  • Play 商店中的应用描述更新

    我想更新应用程序的描述以及 Play 商店上的屏幕截图 但应用程序保持相同 即相同的版本号 我不想发布新应用程序 因为应用程序中没有任何更改 这可能吗 谷歌也会要求更新应用程序吗 您可以更新描述 也可以更改屏幕截图 您的应用程序将保持不变
  • 在 NFC 标签扫描期间,onNewIntent() 内的intent.getAction() 为 null

    这是我第一次使用 NFC 标签 我在清单中声明了 NFC 扫描活动
  • 如何清除Android剪贴板?

    我发现的方法都不起作用 这是我尝试过的 1 使用clearPrimaryClip 的方法ClipboardManager class ClipboardManager clipboard ClipboardManager getSystem
  • 什么是 Android 测试协调器?

    谷歌最近发布了Android测试支持库1 0 读完后overview https android developers googleblog com 2017 07 android testing support library 10 is
  • Toast 消息消失后​​完成活动吗?

    有谁知道 是否有可能对 Toast 消息执行某些操作 在我的情况下完成活动 将被关闭 您只需创建一个Thread持续时间只要Toast显示 然后您就可以完成您的Activity public void onCreate Bundle sav
  • Android - 状态栏阻止全屏

    我的应用程序启动时可以全屏正确运行 然而 在最小化然后返回应用程序后 状态栏会弹出 并将我的视图向下推一点 如何防止状态栏移动我的视图 这是我的布局
  • TextView.setMaxLines 不起作用?

    在我的应用程序中 我有一个屏幕 其中显示一些文本 然后显示一张照片 文本的长度是可变的 有时根本没有 有时很多 所以我想对其进行设置 以便文本永远不会占用超过几行 但可以滚动 为下面的图像留下足够的空间 我这部分的视图组件是以编程方式创建的
  • Android 中 Activity 之间的 3D 动画

    How to create animation between two Activity look like As Screen shot in android 搜索jazzyviewpager 这是link https github co
  • 使 Recyclerview 固定高度并可滚动

    已解决以下检查答案 所以我试图为我的 Android 应用程序创建评论功能 我想在 recyclerview 中显示评论 然后在 recyclerview 下方有一个按钮和文本视图来添加评论 我想让 recyclerview 具有一定的高度
  • 通过 Gradle 和 Android Studio 构建和运行应用程序比通过 Eclipse 慢

    我有一个多项目 10 个模块 每次构建大约需要 20 30 秒 当我在 Android Studio 中按 运行 时 每次都必须等待才能重建应用程序 这非常慢 是否可以在 Android Studio 中自动化构建过程 或者您对如何加快此过
  • XML 配置中的 screenName 不起作用

    我刚刚在我的应用程序中添加了对 Google Analytics 分析 的支持 但我无法
  • TabLayout 的不同 tabMode

    我正在使用 ViewPager 和 TabLayout 如果选项卡可以放置在显示 tabMode 上 则它们必须是 app tabMode fixed else app tabMode scrollable 我怎样才能做到这一点 我不明白你

随机推荐

  • 我应该如何订购 DI/IOC 的 ctor 参数?

    我是一个 DI 新手 所以如果这是错误的方法或一个愚蠢的问题 请原谅我 假设我有一个创建 更新订单的表单 并且我知道它将需要检索要显示的产品和客户列表 我想传递它正在编辑的 Order 对象 但我还想注入 ProductsService 和
  • 作为 Windows 服务运行时,如何获取活动监视器的数量? C++

    当 exe 作为 Windows 服务运行时 我在检索活动监视器的数量时遇到了问题 我尝试使用 EnumDisplayDevices 和 GetSystemMetrics SM CMONITROS 来获取监视器的数量 这两种方法在以控制台模
  • 如何更改本地sql server sa密码?

    我是计算机的本地管理员 如何更改本地安装的 sql server 2008 的 sa 密码 注意 我不知道sa帐户的密码 该线程的回复确实很晚 但我刚刚丢失并重置了 SA 的密码 按照以下简单步骤操作即可完成 在 Windows 身份验证模
  • Facebook Like Box:如何检测用户是否已经喜欢该页面?

    我在我的博客中安装了 Like Box 我想知道用户是否已经喜欢我的页面 我想向我的读者实现这样的东西 因为如果他们已经喜欢我的页面 我想向他们提供隐藏的内容 是否有一个事件可以检测用户是否已经喜欢 赞 框中的页面 如果您使用的是 XFBM
  • 如何将 Springdoc Swagger UI 指向我自己的 YAML 文件而不是自动生成的文件?

    我创建了一个 Spring Boot RESTFul 微服务 对于文档 我创建了一个 swagger yaml 文件 但我不知道如何运行该文件 为了创建 swagger yaml 文件 我使用了 OpenAPI 规范 我知道我们有一个 Sw
  • 长数组列表渲染使 Angular.js 中的页面滚动变慢

    当尝试从数组 带有图像 渲染超过 120 个项目时滚动列表的速度变慢 基本上 当我在无限滚动中加载新数据时 我会将旧数组数据与新数组数据连接起来 另一方面 像 dribbble behance 这样的流行网站似乎没有这个问题 也许这个问题是
  • Pimpl 习语的实践

    SO 上有一些关于粉刺成语 但我更好奇它在实践中被利用的频率是多少 我知道性能和封装之间存在一些权衡 再加上额外的重定向带来的一些调试烦恼 那么 这是应该在每个班级中采用 还是全有或全无的基础上采用 这是最佳实践还是个人偏好 我意识到这有点
  • 从一个 data.frame 中选择第二个 data.frame 中不存在的行

    我有两个数据框 a1 lt data frame a 1 5 b letters 1 5 a2 lt data frame a 1 3 b letters 1 3 我想找到 a1 有而 a2 没有的行 是否有针对此类操作的内置函数 注 我确
  • .Net 和插件架构

    继 Jeff 和 Joel 对插件架构的讨论之后 C 中的插件 使用运行时加载的 dll 总是有点麻烦 您必须做大量的基础工作才能启用它们 然后插件也必须用 C 编写 甚至通常使用相同的编译器 COM 对象和 ActiveX 解决了其中一些
  • |数据目录|返回 AppData 文件夹的错误路径

    DataDirectory 您只有一份工作 DataDirectory 在 IIS7 5 上解析为 C inetpub wwwroot appname App Data 该文件夹不存在 正确的文件夹是 C inetpub wwwroot a
  • 解析 android:drawable 的 XML 时出错

    你好 我面临一个问题 我希望我的应用程序从框架中获取资源 这是我的 xml 代码片段 为此 在 attrs xml 中进行了以下更改 和框架级别的 theme xml android drawable btn minus ss 可绘制btn
  • 将 C++ 项目移植到 Android

    我有一个在 Windows 上开发的大型 C 应用程序 我需要将其移植到 Android 才能将其作为 Galaxy Tab 应用程序运行 我读了很多关于 NDK 的教程 但将 C 文件嵌入到 Android 中似乎很困难 我可以使用NDK
  • AccessController checkPermission 总是抛出异常

    如何检查应用程序是否有权读取或写入文件系统上的特定目录 我正在尝试这个 try AccessController checkPermission new FilePermission files i getAbsolutePath read
  • “virtualenv”不被识别为内部或外部命令、可操作程序或批处理文件

    安装Python和Djangom后 我尝试使用virtualenv使用 virtualenv 来实现 django 项目目的 我使用 pip 安装了 virtualenv pip install virtualenv got install
  • 使用新的 Net Core 3.0 Json 忽略 null 属性

    在 ASP Net Core 2 2 中使用 JSON Net 时 当序列化为 JSON 时 我能够忽略值为 null 的属性 JsonProperty NullValueHandling NullValueHandling Ignore
  • 将 .NET Core 重新定位到 net471、net 472

    我的 Netcore 2 0项目可以定位net471 但是当我升级到 NET 2 1时 我无法重新定位net471 or net472 我可以在最新版本的 the NET core 中重定向吗 Severity Code Descripti
  • letrec、命名let和内部定义的常见用法?

    我有几本关于Scheme的书 其中一些提到了名为let和letrec的书 但没有一本真正给出了令人信服的例子 我的意思是 我何时以及为何使用其中一个而不是另一个 是否存在 letrec named let 确实是比内部定义甚至外部辅助过程更
  • 如何在一个文件中使用java中的多个类?

    我想知道如何在java中的一个文件中使用多个类 我输入了这段代码 但它显示编译错误 class test int a b c void getdata int x int y a x b y void add c a b System ou
  • 基于WordNet测量语义相似度,Brown Corpus有什么用

    我遇到了几种使用 WordNet 的结构和层次结构来测量语义相似性的方法 例如Jiang and Conrath测度 JNC Resnik测度 RES 林测度 LIN 等 使用 NLTK 测量它们的方式是 sim2 wn jcn simil
  • 通过Android USB主机与智能卡读卡器通信

    我正在尝试向智能卡发送命令 我用一个金雅拓 IDBridge CT30 PC TWIN 读卡器 http www smartcardfocus com images content GEMTR jpg and a ID桥K30 http c