MifareDesfire

EMDK For Android 5.0

Provides access to MIFARE DESFire properties and I/O operations on an IsoDep Tag object. This class encapsulates all the methods required for communicating with the IsoDep tag using the tag technology protocol.

Example Usage:



public class MainActivity  extends Activity implements EMDKListener {

SecureNfcManager secureNfcManager;
EMDKManager emdkManager;
SamType samType;
MifareDesfire mifaredesfire;
MifareSam mifareSam;

protected void onCreate(Bundle savedInstanceState) {

EMDKResults results = EMDKManager.getEMDKManager(getApplicationContext(), this);
}

public void onOpened(EMDKManager emdkManager) {

this.emdkManager = emdkManager;

this.secureNfcManager = (secureNfcManager)
this.emdkManager.getInstance(FEATURE_TYPE.SECURENFC);

if(this.secureNfcManager != null){

try{

samType = secureNfcManager.getAvailableSam();

} catch (SecureNfcException e) {

e.printStackTrace();
}

if (samType.equals(SamType.MIFARE)) {

mifareSam = (MifareSam) secureNfcMgr.getSamInstance(samType);

}

if(mifareSam != null){

try {
SamMode samMode = mifareSam.connect();

SamKey samKey = new SamKey();
samKey.keyNum = 0x00;
samKey.keyVer = 0x00;

mifareSam.authenticateSam(authKey, samKey,null);

mifareSam.close();

} catch (MifareSamException e) {
e.printStackTrace();
}
}
}

Public Methods

enable

public void enable(Tag tag)

Enable I/O operations to tfhe tag from IsoDep object and SAM communication. May cause RF activity and may block. Must not be called from the main application thread. A blocked call will be canceled with MiFareDesfireExpection by calling close() from another thread. Only one TagTechnology object can be connected to a Tag at a time. Applications must call close() when I/O operations are complete.On Tag lost connection needs to re-established by calling enable API in the application.

Parameters:

tag - Contactless tag already detected by device. We get this through the EXTRA_TAG information from the intent.

Returns:

void

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to enable the tag.

disable

public void disable()

Disables I/O operations to the tag from IsoDep object and SAM communication. Also causes all blocked I/O operations on other thread to be canceled and return with MiFareDesfireExpection.On Tag lost connection needs to re-established by calling enable API in the application.This is a synchronous call.

Returns:

void

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to disable the tag.

authenticate

public void authenticate(MifareDesfire.AuthenticateType authType, int cardKeyNum, SamKey samkey, SamDiverseParams samDiverseParams)

Authenticates card master key and application key by using SAM This is an I/O operation and will block until complete. It must not be called from the main application thread. A blocked call will be canceled with IOException if close() is called from another thread.On Tag lost connection needs to re-established by calling enable API in the application.

NOTE : This API must not be called from the main application thread since it is time consuming operation. Also, The application ID must be selected using the selectApplication() method before calling the authenticate() method to authenticate card with SAM.

Parameters:

authType - Type of authentication to be used.

cardKeyNum - Card key number to be used for authentication. Valid range is from 0x00 to 0x0D.

samkey - SAM key to be used for authentication.

samDiverseParams - Diversification parameters for current key. If diversification is not required by current key then this parameter should be NULL. This is not supported, hence application should pass null.

Returns:

void

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to authenticate the tag.

getKeyVersion

public byte getKeyVersion(byte keyNum)

Retrieves current version of specified card key.On Tag lost connection needs to re-established by calling enable API in the application.This is a synchronous call.

Parameters:

keyNum - Key number to retrieve version information.

Returns:

byte - Returns key version.

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to retrieves current version of specified card key.

Example Usage:




mifareDesfire.selectApplication(APP_ID);

mifareDesfire.getKeyVersion(keynum);

getApplicationIDs

public int getApplicationIDs()

Retrieves AIDs of all active card applications.On Tag lost connection needs to re-established by calling enable API in the application.This is a synchronous call.

Returns:

int - Returns application IDs.

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to retrieves AIDs of all active card applications.

Example Usage:




int[] getAppIDs =  mifareDesfire.getApplicationIDs();

getFreeMemory

public int getFreeMemory()

Gets total number of free user memory bytes available on card.On Tag lost connection needs to re-established by calling enable API in the application.This is a synchronous call.

Returns:

int - Returns the free space on the card

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to get the total free memory available on the tag.

getDFNames

public DFNames getDFNames()

Retrieves the ISO 7816-4 DF names of all active card applications.On Tag lost connection needs to re-established by calling enable API in the application.This is a synchronous call.

Returns:

com.symbol.emdk.securenfc.MifareDesfire.DFNames - Returns ISO 7816-4 DF names and number of active card applications

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to retrieves the ISO 7816-4 DF names of all active card applications.

Example Usage:




DFNames dfnames[] = mifareDesfire.getDFNames();

getKeySettings

public KeySettings getKeySettings()

Retrieves master key settings and application key settings of selected card application or card.On Tag lost connection needs to re-established by calling enable API in the application.This is a synchronous call.

Returns:

com.symbol.emdk.securenfc.MifareDesfire.KeySettings - Returns master key settings and application key settings of selected card application. Refer to KeySettings for more details.

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to retrieves master key settings and application key settings of selected card application or card.

Example Usage:




mifareDesfire.selectApplication(APP_ID);

KeySettings keySettings = mifareDesfire.getKeySettings();

selectApplication

public void selectApplication(int appID)

Selects specified card application.On Tag lost connection needs to re-established by calling enable API in the application.This is a synchronous call.

Parameters:

appID - AID of application to be selected.

Returns:

void

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

getCardVersion

public CardVersionInfo getCardVersion()

Retrieves card version information such manufacturing, software and production related information.On Tag lost connection needs to re-established by calling enable API in the application.This is a synchronous call.

Returns:

com.symbol.emdk.securenfc.MifareDesfire.CardVersionInfo - MifareDesfire version information such as Software\Hardware Information such as Vendor ID ,type,version ,storage size ,protocol

     and Manufacturer information such as unique serial number ,
     production batch number and production date

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to retrieves card version information such manufacturing, software and production related information.

getFileIDs

public int getFileIDs(MifareDesfire.FileIDType fileIDType)

Retrieves native file IDs or ISO 7816-4 file IDs of active files within the currently selected application.On Tag lost connection needs to re-established by calling enable API in the application.This is a synchronous call.

Parameters:

fileIDType - Type of file IDs to be retrieved.

Example Usage:





mifareDesfire.selectApplication(APP_ID);

int[] getFileIDs= mifareDesfire.getFileIDs(FileIDType.NATIVE or FileIDType.ISO7816);

Returns:

int - Returns native file IDs or ISO 7816-4 file IDs of active files within the currently selected application.

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to retrieves native file IDs or ISO 7816-4 file IDs of active files within the currently selected application.

getFileSettings

public FileSettings getFileSettings(byte fileID)

Retrieves file settings (properties) of specified file.On Tag lost connection needs to re-established by calling enable API in the application.

Parameters:

fileID - ID of file whose settings are to be retrieved. Should be within range 0x00-0x1F.

Returns:

com.symbol.emdk.securenfc.MifareDesfire.FileSettings - Retrieved file setting.Refer FileSettings for more Info.

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to retrieves file settings (properties) of specified file.

Example Usage:




mifareDesfire.selectApplication(APP_ID);

FileSettings fileSettings = getFileSettings(fileID)

readData

public byte readData(byte fileID, MifareDesfire.FileCommMode fileCommMode, int readOffset, int bytesToBeRead)

Reads data from standard data or backup data file. Depending on communication settings of file, data read from card will be either plain or enciphered. Preceding authentication, either with the keys specified for Read or Read&Write access is required.On Tag lost connection needs to re-established by calling enable API in the application.

Parameters:

fileID - ID of standard or backup data file to be read. Should be within range 0x00-0x1F.

fileCommMode - File communication mode.

readOffset - File offset from which data is to be read. Should be within range 0x00 to (file size - 1)

bytesToBeRead - Number of bytes to be read. Should be within range 0x00000000-0x00FFFFFF. To read all the data from the specified offset, give 0 as input.

Returns:

byte - Returns data read.

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to read the data from the file.

Example Usage:




mifareDesfire.selectApplication(APP_ID);

SamKey lSamKeyForRead = new SamKey();
lSamKeyForRead.keyNum = 0x03;// 0x51;//0x03;
lSamKeyForRead.keyVer = 0x00;

mifareDesfire.authenticate(AuthenticateType.NATIVE,
CARD_KEY_FOR_READ,lSamKeyForRead , null);

//Communication type can be either Plain or Enchipered depends on the communication type
assigned to the application while creating on the tag .

byte[] rawData = mifareDesfire.readData(STD_ID,Communication_Type,
0, 0);

writeData

public void writeData(byte fileID, MifareDesfire.FileCommMode fileCommMode, int writeOffset, byte[] writeDataBuffer)

Writes data to standard or backup data file. Preceding authentication, either with the keys specified for Write or Read&Write access is required. Should be succeeded by commitTransaction() which validates all previous write access on data files without which the changes will get invalidated.On Tag lost connection needs to re-established by calling enable API in the application.

Parameters:

fileID - ID of standard or backup data file to be written. Should be within range 0x00-0x1F.

fileCommMode - File communication mode

writeOffset - File offset at which data is to be written. Should be within range 0x00 to (file size - 1).

writeDataBuffer - Buffer having data to be written.

Returns:

void

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to write the data to the file.

getValue

public int getValue(byte fileID)

Retrieves value stored in value file.On Tag lost connection needs to re-established by calling enable API in the application.

Parameters:

fileID

Returns:

int - Returns the value in the Value file

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to retieve the value from the value file.

credit

public void credit(MifareDesfire.CreditType creditType, byte fileID, MifareDesfire.FileCommMode fileCommMode, int value)

Increases a value stored in a value file with specified value.Depending on communication settings of file, data read from card will be either plain or enciphered. Preceding authentication, either with the keys specified for Credit or Read&Write access is required.On Tag lost connection needs to re-established by calling enable API in the application.

Parameters:

creditType - Credit type should be normal or limited.

fileID - Value file to credited. Should be within range 0x00-0x1F.

fileCommMode - File communication mode.

value - Value by which currently stored value should be increased. Only positive values are allowed.

Returns:

void

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to credit the value from the value file.

debit

public void debit(byte fileID, MifareDesfire.FileCommMode fileCommMode, int value)

Decreases value stored in a value file with specified value.Depending on communication settings of file, data read from card will be either plain or enciphered. Preceding authentication, either with the keys specified for Debit or Read&Write access is required.On Tag lost connection needs to re-established by calling enable API in the application.

Parameters:

fileID - Value file to be debited. Should be within range 0x00-0x1F.

fileCommMode - File communication mode.

value - Value by which currently stored value should be decreased.

Returns:

void

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to debit the value from the value file.

readRecord

public byte readRecord(byte fileID, MifareDesfire.FileCommMode fileCommMode, int recordOffset, int recordsToBeRead)

Reads records from cyclic or linear record file.Depending on communication settings of file, data read from card will be either plain or enciphered. Preceding authentication, either with the keys specified for Read or Read&Write access is required.On Tag lost connection needs to re-established by calling enable API in the application.

Parameters:

fileID - Linear or cyclic file to be read. Should be within range 0x00-0x1F.

fileCommMode - File communication mode.

recordOffset - Record number from which read should start. Should be within range 0x00000000 to (existing records - 1).

recordsToBeRead - Number of records to be read. Should be within range 0x00000000 - (existing records - offset). To read all the records from the specified offset, give 0 as input.

Returns:

byte - Buffer having read records.

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to read the data from the record.

writeRecord

public void writeRecord(byte fileID, MifareDesfire.FileCommMode fileCommMode, int recordOffset, int recordSize, byte[] writeRecordBuffer)

Writes records to cyclic or linear record file. Depending on communication settings of file, data read from card will be either plain or enciphered. Preceding authentication, either with the keys specified for Write or Read&Write access is required.The commitTransaction() must be called after this call which validates all previous write access on record files without which the changes will get invalidated.On Tag lost connection needs to re-established by calling enable API in the application.

Parameters:

fileID - Linear or cyclic file to be written. Should be within range 0x00-0x1F.

fileCommMode - File communication mode

recordOffset - Record number from which write should start. Should be within range 0x00000000 to (records - 1).

recordSize - Size of record to be written i.e. should be equal to size of writeRecordBuffer

writeRecordBuffer - Record buffer to write

Returns:

void

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to write the data to the record.

resetRecord

public void resetRecord(byte fileID)

Resets cyclic or linear record file to empty state. Preceding authentication, with key specified for Read&Write access is required.The commitTransaction() must be called after this call.On Tag lost connection needs to re-established by calling enable API in the application.

Parameters:

fileID - Cyclic or linear file to be cleared. Should be within range 0x00-0x1F.

Returns:

void

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to reset the record on the tag.

commitTransaction

public void commitTransaction()

Validates all previous write access on Backup data files, Value files, and Record files within one application. This API should be used only after executing below APIs: writeData() for Backup file credit() or debit() for Value file writeRecord() for Record file resetRecord() for Record file.On Tag lost connection needs to re-established by calling enable API in the application.

Returns:

void

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to commit the transaction on the tag.

abortTransaction

public void abortTransaction()

Invalidates all previous write access on Backup data files, Value files, and Record files within one application. This API should be used only after executing below APIs: writeData() for Backup file credit() or debit() for Value file writeRecord() for Record file resetRecord() for Record file.On Tag lost connection needs to re-established by calling enable API in the application.

Returns:

void

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if it fails to abort the transaction on the tag.

isEnabled

public boolean isEnabled()

Checks if the connection with the tag is enabled or not.

Returns:

boolean - true : if connection with the tag is enabled false : if the connection with tag is not enabled

Throws:

com.symbol.emdk.securenfc.MifareDesfireExpection

The exception will be thrown if the emdk is not opened.