@@ -63,23 +63,44 @@ void seader_ccid_GetSlotStatus(SeaderUartBridge* seader_uart, uint8_t slot) {
63
63
void seader_ccid_SetParameters (Seader * seader , uint8_t slot , uint8_t * atr , size_t atr_len ) {
64
64
SeaderWorker * seader_worker = seader -> worker ;
65
65
SeaderUartBridge * seader_uart = seader_worker -> uart ;
66
- UNUSED (slot );
67
- UNUSED (atr );
68
66
UNUSED (atr_len );
69
- uint8_t T1 = 1 ;
67
+ FURI_LOG_D (TAG , "seader_ccid_SetParameters(%d)" , slot );
68
+
69
+ uint8_t payloadLen = 0 ;
70
+ if (seader_uart -> T == 0 ) {
71
+ payloadLen = 5 ;
72
+ } else if (atr [4 ] == 0xB1 && seader_uart -> T == 1 ) {
73
+ payloadLen = 7 ;
74
+ }
70
75
memset (seader_uart -> tx_buf , 0 , SEADER_UART_RX_BUF_SIZE );
71
76
seader_uart -> tx_buf [0 ] = SYNC ;
72
77
seader_uart -> tx_buf [1 ] = CTRL ;
73
78
seader_uart -> tx_buf [2 + 0 ] = CCID_MESSAGE_TYPE_PC_to_RDR_SetParameters ;
74
- seader_uart -> tx_buf [2 + 1 ] = 0 ;
75
- seader_uart -> tx_buf [2 + 5 ] = sam_slot ;
76
- seader_uart -> tx_buf [2 + 6 ] = getSequence (sam_slot );
77
- seader_uart -> tx_buf [2 + 7 ] = T1 ;
79
+ seader_uart -> tx_buf [2 + 1 ] = payloadLen ;
80
+ seader_uart -> tx_buf [2 + 5 ] = slot ;
81
+ seader_uart -> tx_buf [2 + 6 ] = getSequence (slot );
82
+ seader_uart -> tx_buf [2 + 7 ] = seader_uart -> T ;
78
83
seader_uart -> tx_buf [2 + 8 ] = 0 ;
79
84
seader_uart -> tx_buf [2 + 9 ] = 0 ;
80
85
81
- seader_uart -> tx_len = seader_add_lrc (seader_uart -> tx_buf , 2 + 10 );
86
+ if (seader_uart -> T == 0 ) {
87
+ // I'm leaving this here for completeness, but it was actually causing ICC_MUTE on the first apdu.
88
+ seader_uart -> tx_buf [2 + 10 ] = 0x96 ; //atr[2]; //bmFindexDindex
89
+ seader_uart -> tx_buf [2 + 11 ] = 0x00 ; //bmTCCKST1
90
+ seader_uart -> tx_buf [2 + 12 ] = 0x00 ; //bGuardTimeT0
91
+ seader_uart -> tx_buf [2 + 13 ] = 0x0a ; //bWaitingIntegerT0
92
+ seader_uart -> tx_buf [2 + 14 ] = 0x00 ; //bClockStop
93
+ } else if (seader_uart -> T == 1 ) {
94
+ seader_uart -> tx_buf [2 + 10 ] = atr [2 ]; //bmFindexDindex
95
+ seader_uart -> tx_buf [2 + 11 ] = 0x10 ; //bmTCCKST1
96
+ seader_uart -> tx_buf [2 + 12 ] = 0xfe ; //bGuardTimeT1
97
+ seader_uart -> tx_buf [2 + 13 ] = atr [6 ]; //bWaitingIntegerT1
98
+ seader_uart -> tx_buf [2 + 14 ] = atr [8 ]; //bClockStop
99
+ seader_uart -> tx_buf [2 + 15 ] = atr [5 ]; //bIFSC
100
+ seader_uart -> tx_buf [2 + 16 ] = 0x00 ; //bNadValue
101
+ }
82
102
103
+ seader_uart -> tx_len = seader_add_lrc (seader_uart -> tx_buf , 2 + 10 + payloadLen );
83
104
furi_thread_flags_set (furi_thread_get_id (seader_uart -> tx_thread ), WorkerEvtSamRx );
84
105
}
85
106
@@ -121,14 +142,16 @@ void seader_ccid_XfrBlockToSlot(
121
142
seader_uart -> tx_buf [2 + 8 ] = 0 ;
122
143
seader_uart -> tx_buf [2 + 9 ] = 0 ;
123
144
124
- memcpy (seader_uart -> tx_buf + 2 + 10 , data , len );
125
- seader_uart -> tx_len = seader_add_lrc (seader_uart -> tx_buf , 2 + 10 + len );
145
+ uint8_t header_len = 2 + 10 ;
146
+ memcpy (seader_uart -> tx_buf + header_len , data , len );
147
+ seader_uart -> tx_len = header_len + len ;
148
+ seader_uart -> tx_len = seader_add_lrc (seader_uart -> tx_buf , seader_uart -> tx_len );
126
149
127
150
char display [SEADER_UART_RX_BUF_SIZE * 2 + 1 ] = {0 };
128
151
for (uint8_t i = 0 ; i < seader_uart -> tx_len ; i ++ ) {
129
152
snprintf (display + (i * 2 ), sizeof (display ), "%02x" , seader_uart -> tx_buf [i ]);
130
153
}
131
- FURI_LOG_D (TAG , "seader_ccid_XfrBlock %d bytes : %s" , seader_uart -> tx_len , display );
154
+ FURI_LOG_D (TAG , "seader_ccid_XfrBlockToSlot(%d) %d : %s" , slot , seader_uart -> tx_len , display );
132
155
133
156
furi_thread_flags_set (furi_thread_get_id (seader_uart -> tx_thread ), WorkerEvtSamRx );
134
157
}
@@ -319,10 +342,25 @@ size_t seader_ccid_process(Seader* seader, uint8_t* cmd, size_t cmd_len) {
319
342
return message .consumed ;
320
343
}
321
344
322
- if (message .bMessageType == CCID_MESSAGE_TYPE_RDR_to_PC_DataBlock ) {
345
+ if (message .bMessageType == CCID_MESSAGE_TYPE_RDR_to_PC_Parameters ) {
346
+ FURI_LOG_D (TAG , "Got Parameters" );
347
+ if (seader_uart -> T == 1 ) {
348
+ seader_t_1_set_IFSD (seader );
349
+ } else {
350
+ seader_worker_send_version (seader );
351
+ if (seader_worker -> callback ) {
352
+ seader_worker -> callback (SeaderWorkerEventSamPresent , seader_worker -> context );
353
+ }
354
+ }
355
+ } else if (message .bMessageType == CCID_MESSAGE_TYPE_RDR_to_PC_DataBlock ) {
323
356
if (hasSAM ) {
324
357
if (message .bSlot == sam_slot ) {
325
- seader_worker_process_sam_message (seader , message .payload , message .dwLength );
358
+ if (seader_uart -> T == 0 ) {
359
+ seader_worker_process_sam_message (
360
+ seader , message .payload , message .dwLength );
361
+ } else if (seader_uart -> T == 1 ) {
362
+ seader_recv_t1 (seader , & message );
363
+ }
326
364
} else {
327
365
FURI_LOG_D (TAG , "Discarding message on non-sam slot" );
328
366
}
@@ -331,20 +369,18 @@ size_t seader_ccid_process(Seader* seader, uint8_t* cmd, size_t cmd_len) {
331
369
FURI_LOG_I (TAG , "SAM ATR!" );
332
370
hasSAM = true;
333
371
sam_slot = message .bSlot ;
334
- seader_worker_send_version (seader );
335
- if (seader_worker -> callback ) {
336
- seader_worker -> callback (
337
- SeaderWorkerEventSamPresent , seader_worker -> context );
372
+ if (seader_uart -> T == 0 ) {
373
+ seader_ccid_GetParameters (seader_uart );
374
+ } else if (seader_uart -> T == 1 ) {
375
+ seader_ccid_SetParameters (
376
+ seader , sam_slot , message .payload , message .dwLength );
338
377
}
339
378
} else if (memcmp (SAM_ATR2 , message .payload , sizeof (SAM_ATR2 )) == 0 ) {
340
379
FURI_LOG_I (TAG , "SAM ATR2!" );
341
380
hasSAM = true;
342
381
sam_slot = message .bSlot ;
343
- seader_worker_send_version (seader );
344
- if (seader_worker -> callback ) {
345
- seader_worker -> callback (
346
- SeaderWorkerEventSamPresent , seader_worker -> context );
347
- }
382
+ // I don't have an ATR2 to test with
383
+ seader_ccid_GetParameters (seader_uart );
348
384
} else {
349
385
FURI_LOG_W (TAG , "Unknown ATR" );
350
386
if (seader_worker -> callback ) {
@@ -353,7 +389,7 @@ size_t seader_ccid_process(Seader* seader, uint8_t* cmd, size_t cmd_len) {
353
389
}
354
390
}
355
391
} else {
356
- FURI_LOG_W (TAG , "Unhandled CCID message type %d " , message .bMessageType );
392
+ FURI_LOG_W (TAG , "Unhandled CCID message type %02x " , message .bMessageType );
357
393
}
358
394
}
359
395
0 commit comments