feat: enhance NDEF decoding to validate structure and extract JSON payload
This commit is contained in:
		
							
								
								
									
										54
									
								
								src/nfc.cpp
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								src/nfc.cpp
									
									
									
									
									
								
							@@ -206,14 +206,58 @@ uint8_t ntag2xx_WriteNDEF(const char *payload) {
 | 
				
			|||||||
bool decodeNdefAndReturnJson(const byte* encodedMessage, String uidString) {
 | 
					bool decodeNdefAndReturnJson(const byte* encodedMessage, String uidString) {
 | 
				
			||||||
  oledShowProgressBar(1, octoEnabled?5:4, "Reading", "Decoding data");
 | 
					  oledShowProgressBar(1, octoEnabled?5:4, "Reading", "Decoding data");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  byte typeLength = encodedMessage[3];
 | 
					  // Check for NDEF TLV (Type-Length-Value) structure
 | 
				
			||||||
  byte payloadLength = encodedMessage[4];
 | 
					  if (encodedMessage[0] != 0x03) {
 | 
				
			||||||
 | 
					    Serial.println("Not a valid NDEF message (missing TLV tag 0x03)");
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Get the total NDEF message length from TLV
 | 
				
			||||||
 | 
					  byte ndefMessageLength = encodedMessage[1];
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // Skip TLV header (2 bytes) to get to NDEF record
 | 
				
			||||||
 | 
					  const byte* ndefRecord = &encodedMessage[2];
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // Parse NDEF record header
 | 
				
			||||||
 | 
					  byte recordHeader = ndefRecord[0];
 | 
				
			||||||
 | 
					  byte typeLength = ndefRecord[1];
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // Determine payload length (can be 1 or 4 bytes depending on SR flag)
 | 
				
			||||||
 | 
					  uint32_t payloadLength = 0;
 | 
				
			||||||
 | 
					  byte payloadLengthBytes = 1;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // Check if Short Record (SR) flag is set
 | 
				
			||||||
 | 
					  if (recordHeader & 0x10) { // SR flag
 | 
				
			||||||
 | 
					    payloadLength = ndefRecord[2];
 | 
				
			||||||
 | 
					    payloadLengthBytes = 1;
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    // Long record format (4 bytes for payload length)
 | 
				
			||||||
 | 
					    payloadLength = (ndefRecord[2] << 24) | (ndefRecord[3] << 16) | 
 | 
				
			||||||
 | 
					                   (ndefRecord[4] << 8) | ndefRecord[5];
 | 
				
			||||||
 | 
					    payloadLengthBytes = 4;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Serial.print("NDEF Record Header: 0x");
 | 
				
			||||||
 | 
					  Serial.println(recordHeader, HEX);
 | 
				
			||||||
 | 
					  Serial.print("Type Length: ");
 | 
				
			||||||
 | 
					  Serial.println(typeLength);
 | 
				
			||||||
 | 
					  Serial.print("Payload Length: ");
 | 
				
			||||||
 | 
					  Serial.println(payloadLength);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Calculate offset to payload
 | 
				
			||||||
 | 
					  byte payloadOffset = 2 + payloadLengthBytes + typeLength;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // Verify we have enough data
 | 
				
			||||||
 | 
					  if (payloadOffset + payloadLength > ndefMessageLength + 2) {
 | 
				
			||||||
 | 
					    Serial.println("Invalid NDEF structure - payload extends beyond message");
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  nfcJsonData = "";
 | 
					  nfcJsonData = "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (int i = 2; i < payloadLength+2; i++) 
 | 
					  // Extract JSON payload
 | 
				
			||||||
  {
 | 
					  for (uint32_t i = 0; i < payloadLength; i++) {
 | 
				
			||||||
    nfcJsonData += (char)encodedMessage[3 + typeLength + i];
 | 
					    nfcJsonData += (char)ndefRecord[payloadOffset + i];
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Serial.println("Decoded JSON Data:");
 | 
					  Serial.println("Decoded JSON Data:");
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user