Uniformly use crypto1_ prefix for symbols in Crypto1 API

This commit is contained in:
noproto 2024-09-23 19:44:08 -04:00
parent cd76926c74
commit 0ba8ac4ed0
5 changed files with 36 additions and 31 deletions

View file

@ -82,7 +82,7 @@ uint32_t crypto1_word(Crypto1* crypto1, uint32_t in, int is_encrypted) {
return out;
}
uint32_t prng_successor(uint32_t x, uint32_t n) {
uint32_t crypto1_prng_successor(uint32_t x, uint32_t n) {
SWAPENDIAN(x);
while(n--)
x = x >> 1 | (x >> 16 ^ x >> 18 ^ x >> 19 ^ x >> 21) << 31;
@ -169,9 +169,9 @@ void crypto1_encrypt_reader_nonce(
nr[i] = byte;
}
nt_num = prng_successor(nt_num, 32);
nt_num = crypto1_prng_successor(nt_num, 32);
for(size_t i = 4; i < 8; i++) {
nt_num = prng_successor(nt_num, 8);
nt_num = crypto1_prng_successor(nt_num, 8);
uint8_t byte = crypto1_byte(crypto, 0, 0) ^ (uint8_t)(nt_num);
bool parity_bit = ((crypto1_filter(crypto->odd) ^ nfc_util_odd_parity8(nt_num)) & 0x01);
bit_buffer_set_byte_with_parity(out, i, byte, parity_bit);
@ -198,7 +198,7 @@ static uint8_t lfsr_rollback_bit(Crypto1* crypto1, uint32_t in, int fb) {
return ret;
}
uint32_t lfsr_rollback_word(Crypto1* crypto1, uint32_t in, int fb) {
uint32_t crypto1_lfsr_rollback_word(Crypto1* crypto1, uint32_t in, int fb) {
uint32_t ret = 0;
for(int i = 31; i >= 0; i--) {
ret |= lfsr_rollback_bit(crypto1, BEBIT(in, i), fb) << (24 ^ i);
@ -206,7 +206,7 @@ uint32_t lfsr_rollback_word(Crypto1* crypto1, uint32_t in, int fb) {
return ret;
}
bool nonce_matches_encrypted_parity_bits(uint32_t nt, uint32_t ks, uint8_t nt_par_enc) {
bool crypto1_nonce_matches_encrypted_parity_bits(uint32_t nt, uint32_t ks, uint8_t nt_par_enc) {
return (nfc_util_even_parity8((nt >> 24) & 0xFF) ==
(((nt_par_enc >> 3) & 1) ^ FURI_BIT(ks, 16))) &&
(nfc_util_even_parity8((nt >> 16) & 0xFF) ==
@ -215,7 +215,7 @@ bool nonce_matches_encrypted_parity_bits(uint32_t nt, uint32_t ks, uint8_t nt_pa
(((nt_par_enc >> 1) & 1) ^ FURI_BIT(ks, 0)));
}
bool is_weak_prng_nonce(uint32_t nonce) {
bool crypto1_is_weak_prng_nonce(uint32_t nonce) {
if(nonce == 0) return false;
uint16_t x = nonce >> 16;
x = (x & 0xff) << 8 | x >> 8;
@ -226,11 +226,12 @@ bool is_weak_prng_nonce(uint32_t nonce) {
return x == (nonce & 0xFFFF);
}
uint32_t decrypt_nt_enc(uint32_t cuid, uint32_t nt_enc, MfClassicKey known_key) {
uint32_t crypto1_decrypt_nt_enc(uint32_t cuid, uint32_t nt_enc, MfClassicKey known_key) {
uint64_t known_key_int = bit_lib_bytes_to_num_be(known_key.data, 6);
Crypto1 crypto_temp;
crypto1_init(&crypto_temp, known_key_int);
crypto1_word(&crypto_temp, nt_enc ^ cuid, 1);
uint32_t decrypted_nt_enc = (nt_enc ^ lfsr_rollback_word(&crypto_temp, nt_enc ^ cuid, 1));
uint32_t decrypted_nt_enc =
(nt_enc ^ crypto1_lfsr_rollback_word(&crypto_temp, nt_enc ^ cuid, 1));
return decrypted_nt_enc;
}

View file

@ -39,15 +39,15 @@ void crypto1_encrypt_reader_nonce(
BitBuffer* out,
bool is_nested);
uint32_t lfsr_rollback_word(Crypto1* crypto1, uint32_t in, int fb);
uint32_t crypto1_lfsr_rollback_word(Crypto1* crypto1, uint32_t in, int fb);
bool nonce_matches_encrypted_parity_bits(uint32_t nt, uint32_t ks, uint8_t nt_par_enc);
bool crypto1_nonce_matches_encrypted_parity_bits(uint32_t nt, uint32_t ks, uint8_t nt_par_enc);
bool is_weak_prng_nonce(uint32_t nonce);
bool crypto1_is_weak_prng_nonce(uint32_t nonce);
uint32_t decrypt_nt_enc(uint32_t cuid, uint32_t nt_enc, MfClassicKey known_key);
uint32_t crypto1_decrypt_nt_enc(uint32_t cuid, uint32_t nt_enc, MfClassicKey known_key);
uint32_t prng_successor(uint32_t x, uint32_t n);
uint32_t crypto1_prng_successor(uint32_t x, uint32_t n);
#ifdef __cplusplus
}

View file

@ -157,14 +157,17 @@ static MfClassicListenerCommand
uint32_t nt_num =
bit_lib_bytes_to_num_be(instance->auth_context.nt.data, sizeof(MfClassicNt));
uint32_t secret_poller = ar_num ^ crypto1_word(instance->crypto, 0, 0);
if(secret_poller != prng_successor(nt_num, 64)) {
if(secret_poller != crypto1_prng_successor(nt_num, 64)) {
FURI_LOG_T(
TAG, "Wrong reader key: %08lX != %08lX", secret_poller, prng_successor(nt_num, 64));
TAG,
"Wrong reader key: %08lX != %08lX",
secret_poller,
crypto1_prng_successor(nt_num, 64));
command = MfClassicListenerCommandSleep;
break;
}
uint32_t at_num = prng_successor(nt_num, 96);
uint32_t at_num = crypto1_prng_successor(nt_num, 96);
bit_lib_num_to_bytes_be(at_num, sizeof(uint32_t), instance->auth_context.at.data);
bit_buffer_copy_bytes(
instance->tx_plain_buffer, instance->auth_context.at.data, sizeof(MfClassicAr));

View file

@ -1061,7 +1061,7 @@ NfcCommand mf_classic_poller_handler_nested_analyze_prng(MfClassicPoller* instan
for(uint8_t i = 0; i < dict_attack_ctx->nested_nonce.count; i++) {
MfClassicNestedNonce* nonce = &dict_attack_ctx->nested_nonce.nonces[i];
if(!is_weak_prng_nonce(nonce->nt)) hard_nt_count++;
if(!crypto1_is_weak_prng_nonce(nonce->nt)) hard_nt_count++;
}
if(hard_nt_count >= MF_CLASSIC_NESTED_NT_HARD_MINIMUM) {
@ -1174,7 +1174,7 @@ NfcCommand mf_classic_poller_handler_nested_calibrate(MfClassicPoller* instance)
uint32_t nt_enc = bit_lib_bytes_to_num_be(auth_ctx.nt.data, sizeof(MfClassicNt));
// Store the decrypted static encrypted nonce
dict_attack_ctx->static_encrypted_nonce =
decrypt_nt_enc(cuid, nt_enc, dict_attack_ctx->nested_known_key);
crypto1_decrypt_nt_enc(cuid, nt_enc, dict_attack_ctx->nested_known_key);
dict_attack_ctx->calibrated = true;
@ -1234,10 +1234,10 @@ NfcCommand mf_classic_poller_handler_nested_calibrate(MfClassicPoller* instance)
for(uint32_t collection_cycle = 1; collection_cycle < MF_CLASSIC_NESTED_CALIBRATION_COUNT;
collection_cycle++) {
bool found = false;
uint32_t decrypted_nt_enc = decrypt_nt_enc(
uint32_t decrypted_nt_enc = crypto1_decrypt_nt_enc(
cuid, nt_enc_temp_arr[collection_cycle], dict_attack_ctx->nested_known_key);
for(int i = 0; i < 65535; i++) {
uint32_t nth_successor = prng_successor(nt_prev, i);
uint32_t nth_successor = crypto1_prng_successor(nt_prev, i);
if(nth_successor == decrypted_nt_enc) {
FURI_LOG_E(TAG, "nt_enc (plain) %08lx", nth_successor);
FURI_LOG_E(TAG, "dist from nt prev: %i", i);
@ -1430,15 +1430,16 @@ NfcCommand mf_classic_poller_handler_nested_collect_nt_enc(MfClassicPoller* inst
// Decrypt the previous nonce
nt_prev = nt_enc_temp_arr[nt_enc_collected - 1];
decrypted_nt_prev = decrypt_nt_enc(cuid, nt_prev, dict_attack_ctx->nested_known_key);
decrypted_nt_prev =
crypto1_decrypt_nt_enc(cuid, nt_prev, dict_attack_ctx->nested_known_key);
// Find matching nt_enc plain at expected distance
found_nt = 0;
uint8_t found_nt_cnt = 0;
uint16_t current_dist = dict_attack_ctx->d_min;
while(current_dist <= dict_attack_ctx->d_max) {
uint32_t nth_successor = prng_successor(decrypted_nt_prev, current_dist);
if(nonce_matches_encrypted_parity_bits(
uint32_t nth_successor = crypto1_prng_successor(decrypted_nt_prev, current_dist);
if(crypto1_nonce_matches_encrypted_parity_bits(
nth_successor, nth_successor ^ nt_enc, parity)) {
found_nt_cnt++;
if(found_nt_cnt > 1) {
@ -1535,13 +1536,13 @@ static MfClassicKey* search_dicts_for_nonce_key(
bool full_match = true;
for(uint8_t j = 0; j < nonce_array->count; j++) {
// Verify nonce matches encrypted parity bits for all nonces
uint32_t nt_enc_plain = decrypt_nt_enc(
uint32_t nt_enc_plain = crypto1_decrypt_nt_enc(
nonce_array->nonces[j].cuid, nonce_array->nonces[j].nt_enc, stack_key);
if(is_weak) {
full_match &= is_weak_prng_nonce(nt_enc_plain);
full_match &= crypto1_is_weak_prng_nonce(nt_enc_plain);
if(!full_match) break;
}
full_match &= nonce_matches_encrypted_parity_bits(
full_match &= crypto1_nonce_matches_encrypted_parity_bits(
nt_enc_plain,
nt_enc_plain ^ nonce_array->nonces[j].nt_enc,
nonce_array->nonces[j].par);

View file

@ -889,10 +889,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*
@ -903,7 +908,6 @@ Function,+,datetime_get_days_per_year,uint16_t,uint16_t
Function,+,datetime_is_leap_year,_Bool,uint16_t
Function,+,datetime_timestamp_to_datetime,void,"uint32_t, DateTime*"
Function,+,datetime_validate_datetime,_Bool,DateTime*
Function,+,decrypt_nt_enc,uint32_t,"uint32_t, uint32_t, MfClassicKey"
Function,+,dialog_ex_alloc,DialogEx*,
Function,+,dialog_ex_disable_extended_events,void,DialogEx*
Function,+,dialog_ex_enable_extended_events,void,DialogEx*
@ -2041,7 +2045,6 @@ Function,-,initstate,char*,"unsigned, char*, size_t"
Function,+,input_get_key_name,const char*,InputKey
Function,+,input_get_type_name,const char*,InputType
Function,-,iprintf,int,"const char*, ..."
Function,+,is_weak_prng_nonce,_Bool,uint32_t
Function,-,isalnum,int,int
Function,-,isalnum_l,int,"int, locale_t"
Function,-,isalpha,int,int
@ -2225,7 +2228,6 @@ Function,+,lfrfid_worker_start_thread,void,LFRFIDWorker*
Function,+,lfrfid_worker_stop,void,LFRFIDWorker*
Function,+,lfrfid_worker_stop_thread,void,LFRFIDWorker*
Function,+,lfrfid_worker_write_start,void,"LFRFIDWorker*, LFRFIDProtocol, LFRFIDWorkerWriteCallback, void*"
Function,+,lfsr_rollback_word,uint32_t,"Crypto1*, uint32_t, int"
Function,-,lgamma,double,double
Function,-,lgamma_r,double,"double, int*"
Function,-,lgammaf,float,float
@ -2822,7 +2824,6 @@ 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,+,nonce_matches_encrypted_parity_bits,_Bool,"uint32_t, uint32_t, uint8_t"
Function,+,notification_internal_message,void,"NotificationApp*, const NotificationSequence*"
Function,+,notification_internal_message_block,void,"NotificationApp*, const NotificationSequence*"
Function,+,notification_message,void,"NotificationApp*, const NotificationSequence*"
@ -2935,7 +2936,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
889 Function + crypto1_bit uint8_t Crypto1*, uint8_t, int
890 Function + crypto1_byte uint8_t Crypto1*, uint8_t, int
891 Function + crypto1_decrypt void Crypto1*, const BitBuffer*, BitBuffer*
892 Function + crypto1_decrypt_nt_enc uint32_t uint32_t, uint32_t, MfClassicKey
893 Function + crypto1_encrypt void Crypto1*, uint8_t*, const BitBuffer*, BitBuffer*
894 Function + crypto1_encrypt_reader_nonce void Crypto1*, uint64_t, uint32_t, uint8_t*, uint8_t*, BitBuffer*, _Bool
895 Function + crypto1_free void Crypto1*
896 Function + crypto1_init void Crypto1*, uint64_t
897 Function + crypto1_is_weak_prng_nonce _Bool uint32_t
898 Function + crypto1_lfsr_rollback_word uint32_t Crypto1*, uint32_t, int
899 Function + crypto1_nonce_matches_encrypted_parity_bits _Bool uint32_t, uint32_t, uint8_t
900 Function + crypto1_prng_successor uint32_t uint32_t, uint32_t
901 Function + crypto1_reset void Crypto1*
902 Function + crypto1_word uint32_t Crypto1*, uint32_t, int
903 Function - ctermid char* char*
908 Function + datetime_is_leap_year _Bool uint16_t
909 Function + datetime_timestamp_to_datetime void uint32_t, DateTime*
910 Function + datetime_validate_datetime _Bool DateTime*
Function + decrypt_nt_enc uint32_t uint32_t, uint32_t, MfClassicKey
911 Function + dialog_ex_alloc DialogEx*
912 Function + dialog_ex_disable_extended_events void DialogEx*
913 Function + dialog_ex_enable_extended_events void DialogEx*
2045 Function + input_get_key_name const char* InputKey
2046 Function + input_get_type_name const char* InputType
2047 Function - iprintf int const char*, ...
Function + is_weak_prng_nonce _Bool uint32_t
2048 Function - isalnum int int
2049 Function - isalnum_l int int, locale_t
2050 Function - isalpha int int
2228 Function + lfrfid_worker_stop void LFRFIDWorker*
2229 Function + lfrfid_worker_stop_thread void LFRFIDWorker*
2230 Function + lfrfid_worker_write_start void LFRFIDWorker*, LFRFIDProtocol, LFRFIDWorkerWriteCallback, void*
Function + lfsr_rollback_word uint32_t Crypto1*, uint32_t, int
2231 Function - lgamma double double
2232 Function - lgamma_r double double, int*
2233 Function - lgammaf float float
2824 Function + nfc_util_even_parity8 uint8_t uint8_t
2825 Function + nfc_util_odd_parity void const uint8_t*, uint8_t*, uint8_t
2826 Function + nfc_util_odd_parity8 uint8_t uint8_t
Function + nonce_matches_encrypted_parity_bits _Bool uint32_t, uint32_t, uint8_t
2827 Function + notification_internal_message void NotificationApp*, const NotificationSequence*
2828 Function + notification_internal_message_block void NotificationApp*, const NotificationSequence*
2829 Function + notification_message void NotificationApp*, const NotificationSequence*
2936 Function - powl long double long double, long double
2937 Function + pretty_format_bytes_hex_canonical void FuriString*, size_t, const char*, const uint8_t*, size_t
2938 Function - printf int const char*, ...
Function + prng_successor uint32_t uint32_t, uint32_t
2939 Function + property_value_out void PropertyValueContext*, const char*, unsigned int, ...
2940 Function + protocol_dict_alloc ProtocolDict* const ProtocolBase**, size_t
2941 Function + protocol_dict_decoders_feed ProtocolId ProtocolDict*, _Bool, uint32_t