Не удается аутентифицировать NTAG213

Я использую считыватель NFC ACR122U для защиты паролем этикетки NTAG213 NFC. Я думаю, что мне удалось правильно установить пароль, но я не могу аутентифицироваться и впоследствии изменить метку. Мой код для аутентификации выглядит так:

#include <winscard.h>
#include <iostream>
#pragma comment(lib, "winscard.lib")

const char *ReaderName = "ACS ACR122 0";
unsigned Password = 0x12345678;

int main()
{
  //Establish context
  SCARDCONTEXT              hContext;
  DWORD SCard_Status1 = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hContext);
  if(SCard_Status1 != SCARD_S_SUCCESS)
    return 1;

  //connect to the card
  SCARDHANDLE   hCardHandle;
  DWORD Protocol;
  DWORD SCard_Status2 = SCardConnect(hContext, ReaderName, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T1, &hCardHandle, &Protocol);
  if(SCard_Status2 != SCARD_S_SUCCESS)
  {
    SCardReleaseContext(hContext);
    return 1;
  }

  SCARD_IO_REQUEST Request;
  Request.dwProtocol = Protocol;
  Request.cbPciLength = sizeof(SCARD_IO_REQUEST);
  BYTE TxData[] =
  {
    0xFF, //CLA
    0x00, //INS
    0x00, //P1
    0x00, //P2
    0x08, //LC
    0xD4,
    0x40,
    0x01,
    0x1B, //PWD_AUTH (See data sheet)
    Password,
    Password >> 8,
    Password >> 16,
    Password >> 24,
  };

  BYTE RxData[254];
  unsigned long RxLength = sizeof(RxData);
  DWORD SCard_Status3 = SCardTransmit(hCardHandle, &Request, TxData, sizeof(TxData), NULL, RxData, &RxLength);
  std::cout << "SCard_Status = " << SCard_Status3 << std::endl;
  std::cout << "RxLength = " << RxLength << std::endl;

  SCardDisconnect(hCardHandle, SCARD_EJECT_CARD);
  SCardReleaseContext(hContext);
  return 0;
}

Это должно отправить команду PWD_AUTH на NTAG213 с Pwd. Я ожидал получить ошибку, если пароль неверный или два байта с PACK, если пароль правильный. Но SCard_Status равен SCARD_S_SUCCESS, а RxLength впоследствии равен 0. И если я пытаюсь написать на ярлык, я получаю ошибку.

У меня возникли проблемы с поиском примеров, показывающих, как это сделать. Может ли кто-нибудь увидеть, что я делаю неправильно?


person Ivan Johansen    schedule 21.09.2014    source источник
comment
Если SCardTransmit возвращает SCARD_S_SUCCESS, RxData должно быть 9000.   -  person vikky    schedule 22.09.2014
comment
Да, но RxData не записывается, так как RxLength равен 0.   -  person Ivan Johansen    schedule 22.09.2014
comment
Если RxData пуст, значит, в SCardTransmit есть какая-то проблема. Вы выкладываете весь код?   -  person vikky    schedule 22.09.2014
comment
Я обновил код, так что теперь это полный пример моей проблемы. Он печатает SCard_Status = 0 и RxLength = 0.   -  person Ivan Johansen    schedule 23.09.2014
comment
Я думаю, что SCard_Status напечатает предыдущее значение. Измените имя переменной и проверьте возвращаемое значение.   -  person vikky    schedule 23.09.2014
comment
Я не понимаю, как изменение имени переменной должно иметь значение, но я изменил его сейчас с тем же результатом.   -  person Ivan Johansen    schedule 23.09.2014


Ответы (1)


Я собираюсь ответить на это сам. Мне удалось заставить его работать, изменив TxData на это:

BYTE TxData[] =
{
  0xFF, //CLA
  0x00, //INS
  0x00, //P1
  0x00, //P2
  0x07, //LC
  0xD4, 0x42, //InCommunicateThru
  0x1B, //PWD_AUTH (See data sheet)
  Password,
  Password >> 8,
  Password >> 16,
  Password >> 24,
};

Я нашел команду InCommunicateThru (D4 42) в качестве замены InDataExchange (D4 40) в листе данных для PN532, который является процессором NFC внутри ACR122U.

person Ivan Johansen    schedule 26.09.2014