gradle-javacard

JavaCard gradle plugin

License

License

Categories

Categories

Gradle Build Tools
GroupId

GroupId

fr.bmartel
ArtifactId

ArtifactId

gradle-javacard
Last Version

Last Version

1.5.6
Release Date

Release Date

Type

Type

jar
Description

Description

gradle-javacard
JavaCard gradle plugin
Project URL

Project URL

https://github.com/bertrandmartel/javacard-gradle-plugin
Source Code Management

Source Code Management

https://github.com/bertrandmartel/javacard-gradle-plugin

Download gradle-javacard

How to add to project

<!-- https://jarcasting.com/artifacts/fr.bmartel/gradle-javacard/ -->
<dependency>
    <groupId>fr.bmartel</groupId>
    <artifactId>gradle-javacard</artifactId>
    <version>1.5.6</version>
</dependency>
// https://jarcasting.com/artifacts/fr.bmartel/gradle-javacard/
implementation 'fr.bmartel:gradle-javacard:1.5.6'
// https://jarcasting.com/artifacts/fr.bmartel/gradle-javacard/
implementation ("fr.bmartel:gradle-javacard:1.5.6")
'fr.bmartel:gradle-javacard:jar:1.5.6'
<dependency org="fr.bmartel" name="gradle-javacard" rev="1.5.6">
  <artifact name="gradle-javacard" type="jar" />
</dependency>
@Grapes(
@Grab(group='fr.bmartel', module='gradle-javacard', version='1.5.6')
)
libraryDependencies += "fr.bmartel" % "gradle-javacard" % "1.5.6"
[fr.bmartel/gradle-javacard "1.5.6"]

Dependencies

compile (2)

Group / Artifact Type Version
com.github.martinpaljak : ant-javacard jar 18.07.12
com.github.martinpaljak : globalplatformpro jar 18.09.14

Project Modules

There are no modules declared in this project.

JavaCard Gradle plugin

Build Status Download Maven Central Coverage Status Javadoc License

A Gradle plugin for building JavaCard applets.

This plugin is a wrapper on ant-javacard and Global Platform Pro, it is inspired by gradle-javacard

Features

  • build JavaCard applets (with the same capabilities as ant-javacard)
  • install cap files
  • list applets
  • write quick testing scripts used to send apdu in a configurable way
  • expose GpExec task type that enables usage of Global Platform Pro tool inside Gradle
  • include jcardsim 3.0.4 and JUnit 4.12 test dependency (clear distinction between JavaCard SDK & jcardsim SDK)
  • ability to specify key for delete/install/list tasks
  • possibility to add dependency between modules (exp & jar imported automatically)

Usage

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'fr.bmartel:gradle-javacard:1.5.6'
    }
}

apply plugin: 'javacard'

dependencies {
    compile 'com.github.martinpaljak:globalplatformpro:18.09.14'
}

javacard {

    config {
        
        cap {
            packageName 'fr.bmartel.javacard'
            version '0.1'
            aid '01:02:03:04:05:06:07:08:09'
            output 'applet.cap'
            applet {
                className 'fr.bmartel.javacard.HelloWorld'
                aid '01:02:03:04:05:06:07:08:09:01:02'
            }
        }
    }
          
    scripts {
        script {
            name 'select'
            apdu '00:A4:04:00:0A:01:02:03:04:05:06:07:08:09:01:00'
        }
        script {
            name 'hello'
            apdu '00:40:00:00:00'
        }
        task {
            name 'sendHello'
            scripts 'select', 'hello'
        }
    }
}

plugin is available from jcenter() or mavenCentral()

Check this project for more usage examples

JavaCard SDK path

The path to JavaCard SDK can be specified through :

  • use jc.home properties in local.properties file located in your project root (in the same way as Android projects) :
    • in project root : echo "jc.home=$PWD/oracle_javacard_sdks/jc222_kit" >> local.properties
  • using jckit attribute (see ant-javacard)
  • JC_HOME global environment variable, for instance using : export JC_HOME="$PWD/sdks/jck222_kit"

Tasks

task name description
buildJavaCard build JavaCard cap files
installJavaCard delete existing aid & install all JavaCard cap files (gp --delete XXXX --install file.cap)
listJavaCard list applets (gp -l)

It's possible to create custom tasks that will send series of custom apdu :

scripts {
    script {
        name 'select'
        apdu '00:A4:04:00:0A:01:02:03:04:05:06:07:08:09:01:00'
    }
    script {
        name 'hello'
        apdu '00:40:00:00:00'
    }
    task {
        name 'sendHello'
        scripts 'select', 'hello'
    }
}

The above will create task sendHello that will select applet ID 01:02:03:04:05:06:07:08:09:01 and send the apdu 00:40:00:00:00.
The order of the scripts's apdu in task.scripts is respected.
00:A4:04:00:0A:01:02:03:04:05:06:07:08:09:01:00 or '00A404000A0102030405060708090100' are valid apdu.

Custom Global Platform Pro task

You can build custom tasks that launch Global Platform Pro tool :

task displayHelp(type: fr.bmartel.javacard.gp.GpExec) {
    description = 'display Global Platform pro help'
    group = 'help'
    args '-h'
}

More complex example

apply plugin: 'javacard'

dependencies {
    compile 'com.github.martinpaljak:globalplatformpro:18.09.14'
}

repositories {
    maven {
        url 'http://dl.bintray.com/bertrandmartel/maven'
    }
}

javacard {

    config {
        jckit '../oracle_javacard_sdks/jc222_kit'
        cap {
            packageName 'fr.bmartel.javacard'
            version '0.1'
            aid '01:02:03:04:05:06:07:08:09'
            output 'applet1.cap'
            applet {
                className 'fr.bmartel.javacard.HelloSmartcard'
                aid '01:02:03:04:05:06:07:08:09:01:02'
            }
            applet {
                className 'fr.bmartel.javacard.GoodByeSmartCard'
                aid '01:02:03:04:05:06:07:08:09:01:03'
            }
        }
        cap {
            packageName 'fr.bmartel.javacard'
            version '0.1'
            aid '01:02:03:04:05:06:07:08:0A'
            output 'applet2.cap'
            applet {
                className 'fr.bmartel.javacard.SomeOtherClass'
                aid '01:02:03:04:05:06:07:08:09:01:04'
            }
            dependencies {
                local {
                    jar '/path/to/dependency.jar'
                    exps '/path/to/expfolder'
                }
                remote 'fr.bmartel:gplatform:2.1.1'
            }
        }
    }
    
    defaultKey '40:41:42:43:44:45:46:47:48:49:4A:4B:4C:4D:4E:4F'
    // or 
    /*
    key {
        enc '40:41:42:43:44:45:46:47:48:49:4A:4B:4C:4D:4E:4F'
        kek '40:41:42:43:44:45:46:47:48:49:4A:4B:4C:4D:4E:4F' 
        mac '40:41:42:43:44:45:46:47:48:49:4A:4B:4C:4D:4E:4F' 
    }
    */

    scripts {
        script {
            name 'select'
            apdu '00:A4:04:00:0A:01:02:03:04:05:06:07:08:09:01:00'
        }
        script {
            name 'hello'
            apdu '00:40:00:00:00'
        }
        task {
            name 'sendHello'
            scripts 'select', 'hello'
        }
    }
}

Note1 : the remote dependency will automatically download the jar (the jar file must include the exp file)
Note2 : you can add as many local or remote dependency as you want

Syntax

  • javacard [Closure]
    • config [Closure] - object that holds build configuration Required
      • jckit [String] - path to the JavaCard SDK that is used if individual cap does not specify one. Optional if cap defines one, required otherwise. The path is relative to the module
      • logLevel [String] - log level of ant-javacard task ("VERBOSE","DEBUG","INFO","WARN","ERROR"). default : "INFO"
      • cap [Closure] - construct a CAP file Required
        • jckit [String] - path to the JavaCard SDK to be used for this CAP. Optional if javacard defines one, required otherwise
        • sources [String] - path to Java source code, to be compiled against the current JavaCard SDK. Required
        • findSources [boolean] - default:true, if true the sources are determined automatically. The first existing source dir in source sets is taken
        • defaultSources [boolean] - default:true, if true the first source dir from the source set is used. Otherwise the most recet (last)
        • classes [String] - path to pre-compiled class files to be assembled into a CAP file. If both classes and sources are specified, compiled class files will be put to classes folder, which is created if missing
        • packageName [String] - name of the package of the CAP file. Optional - set to the parent package of the applet class if left unspecified.
        • version [String] - version of the package. Optional - defaults to 0.0 if left unspecified.
        • aid [String] - AID (hex) of the package. Recommended - or set to the 5 first bytes of the applet AID if left unspecified.
        • output [String] - path where to save the generated CAP file. if a filename or a non-absolute path is referenced, the output will be in build/javacard/{output} Required
        • export [String] - path (folder) where to place the JAR and generated EXP file. Default output directory is build/javacard. Filename depends on output filename if referenced. Optional.
        • jca [String] - path where to save the generated JavaCard Assembly (JCA) file. Default output directory is build/javacard. Filename depends on output filename if referenced. Optional.
        • verify [boolean] - if set to false, disables verification of the resulting CAP file with offcardeverifier. Optional.
        • debug [boolean] - if set to true, generates debug CAP components. Optional.
        • ints [boolean] - if set to true, enables support for 32 bit int type. Optional.
        • applet [Closure] - for creating an applet inside the CAP
          • className [String] - class of the Applet where install() method is defined. Required
          • aid [String] - AID (hex) of the applet. Recommended - or set to package aid+i where i is index of the applet definition in the build.xml instruction
        • dependencies [Closure] - for linking against external components/libraries, like GPSystem or OPSystem
          • local [Closure] local dependencies must include absolute path to exp/jar
            • exps [String] - path to the folder keeping .exp files. Required
            • jar [String] - path to the JAR file for compilation. Optional - only required if using sources mode and not necessary with classes mode if java code is already compiled
          • remote [String] remote dependencies (ex: "group:module:1.0").the remote repository (maven repo) must be included in the project
    • key [Closure] key configuration (if not defined the default keys will be used)
      • enc [String] ENC key
      • kek [String] KEK key
      • mac [String] MAC key
    • defaultKey [String] default key used (will be used for enc, kek and mac key if not specified in key closure)
    • scripts [Closure] - object that holds the configurable scripts to send apdu
      • script [Closure] - a script referenced by name/apdu value to be sent
        • name [String] - script name (ex: select)
        • apdu [String] - apdu value to be sent (it can hold ":" to separate bytes)
      • task [Closure] - gradle task to create that will map the specified list of apdu to send
        • name [String] - task name
        • scripts [String...] - list of script's name
    • test [Closure] - additional configuration for tests(*)
      • dependencies [Closure] - holds test dependencies
        • compile [String] - add a dependencies (ex: 'junit:junit:4.12')

(*) If you specify at least one dependency, jcardsim & junit won't be automatically added so you will need to add them manually if you need them for example :

test {
    dependencies {
        compile 'junit:junit:4.12'
        compile 'com.licel:jcardsim:3.0.4'
    }
}

Compatibility

This plugin has been tested on following IDE :

  • IntelliJ IDEA
  • Android Studio
  • Eclipse

Recommended IDE : IntelliJ IDEA or Android Studio

License

The MIT License (MIT) Copyright (c) 2017-2018 Bertrand Martel

Versions

Version
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.913
1.4.912
1.4.911
1.4.899
1.4.898
1.4.897
1.4.896
1.4.895
1.4.894
1.4.893
1.4.892
1.4.891
1.4.91
1.4.89
1.4.88
1.4.87
1.4.86
1.4.85
1.4.84
1.4.82
1.4.81
1.4.9
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.1
1.3.0
1.2.9993
1.2.9992
1.2.9991
1.2.999
1.2.998
1.2.997
1.2.996
1.2.995
1.2.994
1.2.993
1.2.992
1.2.991
1.2.99
1.2.98
1.2.97
1.2.96
1.2.95
1.2.94
1.2.93
1.2.92
1.2.91
1.2.90
1.2.89
1.2.88
1.2.87
1.2.86
1.2.85
1.2.84
1.2.83
1.2.82
1.2.81
1.2.8
1.2.7
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.93
1.1.92
1.1.91
1.1.81
1.1.9
1.1.6
0.2.8