MFC emulation fixes (#3324)
* mf classic listener: fix write block * nfc: go to idle state instead of sleep * lib nfc: fix documentation
This commit is contained in:
		
							parent
							
								
									895694c624
								
							
						
					
					
						commit
						a7b60bf2a6
					
				| @ -150,7 +150,7 @@ static int32_t nfc_worker_listener(void* context) { | |||||||
|             } else if(command == NfcCommandReset) { |             } else if(command == NfcCommandReset) { | ||||||
|                 furi_hal_nfc_listener_enable_rx(); |                 furi_hal_nfc_listener_enable_rx(); | ||||||
|             } else if(command == NfcCommandSleep) { |             } else if(command == NfcCommandSleep) { | ||||||
|                 furi_hal_nfc_listener_sleep(); |                 furi_hal_nfc_listener_idle(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -18,8 +18,8 @@ typedef struct FelicaPoller FelicaPoller; | |||||||
|  * @brief Enumeration of possible Felica poller event types. |  * @brief Enumeration of possible Felica poller event types. | ||||||
|  */ |  */ | ||||||
| typedef enum { | typedef enum { | ||||||
|     FelicaPollerEventTypeError, /**< The card was activated by the poller. */ |     FelicaPollerEventTypeError, /**< An error occured during activation procedure. */ | ||||||
|     FelicaPollerEventTypeReady, /**< An error occured during activation procedure. */ |     FelicaPollerEventTypeReady, /**< The card was activated by the poller. */ | ||||||
| } FelicaPollerEventType; | } FelicaPollerEventType; | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | |||||||
| @ -18,8 +18,8 @@ typedef struct Iso14443_3aPoller Iso14443_3aPoller; | |||||||
|  * @brief Enumeration of possible Iso14443_3a poller event types. |  * @brief Enumeration of possible Iso14443_3a poller event types. | ||||||
|  */ |  */ | ||||||
| typedef enum { | typedef enum { | ||||||
|     Iso14443_3aPollerEventTypeError, /**< The card was activated by the poller. */ |     Iso14443_3aPollerEventTypeError, /**< An error occured during activation procedure. */ | ||||||
|     Iso14443_3aPollerEventTypeReady, /**< An error occured during activation procedure. */ |     Iso14443_3aPollerEventTypeReady, /**< The card was activated by the poller. */ | ||||||
| } Iso14443_3aPollerEventType; | } Iso14443_3aPollerEventType; | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | |||||||
| @ -18,8 +18,8 @@ typedef struct Iso14443_3bPoller Iso14443_3bPoller; | |||||||
|  * @brief Enumeration of possible Iso14443_3b poller event types. |  * @brief Enumeration of possible Iso14443_3b poller event types. | ||||||
|  */ |  */ | ||||||
| typedef enum { | typedef enum { | ||||||
|     Iso14443_3bPollerEventTypeError, /**< The card was activated by the poller. */ |     Iso14443_3bPollerEventTypeError, /**< An error occured during activation procedure. */ | ||||||
|     Iso14443_3bPollerEventTypeReady, /**< An error occured during activation procedure. */ |     Iso14443_3bPollerEventTypeReady, /**< The card was activated by the poller. */ | ||||||
| } Iso14443_3bPollerEventType; | } Iso14443_3bPollerEventType; | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | |||||||
| @ -17,8 +17,8 @@ typedef struct Iso14443_4aPoller Iso14443_4aPoller; | |||||||
|  * @brief Enumeration of possible Iso14443_4a poller event types. |  * @brief Enumeration of possible Iso14443_4a poller event types. | ||||||
|  */ |  */ | ||||||
| typedef enum { | typedef enum { | ||||||
|     Iso14443_4aPollerEventTypeError, /**< The card was activated by the poller. */ |     Iso14443_4aPollerEventTypeError, /**< An error occured during activation procedure. */ | ||||||
|     Iso14443_4aPollerEventTypeReady, /**< An error occured during activation procedure. */ |     Iso14443_4aPollerEventTypeReady, /**< The card was activated by the poller. */ | ||||||
| } Iso14443_4aPollerEventType; | } Iso14443_4aPollerEventType; | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | |||||||
| @ -17,8 +17,8 @@ typedef struct Iso14443_4bPoller Iso14443_4bPoller; | |||||||
|  * @brief Enumeration of possible Iso14443_4b poller event types. |  * @brief Enumeration of possible Iso14443_4b poller event types. | ||||||
|  */ |  */ | ||||||
| typedef enum { | typedef enum { | ||||||
|     Iso14443_4bPollerEventTypeError, /**< The card was activated by the poller. */ |     Iso14443_4bPollerEventTypeError, /**< An error occured during activation procedure. */ | ||||||
|     Iso14443_4bPollerEventTypeReady, /**< An error occured during activation procedure. */ |     Iso14443_4bPollerEventTypeReady, /**< The card was activated by the poller. */ | ||||||
| } Iso14443_4bPollerEventType; | } Iso14443_4bPollerEventType; | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | |||||||
| @ -17,8 +17,8 @@ typedef struct Iso15693_3Poller Iso15693_3Poller; | |||||||
|  * @brief Enumeration of possible Iso15693_3 poller event types. |  * @brief Enumeration of possible Iso15693_3 poller event types. | ||||||
|  */ |  */ | ||||||
| typedef enum { | typedef enum { | ||||||
|     Iso15693_3PollerEventTypeError, /**< The card was activated by the poller. */ |     Iso15693_3PollerEventTypeError, /**< An error occured during activation procedure. */ | ||||||
|     Iso15693_3PollerEventTypeReady, /**< An error occured during activation procedure. */ |     Iso15693_3PollerEventTypeReady, /**< The card was activated by the poller. */ | ||||||
| } Iso15693_3PollerEventType; | } Iso15693_3PollerEventType; | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | |||||||
| @ -33,6 +33,7 @@ static void mf_classic_listener_reset_state(MfClassicListener* instance) { | |||||||
|     instance->state = MfClassicListenerStateIdle; |     instance->state = MfClassicListenerStateIdle; | ||||||
|     instance->cmd_in_progress = false; |     instance->cmd_in_progress = false; | ||||||
|     instance->current_cmd_handler_idx = 0; |     instance->current_cmd_handler_idx = 0; | ||||||
|  |     instance->write_block = 0; | ||||||
|     instance->transfer_value = 0; |     instance->transfer_value = 0; | ||||||
|     instance->transfer_valid = false; |     instance->transfer_valid = false; | ||||||
|     instance->value_cmd = MfClassicValueCommandInvalid; |     instance->value_cmd = MfClassicValueCommandInvalid; | ||||||
| @ -240,11 +241,13 @@ static MfClassicListenerCommand mf_classic_listener_write_block_first_part_handl | |||||||
| 
 | 
 | ||||||
|         uint8_t block_num = bit_buffer_get_byte(buff, 1); |         uint8_t block_num = bit_buffer_get_byte(buff, 1); | ||||||
|         if(block_num >= instance->total_block_num) break; |         if(block_num >= instance->total_block_num) break; | ||||||
|  |         if(block_num == 0) break; | ||||||
| 
 | 
 | ||||||
|         uint8_t sector_num = mf_classic_get_sector_by_block(block_num); |         uint8_t sector_num = mf_classic_get_sector_by_block(block_num); | ||||||
|         uint8_t auth_sector_num = mf_classic_get_sector_by_block(auth_ctx->block_num); |         uint8_t auth_sector_num = mf_classic_get_sector_by_block(auth_ctx->block_num); | ||||||
|         if(sector_num != auth_sector_num) break; |         if(sector_num != auth_sector_num) break; | ||||||
| 
 | 
 | ||||||
|  |         instance->write_block = block_num; | ||||||
|         instance->cmd_in_progress = true; |         instance->cmd_in_progress = true; | ||||||
|         instance->current_cmd_handler_idx++; |         instance->current_cmd_handler_idx++; | ||||||
|         command = MfClassicListenerCommandAck; |         command = MfClassicListenerCommandAck; | ||||||
| @ -265,7 +268,7 @@ static MfClassicListenerCommand mf_classic_listener_write_block_second_part_hand | |||||||
|         size_t buff_size = bit_buffer_get_size_bytes(buff); |         size_t buff_size = bit_buffer_get_size_bytes(buff); | ||||||
|         if(buff_size != sizeof(MfClassicBlock)) break; |         if(buff_size != sizeof(MfClassicBlock)) break; | ||||||
| 
 | 
 | ||||||
|         uint8_t block_num = auth_ctx->block_num; |         uint8_t block_num = instance->write_block; | ||||||
|         MfClassicKeyType key_type = auth_ctx->key_type; |         MfClassicKeyType key_type = auth_ctx->key_type; | ||||||
|         MfClassicBlock block = instance->data->block[block_num]; |         MfClassicBlock block = instance->data->block[block_num]; | ||||||
| 
 | 
 | ||||||
| @ -609,6 +612,7 @@ NfcCommand mf_classic_listener_run(NfcGenericEvent event, void* context) { | |||||||
| 
 | 
 | ||||||
|             mf_classic_listener_send_short_frame(instance, nack); |             mf_classic_listener_send_short_frame(instance, nack); | ||||||
|             mf_classic_listener_reset_state(instance); |             mf_classic_listener_reset_state(instance); | ||||||
|  |             command = NfcCommandSleep; | ||||||
|         } else if(mfc_command == MfClassicListenerCommandSilent) { |         } else if(mfc_command == MfClassicListenerCommandSilent) { | ||||||
|             command = NfcCommandReset; |             command = NfcCommandReset; | ||||||
|         } else if(mfc_command == MfClassicListenerCommandSleep) { |         } else if(mfc_command == MfClassicListenerCommandSleep) { | ||||||
|  | |||||||
| @ -40,6 +40,9 @@ struct MfClassicListener { | |||||||
|     Crypto1* crypto; |     Crypto1* crypto; | ||||||
|     MfClassicAuthContext auth_context; |     MfClassicAuthContext auth_context; | ||||||
| 
 | 
 | ||||||
|  |     // Write block context
 | ||||||
|  |     uint8_t write_block; | ||||||
|  | 
 | ||||||
|     // Value operation data
 |     // Value operation data
 | ||||||
|     int32_t transfer_value; |     int32_t transfer_value; | ||||||
|     bool transfer_valid; |     bool transfer_valid; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 gornekich
						gornekich