mirror of
				https://github.com/Proxmark/proxmark3.git
				synced 2025-10-31 16:48:38 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			128 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // ISO15693 commons
 | |
| // Adrian Dabrowski 2010 and others, GPLv2
 | |
| 
 | |
| #ifndef ISO15693_H__
 | |
| #define ISO15693_H__
 | |
| 
 | |
| // ISO15693 CRC
 | |
| #define ISO15_CRC_PRESET	(uint16_t)0xFFFF
 | |
| #define ISO15_CRC_POLY		(uint16_t)0x8408
 | |
| #define ISO15_CRC_CHECK		((uint16_t)(~0xF0B8 & 0xFFFF)) 	// use this for checking of a correct crc
 | |
| 
 | |
| // REQUEST FLAGS
 | |
| 
 | |
| #define ISO15_REQ_SUBCARRIER_SINGLE	0x00	// Tag should respond using one subcarrier (ASK)
 | |
| #define ISO15_REQ_SUBCARRIER_TWO		0x01	// Tag should respond using two subcarriers (FSK)
 | |
| #define ISO15_REQ_DATARATE_LOW		0x00	// Tag should respond using low data rate
 | |
| #define ISO15_REQ_DATARATE_HIGH		0x02	// Tag should respond using high data rate
 | |
| #define ISO15_REQ_NONINVENTORY		0x00
 | |
| #define ISO15_REQ_INVENTORY		0x04	// This is an inventory request - see inventory flags
 | |
| #define ISO15_REQ_PROTOCOL_NONEXT		0x00
 | |
| #define ISO15_REQ_PROTOCOL_EXT		0x08	// RFU
 | |
| 
 | |
| // REQUEST FLAGS when INVENTORY is not set
 | |
| 
 | |
| #define ISO15_REQ_SELECT			0x10	// only selected cards response
 | |
| #define ISO15_REQ_ADDRESS			0x20	// this req contains an address
 | |
| #define ISO15_REQ_OPTION			0x40	// Command specific option selector
 | |
| 
 | |
| //REQUEST FLAGS when INVENTORY is set
 | |
| 
 | |
| #define ISO15_REQINV_AFI			0x10	// AFI Field is present
 | |
| #define ISO15_REQINV_SLOT1		0x20	// 1 Slot
 | |
| #define ISO15_REQINV_SLOT16		0x00	// 16 Slots
 | |
| #define ISO15_REQINV_OPTION		0x40	// Command specific option selector
 | |
| 
 | |
| //RESPONSE FLAGS
 | |
| #define ISO15_RES_ERROR			0x01
 | |
| #define ISO15_RES_EXT			0x08	// Protocol Extention	
 | |
| 
 | |
| // RESPONSE ERROR CODES
 | |
| #define ISO15_NOERROR			0x00
 | |
| #define ISO15_ERROR_CMD_NOT_SUP		0x01	// Command not supported
 | |
| #define ISO15_ERROR_CMD_NOT_REC		0x02	// Command not recognized (eg. parameter error)
 | |
| #define ISO15_ERROR_CMD_OPTION		0x03	// Command option not supported
 | |
| #define ISO15_ERROR_GENERIC		0x0F	// No additional Info about this error
 | |
| #define ISO15_ERROR_BLOCK_UNAVAILABLE	0x10	
 | |
| #define ISO15_ERROR_BLOCK_LOCKED_ALREADY	0x11	// cannot lock again
 | |
| #define ISO15_ERROR_BLOCK_LOCKED		0x12	// cannot be changed
 | |
| #define ISO15_ERROR_BLOCK_WRITE		0x13	// Writing was unsuccessful
 | |
| #define ISO15_ERROR_BLOCL_WRITELOCK	0x14	// Locking was unsuccessful
 | |
| 
 | |
| // COMMAND CODES
 | |
| #define ISO15_CMD_INVENTORY			0x01
 | |
| #define ISO15_CMD_STAYQUIET			0x02
 | |
| #define ISO15_CMD_READ					0x20
 | |
| #define ISO15_CMD_WRITE					0x21
 | |
| #define ISO15_CMD_LOCK					0x22
 | |
| #define ISO15_CMD_READMULTI			0x23
 | |
| #define ISO15_CMD_WRITEMULTI			0x24
 | |
| #define ISO15_CMD_SELECT				0x25
 | |
| #define ISO15_CMD_RESET					0x26
 | |
| #define ISO15_CMD_WRITEAFI				0x27
 | |
| #define ISO15_CMD_LOCKAFI				0x28
 | |
| #define ISO15_CMD_WRITEDSFID			0x29
 | |
| #define ISO15_CMD_LOCKDSFID			0x2A
 | |
| #define ISO15_CMD_SYSINFO				0x2B
 | |
| #define ISO15_CMD_SECSTATUS			0x2C
 | |
| 
 | |
| 
 | |
| uint16_t Iso15693Crc(uint8_t *v, int n);
 | |
| int Iso15693AddCrc(uint8_t *req, int n);
 | |
| char* Iso15693sprintUID(char *target,uint8_t *uid);
 | |
| unsigned short iclass_crc16(char *data_p, unsigned short length);
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| // Map a sequence of octets (~layer 2 command) into the set of bits to feed
 | |
| // to the FPGA, to transmit that command to the tag.
 | |
| // Mode: highspeed && one subcarrier (ASK)
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| 	// The sampling rate is 106.353 ksps/s, for T = 18.8 us
 | |
| 
 | |
| 	// SOF defined as
 | |
| 	// 1) Unmodulated time of 56.64us
 | |
| 	// 2) 24 pulses of 423.75khz
 | |
| 	// 3) logic '1' (unmodulated for 18.88us followed by 8 pulses of 423.75khz)
 | |
| 
 | |
| 	static const int Iso15693FrameSOF[] = {
 | |
| 		-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 | |
| 		-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 | |
| 		 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
 | |
| 		 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
 | |
| 		-1, -1, -1, -1,
 | |
| 		-1, -1, -1, -1,
 | |
| 		 1,  1,  1,  1,
 | |
| 		 1,  1,  1,  1
 | |
| 	};
 | |
| 	static const int Iso15693Logic0[] = {
 | |
| 		 1,  1,  1,  1,
 | |
| 		 1,  1,  1,  1,
 | |
| 		-1, -1, -1, -1,
 | |
| 		-1, -1, -1, -1
 | |
| 	};
 | |
| 	static const int Iso15693Logic1[] = {
 | |
| 		-1, -1, -1, -1,
 | |
| 		-1, -1, -1, -1,
 | |
| 		 1,  1,  1,  1,
 | |
| 		 1,  1,  1,  1
 | |
| 	};
 | |
| 
 | |
| 	// EOF defined as
 | |
| 	// 1) logic '0' (8 pulses of 423.75khz followed by unmodulated for 18.88us)
 | |
| 	// 2) 24 pulses of 423.75khz
 | |
| 	// 3) Unmodulated time of 56.64us
 | |
| 
 | |
| 	static const int Iso15693FrameEOF[] = {
 | |
| 		 1,  1,  1,  1,
 | |
| 		 1,  1,  1,  1,
 | |
| 		-1, -1, -1, -1,
 | |
| 		-1, -1, -1, -1,
 | |
| 		 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
 | |
| 		 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
 | |
| 		-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 | |
| 		-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
 | |
| 	};
 | |
| 
 | |
| 
 | |
| #endif
 |