Building JavaCard applet CAP files with Ant
Easy to use Ant task for building JavaCard CAP files in a declarative way.
Features
- Do What I Mean. You will love it!
- No dependencies, no extra or unrelated downloads. Just a 14KB jar.
- Supports all available JavaCard SDK versions: 2.1.2, 2.2.1, 2.2.2, 3.0.3, 3.0.4 and 3.0.5
- Get one from oracle.com or use the handy Github repository
- Works on all platforms with Java 1.8: Windows, OSX, Linux.
- Almost everything integrates or works with Ant.
- Can be easily integrated into continuous integration workflows.
- Generates CAP files from sources or pre-compiled class files.
- Import external libraries: natural use of
.expfiles and.jarlibraries. - No restrictions on project folder layout.
- Loading JavaCard applets is equally pleasing with GlobalPlatformPro
Maven repository
This is Ph4r05 build:
<dependency>
<groupId>com.klinec</groupId>
<artifactId>ant-javacard</artifactId>
<version>1.8.0</version>
</dependency>
Gradle:
compile group: 'com.klinec', name: 'ant-javacard', version: '1.8.0'
Download & Use
- Download
ant-javacard.jar(be sure to get the latest version)- The only supported Java version for all SDK targets is 1.8!
- Or use the download task:
<get src="https://github.com/martinpaljak/ant-javacard/releases/download/18.01.17/ant-javacard.jar" dest="." skipexisting="true"/>
- Then add the following to your
build.xmlfile:
<taskdef name="javacard" classname="pro.javacard.ant.JavaCard" classpath="ant-javacard.jar"/>
- Now you can create applets within your Ant targets like this:
<javacard>
<cap jckit="/path/to/jckit_dir" aid="0102030405" output="MyApplet.cap" sources="src/myapplet">
<applet class="myapplet.MyApplet" aid="0102030405060708"/>
</cap>
</javacard>
(which results in output similar to this)
target:
[cap] INFO: using JavaCard v2.2.2 SDK in ../jc222_kit
[cap] Setting package name to testapplets
[cap] Building CAP with 1 applet from package testapplets
[cap] testapplets.Empty 0102030405060708
[compile] Compiling 1 source file to /var/folders/l7/h99c5w6j0y1b8_qbsth_9v4r0000gn/T/antjc4506897175807383834
[cap] CAP saved to /Users/martin/projects/ant-javacard/Empty222.cap
Syntax
Sample:
<javacard jckit="/path/to/jckit_dir1">
<cap jckit="/path/to/jckit_dir2" aid="0102030405" package="package.name" version="0.1" output="MyApplet.cap" sources="src/myapplet" classes="path/to/classes" export="mylib">
<applet class="myapplet.MyApplet" aid="0102030405060708"/>
<import exps="path/to/exps" jar="/path/to/lib.jar"/>
</cap>
</javacard>
Details:
javacardtag - generic taskjckitattribute - path to the JavaCard SDK that is used if individualcapdoes not specify one. Optional ifcapdefines one, required otherwise.
captag - construct a CAP filejckitattribute - path to the JavaCard SDK to be used for this CAP. Optional ifjavacarddefines one, required otherwise.sourcesattribute - path to Java source code, to be compiled against the current JavaCard SDK. Eithersourcesorclassesis required.classesattribute - path to pre-compiled class files to be assembled into a CAP file. If bothclassesandsourcesare specified, compiled class files will be put toclassesfolder, which is created if missing.packageattribute - name of the package of the CAP file. Optional - set to the parent package of the applet class if left unspecified.versionattribute - version of the package. Optional - defaults to 0.0 if left unspecified.aidattribute - AID (hex) of the package. Recommended - or set to the 5 first bytes of the applet AID if left unspecified.outputattribute - path where to save the generated CAP file. Required.exportattribtue - path (folder) where to place the JAR and generated EXP file. Optional.jarattribute - path where to save the generated archive JAR file. Optional.jcaattribute - path where to save the generated JavaCard Assembly (JCA) file. Optional.verifyattribute - if set to false, disables verification of the resulting CAP file with offcardeverifier. Optional.debugattribute - if set to true, generates debug CAP components. Optional.intsattribute - if set to true, enables support for 32 bitinttype. Optional.
applettag - for creating an applet inside the CAPclassattribute - class of the Applet where install() method is defined. Required.aidattribute - AID (hex) of the applet. Recommended - or set to packageaid+iwhereiis index of the applet definition in the build.xml instruction
importtag - for linking against external components/libraries, likeGPSystemorOPSystemexpsattribute - path to the folder keeping.expfiles. Requiredjarattribute - path to the JAR file for compilation. Optional - only required if usingsourcesmode and not necessary withclassesmode if java code is already compiled
Notes:
jc.homeproperty has the highest precedence, followed byjckitpath ofcap, followed by path injavacard, followed byJC_HOMEenvironment variable. SDK must be valid to be considered for use.
License
Happy users
A random list of users, with a public link:
- Applets:
- IsoApplet by @philipWendland
- NdefApplet by @promovicz
- GidsApplet by @vletoux
- LedgerWalletApplet by @LedgerHQ
- KeePassNFC by @nfd
- PivApplet (PIV) by @arekinath
- OpenFIP201 (PIV) by @makinako
- Cryptonit (PIV) by @mbrossard
- HTOP NDEF by @petrs
- Yubikey OTP by @arekinath
- Plus loads of academic projects, classes and papers.
- Integration projects:
- Other:
- You! Don't torture yourself with complexity, KISS!
Contact
- See javacard.pro
Similar projects
- standard JavaCard SDK Ant tasks
- :( as cumbersome to use as the command line utilities
- :( not declarative/DWIM enough
- :) very explicit interface with all details exposed
- JavaCard Gradle plugin (MIT) - https://github.com/bertrandmartel/javacard-gradle-plugin
- :) Wraps ant-javacard for use with Gradle
- gradle-javacard (Apache 2.0) - https://github.com/fidesmo/gradle-javacard
- :) nice declarative interface
- :( requires gradle (40M download)
- :( JavaCard 2.2.2 only
- EclipseJCDE (Eclipse 1.0) - http://eclipse-jcde.sourceforge.net/
- :( JavaCard 2.2.2 only
- :( not possible to integrate in CI - depends on eclipse
- :( essentially an Eclipse GUI wrapper for JC SDK
- JCOP Tools
- :( not open source
- NetBeans IDE JC support
- :( not possible to integrate into CI
- :( JavaCard 3.0 only
- :( Netbeans, not cross platform
- Maven2 task from FedICT (LGPL3) - https://code.google.com/p/eid-quick-key-toolset
- :( Maven downloads half the internet before even simple tasks
- :( JavaCard 2.2.2 only
- Ant script files with templates
- :( XML is a very bad and verbose programming environment