Skip to content

Commit 9a26cf8

Browse files
authored
Picopass: rename AA1 to card_data (#119)
1 parent e55f891 commit 9a26cf8

12 files changed

+130
-130
lines changed

picopass_device.c

+28-28
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ static bool picopass_device_save_file_seader(
4141
FuriString* file_path) {
4242
furi_assert(dev);
4343
PicopassPacs* pacs = &dev->dev_data.pacs;
44-
PicopassBlock* AA1 = dev->dev_data.AA1;
44+
PicopassBlock* card_data = dev->dev_data.card_data;
4545
bool result = false;
4646

4747
const char* seader_file_header = "Flipper Seader Credential";
@@ -67,17 +67,17 @@ static bool picopass_device_save_file_seader(
6767
// TODO: save SR vs SE more properly
6868
if(pacs->sio) { // SR
6969
for(uint8_t i = 0; i < 8; i++) {
70-
memcpy(sio + (i * 8), AA1[10 + i].data, PICOPASS_BLOCK_LEN);
70+
memcpy(sio + (i * 8), card_data[10 + i].data, PICOPASS_BLOCK_LEN);
7171
}
7272
if(!flipper_format_write_hex(file, "SIO", sio, sizeof(sio))) break;
7373
} else if(pacs->se_enabled) { //SE
7474
for(uint8_t i = 0; i < 8; i++) {
75-
memcpy(sio + (i * 8), AA1[6 + i].data, PICOPASS_BLOCK_LEN);
75+
memcpy(sio + (i * 8), card_data[6 + i].data, PICOPASS_BLOCK_LEN);
7676
}
7777
if(!flipper_format_write_hex(file, "SIO", sio, sizeof(sio))) break;
7878
}
7979
if(!flipper_format_write_hex(
80-
file, "Diversifier", AA1[PICOPASS_CSN_BLOCK_INDEX].data, PICOPASS_BLOCK_LEN))
80+
file, "Diversifier", card_data[PICOPASS_CSN_BLOCK_INDEX].data, PICOPASS_BLOCK_LEN))
8181
break;
8282

8383
result = true;
@@ -162,13 +162,13 @@ static bool picopass_device_save_file(
162162
bool saved = false;
163163
FlipperFormat* file = flipper_format_file_alloc(dev->storage);
164164
PicopassPacs* pacs = &dev->dev_data.pacs;
165-
PicopassBlock* AA1 = dev->dev_data.AA1;
165+
PicopassBlock* card_data = dev->dev_data.card_data;
166166
FuriString* temp_str;
167167
temp_str = furi_string_alloc();
168168

169169
if(dev->format == PicopassDeviceSaveFormatPartial) {
170170
// Clear key that may have been set when doing key tests for legacy
171-
memset(AA1[PICOPASS_SECURE_KD_BLOCK_INDEX].data, 0, PICOPASS_BLOCK_LEN);
171+
memset(card_data[PICOPASS_SECURE_KD_BLOCK_INDEX].data, 0, PICOPASS_BLOCK_LEN);
172172
}
173173

174174
do {
@@ -197,13 +197,13 @@ static bool picopass_device_save_file(
197197
if(!flipper_format_write_comment_cstr(file, "Picopass blocks")) break;
198198
bool block_saved = true;
199199

200-
size_t app_limit = AA1[PICOPASS_CONFIG_BLOCK_INDEX].data[0] < PICOPASS_MAX_APP_LIMIT ?
201-
AA1[PICOPASS_CONFIG_BLOCK_INDEX].data[0] :
200+
size_t app_limit = card_data[PICOPASS_CONFIG_BLOCK_INDEX].data[0] < PICOPASS_MAX_APP_LIMIT ?
201+
card_data[PICOPASS_CONFIG_BLOCK_INDEX].data[0] :
202202
PICOPASS_MAX_APP_LIMIT;
203203
for(size_t i = 0; i < app_limit; i++) {
204204
furi_string_printf(temp_str, "Block %d", i);
205205
if(!flipper_format_write_hex(
206-
file, furi_string_get_cstr(temp_str), AA1[i].data, PICOPASS_BLOCK_LEN)) {
206+
file, furi_string_get_cstr(temp_str), card_data[i].data, PICOPASS_BLOCK_LEN)) {
207207
block_saved = false;
208208
break;
209209
}
@@ -245,7 +245,7 @@ bool picopass_device_save(PicopassDevice* dev, const char* dev_name) {
245245
static bool picopass_device_load_data(PicopassDevice* dev, FuriString* path, bool show_dialog) {
246246
bool parsed = false;
247247
FlipperFormat* file = flipper_format_file_alloc(dev->storage);
248-
PicopassBlock* AA1 = dev->dev_data.AA1;
248+
PicopassBlock* card_data = dev->dev_data.card_data;
249249
PicopassPacs* pacs = &dev->dev_data.pacs;
250250
FuriString* temp_str;
251251
temp_str = furi_string_alloc();
@@ -272,26 +272,26 @@ static bool picopass_device_load_data(PicopassDevice* dev, FuriString* path, boo
272272
for(size_t i = 0; i < 6; i++) {
273273
furi_string_printf(temp_str, "Block %d", i);
274274
if(!flipper_format_read_hex(
275-
file, furi_string_get_cstr(temp_str), AA1[i].data, PICOPASS_BLOCK_LEN)) {
275+
file, furi_string_get_cstr(temp_str), card_data[i].data, PICOPASS_BLOCK_LEN)) {
276276
block_read = false;
277277
break;
278278
}
279279
}
280280

281-
size_t app_limit = AA1[PICOPASS_CONFIG_BLOCK_INDEX].data[0];
281+
size_t app_limit = card_data[PICOPASS_CONFIG_BLOCK_INDEX].data[0];
282282
// Fix for unpersonalized cards that have app_limit set to 0xFF
283283
if(app_limit > PICOPASS_MAX_APP_LIMIT) app_limit = PICOPASS_MAX_APP_LIMIT;
284284
for(size_t i = 6; i < app_limit; i++) {
285285
furi_string_printf(temp_str, "Block %d", i);
286286
if(!flipper_format_read_hex(
287-
file, furi_string_get_cstr(temp_str), AA1[i].data, PICOPASS_BLOCK_LEN)) {
287+
file, furi_string_get_cstr(temp_str), card_data[i].data, PICOPASS_BLOCK_LEN)) {
288288
block_read = false;
289289
break;
290290
}
291291
}
292292
if(!block_read) break;
293293

294-
picopass_device_parse_credential(AA1, pacs);
294+
picopass_device_parse_credential(card_data, pacs);
295295
picopass_device_parse_wiegand(pacs->credential, pacs);
296296

297297
parsed = true;
@@ -364,7 +364,7 @@ bool picopass_file_select(PicopassDevice* dev) {
364364

365365
void picopass_device_data_clear(PicopassDeviceData* dev_data) {
366366
for(size_t i = 0; i < PICOPASS_MAX_APP_LIMIT; i++) {
367-
memset(dev_data->AA1[i].data, 0, sizeof(dev_data->AA1[i].data));
367+
memset(dev_data->card_data[i].data, 0, sizeof(dev_data->card_data[i].data));
368368
}
369369
dev_data->pacs.legacy = false;
370370
dev_data->pacs.se_enabled = false;
@@ -419,30 +419,30 @@ void picopass_device_decrypt(uint8_t* enc_data, uint8_t* dec_data) {
419419
mbedtls_des3_free(&ctx);
420420
}
421421

422-
void picopass_device_parse_credential(PicopassBlock* AA1, PicopassPacs* pacs) {
423-
pacs->biometrics = AA1[6].data[4];
424-
pacs->pin_length = AA1[6].data[6] & 0x0F;
425-
pacs->encryption = AA1[6].data[7];
422+
void picopass_device_parse_credential(PicopassBlock* card_data, PicopassPacs* pacs) {
423+
pacs->biometrics = card_data[6].data[4];
424+
pacs->pin_length = card_data[6].data[6] & 0x0F;
425+
pacs->encryption = card_data[6].data[7];
426426

427427
if(pacs->encryption == PicopassDeviceEncryption3DES) {
428428
FURI_LOG_D(TAG, "3DES Encrypted");
429-
picopass_device_decrypt(AA1[7].data, pacs->credential);
429+
picopass_device_decrypt(card_data[7].data, pacs->credential);
430430

431-
picopass_device_decrypt(AA1[8].data, pacs->pin0);
431+
picopass_device_decrypt(card_data[8].data, pacs->pin0);
432432

433-
picopass_device_decrypt(AA1[9].data, pacs->pin1);
433+
picopass_device_decrypt(card_data[9].data, pacs->pin1);
434434
} else if(pacs->encryption == PicopassDeviceEncryptionNone) {
435435
FURI_LOG_D(TAG, "No Encryption");
436-
memcpy(pacs->credential, AA1[7].data, PICOPASS_BLOCK_LEN);
437-
memcpy(pacs->pin0, AA1[8].data, PICOPASS_BLOCK_LEN);
438-
memcpy(pacs->pin1, AA1[9].data, PICOPASS_BLOCK_LEN);
436+
memcpy(pacs->credential, card_data[7].data, PICOPASS_BLOCK_LEN);
437+
memcpy(pacs->pin0, card_data[8].data, PICOPASS_BLOCK_LEN);
438+
memcpy(pacs->pin1, card_data[9].data, PICOPASS_BLOCK_LEN);
439439
} else if(pacs->encryption == PicopassDeviceEncryptionDES) {
440440
FURI_LOG_D(TAG, "DES Encrypted");
441441
} else {
442442
FURI_LOG_D(TAG, "Unknown encryption");
443443
}
444444

445-
pacs->sio = (AA1[10].data[0] == 0x30); // rough check
445+
pacs->sio = (card_data[10].data[0] == 0x30); // rough check
446446
}
447447

448448
void picopass_device_parse_wiegand(uint8_t* credential, PicopassPacs* pacs) {
@@ -466,8 +466,8 @@ void picopass_device_parse_wiegand(uint8_t* credential, PicopassPacs* pacs) {
466466

467467
bool picopass_device_hid_csn(PicopassDevice* dev) {
468468
furi_assert(dev);
469-
PicopassBlock* AA1 = dev->dev_data.AA1;
470-
uint8_t* csn = AA1[PICOPASS_CSN_BLOCK_INDEX].data;
469+
PicopassBlock* card_data = dev->dev_data.card_data;
470+
uint8_t* csn = card_data[PICOPASS_CSN_BLOCK_INDEX].data;
471471
// From Proxmark3 RRG sourcecode
472472
bool isHidRange = (memcmp(csn + 5, "\xFF\x12\xE0", 3) == 0) && ((csn[4] & 0xF0) == 0xF0);
473473

picopass_device.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ typedef struct {
102102
} PicopassBlock;
103103

104104
typedef struct {
105-
PicopassBlock AA1[PICOPASS_MAX_APP_LIMIT];
105+
PicopassBlock card_data[PICOPASS_MAX_APP_LIMIT];
106106
PicopassPacs pacs;
107107
} PicopassDeviceData;
108108

@@ -148,6 +148,6 @@ void picopass_device_set_loading_callback(
148148
PicopassLoadingCallback callback,
149149
void* context);
150150

151-
void picopass_device_parse_credential(PicopassBlock* AA1, PicopassPacs* pacs);
151+
void picopass_device_parse_credential(PicopassBlock* card_data, PicopassPacs* pacs);
152152
void picopass_device_parse_wiegand(uint8_t* credential, PicopassPacs* pacs);
153153
bool picopass_device_hid_csn(PicopassDevice* dev);

protocol/picopass_listener.c

+21-21
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@ static void picopass_listener_loclass_update_csn(PicopassListener* instance) {
4343
// collect LOCLASS_NUM_PER_CSN nonces in a row for each CSN
4444
const uint8_t* csn =
4545
loclass_csns[(instance->key_block_num / LOCLASS_NUM_PER_CSN) % LOCLASS_NUM_CSNS];
46-
memcpy(instance->data->AA1[PICOPASS_CSN_BLOCK_INDEX].data, csn, sizeof(PicopassBlock));
46+
memcpy(instance->data->card_data[PICOPASS_CSN_BLOCK_INDEX].data, csn, sizeof(PicopassBlock));
4747

4848
uint8_t key[PICOPASS_BLOCK_LEN] = {};
4949
loclass_iclass_calc_div_key(csn, picopass_iclass_key, key, false);
50-
memcpy(instance->data->AA1[PICOPASS_SECURE_KD_BLOCK_INDEX].data, key, sizeof(PicopassBlock));
50+
memcpy(instance->data->card_data[PICOPASS_SECURE_KD_BLOCK_INDEX].data, key, sizeof(PicopassBlock));
5151

5252
picopass_listener_init_cipher_state_key(instance, key);
5353
}
@@ -118,7 +118,7 @@ PicopassListenerCommand
118118
(instance->state == PicopassListenerStateIdle)) {
119119
bit_buffer_copy_bytes(
120120
instance->tmp_buffer,
121-
instance->data->AA1[PICOPASS_CSN_BLOCK_INDEX].data,
121+
instance->data->card_data[PICOPASS_CSN_BLOCK_INDEX].data,
122122
sizeof(PicopassBlock));
123123
} else {
124124
picopass_listener_write_anticoll_csn(instance, instance->tmp_buffer);
@@ -139,7 +139,7 @@ PicopassListenerCommand
139139
instance->state = PicopassListenerStateSelected;
140140
bit_buffer_copy_bytes(
141141
instance->tx_buffer,
142-
instance->data->AA1[PICOPASS_CSN_BLOCK_INDEX].data,
142+
instance->data->card_data[PICOPASS_CSN_BLOCK_INDEX].data,
143143
sizeof(PicopassBlock));
144144

145145
PicopassError error = picopass_listener_send_frame(instance, instance->tx_buffer);
@@ -162,7 +162,7 @@ PicopassListenerCommand
162162
uint8_t block_num = bit_buffer_get_byte(buf, 1);
163163
if(block_num > PICOPASS_MAX_APP_LIMIT) break;
164164

165-
bool secured = (instance->data->AA1[PICOPASS_CONFIG_BLOCK_INDEX].data[7] &
165+
bool secured = (instance->data->card_data[PICOPASS_CONFIG_BLOCK_INDEX].data[7] &
166166
PICOPASS_FUSE_CRYPT10) != PICOPASS_FUSE_CRYPT0;
167167

168168
// TODO: Check CRC?
@@ -176,7 +176,7 @@ PicopassListenerCommand
176176
}
177177
} else {
178178
bit_buffer_copy_bytes(
179-
instance->tx_buffer, instance->data->AA1[block_num].data, sizeof(PicopassBlock));
179+
instance->tx_buffer, instance->data->card_data[block_num].data, sizeof(PicopassBlock));
180180
}
181181
PicopassError error = picopass_listener_send_frame(instance, instance->tx_buffer);
182182
if(error != PicopassErrorNone) {
@@ -211,7 +211,7 @@ static PicopassListenerCommand
211211

212212
// DATA(8)
213213
bit_buffer_copy_bytes(
214-
instance->tx_buffer, instance->data->AA1[block_num].data, sizeof(PicopassBlock));
214+
instance->tx_buffer, instance->data->card_data[block_num].data, sizeof(PicopassBlock));
215215
NfcError error = nfc_listener_tx(instance->nfc, instance->tx_buffer);
216216
if(error != NfcErrorNone) {
217217
FURI_LOG_D(TAG, "Failed to tx read check response: %d", error);
@@ -244,7 +244,7 @@ PicopassListenerCommand
244244
#ifndef PICOPASS_DEBUG_IGNORE_LOCLASS_STD_KEY
245245
// loclass mode stores the derived standard debit key in Kd to check
246246

247-
PicopassBlock key = instance->data->AA1[PICOPASS_SECURE_KD_BLOCK_INDEX];
247+
PicopassBlock key = instance->data->card_data[PICOPASS_SECURE_KD_BLOCK_INDEX];
248248
uint8_t rmac[4];
249249
const uint8_t* rx_data = bit_buffer_get_data(buf);
250250
loclass_opt_doReaderMAC_2(instance->cipher_state, &rx_data[1], rmac, key.data);
@@ -285,8 +285,8 @@ PicopassListenerCommand
285285
loclass_writer_write_params(
286286
instance->writer,
287287
instance->key_block_num + i - LOCLASS_NUM_PER_CSN,
288-
instance->data->AA1[PICOPASS_CSN_BLOCK_INDEX].data,
289-
instance->data->AA1[PICOPASS_SECURE_EPURSE_BLOCK_INDEX].data,
288+
instance->data->card_data[PICOPASS_CSN_BLOCK_INDEX].data,
289+
instance->data->card_data[PICOPASS_SECURE_EPURSE_BLOCK_INDEX].data,
290290
instance->loclass_mac_buffer + (i * 8),
291291
instance->loclass_mac_buffer + (i * 8) + 4);
292292
}
@@ -314,8 +314,8 @@ PicopassListenerCommand
314314

315315
PicopassDevice* dev = picopass->dev;
316316

317-
const uint8_t* csn = instance->data->AA1[PICOPASS_CSN_BLOCK_INDEX].data;
318-
const uint8_t* epurse = instance->data->AA1[PICOPASS_SECURE_EPURSE_BLOCK_INDEX].data;
317+
const uint8_t* csn = instance->data->card_data[PICOPASS_CSN_BLOCK_INDEX].data;
318+
const uint8_t* epurse = instance->data->card_data[PICOPASS_SECURE_EPURSE_BLOCK_INDEX].data;
319319

320320
FuriString* temp_str = furi_string_alloc();
321321
FuriString* filename = furi_string_alloc();
@@ -368,13 +368,13 @@ PicopassListenerCommand
368368
PicopassListenerCommand command = PicopassListenerCommandSilent;
369369

370370
do {
371-
bool secured = (instance->data->AA1[PICOPASS_CONFIG_BLOCK_INDEX].data[7] &
371+
bool secured = (instance->data->card_data[PICOPASS_CONFIG_BLOCK_INDEX].data[7] &
372372
PICOPASS_FUSE_CRYPT10) != PICOPASS_FUSE_CRYPT0;
373373
if(!secured) break;
374374

375375
uint8_t rmac[4] = {};
376376
uint8_t tmac[4] = {};
377-
const uint8_t* key = instance->data->AA1[instance->key_block_num].data;
377+
const uint8_t* key = instance->data->card_data[instance->key_block_num].data;
378378
bool no_key = picopass_is_memset(key, 0x00, PICOPASS_BLOCK_LEN);
379379
const uint8_t* rx_data = bit_buffer_get_data(buf);
380380

@@ -432,9 +432,9 @@ PicopassListenerCommand
432432
if(instance->mode == PicopassListenerModeLoclass) break;
433433
if(instance->state != PicopassListenerStateSelected) break;
434434

435-
PicopassBlock config_block = instance->data->AA1[PICOPASS_CONFIG_BLOCK_INDEX];
435+
PicopassBlock config_block = instance->data->card_data[PICOPASS_CONFIG_BLOCK_INDEX];
436436
bool pers_mode = PICOPASS_LISTENER_HAS_MASK(config_block.data[7], PICOPASS_FUSE_PERS);
437-
bool secured = (instance->data->AA1[PICOPASS_CONFIG_BLOCK_INDEX].data[7] &
437+
bool secured = (instance->data->card_data[PICOPASS_CONFIG_BLOCK_INDEX].data[7] &
438438
PICOPASS_FUSE_CRYPT10) != PICOPASS_FUSE_CRYPT0;
439439

440440
const uint8_t* rx_data = bit_buffer_get_data(buf);
@@ -502,7 +502,7 @@ PicopassListenerCommand
502502
// fallthrough
503503
case PICOPASS_SECURE_KC_BLOCK_INDEX:
504504
if(!pers_mode && secured) {
505-
new_block = instance->data->AA1[block_num];
505+
new_block = instance->data->card_data[block_num];
506506
for(size_t i = 0; i < sizeof(PicopassBlock); i++) {
507507
new_block.data[i] ^= rx_data[i + 2];
508508
}
@@ -515,7 +515,7 @@ PicopassListenerCommand
515515
break;
516516
}
517517

518-
instance->data->AA1[block_num] = new_block;
518+
instance->data->card_data[block_num] = new_block;
519519
if(secured && ((block_num == instance->key_block_num) ||
520520
(block_num == PICOPASS_SECURE_EPURSE_BLOCK_INDEX))) {
521521
picopass_listener_init_cipher_state(instance);
@@ -530,7 +530,7 @@ PicopassListenerCommand
530530
}
531531
} else {
532532
bit_buffer_copy_bytes(
533-
instance->tx_buffer, instance->data->AA1[block_num].data, sizeof(PicopassBlock));
533+
instance->tx_buffer, instance->data->card_data[block_num].data, sizeof(PicopassBlock));
534534
}
535535

536536
PicopassError error = picopass_listener_send_frame(instance, instance->tx_buffer);
@@ -555,7 +555,7 @@ PicopassListenerCommand
555555
uint8_t block_start = bit_buffer_get_byte(buf, 1);
556556
if(block_start + 4 >= PICOPASS_MAX_APP_LIMIT) break;
557557

558-
bool secured = (instance->data->AA1[PICOPASS_CONFIG_BLOCK_INDEX].data[7] &
558+
bool secured = (instance->data->card_data[PICOPASS_CONFIG_BLOCK_INDEX].data[7] &
559559
PICOPASS_FUSE_CRYPT10) != PICOPASS_FUSE_CRYPT0;
560560

561561
// TODO: Check CRC?
@@ -570,7 +570,7 @@ PicopassListenerCommand
570570
}
571571
} else {
572572
bit_buffer_append_bytes(
573-
instance->tx_buffer, instance->data->AA1[i].data, sizeof(PicopassBlock));
573+
instance->tx_buffer, instance->data->card_data[i].data, sizeof(PicopassBlock));
574574
}
575575
}
576576

protocol/picopass_listener_i.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ static PicopassError picopass_listener_process_error(NfcError error) {
2121
void picopass_listener_init_cipher_state_key(PicopassListener* instance, const uint8_t* key) {
2222
uint8_t cc[PICOPASS_BLOCK_LEN] = {};
2323
memcpy(
24-
cc, instance->data->AA1[PICOPASS_SECURE_EPURSE_BLOCK_INDEX].data, sizeof(PicopassBlock));
24+
cc, instance->data->card_data[PICOPASS_SECURE_EPURSE_BLOCK_INDEX].data, sizeof(PicopassBlock));
2525

2626
instance->cipher_state = loclass_opt_doTagMAC_1(cc, key);
2727
}
2828

2929
void picopass_listener_init_cipher_state(PicopassListener* instance) {
3030
uint8_t key[PICOPASS_BLOCK_LEN] = {};
31-
memcpy(key, instance->data->AA1[instance->key_block_num].data, sizeof(PicopassBlock));
31+
memcpy(key, instance->data->card_data[instance->key_block_num].data, sizeof(PicopassBlock));
3232

3333
picopass_listener_init_cipher_state_key(instance, key);
3434
}
@@ -42,7 +42,7 @@ PicopassError picopass_listener_send_frame(PicopassListener* instance, BitBuffer
4242

4343
// from proxmark3 armsrc/iclass.c rotateCSN
4444
PicopassError picopass_listener_write_anticoll_csn(PicopassListener* instance, BitBuffer* buffer) {
45-
const uint8_t* uid = instance->data->AA1[PICOPASS_CSN_BLOCK_INDEX].data;
45+
const uint8_t* uid = instance->data->card_data[PICOPASS_CSN_BLOCK_INDEX].data;
4646
bit_buffer_reset(buffer);
4747
for(size_t i = 0; i < PICOPASS_BLOCK_LEN; i++) {
4848
bit_buffer_append_byte(buffer, (uid[i] >> 3) | (uid[(i + 1) % 8] << 5));

0 commit comments

Comments
 (0)