LF-RFID: add CRC calculation to paradox protocol (#2299)
Co-authored-by: Angel <angel@Zoomies> Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
		
							parent
							
								
									e12958d408
								
							
						
					
					
						commit
						a8e5f22500
					
				| @ -136,17 +136,45 @@ LevelDuration protocol_paradox_encoder_yield(ProtocolParadox* protocol) { | |||||||
|     return level_duration_make(level, duration); |     return level_duration_make(level, duration); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | static uint8_t protocol_paradox_calculate_checksum(uint8_t fc, uint16_t card_id) { | ||||||
|  |     uint8_t card_hi = (card_id >> 8) & 0xff; | ||||||
|  |     uint8_t card_lo = card_id & 0xff; | ||||||
|  | 
 | ||||||
|  |     uint8_t arr[5] = {0, 0, fc, card_hi, card_lo}; | ||||||
|  | 
 | ||||||
|  |     uint8_t manchester[9]; | ||||||
|  | 
 | ||||||
|  |     bit_lib_push_bit(manchester, 9, false); | ||||||
|  |     bit_lib_push_bit(manchester, 9, false); | ||||||
|  |     bit_lib_push_bit(manchester, 9, false); | ||||||
|  |     bit_lib_push_bit(manchester, 9, false); | ||||||
|  | 
 | ||||||
|  |     for(uint8_t i = 6; i < 40; i += 1) { | ||||||
|  |         if(bit_lib_get_bit(arr, i) == 0b1) { | ||||||
|  |             bit_lib_push_bit(manchester, 9, true); | ||||||
|  |             bit_lib_push_bit(manchester, 9, false); | ||||||
|  |         } else { | ||||||
|  |             bit_lib_push_bit(manchester, 9, false); | ||||||
|  |             bit_lib_push_bit(manchester, 9, true); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     uint8_t output = bit_lib_crc8(manchester, 9, 0x31, 0x00, true, true, 0x06); | ||||||
|  | 
 | ||||||
|  |     return output; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void protocol_paradox_render_data(ProtocolParadox* protocol, FuriString* result) { | void protocol_paradox_render_data(ProtocolParadox* protocol, FuriString* result) { | ||||||
|     uint8_t* decoded_data = protocol->data; |     uint8_t* decoded_data = protocol->data; | ||||||
|     uint8_t fc = bit_lib_get_bits(decoded_data, 10, 8); |     uint8_t fc = bit_lib_get_bits(decoded_data, 10, 8); | ||||||
|     uint16_t card_id = bit_lib_get_bits_16(decoded_data, 18, 16); |     uint16_t card_id = bit_lib_get_bits_16(decoded_data, 18, 16); | ||||||
|  |     uint8_t card_crc = bit_lib_get_bits_16(decoded_data, 34, 8); | ||||||
|  |     uint8_t calc_crc = protocol_paradox_calculate_checksum(fc, card_id); | ||||||
| 
 | 
 | ||||||
|     furi_string_cat_printf(result, "Facility: %u\r\n", fc); |     furi_string_cat_printf(result, "Facility: %u\r\n", fc); | ||||||
|     furi_string_cat_printf(result, "Card: %u\r\n", card_id); |     furi_string_cat_printf(result, "Card: %u\r\n", card_id); | ||||||
|     furi_string_cat_printf(result, "Data: "); |     furi_string_cat_printf(result, "CRC: %u   Calc CRC: %u\r\n", card_crc, calc_crc); | ||||||
|     for(size_t i = 0; i < PARADOX_DECODED_DATA_SIZE; i++) { |     if(card_crc != calc_crc) furi_string_cat_printf(result, "CRC Mismatch, Invalid Card!\r\n"); | ||||||
|         furi_string_cat_printf(result, "%02X", decoded_data[i]); |  | ||||||
|     } |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| void protocol_paradox_render_brief_data(ProtocolParadox* protocol, FuriString* result) { | void protocol_paradox_render_brief_data(ProtocolParadox* protocol, FuriString* result) { | ||||||
| @ -154,8 +182,15 @@ void protocol_paradox_render_brief_data(ProtocolParadox* protocol, FuriString* r | |||||||
| 
 | 
 | ||||||
|     uint8_t fc = bit_lib_get_bits(decoded_data, 10, 8); |     uint8_t fc = bit_lib_get_bits(decoded_data, 10, 8); | ||||||
|     uint16_t card_id = bit_lib_get_bits_16(decoded_data, 18, 16); |     uint16_t card_id = bit_lib_get_bits_16(decoded_data, 18, 16); | ||||||
|  |     uint8_t card_crc = bit_lib_get_bits_16(decoded_data, 34, 8); | ||||||
|  |     uint8_t calc_crc = protocol_paradox_calculate_checksum(fc, card_id); | ||||||
| 
 | 
 | ||||||
|     furi_string_cat_printf(result, "FC: %03u, Card: %05u", fc, card_id); |     furi_string_cat_printf(result, "FC: %03u, Card: %05u\r\n", fc, card_id); | ||||||
|  |     if(calc_crc == card_crc) { | ||||||
|  |         furi_string_cat_printf(result, "CRC : %03u", card_crc); | ||||||
|  |     } else { | ||||||
|  |         furi_string_cat_printf(result, "Card is Invalid!"); | ||||||
|  |     } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| bool protocol_paradox_write_data(ProtocolParadox* protocol, void* data) { | bool protocol_paradox_write_data(ProtocolParadox* protocol, void* data) { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Angel
						Angel