Как инициализировать тег Nf c, если тег пуст и сделать его защищенным паролем в Xamarin Android? - PullRequest
0 голосов
/ 04 февраля 2020

Я использую код для данных об оплате в теге nf c, и он работает, если тег уже инициализирован и защищен паролем. Но я сталкиваюсь с проблемой инициализации пустого тега и хочу установить пароль на тег. Как это можно сделать?

Мой код для аутентифицированного тега:

commandResponse = mifareUltralight.Transceive(getAuthenticateCmd());

Метод аутентификации:

internal byte[] getAuthenticateCmd()
    {
        return new byte[5] {
            0x1b,
            password[0],
            password[1],
            password[2],
            password[3]
        };
    }

Где пароль:

internal byte[] password = new byte[4] { 0x39, 0x39, 0x39, 0x39 };

Когда я пытаюсь этот код для аутентификации пустого тега, он выдает исключение TagLostException.

1 Ответ

0 голосов
/ 04 февраля 2020

Прежде всего вы должны проверить, защищен ли тег чтением auth0, я бы порекомендовал этот фрагмент кода:

boolean isTagProtected() {
    MifareUltralight mu = MifareUltralight.get(tag);
    boolean passExist;
    try {
        mu.connect();
        byte[] answer = mu.readPages(227);
        byte auth0 = answer[3];
        String text = String.format("%02x", auth0);
        Toast.makeText(context, text, Toast.LENGTH_LONG).show();
        passExist = auth0 < (byte) 0xEB;
        mu.close();
    } catch (IOException e) {
        e.printStackTrace();
        Toast.makeText(context, "cannot make authentication", Toast.LENGTH_SHORT).show();
        passExist = true;
    }
    return passExist;
}

, если тег не защищен, вы можете установить новый пароль с помощью этого кода :

private static final byte[] SET_PACK_VALUE = {(byte) 0xA2, (byte) 0xE6, (byte) 0x11, (byte) 0x11, (byte) 0x00, (byte) 0x00};
private static final byte[] SET_PASSWORD = {(byte) 0xA2, (byte) 0xE5, (byte) 0x75, (byte) 0x6C, (byte) 0x66, (byte) 0x30};
private static final byte[] SET_AUTH0_VALUE = {(byte) 0xA2, (byte) 0xE3, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xA1};
if (isTagProtected()) {
      Toast.makeText(context, "The tag is already Locked", Toast.LENGTH_LONG).show();
 } else {

      NfcA nfcaTag = NfcA.get(maintag);
      try {
           nfcaTag.connect();
           nfcaTag.transceive(SET_PACK_VALUE);
           nfcaTag.transceive(SET_PASSWORD);
           nfcaTag.transceive(SET_AUTH0_VALUE);
           nfcaTag.close();
           Toast.makeText(context, "The tag is locked", Toast.LENGTH_LONG).show();
      } catch (IOException e) {
           Toast.makeText(context, "Error happend", Toast.LENGTH_LONG).show();
                            e.printStackTrace();
       }
   }

если тег защищен, вы можете авторизовать его, чтобы иметь возможность читать и записывать теги всего за один сеанс.

Вот как очистить пароль:

private final byte[] pwd_auth = new byte[]{(byte) 0x1b, 
//here write your pass (4 bytes)
};
public static final byte[] RESET_PACK_VALUE = {(byte) 0xA2, (byte) 0xE6, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00};
public static final byte[] RESET_AUTH0_VALUE = {(byte) 0xA2, (byte) 0xE3, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xFF};

MifareUltralight mfu = MifareUltralight.get(maintag);
try {
     byte[] answer;
     mfu.connect();

     answer = mfu.transceive(pwd_auth);
     mfu.transceive(MainActivity.RESET_AUTH0_VALUE);
     mfu.transceive(MainActivity.RESET_PACK_VALUE);
     mfu.close();
     Toast.makeText(context, "The Password is deleted", Toast.LENGTH_LONG).show();
     } catch (IOException e) {
           Toast.makeText(context, "Error happend , wrong pass", Toast.LENGTH_LONG).show();
           e.printStackTrace();
      }

другими словами, вы пытаетесь аутентифицировать тег, у которого нет пароля. Вы должны установить пароль, а затем подтвердить его подлинность.

более общие сведения: tag tech

вот более подробная информация о технологии тегов: четыре параметра, которые вам необходимо измените некоторые из них, когда вы имеете дело с паролем:

PWD 32-битный пароль, используемый для защиты доступа к памяти. Считывание PWD всегда возвращает 00000000h.

PACK 16-битное подтверждение пароля, используемое в процессе аутентификации пароля. Чтение PACK всегда возвращает 0000h

AUTH0 Адрес страницы сектора 0, с которого требуется аутентификация по паролю для доступа к пользовательской памяти с точки зрения NFC, в зависимости от бита NFC_PROT. Если для AUTH0 задан адрес страницы больше, чем EBh, защита паролем фактически отключена. Область, защищенная паролем, начинается со страницы AUTH0 и заканчивается на странице EBh.

AUTHLIM объяснять здесь не нужно.

PS: я использую NT3H2111_2211 и вам следует прочитать ссылку от Андрея в комментариях, чтобы точно знать, где вы должны написать PACK, PWD и AUTH0.

...