mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-07-30 03:29:01 -07:00
some code to decoding payload
This commit is contained in:
parent
7003783c08
commit
c7c97d35b5
2 changed files with 53 additions and 16 deletions
|
@ -39,6 +39,10 @@ uint16_t ndefTLVGetLength(uint8_t *data, size_t *indx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int ndefDecodeHeader(uint8_t *data, size_t datalen, NDEFHeader_t *header) {
|
int ndefDecodeHeader(uint8_t *data, size_t datalen, NDEFHeader_t *header) {
|
||||||
|
header->Type = NULL;
|
||||||
|
header->Payload = NULL;
|
||||||
|
header->ID = NULL;
|
||||||
|
|
||||||
header->MessageBegin = data[0] & 0x80;
|
header->MessageBegin = data[0] & 0x80;
|
||||||
header->MessageEnd = data[0] & 0x40;
|
header->MessageEnd = data[0] & 0x40;
|
||||||
header->ChunkFlag = data[0] & 0x20;
|
header->ChunkFlag = data[0] & 0x20;
|
||||||
|
@ -50,13 +54,18 @@ int ndefDecodeHeader(uint8_t *data, size_t datalen, NDEFHeader_t *header) {
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
header->TypeLen = data[1];
|
header->TypeLen = data[1];
|
||||||
|
header->Type = data + header->len;
|
||||||
|
|
||||||
header->PayloadLen = (header->ShortRecordBit ? (data[2]) : ((data[2] << 24) + (data[3] << 16) + (data[4] << 8) + data[5]));
|
header->PayloadLen = (header->ShortRecordBit ? (data[2]) : ((data[2] << 24) + (data[3] << 16) + (data[4] << 8) + data[5]));
|
||||||
|
|
||||||
if (header->IDLenPresent)
|
if (header->IDLenPresent) {
|
||||||
header->IDLen = (header->ShortRecordBit ? (data[3]) : (data[6]));
|
header->IDLen = (header->ShortRecordBit ? (data[3]) : (data[6]));
|
||||||
else
|
header->Payload = header->Type + header->TypeLen;
|
||||||
|
} else {
|
||||||
header->IDLen = 0;
|
header->IDLen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
header->Payload = header->Type + header->TypeLen + header->IDLen;
|
||||||
|
|
||||||
header->RecLen = header->len + header->TypeLen + header->PayloadLen + header->IDLen;
|
header->RecLen = header->len + header->TypeLen + header->PayloadLen + header->IDLen;
|
||||||
|
|
||||||
|
@ -85,8 +94,38 @@ int ndefPrintHeader(NDEFHeader_t *header) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ndefRecordDecodeAndPrint(uint8_t *ndefRecord, size_t ndefRecordLen) {
|
int ndefDecodePayload(NDEFHeader_t *ndef) {
|
||||||
|
|
||||||
|
switch(ndef->TypeNameFormat) {
|
||||||
|
case tnfWellKnownRecord:
|
||||||
|
PrintAndLogEx(INFO, "Well Known Record");
|
||||||
|
PrintAndLogEx(NORMAL, "\ttype: %.*s", ndef->TypeLen, ndef->Type);
|
||||||
|
|
||||||
|
if (!strncmp((char *)ndef->Type, "T", ndef->TypeLen)) {
|
||||||
|
PrintAndLogEx(NORMAL, "\ttext : %.*s", ndef->PayloadLen, ndef->Payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strncmp((char *)ndef->Type, "U", ndef->TypeLen)) {
|
||||||
|
PrintAndLogEx(NORMAL, "\turi : %.*s", ndef->PayloadLen, ndef->Payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strncmp((char *)ndef->Type, "Sig", ndef->TypeLen)) {
|
||||||
|
printf("--sig\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case tnfAbsoluteURIRecord:
|
||||||
|
PrintAndLogEx(INFO, "Absolute URI Record");
|
||||||
|
PrintAndLogEx(NORMAL, "\ttype: %.*s", ndef->TypeLen, ndef->Type);
|
||||||
|
PrintAndLogEx(NORMAL, "\tpayload: %.*s", ndef->PayloadLen, ndef->Payload);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ndefRecordDecodeAndPrint(uint8_t *ndefRecord, size_t ndefRecordLen) {
|
||||||
NDEFHeader_t NDEFHeader = {0};
|
NDEFHeader_t NDEFHeader = {0};
|
||||||
int res = ndefDecodeHeader(ndefRecord, ndefRecordLen, &NDEFHeader);
|
int res = ndefDecodeHeader(ndefRecord, ndefRecordLen, &NDEFHeader);
|
||||||
if (res)
|
if (res)
|
||||||
|
@ -94,24 +133,19 @@ int ndefRecordDecodeAndPrint(uint8_t *ndefRecord, size_t ndefRecordLen) {
|
||||||
|
|
||||||
ndefPrintHeader(&NDEFHeader);
|
ndefPrintHeader(&NDEFHeader);
|
||||||
|
|
||||||
size_t indx = NDEFHeader.len;
|
|
||||||
if (NDEFHeader.TypeLen) {
|
if (NDEFHeader.TypeLen) {
|
||||||
PrintAndLogEx(INFO, "Type data:");
|
PrintAndLogEx(INFO, "Type data:");
|
||||||
dump_buffer(&ndefRecord[indx], NDEFHeader.TypeLen, stdout, 1);
|
dump_buffer(NDEFHeader.Type, NDEFHeader.TypeLen, stdout, 1);
|
||||||
|
|
||||||
indx += NDEFHeader.TypeLen;
|
|
||||||
}
|
}
|
||||||
if (NDEFHeader.IDLen) {
|
if (NDEFHeader.IDLen) {
|
||||||
PrintAndLogEx(INFO, "ID data:");
|
PrintAndLogEx(INFO, "ID data:");
|
||||||
dump_buffer(&ndefRecord[indx], NDEFHeader.IDLen, stdout, 1);
|
dump_buffer(NDEFHeader.ID, NDEFHeader.IDLen, stdout, 1);
|
||||||
|
|
||||||
indx += NDEFHeader.IDLen;
|
|
||||||
}
|
}
|
||||||
if (NDEFHeader.PayloadLen) {
|
if (NDEFHeader.PayloadLen) {
|
||||||
PrintAndLogEx(INFO, "Payload data:");
|
PrintAndLogEx(INFO, "Payload data:");
|
||||||
dump_buffer(&ndefRecord[indx], NDEFHeader.PayloadLen, stdout, 1);
|
dump_buffer(NDEFHeader.Payload, NDEFHeader.PayloadLen, stdout, 1);
|
||||||
|
if (NDEFHeader.TypeLen)
|
||||||
indx += NDEFHeader.PayloadLen;
|
ndefDecodePayload(&NDEFHeader);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -37,6 +37,9 @@ typedef struct {
|
||||||
size_t IDLen;
|
size_t IDLen;
|
||||||
size_t len;
|
size_t len;
|
||||||
size_t RecLen;
|
size_t RecLen;
|
||||||
|
uint8_t *Type;
|
||||||
|
uint8_t *Payload;
|
||||||
|
uint8_t *ID;
|
||||||
} NDEFHeader_t;
|
} NDEFHeader_t;
|
||||||
|
|
||||||
extern int NDEFDecodeAndPrint(uint8_t *ndef, size_t ndefLen, bool verbose);
|
extern int NDEFDecodeAndPrint(uint8_t *ndef, size_t ndefLen, bool verbose);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue