diff options
author | cbdev <cb@cbcdn.com> | 2023-06-24 21:52:34 +0200 |
---|---|---|
committer | cbdev <cb@cbcdn.com> | 2023-06-24 21:52:34 +0200 |
commit | bf9f1fd058c5ca324b2df5223c582ef1ece7a698 (patch) | |
tree | 2825cca86cba15661e6a6e28893450c938392810 /reader_yhy.c | |
parent | e3a80ac2d337b92514f3246dbacb8e4ca7b62d90 (diff) | |
download | nfcommander-bf9f1fd058c5ca324b2df5223c582ef1ece7a698.tar.gz nfcommander-bf9f1fd058c5ca324b2df5223c582ef1ece7a698.tar.bz2 nfcommander-bf9f1fd058c5ca324b2df5223c582ef1ece7a698.zip |
Tag data management skeleton
Diffstat (limited to 'reader_yhy.c')
-rw-r--r-- | reader_yhy.c | 71 |
1 files changed, 59 insertions, 12 deletions
diff --git a/reader_yhy.c b/reader_yhy.c index 41f20d8..92d5080 100644 --- a/reader_yhy.c +++ b/reader_yhy.c @@ -41,6 +41,60 @@ int handle(int fd){ return 0; } +uint8_t read_ntag(nfc_tag_info_t* tag){ + uint8_t data[16]; + size_t bytes; + + //read 16 bytes starting at block 2 + //[0-3] UID, lock bytes + //[4-7] CC + //[8-11] Signature + //[12-15] Data block offsets & lengths + bytes = yhy_sync_read(reader_fd, 2, data, sizeof(data)); + if(bytes != 16){ + //read failed, probably not a usable tag + return FLAG_TAG_LOCKED; + } + + //check for NTAG signature CC bytes + if(data[4] != 0xE1 || data[5] != 0x10 || data[7]){ + return FLAG_TAG_LOCKED; + } + + switch(data[6]){ + case 0x12: + //NTAG213 + tag->bytes_available = 144; + break; + case 0x3E: + //NTAG215 + tag->bytes_available = 496; + break; + case 0x6D: + //NTAG216 + tag->bytes_available = 872; + break; + default: + //unknown + return FLAG_TAG_LOCKED; + } + + //TODO check lock bits + + //check nfcommander signature + if(data[8] != 0xCB || data[9] != 'N' || data[10] != 'F' || data[11] != 'C'){ + return FLAG_TAG_UNPROGRAMMED; + } + + + return 0; +} + +uint8_t read_mifare(nfc_tag_info_t* tag){ + //TODO + return 0; +} + int scan(){ nfc_tag_info_t card = { 0 @@ -48,8 +102,7 @@ int scan(){ uint16_t atqa = 0; uint8_t sak = 0; - uint8_t data[16]; - uint8_t bytes; + uint8_t flags; for(yhy_sync_request(reader_fd, 1, &atqa); atqa; yhy_sync_request(reader_fd, 0, &atqa)){ sak = 0; @@ -63,7 +116,6 @@ int scan(){ card.type = tag_unknown; if(atqa == 0x0044){ card.type = tag_ntag; - card.bytes_available = 140; card.granularity = 4; } else{ @@ -85,20 +137,15 @@ int scan(){ } } - if(reader_tag_present(0, card) == TAG_READ_REQUESTED){ + if(reader_tag_present(0, &card) == TAG_READ_REQUESTED){ //read card data if(card.type == tag_ntag){ - //capability container in page 3, byte 2 - // - // //0x12 -> ntag213 - // //0x3e -> ntag215 - // //0x6d -> ntag216 - //user data in pages 4 trough 39 - bytes = yhy_sync_read(reader_fd, 3, data, sizeof(data)); + flags = read_ntag(&card); } else if(card.type == tag_mifare1){ + flags = read_mifare(&card); } - reader_tag_present(FLAG_TAG_LOCKED, card); + reader_tag_present(flags, &card); } yhy_sync_hlta(reader_fd); |