pokusew / nfc-pcsc

Easy reading and writing NFC tags and cards in Node.js
MIT License
531 stars 131 forks source link

Authentication failed for same blocks BUT is Working in others #134

Open koubi54 opened 2 years ago

koubi54 commented 2 years ago

i have seen your documentation it was very helpful but i have this probleme i can't solve when i scanne my card i can read 0,1,2,3 blocks but from 4 to 64 i have an error

Note: the card is note empty

ACS ACR122U PICC Interface 0 card detected { atr: <Buffer 3b 8f 80 01 80 4f 0c a0 00 00 03 06 03 00 01 00 00 00 00 6a>, standard: 'TAG_ISO_14443_3', type: 'TAG_ISO_14443_3', uid: '0336a703' } Mifare Classic 1k AuthenticationError: Authentication operation failed: Status code: 0x6300 at ACR122Reader.authenticate (C:\Users\azerty\Desktop\nodejs\nfc\node_modules\nfc-pcsc\dist\Reader.js:380:13) at async ACR122Reader. (C:\Users\azerty\Desktop\nodejs\nfc\test.js:67:13) { code: 'operation_failed' }

############## my code ###################

const { NFC ,TAG_ISO_14443_3, TAG_ISO_14443_4, KEY_TYPE_A, KEY_TYPE_B } = require('nfc-pcsc'); const fs = require('fs'); const nfc = new NFC(); // optionally you can pass logger nfc.on('reader', reader => { console.log(${reader.reader.name} device attached); reader.aid = 'F222222222'; reader.on('card', async card => { try { await reader.authenticate(0,KEY_TYPE_B, "ffffffffffff") const data0 = await reader.read(0, 16, 16); console.log(data0); await reader.authenticate(1,KEY_TYPE_B, "ffffffffffff") const data1 = await reader.read(1, 16, 16); console.log(data1); await reader.authenticate(4,KEY_TYPE_B, "ffffffffffff") const data4 = await reader.read(4, 16, 16); console.log(data4); await reader.authenticate(5,KEY_TYPE_B, "ffffffffffff") const data5 = await reader.read(5, 16, 16); console.log(data5); } catch (err) { console.error(err); } }); reader.on('card.off', card => { console.log(${reader.reader.name} card removed, card); }); reader.on('error', err => { console.log(${reader.reader.name} an error occurred, err); }); reader.on('end', () => { console.log(${reader.reader.name} device removed); }); }); nfc.on('error', err => { console.log('an error occurred', err); });

davidgs commented 1 year ago

You cannot authenticate to block 0, as far as I'm aware. You have to start at block 4. I haven't tried using the KEY_TYPE_B but with my Mifare classic 1k cards KEY_TYPE_A works.

const key = 'FFFFFFFFFFFF'; 
const keyType = NFC.KEY_TYPE_A;
try {
      await Promise.all([
        reader.authenticate(4, keyType, key),
        reader.authenticate(5, keyType, key),
        reader.authenticate(6, keyType, key),
      ]);
      console.log(`3 sectors successfully authenticated`, reader);
    } catch (err) {
      console.log(
        `error when authenticating block 4 within the sector 1`,
        reader,
        err
      );
      return;
    }