MIFARE Classic Key Recovery Improvements (#3822)

* Initial structure for nonce collection
* Nonce logging
* Dictionary attack structure
* Fix compilation
* Identified method to reduce candidate states
* Use EXT_PATH instead of ANY_PATH
* Use median calibrated distance, collect parity bits
* Modify parity collection
* Fixed parity bit collection
* Add note to fix nonce logging
* Fix nonce logging
* Clean redundant code
* Fix valid_nonce
* First attempt disambiguous nonce implementation
* FM11RF08S backdoor detection
* Initial accelerated dictionary attack for weak PRNGs
* Refactor to nested dictionary attack
* Renaming some variables
* Hard PRNG support for accelerated dictionary attack
* Update found keys, initial attempt
* Update found keys, second attempt
* Code cleanup
* Misc bugfixes
* Only use dicts in search_dicts_for_nonce_key if we have them
* Collect nonces again
* Should be detecting both backdoors now
* Relocate backdoor detection
* Hardnested support
* Fix regression for regular nested attack
* Backdoor read
* Backdoor working up to calibration
* Backdoor nested calibration
* Don't recalibrate hard PRNG tags
* Static encrypted nonce collection
* Update TODO
* NFC app UI updates, MVP
* Bump f18 API version (all functions are NFC related)
* Add new backdoor key, fix UI status update carrying over from previous read
* Clear TODO line
* Fix v1/v2 backdoor nonce collection
* Speed up backdoor detection, alert on new backdoor
* Add additional condition to backdoor check
* I'll try freeing memory, that's a good trick!
* Do not enter nested attack if card is already finished
* Do not reset the poller between collected nonces
* Clean up various issues
* Fix Hardnested sector/key type logging
* Add nested_target_key 64 to TODO
* Implement progress bar for upgraded attacks in NFC app
* Typo
* Zero nested_target_key and msb_count on exit
* Note TODO (malloc)
* Dismiss duplicate nonces
* Fix calibration (ensure values are within 3 standard deviations)
* Log static
* No nested dictionary attack re-entry
* Note minor inefficiency
* Uniformly use crypto1_ prefix for symbols in Crypto1 API
* Fix include paths
* Fix include paths cont
* Support CUID dictionary
* Fix log levels
* Avoid storage errors, clean up temporary files
* Handle invalid key candidates
* Fix memory leak in static encrypted attack
* Fix memory leak, use COUNT_OF macro
* Use single call to free FuriString
* Refactor enums to avoid redefinition
* Fix multiple crashes and state machine logic
* Fix inconsistent assignment of known key and known key type/sector
* Backdoor known key logic still needs the current key
* Larger data type for 4K support
* Fix typo
* Fix issue with resume logic
* Mark TODOs for next PR
* Remove redundant assignment
* Fix size_t format specifier
* Simplify auth_passed condition

Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
Co-authored-by: gornekich <n.gorbadey@gmail.com>
This commit is contained in:
Nathan N
2024-10-30 20:53:58 -04:00
committed by GitHub
parent f8fa71c575
commit 8427ec0098
20 changed files with 1929 additions and 106 deletions

View File

@@ -1,5 +1,5 @@
entry,status,name,type,params
Version,+,77.2,,
Version,+,77.3,,
Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,,
Header,+,applications/services/bt/bt_service/bt.h,,
Header,+,applications/services/bt/bt_service/bt_keys_storage.h,,
@@ -890,10 +890,15 @@ Function,+,crypto1_alloc,Crypto1*,
Function,+,crypto1_bit,uint8_t,"Crypto1*, uint8_t, int"
Function,+,crypto1_byte,uint8_t,"Crypto1*, uint8_t, int"
Function,+,crypto1_decrypt,void,"Crypto1*, const BitBuffer*, BitBuffer*"
Function,+,crypto1_decrypt_nt_enc,uint32_t,"uint32_t, uint32_t, MfClassicKey"
Function,+,crypto1_encrypt,void,"Crypto1*, uint8_t*, const BitBuffer*, BitBuffer*"
Function,+,crypto1_encrypt_reader_nonce,void,"Crypto1*, uint64_t, uint32_t, uint8_t*, uint8_t*, BitBuffer*, _Bool"
Function,+,crypto1_free,void,Crypto1*
Function,+,crypto1_init,void,"Crypto1*, uint64_t"
Function,+,crypto1_is_weak_prng_nonce,_Bool,uint32_t
Function,+,crypto1_lfsr_rollback_word,uint32_t,"Crypto1*, uint32_t, int"
Function,+,crypto1_nonce_matches_encrypted_parity_bits,_Bool,"uint32_t, uint32_t, uint8_t"
Function,+,crypto1_prng_successor,uint32_t,"uint32_t, uint32_t"
Function,+,crypto1_reset,void,Crypto1*
Function,+,crypto1_word,uint32_t,"Crypto1*, uint32_t, int"
Function,-,ctermid,char*,char*
@@ -2507,6 +2512,7 @@ Function,+,mf_classic_get_base_data,Iso14443_3aData*,const MfClassicData*
Function,+,mf_classic_get_blocks_num_in_sector,uint8_t,uint8_t
Function,+,mf_classic_get_device_name,const char*,"const MfClassicData*, NfcDeviceNameType"
Function,+,mf_classic_get_first_block_num_of_sector,uint8_t,uint8_t
Function,+,mf_classic_get_key,MfClassicKey,"const MfClassicData*, uint8_t, MfClassicKeyType"
Function,+,mf_classic_get_read_sectors_and_keys,void,"const MfClassicData*, uint8_t*, uint8_t*"
Function,+,mf_classic_get_sector_by_block,uint8_t,uint8_t
Function,+,mf_classic_get_sector_trailer_by_sector,MfClassicSectorTrailer*,"const MfClassicData*, uint8_t"
@@ -2525,10 +2531,10 @@ Function,+,mf_classic_is_sector_read,_Bool,"const MfClassicData*, uint8_t"
Function,+,mf_classic_is_sector_trailer,_Bool,uint8_t
Function,+,mf_classic_is_value_block,_Bool,"MfClassicSectorTrailer*, uint8_t"
Function,+,mf_classic_load,_Bool,"MfClassicData*, FlipperFormat*, uint32_t"
Function,+,mf_classic_poller_auth,MfClassicError,"MfClassicPoller*, uint8_t, MfClassicKey*, MfClassicKeyType, MfClassicAuthContext*"
Function,+,mf_classic_poller_auth_nested,MfClassicError,"MfClassicPoller*, uint8_t, MfClassicKey*, MfClassicKeyType, MfClassicAuthContext*"
Function,+,mf_classic_poller_get_nt,MfClassicError,"MfClassicPoller*, uint8_t, MfClassicKeyType, MfClassicNt*"
Function,+,mf_classic_poller_get_nt_nested,MfClassicError,"MfClassicPoller*, uint8_t, MfClassicKeyType, MfClassicNt*"
Function,+,mf_classic_poller_auth,MfClassicError,"MfClassicPoller*, uint8_t, MfClassicKey*, MfClassicKeyType, MfClassicAuthContext*, _Bool"
Function,+,mf_classic_poller_auth_nested,MfClassicError,"MfClassicPoller*, uint8_t, MfClassicKey*, MfClassicKeyType, MfClassicAuthContext*, _Bool, _Bool"
Function,+,mf_classic_poller_get_nt,MfClassicError,"MfClassicPoller*, uint8_t, MfClassicKeyType, MfClassicNt*, _Bool"
Function,+,mf_classic_poller_get_nt_nested,MfClassicError,"MfClassicPoller*, uint8_t, MfClassicKeyType, MfClassicNt*, _Bool"
Function,+,mf_classic_poller_halt,MfClassicError,MfClassicPoller*
Function,+,mf_classic_poller_read_block,MfClassicError,"MfClassicPoller*, uint8_t, MfClassicBlock*"
Function,+,mf_classic_poller_send_custom_parity_frame,MfClassicError,"MfClassicPoller*, const BitBuffer*, BitBuffer*, uint32_t"
@@ -2824,6 +2830,7 @@ Function,+,nfc_set_mask_receive_time_fc,void,"Nfc*, uint32_t"
Function,+,nfc_start,void,"Nfc*, NfcEventCallback, void*"
Function,+,nfc_stop,void,Nfc*
Function,+,nfc_util_even_parity32,uint8_t,uint32_t
Function,+,nfc_util_even_parity8,uint8_t,uint8_t
Function,+,nfc_util_odd_parity,void,"const uint8_t*, uint8_t*, uint8_t"
Function,+,nfc_util_odd_parity8,uint8_t,uint8_t
Function,+,notification_internal_message,void,"NotificationApp*, const NotificationSequence*"
@@ -2938,7 +2945,6 @@ Function,+,powf,float,"float, float"
Function,-,powl,long double,"long double, long double"
Function,+,pretty_format_bytes_hex_canonical,void,"FuriString*, size_t, const char*, const uint8_t*, size_t"
Function,-,printf,int,"const char*, ..."
Function,+,prng_successor,uint32_t,"uint32_t, uint32_t"
Function,+,property_value_out,void,"PropertyValueContext*, const char*, unsigned int, ..."
Function,+,protocol_dict_alloc,ProtocolDict*,"const ProtocolBase**, size_t"
Function,+,protocol_dict_decoders_feed,ProtocolId,"ProtocolDict*, _Bool, uint32_t"
1 entry status name type params
2 Version + 77.2 77.3
3 Header + applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h
4 Header + applications/services/bt/bt_service/bt.h
5 Header + applications/services/bt/bt_service/bt_keys_storage.h
890 Function + crypto1_bit uint8_t Crypto1*, uint8_t, int
891 Function + crypto1_byte uint8_t Crypto1*, uint8_t, int
892 Function + crypto1_decrypt void Crypto1*, const BitBuffer*, BitBuffer*
893 Function + crypto1_decrypt_nt_enc uint32_t uint32_t, uint32_t, MfClassicKey
894 Function + crypto1_encrypt void Crypto1*, uint8_t*, const BitBuffer*, BitBuffer*
895 Function + crypto1_encrypt_reader_nonce void Crypto1*, uint64_t, uint32_t, uint8_t*, uint8_t*, BitBuffer*, _Bool
896 Function + crypto1_free void Crypto1*
897 Function + crypto1_init void Crypto1*, uint64_t
898 Function + crypto1_is_weak_prng_nonce _Bool uint32_t
899 Function + crypto1_lfsr_rollback_word uint32_t Crypto1*, uint32_t, int
900 Function + crypto1_nonce_matches_encrypted_parity_bits _Bool uint32_t, uint32_t, uint8_t
901 Function + crypto1_prng_successor uint32_t uint32_t, uint32_t
902 Function + crypto1_reset void Crypto1*
903 Function + crypto1_word uint32_t Crypto1*, uint32_t, int
904 Function - ctermid char* char*
2512 Function + mf_classic_get_blocks_num_in_sector uint8_t uint8_t
2513 Function + mf_classic_get_device_name const char* const MfClassicData*, NfcDeviceNameType
2514 Function + mf_classic_get_first_block_num_of_sector uint8_t uint8_t
2515 Function + mf_classic_get_key MfClassicKey const MfClassicData*, uint8_t, MfClassicKeyType
2516 Function + mf_classic_get_read_sectors_and_keys void const MfClassicData*, uint8_t*, uint8_t*
2517 Function + mf_classic_get_sector_by_block uint8_t uint8_t
2518 Function + mf_classic_get_sector_trailer_by_sector MfClassicSectorTrailer* const MfClassicData*, uint8_t
2531 Function + mf_classic_is_sector_trailer _Bool uint8_t
2532 Function + mf_classic_is_value_block _Bool MfClassicSectorTrailer*, uint8_t
2533 Function + mf_classic_load _Bool MfClassicData*, FlipperFormat*, uint32_t
2534 Function + mf_classic_poller_auth MfClassicError MfClassicPoller*, uint8_t, MfClassicKey*, MfClassicKeyType, MfClassicAuthContext* MfClassicPoller*, uint8_t, MfClassicKey*, MfClassicKeyType, MfClassicAuthContext*, _Bool
2535 Function + mf_classic_poller_auth_nested MfClassicError MfClassicPoller*, uint8_t, MfClassicKey*, MfClassicKeyType, MfClassicAuthContext* MfClassicPoller*, uint8_t, MfClassicKey*, MfClassicKeyType, MfClassicAuthContext*, _Bool, _Bool
2536 Function + mf_classic_poller_get_nt MfClassicError MfClassicPoller*, uint8_t, MfClassicKeyType, MfClassicNt* MfClassicPoller*, uint8_t, MfClassicKeyType, MfClassicNt*, _Bool
2537 Function + mf_classic_poller_get_nt_nested MfClassicError MfClassicPoller*, uint8_t, MfClassicKeyType, MfClassicNt* MfClassicPoller*, uint8_t, MfClassicKeyType, MfClassicNt*, _Bool
2538 Function + mf_classic_poller_halt MfClassicError MfClassicPoller*
2539 Function + mf_classic_poller_read_block MfClassicError MfClassicPoller*, uint8_t, MfClassicBlock*
2540 Function + mf_classic_poller_send_custom_parity_frame MfClassicError MfClassicPoller*, const BitBuffer*, BitBuffer*, uint32_t
2830 Function + nfc_start void Nfc*, NfcEventCallback, void*
2831 Function + nfc_stop void Nfc*
2832 Function + nfc_util_even_parity32 uint8_t uint32_t
2833 Function + nfc_util_even_parity8 uint8_t uint8_t
2834 Function + nfc_util_odd_parity void const uint8_t*, uint8_t*, uint8_t
2835 Function + nfc_util_odd_parity8 uint8_t uint8_t
2836 Function + notification_internal_message void NotificationApp*, const NotificationSequence*
2945 Function - powl long double long double, long double
2946 Function + pretty_format_bytes_hex_canonical void FuriString*, size_t, const char*, const uint8_t*, size_t
2947 Function - printf int const char*, ...
Function + prng_successor uint32_t uint32_t, uint32_t
2948 Function + property_value_out void PropertyValueContext*, const char*, unsigned int, ...
2949 Function + protocol_dict_alloc ProtocolDict* const ProtocolBase**, size_t
2950 Function + protocol_dict_decoders_feed ProtocolId ProtocolDict*, _Bool, uint32_t