martinpaljak/ant-javacard

Class files copied into cap file at wrong location

CardContact opened this issue · 2 comments

When creating a cap file from classes, then class files are copied into the cap to the wrong location.

<!-- Extract class files for biometry interface and create .cap file -->
<unjar src="${basedir}/${jcsdk}/lib/api_classic.jar" dest="${class.folder}">
    <patternset>
        <include name="javacardx/biometry/*.class" />
    </patternset>
</unjar>

<javacard jckit="${jcsdk}">
    <cap aid="A0000000620202" package="javacardx.biometry" classes="${class.folder}" output="${release.folder}/biometry.cap" version="1.3" verify="false" />
</javacard>

creates a cap file with

Archive:  biometry.cap
  Length      Date    Time    Name
---------  ---------- -----   ----
      808  2021-02-22 17:42   META-INF/MANIFEST.MF
       20  2021-02-22 17:42   javacardx/biometry/javacard/Header.cap
       34  2021-02-22 17:42   javacardx/biometry/javacard/Directory.cap
       24  2021-02-22 17:42   javacardx/biometry/javacard/Import.cap
       13  2021-02-22 17:42   javacardx/biometry/javacard/ConstantPool.cap
       32  2021-02-22 17:42   javacardx/biometry/javacard/Class.cap
       30  2021-02-22 17:42   javacardx/biometry/javacard/Method.cap
       13  2021-02-22 17:42   javacardx/biometry/javacard/StaticField.cap
        9  2021-02-22 17:42   javacardx/biometry/javacard/RefLocation.cap
       32  2021-02-22 17:42   javacardx/biometry/javacard/Export.cap
      521  2021-02-22 17:42   javacardx/biometry/javacard/Descriptor.cap
      535  2021-02-22 17:42   META-INF/javacard.xml
     1108  2021-02-22 17:42   javacardx/biometry/BioBuilder.class
      448  2021-02-22 17:42   javacardx/biometry/BioException.class
      529  2021-02-22 17:42   javacardx/biometry/BioTemplate.class
      325  2021-02-22 17:42   javacardx/biometry/OwnerBioTemplate.class
      162  2021-02-22 17:42   javacardx/biometry/SharedBioTemplate.class
---------                     -------
     4643                     17 files

If stored in the cap, class files should be located in APPLET-INF/classes

Could you elaborate? class files are copied to the .cap file by apple converter, under APPLET-INF/classes, for example:

$ jar tvf tests/Empty_0102030405_8d5ac9e2_2.2.1.cap               
   991 Mon Mar 08 06:55:26 EET 2021 META-INF/MANIFEST.MF
    18 Mon Mar 08 06:55:26 EET 2021 testapplets/empty/javacard/Header.cap
    34 Mon Mar 08 06:55:26 EET 2021 testapplets/empty/javacard/Directory.cap
    15 Mon Mar 08 06:55:26 EET 2021 testapplets/empty/javacard/Applet.cap
    34 Mon Mar 08 06:55:26 EET 2021 testapplets/empty/javacard/Import.cap
    25 Mon Mar 08 06:55:26 EET 2021 testapplets/empty/javacard/ConstantPool.cap
    15 Mon Mar 08 06:55:26 EET 2021 testapplets/empty/javacard/Class.cap
    45 Mon Mar 08 06:55:26 EET 2021 testapplets/empty/javacard/Method.cap
    13 Mon Mar 08 06:55:26 EET 2021 testapplets/empty/javacard/StaticField.cap
    12 Mon Mar 08 06:55:26 EET 2021 testapplets/empty/javacard/RefLocation.cap
    72 Mon Mar 08 06:55:26 EET 2021 testapplets/empty/javacard/Descriptor.cap
   313 Mon Mar 08 06:55:26 EET 2021 META-INF/javacard.xml
   518 Mon Mar 08 06:55:26 EET 2021 APPLET-INF/applet.xml
   801 Mon Mar 08 06:55:26 EET 2021 APPLET-INF/classes/testapplets/empty/Empty.class

Except for a library package, when classes are in root

$ jar tvf testapplets.library_01020304050607_be670770_2.2.2.cap
   799 Mon Mar 08 06:55:16 EET 2021 META-INF/MANIFEST.MF
    20 Mon Mar 08 06:55:16 EET 2021 testapplets/library/javacard/Header.cap
    34 Mon Mar 08 06:55:16 EET 2021 testapplets/library/javacard/Directory.cap
    24 Mon Mar 08 06:55:16 EET 2021 testapplets/library/javacard/Import.cap
    13 Mon Mar 08 06:55:16 EET 2021 testapplets/library/javacard/ConstantPool.cap
    13 Mon Mar 08 06:55:16 EET 2021 testapplets/library/javacard/Class.cap
    32 Mon Mar 08 06:55:16 EET 2021 testapplets/library/javacard/Method.cap
    13 Mon Mar 08 06:55:16 EET 2021 testapplets/library/javacard/StaticField.cap
     9 Mon Mar 08 06:55:16 EET 2021 testapplets/library/javacard/RefLocation.cap
    14 Mon Mar 08 06:55:16 EET 2021 testapplets/library/javacard/Export.cap
    67 Mon Mar 08 06:55:16 EET 2021 testapplets/library/javacard/Descriptor.cap
   313 Mon Mar 08 06:55:16 EET 2021 META-INF/javacard.xml
   685 Mon Mar 08 06:55:16 EET 2021 testapplets/library/SomeLibrary.class

Run "ant test" from master branch to verify this.

I can't find the difference between a "normal" cap and a library cap anywhere in the jcvm specification.

Anyway, if you say that this is the default behavior of the cap converter, then I'm fine with it. I was just puzzled because our previous build system using the ant tasks from the jcdk produces cap files without classes.