@@ -69,10 +69,27 @@ void seader_t_1_send_ack(Seader* seader) {
69
69
BitBuffer * seader_t_1_tx_buffer ;
70
70
size_t seader_t_1_tx_buffer_offset = 0 ;
71
71
72
- void seader_send_t1 (SeaderUartBridge * seader_uart , uint8_t * apdu , size_t len ) {
73
- uint8_t frame [ SEADER_UART_RX_BUF_SIZE ] ;
72
+ void seader_send_t1_chunk (SeaderUartBridge * seader_uart , uint8_t PCB , uint8_t * chunk , size_t len ) {
73
+ uint8_t * frame = malloc ( 3 + len + 1 ) ;
74
74
uint8_t frame_len = 0 ;
75
75
76
+ frame [0 ] = NAD ;
77
+ frame [1 ] = PCB ;
78
+ frame [2 ] = len ;
79
+ frame_len = 3 ;
80
+
81
+ if (len > 0 ) {
82
+ memcpy (frame + frame_len , chunk , len );
83
+ frame_len += len ;
84
+ }
85
+
86
+ frame_len = seader_add_lrc (frame , frame_len );
87
+
88
+ seader_ccid_XfrBlock (seader_uart , frame , frame_len );
89
+ free (frame );
90
+ }
91
+
92
+ void seader_send_t1 (SeaderUartBridge * seader_uart , uint8_t * apdu , size_t len ) {
76
93
if (len > IFSC_VALUE ) {
77
94
if (seader_t_1_tx_buffer == NULL ) {
78
95
seader_t_1_tx_buffer = bit_buffer_alloc (768 );
@@ -82,33 +99,16 @@ void seader_send_t1(SeaderUartBridge* seader_uart, uint8_t* apdu, size_t len) {
82
99
(bit_buffer_get_size_bytes (seader_t_1_tx_buffer ) - seader_t_1_tx_buffer_offset );
83
100
size_t copy_length = remaining > IFSC_VALUE ? IFSC_VALUE : remaining ;
84
101
85
- frame [0 ] = NAD ;
102
+ uint8_t * chunk =
103
+ (uint8_t * )bit_buffer_get_data (seader_t_1_tx_buffer ) + seader_t_1_tx_buffer_offset ;
104
+
86
105
if (remaining > IFSC_VALUE ) {
87
- frame [1 ] = seader_next_dpcb () | MORE_BIT ;
106
+ uint8_t PCB = seader_next_dpcb () | MORE_BIT ;
107
+ seader_send_t1_chunk (seader_uart , PCB , chunk , copy_length );
88
108
} else {
89
- frame [1 ] = seader_next_dpcb ();
109
+ uint8_t PCB = seader_next_dpcb ();
110
+ seader_send_t1_chunk (seader_uart , PCB , chunk , copy_length );
90
111
}
91
- frame [2 ] = copy_length ;
92
- frame_len = 3 ;
93
-
94
- memcpy (
95
- frame + frame_len ,
96
- bit_buffer_get_data (seader_t_1_tx_buffer ) + seader_t_1_tx_buffer_offset ,
97
- copy_length );
98
- frame_len += copy_length ;
99
-
100
- frame_len = seader_add_lrc (frame , frame_len );
101
-
102
- /*
103
- FURI_LOG_D(
104
- TAG,
105
- "Sending T=1 frame %s more bit set. Remaining: %d, Copy Length: %d",
106
- (remaining > IFSC_VALUE) ? "with" : "without",
107
- remaining,
108
- copy_length);
109
- */
110
-
111
- seader_ccid_XfrBlock (seader_uart , frame , frame_len );
112
112
113
113
seader_t_1_tx_buffer_offset += copy_length ;
114
114
if (seader_t_1_tx_buffer_offset >= bit_buffer_get_size_bytes (seader_t_1_tx_buffer )) {
@@ -119,19 +119,7 @@ void seader_send_t1(SeaderUartBridge* seader_uart, uint8_t* apdu, size_t len) {
119
119
return ;
120
120
}
121
121
122
- frame [0 ] = NAD ;
123
- frame [1 ] = seader_next_dpcb ();
124
- frame [2 ] = len ;
125
- frame_len = 3 ;
126
-
127
- if (len > 0 ) {
128
- memcpy (frame + frame_len , apdu , len );
129
- frame_len += len ;
130
- }
131
-
132
- frame_len = seader_add_lrc (frame , frame_len );
133
-
134
- seader_ccid_XfrBlock (seader_uart , frame , frame_len );
122
+ seader_send_t1_chunk (seader_uart , seader_next_dpcb (), apdu , len );
135
123
}
136
124
137
125
BitBuffer * seader_t_1_rx_buffer ;
0 commit comments