diff --git a/lib/src/main/java/im/status/keycard/applet/ApplicationInfo.java b/lib/src/main/java/im/status/keycard/applet/ApplicationInfo.java index d78bc3f..2bd44dd 100644 --- a/lib/src/main/java/im/status/keycard/applet/ApplicationInfo.java +++ b/lib/src/main/java/im/status/keycard/applet/ApplicationInfo.java @@ -23,8 +23,9 @@ public class ApplicationInfo { static final byte CAPABILITY_KEY_MANAGEMENT = (byte) 0x02; static final byte CAPABILITY_CREDENTIALS_MANAGEMENT = (byte) 0x04; static final byte CAPABILITY_NDEF = (byte) 0x08; + static final byte CAPABILITY_FACTORY_RESET = (byte) 0x10; - static final byte CAPABILITIES_ALL = CAPABILITY_SECURE_CHANNEL | CAPABILITY_KEY_MANAGEMENT | CAPABILITY_CREDENTIALS_MANAGEMENT | CAPABILITY_NDEF; + static final byte CAPABILITIES_ALL = CAPABILITY_SECURE_CHANNEL | CAPABILITY_KEY_MANAGEMENT | CAPABILITY_CREDENTIALS_MANAGEMENT | CAPABILITY_NDEF | CAPABILITY_FACTORY_RESET; /** * Constructs an object by parsing the TLV data. @@ -191,4 +192,13 @@ public class ApplicationInfo { public boolean hasNDEFCapability() { return (capabilities & CAPABILITY_NDEF) == CAPABILITY_NDEF; } + + /** + * Returns true if the device supports the Factory Reset capability. + * + * @return true or false + */ + public boolean hasFactoryResetCapability() { + return (capabilities & CAPABILITY_FACTORY_RESET) == CAPABILITY_FACTORY_RESET; + } } diff --git a/lib/src/main/java/im/status/keycard/applet/KeycardCommandSet.java b/lib/src/main/java/im/status/keycard/applet/KeycardCommandSet.java index 4d809a9..e128584 100644 --- a/lib/src/main/java/im/status/keycard/applet/KeycardCommandSet.java +++ b/lib/src/main/java/im/status/keycard/applet/KeycardCommandSet.java @@ -18,6 +18,7 @@ import java.util.Arrays; */ public class KeycardCommandSet { static final byte INS_INIT = (byte) 0xFE; + static final byte INS_FACTORY_RESET = (byte) 0xFD; static final byte INS_GET_STATUS = (byte) 0xF2; static final byte INS_SET_NDEF = (byte) 0xF3; static final byte INS_IDENTIFY_CARD = (byte) 0x14; @@ -81,6 +82,9 @@ public class KeycardCommandSet { public static final byte EXPORT_KEY_P2_PUBLIC_ONLY = 0x01; public static final byte EXPORT_KEY_P2_EXTENDED_PUBLIC = 0x02; + static final byte FACTORY_RESET_P1_MAGIC = (byte) 0xAA; + static final byte FACTORY_RESET_P2_MAGIC = 0x55; + static final byte TLV_APPLICATION_INFO_TEMPLATE = (byte) 0xA4; private final CardChannel apduChannel; @@ -887,4 +891,15 @@ public class KeycardCommandSet { APDUCommand init = new APDUCommand(0x80, INS_INIT, 0, 0, secureChannel.oneShotEncrypt(initData)); return apduChannel.send(init); } + + /** + * Sends the FACTORY RESET command to the card. + * + * @return the raw card response + * @throws IOException communication error + */ + public APDUResponse factoryReset() throws IOException { + APDUCommand factoryReset = new APDUCommand(0x80, INS_FACTORY_RESET, FACTORY_RESET_P1_MAGIC, FACTORY_RESET_P2_MAGIC, new byte[0]); + return apduChannel.send(factoryReset); + } }