【发布时间】:2014-09-30 22:16:26
【问题描述】:
如何从卡中获取java卡版本? 有什么方法可以从卡中获取 JC 的版本。 或者我应该尝试为每个 JC 版本选项安装特定的小程序。
【问题讨论】:
-
不要忘记跟进您的问题。
-
我还发现了有用的项目AlgTest。它有助于确定卡支持哪些加密算法。此信息还有助于确定 JC 版本。
如何从卡中获取java卡版本? 有什么方法可以从卡中获取 JC 的版本。 或者我应该尝试为每个 JC 版本选项安装特定的小程序。
【问题讨论】:
确定“白色”智能卡支持的 JavaCard API 版本的唯一全面验证方法是为每个 JavaCard 版本构建单独的 CAP 文件。
我建议你让每个 CAP 只包含一个扩展 javacard.framework.Applet 的简单类。您可能希望能够实际安装您的简单小程序并与它实际交换 APDU,以确保它确实有效;据我所知,即使并非所有导入都已解决,Java Card 虚拟机实现也允许上传 CAP 文件,但如果您尝试实际使用 API,则应该会失败。
生成 CAP 文件后,您可以通过解析生成的 CAP 文件中的 COMPONENT_Import 组件来验证它是否确实链接到预期的 JavaCard API 包。 JavaCard 虚拟机规范中描述了 CAP 文件格式,您需要的字段是导入的 JavaCard 包的 package_info。
我已经包含了一个 AID 列表 - package_version_major.package_version_minor (package_name) 信息。该列表可能不完整。
Java Card 2.1.1:A0000000620201 - 1.1 (javacardx.crypto)
Java Card 2.1.1:A0000000620101 - 1.0 (javacard.framework)
Java Card 2.1.1:A0000000620001 - 1.0 (java.lang)
Java Card 2.1.1:A0000000620102 - 1.1 (javacard.security)
Java Card 2.2.1:A0000000620201 - 1.2 (javacardx.crypto)
Java Card 2.2.1:A0000000620101 - 1.2 (javacard.framework)
Java Card 2.2.1:A0000000620002 - 1.0 (java.io)
Java Card 2.2.1:A0000000620001 - 1.0 (java.lang)
Java Card 2.2.1:A0000000620003 - 1.0 (java.rmi)
Java Card 2.2.1:A0000000620102 - 1.2 (javacard.security)
Java Card 2.2.1:A000000062010101 - 1.0 (javacard.framework.service)
Java Card 2.2.2:A0000000620209 - 1.0 (javacardx.apdu)
Java Card 2.2.2:A0000000620202 - 1.2 (javacardx.biometry)
Java Card 2.2.2:A0000000620201 - 1.3 (javacardx.crypto)
Java Card 2.2.2:A0000000620203 - 1.0 (javacardx.external)
Java Card 2.2.2:A0000000620101 - 1.3 (javacard.framework)
Java Card 2.2.2:A0000000620002 - 1.0 (java.io)
Java Card 2.2.2:A0000000620001 - 1.0 (java.lang)
Java Card 2.2.2:A000000062020802 - 1.0 (javacardx.framework.math)
Java Card 2.2.2:A0000000620003 - 1.0 (java.rmi)
Java Card 2.2.2:A0000000620102 - 1.3 (javacard.security)
Java Card 2.2.2:A000000062010101 - 1.0 (javacard.framework.service)
Java Card 2.2.2:A000000062020803 - 1.0 (javacardx.framework.tlv)
Java Card 2.2.2:A000000062020801 - 1.0 (javacardx.framework.util)
Java Card 3.0.1:A0000000620209 - 1.0 (javacardx.apdu)
Java Card 3.0.1:A0000000620202 - 1.2 (javacardx.biometry)
Java Card 3.0.1:A0000000620201 - 1.4 (javacardx.crypto)
Java Card 3.0.1:A0000000620203 - 1.0 (javacardx.external)
Java Card 3.0.1:A0000000620101 - 1.4 (javacard.framework)
Java Card 3.0.1:A00000006202080101 - 1.0 (javacardx.framework.util.intx)
Java Card 3.0.1:A0000000620002 - 1.0 (java.io)
Java Card 3.0.1:A0000000620001 - 1.0 (java.lang)
Java Card 3.0.1:A000000062020802 - 1.0 (javacardx.framework.math)
Java Card 3.0.1:A0000000620003 - 1.0 (java.rmi)
Java Card 3.0.1:A0000000620102 - 1.4 (javacard.security)
Java Card 3.0.1:A000000062010101 - 1.0 (javacard.framework.service)
Java Card 3.0.1:A000000062020803 - 1.0 (javacardx.framework.tlv)
Java Card 3.0.1:A000000062020801 - 1.0 (javacardx.framework.util)
Java Card 3.0.4:A0000000620209 - 1.0 (javacardx.apdu)
Java Card 3.0.4:A0000000620202 - 1.2 (javacardx.biometry)
Java Card 3.0.4:A0000000620201 - 1.4 (javacardx.crypto)
Java Card 3.0.4:A0000000620203 - 1.0 (javacardx.external)
Java Card 3.0.4:A0000000620101 - 1.5 (javacard.framework)
Java Card 3.0.4:A00000006202080101 - 1.0 (javacardx.framework.util.intx)
Java Card 3.0.4:A0000000620002 - 1.0 (java.io)
Java Card 3.0.4:A0000000620001 - 1.0 (java.lang)
Java Card 3.0.4:A000000062020802 - 1.0 (javacardx.framework.math)
Java Card 3.0.4:A0000000620003 - 1.0 (java.rmi)
Java Card 3.0.4:A0000000620102 - 1.5 (javacard.security)
Java Card 3.0.4:A000000062010101 - 1.0 (javacard.framework.service)
Java Card 3.0.4:A000000062020804 - 1.0 (javacardx.framework.string)
Java Card 3.0.4:A000000062020803 - 1.0 (javacardx.framework.tlv)
Java Card 3.0.4:A000000062020801 - 1.0 (javacardx.framework.util)
考虑到上述信息,请允许我指出 Michael Roland 的回答有点误导。调用JCSystem.getVersion() 无助于确定是否支持Java Card 版本;如果您已经到了可以实际调用 API 的程度,那么您已经确定该版本是受支持的。
【讨论】:
TagInfo不是完全证明的吗?它可以通过点击卡片告诉我 Java Card 的版本。
short version = JCSystem.getVersion();
getVersion() 方法返回 Java Card API 的主要和次要版本(每个部分占一个字节)。没有办法区分子版本(例如 2.2.1 和 2.2.2 之间)。
只知道你的芯片包含一个Java Card运行环境,没有办法从芯片查询更具体的信息。 (不过,有些芯片可能会暴露更具体的信息。)一般而言,您应该从制造商/供应商处获取此类信息。
【讨论】:
我会大胆地提出一些解决问题的建议。如果您可以加载小程序,您通常也可以访问 Global Platform 卡管理器。卡管理器应支持称为 GET CPLC (DATA) 的命令 APDU。这将返回卡生产生命周期数据,其中包括芯片制造商的标识符(数量有限)、操作系统制造商和版本信息。
有了这些信息,您应该能够向操作系统的创建者询问更多信息,例如完全支持哪个版本、全球平台支持、其他库等。当然这取决于如果他们真的认为您值得支持,请了解您的身份和位置。
一个小问题是,Visa 似乎维护了标识符到实际公司的映射。我还没有在互联网上找到一个明确的列表,但更常见的似乎是已知的。
【讨论】: