2017-09-21 13:06:36 +00:00
# JavaCard Hardware Wallet
2017-09-27 17:04:26 +00:00
The status.im Hardware Wallet. At the moment Secure Channel and PIN management/verification are implemented.
2017-09-21 13:06:36 +00:00
2017-09-21 13:29:28 +00:00
The project is built using Gradle with the [Fidesmo Javacard Gradle plugin ](https://github.com/fidesmo/gradle-javacard ).
2017-09-25 11:36:28 +00:00
You can set the JavaCard HOME not only through the environment but also creating a gradle.properties file with the
property "com.fidesmo.gradle.javacard.home" set to the correct path.
2017-09-25 08:27:55 +00:00
2017-09-27 17:04:26 +00:00
Loading and installing the applet requires [gpshell ](https://sourceforge.net/p/globalplatform/wiki/GPShell/ ) to be
installed on the system. The gradle.properties file must contain the following properties
* im.status.gradle.gpshell = the path to the gpshell executable
* im.status.gradle.gpshell.isd = the AID of the issuer security domain
* im.status.gradle.gpshell.mac_key = the MAC key for the ISD
* im.status.gradle.gpshell.enc_key = the ENC key for the ISD
* im.status.gradle.gpshell.kek_key = the KEK key for the ISD
* im.status.gradle.gpshell.kvn = the Key Version Number for the ISD
2017-10-06 09:58:10 +00:00
Testing is done with JUnit and performed either on a real card or on [jCardSim ](https://github.com/status-im/jcardsim ).
Although the tests are comprehensive, debugging on the real card is not easy because raw APDUs are not shown in the test
log and there is no way to set breakpoints in the applet.
In order to test with the simulator, you need to pass these additional parameters to the JVM
```-noverify -Dim.status.wallet.test.simulated=true```
## Compilation
1. Download and install the JavaCard 3.0.4 SDK from [Oracle ](http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javame-419430.html#java_card_kit-classic-3_0_4-rr-bin-do )
2. Clone the Github repo for our fork of [jCardSim ](https://github.com/status-im/jcardsim )
3. Create a gradle.properties (see below for an example)
4. Run `./gradlew build`
2017-09-27 17:04:26 +00:00
## Example gradle.properties file
```
2017-10-06 09:58:10 +00:00
com.fidesmo.gradle.javacard.home=/home/username/javacard-3_0_4
2017-09-27 17:04:26 +00:00
im.status.gradle.gpshell=/usr/local/bin/gpshell
2017-10-25 11:29:13 +00:00
im.status.gradle.gpshell.isd=A000000151000000
2017-09-27 17:04:26 +00:00
im.status.gradle.gpshell.mac_key=404142434445464748494a4b4c4d4e4f
im.status.gradle.gpshell.enc_key=404142434445464748494a4b4c4d4e4f
im.status.gradle.gpshell.kek_key=404142434445464748494a4b4c4d4e4f
2017-10-25 11:29:13 +00:00
im.status.gradle.gpshell.kvn=0
2017-09-27 17:04:26 +00:00
```
2017-09-25 09:26:15 +00:00
## Implementation notes
2017-10-06 09:58:10 +00:00
* The applet requires JavaCard 3.0.4 or later.
2017-09-25 11:36:28 +00:00
* The class byte of the APDU is not checked since there are no conflicting INS code.
* Automated tests using JUnit 5 are included. The test require the application to be already installed. The first
card terminal found by Java will be used, to please disconnect all card terminals except the one to be used for
testing.