summaryrefslogtreecommitdiff
path: root/reader_yhy.c
diff options
context:
space:
mode:
authorcbdev <cb@cbcdn.com>2023-06-24 21:52:34 +0200
committercbdev <cb@cbcdn.com>2023-06-24 21:52:34 +0200
commitbf9f1fd058c5ca324b2df5223c582ef1ece7a698 (patch)
tree2825cca86cba15661e6a6e28893450c938392810 /reader_yhy.c
parente3a80ac2d337b92514f3246dbacb8e4ca7b62d90 (diff)
downloadnfcommander-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.c71
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);