@@ -69,10 +69,27 @@ void seader_t_1_send_ack(Seader* seader) {
6969BitBuffer * seader_t_1_tx_buffer ;
7070size_t seader_t_1_tx_buffer_offset = 0 ;
7171
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 ) ;
7474 uint8_t frame_len = 0 ;
7575
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 ) {
7693 if (len > IFSC_VALUE ) {
7794 if (seader_t_1_tx_buffer == NULL ) {
7895 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) {
8299 (bit_buffer_get_size_bytes (seader_t_1_tx_buffer ) - seader_t_1_tx_buffer_offset );
83100 size_t copy_length = remaining > IFSC_VALUE ? IFSC_VALUE : remaining ;
84101
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+
86105 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 );
88108 } 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 );
90111 }
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 );
112112
113113 seader_t_1_tx_buffer_offset += copy_length ;
114114 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) {
119119 return ;
120120 }
121121
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 );
135123}
136124
137125BitBuffer * seader_t_1_rx_buffer ;
0 commit comments