Skip to content

Commit

Permalink
Get/Set NAD works only for TPDU readers
Browse files Browse the repository at this point in the history
For APDU readers the driver does not handle the T=1 blocks so it can't
manage the NAD value.

From my list, 35% of readers work in TPDU mode
https://ccid.apdu.fr/select_readers/?dwFeatures=12
  • Loading branch information
LudovicRousseau committed May 25, 2024
1 parent 571264b commit 7709780
Showing 1 changed file with 48 additions and 40 deletions.
88 changes: 48 additions & 40 deletions src/ifdhandler.c
Original file line number Diff line number Diff line change
Expand Up @@ -1892,53 +1892,61 @@ EXTERNAL RESPONSECODE IFDHControl(DWORD Lun, DWORD dwControlCode,
{
DEBUG_INFO1("Control command for MEP");

/* Set T=1 NAD */
if (TxLength == 4
&& (TxBuffer[0] == 0x3E)
&& (TxBuffer[1] == 0x00)
&& (TxBuffer[2] == 0x01))
if (CCID_CLASS_TPDU != (ccid_descriptor->dwFeatures & CCID_CLASS_EXCHANGE_MASK))
{
RxBuffer[0] = 0x3E;
RxBuffer[1] = 0x00;
RxBuffer[2] = 0x01;
DEBUG_INFO1("Set NAD value");
if (t1_set_param(&CcidSlots[reader_index].t1, IFD_PROTOCOL_T1_NAD,
TxBuffer[3]))
/* error */
RxBuffer[3] = 0x01;
else
RxBuffer[3] = 0x00;
*pdwBytesReturned = 4;
return_value = IFD_SUCCESS;
DEBUG_INFO1("Reader is NOT in TPDU mode");
return_value = IFD_NOT_SUPPORTED;
}

/* Get T=1 NAD */
if (TxLength == 3
&& (TxBuffer[0] == 0x3F)
&& (TxBuffer[1] == 0x00)
&& (TxBuffer[2] == 0x00))
else
{
int value = 0;

RxBuffer[0] = 0x3F;
RxBuffer[1] = 0x00;
RxBuffer[2] = 0x02;
DEBUG_INFO1("Get NAD value");
value = t1_get_param(&CcidSlots[reader_index].t1,
IFD_PROTOCOL_T1_NAD);
if (-1 == value)
/* Set T=1 NAD */
if (TxLength == 4
&& (TxBuffer[0] == 0x3E)
&& (TxBuffer[1] == 0x00)
&& (TxBuffer[2] == 0x01))
{
/* error */
RxBuffer[3] = 0x01;
RxBuffer[4] = 0x00;
RxBuffer[0] = 0x3E;
RxBuffer[1] = 0x00;
RxBuffer[2] = 0x01;
DEBUG_INFO1("Set NAD value");
if (t1_set_param(&CcidSlots[reader_index].t1, IFD_PROTOCOL_T1_NAD,
TxBuffer[3]))
/* error */
RxBuffer[3] = 0x01;
else
RxBuffer[3] = 0x00;
*pdwBytesReturned = 4;
return_value = IFD_SUCCESS;
}
else

/* Get T=1 NAD */
if (TxLength == 3
&& (TxBuffer[0] == 0x3F)
&& (TxBuffer[1] == 0x00)
&& (TxBuffer[2] == 0x00))
{
RxBuffer[3] = 0x00;
RxBuffer[4] = value;
int value = 0;

RxBuffer[0] = 0x3F;
RxBuffer[1] = 0x00;
RxBuffer[2] = 0x02;
DEBUG_INFO1("Get NAD value");
value = t1_get_param(&CcidSlots[reader_index].t1,
IFD_PROTOCOL_T1_NAD);
if (-1 == value)
{
/* error */
RxBuffer[3] = 0x01;
RxBuffer[4] = 0x00;
}
else
{
RxBuffer[3] = 0x00;
RxBuffer[4] = value;
}
*pdwBytesReturned = 5;
return_value = IFD_SUCCESS;
}
*pdwBytesReturned = 5;
return_value = IFD_SUCCESS;
}
}

Expand Down

0 comments on commit 7709780

Please sign in to comment.