[FL-3706], [FL-3674] NFC NTAG and ISO14443-3b reading fix (#3285)
* mf ultralight poller: reset field after reading tearing flags * iso14443-3b poller: change cid comparison in ATTRIB cmd Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
		
							parent
							
								
									90cb1c4f2e
								
							
						
					
					
						commit
						155e4e9fa4
					
				| @ -117,12 +117,13 @@ Iso14443_3bError iso14443_3b_poller_activate(Iso14443_3bPoller* instance, Iso144 | |||||||
|         bit_buffer_reset(instance->rx_buffer); |         bit_buffer_reset(instance->rx_buffer); | ||||||
| 
 | 
 | ||||||
|         // Send ATTRIB
 |         // Send ATTRIB
 | ||||||
|  |         uint8_t cid = 0; | ||||||
|         bit_buffer_append_byte(instance->tx_buffer, 0x1d); |         bit_buffer_append_byte(instance->tx_buffer, 0x1d); | ||||||
|         bit_buffer_append_bytes(instance->tx_buffer, data->uid, ISO14443_3B_UID_SIZE); |         bit_buffer_append_bytes(instance->tx_buffer, data->uid, ISO14443_3B_UID_SIZE); | ||||||
|         bit_buffer_append_byte(instance->tx_buffer, 0x00); |         bit_buffer_append_byte(instance->tx_buffer, 0x00); | ||||||
|         bit_buffer_append_byte(instance->tx_buffer, ISO14443_3B_ATTRIB_FRAME_SIZE_256); |         bit_buffer_append_byte(instance->tx_buffer, ISO14443_3B_ATTRIB_FRAME_SIZE_256); | ||||||
|         bit_buffer_append_byte(instance->tx_buffer, 0x01); |         bit_buffer_append_byte(instance->tx_buffer, 0x01); | ||||||
|         bit_buffer_append_byte(instance->tx_buffer, 0x00); |         bit_buffer_append_byte(instance->tx_buffer, cid); | ||||||
| 
 | 
 | ||||||
|         ret = iso14443_3b_poller_frame_exchange( |         ret = iso14443_3b_poller_frame_exchange( | ||||||
|             instance, instance->tx_buffer, instance->rx_buffer, iso14443_3b_get_fwt_fc_max(data)); |             instance, instance->tx_buffer, instance->rx_buffer, iso14443_3b_get_fwt_fc_max(data)); | ||||||
| @ -138,11 +139,10 @@ Iso14443_3bError iso14443_3b_poller_activate(Iso14443_3bPoller* instance, Iso144 | |||||||
|                 bit_buffer_get_size_bytes(instance->rx_buffer)); |                 bit_buffer_get_size_bytes(instance->rx_buffer)); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if(bit_buffer_get_byte(instance->rx_buffer, 0) != 0) { |         uint8_t cid_received = bit_buffer_get_byte(instance->rx_buffer, 0); | ||||||
|             FURI_LOG_D( |         // 15 bit is RFU
 | ||||||
|                 TAG, |         if((cid_received & 0x7f) != cid) { | ||||||
|                 "Incorrect CID in ATTRIB response: %02X", |             FURI_LOG_D(TAG, "Incorrect CID in ATTRIB response: %02X", cid_received); | ||||||
|                 bit_buffer_get_byte(instance->rx_buffer, 0)); |  | ||||||
|             instance->state = Iso14443_3bPollerStateActivationFailed; |             instance->state = Iso14443_3bPollerStateActivationFailed; | ||||||
|             ret = Iso14443_3bErrorCommunication; |             ret = Iso14443_3bErrorCommunication; | ||||||
|             break; |             break; | ||||||
|  | |||||||
| @ -371,11 +371,14 @@ static NfcCommand mf_ultralight_poller_handler_read_counters(MfUltralightPoller* | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static NfcCommand mf_ultralight_poller_handler_read_tearing_flags(MfUltralightPoller* instance) { | static NfcCommand mf_ultralight_poller_handler_read_tearing_flags(MfUltralightPoller* instance) { | ||||||
|  |     NfcCommand command = NfcCommandContinue; | ||||||
|  | 
 | ||||||
|     if(mf_ultralight_support_feature( |     if(mf_ultralight_support_feature( | ||||||
|            instance->feature_set, |            instance->feature_set, | ||||||
|            MfUltralightFeatureSupportCheckTearingFlag | MfUltralightFeatureSupportSingleCounter)) { |            MfUltralightFeatureSupportCheckTearingFlag | MfUltralightFeatureSupportSingleCounter)) { | ||||||
|         if(instance->tearing_flag_read == instance->tearing_flag_total) { |         if(instance->tearing_flag_read == instance->tearing_flag_total) { | ||||||
|             instance->state = MfUltralightPollerStateTryDefaultPass; |             instance->state = MfUltralightPollerStateTryDefaultPass; | ||||||
|  |             command = NfcCommandReset; | ||||||
|         } else { |         } else { | ||||||
|             bool single_counter = mf_ultralight_support_feature( |             bool single_counter = mf_ultralight_support_feature( | ||||||
|                 instance->feature_set, MfUltralightFeatureSupportSingleCounter); |                 instance->feature_set, MfUltralightFeatureSupportSingleCounter); | ||||||
| @ -391,6 +394,7 @@ static NfcCommand mf_ultralight_poller_handler_read_tearing_flags(MfUltralightPo | |||||||
|             } else if(instance->error != MfUltralightErrorNone) { |             } else if(instance->error != MfUltralightErrorNone) { | ||||||
|                 FURI_LOG_D(TAG, "Reading tearing flag %d failed", instance->tearing_flag_read); |                 FURI_LOG_D(TAG, "Reading tearing flag %d failed", instance->tearing_flag_read); | ||||||
|                 instance->state = MfUltralightPollerStateTryDefaultPass; |                 instance->state = MfUltralightPollerStateTryDefaultPass; | ||||||
|  |                 command = NfcCommandReset; | ||||||
|             } else { |             } else { | ||||||
|                 instance->tearing_flag_read++; |                 instance->tearing_flag_read++; | ||||||
|             } |             } | ||||||
| @ -398,9 +402,10 @@ static NfcCommand mf_ultralight_poller_handler_read_tearing_flags(MfUltralightPo | |||||||
|     } else { |     } else { | ||||||
|         FURI_LOG_D(TAG, "Skip reading tearing flags"); |         FURI_LOG_D(TAG, "Skip reading tearing flags"); | ||||||
|         instance->state = MfUltralightPollerStateTryDefaultPass; |         instance->state = MfUltralightPollerStateTryDefaultPass; | ||||||
|  |         command = NfcCommandReset; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return NfcCommandContinue; |     return command; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static NfcCommand mf_ultralight_poller_handler_auth(MfUltralightPoller* instance) { | static NfcCommand mf_ultralight_poller_handler_auth(MfUltralightPoller* instance) { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 gornekich
						gornekich