读取JavaCard Classic上的TLV编码数据

读取JavaCard Classic上的TLV编码数据,javacard,tlv,jcop,Javacard,Tlv,Jcop,我想读取Java卡上的TLV编码证书(NXP JCOP J3D081,JCOP版本2.4.2,Java卡版本3.0.1 Classic) cap文件已成功创建,但当我尝试将其安装到卡上时,我收到一个gpshell错误: load()返回0x80206A80(6A80:错误数据/命令数据中的值不正确。) 我使用JCDK 3.0.3中的JAR,这通常适用于椭圆曲线等内容。TLV内容有什么不同 使用的小程序代码(不使用BERTLV时安装良好): 我使用以下ant build.xml创建cap文件: &

我想读取Java卡上的TLV编码证书(NXP JCOP J3D081,JCOP版本2.4.2,Java卡版本3.0.1 Classic)

cap文件已成功创建,但当我尝试将其安装到卡上时,我收到一个gpshell错误:

load()返回0x80206A80(6A80:错误数据/命令数据中的值不正确。)

我使用JCDK 3.0.3中的JAR,这通常适用于椭圆曲线等内容。TLV内容有什么不同

使用的小程序代码(不使用BERTLV时安装良好):

我使用以下ant build.xml创建cap文件:

<?xml version="1.0" encoding="UTF-8" ?>
<project default="convert" name="Create JC 3 applet" basedir=".">
<property environment="env" />

<!-- Include properties in the build.properties file -->
<property file="build.properties" />

<!-- Build specific properties -->
<property name="source.path" location="${basedir}/${source.folder}" />
<property name="jcdk.libs" location="${basedir}/${jcdk.basefolder}/${jcdk.subfolder.libs}" />
<property name="jcdk.apiexports" location="${basedir}/${jcdk.basefolder}/${jcdk.subfolder.apiexportfiles}" />
 <property name="target.path.classes"
location="${basedir}/${target.basefolder}/${target.subfolder.classes}" />
<property name="target.path.cap"
location="${basedir}/${target.basefolder}/${target.subfolder.applet}" />

<!-- set the classpath for the tasks and the API, include all jar files -->
<path id="classpath" description="Sets the classpath to Java Card API and tools">
    <fileset dir="${jcdk.libs}">
        <include name="*.jar" />
    </fileset>
</path>

<!-- set the export path to the Java Card export files -->
<path id="export" description="set the export file path">
    <fileset dir="${jcdk.apiexports}">
        <include name="**/*.exp" />
    </fileset>
    <pathelement path="${jcdk.apiexports}" />
    <pathelement path="${target.path.classes}" />
</path>

<path id="capexport" description="set the export file for the cap path">
    <fileset dir="${jcdk.apiexports}">
        <include name="**/*.exp" />
    </fileset>
    <pathelement path="${jcdk.apiexports}" />
</path>

<!-- Definitions for tasks for Java Card tools -->
<taskdef name="apdu" classname="com.sun.javacard.ant.tasks.APDUToolTask" classpathref="classpath" />
<taskdef name="capgen" classname="com.sun.javacard.ant.tasks.CapgenTask" classpathref="classpath" />
<taskdef name="convert" classname="com.sun.javacard.ant.tasks.ConverterTask" classpathref="classpath" />
<taskdef name="verifyexport" classname="com.sun.javacard.ant.tasks.VerifyExpTask" classpathref="classpath" />
<taskdef name="verifycap" classname="com.sun.javacard.ant.tasks.VerifyCapTask" classpathref="classpath" />
<taskdef name="verifyrevision" classname="com.sun.javacard.ant.tasks.VerifyRevTask" classpathref="classpath" />
<typedef name="appletnameaid" classname="com.sun.javacard.ant.types.AppletNameAID" classpathref="classpath" />
<typedef name="jcainputfile" classname="com.sun.javacard.ant.types.JCAInputFile" classpathref="classpath" />
<typedef name="scriptgen" classname="com.sun.javacard.ant.tasks.ScriptgenTask" classpathref="classpath" />

<target name="init">
    <mkdir dir="${target.path.classes}" />
</target>

<target name="clean">
    <delete dir="${target.path.classes}" />
</target>

<target name="compile" depends="init" description="Compile source code to class files">
    <javac debug="${javac.debug}" 
    optimize="${javac.optimize}" 
    srcdir="${source.path}" 
    destdir="${target.path.classes}"
    source="${javac.version.source}"
    target="${javac.version.target}">
    <classpath refid="classpath" />
    </javac>
</target>

<target name="convert" depends="compile" description="Convert class files to cap files">
    <convert packagename="${package.name}"
    packageaid="${package.aid}" 
    majorminorversion="${applet.version}"
    classdir="${target.path.classes}"
    outputdirectory="${target.path.cap}"
    jca="${cap.creation.jca}"
    exp="${cap.creation.exp}"
    cap="true"
    debug="${cap.creation.debug}" verbose="${cap.creation.verbose}"
    noverify="${cap.creation.noverify}">
    <appletnameaid aid="${applet.aid}" appletname="${applet.name}" />
    <exportpath refid="capexport" />
    <classpath refid="classpath" />
    </convert>
</target>

<target name="all" depends="clean, convert" />

</project>
所以怀疑cap是用api_connected.jar编译的,但从工具包中删除该文件并没有改变任何事情


任何帮助都将不胜感激。提前感谢,Thomas

该卡不支持java卡API的TLV类。JCAPI只是一个建议,但卡制造商可以选择实现其中的一个子集


一般来说,
javacardx
中的任何内容都是可选的(因此末尾的
x
)。但是必须实现
javacard
中的API方法。即使对于
javacard
包和类,也不是所有功能都可以在运行时使用。例如,加密算法可能不存在。

。。。而且您可以轻松实现自己的TLVReader/TLVWriter类。@vojta取决于您想提供多少功能。对于TLV类来说,使用某种JUnit测试来测试它们是很有帮助的……谢谢,我非常期待这些类可以使用。我应该请求Petr Svenda将“x”类的可用性添加到JCAlgTest中。
<?xml version="1.0" encoding="UTF-8" ?>
<project default="convert" name="Create JC 3 applet" basedir=".">
<property environment="env" />

<!-- Include properties in the build.properties file -->
<property file="build.properties" />

<!-- Build specific properties -->
<property name="source.path" location="${basedir}/${source.folder}" />
<property name="jcdk.libs" location="${basedir}/${jcdk.basefolder}/${jcdk.subfolder.libs}" />
<property name="jcdk.apiexports" location="${basedir}/${jcdk.basefolder}/${jcdk.subfolder.apiexportfiles}" />
 <property name="target.path.classes"
location="${basedir}/${target.basefolder}/${target.subfolder.classes}" />
<property name="target.path.cap"
location="${basedir}/${target.basefolder}/${target.subfolder.applet}" />

<!-- set the classpath for the tasks and the API, include all jar files -->
<path id="classpath" description="Sets the classpath to Java Card API and tools">
    <fileset dir="${jcdk.libs}">
        <include name="*.jar" />
    </fileset>
</path>

<!-- set the export path to the Java Card export files -->
<path id="export" description="set the export file path">
    <fileset dir="${jcdk.apiexports}">
        <include name="**/*.exp" />
    </fileset>
    <pathelement path="${jcdk.apiexports}" />
    <pathelement path="${target.path.classes}" />
</path>

<path id="capexport" description="set the export file for the cap path">
    <fileset dir="${jcdk.apiexports}">
        <include name="**/*.exp" />
    </fileset>
    <pathelement path="${jcdk.apiexports}" />
</path>

<!-- Definitions for tasks for Java Card tools -->
<taskdef name="apdu" classname="com.sun.javacard.ant.tasks.APDUToolTask" classpathref="classpath" />
<taskdef name="capgen" classname="com.sun.javacard.ant.tasks.CapgenTask" classpathref="classpath" />
<taskdef name="convert" classname="com.sun.javacard.ant.tasks.ConverterTask" classpathref="classpath" />
<taskdef name="verifyexport" classname="com.sun.javacard.ant.tasks.VerifyExpTask" classpathref="classpath" />
<taskdef name="verifycap" classname="com.sun.javacard.ant.tasks.VerifyCapTask" classpathref="classpath" />
<taskdef name="verifyrevision" classname="com.sun.javacard.ant.tasks.VerifyRevTask" classpathref="classpath" />
<typedef name="appletnameaid" classname="com.sun.javacard.ant.types.AppletNameAID" classpathref="classpath" />
<typedef name="jcainputfile" classname="com.sun.javacard.ant.types.JCAInputFile" classpathref="classpath" />
<typedef name="scriptgen" classname="com.sun.javacard.ant.tasks.ScriptgenTask" classpathref="classpath" />

<target name="init">
    <mkdir dir="${target.path.classes}" />
</target>

<target name="clean">
    <delete dir="${target.path.classes}" />
</target>

<target name="compile" depends="init" description="Compile source code to class files">
    <javac debug="${javac.debug}" 
    optimize="${javac.optimize}" 
    srcdir="${source.path}" 
    destdir="${target.path.classes}"
    source="${javac.version.source}"
    target="${javac.version.target}">
    <classpath refid="classpath" />
    </javac>
</target>

<target name="convert" depends="compile" description="Convert class files to cap files">
    <convert packagename="${package.name}"
    packageaid="${package.aid}" 
    majorminorversion="${applet.version}"
    classdir="${target.path.classes}"
    outputdirectory="${target.path.cap}"
    jca="${cap.creation.jca}"
    exp="${cap.creation.exp}"
    cap="true"
    debug="${cap.creation.debug}" verbose="${cap.creation.verbose}"
    noverify="${cap.creation.noverify}">
    <appletnameaid aid="${applet.aid}" appletname="${applet.name}" />
    <exportpath refid="capexport" />
    <classpath refid="classpath" />
    </convert>
</target>

<target name="all" depends="clean, convert" />

</project>
# Source folder
source.folder                   =   src/org/thomas

# Java Card Development Kit folders
jcdk.basefolder                 =   lib/javaCardKit303
jcdk.subfolder.apiexportfiles   =   api_export_files
jcdk.subfolder.libs             =   lib

# Target folders (will be created, no need to adapt)
target.basefolder               =   target
target.subfolder.classes        =   classes
target.subfolder.applet         =   applet

# Applet properties
package.aid     =   0x41:0x41:0x41:0x41:0x41:0x41:0x41:0x41:0x41:0x42
package.name    =   org.thomas

applet.aid      =   0x41:0x41:0x41:0x41:0x41:0x41:0x41:0x41:0x41:0x42:0x42
applet.name     =   TlvApplet
applet.version  =   1.0

# Java class compiler options
javac.debug             =   no
javac.optimize          =   no 
javac.version.source    =   1.5
javac.version.target    =   1.5


# CAP file creation options
cap.creation.verbose    =   false
cap.creation.noverify   =   false
cap.creation.debug      =   false
cap.creation.jca        =   false
cap.creation.exp        =   false