00001 #include "mifare.h"
00002
00003 #include <string.h>
00004
00005 #include <nfc/nfc.h>
00006
00020 bool
00021 nfc_initiator_mifare_cmd (nfc_device_t * pnd, const mifare_cmd mc, const uint8_t ui8Block, mifare_param * pmp)
00022 {
00023 byte_t abtRx[265];
00024 size_t szRxLen;
00025 size_t szParamLen;
00026 byte_t abtCmd[265];
00027
00028
00029 if (!pnd->bActive)
00030 return false;
00031
00032 abtCmd[0] = mc;
00033 abtCmd[1] = ui8Block;
00034
00035 switch (mc) {
00036
00037 case MC_READ:
00038 case MC_STORE:
00039 szParamLen = 0;
00040 break;
00041
00042
00043 case MC_AUTH_A:
00044 case MC_AUTH_B:
00045 szParamLen = sizeof (mifare_param_auth);
00046 break;
00047
00048
00049 case MC_WRITE:
00050 szParamLen = sizeof (mifare_param_data);
00051 break;
00052
00053
00054 case MC_DECREMENT:
00055 case MC_INCREMENT:
00056 case MC_TRANSFER:
00057 szParamLen = sizeof (mifare_param_value);
00058 break;
00059
00060
00061 default:
00062 return false;
00063 break;
00064 }
00065
00066
00067 if (szParamLen)
00068 memcpy (abtCmd + 2, (byte_t *) pmp, szParamLen);
00069
00070
00071 if (!nfc_initiator_transceive_bytes (pnd, abtCmd, 2 + szParamLen, abtRx, &szRxLen)) {
00072 if (pnd->iLastError != 0x14)
00073 nfc_perror (pnd, "nfc_initiator_transceive_bytes");
00074 return false;
00075 }
00076
00077 if (mc == MC_READ) {
00078 if (szRxLen == 16) {
00079 memcpy (pmp->mpd.abtData, abtRx, 16);
00080 } else {
00081 return false;
00082 }
00083 }
00084
00085 return true;
00086 }